@expo/cli 0.15.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 (148) hide show
  1. package/build/bin/cli +10 -3
  2. package/build/bin/cli.map +1 -1
  3. package/build/src/api/user/actions.js +1 -1
  4. package/build/src/api/user/actions.js.map +1 -1
  5. package/build/src/export/createMetadataJson.js +2 -1
  6. package/build/src/export/createMetadataJson.js.map +1 -1
  7. package/build/src/export/embed/exportEmbedAsync.js +50 -3
  8. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  9. package/build/src/export/embed/xcodeCompilerLogger.js +97 -0
  10. package/build/src/export/embed/xcodeCompilerLogger.js.map +1 -0
  11. package/build/src/export/exportApp.js +90 -103
  12. package/build/src/export/exportApp.js.map +1 -1
  13. package/build/src/export/exportAssets.js +18 -23
  14. package/build/src/export/exportAssets.js.map +1 -1
  15. package/build/src/export/exportAsync.js +1 -1
  16. package/build/src/export/exportAsync.js.map +1 -1
  17. package/build/src/export/exportHermes.js +0 -90
  18. package/build/src/export/exportHermes.js.map +1 -1
  19. package/build/src/export/exportStaticAsync.js +137 -108
  20. package/build/src/export/exportStaticAsync.js.map +1 -1
  21. package/build/src/export/favicon.js +12 -4
  22. package/build/src/export/favicon.js.map +1 -1
  23. package/build/src/export/fork-bundleAsync.js +74 -49
  24. package/build/src/export/fork-bundleAsync.js.map +1 -1
  25. package/build/src/export/metroAssetLocalPath.js +1 -1
  26. package/build/src/export/metroAssetLocalPath.js.map +1 -1
  27. package/build/src/export/persistMetroAssets.js +28 -17
  28. package/build/src/export/persistMetroAssets.js.map +1 -1
  29. package/build/src/export/publicFolder.js +7 -0
  30. package/build/src/export/publicFolder.js.map +1 -1
  31. package/build/src/export/saveAssets.js +176 -12
  32. package/build/src/export/saveAssets.js.map +1 -1
  33. package/build/src/export/writeContents.js +8 -107
  34. package/build/src/export/writeContents.js.map +1 -1
  35. package/build/src/install/installAsync.js +29 -10
  36. package/build/src/install/installAsync.js.map +1 -1
  37. package/build/src/prebuild/prebuildAsync.js +9 -2
  38. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  39. package/build/src/run/hints.js +4 -0
  40. package/build/src/run/hints.js.map +1 -1
  41. package/build/src/run/index.js +101 -0
  42. package/build/src/run/index.js.map +1 -0
  43. package/build/src/start/doctor/dependencies/bundledNativeModules.js +2 -2
  44. package/build/src/start/doctor/dependencies/bundledNativeModules.js.map +1 -1
  45. package/build/src/start/doctor/dependencies/getVersionedPackages.js +10 -3
  46. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  47. package/build/src/start/doctor/dependencies/resolvePackages.js +66 -0
  48. package/build/src/start/doctor/dependencies/resolvePackages.js.map +1 -0
  49. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +2 -30
  50. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  51. package/build/src/start/interface/interactiveActions.js +24 -8
  52. package/build/src/start/interface/interactiveActions.js.map +1 -1
  53. package/build/src/start/server/getStaticRenderFunctions.js +8 -4
  54. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
  55. package/build/src/start/server/metro/MetroBundlerDevServer.js +39 -16
  56. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  57. package/build/src/start/server/metro/MetroTerminalReporter.js +6 -2
  58. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  59. package/build/src/start/server/metro/TerminalReporter.js +18 -1
  60. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  61. package/build/src/start/server/metro/bundleApiRoutes.js +3 -2
  62. package/build/src/start/server/metro/bundleApiRoutes.js.map +1 -1
  63. package/build/src/start/server/metro/createExpoMetroResolver.js +22 -5
  64. package/build/src/start/server/metro/createExpoMetroResolver.js.map +1 -1
  65. package/build/src/start/server/metro/createJResolver.js +5 -2
  66. package/build/src/start/server/metro/createJResolver.js.map +1 -1
  67. package/build/src/start/server/metro/createServerRouteMiddleware.js +2 -1
  68. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  69. package/build/src/start/server/metro/{inspector-proxy/device.js → debugging/InspectorDevice.js} +8 -38
  70. package/build/src/start/server/metro/debugging/InspectorDevice.js.map +1 -0
  71. package/build/src/start/server/metro/debugging/InspectorProxy.js +116 -0
  72. package/build/src/start/server/metro/debugging/InspectorProxy.js.map +1 -0
  73. package/build/src/start/server/metro/debugging/createDebugMiddleware.js +45 -0
  74. package/build/src/start/server/metro/debugging/createDebugMiddleware.js.map +1 -0
  75. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/NetworkResponse.js +3 -4
  76. package/build/src/start/server/metro/debugging/inspectorHandlers/NetworkResponse.js.map +1 -0
  77. package/build/src/start/server/metro/debugging/inspectorHandlers/PageReload.js.map +1 -0
  78. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerGetPossibleBreakpoints.js +2 -2
  79. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerGetPossibleBreakpoints.js.map +1 -0
  80. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerScriptParsed.js +3 -2
  81. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerScriptParsed.js.map +1 -0
  82. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeDebuggerSetBreakpointByUrl.js +3 -2
  83. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeDebuggerSetBreakpointByUrl.js.map +1 -0
  84. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeRuntimeCallFunctionOn.js +2 -2
  85. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeCallFunctionOn.js.map +1 -0
  86. package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/VscodeRuntimeGetProperties.js +5 -4
  87. package/build/src/start/server/metro/debugging/inspectorHandlers/VscodeRuntimeGetProperties.js.map +1 -0
  88. package/build/src/start/server/metro/debugging/inspectorHandlers/types.js.map +1 -0
  89. package/build/src/start/server/metro/debugging/inspectorHandlers/utils.js +20 -0
  90. package/build/src/start/server/metro/debugging/inspectorHandlers/utils.js.map +1 -0
  91. package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -1
  92. package/build/src/start/server/metro/instantiateMetro.js +8 -5
  93. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  94. package/build/src/start/server/metro/metroErrorInterface.js +3 -2
  95. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
  96. package/build/src/start/server/metro/router.js +1 -5
  97. package/build/src/start/server/metro/router.js.map +1 -1
  98. package/build/src/start/server/metro/runServer-fork.js +0 -19
  99. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  100. package/build/src/start/server/metro/serializeHtml.js +20 -4
  101. package/build/src/start/server/metro/serializeHtml.js.map +1 -1
  102. package/build/src/start/server/metro/withMetroMultiPlatform.js +48 -85
  103. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  104. package/build/src/start/server/middleware/ManifestMiddleware.js +12 -5
  105. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  106. package/build/src/start/server/middleware/inspector/JsInspector.js +22 -1
  107. package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -1
  108. package/build/src/start/server/middleware/metroOptions.js +62 -9
  109. package/build/src/start/server/middleware/metroOptions.js.map +1 -1
  110. package/build/src/start/server/type-generation/__typetests__/fixtures/basic.js.map +1 -1
  111. package/build/src/start/server/type-generation/__typetests__/route.test.js +11 -3
  112. package/build/src/start/server/type-generation/__typetests__/route.test.js.map +1 -1
  113. package/build/src/start/server/type-generation/routes.js +6 -4
  114. package/build/src/start/server/type-generation/routes.js.map +1 -1
  115. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js +1 -1
  116. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
  117. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  118. package/build/src/utils/codesigning.js +11 -1
  119. package/build/src/utils/codesigning.js.map +1 -1
  120. package/build/src/utils/env.js +7 -1
  121. package/build/src/utils/env.js.map +1 -1
  122. package/build/src/utils/tsconfig/loadTsConfigPaths.js +3 -11
  123. package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +1 -1
  124. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js +22 -12
  125. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +1 -1
  126. package/package.json +10 -10
  127. package/static/template/index.html +14 -95
  128. package/build/src/export/printBundleSizes.js +0 -101
  129. package/build/src/export/printBundleSizes.js.map +0 -1
  130. package/build/src/start/server/metro/inspector-proxy/device.js.map +0 -1
  131. package/build/src/start/server/metro/inspector-proxy/handlers/NetworkResponse.js.map +0 -1
  132. package/build/src/start/server/metro/inspector-proxy/handlers/PageReload.js.map +0 -1
  133. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerGetPossibleBreakpoints.js.map +0 -1
  134. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerScriptParsed.js.map +0 -1
  135. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeDebuggerSetBreakpointByUrl.js.map +0 -1
  136. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeRuntimeCallFunctionOn.js.map +0 -1
  137. package/build/src/start/server/metro/inspector-proxy/handlers/VscodeRuntimeGetProperties.js.map +0 -1
  138. package/build/src/start/server/metro/inspector-proxy/handlers/types.js.map +0 -1
  139. package/build/src/start/server/metro/inspector-proxy/handlers/utils.js +0 -11
  140. package/build/src/start/server/metro/inspector-proxy/handlers/utils.js.map +0 -1
  141. package/build/src/start/server/metro/inspector-proxy/index.js +0 -30
  142. package/build/src/start/server/metro/inspector-proxy/index.js.map +0 -1
  143. package/build/src/start/server/metro/inspector-proxy/proxy.js +0 -169
  144. package/build/src/start/server/metro/inspector-proxy/proxy.js.map +0 -1
  145. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js +0 -64
  146. package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js.map +0 -1
  147. /package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/PageReload.js +0 -0
  148. /package/build/src/start/server/metro/{inspector-proxy/handlers → debugging/inspectorHandlers}/types.js +0 -0
