@expo/cli 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/build/bin/cli +13 -5
  2. package/build/bin/cli.map +1 -1
  3. package/build/src/api/getVersions.js.map +1 -1
  4. package/build/src/api/rest/cache/response.js.map +1 -1
  5. package/build/src/api/rest/client.js +2 -2
  6. package/build/src/api/rest/client.js.map +1 -1
  7. package/build/src/api/user/actions.js +1 -1
  8. package/build/src/api/user/actions.js.map +1 -1
  9. package/build/src/customize/typescript.js +3 -1
  10. package/build/src/customize/typescript.js.map +1 -1
  11. package/build/src/export/createMetadataJson.js +5 -3
  12. package/build/src/export/createMetadataJson.js.map +1 -1
  13. package/build/src/export/embed/exportEmbedAsync.js +92 -18
  14. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  15. package/build/src/export/embed/resolveOptions.js +3 -3
  16. package/build/src/export/embed/resolveOptions.js.map +1 -1
  17. package/build/src/export/embed/xcodeCompilerLogger.js +97 -0
  18. package/build/src/export/embed/xcodeCompilerLogger.js.map +1 -0
  19. package/build/src/export/exportApp.js +106 -130
  20. package/build/src/export/exportApp.js.map +1 -1
  21. package/build/src/export/exportAssets.js +93 -38
  22. package/build/src/export/exportAssets.js.map +1 -1
  23. package/build/src/export/exportAsync.js +1 -1
  24. package/build/src/export/exportAsync.js.map +1 -1
  25. package/build/src/export/exportHermes.js +0 -90
  26. package/build/src/export/exportHermes.js.map +1 -1
  27. package/build/src/export/exportStaticAsync.js +165 -101
  28. package/build/src/export/exportStaticAsync.js.map +1 -1
  29. package/build/src/export/favicon.js +13 -5
  30. package/build/src/export/favicon.js.map +1 -1
  31. package/build/src/export/fork-bundleAsync.js +84 -57
  32. package/build/src/export/fork-bundleAsync.js.map +1 -1
  33. package/build/src/export/index.js +9 -7
  34. package/build/src/export/index.js.map +1 -1
  35. package/build/src/export/metroAssetLocalPath.js +101 -0
  36. package/build/src/export/metroAssetLocalPath.js.map +1 -0
  37. package/build/src/export/persistMetroAssets.js +115 -31
  38. package/build/src/export/persistMetroAssets.js.map +1 -1
  39. package/build/src/export/publicFolder.js +7 -0
  40. package/build/src/export/publicFolder.js.map +1 -1
  41. package/build/src/export/resolveOptions.js +1 -1
  42. package/build/src/export/resolveOptions.js.map +1 -1
  43. package/build/src/export/saveAssets.js +168 -43
  44. package/build/src/export/saveAssets.js.map +1 -1
  45. package/build/src/export/web/exportWebAsync.js +1 -1
  46. package/build/src/export/web/exportWebAsync.js.map +1 -1
  47. package/build/src/export/writeContents.js +8 -106
  48. package/build/src/export/writeContents.js.map +1 -1
  49. package/build/src/install/applyPlugins.js +52 -0
  50. package/build/src/install/applyPlugins.js.map +1 -0
  51. package/build/src/install/checkPackages.js +2 -2
  52. package/build/src/install/checkPackages.js.map +1 -1
  53. package/build/src/install/fixPackages.js +84 -0
  54. package/build/src/install/fixPackages.js.map +1 -0
  55. package/build/src/install/installAsync.js +50 -60
  56. package/build/src/install/installAsync.js.map +1 -1
  57. package/build/src/install/installExpoPackage.js +79 -0
  58. package/build/src/install/installExpoPackage.js.map +1 -0
  59. package/build/src/prebuild/clearNativeFolder.js +1 -1
  60. package/build/src/prebuild/clearNativeFolder.js.map +1 -1
  61. package/build/src/prebuild/configureProjectAsync.js +3 -3
  62. package/build/src/prebuild/configureProjectAsync.js.map +1 -1
  63. package/build/src/prebuild/copyTemplateFiles.js +21 -30
  64. package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
  65. package/build/src/prebuild/prebuildAsync.js +45 -16
  66. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  67. package/build/src/prebuild/resolveOptions.js +2 -2
  68. package/build/src/prebuild/resolveOptions.js.map +1 -1
  69. package/build/src/prebuild/updateFromTemplate.js +6 -6
  70. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  71. package/build/src/prebuild/updatePackageJson.js +49 -36
  72. package/build/src/prebuild/updatePackageJson.js.map +1 -1
  73. package/build/src/prebuild/validateTemplatePlatforms.js +2 -2
  74. package/build/src/prebuild/validateTemplatePlatforms.js.map +1 -1
  75. package/build/src/run/hints.js +4 -0
  76. package/build/src/run/hints.js.map +1 -1
  77. package/build/src/run/index.js +101 -0
  78. package/build/src/run/index.js.map +1 -0
  79. package/build/src/start/doctor/dependencies/bundledNativeModules.js +2 -2
  80. package/build/src/start/doctor/dependencies/bundledNativeModules.js.map +1 -1
  81. package/build/src/start/doctor/dependencies/getVersionedPackages.js +22 -7
  82. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  83. package/build/src/start/doctor/dependencies/resolvePackages.js +66 -0
  84. package/build/src/start/doctor/dependencies/resolvePackages.js.map +1 -0
  85. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +22 -33
  86. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  87. package/build/src/start/interface/interactiveActions.js +54 -19
  88. package/build/src/start/interface/interactiveActions.js.map +1 -1
  89. package/build/src/start/server/BundlerDevServer.js +14 -10
  90. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  91. package/build/src/start/server/DevServerManager.js +6 -1
  92. package/build/src/start/server/DevServerManager.js.map +1 -1
  93. package/build/src/start/server/DevToolsPluginManager.js +63 -0
  94. package/build/src/start/server/DevToolsPluginManager.js.map +1 -0
  95. package/build/src/start/server/getStaticRenderFunctions.js +25 -23
  96. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
  97. package/build/src/start/server/metro/MetroBundlerDevServer.js +76 -69
  98. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  99. package/build/src/start/server/metro/MetroTerminalReporter.js +6 -2
  100. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  101. package/build/src/start/server/metro/TerminalReporter.js +18 -1
  102. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  103. package/build/src/start/server/metro/bundleApiRoutes.js +5 -3
  104. package/build/src/start/server/metro/bundleApiRoutes.js.map +1 -1
  105. package/build/src/start/server/metro/createExpoMetroResolver.js +80 -46
  106. package/build/src/start/server/metro/createExpoMetroResolver.js.map +1 -1
  107. package/build/src/start/server/metro/createJResolver.js +152 -0
  108. package/build/src/start/server/metro/createJResolver.js.map +1 -0
  109. package/build/src/start/server/metro/createServerRouteMiddleware.js +15 -2
  110. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  111. package/build/src/start/server/metro/{inspector-proxy/device.js → debugging/InspectorDevice.js} +10 -38
  112. package/build/src/start/server/metro/debugging/InspectorDevice.js.map +1 -0
  113. package/build/src/start/server/metro/debugging/InspectorProxy.js +116 -0
  114. package/build/src/start/server/metro/debugging/InspectorProxy.js.map +1 -0
  115. package/build/src/start/server/metro/debugging/createDebugMiddleware.js +45 -0
  116. package/build/src/start/server/metro/debugging/createDebugMiddleware.js.map +1 -0
  117. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/NetworkResponse.js +3 -4
  118. package/build/src/start/server/metro/debugging/inspectorHandlers/NetworkResponse.js.map +1 -0
  119. package/build/src/start/server/metro/debugging/inspectorHandlers/PageReload.js.map +1 -0
  120. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerGetPossibleBreakpoints.js +5 -6
  121. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerGetPossibleBreakpoints.js.map +1 -0
  122. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerScriptParsed.js +3 -2
  123. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerScriptParsed.js.map +1 -0
  124. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerSetBreakpointByUrl.js +3 -2
  125. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerSetBreakpointByUrl.js.map +1 -0
  126. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeCallFunctionOn.js +24 -0
  127. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeCallFunctionOn.js.map +1 -0
  128. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeRuntimeGetProperties.js +5 -4
  129. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeGetProperties.js.map +1 -0
  130. package/build/src/start/server/metro/debugging/inspectorHandlers/types.js.map +1 -0
  131. package/build/src/start/server/metro/debugging/inspectorHandlers/utils.js +20 -0
  132. package/build/src/start/server/metro/debugging/inspectorHandlers/utils.js.map +1 -0
  133. package/build/src/start/server/metro/externals.js +25 -3
  134. package/build/src/start/server/metro/externals.js.map +1 -1
  135. package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -1
  136. package/build/src/start/server/metro/instantiateMetro.js +40 -15
  137. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  138. package/build/src/start/server/metro/metroErrorInterface.js +3 -2
  139. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
  140. package/build/src/start/server/metro/router.js +5 -6
  141. package/build/src/start/server/metro/router.js.map +1 -1
  142. package/build/src/start/server/metro/runServer-fork.js +17 -27
  143. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  144. package/build/src/start/server/metro/serializeHtml.js +59 -0
  145. package/build/src/start/server/metro/serializeHtml.js.map +1 -0
  146. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +1 -2
  147. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -1
  148. package/build/src/start/server/metro/withMetroMultiPlatform.js +237 -214
  149. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  150. package/build/src/start/server/metro/withMetroResolvers.js +114 -40
  151. package/build/src/start/server/metro/withMetroResolvers.js.map +1 -1
  152. package/build/src/start/server/middleware/DevToolsPluginMiddleware.js +61 -0
  153. package/build/src/start/server/middleware/DevToolsPluginMiddleware.js.map +1 -0
  154. package/build/src/start/server/middleware/ExpoMiddleware.js +2 -2
  155. package/build/src/start/server/middleware/ExpoMiddleware.js.map +1 -1
  156. package/build/src/start/server/middleware/ManifestMiddleware.js +22 -66
  157. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  158. package/build/src/start/server/middleware/inspector/JsInspector.js +23 -2
  159. package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -1
  160. package/build/src/start/server/middleware/inspector/LaunchBrowser.js +30 -26
  161. package/build/src/start/server/middleware/inspector/LaunchBrowser.js.map +1 -1
  162. package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js +7 -7
  163. package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js.map +1 -1
  164. package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js +5 -2
  165. package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js.map +1 -1
  166. package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js +3 -2
  167. package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js.map +1 -1
  168. package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js +8 -7
  169. package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js.map +1 -1
  170. package/build/src/start/server/middleware/metroOptions.js +176 -0
  171. package/build/src/start/server/middleware/metroOptions.js.map +1 -0
  172. package/build/src/start/server/type-generation/__typetests__/fixtures/basic.js.map +1 -1
  173. package/build/src/start/server/type-generation/__typetests__/route.test.js +11 -3
  174. package/build/src/start/server/type-generation/__typetests__/route.test.js.map +1 -1
  175. package/build/src/start/server/type-generation/routes.js +6 -4
  176. package/build/src/start/server/type-generation/routes.js.map +1 -1
  177. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js +1 -1
  178. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
  179. package/build/src/utils/analytics/getMetroDebugProperties.js +1 -2
  180. package/build/src/utils/analytics/getMetroDebugProperties.js.map +1 -1
  181. package/build/src/utils/analytics/getMetroProperties.js +1 -2
  182. package/build/src/utils/analytics/getMetroProperties.js.map +1 -1
  183. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  184. package/build/src/utils/args.js +4 -2
  185. package/build/src/utils/args.js.map +1 -1
  186. package/build/src/utils/cocoapods.js +1 -1
  187. package/build/src/utils/cocoapods.js.map +1 -1
  188. package/build/src/utils/codesigning.js +11 -1
  189. package/build/src/utils/codesigning.js.map +1 -1
  190. package/build/src/utils/dir.js +18 -8
  191. package/build/src/utils/dir.js.map +1 -1
  192. package/build/src/utils/env.js +10 -1
  193. package/build/src/utils/env.js.map +1 -1
  194. package/build/src/utils/getOrPromptApplicationId.js +2 -4
  195. package/build/src/utils/getOrPromptApplicationId.js.map +1 -1
  196. package/build/src/utils/prompts.js +1 -28
  197. package/build/src/utils/prompts.js.map +1 -1
  198. package/build/src/utils/tsconfig/loadTsConfigPaths.js +3 -11
  199. package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +1 -1
  200. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js +22 -12
  201. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +1 -1
  202. package/package.json +19 -18
  203. package/static/shims/react-native-web/dist/cjs/exports/AppRegistry/AppContainer.js +13 -0
  204. package/static/shims/react-native-web/dist/exports/AppRegistry/AppContainer.js +12 -0
  205. package/static/template/index.html +14 -95
  206. package/build/src/export/printBundleSizes.js +0 -101
  207. package/build/src/export/printBundleSizes.js.map +0 -1
  208. package/build/src/start/server/metro/inspector-proxy/device.js.map +0 -1
  209. package/build/src/start/server/metro/inspector-proxy/handlers/NetworkResponse.js.map +0 -1
  210. package/build/src/start/server/metro/inspector-proxy/handlers/PageReload.js.map +0 -1
  211. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerGetPossibleBreakpoints.js.map +0 -1
  212. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerScriptParsed.js.map +0 -1
  213. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerSetBreakpointByUrl.js.map +0 -1
  214. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeRuntimeGetProperties.js.map +0 -1
  215. package/build/src/start/server/metro/inspector-proxy/handlers/types.js.map +0 -1
  216. package/build/src/start/server/metro/inspector-proxy/index.js +0 -27
  217. package/build/src/start/server/metro/inspector-proxy/index.js.map +0 -1
  218. package/build/src/start/server/metro/inspector-proxy/proxy.js +0 -169
  219. package/build/src/start/server/metro/inspector-proxy/proxy.js.map +0 -1
  220. package/build/src/start/server/metro/resolveFromProject.js +0 -90
  221. package/build/src/start/server/metro/resolveFromProject.js.map +0 -1
  222. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js +0 -64
  223. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js.map +0 -1
  224. /package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/PageReload.js +0 -0
  225. /package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/types.js +0 -0
