resolveAssetSource.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /**
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. *
  7. * @format
  8. * @flow
  9. */
  10. // Resolves an asset into a `source` for `Image`.
  11. 'use strict';
  12. const AssetRegistry = require('./AssetRegistry');
  13. const AssetSourceResolver = require('./AssetSourceResolver');
  14. import type {ResolvedAssetSource} from './AssetSourceResolver';
  15. let _customSourceTransformer, _serverURL, _scriptURL;
  16. let _sourceCodeScriptURL: ?string;
  17. function getSourceCodeScriptURL(): ?string {
  18. if (_sourceCodeScriptURL) {
  19. return _sourceCodeScriptURL;
  20. }
  21. let sourceCode =
  22. global.nativeExtensions && global.nativeExtensions.SourceCode;
  23. if (!sourceCode) {
  24. sourceCode = require('../NativeModules/specs/NativeSourceCode').default;
  25. }
  26. _sourceCodeScriptURL = sourceCode.getConstants().scriptURL;
  27. return _sourceCodeScriptURL;
  28. }
  29. function getDevServerURL(): ?string {
  30. if (_serverURL === undefined) {
  31. const sourceCodeScriptURL = getSourceCodeScriptURL();
  32. const match =
  33. sourceCodeScriptURL && sourceCodeScriptURL.match(/^https?:\/\/.*?\//);
  34. if (match) {
  35. // jsBundle was loaded from network
  36. _serverURL = match[0];
  37. } else {
  38. // jsBundle was loaded from file
  39. _serverURL = null;
  40. }
  41. }
  42. return _serverURL;
  43. }
  44. function _coerceLocalScriptURL(scriptURL: ?string): ?string {
  45. if (scriptURL) {
  46. if (scriptURL.startsWith('assets://')) {
  47. // android: running from within assets, no offline path to use
  48. return null;
  49. }
  50. scriptURL = scriptURL.substring(0, scriptURL.lastIndexOf('/') + 1);
  51. if (!scriptURL.includes('://')) {
  52. // Add file protocol in case we have an absolute file path and not a URL.
  53. // This shouldn't really be necessary. scriptURL should be a URL.
  54. scriptURL = 'file://' + scriptURL;
  55. }
  56. }
  57. return scriptURL;
  58. }
  59. function getScriptURL(): ?string {
  60. if (_scriptURL === undefined) {
  61. _scriptURL = _coerceLocalScriptURL(getSourceCodeScriptURL());
  62. }
  63. return _scriptURL;
  64. }
  65. function setCustomSourceTransformer(
  66. transformer: (resolver: AssetSourceResolver) => ResolvedAssetSource,
  67. ): void {
  68. _customSourceTransformer = transformer;
  69. }
  70. /**
  71. * `source` is either a number (opaque type returned by require('./foo.png'))
  72. * or an `ImageSource` like { uri: '<http location || file path>' }
  73. */
  74. function resolveAssetSource(source: any): ?ResolvedAssetSource {
  75. if (typeof source === 'object') {
  76. return source;
  77. }
  78. const asset = AssetRegistry.getAssetByID(source);
  79. if (!asset) {
  80. return null;
  81. }
  82. const resolver = new AssetSourceResolver(
  83. getDevServerURL(),
  84. getScriptURL(),
  85. asset,
  86. );
  87. if (_customSourceTransformer) {
  88. return _customSourceTransformer(resolver);
  89. }
  90. return resolver.defaultAsset();
  91. }
  92. module.exports = resolveAssetSource;
  93. module.exports.pickScale = AssetSourceResolver.pickScale;
  94. module.exports.setCustomSourceTransformer = setCustomSourceTransformer;