@expo/cli 0.7.3 → 0.9.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 (200) hide show
  1. package/README.md +1 -1
  2. package/build/bin/cli +17 -3
  3. package/build/bin/cli.map +1 -1
  4. package/build/src/api/getExpoGoIntermediateCertificate.js +0 -2
  5. package/build/src/api/getExpoGoIntermediateCertificate.js.map +1 -1
  6. package/build/src/api/getProjectDevelopmentCertificate.js +0 -2
  7. package/build/src/api/getProjectDevelopmentCertificate.js.map +1 -1
  8. package/build/src/api/graphql/queries/AppQuery.js +39 -0
  9. package/build/src/api/graphql/queries/AppQuery.js.map +1 -0
  10. package/build/src/api/graphql/queries/UserQuery.js +10 -3
  11. package/build/src/api/graphql/queries/UserQuery.js.map +1 -1
  12. package/build/src/api/graphql/types/App.js +23 -0
  13. package/build/src/api/graphql/types/App.js.map +1 -0
  14. package/build/src/api/signManifest.js +0 -12
  15. package/build/src/api/signManifest.js.map +1 -1
  16. package/build/src/api/user/UserSettings.js.map +1 -1
  17. package/build/src/api/user/user.js.map +1 -1
  18. package/build/src/config/configAsync.js +3 -0
  19. package/build/src/config/configAsync.js.map +1 -1
  20. package/build/src/customize/customizeAsync.js +3 -0
  21. package/build/src/customize/customizeAsync.js.map +1 -1
  22. package/build/src/export/createBundles.js +8 -3
  23. package/build/src/export/createBundles.js.map +1 -1
  24. package/build/src/export/embed/exportEmbedAsync.js +23 -0
  25. package/build/src/export/embed/exportEmbedAsync.js.map +1 -0
  26. package/build/src/export/embed/index.js +117 -0
  27. package/build/src/export/embed/index.js.map +1 -0
  28. package/build/src/export/embed/resolveOptions.js +63 -0
  29. package/build/src/export/embed/resolveOptions.js.map +1 -0
  30. package/build/src/export/exportApp.js +58 -31
  31. package/build/src/export/exportApp.js.map +1 -1
  32. package/build/src/export/exportAssets.js +17 -0
  33. package/build/src/export/exportAssets.js.map +1 -1
  34. package/build/src/export/exportAsync.js +3 -0
  35. package/build/src/export/exportAsync.js.map +1 -1
  36. package/build/src/export/exportStaticAsync.js +179 -0
  37. package/build/src/export/exportStaticAsync.js.map +1 -0
  38. package/build/src/export/fork-bundleAsync.js +15 -43
  39. package/build/src/export/fork-bundleAsync.js.map +1 -1
  40. package/build/src/export/html.js +21 -0
  41. package/build/src/export/html.js.map +1 -0
  42. package/build/src/export/index.js +5 -1
  43. package/build/src/export/index.js.map +1 -1
  44. package/build/src/export/printBundleSizes.js +2 -2
  45. package/build/src/export/printBundleSizes.js.map +1 -1
  46. package/build/src/export/resolveOptions.js +1 -0
  47. package/build/src/export/resolveOptions.js.map +1 -1
  48. package/build/src/export/web/exportWebAsync.js +3 -0
  49. package/build/src/export/web/exportWebAsync.js.map +1 -1
  50. package/build/src/export/writeContents.js +5 -2
  51. package/build/src/export/writeContents.js.map +1 -1
  52. package/build/src/graphql/generated.js +462 -0
  53. package/build/src/graphql/generated.js.map +1 -0
  54. package/build/src/install/checkPackages.js +6 -0
  55. package/build/src/install/checkPackages.js.map +1 -1
  56. package/build/src/install/installAsync.js +18 -1
  57. package/build/src/install/installAsync.js.map +1 -1
  58. package/build/src/prebuild/clearNativeFolder.js +6 -1
  59. package/build/src/prebuild/clearNativeFolder.js.map +1 -1
  60. package/build/src/prebuild/copyTemplateFiles.js +3 -33
  61. package/build/src/prebuild/copyTemplateFiles.js.map +1 -1
  62. package/build/src/prebuild/ensureConfigAsync.js +1 -12
  63. package/build/src/prebuild/ensureConfigAsync.js.map +1 -1
  64. package/build/src/prebuild/prebuildAsync.js +7 -2
  65. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  66. package/build/src/prebuild/resolveOptions.js +7 -8
  67. package/build/src/prebuild/resolveOptions.js.map +1 -1
  68. package/build/src/prebuild/resolveTemplate.js +5 -0
  69. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  70. package/build/src/prebuild/updateFromTemplate.js +6 -8
  71. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  72. package/build/src/prebuild/updatePackageJson.js +33 -47
  73. package/build/src/prebuild/updatePackageJson.js.map +1 -1
  74. package/build/src/prebuild/validateTemplatePlatforms.js +48 -0
  75. package/build/src/prebuild/validateTemplatePlatforms.js.map +1 -0
  76. package/build/src/run/android/runAndroidAsync.js +4 -0
  77. package/build/src/run/android/runAndroidAsync.js.map +1 -1
  78. package/build/src/run/ios/appleDevice/AppleDevice.js +25 -19
  79. package/build/src/run/ios/appleDevice/AppleDevice.js.map +1 -1
  80. package/build/src/run/ios/appleDevice/client/InstallationProxyClient.js.map +1 -1
  81. package/build/src/run/ios/options/resolveNativeScheme.js +13 -4
  82. package/build/src/run/ios/options/resolveNativeScheme.js.map +1 -1
  83. package/build/src/run/ios/runIosAsync.js +3 -0
  84. package/build/src/run/ios/runIosAsync.js.map +1 -1
  85. package/build/src/run/startBundler.js +4 -0
  86. package/build/src/run/startBundler.js.map +1 -1
  87. package/build/src/start/doctor/Prerequisite.js.map +1 -1
  88. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js +12 -6
  89. package/build/src/start/doctor/dependencies/ensureDependenciesAsync.js.map +1 -1
  90. package/build/src/start/doctor/dependencies/getVersionedPackages.js +13 -2
  91. package/build/src/start/doctor/dependencies/getVersionedPackages.js.map +1 -1
  92. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js +12 -4
  93. package/build/src/start/doctor/dependencies/validateDependenciesVersions.js.map +1 -1
  94. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js +31 -5
  95. package/build/src/start/doctor/typescript/TypeScriptProjectPrerequisite.js.map +1 -1
  96. package/build/src/start/doctor/typescript/updateTSConfig.js +6 -0
  97. package/build/src/start/doctor/typescript/updateTSConfig.js.map +1 -1
  98. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js +1 -0
  99. package/build/src/start/doctor/web/WebSupportProjectPrerequisite.js.map +1 -1
  100. package/build/src/start/index.js +3 -1
  101. package/build/src/start/index.js.map +1 -1
  102. package/build/src/start/platforms/android/adb.js +1 -1
  103. package/build/src/start/platforms/android/adb.js.map +1 -1
  104. package/build/src/start/platforms/ios/AppleDeviceManager.js +1 -1
  105. package/build/src/start/platforms/ios/AppleDeviceManager.js.map +1 -1
  106. package/build/src/start/server/BundlerDevServer.js +16 -2
  107. package/build/src/start/server/BundlerDevServer.js.map +1 -1
  108. package/build/src/start/server/DevServerManager.js +33 -2
  109. package/build/src/start/server/DevServerManager.js.map +1 -1
  110. package/build/src/start/server/getStaticRenderFunctions.js +167 -0
  111. package/build/src/start/server/getStaticRenderFunctions.js.map +1 -0
  112. package/build/src/start/server/metro/MetroBundlerDevServer.js +262 -3
  113. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  114. package/build/src/start/server/metro/MetroTerminalReporter.js +2 -34
  115. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  116. package/build/src/start/server/metro/externals.js +72 -0
  117. package/build/src/start/server/metro/externals.js.map +1 -0
  118. package/build/src/start/server/metro/getCssModulesFromBundler.js +77 -0
  119. package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -0
  120. package/build/src/start/server/metro/inspector-proxy/index.js +2 -2
  121. package/build/src/start/server/metro/inspector-proxy/index.js.map +1 -1
  122. package/build/src/start/server/metro/inspector-proxy/proxy.js +1 -3
  123. package/build/src/start/server/metro/inspector-proxy/proxy.js.map +1 -1
  124. package/build/src/start/server/metro/instantiateMetro.js +47 -48
  125. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  126. package/build/src/start/server/metro/metroErrorInterface.js +137 -0
  127. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -0
  128. package/build/src/start/server/metro/metroWatchTypeScriptFiles.js +51 -0
  129. package/build/src/start/server/metro/metroWatchTypeScriptFiles.js.map +1 -0
  130. package/build/src/start/server/metro/resolveFromProject.js +26 -3
  131. package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
  132. package/build/src/start/server/metro/router.js +15 -2
  133. package/build/src/start/server/metro/router.js.map +1 -1
  134. package/build/src/start/server/metro/runServer-fork.js +107 -0
  135. package/build/src/start/server/metro/runServer-fork.js.map +1 -0
  136. package/build/src/start/server/metro/symbolicate.js +6 -0
  137. package/build/src/start/server/metro/symbolicate.js.map +1 -0
  138. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +70 -0
  139. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -0
  140. package/build/src/start/server/metro/withMetroMultiPlatform.js +188 -45
  141. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  142. package/build/src/start/server/middleware/ClassicManifestMiddleware.js +8 -1
  143. package/build/src/start/server/middleware/ClassicManifestMiddleware.js.map +1 -1
  144. package/build/src/start/server/middleware/CreateFileMiddleware.js +6 -3
  145. package/build/src/start/server/middleware/CreateFileMiddleware.js.map +1 -1
  146. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +113 -47
  147. package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
  148. package/build/src/start/server/middleware/ManifestMiddleware.js +59 -20
  149. package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
  150. package/build/src/start/server/type-generation/expo-env.js +27 -0
  151. package/build/src/start/server/type-generation/expo-env.js.map +1 -0
  152. package/build/src/start/server/type-generation/index.js +57 -0
  153. package/build/src/start/server/type-generation/index.js.map +1 -0
  154. package/build/src/start/server/type-generation/routes.js +291 -0
  155. package/build/src/start/server/type-generation/routes.js.map +1 -0
  156. package/build/src/start/server/type-generation/tsconfig.js +89 -0
  157. package/build/src/start/server/type-generation/tsconfig.js.map +1 -0
  158. package/build/src/start/server/webTemplate.js +20 -4
  159. package/build/src/start/server/webTemplate.js.map +1 -1
  160. package/build/src/start/server/webpack/WebpackBundlerDevServer.js +4 -6
  161. package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
  162. package/build/src/start/startAsync.js +30 -8
  163. package/build/src/start/startAsync.js.map +1 -1
  164. package/build/src/utils/FileNotifier.js +11 -4
  165. package/build/src/utils/FileNotifier.js.map +1 -1
  166. package/build/src/utils/analytics/getMetroProperties.js +1 -1
  167. package/build/src/utils/analytics/getMetroProperties.js.map +1 -1
  168. package/build/src/utils/analytics/rudderstackClient.js +2 -2
  169. package/build/src/utils/codesigning.js +31 -7
  170. package/build/src/utils/codesigning.js.map +1 -1
  171. package/build/src/utils/dir.js +16 -6
  172. package/build/src/utils/dir.js.map +1 -1
  173. package/build/src/utils/env.js +6 -0
  174. package/build/src/utils/env.js.map +1 -1
  175. package/build/src/utils/mergeGitIgnorePaths.js +42 -0
  176. package/build/src/utils/mergeGitIgnorePaths.js.map +1 -1
  177. package/build/src/utils/nodeEnv.js +11 -0
  178. package/build/src/utils/nodeEnv.js.map +1 -0
  179. package/build/src/utils/resolveArgs.js +43 -0
  180. package/build/src/utils/resolveArgs.js.map +1 -1
  181. package/build/src/utils/strings.js +24 -0
  182. package/build/src/utils/strings.js.map +1 -0
  183. package/build/src/utils/template.js +21 -0
  184. package/build/src/utils/template.js.map +1 -0
  185. package/build/src/utils/tsconfig/evaluateTsConfig.js +61 -0
  186. package/build/src/utils/tsconfig/evaluateTsConfig.js.map +1 -0
  187. package/build/src/utils/tsconfig/loadTsConfigPaths.js +69 -0
  188. package/build/src/utils/tsconfig/loadTsConfigPaths.js.map +1 -0
  189. package/build/src/utils/tsconfig/matchTsConfigPathAlias.js +88 -0
  190. package/build/src/utils/tsconfig/matchTsConfigPathAlias.js.map +1 -0
  191. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js +41 -0
  192. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +1 -0
  193. package/package.json +16 -10
  194. package/static/template/metro.config.js +4 -1
  195. package/build/src/api/getProject.js +0 -19
  196. package/build/src/api/getProject.js.map +0 -1
  197. package/build/src/api/graphql/generated.js +0 -113
  198. package/build/src/api/graphql/generated.js.map +0 -1
  199. package/build/src/prebuild/writeMetroConfig.js +0 -89
  200. package/build/src/prebuild/writeMetroConfig.js.map +0 -1
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.getNodeExternalModuleId = getNodeExternalModuleId;
6
+ exports.setupNodeExternals = setupNodeExternals;
7
+ exports.isNodeExternal = isNodeExternal;
8
+ exports.METRO_EXTERNALS_FOLDER = exports.EXTERNAL_REQUIRE_NATIVE_POLYFILL = exports.EXTERNAL_REQUIRE_POLYFILL = exports.NODE_STDLIB_MODULES = void 0;
9
+ var _fs = _interopRequireDefault(require("fs"));
10
+ var _module = require("module");
11
+ var _path = _interopRequireDefault(require("path"));
12
+ function _interopRequireDefault(obj) {
13
+ return obj && obj.__esModule ? obj : {
14
+ default: obj
15
+ };
16
+ }
17
+ const NODE_STDLIB_MODULES = [
18
+ "fs/promises",
19
+ ...(_module.builtinModules || // @ts-expect-error
20
+ (process.binding ? Object.keys(process.binding("natives")) : []) || []).filter((x)=>!/^_|^(internal|v8|node-inspect)\/|\//.test(x) && ![
21
+ "sys"
22
+ ].includes(x)
23
+ ),
24
+ ].sort();
25
+ exports.NODE_STDLIB_MODULES = NODE_STDLIB_MODULES;
26
+ const EXTERNAL_REQUIRE_POLYFILL = ".expo/metro/polyfill.js";
27
+ exports.EXTERNAL_REQUIRE_POLYFILL = EXTERNAL_REQUIRE_POLYFILL;
28
+ const EXTERNAL_REQUIRE_NATIVE_POLYFILL = ".expo/metro/polyfill.native.js";
29
+ exports.EXTERNAL_REQUIRE_NATIVE_POLYFILL = EXTERNAL_REQUIRE_NATIVE_POLYFILL;
30
+ const METRO_EXTERNALS_FOLDER = ".expo/metro/externals";
31
+ exports.METRO_EXTERNALS_FOLDER = METRO_EXTERNALS_FOLDER;
32
+ function getNodeExternalModuleId(fromModule, moduleId) {
33
+ return _path.default.relative(_path.default.dirname(fromModule), _path.default.join(METRO_EXTERNALS_FOLDER, moduleId, "index.js"));
34
+ }
35
+ async function setupNodeExternals(projectRoot) {
36
+ await tapExternalRequirePolyfill(projectRoot);
37
+ await tapNodeShims(projectRoot);
38
+ }
39
+ async function tapExternalRequirePolyfill(projectRoot) {
40
+ await _fs.default.promises.mkdir(_path.default.join(projectRoot, _path.default.dirname(EXTERNAL_REQUIRE_POLYFILL)), {
41
+ recursive: true
42
+ });
43
+ await _fs.default.promises.writeFile(_path.default.join(projectRoot, EXTERNAL_REQUIRE_POLYFILL), 'global.$$require_external = typeof window === "undefined" ? require : () => null;');
44
+ await _fs.default.promises.writeFile(_path.default.join(projectRoot, EXTERNAL_REQUIRE_NATIVE_POLYFILL), "global.$$require_external = (moduleId) => {throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);}");
45
+ }
46
+ function isNodeExternal(moduleName) {
47
+ const moduleId = moduleName.replace(/^node:/, "");
48
+ if (NODE_STDLIB_MODULES.includes(moduleId)) {
49
+ return moduleId;
50
+ }
51
+ return null;
52
+ }
53
+ function tapNodeShimContents(moduleId) {
54
+ return `module.exports = $$require_external('node:${moduleId}');`;
55
+ }
56
+ // Ensure Node.js shims which require using `$$require_external` are available inside the project.
57
+ async function tapNodeShims(projectRoot) {
58
+ const externals = {};
59
+ for (const moduleId of NODE_STDLIB_MODULES){
60
+ const shimDir = _path.default.join(projectRoot, METRO_EXTERNALS_FOLDER, moduleId);
61
+ const shimPath = _path.default.join(shimDir, "index.js");
62
+ externals[moduleId] = shimPath;
63
+ if (!_fs.default.existsSync(shimPath)) {
64
+ await _fs.default.promises.mkdir(shimDir, {
65
+ recursive: true
66
+ });
67
+ await _fs.default.promises.writeFile(shimPath, tapNodeShimContents(moduleId));
68
+ }
69
+ }
70
+ }
71
+
72
+ //# sourceMappingURL=externals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/externals.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 fs from 'fs';\nimport { builtinModules } from 'module';\nimport path from 'path';\n\n// A list of the Node.js standard library modules that are currently\n// available,\nexport const NODE_STDLIB_MODULES: string[] = [\n 'fs/promises',\n ...(\n builtinModules ||\n // @ts-expect-error\n (process.binding ? Object.keys(process.binding('natives')) : []) ||\n []\n ).filter((x) => !/^_|^(internal|v8|node-inspect)\\/|\\//.test(x) && !['sys'].includes(x)),\n].sort();\n\nexport const EXTERNAL_REQUIRE_POLYFILL = '.expo/metro/polyfill.js';\nexport const EXTERNAL_REQUIRE_NATIVE_POLYFILL = '.expo/metro/polyfill.native.js';\nexport const METRO_EXTERNALS_FOLDER = '.expo/metro/externals';\n\nexport function getNodeExternalModuleId(fromModule: string, moduleId: string) {\n return path.relative(\n path.dirname(fromModule),\n path.join(METRO_EXTERNALS_FOLDER, moduleId, 'index.js')\n );\n}\n\nexport async function setupNodeExternals(projectRoot: string) {\n await tapExternalRequirePolyfill(projectRoot);\n await tapNodeShims(projectRoot);\n}\n\nasync function tapExternalRequirePolyfill(projectRoot: string) {\n await fs.promises.mkdir(path.join(projectRoot, path.dirname(EXTERNAL_REQUIRE_POLYFILL)), {\n recursive: true,\n });\n await fs.promises.writeFile(\n path.join(projectRoot, EXTERNAL_REQUIRE_POLYFILL),\n 'global.$$require_external = typeof window === \"undefined\" ? require : () => null;'\n );\n await fs.promises.writeFile(\n path.join(projectRoot, EXTERNAL_REQUIRE_NATIVE_POLYFILL),\n 'global.$$require_external = (moduleId) => {throw new Error(`Node.js standard library module ${moduleId} is not available in this JavaScript environment`);}'\n );\n}\n\nexport function isNodeExternal(moduleName: string): string | null {\n const moduleId = moduleName.replace(/^node:/, '');\n if (NODE_STDLIB_MODULES.includes(moduleId)) {\n return moduleId;\n }\n return null;\n}\n\nfunction tapNodeShimContents(moduleId: string): string {\n return `module.exports = $$require_external('node:${moduleId}');`;\n}\n\n// Ensure Node.js shims which require using `$$require_external` are available inside the project.\nasync function tapNodeShims(projectRoot: string) {\n const externals: Record<string, string> = {};\n for (const moduleId of NODE_STDLIB_MODULES) {\n const shimDir = path.join(projectRoot, METRO_EXTERNALS_FOLDER, moduleId);\n const shimPath = path.join(shimDir, 'index.js');\n externals[moduleId] = shimPath;\n\n if (!fs.existsSync(shimPath)) {\n await fs.promises.mkdir(shimDir, { recursive: true });\n await fs.promises.writeFile(shimPath, tapNodeShimContents(moduleId));\n }\n }\n}\n"],"names":["getNodeExternalModuleId","setupNodeExternals","isNodeExternal","NODE_STDLIB_MODULES","builtinModules","process","binding","Object","keys","filter","x","test","includes","sort","EXTERNAL_REQUIRE_POLYFILL","EXTERNAL_REQUIRE_NATIVE_POLYFILL","METRO_EXTERNALS_FOLDER","fromModule","moduleId","path","relative","dirname","join","projectRoot","tapExternalRequirePolyfill","tapNodeShims","fs","promises","mkdir","recursive","writeFile","moduleName","replace","tapNodeShimContents","externals","shimDir","shimPath","existsSync"],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ exports.getCssModulesFromBundler = getCssModulesFromBundler;
6
+ exports.getFileName = getFileName;
7
+ var _crypto = _interopRequireDefault(require("crypto"));
8
+ var _js = require("metro/src/DeltaBundler/Serializers/helpers/js");
9
+ var _splitBundleOptions = _interopRequireDefault(require("metro/src/lib/splitBundleOptions"));
10
+ var _path = _interopRequireDefault(require("path"));
11
+ function _interopRequireDefault(obj) {
12
+ return obj && obj.__esModule ? obj : {
13
+ default: obj
14
+ };
15
+ }
16
+ // s = static
17
+ const STATIC_EXPORT_DIRECTORY = "_expo/static/css";
18
+ async function getCssModulesFromBundler(config, incrementalBundler, options) {
19
+ // Static CSS is a web-only feature.
20
+ if (options.platform !== "web") {
21
+ return [];
22
+ }
23
+ const { entryFile , onProgress , resolverOptions , transformOptions } = (0, _splitBundleOptions).default(options);
24
+ const dependencies = await incrementalBundler.getDependencies([
25
+ entryFile
26
+ ], transformOptions, resolverOptions, {
27
+ onProgress,
28
+ shallow: false
29
+ });
30
+ var _unstable_serverRoot;
31
+ return getCssModules(dependencies, {
32
+ processModuleFilter: config.serializer.processModuleFilter,
33
+ assetPlugins: config.transformer.assetPlugins,
34
+ platform: transformOptions.platform,
35
+ projectRoot: (_unstable_serverRoot = config.server.unstable_serverRoot) != null ? _unstable_serverRoot : config.projectRoot,
36
+ publicPath: config.transformer.publicPath
37
+ });
38
+ }
39
+ function hashString(str) {
40
+ return _crypto.default.createHash("md5").update(str).digest("hex");
41
+ }
42
+ function getCssModules(dependencies, { processModuleFilter , projectRoot }) {
43
+ const promises = [];
44
+ for (const module of dependencies.values()){
45
+ if ((0, _js).isJsModule(module) && processModuleFilter(module) && (0, _js).getJsOutput(module).type === "js/module" && _path.default.relative(projectRoot, module.path) !== "package.json") {
46
+ const cssMetadata = getCssMetadata(module);
47
+ if (cssMetadata) {
48
+ const contents = cssMetadata.code;
49
+ const filename = _path.default.join(// Consistent location
50
+ STATIC_EXPORT_DIRECTORY, // Hashed file contents + name for caching
51
+ getFileName(module.path) + "-" + hashString(module.path + contents) + ".css");
52
+ promises.push({
53
+ originFilename: _path.default.relative(projectRoot, module.path),
54
+ filename,
55
+ source: contents
56
+ });
57
+ }
58
+ }
59
+ }
60
+ return promises;
61
+ }
62
+ function getCssMetadata(module) {
63
+ var ref;
64
+ const data = (ref = module.output[0]) == null ? void 0 : ref.data;
65
+ if (data && typeof data === "object" && "css" in data) {
66
+ if (typeof data.css !== "object" || !("code" in data.css)) {
67
+ throw new Error(`Unexpected CSS metadata in Metro module (${module.path}): ${JSON.stringify(data.css)}`);
68
+ }
69
+ return data.css;
70
+ }
71
+ return null;
72
+ }
73
+ function getFileName(module) {
74
+ return _path.default.basename(module).replace(/\.[^.]+$/, "");
75
+ }
76
+
77
+ //# sourceMappingURL=getCssModulesFromBundler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/getCssModulesFromBundler.ts"],"sourcesContent":["import { MetroConfig } from '@expo/metro-config';\nimport crypto from 'crypto';\nimport type { Module } from 'metro';\nimport { getJsOutput, isJsModule } from 'metro/src/DeltaBundler/Serializers/helpers/js';\nimport type { ReadOnlyDependencies } from 'metro/src/DeltaBundler/types';\nimport type IncrementalBundler from 'metro/src/IncrementalBundler';\nimport splitBundleOptions from 'metro/src/lib/splitBundleOptions';\nimport path from 'path';\n\n// import { getAssetData } from 'metro/src/Assets';\n\ntype Options = {\n processModuleFilter: (modules: Module) => boolean;\n assetPlugins: readonly string[];\n platform?: string | null;\n projectRoot: string;\n publicPath: string;\n};\n\ntype MetroModuleCSSMetadata = {\n code: string;\n lineCount: number;\n map: any[];\n};\n\nexport type CSSAsset = {\n // 'styles.css'\n originFilename: string;\n // '_expo/static/css/bc6aa0a69dcebf8e8cac1faa76705756.css'\n filename: string;\n // '\\ndiv {\\n background: cyan;\\n}\\n\\n'\n source: string;\n};\n\n// s = static\nconst STATIC_EXPORT_DIRECTORY = '_expo/static/css';\n\n/** @returns the static CSS assets used in a given bundle. CSS assets are only enabled if the `@expo/metro-config` `transformerPath` is used. */\nexport async function getCssModulesFromBundler(\n config: MetroConfig,\n incrementalBundler: IncrementalBundler,\n options: any\n): Promise<CSSAsset[]> {\n // Static CSS is a web-only feature.\n if (options.platform !== 'web') {\n return [];\n }\n\n const { entryFile, onProgress, resolverOptions, transformOptions } = splitBundleOptions(options);\n\n const dependencies = await incrementalBundler.getDependencies(\n [entryFile],\n transformOptions,\n resolverOptions,\n { onProgress, shallow: false }\n );\n\n return getCssModules(dependencies, {\n processModuleFilter: config.serializer.processModuleFilter,\n assetPlugins: config.transformer.assetPlugins,\n platform: transformOptions.platform,\n projectRoot: config.server.unstable_serverRoot ?? config.projectRoot,\n publicPath: config.transformer.publicPath,\n });\n}\n\nfunction hashString(str: string) {\n return crypto.createHash('md5').update(str).digest('hex');\n}\n\nfunction getCssModules(\n dependencies: ReadOnlyDependencies,\n { processModuleFilter, projectRoot }: Options\n) {\n const promises = [];\n\n for (const module of dependencies.values()) {\n if (\n isJsModule(module) &&\n processModuleFilter(module) &&\n getJsOutput(module).type === 'js/module' &&\n path.relative(projectRoot, module.path) !== 'package.json'\n ) {\n const cssMetadata = getCssMetadata(module);\n if (cssMetadata) {\n const contents = cssMetadata.code;\n const filename = path.join(\n // Consistent location\n STATIC_EXPORT_DIRECTORY,\n // Hashed file contents + name for caching\n getFileName(module.path) + '-' + hashString(module.path + contents) + '.css'\n );\n promises.push({\n originFilename: path.relative(projectRoot, module.path),\n filename,\n source: contents,\n });\n }\n }\n }\n\n return promises;\n}\n\nfunction getCssMetadata(module: Module): MetroModuleCSSMetadata | null {\n const data = module.output[0]?.data;\n if (data && typeof data === 'object' && 'css' in data) {\n if (typeof data.css !== 'object' || !('code' in (data as any).css)) {\n throw new Error(\n `Unexpected CSS metadata in Metro module (${module.path}): ${JSON.stringify(data.css)}`\n );\n }\n return data.css as MetroModuleCSSMetadata;\n }\n return null;\n}\n\nexport function getFileName(module: string) {\n return path.basename(module).replace(/\\.[^.]+$/, '');\n}\n"],"names":["getCssModulesFromBundler","getFileName","STATIC_EXPORT_DIRECTORY","config","incrementalBundler","options","platform","entryFile","onProgress","resolverOptions","transformOptions","splitBundleOptions","dependencies","getDependencies","shallow","getCssModules","processModuleFilter","serializer","assetPlugins","transformer","projectRoot","server","unstable_serverRoot","publicPath","hashString","str","crypto","createHash","update","digest","promises","module","values","isJsModule","getJsOutput","type","path","relative","cssMetadata","getCssMetadata","contents","code","filename","join","push","originFilename","source","data","output","css","Error","JSON","stringify","basename","replace"],"mappings":"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"}
@@ -9,12 +9,12 @@ Object.defineProperty(exports, "ExpoInspectorProxy", {
9
9
  }
10
10
  });