@@ -2,26 +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 _persistMetroAssets = require("./persistMetroAssets");
11
+ var _prettyBytes = _interopRequireDefault(require("pretty-bytes"));
12
+ var _log = require("../log");
8
13
  function _interopRequireDefault(obj) {
9
14
  return obj && obj.__esModule ? obj : {
10
15
  default: obj
11
16
  };
12
17
  }
13
- async function saveAssetsAsync({ assets , outputDir }) {
14
- const paths = {};
15
- const hashes = new Set();
16
- assets.forEach((asset)=>{
17
- asset.files.forEach((fp, index)=>{
18
- const hash = asset.fileHashes[index];
19
- if (hashes.has(hash)) return;
20
- hashes.add(hash);
21
- paths[fp] = _path.default.join(outputDir, "assets", hash);
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));
118
+ }
119
+ }
120
+ }
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
+ }
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
22
141
  });
142
+ await _fs.default.promises.writeFile(outputPath, contents);
143
+ }));
144
+ _log.Log.log("");
145
+ }
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);
23
154
  });
24
- await (0, _persistMetroAssets).copyInBatchesAsync(paths);
155
+ return map;
156
+ }
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
163
+ });
164
+ });
165
+ return files;
166
+ }
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
+ });
187
+ }
188
+ return source;
25
189
  }
26
190
 