@@ -3,34 +3,123 @@ Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
5
  exports.persistMetroAssetsAsync = persistMetroAssetsAsync;
6
- exports.stripAssetPrefix = stripAssetPrefix;
6
+ exports.copyInBatchesAsync = copyInBatchesAsync;
7
+ exports.filterPlatformAssetScales = filterPlatformAssetScales;
7
8
  var _fs = _interopRequireDefault(require("fs"));
8
9
  var _path = _interopRequireDefault(require("path"));
10
+ var _metroAssetLocalPath = require("./metroAssetLocalPath");
9
11
  var _log = require("../log");
10
12
  function _interopRequireDefault(obj) {
11
13
  return obj && obj.__esModule ? obj : {
12
14
  default: obj
13
15
  };
14
16
  }
15
- function persistMetroAssetsAsync(assets, { platform , outputDirectory , basePath }) {
16
- const files = assets.reduce((acc, asset)=>{
17
+ function cleanAssetCatalog(catalogDir) {
18
+ const files = _fs.default.readdirSync(catalogDir).filter((file)=>file.endsWith(".imageset")
19
+ );
20
+ for (const file1 of files){
21
+ _fs.default.rmSync(_path.default.join(catalogDir, file1));
22
+ }
23
+ }
24
+ async function persistMetroAssetsAsync(assets, { platform , outputDirectory , baseUrl , iosAssetCatalogDirectory , files }) {
25
+ if (outputDirectory == null) {
26
+ _log.Log.warn("Assets destination folder is not set, skipping...");
27
+ return;
28
+ }
29
+ let assetsToCopy = [];
30
+ // TODO: Use `files` as below to defer writing files
31
+ if (platform === "ios" && iosAssetCatalogDirectory != null) {
32
+ // Use iOS Asset Catalog for images. This will allow Apple app thinning to
33
+ // remove unused scales from the optimized bundle.
34
+ const catalogDir = _path.default.join(iosAssetCatalogDirectory, "RNAssets.xcassets");
35
+ if (!_fs.default.existsSync(catalogDir)) {
36
+ _log.Log.error(`Could not find asset catalog 'RNAssets.xcassets' in ${iosAssetCatalogDirectory}. Make sure to create it if it does not exist.`);
37
+ return;
38
+ }
39
+ _log.Log.log("Adding images to asset catalog", catalogDir);
40
+ cleanAssetCatalog(catalogDir);
41
+ for (const asset of assets){
42
+ if (isCatalogAsset(asset)) {
43
+ const imageSet = getImageSet(catalogDir, asset, filterPlatformAssetScales(platform, asset.scales));
44
+ writeImageSet(imageSet);
45
+ } else {
46
+ assetsToCopy.push(asset);
47
+ }
48
+ }
49
+ _log.Log.log("Done adding images to asset catalog");
50
+ } else {
51
+ assetsToCopy = [
52
+ ...assets
53
+ ];
54
+ }
55
+ const batches = {};
56
+ async function write(src, dest) {
57
+ if (files) {
58
+ const data = await _fs.default.promises.readFile(src);
59
+ files.set(dest, {
60
+ contents: data,
61
+ targetDomain: platform === "web" ? "client" : undefined
62
+ });
63
+ } else {
64
+ batches[src] = _path.default.join(outputDirectory, dest);
65
+ }
66
+ }
67
+ for (const asset of assetsToCopy){
17
68
  const validScales = new Set(filterPlatformAssetScales(platform, asset.scales));
18
- asset.scales.forEach((scale, idx)=>{
19
- if (!validScales.has(scale)) {
20
- return;
69
+ for(let idx = 0; idx < asset.scales.length; idx++){
70
+ const scale = asset.scales[idx];
71
+ if (validScales.has(scale)) {
72
+ await write(asset.files[idx], (0, _metroAssetLocalPath).getAssetLocalPath(asset, {
73
+ platform,
74
+ scale,
75
+ baseUrl
76
+ }));
21
77
  }
22
- const src = asset.files[idx];
23
- const dest = _path.default.join(outputDirectory, getAssetLocalPath(asset, {
78
+ }
79
+ }
80
+ if (!files) {
81
+ await copyInBatchesAsync(batches);
82
+ }
83
+ }
84
+ function writeImageSet(imageSet) {
85
+ _fs.default.mkdirSync(imageSet.baseUrl, {
86
+ recursive: true
87
+ });
88
+ for (const file2 of imageSet.files){
89
+ const dest = _path.default.join(imageSet.baseUrl, file2.name);
90
+ _fs.default.copyFileSync(file2.src, dest);
91
+ }
92
+ _fs.default.writeFileSync(_path.default.join(imageSet.baseUrl, "Contents.json"), JSON.stringify({
93
+ images: imageSet.files.map((file)=>({
94
+ filename: file.name,
95
+ idiom: "universal",
96
+ scale: `${file.scale}x`
97
+ })
98
+ ),
99
+ info: {
100
+ author: "expo",
101
+ version: 1
102
+ }
103
+ }));
104
+ }
105
+ function isCatalogAsset(asset) {
106
+ return asset.type === "png" || asset.type === "jpg" || asset.type === "jpeg";
107
+ }
108
+ function getImageSet(catalogDir, asset, scales) {
109
+ const fileName = getResourceIdentifier(asset);
110
+ return {
111
+ baseUrl: _path.default.join(catalogDir, `${fileName}.imageset`),
112
+ files: scales.map((scale, idx)=>{
113
+ const suffix = scale === 1 ? "" : `@${scale}x`;
114
+ return {
115
+ name: `${fileName + suffix}.${asset.type}`,
24
116
  scale,
25
- basePath
26
- }));
27
- acc[src] = dest;
28
- });
29
- return acc;
30
- }, {});
31
- return copyAll(files);
117
+ src: asset.files[idx]
118
+ };
119
+ })
120
+ };
32
121
  }
33
- function copyAll(filesToCopy) {
122
+ function copyInBatchesAsync(filesToCopy) {
34
123
  const queue = Object.keys(filesToCopy);
35
124
  if (queue.length === 0) {
36
125
  return;
@@ -47,7 +136,6 @@ function copyAll(filesToCopy) {
47
136
  const dest = filesToCopy[src];
48
137
  copy(src, dest, copyNext);
49
138
  } else {
50
- _log.Log.log("Persisted assets");
51
139
  resolve();
52
140
  }
53
141
  };
@@ -97,22 +185,18 @@ function filterPlatformAssetScales(platform, scales) {
97
185
  }
98
186
  return result;
99
187
  }
100
- function getAssetLocalPath(asset, { basePath , scale }) {
101
- const suffix = scale === 1 ? "" : `@${scale}x`;
102
- const fileName = `${asset.name + suffix}.${asset.type}`;
103
- const adjustedHttpServerLocation = stripAssetPrefix(asset.httpServerLocation, basePath);
104
- return _path.default.join(// Assets can have relative paths outside of the project root.
105
- // Replace `../` with `_` to make sure they don't end up outside of
106
- // the expected assets directory.
107
- adjustedHttpServerLocation.replace(/^\/+/g, "").replace(/\.\.\//g, "_"), fileName);
188
+ function getResourceIdentifier(asset) {
189
+ const folderPath = getBaseUrl(asset);
190
+ return `${folderPath}/${asset.name}`.toLowerCase().replace(/\//g, "_") // Encode folder structure in file name
191
+ .replace(/([^a-z0-9_])/g, "") // Remove illegal chars
192
+ .replace(/^assets_/, ""); // Remove "assets_" prefix
108
193
  }
109
- function stripAssetPrefix(path, basePath) {
110
- path = path.replace(/\/assets\?export_path=(.*)/, "$1");
111
- // TODO: Windows?
112
- if (basePath) {
113
- return path.replace(/^\/+/g, "").replace(new RegExp(`^${basePath.replace(/^\/+/g, "").replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d")}`, "g"), "");
194
+ function getBaseUrl(asset) {
195
+ let baseUrl = asset.httpServerLocation;
196
+ if (baseUrl[0] === "/") {
197
+ baseUrl = baseUrl.substring(1);
114
198
  }
115
- return path;
199
+ return baseUrl;
116
200
  }
117
201
 
118
202
  //# sourceMappingURL=persistMetroAssets.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/export/persistMetroAssets.ts"],"sourcesContent":["import fs from 'fs';\nimport type { AssetData, AssetDataWithoutFiles } from 'metro';\nimport path from 'path';\n\nimport { Log } from '../log';\n\nexport function persistMetroAssetsAsync(\n assets: readonly AssetData[],\n {\n platform,\n outputDirectory,\n basePath,\n }: {\n platform: string;\n outputDirectory: string;\n basePath?: string;\n }\n) {\n const files = assets.reduce<Record<string, string>>((acc, asset) => {\n const validScales = new Set(filterPlatformAssetScales(platform, asset.scales));\n\n asset.scales.forEach((scale, idx) => {\n if (!validScales.has(scale)) {\n return;\n }\n const src = asset.files[idx];\n const dest = path.join(outputDirectory, getAssetLocalPath(asset, { scale, basePath }));\n acc[src] = dest;\n });\n return acc;\n }, {});\n\n return copyAll(files);\n}\n\nfunction copyAll(filesToCopy: Record<string, string>) {\n const queue = Object.keys(filesToCopy);\n if (queue.length === 0) {\n return;\n }\n\n Log.log(`Copying ${queue.length} asset files`);\n return new Promise<void>((resolve, reject) => {\n const copyNext = (error?: NodeJS.ErrnoException) => {\n if (error) {\n return reject(error);\n }\n if (queue.length) {\n // queue.length === 0 is checked in previous branch, so this is string\n const src = queue.shift() as string;\n const dest = filesToCopy[src];\n copy(src, dest, copyNext);\n } else {\n Log.log('Persisted assets');\n resolve();\n }\n };\n copyNext();\n });\n}\n\nfunction copy(src: string, dest: string, callback: (error: NodeJS.ErrnoException) => void): void {\n fs.mkdir(path.dirname(dest), { recursive: true }, (err?) => {\n if (err) {\n callback(err);\n return;\n }\n fs.createReadStream(src).pipe(fs.createWriteStream(dest)).on('finish', callback);\n });\n}\n\nconst ALLOWED_SCALES: { [key: string]: number[] } = {\n ios: [1, 2, 3],\n};\n\nfunction filterPlatformAssetScales(platform: string, scales: readonly number[]): readonly number[] {\n const whitelist: number[] = ALLOWED_SCALES[platform];\n if (!whitelist) {\n return scales;\n }\n const result = scales.filter((scale) => whitelist.includes(scale));\n if (!result.length && scales.length) {\n // No matching scale found, but there are some available. Ideally we don't\n // want to be in this situation and should throw, but for now as a fallback\n // let's just use the closest larger image\n const maxScale = whitelist[whitelist.length - 1];\n for (const scale of scales) {\n if (scale > maxScale) {\n result.push(scale);\n break;\n }\n }\n\n // There is no larger scales available, use the largest we have\n if (!result.length) {\n result.push(scales[scales.length - 1]);\n }\n }\n return result;\n}\n\nfunction getAssetLocalPath(\n asset: AssetDataWithoutFiles,\n { basePath, scale }: { basePath?: string; scale: number }\n): string {\n const suffix = scale === 1 ? '' : `@${scale}x`;\n const fileName = `${asset.name + suffix}.${asset.type}`;\n\n const adjustedHttpServerLocation = stripAssetPrefix(asset.httpServerLocation, basePath);\n return path.join(\n // Assets can have relative paths outside of the project root.\n // Replace `../` with `_` to make sure they don't end up outside of\n // the expected assets directory.\n adjustedHttpServerLocation.replace(/^\\/+/g, '').replace(/\\.\\.\\//g, '_'),\n fileName\n );\n}\n\nexport function stripAssetPrefix(path: string, basePath?: string) {\n path = path.replace(/\\/assets\\?export_path=(.*)/, '$1');\n\n // TODO: Windows?\n if (basePath) {\n return path.replace(/^\\/+/g, '').replace(\n new RegExp(\n `^${basePath\n .replace(/^\\/+/g, '')\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d')}`,\n 'g'\n ),\n ''\n );\n }\n return path;\n}\n"],"names":["persistMetroAssetsAsync","stripAssetPrefix","assets","platform","outputDirectory","basePath","files","reduce","acc","asset","validScales","Set","filterPlatformAssetScales","scales","forEach","scale","idx","has","src","dest","path","join","getAssetLocalPath","copyAll","filesToCopy","queue","Object","keys","length","Log","log","Promise","resolve","reject","copyNext","error","shift","copy","callback","fs","mkdir","dirname","recursive","err","createReadStream","pipe","createWriteStream","on","ALLOWED_SCALES","ios","whitelist","result","filter","includes","maxScale","push","suffix","fileName","name","type","adjustedHttpServerLocation","httpServerLocation","replace","RegExp"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/export/persistMetroAssets.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * Based on the community asset persisting for Metro but with base path and web support:\n * https://github.com/facebook/react-native/blob/d6e0bc714ad4d215ede4949d3c4f44af6dea5dd3/packages/community-cli-plugin/src/commands/bundle/saveAssets.js#L1\n */\nimport fs from 'fs';\nimport type { AssetData } from 'metro';\nimport path from 'path';\n\nimport { getAssetLocalPath } from './metroAssetLocalPath';\nimport { ExportAssetMap } from './saveAssets';\nimport { Log } from '../log';\n\nfunction cleanAssetCatalog(catalogDir: string): void {\n const files = fs.readdirSync(catalogDir).filter((file) => file.endsWith('.imageset'));\n for (const file of files) {\n fs.rmSync(path.join(catalogDir, file));\n }\n}\n\nexport async function persistMetroAssetsAsync(\n assets: readonly AssetData[],\n {\n platform,\n outputDirectory,\n baseUrl,\n iosAssetCatalogDirectory,\n files,\n }: {\n platform: string;\n outputDirectory: string;\n baseUrl?: string;\n iosAssetCatalogDirectory?: string;\n files?: ExportAssetMap;\n }\n) {\n if (outputDirectory == null) {\n Log.warn('Assets destination folder is not set, skipping...');\n return;\n }\n\n let assetsToCopy: AssetData[] = [];\n\n // TODO: Use `files` as below to defer writing files\n if (platform === 'ios' && iosAssetCatalogDirectory != null) {\n // Use iOS Asset Catalog for images. This will allow Apple app thinning to\n // remove unused scales from the optimized bundle.\n const catalogDir = path.join(iosAssetCatalogDirectory, 'RNAssets.xcassets');\n if (!fs.existsSync(catalogDir)) {\n Log.error(\n `Could not find asset catalog 'RNAssets.xcassets' in ${iosAssetCatalogDirectory}. Make sure to create it if it does not exist.`\n );\n return;\n }\n\n Log.log('Adding images to asset catalog', catalogDir);\n cleanAssetCatalog(catalogDir);\n for (const asset of assets) {\n if (isCatalogAsset(asset)) {\n const imageSet = getImageSet(\n catalogDir,\n asset,\n filterPlatformAssetScales(platform, asset.scales)\n );\n writeImageSet(imageSet);\n } else {\n assetsToCopy.push(asset);\n }\n }\n Log.log('Done adding images to asset catalog');\n } else {\n assetsToCopy = [...assets];\n }\n\n const batches: Record<string, string> = {};\n\n async function write(src: string, dest: string) {\n if (files) {\n const data = await fs.promises.readFile(src);\n files.set(dest, {\n contents: data,\n targetDomain: platform === 'web' ? 'client' : undefined,\n });\n } else {\n batches[src] = path.join(outputDirectory, dest);\n }\n }\n\n for (const asset of assetsToCopy) {\n const validScales = new Set(filterPlatformAssetScales(platform, asset.scales));\n for (let idx = 0; idx < asset.scales.length; idx++) {\n const scale = asset.scales[idx];\n if (validScales.has(scale)) {\n await write(asset.files[idx], getAssetLocalPath(asset, { platform, scale, baseUrl }));\n }\n }\n }\n\n if (!files) {\n await copyInBatchesAsync(batches);\n }\n}\n\nfunction writeImageSet(imageSet: ImageSet): void {\n fs.mkdirSync(imageSet.baseUrl, { recursive: true });\n\n for (const file of imageSet.files) {\n const dest = path.join(imageSet.baseUrl, file.name);\n fs.copyFileSync(file.src, dest);\n }\n\n fs.writeFileSync(\n path.join(imageSet.baseUrl, 'Contents.json'),\n JSON.stringify({\n images: imageSet.files.map((file) => ({\n filename: file.name,\n idiom: 'universal',\n scale: `${file.scale}x`,\n })),\n info: {\n author: 'expo',\n version: 1,\n },\n })\n );\n}\n\nfunction isCatalogAsset(asset: Pick<AssetData, 'type'>): boolean {\n return asset.type === 'png' || asset.type === 'jpg' || asset.type === 'jpeg';\n}\n\ntype ImageSet = {\n baseUrl: string;\n files: { name: string; src: string; scale: number }[];\n};\n\nfunction getImageSet(\n catalogDir: string,\n asset: Pick<AssetData, 'httpServerLocation' | 'name' | 'type' | 'files'>,\n scales: number[]\n): ImageSet {\n const fileName = getResourceIdentifier(asset);\n return {\n baseUrl: path.join(catalogDir, `${fileName}.imageset`),\n files: scales.map((scale, idx) => {\n const suffix = scale === 1 ? '' : `@${scale}x`;\n return {\n name: `${fileName + suffix}.${asset.type}`,\n scale,\n src: asset.files[idx],\n };\n }),\n };\n}\n\nexport function copyInBatchesAsync(filesToCopy: Record<string, string>) {\n const queue = Object.keys(filesToCopy);\n if (queue.length === 0) {\n return;\n }\n\n Log.log(`Copying ${queue.length} asset files`);\n return new Promise<void>((resolve, reject) => {\n const copyNext = (error?: NodeJS.ErrnoException) => {\n if (error) {\n return reject(error);\n }\n if (queue.length) {\n // queue.length === 0 is checked in previous branch, so this is string\n const src = queue.shift() as string;\n const dest = filesToCopy[src];\n copy(src, dest, copyNext);\n } else {\n resolve();\n }\n };\n copyNext();\n });\n}\n\nfunction copy(src: string, dest: string, callback: (error: NodeJS.ErrnoException) => void): void {\n fs.mkdir(path.dirname(dest), { recursive: true }, (err?) => {\n if (err) {\n callback(err);\n return;\n }\n fs.createReadStream(src).pipe(fs.createWriteStream(dest)).on('finish', callback);\n });\n}\n\nconst ALLOWED_SCALES: { [key: string]: number[] } = {\n ios: [1, 2, 3],\n};\n\nexport function filterPlatformAssetScales(platform: string, scales: number[]): number[] {\n const whitelist: number[] = ALLOWED_SCALES[platform];\n if (!whitelist) {\n return scales;\n }\n const result = scales.filter((scale) => whitelist.includes(scale));\n if (!result.length && scales.length) {\n // No matching scale found, but there are some available. Ideally we don't\n // want to be in this situation and should throw, but for now as a fallback\n // let's just use the closest larger image\n const maxScale = whitelist[whitelist.length - 1];\n for (const scale of scales) {\n if (scale > maxScale) {\n result.push(scale);\n break;\n }\n }\n\n // There is no larger scales available, use the largest we have\n if (!result.length) {\n result.push(scales[scales.length - 1]);\n }\n }\n return result;\n}\n\nfunction getResourceIdentifier(asset: Pick<AssetData, 'httpServerLocation' | 'name'>): string {\n const folderPath = getBaseUrl(asset);\n return `${folderPath}/${asset.name}`\n .toLowerCase()\n .replace(/\\//g, '_') // Encode folder structure in file name\n .replace(/([^a-z0-9_])/g, '') // Remove illegal chars\n .replace(/^assets_/, ''); // Remove \"assets_\" prefix\n}\n\nfunction getBaseUrl(asset: Pick<AssetData, 'httpServerLocation'>): string {\n let baseUrl = asset.httpServerLocation;\n if (baseUrl[0] === '/') {\n baseUrl = baseUrl.substring(1);\n }\n return baseUrl;\n}\n"],"names":["persistMetroAssetsAsync","copyInBatchesAsync","filterPlatformAssetScales","cleanAssetCatalog","catalogDir","files","fs","readdirSync","filter","file","endsWith","rmSync","path","join","assets","platform","outputDirectory","baseUrl","iosAssetCatalogDirectory","Log","warn","assetsToCopy","existsSync","error","log","asset","isCatalogAsset","imageSet","getImageSet","scales","writeImageSet","push","batches","write","src","dest","data","promises","readFile","set","contents","targetDomain","undefined","validScales","Set","idx","length","scale","has","getAssetLocalPath","mkdirSync","recursive","name","copyFileSync","writeFileSync","JSON","stringify","images","map","filename","idiom","info","author","version","type","fileName","getResourceIdentifier","suffix","filesToCopy","queue","Object","keys","Promise","resolve","reject","copyNext","shift","copy","callback","mkdir","dirname","err","createReadStream","pipe","createWriteStream","on","ALLOWED_SCALES","ios","whitelist","result","includes","maxScale","folderPath","getBaseUrl","toLowerCase","replace","httpServerLocation","substring"],"mappings":"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"}
@@ -3,8 +3,10 @@ Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
5
  exports.getUserDefinedFile = getUserDefinedFile;
6
+ exports.copyPublicFolderAsync = copyPublicFolderAsync;
6
7
  var _fs = _interopRequireDefault(require("fs"));
7
8
  var _path = _interopRequireDefault(require("path"));
9
+ var _dir = require("../utils/dir");
8
10
  var _env = require("../utils/env");
9
11
  function _interopRequireDefault(obj) {
10
12
  return obj && obj.__esModule ? obj : {
@@ -23,5 +25,10 @@ function getUserDefinedFile(projectRoot, possiblePaths) {
23
25
  }
24
26
  return null;
25
27
  }
28
+ async function copyPublicFolderAsync(publicFolder, outputFolder) {
29
+ if (_fs.default.existsSync(publicFolder)) {
30
+ await (0, _dir).copyAsync(publicFolder, outputFolder);
31
+ }
32
+ }
26
33
 
27
34
  //# sourceMappingURL=publicFolder.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/export/publicFolder.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { env } from '../utils/env';\n\nconst debug = require('debug')('expo:public-folder') as typeof console.log;\n\n/** @returns the file system path for a user-defined file in the public folder. */\nexport function getUserDefinedFile(projectRoot: string, possiblePaths: string[]): string | null {\n const publicPath = path.join(projectRoot, env.EXPO_PUBLIC_FOLDER);\n\n for (const possiblePath of possiblePaths) {\n const fullPath = path.join(publicPath, possiblePath);\n if (fs.existsSync(fullPath)) {\n debug(`Found user-defined public file: ` + possiblePath);\n return fullPath;\n }\n }\n\n return null;\n}\n"],"names":["getUserDefinedFile","debug","require","projectRoot","possiblePaths","publicPath","path","join","env","EXPO_PUBLIC_FOLDER","possiblePath","fullPath","fs","existsSync"],"mappings":"AAAA;;;;QAQgBA,kBAAkB,GAAlBA,kBAAkB;AARnB,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACF,IAAA,KAAM,kCAAN,MAAM,EAAA;AAEH,IAAA,IAAc,WAAd,cAAc,CAAA;;;;;;AAElC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,AAAsB,AAAC;AAGpE,SAASF,kBAAkB,CAACG,WAAmB,EAAEC,aAAuB,EAAiB;IAC9F,MAAMC,UAAU,GAAGC,KAAI,QAAA,CAACC,IAAI,CAACJ,WAAW,EAAEK,IAAG,IAAA,CAACC,kBAAkB,CAAC,AAAC;IAElE,KAAK,MAAMC,YAAY,IAAIN,aAAa,CAAE;QACxC,MAAMO,QAAQ,GAAGL,KAAI,QAAA,CAACC,IAAI,CAACF,UAAU,EAAEK,YAAY,CAAC,AAAC;QACrD,IAAIE,GAAE,QAAA,CAACC,UAAU,CAACF,QAAQ,CAAC,EAAE;YAC3BV,KAAK,CAAC,CAAC,gCAAgC,CAAC,GAAGS,YAAY,CAAC,CAAC;YACzD,OAAOC,QAAQ,CAAC;SACjB;KACF;IAED,OAAO,IAAI,CAAC;CACb"}
1
+ {"version":3,"sources":["../../../src/export/publicFolder.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\n\nimport { copyAsync } from '../utils/dir';\nimport { env } from '../utils/env';\n\nconst debug = require('debug')('expo:public-folder') as typeof console.log;\n\n/** @returns the file system path for a user-defined file in the public folder. */\nexport function getUserDefinedFile(projectRoot: string, possiblePaths: string[]): string | null {\n const publicPath = path.join(projectRoot, env.EXPO_PUBLIC_FOLDER);\n\n for (const possiblePath of possiblePaths) {\n const fullPath = path.join(publicPath, possiblePath);\n if (fs.existsSync(fullPath)) {\n debug(`Found user-defined public file: ` + possiblePath);\n return fullPath;\n }\n }\n\n return null;\n}\n\n/**\n * Copy the contents of the public folder into the output folder.\n * This enables users to add static files like `favicon.ico` or `serve.json`.\n *\n * The contents of this folder are completely universal since they refer to\n * static network requests which fall outside the scope of React Native's magic\n * platform resolution patterns.\n */\nexport async function copyPublicFolderAsync(publicFolder: string, outputFolder: string) {\n if (fs.existsSync(publicFolder)) {\n await copyAsync(publicFolder, outputFolder);\n }\n}\n"],"names":["getUserDefinedFile","copyPublicFolderAsync","debug","require","projectRoot","possiblePaths","publicPath","path","join","env","EXPO_PUBLIC_FOLDER","possiblePath","fullPath","fs","existsSync","publicFolder","outputFolder","copyAsync"],"mappings":"AAAA;;;;QASgBA,kBAAkB,GAAlBA,kBAAkB;QAsBZC,qBAAqB,GAArBA,qBAAqB;AA/B5B,IAAA,GAAI,kCAAJ,IAAI,EAAA;AACF,IAAA,KAAM,kCAAN,MAAM,EAAA;AAEG,IAAA,IAAc,WAAd,cAAc,CAAA;AACpB,IAAA,IAAc,WAAd,cAAc,CAAA;;;;;;AAElC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,AAAsB,AAAC;AAGpE,SAASH,kBAAkB,CAACI,WAAmB,EAAEC,aAAuB,EAAiB;IAC9F,MAAMC,UAAU,GAAGC,KAAI,QAAA,CAACC,IAAI,CAACJ,WAAW,EAAEK,IAAG,IAAA,CAACC,kBAAkB,CAAC,AAAC;IAElE,KAAK,MAAMC,YAAY,IAAIN,aAAa,CAAE;QACxC,MAAMO,QAAQ,GAAGL,KAAI,QAAA,CAACC,IAAI,CAACF,UAAU,EAAEK,YAAY,CAAC,AAAC;QACrD,IAAIE,GAAE,QAAA,CAACC,UAAU,CAACF,QAAQ,CAAC,EAAE;YAC3BV,KAAK,CAAC,CAAC,gCAAgC,CAAC,GAAGS,YAAY,CAAC,CAAC;YACzD,OAAOC,QAAQ,CAAC;SACjB;KACF;IAED,OAAO,IAAI,CAAC;CACb;AAUM,eAAeX,qBAAqB,CAACc,YAAoB,EAAEC,YAAoB,EAAE;IACtF,IAAIH,GAAE,QAAA,CAACC,UAAU,CAACC,YAAY,CAAC,EAAE;QAC/B,MAAME,CAAAA,GAAAA,IAAS,AAA4B,CAAA,UAA5B,CAACF,YAAY,EAAEC,YAAY,CAAC,CAAC;KAC7C;CACF"}
@@ -56,7 +56,7 @@ async function resolveOptionsAsync(projectRoot, args) {
56
56
  dev: !!args["--dev"],
57
57
  maxWorkers: args["--max-workers"],
58
58
  dumpAssetmap: !!args["--dump-assetmap"],
59
- dumpSourcemap: !!args["--dump-sourcemap"]
59
+ sourceMaps: !!args["--source-maps"]
60
60
  };
61
61
  }
62
62
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/export/resolveOptions.ts"],"sourcesContent":["import { getConfig, Platform } from '@expo/config';\n\nimport { getPlatformBundlers, PlatformBundlers } from '../start/server/platformBundlers';\nimport { CommandError } from '../utils/errors';\n\nexport type Options = {\n outputDir: string;\n platforms: Platform[];\n maxWorkers?: number;\n dev: boolean;\n clear: boolean;\n minify: boolean;\n dumpAssetmap: boolean;\n dumpSourcemap: boolean;\n};\n\n/** Returns an array of platforms based on the input platform identifier and runtime constraints. */\nexport function resolvePlatformOption(\n platformBundlers: PlatformBundlers,\n platform: string[] = ['all']\n): Platform[] {\n const platformsAvailable: Partial<PlatformBundlers> = Object.fromEntries(\n Object.entries(platformBundlers).filter(([, bundler]) => bundler === 'metro')\n );\n\n if (!Object.keys(platformsAvailable).length) {\n throw new CommandError(\n `No platforms are configured to use the Metro bundler in the project Expo config.`\n );\n }\n\n const assertPlatformBundler = (platform: Platform): Platform => {\n if (!platformsAvailable[platform]) {\n throw new CommandError(\n 'BAD_ARGS',\n `Platform \"${platform}\" is not configured to use the Metro bundler in the project Expo config.`\n );\n }\n\n return platform;\n };\n\n const knownPlatforms = ['android', 'ios', 'web'] as Platform[];\n const assertPlatformIsKnown = (platform: string): Platform => {\n if (!knownPlatforms.includes(platform as Platform)) {\n throw new CommandError(\n `Unsupported platform \"${platform}\". Options are: ${knownPlatforms.join(',')},all`\n );\n }\n\n return platform as Platform;\n };\n\n return (\n platform\n // Expand `all` to all available platforms.\n .map((platform) => (platform === 'all' ? Object.keys(platformsAvailable) : platform))\n .flat()\n // Remove duplicated platforms\n .filter((platform, index, list) => list.indexOf(platform) === index)\n // Assert platforms are valid\n .map((platform) => assertPlatformIsKnown(platform))\n .map((platform) => assertPlatformBundler(platform))\n );\n}\n\nexport async function resolveOptionsAsync(projectRoot: string, args: any): Promise<Options> {\n const { exp } = getConfig(projectRoot, { skipPlugins: true, skipSDKVersionRequirement: true });\n const platformBundlers = getPlatformBundlers(exp);\n\n return {\n platforms: resolvePlatformOption(platformBundlers, args['--platform']),\n outputDir: args['--output-dir'] ?? 'dist',\n minify: !args['--no-minify'],\n clear: !!args['--clear'],\n dev: !!args['--dev'],\n maxWorkers: args['--max-workers'],\n dumpAssetmap: !!args['--dump-assetmap'],\n dumpSourcemap: !!args['--dump-sourcemap'],\n };\n}\n"],"names":["resolvePlatformOption","resolveOptionsAsync","platformBundlers","platform","platformsAvailable","Object","fromEntries","entries","filter","bundler","keys","length","CommandError","assertPlatformBundler","knownPlatforms","assertPlatformIsKnown","includes","join","map","flat","index","list","indexOf","projectRoot","args","exp","getConfig","skipPlugins","skipSDKVersionRequirement","getPlatformBundlers","platforms","outputDir","minify","clear","dev","maxWorkers","dumpAssetmap","dumpSourcemap"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/export/resolveOptions.ts"],"sourcesContent":["import { getConfig, Platform } from '@expo/config';\n\nimport { getPlatformBundlers, PlatformBundlers } from '../start/server/platformBundlers';\nimport { CommandError } from '../utils/errors';\n\nexport type Options = {\n outputDir: string;\n platforms: Platform[];\n maxWorkers?: number;\n dev: boolean;\n clear: boolean;\n minify: boolean;\n dumpAssetmap: boolean;\n sourceMaps: boolean;\n};\n\n/** Returns an array of platforms based on the input platform identifier and runtime constraints. */\nexport function resolvePlatformOption(\n platformBundlers: PlatformBundlers,\n platform: string[] = ['all']\n): Platform[] {\n const platformsAvailable: Partial<PlatformBundlers> = Object.fromEntries(\n Object.entries(platformBundlers).filter(([, bundler]) => bundler === 'metro')\n );\n\n if (!Object.keys(platformsAvailable).length) {\n throw new CommandError(\n `No platforms are configured to use the Metro bundler in the project Expo config.`\n );\n }\n\n const assertPlatformBundler = (platform: Platform): Platform => {\n if (!platformsAvailable[platform]) {\n throw new CommandError(\n 'BAD_ARGS',\n `Platform \"${platform}\" is not configured to use the Metro bundler in the project Expo config.`\n );\n }\n\n return platform;\n };\n\n const knownPlatforms = ['android', 'ios', 'web'] as Platform[];\n const assertPlatformIsKnown = (platform: string): Platform => {\n if (!knownPlatforms.includes(platform as Platform)) {\n throw new CommandError(\n `Unsupported platform \"${platform}\". Options are: ${knownPlatforms.join(',')},all`\n );\n }\n\n return platform as Platform;\n };\n\n return (\n platform\n // Expand `all` to all available platforms.\n .map((platform) => (platform === 'all' ? Object.keys(platformsAvailable) : platform))\n .flat()\n // Remove duplicated platforms\n .filter((platform, index, list) => list.indexOf(platform) === index)\n // Assert platforms are valid\n .map((platform) => assertPlatformIsKnown(platform))\n .map((platform) => assertPlatformBundler(platform))\n );\n}\n\nexport async function resolveOptionsAsync(projectRoot: string, args: any): Promise<Options> {\n const { exp } = getConfig(projectRoot, { skipPlugins: true, skipSDKVersionRequirement: true });\n const platformBundlers = getPlatformBundlers(exp);\n\n return {\n platforms: resolvePlatformOption(platformBundlers, args['--platform']),\n outputDir: args['--output-dir'] ?? 'dist',\n minify: !args['--no-minify'],\n clear: !!args['--clear'],\n dev: !!args['--dev'],\n maxWorkers: args['--max-workers'],\n dumpAssetmap: !!args['--dump-assetmap'],\n sourceMaps: !!args['--source-maps'],\n };\n}\n"],"names":["resolvePlatformOption","resolveOptionsAsync","platformBundlers","platform","platformsAvailable","Object","fromEntries","entries","filter","bundler","keys","length","CommandError","assertPlatformBundler","knownPlatforms","assertPlatformIsKnown","includes","join","map","flat","index","list","indexOf","projectRoot","args","exp","getConfig","skipPlugins","skipSDKVersionRequirement","getPlatformBundlers","platforms","outputDir","minify","clear","dev","maxWorkers","dumpAssetmap","sourceMaps"],"mappings":"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"}
@@ -2,65 +2,190 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- exports.saveAssetsAsync = saveAssetsAsync;
5
+ exports.persistMetroFilesAsync = persistMetroFilesAsync;
6
+ exports.getFilesFromSerialAssets = getFilesFromSerialAssets;
7
+ exports.modifyBundlesWithSourceMaps = modifyBundlesWithSourceMaps;
8
+ var _chalk = _interopRequireDefault(require("chalk"));
9
+ var _fs = _interopRequireDefault(require("fs"));
6
10
  var _path = _interopRequireDefault(require("path"));
7
- var Log = _interopRequireWildcard(require("../log"));
8
- var _array = require("../utils/array");
9
- var _dir = require("../utils/dir");
11
+ var _prettyBytes = _interopRequireDefault(require("pretty-bytes"));
12
+ var _log = require("../log");
10
13
  function _interopRequireDefault(obj) {
11
14
  return obj && obj.__esModule ? obj : {
12
15
  default: obj
13
16
  };
14
17
  }
15
- function _interopRequireWildcard(obj) {
16
- if (obj && obj.__esModule) {
17
- return obj;
18
- } else {
19
- var newObj = {};
20
- if (obj != null) {
21
- for(var key in obj){
22
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
23
- var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {};
24
- if (desc.get || desc.set) {
25
- Object.defineProperty(newObj, key, desc);
26
- } else {
27
- newObj[key] = obj[key];
28
- }
18
+ async function persistMetroFilesAsync(files, outputDir) {
19
+ _fs.default.mkdirSync(_path.default.join(outputDir), {
20
+ recursive: true
21
+ });
22
+ if (!files.size) {
23
+ return;
24
+ }
25
+ // Test fixtures:
26
+ // Log.log(
27
+ // JSON.stringify(
28
+ // Object.fromEntries([...files.entries()].map(([k, v]) => [k, { ...v, contents: '' }]))
29
+ // )
30
+ // );
31
+ const assetEntries = [];
32
+ const routeEntries = [];
33
+ const remainingEntries = [];
34
+ let hasServerOutput = false;
35
+ for (const asset1 of files.entries()){
36
+ hasServerOutput = hasServerOutput || asset1[1].targetDomain === "server";
37
+ if (asset1[1].assetId) assetEntries.push(asset1);
38
+ else if (asset1[1].routeId != null) routeEntries.push(asset1);
39
+ else remainingEntries.push(asset1);
40
+ }
41
+ const groups = groupBy(assetEntries, ([, { assetId }])=>assetId
42
+ );
43
+ const contentSize = (contents)=>{
44
+ const length = typeof contents === "string" ? Buffer.byteLength(contents, "utf8") : contents.length;
45
+ return length;
46
+ };
47
+ const sizeStr = (contents)=>{
48
+ const length = contentSize(contents);
49
+ const size = _chalk.default.gray`(${(0, _prettyBytes).default(length)})`;
50
+ return size;
51
+ };
52
+ if (routeEntries.length) {
53
+ const plural = routeEntries.length === 1 ? "" : "s";
54
+ _log.Log.log("");
55
+ _log.Log.log(_chalk.default.bold`Exporting ${routeEntries.length} static route${plural}:`);
56
+ for (const [, assets] of routeEntries.sort((a, b)=>a[0].length - b[0].length
57
+ )){
58
+ const id = assets.routeId;
59
+ _log.Log.log("/" + (id === "" ? _chalk.default.gray(" (index)") : id), sizeStr(assets.contents));
60
+ }
61
+ }
62
+ const assetGroups = [
63
+ ...groups.entries()
64
+ ].sort((a, b)=>a[0].localeCompare(b[0])
65
+ );
66
+ if (assetGroups.length) {
67
+ const totalAssets = assetGroups.reduce((sum, [, assets])=>sum + assets.length
68
+ , 0);
69
+ const plural = totalAssets === 1 ? "" : "s";
70
+ _log.Log.log("");
71
+ _log.Log.log(_chalk.default.bold`Exporting ${totalAssets} asset${plural}:`);
72
+ for (const [assetId, assets1] of assetGroups){
73
+ const averageContentSize = assets1.reduce((sum, [, { contents }])=>sum + contentSize(contents)
74
+ , 0) / assets1.length;
75
+ _log.Log.log(assetId, _chalk.default.gray(`(${[
76
+ assets1.length > 1 ? `${assets1.length} variations` : "",
77
+ `${(0, _prettyBytes).default(averageContentSize)}`,
78
+ ].filter(Boolean).join(" | ")})`));
79
+ }
80
+ }
81
+ const bundles = new Map();
82
+ const other = [];
83
+ remainingEntries.forEach(([filepath, asset])=>{
84
+ if (!filepath.match(/_expo\/static\//)) {
85
+ other.push([
86
+ filepath,
87
+ asset
88
+ ]);
89
+ } else {
90
+ var ref;
91
+ var ref1;
92
+ const platform = (ref1 = (ref = filepath.match(/_expo\/static\/js\/([^/]+)\//)) == null ? void 0 : ref[1]) != null ? ref1 : "web";
93
+ if (!bundles.has(platform)) bundles.set(platform, []);
94
+ bundles.get(platform).push([
95
+ filepath,
96
+ asset
97
+ ]);
98
+ }
99
+ });
100
+ [
101
+ ...bundles.entries()
102
+ ].forEach(([platform, assets])=>{
103
+ _log.Log.log("");
104
+ const plural = assets.length === 1 ? "" : "s";
105
+ _log.Log.log(_chalk.default.bold`Exporting ${assets.length} bundle${plural} for ${platform}:`);
106
+ const allAssets = assets.sort((a, b)=>a[0].localeCompare(b[0])
107
+ );
108
+ while(allAssets.length){
109
+ const [filePath, asset] = allAssets.shift();
110
+ _log.Log.log(filePath, sizeStr(asset.contents));
111
+ if (filePath.match(/\.(js|hbc)$/)) {
112
+ // Get source map
113
+ const sourceMapIndex = allAssets.findIndex(([fp])=>fp === filePath + ".map"
114
+ );
115
+ if (sourceMapIndex !== -1) {
116
+ const [sourceMapFilePath, sourceMapAsset] = allAssets.splice(sourceMapIndex, 1)[0];
117
+ _log.Log.log(_chalk.default.gray(sourceMapFilePath), sizeStr(sourceMapAsset.contents));
29
118
  }
30
119
  }
31
120
  }
32
- newObj.default = obj;
33
- return newObj;
121
+ });
122
+ if (other.length) {
123
+ _log.Log.log("");
124
+ const plural = other.length === 1 ? "" : "s";
125
+ _log.Log.log(_chalk.default.bold`Exporting ${other.length} file${plural}:`);
126
+ for (const [filePath, asset] of other.sort((a, b)=>a[0].localeCompare(b[0])
127
+ )){
128
+ _log.Log.log(filePath, sizeStr(asset.contents));
129
+ }
34
130
  }
131
+ // Decouple logging from writing for better performance.
132
+ await Promise.all([
133
+ ...files.entries()
134
+ ].sort(([a], [b])=>a.localeCompare(b)
135
+ ).map(async ([file, { contents , targetDomain }])=>{
136
+ // NOTE: Only use `targetDomain` if we have at least one server asset
137
+ const domain = hasServerOutput && targetDomain || "";
138
+ const outputPath = _path.default.join(outputDir, domain, file);
139
+ await _fs.default.promises.mkdir(_path.default.dirname(outputPath), {
140
+ recursive: true
141
+ });
142
+ await _fs.default.promises.writeFile(outputPath, contents);
143
+ }));
144
+ _log.Log.log("");
35
145
  }
36
- const debug = require("debug")("expo:export:saveAssets");
37
- function logAssetTask(projectRoot, action, pathName) {
38
- debug(`${action} ${pathName}`);
39
- const relativePath = pathName.replace(projectRoot, "");
40
- Log.log(`${action} ${relativePath}`);
146
+ function groupBy(array, key) {
147
+ const map = new Map();
148
+ array.forEach((item)=>{
149
+ const group = key(item);
150
+ var ref;
151
+ const list = (ref = map.get(group)) != null ? ref : [];
152
+ list.push(item);
153
+ map.set(group, list);
154
+ });
155
+ return map;
41
156
  }
42
- function collectAssetPaths(assets) {
43
- // Collect paths by key, also effectively handles duplicates in the array
44
- const paths = {};
45
- assets.forEach((asset)=>{
46
- asset.files.forEach((path, index)=>{
47
- paths[asset.fileHashes[index]] = path;
157
+ function getFilesFromSerialAssets(resources, { includeSourceMaps , files =new Map() , platform }) {
158
+ resources.forEach((resource)=>{
159
+ files.set(resource.filename, {
160
+ contents: resource.source,
161
+ originFilename: resource.originFilename,
162
+ targetDomain: platform === "web" ? "client" : undefined
48
163
  });
49
164
  });
50
- return paths;
165
+ return files;
51
166
  }
52
- async function saveAssetsAsync(projectRoot, { assets , outputDir }) {
53
- // Collect paths by key, also effectively handles duplicates in the array
54
- const paths = collectAssetPaths(assets);
55
- // save files one chunk at a time
56
- for (const keys of (0, _array).chunk(Object.entries(paths), 5)){
57
- await Promise.all(keys.map(([key, pathName])=>{
58
- logAssetTask(projectRoot, "saving", pathName);
59
- // copy file over to assetPath
60
- return (0, _dir).copyAsync(pathName, _path.default.join(outputDir, "assets", key));
61
- }));
167
+ function modifyBundlesWithSourceMaps(filename, source, includeSourceMaps) {
168
+ if (filename.endsWith(".js")) {
169
+ // If the bundle ends with source map URLs then update them to point to the correct location.
170
+ // TODO: baseUrl support
171
+ const normalizedFilename = "/" + filename.replace(/^\/+/, "");
172
+ // Ref: https://developer.chrome.com/blog/sourcemaps/#sourceurl-and-displayname-in-action-eval-and-anonymous-functions
173
+ //# sourceMappingURL=//localhost:8085/index.map?platform=web&dev=false&hot=false&lazy=true&minify=true&resolver.environment=client&transform.environment=client&serializer.output=static
174
+ //# sourceURL=http://localhost:8085/index.bundle//&platform=web&dev=false&hot=false&lazy=true&minify=true&resolver.environment=client&transform.environment=client&serializer.output=static
175
+ return source.replace(/^\/\/# (sourceMappingURL|sourceURL)=.*$/gm, (...props)=>{
176
+ if (includeSourceMaps) {
177
+ // TODO: Drop sourceURL when the name is the same as the file output location.
178
+ if (props[1] === "sourceURL") {
179
+ return `//# ${props[1]}=` + normalizedFilename;
180
+ } else if (props[1] === "sourceMappingURL") {
181
+ const mapName = normalizedFilename + ".map";
182
+ return `//# ${props[1]}=` + mapName;
183
+ }
184
+ }
185
+ return "";
186
+ });
62
187
  }
63
- Log.log("Files successfully saved.");
188
+ return source;
64
189
  }
65
190
 
66
191
  //# sourceMappingURL=saveAssets.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/export/saveAssets.ts"],"sourcesContent":["import path from 'path';\n\nimport { BundleAssetWithFileHashes } from './fork-bundleAsync';\nimport * as Log from '../log';\nimport { chunk } from '../utils/array';\nimport { copyAsync } from '../utils/dir';\n\nconst debug = require('debug')('expo:export:saveAssets') as typeof console.log;\n\nexport type ManifestAsset = { fileHashes: string[]; files: string[]; hash: string };\n\nexport type Asset = ManifestAsset | BundleAssetWithFileHashes;\n\nfunction logAssetTask(projectRoot: string, action: 'uploading' | 'saving', pathName: string) {\n debug(`${action} ${pathName}`);\n\n const relativePath = pathName.replace(projectRoot, '');\n Log.log(`${action} ${relativePath}`);\n}\n\nfunction collectAssetPaths(assets: Asset[]): Record<string, string> {\n // Collect paths by key, also effectively handles duplicates in the array\n const paths: { [fileHash: string]: string } = {};\n assets.forEach((asset) => {\n asset.files.forEach((path: string, index: number) => {\n paths[asset.fileHashes[index]] = path;\n });\n });\n return paths;\n}\n\nexport async function saveAssetsAsync(\n projectRoot: string,\n { assets, outputDir }: { assets: Asset[]; outputDir: string }\n) {\n // Collect paths by key, also effectively handles duplicates in the array\n const paths = collectAssetPaths(assets);\n\n // save files one chunk at a time\n for (const keys of chunk(Object.entries(paths), 5)) {\n await Promise.all(\n keys.map(([key, pathName]) => {\n logAssetTask(projectRoot, 'saving', pathName);\n // copy file over to assetPath\n return copyAsync(pathName, path.join(outputDir, 'assets', key));\n })\n );\n }\n Log.log('Files successfully saved.');\n}\n"],"names":["saveAssetsAsync","Log","debug","require","logAssetTask","projectRoot","action","pathName","relativePath","replace","log","collectAssetPaths","assets","paths","forEach","asset","files","path","index","fileHashes","outputDir","keys","chunk","Object","entries","Promise","all","map","key","copyAsync","join"],"mappings":"AAAA;;;;QA+BsBA,eAAe,GAAfA,eAAe;AA/BpB,IAAA,KAAM,kCAAN,MAAM,EAAA;AAGXC,IAAAA,GAAG,mCAAM,QAAQ,EAAd;AACO,IAAA,MAAgB,WAAhB,gBAAgB,CAAA;AACZ,IAAA,IAAc,WAAd,cAAc,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;AAExC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,wBAAwB,CAAC,AAAsB,AAAC;AAM/E,SAASC,YAAY,CAACC,WAAmB,EAAEC,MAA8B,EAAEC,QAAgB,EAAE;IAC3FL,KAAK,CAAC,CAAC,EAAEI,MAAM,CAAC,CAAC,EAAEC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAE/B,MAAMC,YAAY,GAAGD,QAAQ,CAACE,OAAO,CAACJ,WAAW,EAAE,EAAE,CAAC,AAAC;IACvDJ,GAAG,CAACS,GAAG,CAAC,CAAC,EAAEJ,MAAM,CAAC,CAAC,EAAEE,YAAY,CAAC,CAAC,CAAC,CAAC;CACtC;AAED,SAASG,iBAAiB,CAACC,MAAe,EAA0B;IAClE,yEAAyE;IACzE,MAAMC,KAAK,GAAmC,EAAE,AAAC;IACjDD,MAAM,CAACE,OAAO,CAAC,CAACC,KAAK,GAAK;QACxBA,KAAK,CAACC,KAAK,CAACF,OAAO,CAAC,CAACG,IAAY,EAAEC,KAAa,GAAK;YACnDL,KAAK,CAACE,KAAK,CAACI,UAAU,CAACD,KAAK,CAAC,CAAC,GAAGD,IAAI,CAAC;SACvC,CAAC,CAAC;KACJ,CAAC,CAAC;IACH,OAAOJ,KAAK,CAAC;CACd;AAEM,eAAeb,eAAe,CACnCK,WAAmB,EACnB,EAAEO,MAAM,CAAA,EAAEQ,SAAS,CAAA,EAA0C,EAC7D;IACA,yEAAyE;IACzE,MAAMP,KAAK,GAAGF,iBAAiB,CAACC,MAAM,CAAC,AAAC;IAExC,iCAAiC;IACjC,KAAK,MAAMS,IAAI,IAAIC,CAAAA,GAAAA,MAAK,AAA0B,CAAA,MAA1B,CAACC,MAAM,CAACC,OAAO,CAACX,KAAK,CAAC,EAAE,CAAC,CAAC,CAAE;QAClD,MAAMY,OAAO,CAACC,GAAG,CACfL,IAAI,CAACM,GAAG,CAAC,CAAC,CAACC,GAAG,EAAErB,QAAQ,CAAC,GAAK;YAC5BH,YAAY,CAACC,WAAW,EAAE,QAAQ,EAAEE,QAAQ,CAAC,CAAC;YAC9C,8BAA8B;YAC9B,OAAOsB,CAAAA,GAAAA,IAAS,AAA+C,CAAA,UAA/C,CAACtB,QAAQ,EAAEU,KAAI,QAAA,CAACa,IAAI,CAACV,SAAS,EAAE,QAAQ,EAAEQ,GAAG,CAAC,CAAC,CAAC;SACjE,CAAC,CACH,CAAC;KACH;IACD3B,GAAG,CAACS,GAAG,CAAC,2BAA2B,CAAC,CAAC;CACtC"}
1
+ {"version":3,"sources":["../../../src/export/saveAssets.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport path from 'path';\nimport prettyBytes from 'pretty-bytes';\n\nimport { BundleAssetWithFileHashes } from './fork-bundleAsync';\nimport { Log } from '../log';\n\nexport type ManifestAsset = { fileHashes: string[]; files: string[]; hash: string };\n\nexport type Asset = ManifestAsset | BundleAssetWithFileHashes;\n\nexport type ExportAssetDescriptor = {\n contents: string | Buffer;\n originFilename?: string;\n /** An identifier for grouping together variations of the same asset. */\n assetId?: string;\n /** Expo Router route path for formatting the HTML output. */\n routeId?: string;\n /** A key for grouping together output files by server- or client-side. */\n targetDomain?: 'server' | 'client';\n};\n\nexport type ExportAssetMap = Map<string, ExportAssetDescriptor>;\n\nexport async function persistMetroFilesAsync(files: ExportAssetMap, outputDir: string) {\n fs.mkdirSync(path.join(outputDir), { recursive: true });\n if (!files.size) {\n return;\n }\n\n // Test fixtures:\n // Log.log(\n // JSON.stringify(\n // Object.fromEntries([...files.entries()].map(([k, v]) => [k, { ...v, contents: '' }]))\n // )\n // );\n\n const assetEntries: [string, ExportAssetDescriptor][] = [];\n const routeEntries: [string, ExportAssetDescriptor][] = [];\n const remainingEntries: [string, ExportAssetDescriptor][] = [];\n\n let hasServerOutput = false;\n for (const asset of files.entries()) {\n hasServerOutput = hasServerOutput || asset[1].targetDomain === 'server';\n if (asset[1].assetId) assetEntries.push(asset);\n else if (asset[1].routeId != null) routeEntries.push(asset);\n else remainingEntries.push(asset);\n }\n\n const groups = groupBy(assetEntries, ([, { assetId }]) => assetId!);\n\n const contentSize = (contents: string | Buffer) => {\n const length =\n typeof contents === 'string' ? Buffer.byteLength(contents, 'utf8') : contents.length;\n return length;\n };\n\n const sizeStr = (contents: string | Buffer) => {\n const length = contentSize(contents);\n const size = chalk.gray`(${prettyBytes(length)})`;\n return size;\n };\n\n if (routeEntries.length) {\n const plural = routeEntries.length === 1 ? '' : 's';\n\n Log.log('');\n Log.log(chalk.bold`Exporting ${routeEntries.length} static route${plural}:`);\n\n for (const [, assets] of routeEntries.sort((a, b) => a[0].length - b[0].length)) {\n const id = assets.routeId!;\n Log.log('/' + (id === '' ? chalk.gray(' (index)') : id), sizeStr(assets.contents));\n }\n }\n\n const assetGroups = [...groups.entries()].sort((a, b) => a[0].localeCompare(b[0])) as [\n string,\n [string, ExportAssetDescriptor][],\n ][];\n\n if (assetGroups.length) {\n const totalAssets = assetGroups.reduce((sum, [, assets]) => sum + assets.length, 0);\n const plural = totalAssets === 1 ? '' : 's';\n\n Log.log('');\n Log.log(chalk.bold`Exporting ${totalAssets} asset${plural}:`);\n\n for (const [assetId, assets] of assetGroups) {\n const averageContentSize =\n assets.reduce((sum, [, { contents }]) => sum + contentSize(contents), 0) / assets.length;\n Log.log(\n assetId,\n chalk.gray(\n `(${[\n assets.length > 1 ? `${assets.length} variations` : '',\n `${prettyBytes(averageContentSize)}`,\n ]\n .filter(Boolean)\n .join(' | ')})`\n )\n );\n }\n }\n\n const bundles: Map<string, [string, ExportAssetDescriptor][]> = new Map();\n const other: [string, ExportAssetDescriptor][] = [];\n\n remainingEntries.forEach(([filepath, asset]) => {\n if (!filepath.match(/_expo\\/static\\//)) {\n other.push([filepath, asset]);\n } else {\n const platform = filepath.match(/_expo\\/static\\/js\\/([^/]+)\\//)?.[1] ?? 'web';\n if (!bundles.has(platform)) bundles.set(platform, []);\n\n bundles.get(platform)!.push([filepath, asset]);\n }\n });\n\n [...bundles.entries()].forEach(([platform, assets]) => {\n Log.log('');\n const plural = assets.length === 1 ? '' : 's';\n Log.log(chalk.bold`Exporting ${assets.length} bundle${plural} for ${platform}:`);\n\n const allAssets = assets.sort((a, b) => a[0].localeCompare(b[0]));\n while (allAssets.length) {\n const [filePath, asset] = allAssets.shift()!;\n Log.log(filePath, sizeStr(asset.contents));\n if (filePath.match(/\\.(js|hbc)$/)) {\n // Get source map\n const sourceMapIndex = allAssets.findIndex(([fp]) => fp === filePath + '.map');\n if (sourceMapIndex !== -1) {\n const [sourceMapFilePath, sourceMapAsset] = allAssets.splice(sourceMapIndex, 1)[0];\n Log.log(chalk.gray(sourceMapFilePath), sizeStr(sourceMapAsset.contents));\n }\n }\n }\n });\n\n if (other.length) {\n Log.log('');\n const plural = other.length === 1 ? '' : 's';\n Log.log(chalk.bold`Exporting ${other.length} file${plural}:`);\n\n for (const [filePath, asset] of other.sort((a, b) => a[0].localeCompare(b[0]))) {\n Log.log(filePath, sizeStr(asset.contents));\n }\n }\n\n // Decouple logging from writing for better performance.\n\n await Promise.all(\n [...files.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(async ([file, { contents, targetDomain }]) => {\n // NOTE: Only use `targetDomain` if we have at least one server asset\n const domain = (hasServerOutput && targetDomain) || '';\n const outputPath = path.join(outputDir, domain, file);\n await fs.promises.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.promises.writeFile(outputPath, contents);\n })\n );\n\n Log.log('');\n}\n\nfunction groupBy<T>(array: T[], key: (item: T) => string): Map<string, T[]> {\n const map = new Map<string, T[]>();\n array.forEach((item) => {\n const group = key(item);\n const list = map.get(group) ?? [];\n list.push(item);\n map.set(group, list);\n });\n return map;\n}\n\n// TODO: Move source map modification to the serializer\nexport function getFilesFromSerialAssets(\n resources: SerialAsset[],\n {\n includeSourceMaps,\n files = new Map(),\n platform,\n }: {\n includeSourceMaps: boolean;\n files?: ExportAssetMap;\n platform?: string;\n }\n) {\n resources.forEach((resource) => {\n files.set(resource.filename, {\n contents: resource.source,\n originFilename: resource.originFilename,\n targetDomain: platform === 'web' ? 'client' : undefined,\n });\n });\n\n return files;\n}\n\nexport function modifyBundlesWithSourceMaps(\n filename: string,\n source: string,\n includeSourceMaps: boolean\n): string {\n if (filename.endsWith('.js')) {\n // If the bundle ends with source map URLs then update them to point to the correct location.\n\n // TODO: baseUrl support\n const normalizedFilename = '/' + filename.replace(/^\\/+/, '');\n // Ref: https://developer.chrome.com/blog/sourcemaps/#sourceurl-and-displayname-in-action-eval-and-anonymous-functions\n //# sourceMappingURL=//localhost:8085/index.map?platform=web&dev=false&hot=false&lazy=true&minify=true&resolver.environment=client&transform.environment=client&serializer.output=static\n //# sourceURL=http://localhost:8085/index.bundle//&platform=web&dev=false&hot=false&lazy=true&minify=true&resolver.environment=client&transform.environment=client&serializer.output=static\n return source.replace(/^\\/\\/# (sourceMappingURL|sourceURL)=.*$/gm, (...props) => {\n if (includeSourceMaps) {\n // TODO: Drop sourceURL when the name is the same as the file output location.\n if (props[1] === 'sourceURL') {\n return `//# ${props[1]}=` + normalizedFilename;\n } else if (props[1] === 'sourceMappingURL') {\n const mapName = normalizedFilename + '.map';\n return `//# ${props[1]}=` + mapName;\n }\n }\n return '';\n });\n }\n return source;\n}\n"],"names":["persistMetroFilesAsync","getFilesFromSerialAssets","modifyBundlesWithSourceMaps","files","outputDir","fs","mkdirSync","path","join","recursive","size","assetEntries","routeEntries","remainingEntries","hasServerOutput","asset","entries","targetDomain","assetId","push","routeId","groups","groupBy","contentSize","contents","length","Buffer","byteLength","sizeStr","chalk","gray","prettyBytes","plural","Log","log","bold","assets","sort","a","b","id","assetGroups","localeCompare","totalAssets","reduce","sum","averageContentSize","filter","Boolean","bundles","Map","other","forEach","filepath","match","platform","has","set","get","allAssets","filePath","shift","sourceMapIndex","findIndex","fp","sourceMapFilePath","sourceMapAsset","splice","Promise","all","map","file","domain","outputPath","promises","mkdir","dirname","writeFile","array","key","item","group","list","resources","includeSourceMaps","resource","filename","source","originFilename","undefined","endsWith","normalizedFilename","replace","props","mapName"],"mappings":"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"}
@@ -24,7 +24,7 @@ async function exportWebAsync(projectRoot, options) {
24
24
  const { exp } = (0, _config).getConfig(projectRoot);
25
25
  const platformBundlers = (0, _platformBundlers).getPlatformBundlers(exp);
26
26
  // Create a bundler interface
27
- const bundler = new _webpackBundlerDevServer.WebpackBundlerDevServer(projectRoot, platformBundlers, false);
27
+ const bundler = new _webpackBundlerDevServer.WebpackBundlerDevServer(projectRoot, platformBundlers);
28
28
  // If the user set `web.bundler: 'metro'` then they should use `expo export` instead.
29
29
  if (!bundler.isTargetingWeb()) {
30
30
  throw new _errors.CommandError(_chalk.default`{bold expo export:web} can only be used with Webpack. Use {bold expo export} for other bundlers.`);