11
11
  exports.createInspectorProxy = createInspectorProxy;
12
- var _log = require("../../../../log");
13
12
  var _resolveFromProject = require("../resolveFromProject");
14
13
  var _device = require("./device");
15
14
  var _proxy = require("./proxy");
15
+ const debug = require("debug")("expo:metro:inspector-proxy");
16
16
  function createInspectorProxy(metroBundler, projectRoot) {
17
- _log.Log.warn("Experimental inspector proxy enabled. This early version requires newer Metro functionality, which is only available in SDK 49+.");
17
+ debug("Experimental inspector proxy enabled");
18
18
  // Import the installed `metro-inspector-proxy` from the project
19
19
  // We use these base classes to extend functionality
20
20
  const { InspectorProxy: MetroInspectorProxy } = (0, _resolveFromProject).importMetroInspectorProxyFromProject(projectRoot);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/start/server/metro/inspector-proxy/index.ts"],"sourcesContent":["import { Log } from '../../../../log';\nimport { MetroBundlerDevServer } from '../MetroBundlerDevServer';\nimport {\n importMetroInspectorDeviceFromProject,\n importMetroInspectorProxyFromProject,\n} from '../resolveFromProject';\nimport { createInspectorDeviceClass } from './device';\nimport { ExpoInspectorProxy } from './proxy';\n\nexport { ExpoInspectorProxy } from './proxy';\n\nexport function createInspectorProxy(metroBundler: MetroBundlerDevServer, projectRoot: string) {\n Log.warn(\n 'Experimental inspector proxy enabled. This early version requires newer Metro functionality, which is only available in SDK 49+.'\n );\n\n // Import the installed `metro-inspector-proxy` from the project\n // We use these base classes to extend functionality\n const { InspectorProxy: MetroInspectorProxy } = importMetroInspectorProxyFromProject(projectRoot);\n // The device is slightly more complicated, we need to extend that class\n const ExpoInspectorDevice = createInspectorDeviceClass(\n metroBundler,\n importMetroInspectorDeviceFromProject(projectRoot)\n );\n\n const inspectorProxy = new ExpoInspectorProxy(\n new MetroInspectorProxy(projectRoot),\n ExpoInspectorDevice\n );\n\n return inspectorProxy;\n}\n"],"names":["ExpoInspectorProxy","createInspectorProxy","metroBundler","projectRoot","Log","warn","InspectorProxy","MetroInspectorProxy","importMetroInspectorProxyFromProject","ExpoInspectorDevice","createInspectorDeviceClass","importMetroInspectorDeviceFromProject","inspectorProxy"],"mappings":"AAAA;;;;+BASSA,oBAAkB;;;eAFQ,MAAS,CAEnCA,kBAAkB;;;QAEXC,oBAAoB,GAApBA,oBAAoB;AAXhB,IAAA,IAAiB,WAAjB,iBAAiB,CAAA;AAK9B,IAAA,mBAAuB,WAAvB,uBAAuB,CAAA;AACa,IAAA,OAAU,WAAV,UAAU,CAAA;AAClB,IAAA,MAAS,WAAT,SAAS,CAAA;AAIrC,SAASA,oBAAoB,CAACC,YAAmC,EAAEC,WAAmB,EAAE;IAC7FC,IAAG,IAAA,CAACC,IAAI,CACN,kIAAkI,CACnI,CAAC;IAEF,gEAAgE;IAChE,oDAAoD;IACpD,MAAM,EAAEC,cAAc,EAAEC,mBAAmB,CAAA,EAAE,GAAGC,CAAAA,GAAAA,mBAAoC,AAAa,CAAA,qCAAb,CAACL,WAAW,CAAC,AAAC;IAClG,wEAAwE;IACxE,MAAMM,mBAAmB,GAAGC,CAAAA,GAAAA,OAA0B,AAGrD,CAAA,2BAHqD,CACpDR,YAAY,EACZS,CAAAA,GAAAA,mBAAqC,AAAa,CAAA,sCAAb,CAACR,WAAW,CAAC,CACnD,AAAC;IAEF,MAAMS,cAAc,GAAG,IAAIZ,MAAkB,mBAAA,CAC3C,IAAIO,mBAAmB,CAACJ,WAAW,CAAC,EACpCM,mBAAmB,CACpB,AAAC;IAEF,OAAOG,cAAc,CAAC;CACvB"}
1
+ {"version":3,"sources":["../../../../../../src/start/server/metro/inspector-proxy/index.ts"],"sourcesContent":["import { MetroBundlerDevServer } from '../MetroBundlerDevServer';\nimport {\n importMetroInspectorDeviceFromProject,\n importMetroInspectorProxyFromProject,\n} from '../resolveFromProject';\nimport { createInspectorDeviceClass } from './device';\nimport { ExpoInspectorProxy } from './proxy';\n\nexport { ExpoInspectorProxy } from './proxy';\n\nconst debug = require('debug')('expo:metro:inspector-proxy') as typeof console.log;\n\nexport function createInspectorProxy(metroBundler: MetroBundlerDevServer, projectRoot: string) {\n debug('Experimental inspector proxy enabled');\n\n // Import the installed `metro-inspector-proxy` from the project\n // We use these base classes to extend functionality\n const { InspectorProxy: MetroInspectorProxy } = importMetroInspectorProxyFromProject(projectRoot);\n // The device is slightly more complicated, we need to extend that class\n const ExpoInspectorDevice = createInspectorDeviceClass(\n metroBundler,\n importMetroInspectorDeviceFromProject(projectRoot)\n );\n\n const inspectorProxy = new ExpoInspectorProxy(\n new MetroInspectorProxy(projectRoot),\n ExpoInspectorDevice\n );\n\n return inspectorProxy;\n}\n"],"names":["ExpoInspectorProxy","createInspectorProxy","debug","require","metroBundler","projectRoot","InspectorProxy","MetroInspectorProxy","importMetroInspectorProxyFromProject","ExpoInspectorDevice","createInspectorDeviceClass","importMetroInspectorDeviceFromProject","inspectorProxy"],"mappings":"AAAA;;;;+BAQSA,oBAAkB;;;eAFQ,MAAS,CAEnCA,kBAAkB;;;QAIXC,oBAAoB,GAApBA,oBAAoB;AAR7B,IAAA,mBAAuB,WAAvB,uBAAuB,CAAA;AACa,IAAA,OAAU,WAAV,UAAU,CAAA;AAClB,IAAA,MAAS,WAAT,SAAS,CAAA;AAI5C,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,4BAA4B,CAAC,AAAsB,AAAC;AAE5E,SAASF,oBAAoB,CAACG,YAAmC,EAAEC,WAAmB,EAAE;IAC7FH,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAE9C,gEAAgE;IAChE,oDAAoD;IACpD,MAAM,EAAEI,cAAc,EAAEC,mBAAmB,CAAA,EAAE,GAAGC,CAAAA,GAAAA,mBAAoC,AAAa,CAAA,qCAAb,CAACH,WAAW,CAAC,AAAC;IAClG,wEAAwE;IACxE,MAAMI,mBAAmB,GAAGC,CAAAA,GAAAA,OAA0B,AAGrD,CAAA,2BAHqD,CACpDN,YAAY,EACZO,CAAAA,GAAAA,mBAAqC,AAAa,CAAA,sCAAb,CAACN,WAAW,CAAC,CACnD,AAAC;IAEF,MAAMO,cAAc,GAAG,IAAIZ,MAAkB,mBAAA,CAC3C,IAAIO,mBAAmB,CAACF,WAAW,CAAC,EACpCI,mBAAmB,CACpB,AAAC;IAEF,OAAOG,cAAc,CAAC;CACvB"}
@@ -45,9 +45,7 @@ class ExpoInspectorProxy {
45
45
  this.metroProxy.processRequest(req, res, next);
46
46
  }
47
47
  createWebSocketListeners(server) {
48
- if (server) {
49
- this.setServerAddress(server);
50
- }
48
+ this.setServerAddress(server);
51
49
  return {
52
50
  [WS_DEVICE_URL]: this.createDeviceWebSocketServer(),
53
51
  [WS_DEBUGGER_URL]: this.createDebuggerWebSocketServer()
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../src/start/server/metro/inspector-proxy/proxy.ts"],"sourcesContent":["import type { Server as HttpServer, IncomingMessage, ServerResponse } from 'http';\nimport type { Server as HttpsServer } from 'https';\nimport type { InspectorProxy as MetroProxy, Device as MetroDevice } from 'metro-inspector-proxy';\nimport { parse } from 'url';\nimport WS, { Server as WSServer } from 'ws';\n\nimport { Log } from '../../../../log';\n\nconst WS_DEVICE_URL = '/inspector/device';\nconst WS_DEBUGGER_URL = '/inspector/debug';\nconst WS_GENERIC_ERROR_STATUS = 1011;\n\nconst debug = require('debug')('expo:metro:inspector-proxy:proxy') as typeof console.log;\n\n// This is a workaround for `ConstructorType` not working on dynamically generated classes\ntype Instantiatable<Instance> = new (...args: any) => Instance;\n\nexport class ExpoInspectorProxy<D extends MetroDevice = MetroDevice> {\n constructor(\n public readonly metroProxy: MetroProxy,\n private DeviceClass: Instantiatable<D>,\n public readonly devices: Map<number, D> = new Map()\n ) {\n // monkey-patch the device list to expose it within the metro inspector\n this.metroProxy._devices = this.devices;\n\n // force httpEndpointMiddleware to be bound to this proxy instance\n this.processRequest = this.processRequest.bind(this);\n }\n\n /**\n * Initialize the server address from the metro server.\n * This is required to properly reference sourcemaps for the debugger.\n */\n public setServerAddress(server: HttpServer | HttpsServer) {\n const addressInfo = server.address();\n\n if (typeof addressInfo === 'string') {\n throw new Error(`Inspector proxy could not resolve the server address, got \"${addressInfo}\"`);\n } else if (addressInfo === null) {\n throw new Error(`Inspector proxy could not resolve the server address, got \"null\"`);\n }\n\n const { address, port, family } = addressInfo;\n\n if (family === 'IPv6') {\n this.metroProxy._serverAddressWithPort = `[${address ?? '::1'}]:${port}`;\n } else {\n this.metroProxy._serverAddressWithPort = `${address ?? 'localhost'}:${port}`;\n }\n }\n\n /** @see https://chromedevtools.github.io/devtools-protocol/#endpoints */\n public processRequest(req: IncomingMessage, res: ServerResponse, next: (error?: Error) => any) {\n this.metroProxy.processRequest(req, res, next);\n }\n\n public createWebSocketListeners(server?: HttpServer | HttpsServer): Record<string, WSServer> {\n if (server) {\n this.setServerAddress(server);\n }\n\n return {\n [WS_DEVICE_URL]: this.createDeviceWebSocketServer(),\n [WS_DEBUGGER_URL]: this.createDebuggerWebSocketServer(),\n };\n }\n\n private createDeviceWebSocketServer() {\n const wss = new WS.Server({\n noServer: true,\n perMessageDeflate: false,\n });\n\n // See: https://github.com/facebook/metro/blob/eeb211fdcfdcb9e7f8a51721bd0f48bc7d0d211f/packages/metro-inspector-proxy/src/InspectorProxy.js#L157\n wss.on('connection', (socket, request) => {\n try {\n const deviceId = this.metroProxy._deviceCounter++;\n const { deviceName, appName } = getNewDeviceInfo(request.url);\n\n this.devices.set(\n deviceId,\n new this.DeviceClass(deviceId, deviceName, appName, socket, this.metroProxy._projectRoot)\n );\n\n debug('New device connected: device=%s, app=%s', deviceName, appName);\n\n socket.on('close', () => {\n this.devices.delete(deviceId);\n debug('Device disconnected: device=%s, app=%s', deviceName, appName);\n });\n } catch (error: unknown) {\n let message = '';\n\n debug('Could not establish a connection to on-device debugger:', error);\n\n if (error instanceof Error) {\n message = error.toString();\n Log.error('Failed to create a socket connection to on-device debugger (Hermes engine).');\n Log.exception(error);\n } else {\n Log.error(\n 'Failed to create a socket connection to on-device debugger (Hermes engine), unknown error.'\n );\n }\n\n socket.close(WS_GENERIC_ERROR_STATUS, message || 'Unknown error');\n }\n });\n\n return wss;\n }\n\n private createDebuggerWebSocketServer() {\n const wss = new WS.Server({\n noServer: true,\n perMessageDeflate: false,\n });\n\n // See: https://github.com/facebook/metro/blob/eeb211fdcfdcb9e7f8a51721bd0f48bc7d0d211f/packages/metro-inspector-proxy/src/InspectorProxy.js#L193\n wss.on('connection', (socket, request) => {\n try {\n const { deviceId, pageId } = getExistingDeviceInfo(request.url);\n if (!deviceId || !pageId) {\n // TODO(cedric): change these errors to proper error types\n throw new Error(`Missing \"device\" and/or \"page\" IDs in query parameters`);\n }\n\n const device = this.devices.get(parseInt(deviceId, 10));\n if (!device) {\n // TODO(cedric): change these errors to proper error types\n throw new Error(`Device with ID \"${deviceId}\" not found.`);\n }\n\n debug('New debugger connected: device=%s, app=%s', device._name, device._app);\n\n device.handleDebuggerConnection(socket, pageId);\n\n socket.on('close', () => {\n debug('Debugger disconnected: device=%s, app=%s', device._name, device._app);\n });\n } catch (error: unknown) {\n let message = '';\n\n debug('Could not establish a connection to debugger:', error);\n\n if (error instanceof Error) {\n message = error.toString();\n Log.error('Failed to create a socket connection to the debugger.');\n Log.exception(error);\n } else {\n Log.error('Failed to create a socket connection to the debugger, unkown error.');\n }\n\n socket.close(WS_GENERIC_ERROR_STATUS, message || 'Unknown error');\n }\n });\n\n return wss;\n }\n}\n\nfunction asString(value: string | string[] = ''): string {\n return Array.isArray(value) ? value.join() : value;\n}\n\nfunction getNewDeviceInfo(url: IncomingMessage['url']) {\n const { query } = parse(url ?? '', true);\n return {\n deviceName: asString(query.name) || 'Unknown device name',\n appName: asString(query.app) || 'Unknown app name',\n };\n}\n\nfunction getExistingDeviceInfo(url: IncomingMessage['url']) {\n const { query } = parse(url ?? '', true);\n return {\n deviceId: asString(query.device),\n pageId: asString(query.page),\n };\n}\n"],"names":["WS_DEVICE_URL","WS_DEBUGGER_URL","WS_GENERIC_ERROR_STATUS","debug","require","ExpoInspectorProxy","constructor","metroProxy","DeviceClass","devices","Map","_devices","processRequest","bind","setServerAddress","server","addressInfo","address","Error","port","family","_serverAddressWithPort","req","res","next","createWebSocketListeners","createDeviceWebSocketServer","createDebuggerWebSocketServer","wss","WS","Server","noServer","perMessageDeflate","on","socket","request","deviceId","_deviceCounter","deviceName","appName","getNewDeviceInfo","url","set","_projectRoot","delete","error","message","toString","Log","exception","close","pageId","getExistingDeviceInfo","device","get","parseInt","_name","_app","handleDebuggerConnection","asString","value","Array","isArray","join","query","parse","name","app","page"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../../src/start/server/metro/inspector-proxy/proxy.ts"],"sourcesContent":["import type { Server as HttpServer, IncomingMessage, ServerResponse } from 'http';\nimport type { Server as HttpsServer } from 'https';\nimport type { InspectorProxy as MetroProxy, Device as MetroDevice } from 'metro-inspector-proxy';\nimport { parse } from 'url';\nimport WS, { Server as WSServer } from 'ws';\n\nimport { Log } from '../../../../log';\n\nconst WS_DEVICE_URL = '/inspector/device';\nconst WS_DEBUGGER_URL = '/inspector/debug';\nconst WS_GENERIC_ERROR_STATUS = 1011;\n\nconst debug = require('debug')('expo:metro:inspector-proxy:proxy') as typeof console.log;\n\n// This is a workaround for `ConstructorType` not working on dynamically generated classes\ntype Instantiatable<Instance> = new (...args: any) => Instance;\n\nexport class ExpoInspectorProxy<D extends MetroDevice = MetroDevice> {\n constructor(\n public readonly metroProxy: MetroProxy,\n private DeviceClass: Instantiatable<D>,\n public readonly devices: Map<number, D> = new Map()\n ) {\n // monkey-patch the device list to expose it within the metro inspector\n this.metroProxy._devices = this.devices;\n\n // force httpEndpointMiddleware to be bound to this proxy instance\n this.processRequest = this.processRequest.bind(this);\n }\n\n /**\n * Initialize the server address from the metro server.\n * This is required to properly reference sourcemaps for the debugger.\n */\n private setServerAddress(server: HttpServer | HttpsServer) {\n const addressInfo = server.address();\n\n if (typeof addressInfo === 'string') {\n throw new Error(`Inspector proxy could not resolve the server address, got \"${addressInfo}\"`);\n } else if (addressInfo === null) {\n throw new Error(`Inspector proxy could not resolve the server address, got \"null\"`);\n }\n\n const { address, port, family } = addressInfo;\n\n if (family === 'IPv6') {\n this.metroProxy._serverAddressWithPort = `[${address ?? '::1'}]:${port}`;\n } else {\n this.metroProxy._serverAddressWithPort = `${address ?? 'localhost'}:${port}`;\n }\n }\n\n /** @see https://chromedevtools.github.io/devtools-protocol/#endpoints */\n public processRequest(req: IncomingMessage, res: ServerResponse, next: (error?: Error) => any) {\n this.metroProxy.processRequest(req, res, next);\n }\n\n public createWebSocketListeners(server: HttpServer | HttpsServer): Record<string, WSServer> {\n this.setServerAddress(server);\n\n return {\n [WS_DEVICE_URL]: this.createDeviceWebSocketServer(),\n [WS_DEBUGGER_URL]: this.createDebuggerWebSocketServer(),\n };\n }\n\n private createDeviceWebSocketServer() {\n const wss = new WS.Server({\n noServer: true,\n perMessageDeflate: false,\n });\n\n // See: https://github.com/facebook/metro/blob/eeb211fdcfdcb9e7f8a51721bd0f48bc7d0d211f/packages/metro-inspector-proxy/src/InspectorProxy.js#L157\n wss.on('connection', (socket, request) => {\n try {\n const deviceId = this.metroProxy._deviceCounter++;\n const { deviceName, appName } = getNewDeviceInfo(request.url);\n\n this.devices.set(\n deviceId,\n new this.DeviceClass(deviceId, deviceName, appName, socket, this.metroProxy._projectRoot)\n );\n\n debug('New device connected: device=%s, app=%s', deviceName, appName);\n\n socket.on('close', () => {\n this.devices.delete(deviceId);\n debug('Device disconnected: device=%s, app=%s', deviceName, appName);\n });\n } catch (error: unknown) {\n let message = '';\n\n debug('Could not establish a connection to on-device debugger:', error);\n\n if (error instanceof Error) {\n message = error.toString();\n Log.error('Failed to create a socket connection to on-device debugger (Hermes engine).');\n Log.exception(error);\n } else {\n Log.error(\n 'Failed to create a socket connection to on-device debugger (Hermes engine), unknown error.'\n );\n }\n\n socket.close(WS_GENERIC_ERROR_STATUS, message || 'Unknown error');\n }\n });\n\n return wss;\n }\n\n private createDebuggerWebSocketServer() {\n const wss = new WS.Server({\n noServer: true,\n perMessageDeflate: false,\n });\n\n // See: https://github.com/facebook/metro/blob/eeb211fdcfdcb9e7f8a51721bd0f48bc7d0d211f/packages/metro-inspector-proxy/src/InspectorProxy.js#L193\n wss.on('connection', (socket, request) => {\n try {\n const { deviceId, pageId } = getExistingDeviceInfo(request.url);\n if (!deviceId || !pageId) {\n // TODO(cedric): change these errors to proper error types\n throw new Error(`Missing \"device\" and/or \"page\" IDs in query parameters`);\n }\n\n const device = this.devices.get(parseInt(deviceId, 10));\n if (!device) {\n // TODO(cedric): change these errors to proper error types\n throw new Error(`Device with ID \"${deviceId}\" not found.`);\n }\n\n debug('New debugger connected: device=%s, app=%s', device._name, device._app);\n\n device.handleDebuggerConnection(socket, pageId);\n\n socket.on('close', () => {\n debug('Debugger disconnected: device=%s, app=%s', device._name, device._app);\n });\n } catch (error: unknown) {\n let message = '';\n\n debug('Could not establish a connection to debugger:', error);\n\n if (error instanceof Error) {\n message = error.toString();\n Log.error('Failed to create a socket connection to the debugger.');\n Log.exception(error);\n } else {\n Log.error('Failed to create a socket connection to the debugger, unkown error.');\n }\n\n socket.close(WS_GENERIC_ERROR_STATUS, message || 'Unknown error');\n }\n });\n\n return wss;\n }\n}\n\nfunction asString(value: string | string[] = ''): string {\n return Array.isArray(value) ? value.join() : value;\n}\n\nfunction getNewDeviceInfo(url: IncomingMessage['url']) {\n const { query } = parse(url ?? '', true);\n return {\n deviceName: asString(query.name) || 'Unknown device name',\n appName: asString(query.app) || 'Unknown app name',\n };\n}\n\nfunction getExistingDeviceInfo(url: IncomingMessage['url']) {\n const { query } = parse(url ?? '', true);\n return {\n deviceId: asString(query.device),\n pageId: asString(query.page),\n };\n}\n"],"names":["WS_DEVICE_URL","WS_DEBUGGER_URL","WS_GENERIC_ERROR_STATUS","debug","require","ExpoInspectorProxy","constructor","metroProxy","DeviceClass","devices","Map","_devices","processRequest","bind","setServerAddress","server","addressInfo","address","Error","port","family","_serverAddressWithPort","req","res","next","createWebSocketListeners","createDeviceWebSocketServer","createDebuggerWebSocketServer","wss","WS","Server","noServer","perMessageDeflate","on","socket","request","deviceId","_deviceCounter","deviceName","appName","getNewDeviceInfo","url","set","_projectRoot","delete","error","message","toString","Log","exception","close","pageId","getExistingDeviceInfo","device","get","parseInt","_name","_app","handleDebuggerConnection","asString","value","Array","isArray","join","query","parse","name","app","page"],"mappings":"AAAA;;;;AAGsB,IAAA,IAAK,WAAL,KAAK,CAAA;AACY,IAAA,GAAI,kCAAJ,IAAI,EAAA;AAEvB,IAAA,IAAiB,WAAjB,iBAAiB,CAAA;;;;;;AAErC,MAAMA,aAAa,GAAG,mBAAmB,AAAC;AAC1C,MAAMC,eAAe,GAAG,kBAAkB,AAAC;AAC3C,MAAMC,uBAAuB,GAAG,IAAI,AAAC;AAErC,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,kCAAkC,CAAC,AAAsB,AAAC;AAKlF,MAAMC,kBAAkB;IAC7BC,YACkBC,UAAsB,EAC9BC,WAA8B,EACtBC,OAAuB,GAAG,IAAIC,GAAG,EAAE,CACnD;aAHgBH,UAAsB,GAAtBA,UAAsB;aAC9BC,WAA8B,GAA9BA,WAA8B;aACtBC,OAAuB,GAAvBA,OAAuB;QAEvC,uEAAuE;QACvE,IAAI,CAACF,UAAU,CAACI,QAAQ,GAAG,IAAI,CAACF,OAAO,CAAC;QAExC,kEAAkE;QAClE,IAAI,CAACG,cAAc,GAAG,IAAI,CAACA,cAAc,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;KACtD;IAED;;;KAGG,CACH,AAAQC,gBAAgB,CAACC,MAAgC,EAAE;QACzD,MAAMC,WAAW,GAAGD,MAAM,CAACE,OAAO,EAAE,AAAC;QAErC,IAAI,OAAOD,WAAW,KAAK,QAAQ,EAAE;YACnC,MAAM,IAAIE,KAAK,CAAC,CAAC,2DAA2D,EAAEF,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/F,MAAM,IAAIA,WAAW,KAAK,IAAI,EAAE;YAC/B,MAAM,IAAIE,KAAK,CAAC,CAAC,gEAAgE,CAAC,CAAC,CAAC;SACrF;QAED,MAAM,EAAED,OAAO,CAAA,EAAEE,IAAI,CAAA,EAAEC,MAAM,CAAA,EAAE,GAAGJ,WAAW,AAAC;QAE9C,IAAII,MAAM,KAAK,MAAM,EAAE;YACrB,IAAI,CAACb,UAAU,CAACc,sBAAsB,GAAG,CAAC,CAAC,EAAEJ,OAAO,WAAPA,OAAO,GAAI,KAAK,CAAC,EAAE,EAAEE,IAAI,CAAC,CAAC,CAAC;SAC1E,MAAM;YACL,IAAI,CAACZ,UAAU,CAACc,sBAAsB,GAAG,CAAC,EAAEJ,OAAO,WAAPA,OAAO,GAAI,WAAW,CAAC,CAAC,EAAEE,IAAI,CAAC,CAAC,CAAC;SAC9E;KACF;IAED,yEAAyE,CACzE,AAAOP,cAAc,CAACU,GAAoB,EAAEC,GAAmB,EAAEC,IAA4B,EAAE;QAC7F,IAAI,CAACjB,UAAU,CAACK,cAAc,CAACU,GAAG,EAAEC,GAAG,EAAEC,IAAI,CAAC,CAAC;KAChD;IAED,AAAOC,wBAAwB,CAACV,MAAgC,EAA4B;QAC1F,IAAI,CAACD,gBAAgB,CAACC,MAAM,CAAC,CAAC;QAE9B,OAAO;YACL,CAACf,aAAa,CAAC,EAAE,IAAI,CAAC0B,2BAA2B,EAAE;YACnD,CAACzB,eAAe,CAAC,EAAE,IAAI,CAAC0B,6BAA6B,EAAE;SACxD,CAAC;KACH;IAED,AAAQD,2BAA2B,GAAG;QACpC,MAAME,GAAG,GAAG,IAAIC,GAAE,QAAA,CAACC,MAAM,CAAC;YACxBC,QAAQ,EAAE,IAAI;YACdC,iBAAiB,EAAE,KAAK;SACzB,CAAC,AAAC;QAEH,iJAAiJ;QACjJJ,GAAG,CAACK,EAAE,CAAC,YAAY,EAAE,CAACC,MAAM,EAAEC,OAAO,GAAK;YACxC,IAAI;gBACF,MAAMC,QAAQ,GAAG,IAAI,CAAC7B,UAAU,CAAC8B,cAAc,EAAE,AAAC;gBAClD,MAAM,EAAEC,UAAU,CAAA,EAAEC,OAAO,CAAA,EAAE,GAAGC,gBAAgB,CAACL,OAAO,CAACM,GAAG,CAAC,AAAC;gBAE9D,IAAI,CAAChC,OAAO,CAACiC,GAAG,CACdN,QAAQ,EACR,IAAI,IAAI,CAAC5B,WAAW,CAAC4B,QAAQ,EAAEE,UAAU,EAAEC,OAAO,EAAEL,MAAM,EAAE,IAAI,CAAC3B,UAAU,CAACoC,YAAY,CAAC,CAC1F,CAAC;gBAEFxC,KAAK,CAAC,yCAAyC,EAAEmC,UAAU,EAAEC,OAAO,CAAC,CAAC;gBAEtEL,MAAM,CAACD,EAAE,CAAC,OAAO,EAAE,IAAM;oBACvB,IAAI,CAACxB,OAAO,CAACmC,MAAM,CAACR,QAAQ,CAAC,CAAC;oBAC9BjC,KAAK,CAAC,wCAAwC,EAAEmC,UAAU,EAAEC,OAAO,CAAC,CAAC;iBACtE,CAAC,CAAC;aACJ,CAAC,OAAOM,KAAK,EAAW;gBACvB,IAAIC,OAAO,GAAG,EAAE,AAAC;gBAEjB3C,KAAK,CAAC,yDAAyD,EAAE0C,KAAK,CAAC,CAAC;gBAExE,IAAIA,KAAK,YAAY3B,KAAK,EAAE;oBAC1B4B,OAAO,GAAGD,KAAK,CAACE,QAAQ,EAAE,CAAC;oBAC3BC,IAAG,IAAA,CAACH,KAAK,CAAC,6EAA6E,CAAC,CAAC;oBACzFG,IAAG,IAAA,CAACC,SAAS,CAACJ,KAAK,CAAC,CAAC;iBACtB,MAAM;oBACLG,IAAG,IAAA,CAACH,KAAK,CACP,4FAA4F,CAC7F,CAAC;iBACH;gBAEDX,MAAM,CAACgB,KAAK,CAAChD,uBAAuB,EAAE4C,OAAO,IAAI,eAAe,CAAC,CAAC;aACnE;SACF,CAAC,CAAC;QAEH,OAAOlB,GAAG,CAAC;KACZ;IAED,AAAQD,6BAA6B,GAAG;QACtC,MAAMC,GAAG,GAAG,IAAIC,GAAE,QAAA,CAACC,MAAM,CAAC;YACxBC,QAAQ,EAAE,IAAI;YACdC,iBAAiB,EAAE,KAAK;SACzB,CAAC,AAAC;QAEH,iJAAiJ;QACjJJ,GAAG,CAACK,EAAE,CAAC,YAAY,EAAE,CAACC,MAAM,EAAEC,OAAO,GAAK;YACxC,IAAI;gBACF,MAAM,EAAEC,QAAQ,CAAA,EAAEe,MAAM,CAAA,EAAE,GAAGC,qBAAqB,CAACjB,OAAO,CAACM,GAAG,CAAC,AAAC;gBAChE,IAAI,CAACL,QAAQ,IAAI,CAACe,MAAM,EAAE;oBACxB,0DAA0D;oBAC1D,MAAM,IAAIjC,KAAK,CAAC,CAAC,sDAAsD,CAAC,CAAC,CAAC;iBAC3E;gBAED,MAAMmC,MAAM,GAAG,IAAI,CAAC5C,OAAO,CAAC6C,GAAG,CAACC,QAAQ,CAACnB,QAAQ,EAAE,EAAE,CAAC,CAAC,AAAC;gBACxD,IAAI,CAACiB,MAAM,EAAE;oBACX,0DAA0D;oBAC1D,MAAM,IAAInC,KAAK,CAAC,CAAC,gBAAgB,EAAEkB,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;iBAC5D;gBAEDjC,KAAK,CAAC,2CAA2C,EAAEkD,MAAM,CAACG,KAAK,EAAEH,MAAM,CAACI,IAAI,CAAC,CAAC;gBAE9EJ,MAAM,CAACK,wBAAwB,CAACxB,MAAM,EAAEiB,MAAM,CAAC,CAAC;gBAEhDjB,MAAM,CAACD,EAAE,CAAC,OAAO,EAAE,IAAM;oBACvB9B,KAAK,CAAC,0CAA0C,EAAEkD,MAAM,CAACG,KAAK,EAAEH,MAAM,CAACI,IAAI,CAAC,CAAC;iBAC9E,CAAC,CAAC;aACJ,CAAC,OAAOZ,KAAK,EAAW;gBACvB,IAAIC,OAAO,GAAG,EAAE,AAAC;gBAEjB3C,KAAK,CAAC,+CAA+C,EAAE0C,KAAK,CAAC,CAAC;gBAE9D,IAAIA,KAAK,YAAY3B,KAAK,EAAE;oBAC1B4B,OAAO,GAAGD,KAAK,CAACE,QAAQ,EAAE,CAAC;oBAC3BC,IAAG,IAAA,CAACH,KAAK,CAAC,uDAAuD,CAAC,CAAC;oBACnEG,IAAG,IAAA,CAACC,SAAS,CAACJ,KAAK,CAAC,CAAC;iBACtB,MAAM;oBACLG,IAAG,IAAA,CAACH,KAAK,CAAC,qEAAqE,CAAC,CAAC;iBAClF;gBAEDX,MAAM,CAACgB,KAAK,CAAChD,uBAAuB,EAAE4C,OAAO,IAAI,eAAe,CAAC,CAAC;aACnE;SACF,CAAC,CAAC;QAEH,OAAOlB,GAAG,CAAC;KACZ;CACF;QA7IYvB,kBAAkB,GAAlBA,kBAAkB;AA+I/B,SAASsD,QAAQ,CAACC,KAAwB,GAAG,EAAE,EAAU;IACvD,OAAOC,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC,GAAGA,KAAK,CAACG,IAAI,EAAE,GAAGH,KAAK,CAAC;CACpD;AAED,SAASpB,gBAAgB,CAACC,GAA2B,EAAE;IACrD,MAAM,EAAEuB,KAAK,CAAA,EAAE,GAAGC,CAAAA,GAAAA,IAAK,AAAiB,CAAA,MAAjB,CAACxB,GAAG,WAAHA,GAAG,GAAI,EAAE,EAAE,IAAI,CAAC,AAAC;IACzC,OAAO;QACLH,UAAU,EAAEqB,QAAQ,CAACK,KAAK,CAACE,IAAI,CAAC,IAAI,qBAAqB;QACzD3B,OAAO,EAAEoB,QAAQ,CAACK,KAAK,CAACG,GAAG,CAAC,IAAI,kBAAkB;KACnD,CAAC;CACH;AAED,SAASf,qBAAqB,CAACX,GAA2B,EAAE;IAC1D,MAAM,EAAEuB,KAAK,CAAA,EAAE,GAAGC,CAAAA,GAAAA,IAAK,AAAiB,CAAA,MAAjB,CAACxB,GAAG,WAAHA,GAAG,GAAI,EAAE,EAAE,IAAI,CAAC,AAAC;IACzC,OAAO;QACLL,QAAQ,EAAEuB,QAAQ,CAACK,KAAK,CAACX,MAAM,CAAC;QAChCF,MAAM,EAAEQ,QAAQ,CAACK,KAAK,CAACI,IAAI,CAAC;KAC7B,CAAC;CACH"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
+ exports.loadMetroConfigAsync = loadMetroConfigAsync;
5
6
  exports.instantiateMetroAsync = instantiateMetroAsync;
6
7
  exports.isWatchEnabled = isWatchEnabled;
7
8
  var _config = require("@expo/config");
@@ -12,24 +13,28 @@ var _getMetroProperties = require("../../../utils/analytics/getMetroProperties")
12
13
  var _metroDebuggerMiddleware = require("../../../utils/analytics/metroDebuggerMiddleware");
13
14
  var _rudderstackClient = require("../../../utils/analytics/rudderstackClient");
14
15
  var _env = require("../../../utils/env");
16
+ var _manifestMiddleware = require("../middleware/ManifestMiddleware");
15
17
  var _createDevServerMiddleware = require("../middleware/createDevServerMiddleware");
16
18
  var _platformBundlers = require("../platformBundlers");
17
19
  var _metroTerminalReporter = require("./MetroTerminalReporter");
18
- var _inspectorProxy = require("./inspector-proxy");
19
20
  var _resolveFromProject = require("./resolveFromProject");
21
+ var _router = require("./router");
22
+ var _runServerFork = require("./runServer-fork");
20
23
  var _withMetroMultiPlatform = require("./withMetroMultiPlatform");
21
24
  function _interopRequireDefault(obj) {
22
25
  return obj && obj.__esModule ? obj : {
23
26
  default: obj
24
27
  };
25
28
  }
26
- async function instantiateMetroAsync(metroBundler, options) {
27
- const projectRoot = metroBundler.projectRoot;
29
+ async function loadMetroConfigAsync(projectRoot, options, { exp =(0, _config).getConfig(projectRoot, {
30
+ skipSDKVersionRequirement: true,
31
+ skipPlugins: true
32
+ }).exp } = {}) {
33
+ var ref, ref1, ref2, ref3;
28
34
  let reportEvent;
29
- const Metro = (0, _resolveFromProject).importMetroFromProject(projectRoot);
30
- const ExpoMetroConfig = (0, _resolveFromProject).importExpoMetroConfigFromProject(projectRoot);
35
+ const serverRoot = (0, _manifestMiddleware).getMetroServerRoot(projectRoot);
31
36
  const terminal = new _metroCore.Terminal(process.stdout);
32
- const terminalReporter = new _metroTerminalReporter.MetroTerminalReporter(projectRoot, terminal);
37
+ const terminalReporter = new _metroTerminalReporter.MetroTerminalReporter(serverRoot, terminal);
33
38
  const reporter = {
34
39
  update (event) {
35
40
  terminalReporter.update(event);
@@ -38,70 +43,64 @@ async function instantiateMetroAsync(metroBundler, options) {
38
43
  }
39
44
  }
40
45
  };
41
- let metroConfig = await ExpoMetroConfig.loadAsync(projectRoot, {
46
+ const ExpoMetroConfig = (0, _resolveFromProject).importExpoMetroConfig(projectRoot);
47
+ let config = await ExpoMetroConfig.loadAsync(projectRoot, {
42
48
  reporter,
43
49
  ...options
44
50
  });
51
+ const platformBundlers = (0, _platformBundlers).getPlatformBundlers(exp);
52
+ var ref4, ref5;
53
+ config = await (0, _withMetroMultiPlatform).withMetroMultiPlatformAsync(projectRoot, {
54
+ routerDirectory: (ref4 = (ref = exp.extra) == null ? void 0 : (ref1 = ref.router) == null ? void 0 : ref1.unstable_src) != null ? ref4 : (0, _router).getRouterDirectory(projectRoot),
55
+ config,
56
+ platformBundlers,
57
+ isTsconfigPathsEnabled: !!((ref2 = exp.experiments) == null ? void 0 : ref2.tsconfigPaths),
58
+ webOutput: (ref5 = (ref3 = exp.web) == null ? void 0 : ref3.output) != null ? ref5 : "single"
59
+ });
60
+ (0, _rudderstackClient).logEventAsync("metro config", (0, _getMetroProperties).getMetroProperties(projectRoot, exp, config));
61
+ return {
62
+ config,
63
+ setEventReporter: (logger)=>reportEvent = logger
64
+ ,
65
+ reporter: terminalReporter
66
+ };
67
+ }
68
+ async function instantiateMetroAsync(metroBundler, options) {
69
+ const projectRoot = metroBundler.projectRoot;
45
70
  // TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.
46
71
  const { exp } = (0, _config).getConfig(projectRoot, {
47
72
  skipSDKVersionRequirement: true,
48
73
  skipPlugins: true
49
74
  });
50
- const platformBundlers = (0, _platformBundlers).getPlatformBundlers(exp);
51
- metroConfig = await (0, _withMetroMultiPlatform).withMetroMultiPlatformAsync(projectRoot, metroConfig, platformBundlers);
52
- (0, _rudderstackClient).logEventAsync("metro config", (0, _getMetroProperties).getMetroProperties(projectRoot, exp, metroConfig));
53
- const { middleware , attachToServer , // New
54
- websocketEndpoints , eventsSocketEndpoint , messageSocketEndpoint , } = (0, _createDevServerMiddleware).createDevServerMiddleware(projectRoot, {
75
+ const { config: metroConfig , setEventReporter } = await loadMetroConfigAsync(projectRoot, options, {
76
+ exp
77
+ });
78
+ const { middleware , websocketEndpoints , eventsSocketEndpoint , messageSocketEndpoint } = (0, _createDevServerMiddleware).createDevServerMiddleware(projectRoot, {
55
79
  port: metroConfig.server.port,
56
80
  watchFolders: metroConfig.watchFolders
57
81
  });
58
82
  const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;
59
- // @ts-ignore can't mutate readonly config
83
+ // @ts-expect-error: can't mutate readonly config
60
84
  metroConfig.server.enhanceMiddleware = (metroMiddleware, server)=>{
61
85
  if (customEnhanceMiddleware) {
62
86
  metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);
63
87
  }
64
88
  return middleware.use(metroMiddleware);
65
89
  };
66
- // Create the custom inspector proxy only when enabled and opt-in
67
- const inspectorProxy = metroConfig.server.runInspectorProxy && _env.env.EXPO_USE_CUSTOM_INSPECTOR_PROXY ? (0, _inspectorProxy).createInspectorProxy(metroBundler, metroBundler.projectRoot) : null;
68
- if (inspectorProxy) {
69
- // @ts-expect-error Property is read-only, but we need to disable it
70
- metroConfig.server.runInspectorProxy = false;
71
- }
72
90
  middleware.use((0, _metroDebuggerMiddleware).createDebuggerTelemetryMiddleware(projectRoot, exp));
73
- const server1 = await Metro.runServer(metroConfig, {
91
+ const { server: server1 , metro } = await (0, _runServerFork).runServer(metroBundler, metroConfig, {
74
92
  hmrEnabled: true,
75
- websocketEndpoints: {
76
- ...websocketEndpoints,
77
- ...inspectorProxy ? inspectorProxy.createWebSocketListeners() : {}
78
- },
79
- // @ts-expect-error Property was added in 0.73.4, remove this statement when updating Metro
93
+ // @ts-expect-error: Inconsistent `websocketEndpoints` type between metro and @react-native-community/cli-server-api
94
+ websocketEndpoints,
80
95
  watch: isWatchEnabled()
81
96
  });
82
- // Hook the inspector proxy in the Metro server
83
- if (inspectorProxy) {
84
- inspectorProxy.setServerAddress(server1);
85
- middleware.use(inspectorProxy.processRequest);
86
- }
87
- if (attachToServer) {
88
- // Expo SDK 44 and lower
89
- const { messageSocket , eventsSocket } = attachToServer(server1);
90
- reportEvent = eventsSocket.reportEvent;
91
- return {
92
- server: server1,
93
- middleware,
94
- messageSocket
95
- };
96
- } else {
97
- // RN +68 -- Expo SDK +45
98
- reportEvent = eventsSocketEndpoint.reportEvent;
99
- return {
100
- server: server1,
101
- middleware,
102
- messageSocket: messageSocketEndpoint
103
- };
104
- }
97
+ setEventReporter(eventsSocketEndpoint.reportEvent);
98
+ return {
99
+ metro,
100
+ server: server1,
101
+ middleware,
102
+ messageSocket: messageSocketEndpoint
103
+ };
105
104
  }
106
105
  function isWatchEnabled() {
107
106
  if (_env.env.CI) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport { MetroDevServerOptions } from '@expo/dev-server';\nimport chalk from 'chalk';\nimport http from 'http';\nimport Metro from 'metro';\nimport { Terminal } from 'metro-core';\n\nimport { Log } from '../../../log';\nimport { getMetroProperties } from '../../../utils/analytics/getMetroProperties';\nimport { createDebuggerTelemetryMiddleware } from '../../../utils/analytics/metroDebuggerMiddleware';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { env } from '../../../utils/env';\nimport { createDevServerMiddleware } from '../middleware/createDevServerMiddleware';\nimport { getPlatformBundlers } from '../platformBundlers';\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { createInspectorProxy } from './inspector-proxy';\nimport { importExpoMetroConfigFromProject, importMetroFromProject } from './resolveFromProject';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\n\n// From expo/dev-server but with ability to use custom logger.\ntype MessageSocket = {\n broadcast: (method: string, params?: Record<string, any> | undefined) => void;\n};\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: Omit<MetroDevServerOptions, 'logger'>\n): Promise<{\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n let reportEvent: ((event: any) => void) | undefined;\n\n const Metro = importMetroFromProject(projectRoot);\n const ExpoMetroConfig = importExpoMetroConfigFromProject(projectRoot);\n\n const terminal = new Terminal(process.stdout);\n const terminalReporter = new MetroTerminalReporter(projectRoot, terminal);\n\n const reporter = {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n };\n\n let metroConfig = await ExpoMetroConfig.loadAsync(projectRoot, { reporter, ...options });\n\n // TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.\n const { exp } = getConfig(projectRoot, {\n skipSDKVersionRequirement: true,\n skipPlugins: true,\n });\n\n const platformBundlers = getPlatformBundlers(exp);\n metroConfig = await withMetroMultiPlatformAsync(projectRoot, metroConfig, platformBundlers);\n\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, metroConfig));\n\n const {\n middleware,\n attachToServer,\n\n // New\n websocketEndpoints,\n eventsSocketEndpoint,\n messageSocketEndpoint,\n } = createDevServerMiddleware(projectRoot, {\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n // @ts-ignore can't mutate readonly config\n metroConfig.server.enhanceMiddleware = (metroMiddleware: any, server: Metro.Server) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n // Create the custom inspector proxy only when enabled and opt-in\n const inspectorProxy =\n metroConfig.server.runInspectorProxy && env.EXPO_USE_CUSTOM_INSPECTOR_PROXY\n ? createInspectorProxy(metroBundler, metroBundler.projectRoot)\n : null;\n\n if (inspectorProxy) {\n // @ts-expect-error Property is read-only, but we need to disable it\n metroConfig.server.runInspectorProxy = false;\n }\n\n middleware.use(createDebuggerTelemetryMiddleware(projectRoot, exp));\n\n const server = await Metro.runServer(metroConfig, {\n hmrEnabled: true,\n websocketEndpoints: {\n ...websocketEndpoints,\n ...(inspectorProxy ? inspectorProxy.createWebSocketListeners() : {}),\n },\n // @ts-expect-error Property was added in 0.73.4, remove this statement when updating Metro\n watch: isWatchEnabled(),\n });\n\n // Hook the inspector proxy in the Metro server\n if (inspectorProxy) {\n inspectorProxy.setServerAddress(server);\n middleware.use(inspectorProxy.processRequest);\n }\n\n if (attachToServer) {\n // Expo SDK 44 and lower\n const { messageSocket, eventsSocket } = attachToServer(server);\n reportEvent = eventsSocket.reportEvent;\n\n return {\n server,\n middleware,\n messageSocket,\n };\n } else {\n // RN +68 -- Expo SDK +45\n reportEvent = eventsSocketEndpoint.reportEvent;\n\n return {\n server,\n middleware,\n messageSocket: messageSocketEndpoint,\n };\n }\n}\n\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["instantiateMetroAsync","isWatchEnabled","metroBundler","options","projectRoot","reportEvent","Metro","importMetroFromProject","ExpoMetroConfig","importExpoMetroConfigFromProject","terminal","Terminal","process","stdout","terminalReporter","MetroTerminalReporter","reporter","update","event","metroConfig","loadAsync","exp","getConfig","skipSDKVersionRequirement","skipPlugins","platformBundlers","getPlatformBundlers","withMetroMultiPlatformAsync","logEventAsync","getMetroProperties","middleware","attachToServer","websocketEndpoints","eventsSocketEndpoint","messageSocketEndpoint","createDevServerMiddleware","port","server","watchFolders","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","inspectorProxy","runInspectorProxy","env","EXPO_USE_CUSTOM_INSPECTOR_PROXY","createInspectorProxy","createDebuggerTelemetryMiddleware","runServer","hmrEnabled","createWebSocketListeners","watch","setServerAddress","processRequest","messageSocket","eventsSocket","CI","Log","log","chalk"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/instantiateMetro.ts"],"sourcesContent":["import { ExpoConfig, getConfig } from '@expo/config';\nimport { MetroDevServerOptions } from '@expo/dev-server';\nimport type { LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport http from 'http';\nimport type Metro from 'metro';\nimport { Terminal } from 'metro-core';\n\nimport { Log } from '../../../log';\nimport { getMetroProperties } from '../../../utils/analytics/getMetroProperties';\nimport { createDebuggerTelemetryMiddleware } from '../../../utils/analytics/metroDebuggerMiddleware';\nimport { logEventAsync } from '../../../utils/analytics/rudderstackClient';\nimport { env } from '../../../utils/env';\nimport { getMetroServerRoot } from '../middleware/ManifestMiddleware';\nimport { createDevServerMiddleware } from '../middleware/createDevServerMiddleware';\nimport { getPlatformBundlers } from '../platformBundlers';\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { MetroTerminalReporter } from './MetroTerminalReporter';\nimport { importExpoMetroConfig } from './resolveFromProject';\nimport { getRouterDirectory } from './router';\nimport { runServer } from './runServer-fork';\nimport { withMetroMultiPlatformAsync } from './withMetroMultiPlatform';\n\n// From expo/dev-server but with ability to use custom logger.\ntype MessageSocket = {\n broadcast: (method: string, params?: Record<string, any> | undefined) => void;\n};\n\nexport async function loadMetroConfigAsync(\n projectRoot: string,\n options: LoadOptions,\n {\n exp = getConfig(projectRoot, { skipSDKVersionRequirement: true, skipPlugins: true }).exp,\n }: { exp?: ExpoConfig } = {}\n) {\n let reportEvent: ((event: any) => void) | undefined;\n const serverRoot = getMetroServerRoot(projectRoot);\n\n const terminal = new Terminal(process.stdout);\n const terminalReporter = new MetroTerminalReporter(serverRoot, terminal);\n\n const reporter = {\n update(event: any) {\n terminalReporter.update(event);\n if (reportEvent) {\n reportEvent(event);\n }\n },\n };\n\n const ExpoMetroConfig = importExpoMetroConfig(projectRoot);\n let config = await ExpoMetroConfig.loadAsync(projectRoot, { reporter, ...options });\n\n const platformBundlers = getPlatformBundlers(exp);\n\n config = await withMetroMultiPlatformAsync(projectRoot, {\n routerDirectory: exp.extra?.router?.unstable_src ?? getRouterDirectory(projectRoot),\n config,\n platformBundlers,\n isTsconfigPathsEnabled: !!exp.experiments?.tsconfigPaths,\n webOutput: exp.web?.output ?? 'single',\n });\n\n logEventAsync('metro config', getMetroProperties(projectRoot, exp, config));\n\n return {\n config,\n setEventReporter: (logger: (event: any) => void) => (reportEvent = logger),\n reporter: terminalReporter,\n };\n}\n\n/** The most generic possible setup for Metro bundler. */\nexport async function instantiateMetroAsync(\n metroBundler: MetroBundlerDevServer,\n options: Omit<MetroDevServerOptions, 'logger'>\n): Promise<{\n metro: Metro.Server;\n server: http.Server;\n middleware: any;\n messageSocket: MessageSocket;\n}> {\n const projectRoot = metroBundler.projectRoot;\n\n // TODO: When we bring expo/metro-config into the expo/expo repo, then we can upstream this.\n const { exp } = getConfig(projectRoot, {\n skipSDKVersionRequirement: true,\n skipPlugins: true,\n });\n\n const { config: metroConfig, setEventReporter } = await loadMetroConfigAsync(\n projectRoot,\n options,\n { exp }\n );\n\n const { middleware, websocketEndpoints, eventsSocketEndpoint, messageSocketEndpoint } =\n createDevServerMiddleware(projectRoot, {\n port: metroConfig.server.port,\n watchFolders: metroConfig.watchFolders,\n });\n\n const customEnhanceMiddleware = metroConfig.server.enhanceMiddleware;\n // @ts-expect-error: can't mutate readonly config\n metroConfig.server.enhanceMiddleware = (metroMiddleware: any, server: Metro.Server) => {\n if (customEnhanceMiddleware) {\n metroMiddleware = customEnhanceMiddleware(metroMiddleware, server);\n }\n return middleware.use(metroMiddleware);\n };\n\n middleware.use(createDebuggerTelemetryMiddleware(projectRoot, exp));\n\n const { server, metro } = await runServer(metroBundler, metroConfig, {\n hmrEnabled: true,\n // @ts-expect-error: Inconsistent `websocketEndpoints` type between metro and @react-native-community/cli-server-api\n websocketEndpoints,\n watch: isWatchEnabled(),\n });\n\n setEventReporter(eventsSocketEndpoint.reportEvent);\n\n return {\n metro,\n server,\n middleware,\n messageSocket: messageSocketEndpoint,\n };\n}\n\n/**\n * Simplify and communicate if Metro is running without watching file updates,.\n * Exposed for testing.\n */\nexport function isWatchEnabled() {\n if (env.CI) {\n Log.log(\n chalk`Metro is running in CI mode, reloads are disabled. Remove {bold CI=true} to enable watch mode.`\n );\n }\n\n return !env.CI;\n}\n"],"names":["loadMetroConfigAsync","instantiateMetroAsync","isWatchEnabled","projectRoot","options","exp","getConfig","skipSDKVersionRequirement","skipPlugins","reportEvent","serverRoot","getMetroServerRoot","terminal","Terminal","process","stdout","terminalReporter","MetroTerminalReporter","reporter","update","event","ExpoMetroConfig","importExpoMetroConfig","config","loadAsync","platformBundlers","getPlatformBundlers","withMetroMultiPlatformAsync","routerDirectory","extra","router","unstable_src","getRouterDirectory","isTsconfigPathsEnabled","experiments","tsconfigPaths","webOutput","web","output","logEventAsync","getMetroProperties","setEventReporter","logger","metroBundler","metroConfig","middleware","websocketEndpoints","eventsSocketEndpoint","messageSocketEndpoint","createDevServerMiddleware","port","server","watchFolders","customEnhanceMiddleware","enhanceMiddleware","metroMiddleware","use","createDebuggerTelemetryMiddleware","metro","runServer","hmrEnabled","watch","messageSocket","env","CI","Log","log","chalk"],"mappings":"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"}