27
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 { copyInBatchesAsync } from './persistMetroAssets';\n\nexport type ManifestAsset = { fileHashes: string[]; files: string[]; hash: string };\n\nexport type Asset = ManifestAsset | BundleAssetWithFileHashes;\n\nexport async function saveAssetsAsync({\n assets,\n outputDir,\n}: {\n assets: Asset[];\n outputDir: string;\n}) {\n const paths: Record<string, string> = {};\n const hashes = new Set<string>();\n assets.forEach((asset) => {\n asset.files.forEach((fp: string, index: number) => {\n const hash = asset.fileHashes[index];\n if (hashes.has(hash)) return;\n hashes.add(hash);\n paths[fp] = path.join(outputDir, 'assets', hash);\n });\n });\n\n await copyInBatchesAsync(paths);\n}\n"],"names":["saveAssetsAsync","assets","outputDir","paths","hashes","Set","forEach","asset","files","fp","index","hash","fileHashes","has","add","path","join","copyInBatchesAsync"],"mappings":"AAAA;;;;QASsBA,eAAe,GAAfA,eAAe;AATpB,IAAA,KAAM,kCAAN,MAAM,EAAA;AAGY,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;;;;;;AAMlD,eAAeA,eAAe,CAAC,EACpCC,MAAM,CAAA,EACNC,SAAS,CAAA,EAIV,EAAE;IACD,MAAMC,KAAK,GAA2B,EAAE,AAAC;IACzC,MAAMC,MAAM,GAAG,IAAIC,GAAG,EAAU,AAAC;IACjCJ,MAAM,CAACK,OAAO,CAAC,CAACC,KAAK,GAAK;QACxBA,KAAK,CAACC,KAAK,CAACF,OAAO,CAAC,CAACG,EAAU,EAAEC,KAAa,GAAK;YACjD,MAAMC,IAAI,GAAGJ,KAAK,CAACK,UAAU,CAACF,KAAK,CAAC,AAAC;YACrC,IAAIN,MAAM,CAACS,GAAG,CAACF,IAAI,CAAC,EAAE,OAAO;YAC7BP,MAAM,CAACU,GAAG,CAACH,IAAI,CAAC,CAAC;YACjBR,KAAK,CAACM,EAAE,CAAC,GAAGM,KAAI,QAAA,CAACC,IAAI,CAACd,SAAS,EAAE,QAAQ,EAAES,IAAI,CAAC,CAAC;SAClD,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,MAAMM,CAAAA,GAAAA,mBAAkB,AAAO,CAAA,mBAAP,CAACd,KAAK,CAAC,CAAC;CACjC"}
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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"}
@@ -2,124 +2,25 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- exports.writeBundlesAsync = writeBundlesAsync;
6
- exports.writeSourceMapsAsync = writeSourceMapsAsync;
7
- exports.writeMetadataJsonAsync = writeMetadataJsonAsync;
8
- exports.writeAssetMapAsync = writeAssetMapAsync;
9
- exports.writeDebugHtmlAsync = writeDebugHtmlAsync;
10
- var _crypto = _interopRequireDefault(require("crypto"));
11
- var _promises = _interopRequireDefault(require("fs/promises"));
12
- var _path = _interopRequireDefault(require("path"));
13
- var _createMetadataJson = require("./createMetadataJson");
14
- function _interopRequireDefault(obj) {
15
- return obj && obj.__esModule ? obj : {
16
- default: obj
17
- };
18
- }
19
- const debug = require("debug")("expo:export:write");
20
- /**
21
- * @param props.platform native platform for the bundle
22
- * @param props.format extension to use for the name
23
- * @param props.hash crypto hash for the bundle contents
24
- * @returns filename for the JS bundle.
25
- */ function createBundleFileName({ platform , format , hash }) {
26
- return `${platform}-${hash}.${format === "javascript" ? "js" : "hbc"}`;
27
- }
28
- /**
29
- * @param bundle JS bundle as a string
30
- * @returns crypto hash for the provided bundle
31
- */ function createBundleHash(bundle) {
32
- return _crypto.default.createHash("md5").update(bundle).digest("hex");
33
- }
34
- async function writeBundlesAsync({ bundles , outputDir , useServerRendering }) {
35
- const hashes = {};
36
- const fileNames = {};
37
- for (const [platform, bundleOutput] of Object.entries(bundles)){
38
- // TODO: Move native to use the newer `_expo/...` bundle writing system.
39
- if (platform === "web" && useServerRendering) {
40
- continue;
41
- }
42
- var _hermesBytecodeBundle;
43
- const bundle = (_hermesBytecodeBundle = bundleOutput.hermesBytecodeBundle) != null ? _hermesBytecodeBundle : bundleOutput.code;
44
- const hash = createBundleHash(bundle);
45
- const fileName = createBundleFileName({
46
- platform,
47
- format: bundleOutput.hermesBytecodeBundle ? "bytecode" : "javascript",
48
- hash
49
- });
50
- hashes[platform] = hash;
51
- fileNames[platform] = fileName;
52
- await _promises.default.writeFile(_path.default.join(outputDir, fileName), bundle);
53
- }
54
- return {
55
- hashes,
56
- fileNames
57
- };
58
- }
59
- async function writeSourceMapsAsync({ bundles , hashes , fileNames , outputDir }) {
60
- return (await Promise.all(Object.entries(bundles).map(async ([platform, bundle])=>{
61
- if (!bundle) return null;
62
- var _hermesSourcemap;
63
- const sourceMap = (_hermesSourcemap = bundle.hermesSourcemap) != null ? _hermesSourcemap : bundle.map;
64
- if (!sourceMap) {
65
- debug(`Skip writing sourcemap (platform: ${platform})`);
66
- return null;
67
- }
68
- var _hermesBytecodeBundle, ref;
69
- const hash = (ref = hashes == null ? void 0 : hashes[platform]) != null ? ref : createBundleHash((_hermesBytecodeBundle = bundle.hermesBytecodeBundle) != null ? _hermesBytecodeBundle : bundle.code);
70
- const mapName = `${platform}-${hash}.map`;
71
- await _promises.default.writeFile(_path.default.join(outputDir, mapName), sourceMap);
72
- var ref1;
73
- const jsBundleFileName = (ref1 = fileNames == null ? void 0 : fileNames[platform]) != null ? ref1 : createBundleFileName({
74
- platform,
75
- format: bundle.hermesBytecodeBundle ? "bytecode" : "javascript",
76
- hash
77
- });
78
- const jsPath = _path.default.join(outputDir, jsBundleFileName);
79
- // Add correct mapping to sourcemap paths
80
- const mappingComment = `\n//# sourceMappingURL=${mapName}`;
81
- await _promises.default.appendFile(jsPath, mappingComment);
82
- return {
83
- platform,
84
- fileName: mapName,
85
- hash,
86
- map: sourceMap,
87
- comment: mappingComment
88
- };
89
- }))).filter(Boolean);
90
- }
91
- async function writeMetadataJsonAsync({ outputDir , bundles , fileNames , embeddedHashSet }) {
92
- const contents = (0, _createMetadataJson).createMetadataJson({
93
- bundles,
94
- fileNames,
95
- embeddedHashSet
96
- });
97
- const metadataPath = _path.default.join(outputDir, "metadata.json");
98
- debug(`Writing metadata.json to ${metadataPath}`);
99
- await _promises.default.writeFile(metadataPath, JSON.stringify(contents));
100
- return contents;
101
- }
102
- async function writeAssetMapAsync({ outputDir , assets }) {
5
+ exports.createAssetMap = createAssetMap;
6
+ exports.createSourceMapDebugHtml = createSourceMapDebugHtml;
7
+ function createAssetMap({ assets }) {
103
8
  // Convert the assets array to a k/v pair where the asset hash is the key and the asset is the value.
104
- const contents = Object.fromEntries(assets.map((asset)=>[
9
+ return Object.fromEntries(assets.map((asset)=>[
105
10
  asset.hash,
106
11
  asset
107
12
  ]
108
13
  ));
109
- await _promises.default.writeFile(_path.default.join(outputDir, "assetmap.json"), JSON.stringify(contents));
110
- return contents;
111
14
  }
112
- async function writeDebugHtmlAsync({ outputDir , fileNames }) {
15
+ function createSourceMapDebugHtml({ fileNames }) {
113
16
  // Make a debug html so user can debug their bundles
114
- const contents = `
115
- ${Object.values(fileNames).filter((value)=>value != null
116
- ).map((fileName)=>`<script src="${_path.default.join("bundles", fileName)}"></script>`
17
+ return `
18
+ ${fileNames.filter((value)=>value != null
19
+ ).map((fileName)=>`<script src="${fileName}"></script>`
117
20
  ).join("\n ")}
118
21
  Open up this file in Chrome. In the JavaScript developer console, navigate to the Source tab.
119
22
  You can see a red colored folder containing the original source code from your bundle.
120
23
  `;
121
- await _promises.default.writeFile(_path.default.join(outputDir, "debug.html"), contents);
122
- return contents;
123
24
  }
124
25
 
125
26
  //# sourceMappingURL=writeContents.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/export/writeContents.ts"],"sourcesContent":["import { Platform } from '@expo/config';\nimport crypto from 'crypto';\nimport fs from 'fs/promises';\nimport path from 'path';\n\nimport { createMetadataJson } from './createMetadataJson';\nimport { BundleOutput } from './fork-bundleAsync';\nimport { Asset } from './saveAssets';\n\nconst debug = require('debug')('expo:export:write') as typeof console.log;\n\n/**\n * @param props.platform native platform for the bundle\n * @param props.format extension to use for the name\n * @param props.hash crypto hash for the bundle contents\n * @returns filename for the JS bundle.\n */\nfunction createBundleFileName({\n platform,\n format,\n hash,\n}: {\n platform: string;\n format: 'javascript' | 'bytecode';\n hash: string;\n}): string {\n return `${platform}-${hash}.${format === 'javascript' ? 'js' : 'hbc'}`;\n}\n\n/**\n * @param bundle JS bundle as a string\n * @returns crypto hash for the provided bundle\n */\nfunction createBundleHash(bundle: string | Uint8Array): string {\n return crypto.createHash('md5').update(bundle).digest('hex');\n}\n\nexport async function writeBundlesAsync({\n bundles,\n outputDir,\n useServerRendering,\n}: {\n bundles: Partial<Record<Platform, Pick<BundleOutput, 'hermesBytecodeBundle' | 'code'>>>;\n outputDir: string;\n useServerRendering?: boolean;\n}) {\n const hashes: Partial<Record<Platform, string>> = {};\n const fileNames: Partial<Record<Platform, string>> = {};\n\n for (const [platform, bundleOutput] of Object.entries(bundles) as [\n Platform,\n Pick<BundleOutput, 'hermesBytecodeBundle' | 'code'>,\n ][]) {\n // TODO: Move native to use the newer `_expo/...` bundle writing system.\n if (platform === 'web' && useServerRendering) {\n continue;\n }\n const bundle = bundleOutput.hermesBytecodeBundle ?? bundleOutput.code;\n const hash = createBundleHash(bundle);\n const fileName = createBundleFileName({\n platform,\n format: bundleOutput.hermesBytecodeBundle ? 'bytecode' : 'javascript',\n hash,\n });\n\n hashes[platform] = hash;\n fileNames[platform] = fileName;\n await fs.writeFile(path.join(outputDir, fileName), bundle);\n }\n\n return { hashes, fileNames };\n}\n\ntype SourceMapWriteResult = {\n platform: string;\n fileName: string;\n hash: string;\n map: string;\n comment: string;\n};\n\nexport async function writeSourceMapsAsync({\n bundles,\n hashes,\n fileNames,\n outputDir,\n}: {\n bundles: Partial<\n Record<string, Pick<BundleOutput, 'hermesSourcemap' | 'map' | 'hermesBytecodeBundle' | 'code'>>\n >;\n hashes?: Record<string, string | undefined>;\n fileNames?: Record<string, string | undefined>;\n outputDir: string;\n}): Promise<SourceMapWriteResult[]> {\n return (\n await Promise.all(\n Object.entries(bundles).map(async ([platform, bundle]) => {\n if (!bundle) return null;\n const sourceMap = bundle.hermesSourcemap ?? bundle.map;\n if (!sourceMap) {\n debug(`Skip writing sourcemap (platform: ${platform})`);\n return null;\n }\n\n const hash =\n hashes?.[platform] ?? createBundleHash(bundle.hermesBytecodeBundle ?? bundle.code!);\n const mapName = `${platform}-${hash}.map`;\n await fs.writeFile(path.join(outputDir, mapName), sourceMap);\n\n const jsBundleFileName =\n fileNames?.[platform] ??\n createBundleFileName({\n platform,\n format: bundle.hermesBytecodeBundle ? 'bytecode' : 'javascript',\n hash,\n });\n const jsPath = path.join(outputDir, jsBundleFileName);\n\n // Add correct mapping to sourcemap paths\n const mappingComment = `\\n//# sourceMappingURL=${mapName}`;\n await fs.appendFile(jsPath, mappingComment);\n return {\n platform,\n fileName: mapName,\n hash,\n map: sourceMap,\n comment: mappingComment,\n };\n })\n )\n ).filter(Boolean) as SourceMapWriteResult[];\n}\n\nexport async function writeMetadataJsonAsync({\n outputDir,\n bundles,\n fileNames,\n embeddedHashSet,\n}: {\n outputDir: string;\n bundles: Record<string, Pick<BundleOutput, 'assets'> | undefined>;\n fileNames: Record<string, string | undefined>;\n embeddedHashSet?: Set<string>;\n}) {\n const contents = createMetadataJson({\n bundles,\n fileNames,\n embeddedHashSet,\n });\n const metadataPath = path.join(outputDir, 'metadata.json');\n debug(`Writing metadata.json to ${metadataPath}`);\n await fs.writeFile(metadataPath, JSON.stringify(contents));\n return contents;\n}\n\nexport async function writeAssetMapAsync({\n outputDir,\n assets,\n}: {\n outputDir: string;\n assets: Asset[];\n}) {\n // Convert the assets array to a k/v pair where the asset hash is the key and the asset is the value.\n const contents = Object.fromEntries(assets.map((asset) => [asset.hash, asset]));\n await fs.writeFile(path.join(outputDir, 'assetmap.json'), JSON.stringify(contents));\n return contents;\n}\n\nexport async function writeDebugHtmlAsync({\n outputDir,\n fileNames,\n}: {\n outputDir: string;\n fileNames: Record<string, string | undefined>;\n}) {\n // Make a debug html so user can debug their bundles\n const contents = `\n ${Object.values(fileNames)\n .filter((value) => value != null)\n .map((fileName) => `<script src=\"${path.join('bundles', fileName!)}\"></script>`)\n .join('\\n ')}\n Open up this file in Chrome. In the JavaScript developer console, navigate to the Source tab.\n You can see a red colored folder containing the original source code from your bundle.\n `;\n\n await fs.writeFile(path.join(outputDir, 'debug.html'), contents);\n return contents;\n}\n"],"names":["writeBundlesAsync","writeSourceMapsAsync","writeMetadataJsonAsync","writeAssetMapAsync","writeDebugHtmlAsync","debug","require","createBundleFileName","platform","format","hash","createBundleHash","bundle","crypto","createHash","update","digest","bundles","outputDir","useServerRendering","hashes","fileNames","bundleOutput","Object","entries","hermesBytecodeBundle","code","fileName","fs","writeFile","path","join","Promise","all","map","sourceMap","hermesSourcemap","mapName","jsBundleFileName","jsPath","mappingComment","appendFile","comment","filter","Boolean","embeddedHashSet","contents","createMetadataJson","metadataPath","JSON","stringify","assets","fromEntries","asset","values","value"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/export/writeContents.ts"],"sourcesContent":["import { Asset } from './saveAssets';\n\nexport function createAssetMap({ assets }: { assets: Asset[] }) {\n // Convert the assets array to a k/v pair where the asset hash is the key and the asset is the value.\n return Object.fromEntries(assets.map((asset) => [asset.hash, asset]));\n}\n\nexport function createSourceMapDebugHtml({ fileNames }: { fileNames: string[] }) {\n // Make a debug html so user can debug their bundles\n return `\n ${fileNames\n .filter((value) => value != null)\n .map((fileName) => `<script src=\"${fileName}\"></script>`)\n .join('\\n ')}\n Open up this file in Chrome. In the JavaScript developer console, navigate to the Source tab.\n You can see a red colored folder containing the original source code from your bundle.\n `;\n}\n"],"names":["createAssetMap","createSourceMapDebugHtml","assets","Object","fromEntries","map","asset","hash","fileNames","filter","value","fileName","join"],"mappings":"AAAA;;;;QAEgBA,cAAc,GAAdA,cAAc;QAKdC,wBAAwB,GAAxBA,wBAAwB;AALjC,SAASD,cAAc,CAAC,EAAEE,MAAM,CAAA,EAAuB,EAAE;IAC9D,qGAAqG;IACrG,OAAOC,MAAM,CAACC,WAAW,CAACF,MAAM,CAACG,GAAG,CAAC,CAACC,KAAK,GAAK;YAACA,KAAK,CAACC,IAAI;YAAED,KAAK;SAAC;IAAA,CAAC,CAAC,CAAC;CACvE;AAEM,SAASL,wBAAwB,CAAC,EAAEO,SAAS,CAAA,EAA2B,EAAE;IAC/E,oDAAoD;IACpD,OAAO,CAAC;MACJ,EAAEA,SAAS,CACRC,MAAM,CAAC,CAACC,KAAK,GAAKA,KAAK,IAAI,IAAI;IAAA,CAAC,CAChCL,GAAG,CAAC,CAACM,QAAQ,GAAK,CAAC,aAAa,EAAEA,QAAQ,CAAC,WAAW,CAAC;IAAA,CAAC,CACxDC,IAAI,CAAC,UAAU,CAAC,CAAC;;;MAGpB,CAAC,CAAC;CACP"}
@@ -12,6 +12,7 @@ var _checkPackages = require("./checkPackages");
12
12
  var _installExpoPackage = require("./installExpoPackage");
13
13
  var Log = _interopRequireWildcard(require("../log"));
14
14
  var _getVersionedPackages = require("../start/doctor/dependencies/getVersionedPackages");
15
+ var _errors = require("../utils/errors");
15
16
  var _findUp = require("../utils/findUp");
16
17
  var _link = require("../utils/link");
17
18
  var _nodeEnv = require("../utils/nodeEnv");
@@ -58,7 +59,15 @@ async function installAsync(packages, options, packageManagerArguments = []) {
58
59
  silent: options.silent,
59
60
  log: Log.log
60
61
  });
61
- if (options.check || options.fix) {
62
+ const expoVersion = findPackageByName(packages, "expo");
63
+ const otherPackages = packages.filter((pkg)=>pkg !== expoVersion
64
+ );
65
+ // Abort early when installing `expo@<version>` and other packages with `--fix/--check`
66
+ if (packageHasVersion(expoVersion) && otherPackages.length && (options.check || options.fix)) {
67
+ throw new _errors.CommandError("BAD_ARGS", `Cannot install other packages with ${expoVersion} and --fix or --check`);
68
+ }
69
+ // Only check/fix packages if `expo@<version>` is not requested
70
+ if (!packageHasVersion(expoVersion) && (options.check || options.fix)) {
62
71
  return await (0, _checkPackages).checkPackagesAsync(projectRoot, {
63
72
  packages,
64
73
  options,
@@ -74,13 +83,14 @@ async function installAsync(packages, options, packageManagerArguments = []) {
74
83
  });
75
84
  // Resolve the versioned packages, then install them.
76
85
  return installPackagesAsync(projectRoot, {
86
+ ...options,
77
87
  packageManager,
78
88
  packages,
79
89
  packageManagerArguments,
80
90
  sdkVersion: exp.sdkVersion
81
91
  });
82
92
  }
83
- async function installPackagesAsync(projectRoot, { packages , packageManager , sdkVersion , packageManagerArguments }) {
93
+ async function installPackagesAsync(projectRoot, { packages , packageManager , sdkVersion , packageManagerArguments , fix , check }) {
84
94
  // Read the project Expo config without plugins.
85
95
  const { pkg: pkg1 } = (0, _config).getConfig(projectRoot, {
86
96
  // Sometimes users will add a plugin to the config before installing the library,
@@ -109,20 +119,22 @@ async function installPackagesAsync(projectRoot, { packages , packageManager , s
109
119
  ))} because ${specifiedExactVersion.length > 1 ? "these versions" : "this version"} was explicitly provided. Packages excluded from dependency validation should be listed in {bold expo.install.exclude} in package.json. ${(0, _link).learnMore("https://expo.dev/more/expo-cli/#configuring-dependency-validation")}`);
110
120
  }
111
121
  }
112
- // if updating expo package, install this first, then re-run the command minus expo to install everything else
113
- if (packages.find((pkg)=>pkg === "expo"
114
- )) {
115
- const packagesMinusExpo = packages.filter((pkg)=>pkg !== "expo"
122
+ // `expo` needs to be installed before installing other packages
123
+ const expoPackage = findPackageByName(packages, "expo");
124
+ if (expoPackage) {
125
+ const postInstallCommand = packages.filter((pkg)=>pkg !== expoPackage
116
126
  );
117
- await (0, _installExpoPackage).installExpoPackageAsync(projectRoot, {
127
+ // Pipe options to the next command
128
+ if (fix) postInstallCommand.push("--fix");
129
+ if (check) postInstallCommand.push("--check");
130
+ // Abort after installing `expo`, follow up command is spawn in a new process
131
+ return await (0, _installExpoPackage).installExpoPackageAsync(projectRoot, {
118
132
  packageManager,
119
133
  packageManagerArguments,
120
134
  expoPackageToInstall: versioning.packages.find((pkg)=>pkg.startsWith("expo@")
121
135
  ),
122
- followUpCommandArgs: packagesMinusExpo
136
+ followUpCommandArgs: postInstallCommand
123
137
  });
124
- // follow-up commands will be spawned in a detached process, so return immediately
125
- return;
126
138
  }
127
139
  await packageManager.addAsync([
128
140
  ...packageManagerArguments,
@@ -130,5 +142,12 @@ async function installPackagesAsync(projectRoot, { packages , packageManager , s
130
142
  ]);
131
143
  await (0, _applyPlugins).applyPluginsAsync(projectRoot, versioning.packages);
132
144
  }
145
+ /** Find a package, by name, in the requested packages list (`expo` -> `expo`/`expo@<version>`) */ function findPackageByName(packages, name) {
146
+ return packages.find((pkg)=>pkg === name || pkg.startsWith(`${name}@`)
147
+ );
148
+ }
149
+ /** Determine if a specific version is requested for a package */ function packageHasVersion(name = "") {
150
+ return name.includes("@");
151
+ }
133
152
 
134
153
  //# sourceMappingURL=installAsync.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/install/installAsync.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport * as PackageManager from '@expo/package-manager';\nimport chalk from 'chalk';\n\nimport { applyPluginsAsync } from './applyPlugins';\nimport { checkPackagesAsync } from './checkPackages';\nimport { installExpoPackageAsync } from './installExpoPackage';\nimport { Options } from './resolveOptions';\nimport * as Log from '../log';\nimport { getVersionedPackagesAsync } from '../start/doctor/dependencies/getVersionedPackages';\nimport { findUpProjectRootOrAssert } from '../utils/findUp';\nimport { learnMore } from '../utils/link';\nimport { setNodeEnv } from '../utils/nodeEnv';\nimport { joinWithCommasAnd } from '../utils/strings';\n\n/**\n * Installs versions of specified packages compatible with the current Expo SDK version, or\n * checks/ fixes dependencies in project if they don't match compatible versions specified in bundledNativeModules or versions endpoints.\n *\n * @param packages list of packages to install, if installing specific packages and not checking/ fixing\n * @param options options, including check or fix\n * @param packageManagerArguments arguments to forward to the package manager invoked while installing\n * @returns Promise<void>\n */\nexport async function installAsync(\n packages: string[],\n options: Options & { projectRoot?: string },\n packageManagerArguments: string[] = []\n) {\n setNodeEnv('development');\n // Locate the project root based on the process current working directory.\n // This enables users to run `npx expo install` from a subdirectory of the project.\n const projectRoot = options.projectRoot ?? findUpProjectRootOrAssert(process.cwd());\n require('@expo/env').load(projectRoot);\n\n // Resolve the package manager used by the project, or based on the provided arguments.\n const packageManager = PackageManager.createForProject(projectRoot, {\n npm: options.npm,\n yarn: options.yarn,\n bun: options.bun,\n pnpm: options.pnpm,\n silent: options.silent,\n log: Log.log,\n });\n\n if (options.check || options.fix) {\n return await checkPackagesAsync(projectRoot, {\n packages,\n options,\n packageManager,\n packageManagerArguments,\n });\n }\n\n // Read the project Expo config without plugins.\n const { exp } = getConfig(projectRoot, {\n // Sometimes users will add a plugin to the config before installing the library,\n // this wouldn't work unless we dangerously disable plugin serialization.\n skipPlugins: true,\n });\n\n // Resolve the versioned packages, then install them.\n return installPackagesAsync(projectRoot, {\n packageManager,\n packages,\n packageManagerArguments,\n sdkVersion: exp.sdkVersion!,\n });\n}\n\n/** Version packages and install in a project. */\nexport async function installPackagesAsync(\n projectRoot: string,\n {\n packages,\n packageManager,\n sdkVersion,\n packageManagerArguments,\n }: {\n /**\n * List of packages to version, grouped by the type of dependency.\n * @example ['uuid', 'react-native-reanimated@latest']\n */\n packages: string[];\n /** Package manager to use when installing the versioned packages. */\n packageManager: PackageManager.NodePackageManager;\n /**\n * SDK to version `packages` for.\n * @example '44.0.0'\n */\n sdkVersion: string;\n /**\n * Extra parameters to pass to the `packageManager` when installing versioned packages.\n * @example ['--no-save']\n */\n packageManagerArguments: string[];\n }\n): Promise<void> {\n // Read the project Expo config without plugins.\n const { pkg } = getConfig(projectRoot, {\n // Sometimes users will add a plugin to the config before installing the library,\n // this wouldn't work unless we dangerously disable plugin serialization.\n skipPlugins: true,\n });\n\n //assertNotInstallingExcludedPackages(projectRoot, packages, pkg);\n\n const versioning = await getVersionedPackagesAsync(projectRoot, {\n packages,\n // sdkVersion is always defined because we don't skipSDKVersionRequirement in getConfig.\n sdkVersion,\n pkg,\n });\n\n Log.log(\n chalk`\\u203A Installing ${\n versioning.messages.length ? versioning.messages.join(' and ') + ' ' : ''\n }using {bold ${packageManager.name}}`\n );\n\n if (versioning.excludedNativeModules.length) {\n const alreadyExcluded = versioning.excludedNativeModules.filter(\n (module) => module.isExcludedFromValidation\n );\n const specifiedExactVersion = versioning.excludedNativeModules.filter(\n (module) => !module.isExcludedFromValidation\n );\n\n if (alreadyExcluded.length) {\n Log.log(\n chalk`\\u203A Using ${joinWithCommasAnd(\n alreadyExcluded.map(\n ({ bundledNativeVersion, name, specifiedVersion }) =>\n `${specifiedVersion || 'latest'} instead of ${bundledNativeVersion} for ${name}`\n )\n )} because ${\n alreadyExcluded.length > 1 ? 'they are' : 'it is'\n } listed in {bold expo.install.exclude} in package.json. ${learnMore(\n 'https://expo.dev/more/expo-cli/#configuring-dependency-validation'\n )}`\n );\n }\n\n if (specifiedExactVersion.length) {\n Log.log(\n chalk`\\u203A Using ${joinWithCommasAnd(\n specifiedExactVersion.map(\n ({ bundledNativeVersion, name, specifiedVersion }) =>\n `${specifiedVersion} instead of ${bundledNativeVersion} for ${name}`\n )\n )} because ${\n specifiedExactVersion.length > 1 ? 'these versions' : 'this version'\n } was explicitly provided. Packages excluded from dependency validation should be listed in {bold expo.install.exclude} in package.json. ${learnMore(\n 'https://expo.dev/more/expo-cli/#configuring-dependency-validation'\n )}`\n );\n }\n }\n\n // if updating expo package, install this first, then re-run the command minus expo to install everything else\n if (packages.find((pkg) => pkg === 'expo')) {\n const packagesMinusExpo = packages.filter((pkg) => pkg !== 'expo');\n\n await installExpoPackageAsync(projectRoot, {\n packageManager,\n packageManagerArguments,\n expoPackageToInstall: versioning.packages.find((pkg) => pkg.startsWith('expo@'))!,\n followUpCommandArgs: packagesMinusExpo,\n });\n\n // follow-up commands will be spawned in a detached process, so return immediately\n return;\n }\n\n await packageManager.addAsync([...packageManagerArguments, ...versioning.packages]);\n\n await applyPluginsAsync(projectRoot, versioning.packages);\n}\n"],"names":["installAsync","installPackagesAsync","PackageManager","Log","packages","options","packageManagerArguments","setNodeEnv","projectRoot","findUpProjectRootOrAssert","process","cwd","require","load","packageManager","createForProject","npm","yarn","bun","pnpm","silent","log","check","fix","checkPackagesAsync","exp","getConfig","skipPlugins","sdkVersion","pkg","versioning","getVersionedPackagesAsync","chalk","messages","length","join","name","excludedNativeModules","alreadyExcluded","filter","module","isExcludedFromValidation","specifiedExactVersion","joinWithCommasAnd","map","bundledNativeVersion","specifiedVersion","learnMore","find","packagesMinusExpo","installExpoPackageAsync","expoPackageToInstall","startsWith","followUpCommandArgs","addAsync","applyPluginsAsync"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/install/installAsync.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport * as PackageManager from '@expo/package-manager';\nimport chalk from 'chalk';\n\nimport { applyPluginsAsync } from './applyPlugins';\nimport { checkPackagesAsync } from './checkPackages';\nimport { installExpoPackageAsync } from './installExpoPackage';\nimport { Options } from './resolveOptions';\nimport * as Log from '../log';\nimport { getVersionedPackagesAsync } from '../start/doctor/dependencies/getVersionedPackages';\nimport { CommandError } from '../utils/errors';\nimport { findUpProjectRootOrAssert } from '../utils/findUp';\nimport { learnMore } from '../utils/link';\nimport { setNodeEnv } from '../utils/nodeEnv';\nimport { joinWithCommasAnd } from '../utils/strings';\n\n/**\n * Installs versions of specified packages compatible with the current Expo SDK version, or\n * checks/ fixes dependencies in project if they don't match compatible versions specified in bundledNativeModules or versions endpoints.\n *\n * @param packages list of packages to install, if installing specific packages and not checking/ fixing\n * @param options options, including check or fix\n * @param packageManagerArguments arguments to forward to the package manager invoked while installing\n * @returns Promise<void>\n */\nexport async function installAsync(\n packages: string[],\n options: Options & { projectRoot?: string },\n packageManagerArguments: string[] = []\n) {\n setNodeEnv('development');\n // Locate the project root based on the process current working directory.\n // This enables users to run `npx expo install` from a subdirectory of the project.\n const projectRoot = options.projectRoot ?? findUpProjectRootOrAssert(process.cwd());\n require('@expo/env').load(projectRoot);\n\n // Resolve the package manager used by the project, or based on the provided arguments.\n const packageManager = PackageManager.createForProject(projectRoot, {\n npm: options.npm,\n yarn: options.yarn,\n bun: options.bun,\n pnpm: options.pnpm,\n silent: options.silent,\n log: Log.log,\n });\n\n const expoVersion = findPackageByName(packages, 'expo');\n const otherPackages = packages.filter((pkg) => pkg !== expoVersion);\n\n // Abort early when installing `expo@<version>` and other packages with `--fix/--check`\n if (packageHasVersion(expoVersion) && otherPackages.length && (options.check || options.fix)) {\n throw new CommandError(\n 'BAD_ARGS',\n `Cannot install other packages with ${expoVersion} and --fix or --check`\n );\n }\n\n // Only check/fix packages if `expo@<version>` is not requested\n if (!packageHasVersion(expoVersion) && (options.check || options.fix)) {\n return await checkPackagesAsync(projectRoot, {\n packages,\n options,\n packageManager,\n packageManagerArguments,\n });\n }\n\n // Read the project Expo config without plugins.\n const { exp } = getConfig(projectRoot, {\n // Sometimes users will add a plugin to the config before installing the library,\n // this wouldn't work unless we dangerously disable plugin serialization.\n skipPlugins: true,\n });\n\n // Resolve the versioned packages, then install them.\n return installPackagesAsync(projectRoot, {\n ...options,\n packageManager,\n packages,\n packageManagerArguments,\n sdkVersion: exp.sdkVersion!,\n });\n}\n\n/** Version packages and install in a project. */\nexport async function installPackagesAsync(\n projectRoot: string,\n {\n packages,\n packageManager,\n sdkVersion,\n packageManagerArguments,\n fix,\n check,\n }: Options & {\n /**\n * List of packages to version, grouped by the type of dependency.\n * @example ['uuid', 'react-native-reanimated@latest']\n */\n packages: string[];\n /** Package manager to use when installing the versioned packages. */\n packageManager: PackageManager.NodePackageManager;\n /**\n * SDK to version `packages` for.\n * @example '44.0.0'\n */\n sdkVersion: string;\n /**\n * Extra parameters to pass to the `packageManager` when installing versioned packages.\n * @example ['--no-save']\n */\n packageManagerArguments: string[];\n }\n): Promise<void> {\n // Read the project Expo config without plugins.\n const { pkg } = getConfig(projectRoot, {\n // Sometimes users will add a plugin to the config before installing the library,\n // this wouldn't work unless we dangerously disable plugin serialization.\n skipPlugins: true,\n });\n\n //assertNotInstallingExcludedPackages(projectRoot, packages, pkg);\n\n const versioning = await getVersionedPackagesAsync(projectRoot, {\n packages,\n // sdkVersion is always defined because we don't skipSDKVersionRequirement in getConfig.\n sdkVersion,\n pkg,\n });\n\n Log.log(\n chalk`\\u203A Installing ${\n versioning.messages.length ? versioning.messages.join(' and ') + ' ' : ''\n }using {bold ${packageManager.name}}`\n );\n\n if (versioning.excludedNativeModules.length) {\n const alreadyExcluded = versioning.excludedNativeModules.filter(\n (module) => module.isExcludedFromValidation\n );\n const specifiedExactVersion = versioning.excludedNativeModules.filter(\n (module) => !module.isExcludedFromValidation\n );\n\n if (alreadyExcluded.length) {\n Log.log(\n chalk`\\u203A Using ${joinWithCommasAnd(\n alreadyExcluded.map(\n ({ bundledNativeVersion, name, specifiedVersion }) =>\n `${specifiedVersion || 'latest'} instead of ${bundledNativeVersion} for ${name}`\n )\n )} because ${\n alreadyExcluded.length > 1 ? 'they are' : 'it is'\n } listed in {bold expo.install.exclude} in package.json. ${learnMore(\n 'https://expo.dev/more/expo-cli/#configuring-dependency-validation'\n )}`\n );\n }\n\n if (specifiedExactVersion.length) {\n Log.log(\n chalk`\\u203A Using ${joinWithCommasAnd(\n specifiedExactVersion.map(\n ({ bundledNativeVersion, name, specifiedVersion }) =>\n `${specifiedVersion} instead of ${bundledNativeVersion} for ${name}`\n )\n )} because ${\n specifiedExactVersion.length > 1 ? 'these versions' : 'this version'\n } was explicitly provided. Packages excluded from dependency validation should be listed in {bold expo.install.exclude} in package.json. ${learnMore(\n 'https://expo.dev/more/expo-cli/#configuring-dependency-validation'\n )}`\n );\n }\n }\n\n // `expo` needs to be installed before installing other packages\n const expoPackage = findPackageByName(packages, 'expo');\n if (expoPackage) {\n const postInstallCommand = packages.filter((pkg) => pkg !== expoPackage);\n\n // Pipe options to the next command\n if (fix) postInstallCommand.push('--fix');\n if (check) postInstallCommand.push('--check');\n\n // Abort after installing `expo`, follow up command is spawn in a new process\n return await installExpoPackageAsync(projectRoot, {\n packageManager,\n packageManagerArguments,\n expoPackageToInstall: versioning.packages.find((pkg) => pkg.startsWith('expo@'))!,\n followUpCommandArgs: postInstallCommand,\n });\n }\n\n await packageManager.addAsync([...packageManagerArguments, ...versioning.packages]);\n\n await applyPluginsAsync(projectRoot, versioning.packages);\n}\n\n/** Find a package, by name, in the requested packages list (`expo` -> `expo`/`expo@<version>`) */\nfunction findPackageByName(packages: string[], name: string) {\n return packages.find((pkg) => pkg === name || pkg.startsWith(`${name}@`));\n}\n\n/** Determine if a specific version is requested for a package */\nfunction packageHasVersion(name = '') {\n return name.includes('@');\n}\n"],"names":["installAsync","installPackagesAsync","PackageManager","Log","packages","options","packageManagerArguments","setNodeEnv","projectRoot","findUpProjectRootOrAssert","process","cwd","require","load","packageManager","createForProject","npm","yarn","bun","pnpm","silent","log","expoVersion","findPackageByName","otherPackages","filter","pkg","packageHasVersion","length","check","fix","CommandError","checkPackagesAsync","exp","getConfig","skipPlugins","sdkVersion","versioning","getVersionedPackagesAsync","chalk","messages","join","name","excludedNativeModules","alreadyExcluded","module","isExcludedFromValidation","specifiedExactVersion","joinWithCommasAnd","map","bundledNativeVersion","specifiedVersion","learnMore","expoPackage","postInstallCommand","push","installExpoPackageAsync","expoPackageToInstall","find","startsWith","followUpCommandArgs","addAsync","applyPluginsAsync","includes"],"mappings":"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"}
@@ -104,8 +104,15 @@ async function prebuildAsync(projectRoot, options) {
104
104
  }
105
105
  }
106
106
  }
107
- // Apply Expo config to native projects
108
- const configSyncingStep = (0, _ora).logNewSection("Running prebuild");
107
+ // Apply Expo config to native projects. Prevent log-spew from ora when running in debug mode.
108
+ const configSyncingStep = _env.env.EXPO_DEBUG ? {
109
+ succeed (text) {
110
+ _log.Log.log(text);
111
+ },
112
+ fail (text) {
113
+ _log.Log.error(text);
114
+ }
115
+ } : (0, _ora).logNewSection("Running prebuild");
109
116
  try {
110
117
  await (0, _profile).profile(_configureProjectAsync.configureProjectAsync)(projectRoot, {
111
118
  platforms: options.platforms,