@expo/cli 1.0.0-canary-20250722-599a28f → 54.0.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 (133) hide show
  1. package/build/bin/cli +1 -1
  2. package/build/metro-require/require.js +24 -13
  3. package/build/src/api/getExpoSchema.js +8 -7
  4. package/build/src/api/getExpoSchema.js.map +1 -1
  5. package/build/src/expoUpdatesExports.js +28 -0
  6. package/build/src/expoUpdatesExports.js.map +1 -0
  7. package/build/src/export/embed/exportEmbedAsync.js +26 -25
  8. package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
  9. package/build/src/export/embed/resolveOptions.js +1 -1
  10. package/build/src/export/embed/resolveOptions.js.map +1 -1
  11. package/build/src/export/exportApp.js +7 -4
  12. package/build/src/export/exportApp.js.map +1 -1
  13. package/build/src/export/exportAssets.js +20 -4
  14. package/build/src/export/exportAssets.js.map +1 -1
  15. package/build/src/export/exportAsync.js +2 -2
  16. package/build/src/export/exportAsync.js.map +1 -1
  17. package/build/src/export/exportHermes.js +34 -9
  18. package/build/src/export/exportHermes.js.map +1 -1
  19. package/build/src/export/exportStaticAsync.js +23 -2
  20. package/build/src/export/exportStaticAsync.js.map +1 -1
  21. package/build/src/export/index.js +1 -0
  22. package/build/src/export/index.js.map +1 -1
  23. package/build/src/export/metroAssetLocalPath.js.map +1 -1
  24. package/build/src/export/persistMetroAssets.js.map +1 -1
  25. package/build/src/export/resolveOptions.js +1 -0
  26. package/build/src/export/resolveOptions.js.map +1 -1
  27. package/build/src/export/saveAssets.js +12 -0
  28. package/build/src/export/saveAssets.js.map +1 -1
  29. package/build/src/install/checkPackages.js +9 -1
  30. package/build/src/install/checkPackages.js.map +1 -1
  31. package/build/src/lint/lintAsync.js +2 -0
  32. package/build/src/lint/lintAsync.js.map +1 -1
  33. package/build/src/prebuild/prebuildAsync.js +18 -0
  34. package/build/src/prebuild/prebuildAsync.js.map +1 -1
  35. package/build/src/prebuild/resolveLocalTemplate.js +42 -0
  36. package/build/src/prebuild/resolveLocalTemplate.js.map +1 -0
  37. package/build/src/prebuild/resolveTemplate.js +17 -7
  38. package/build/src/prebuild/resolveTemplate.js.map +1 -1
  39. package/build/src/prebuild/updateFromTemplate.js +1 -0
  40. package/build/src/prebuild/updateFromTemplate.js.map +1 -1
  41. package/build/src/prebuild/updatePackageJson.js +5 -3
  42. package/build/src/prebuild/updatePackageJson.js.map +1 -1
  43. package/build/src/run/android/resolveOptions.js +2 -2
  44. package/build/src/run/android/resolveOptions.js.map +1 -1
  45. package/build/src/run/ios/options/resolveOptions.js +2 -2
  46. package/build/src/run/ios/options/resolveOptions.js.map +1 -1
  47. package/build/src/run/ios/runIosAsync.js +3 -0
  48. package/build/src/run/ios/runIosAsync.js.map +1 -1
  49. package/build/src/serve/serveAsync.js +5 -2
  50. package/build/src/serve/serveAsync.js.map +1 -1
  51. package/build/src/start/platforms/ExpoGoInstaller.js +1 -1
  52. package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
  53. package/build/src/start/server/DevToolsPluginManager.js +7 -35
  54. package/build/src/start/server/DevToolsPluginManager.js.map +1 -1
  55. package/build/src/start/server/metro/MetroBundlerDevServer.js +88 -56
  56. package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
  57. package/build/src/start/server/metro/MetroTerminalReporter.js +66 -25
  58. package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
  59. package/build/src/start/server/metro/TerminalReporter.js +6 -6
  60. package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
  61. package/build/src/start/server/metro/createExpoAutolinkingResolver.js +121 -0
  62. package/build/src/start/server/metro/createExpoAutolinkingResolver.js.map +1 -0
  63. package/build/src/start/server/metro/createExpoFallbackResolver.js +1 -0
  64. package/build/src/start/server/metro/createExpoFallbackResolver.js.map +1 -1
  65. package/build/src/start/server/metro/createExpoMetroResolver.js.map +1 -1
  66. package/build/src/start/server/metro/createJResolver.js.map +1 -1
  67. package/build/src/start/server/metro/createServerComponentsMiddleware.js +4 -4
  68. package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
  69. package/build/src/start/server/metro/createServerRouteMiddleware.js +54 -8
  70. package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
  71. package/build/src/start/server/metro/debugging/attachAtlas.js +2 -0
  72. package/build/src/start/server/metro/debugging/attachAtlas.js.map +1 -1
  73. package/build/src/start/server/metro/dev-server/createMetroMiddleware.js +1 -1
  74. package/build/src/start/server/metro/dev-server/createMetroMiddleware.js.map +1 -1
  75. package/build/src/start/server/metro/fetchRouterManifest.js +1 -0
  76. package/build/src/start/server/metro/fetchRouterManifest.js.map +1 -1
  77. package/build/src/start/server/metro/formatFileCandidates.js.map +1 -1
  78. package/build/src/start/server/metro/getCssModulesFromBundler.js +10 -9
  79. package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -1
  80. package/build/src/start/server/metro/instantiateMetro.js +44 -40
  81. package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
  82. package/build/src/start/server/metro/metroErrorInterface.js +79 -12
  83. package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
  84. package/build/src/start/server/metro/metroVirtualModules.js.map +1 -1
  85. package/build/src/start/server/metro/metroWatchTypeScriptFiles.js.map +1 -1
  86. package/build/src/start/server/metro/router.js +75 -0
  87. package/build/src/start/server/metro/router.js.map +1 -1
  88. package/build/src/start/server/metro/runServer-fork.js +19 -19
  89. package/build/src/start/server/metro/runServer-fork.js.map +1 -1
  90. package/build/src/start/server/metro/serializeHtml.js +45 -5
  91. package/build/src/start/server/metro/serializeHtml.js.map +1 -1
  92. package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -1
  93. package/build/src/start/server/metro/withMetroErrorReportingResolver.js +267 -0
  94. package/build/src/start/server/metro/withMetroErrorReportingResolver.js.map +1 -0
  95. package/build/src/start/server/metro/withMetroMultiPlatform.js +58 -82
  96. package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
  97. package/build/src/start/server/metro/withMetroResolvers.js +2 -219
  98. package/build/src/start/server/metro/withMetroResolvers.js.map +1 -1
  99. package/build/src/start/server/metro/withMetroSupervisingTransformWorker.js +63 -0
  100. package/build/src/start/server/metro/withMetroSupervisingTransformWorker.js.map +1 -0
  101. package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js +1 -1
  102. package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js.map +1 -1
  103. package/build/src/start/server/middleware/metroOptions.js +7 -2
  104. package/build/src/start/server/middleware/metroOptions.js.map +1 -1
  105. package/build/src/start/server/middleware/resolvePlatform.js +3 -0
  106. package/build/src/start/server/middleware/resolvePlatform.js.map +1 -1
  107. package/build/src/start/server/serverLogLikeMetro.js +13 -11
  108. package/build/src/start/server/serverLogLikeMetro.js.map +1 -1
  109. package/build/src/start/server/type-generation/routes.js.map +1 -1
  110. package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
  111. package/build/src/types.d.ts +2 -0
  112. package/build/src/utils/build-cache-providers/index.js.map +1 -1
  113. package/build/src/utils/dir.js +7 -0
  114. package/build/src/utils/dir.js.map +1 -1
  115. package/build/src/utils/env.js +9 -4
  116. package/build/src/utils/env.js.map +1 -1
  117. package/build/src/utils/errors.js +1 -1
  118. package/build/src/utils/errors.js.map +1 -1
  119. package/build/src/utils/git.js +2 -2
  120. package/build/src/utils/git.js.map +1 -1
  121. package/build/src/utils/telemetry/clients/FetchClient.js +1 -1
  122. package/build/src/utils/telemetry/utils/context.js +1 -1
  123. package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +1 -1
  124. package/internal/unstable-expo-updates-exports.d.ts +31 -0
  125. package/internal/unstable-expo-updates-exports.js +3 -0
  126. package/package.json +33 -17
  127. package/static/template/[...rsc]+api.ts +1 -1
  128. package/build/src/start/server/metro/createExpoStickyResolver.js +0 -137
  129. package/build/src/start/server/metro/createExpoStickyResolver.js.map +0 -1
  130. package/build/src/start/server/metro/metroPrivateServer.js +0 -28
  131. package/build/src/start/server/metro/metroPrivateServer.js.map +0 -1
  132. package/build/src/utils/jsonSchemaDeref.js +0 -150
  133. package/build/src/utils/jsonSchemaDeref.js.map +0 -1
@@ -17,9 +17,6 @@ _export(exports, {
17
17
  getDefaultMetroResolver: function() {
18
18
  return getDefaultMetroResolver;
19
19
  },
20
- withMetroErrorReportingResolver: function() {
21
- return withMetroErrorReportingResolver;
22
- },
23
20
  withMetroMutatedResolverContext: function() {
24
21
  return withMetroMutatedResolverContext;
25
22
  },
@@ -27,86 +24,20 @@ _export(exports, {
27
24
  return withMetroResolvers;
28
25
  }
29
26
  });
30
- function _chalk() {
31
- const data = /*#__PURE__*/ _interop_require_default(require("chalk"));
32
- _chalk = function() {
33
- return data;
34
- };
35
- return data;
36
- }
37
27
  function _metroresolver() {
38
- const data = /*#__PURE__*/ _interop_require_wildcard(require("metro-resolver"));
28
+ const data = require("@expo/metro/metro-resolver");
39
29
  _metroresolver = function() {
40
30
  return data;
41
31
  };
42
32
  return data;
43
33
  }
44
- function _path() {
45
- const data = /*#__PURE__*/ _interop_require_default(require("path"));
46
- _path = function() {
47
- return data;
48
- };
49
- return data;
50
- }
51
34
  const _metroErrors = require("./metroErrors");
52
- const _env = require("../../../utils/env");
53
- function _interop_require_default(obj) {
54
- return obj && obj.__esModule ? obj : {
55
- default: obj
56
- };
57
- }
58
- function _getRequireWildcardCache(nodeInterop) {
59
- if (typeof WeakMap !== "function") return null;
60
- var cacheBabelInterop = new WeakMap();
61
- var cacheNodeInterop = new WeakMap();
62
- return (_getRequireWildcardCache = function(nodeInterop) {
63
- return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
64
- })(nodeInterop);
65
- }
66
- function _interop_require_wildcard(obj, nodeInterop) {
67
- if (!nodeInterop && obj && obj.__esModule) {
68
- return obj;
69
- }
70
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
71
- return {
72
- default: obj
73
- };
74
- }
75
- var cache = _getRequireWildcardCache(nodeInterop);
76
- if (cache && cache.has(obj)) {
77
- return cache.get(obj);
78
- }
79
- var newObj = {
80
- __proto__: null
81
- };
82
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
83
- for(var key in obj){
84
- if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
85
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
86
- if (desc && (desc.get || desc.set)) {
87
- Object.defineProperty(newObj, key, desc);
88
- } else {
89
- newObj[key] = obj[key];
90
- }
91
- }
92
- }
93
- newObj.default = obj;
94
- if (cache) {
95
- cache.set(obj, newObj);
96
- }
97
- return newObj;
98
- }
99
35
  const debug = require('debug')('expo:metro:withMetroResolvers');
100
36
  function getDefaultMetroResolver(projectRoot) {
101
37
  return (context, moduleName, platform)=>{
102
- return _metroresolver().resolve(context, moduleName, platform);
38
+ return (0, _metroresolver().resolve)(context, moduleName, platform);
103
39
  };
104
40
  }
105
- function optionsKeyForContext(context) {
106
- const canonicalize = require('metro-core/src/canonicalize');
107
- // Compound key for the resolver cache
108
- return JSON.stringify(context.customResolverOptions ?? {}, canonicalize) ?? '';
109
- }
110
41
  function withMetroResolvers(config, inputResolvers) {
111
42
  var _config_resolver, _config_resolver1;
112
43
  const resolvers = inputResolvers.filter((x)=>x != null);
@@ -175,153 +106,5 @@ function withMetroMutatedResolverContext(config, getContext) {
175
106
  }
176
107
  };
177
108
  }
178
- function withMetroErrorReportingResolver(config) {
179
- var _config_resolver;
180
- if (!_env.env.EXPO_METRO_UNSTABLE_ERRORS) {
181
- return config;
182
- }
183
- const originalResolveRequest = (_config_resolver = config.resolver) == null ? void 0 : _config_resolver.resolveRequest;
184
- function mutateResolutionError(error, context, moduleName, platform) {
185
- var _config_server;
186
- const inputPlatform = platform ?? 'null';
187
- const mapByOrigin = depGraph.get(optionsKeyForContext(context));
188
- const mapByPlatform = mapByOrigin == null ? void 0 : mapByOrigin.get(inputPlatform);
189
- if (!mapByPlatform) {
190
- return error;
191
- }
192
- // collect all references inversely using some expensive lookup
193
- const getReferences = (origin)=>{
194
- const inverseOrigin = [];
195
- if (!mapByPlatform) {
196
- return inverseOrigin;
197
- }
198
- for (const [originKey, mapByTarget] of mapByPlatform){
199
- // search comparing origin to path
200
- const found = [
201
- ...mapByTarget.values()
202
- ].find((resolution)=>resolution.path === origin);
203
- if (found) {
204
- inverseOrigin.push({
205
- origin,
206
- previous: originKey,
207
- request: found.request
208
- });
209
- }
210
- }
211
- return inverseOrigin;
212
- };
213
- const pad = (num)=>{
214
- return new Array(num).fill(' ').join('');
215
- };
216
- const root = ((_config_server = config.server) == null ? void 0 : _config_server.unstable_serverRoot) ?? config.projectRoot;
217
- const recurseBackWithLimit = (req, limit, count = 0)=>{
218
- const results = {
219
- origin: req.origin,
220
- request: req.request,
221
- previous: []
222
- };
223
- if (count >= limit) {
224
- return results;
225
- }
226
- const inverse = getReferences(req.origin);
227
- for (const match of inverse){
228
- // Use more qualified name if possible
229
- // results.origin = match.origin;
230
- // Found entry point
231
- if (req.origin === match.previous) {
232
- continue;
233
- }
234
- results.previous.push(recurseBackWithLimit({
235
- origin: match.previous,
236
- request: match.request
237
- }, limit, count + 1));
238
- }
239
- return results;
240
- };
241
- const inverseTree = recurseBackWithLimit({
242
- origin: context.originModulePath,
243
- request: moduleName
244
- }, // TODO: Do we need to expose this?
245
- 35);
246
- if (inverseTree.previous.length > 0) {
247
- debug('Found inverse graph:', JSON.stringify(inverseTree, null, 2));
248
- let extraMessage = _chalk().default.bold('Import stack:');
249
- const printRecursive = (tree, depth = 0)=>{
250
- let filename = _path().default.relative(root, tree.origin);
251
- if (filename.match(/\?ctx=[\w\d]+$/)) {
252
- filename = filename.replace(/\?ctx=[\w\d]+$/, _chalk().default.dim(' (require.context)'));
253
- } else {
254
- let formattedRequest = _chalk().default.green(`"${tree.request}"`);
255
- if (// If bundling for web and the import is pulling internals from outside of react-native
256
- // then mark it as an invalid import.
257
- inputPlatform === 'web' && !/^(node_modules\/)?react-native\//.test(filename) && tree.request.match(/^react-native\/.*/)) {
258
- formattedRequest = formattedRequest + (0, _chalk().default)`\n {yellow Importing react-native internals is not supported on web.}`;
259
- }
260
- filename = filename + (0, _chalk().default)`\n{gray |} {cyan import} ${formattedRequest}\n`;
261
- }
262
- let line = '\n' + pad(depth) + _chalk().default.gray(' ') + filename;
263
- if (filename.match(/node_modules/)) {
264
- line = _chalk().default.gray(// Bold the node module name
265
- line.replace(/node_modules\/([^/]+)/, (_match, p1)=>{
266
- return 'node_modules/' + _chalk().default.bold(p1);
267
- }));
268
- }
269
- extraMessage += line;
270
- for (const child of tree.previous){
271
- printRecursive(child, // Only add depth if there are multiple children
272
- tree.previous.length > 1 ? depth + 1 : depth);
273
- }
274
- };
275
- printRecursive(inverseTree);
276
- debug('inverse graph message:', extraMessage);
277
- // @ts-expect-error
278
- error._expoImportStack = extraMessage;
279
- } else {
280
- debug('Found no inverse tree for:', context.originModulePath);
281
- }
282
- return error;
283
- }
284
- const depGraph = new Map();
285
- return {
286
- ...config,
287
- resolver: {
288
- ...config.resolver,
289
- resolveRequest (context, moduleName, platform) {
290
- const storeResult = (res)=>{
291
- const inputPlatform = platform ?? 'null';
292
- const key = optionsKeyForContext(context);
293
- if (!depGraph.has(key)) depGraph.set(key, new Map());
294
- const mapByTarget = depGraph.get(key);
295
- if (!mapByTarget.has(inputPlatform)) mapByTarget.set(inputPlatform, new Map());
296
- const mapByPlatform = mapByTarget.get(inputPlatform);
297
- if (!mapByPlatform.has(context.originModulePath)) mapByPlatform.set(context.originModulePath, new Set());
298
- const setForModule = mapByPlatform.get(context.originModulePath);
299
- const qualifiedModuleName = (res == null ? void 0 : res.type) === 'sourceFile' ? res.filePath : moduleName;
300
- setForModule.add({
301
- path: qualifiedModuleName,
302
- request: moduleName
303
- });
304
- };
305
- // If the user defined a resolver, run it first and depend on the documented
306
- // chaining logic: https://facebook.github.io/metro/docs/resolution/#resolution-algorithm
307
- //
308
- // config.resolver.resolveRequest = (context, moduleName, platform) => {
309
- //
310
- // // Do work...
311
- //
312
- // return context.resolveRequest(context, moduleName, platform);
313
- // };
314
- try {
315
- const firstResolver = originalResolveRequest ?? context.resolveRequest;
316
- const res = firstResolver(context, moduleName, platform);
317
- storeResult(res);
318
- return res;
319
- } catch (error) {
320
- throw mutateResolutionError(error, context, moduleName, platform);
321
- }
322
- }
323
- }
324
- };
325
- }
326
109
 
327
110
  //# sourceMappingURL=withMetroResolvers.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/metro/withMetroResolvers.ts"],"sourcesContent":["/**\n * Copyright © 2022 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 chalk from 'chalk';\nimport { ConfigT as MetroConfig } from 'metro-config';\nimport type { ResolutionContext, CustomResolutionContext } from 'metro-resolver';\nimport * as metroResolver from 'metro-resolver';\nimport path from 'path';\n\nimport { isFailedToResolveNameError, isFailedToResolvePathError } from './metroErrors';\nimport { env } from '../../../utils/env';\n\nconst debug = require('debug')('expo:metro:withMetroResolvers') as typeof console.log;\n\nexport type MetroResolver = NonNullable<MetroConfig['resolver']['resolveRequest']>;\n\n/** Expo Metro Resolvers can return `null` to skip without throwing an error. Metro Resolvers will throw either a `FailedToResolveNameError` or `FailedToResolvePathError`. */\nexport type ExpoCustomMetroResolver = (\n ...args: Parameters<MetroResolver>\n) => ReturnType<MetroResolver> | null;\n\n/** @returns `MetroResolver` utilizing the upstream `resolve` method. */\nexport function getDefaultMetroResolver(projectRoot: string): MetroResolver {\n return (context: ResolutionContext, moduleName: string, platform: string | null) => {\n return metroResolver.resolve(context, moduleName, platform);\n };\n}\n\nfunction optionsKeyForContext(context: ResolutionContext) {\n const canonicalize = require('metro-core/src/canonicalize');\n\n // Compound key for the resolver cache\n return JSON.stringify(context.customResolverOptions ?? {}, canonicalize) ?? '';\n}\n\n/**\n * Extend the Metro config `resolver.resolveRequest` method with additional resolvers that can\n * exit early by returning a `Resolution` or skip to the next resolver by returning `null`.\n *\n * @param config Metro config.\n * @param resolvers custom MetroResolver to chain.\n * @returns a new `MetroConfig` with the `resolver.resolveRequest` method chained.\n */\nexport function withMetroResolvers(\n config: MetroConfig,\n inputResolvers: (ExpoCustomMetroResolver | undefined)[]\n): MetroConfig {\n const resolvers = inputResolvers.filter((x) => x != null);\n debug(\n `Appending ${\n resolvers.length\n } custom resolvers to Metro config. (has custom resolver: ${!!config.resolver?.resolveRequest})`\n );\n // const hasUserDefinedResolver = !!config.resolver?.resolveRequest;\n // const defaultResolveRequest = getDefaultMetroResolver(projectRoot);\n const originalResolveRequest = config.resolver?.resolveRequest;\n\n return {\n ...config,\n resolver: {\n ...config.resolver,\n resolveRequest(context, moduleName, platform) {\n const upstreamResolveRequest = context.resolveRequest;\n\n const universalContext = {\n ...context,\n resolveRequest(\n ctx: CustomResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n for (const resolver of resolvers) {\n try {\n const res = resolver(ctx, moduleName, platform);\n if (res) {\n return res;\n }\n } catch (error: any) {\n // If the error is directly related to a resolver not being able to resolve a module, then\n // we can ignore the error and try the next resolver. Otherwise, we should throw the error.\n const isResolutionError =\n isFailedToResolveNameError(error) || isFailedToResolvePathError(error);\n if (!isResolutionError) {\n throw error;\n }\n debug(\n `Custom resolver (${resolver.name || '<anonymous>'}) threw: ${error.constructor.name}. (module: ${moduleName}, platform: ${platform}, env: ${ctx.customResolverOptions?.environment}, origin: ${ctx.originModulePath})`\n );\n }\n }\n // If we haven't returned by now, use the original resolver or upstream resolver.\n return upstreamResolveRequest(ctx, moduleName, platform);\n },\n };\n\n // If the user defined a resolver, run it first and depend on the documented\n // chaining logic: https://facebook.github.io/metro/docs/resolution/#resolution-algorithm\n //\n // config.resolver.resolveRequest = (context, moduleName, platform) => {\n //\n // // Do work...\n //\n // return context.resolveRequest(context, moduleName, platform);\n // };\n const firstResolver = originalResolveRequest ?? universalContext.resolveRequest;\n return firstResolver(universalContext, moduleName, platform);\n },\n },\n };\n}\n\n/**\n * Hook into the Metro resolver chain and mutate the context so users can resolve against our custom assumptions.\n * For example, this will set `preferNativePlatform` to false when bundling for web.\n * */\nexport function withMetroMutatedResolverContext(\n config: MetroConfig,\n getContext: (\n ctx: CustomResolutionContext,\n moduleName: string,\n platform: string | null\n ) => CustomResolutionContext\n): MetroConfig {\n const defaultResolveRequest = getDefaultMetroResolver(config.projectRoot);\n const originalResolveRequest = config.resolver?.resolveRequest;\n\n return {\n ...config,\n resolver: {\n ...config.resolver,\n resolveRequest(context, moduleName, platform) {\n const universalContext = getContext(context, moduleName, platform);\n const firstResolver =\n originalResolveRequest ?? universalContext.resolveRequest ?? defaultResolveRequest;\n return firstResolver(universalContext, moduleName, platform);\n },\n },\n };\n}\n\nexport function withMetroErrorReportingResolver(config: MetroConfig): MetroConfig {\n if (!env.EXPO_METRO_UNSTABLE_ERRORS) {\n return config;\n }\n\n const originalResolveRequest = config.resolver?.resolveRequest;\n\n function mutateResolutionError(\n error: Error,\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n const inputPlatform = platform ?? 'null';\n\n const mapByOrigin = depGraph.get(optionsKeyForContext(context));\n const mapByPlatform = mapByOrigin?.get(inputPlatform);\n\n if (!mapByPlatform) {\n return error;\n }\n\n // collect all references inversely using some expensive lookup\n\n const getReferences = (origin: string) => {\n const inverseOrigin: { origin: string; previous: string; request: string }[] = [];\n\n if (!mapByPlatform) {\n return inverseOrigin;\n }\n\n for (const [originKey, mapByTarget] of mapByPlatform) {\n // search comparing origin to path\n\n const found = [...mapByTarget.values()].find((resolution) => resolution.path === origin);\n if (found) {\n inverseOrigin.push({\n origin,\n previous: originKey,\n request: found.request,\n });\n }\n }\n\n return inverseOrigin;\n };\n\n const pad = (num: number) => {\n return new Array(num).fill(' ').join('');\n };\n\n const root = config.server?.unstable_serverRoot ?? config.projectRoot;\n\n type InverseDepResult = {\n origin: string;\n request: string;\n previous: InverseDepResult[];\n };\n const recurseBackWithLimit = (\n req: { origin: string; request: string },\n limit: number,\n count: number = 0\n ) => {\n const results: InverseDepResult = {\n origin: req.origin,\n request: req.request,\n previous: [],\n };\n\n if (count >= limit) {\n return results;\n }\n\n const inverse = getReferences(req.origin);\n for (const match of inverse) {\n // Use more qualified name if possible\n // results.origin = match.origin;\n // Found entry point\n if (req.origin === match.previous) {\n continue;\n }\n results.previous.push(\n recurseBackWithLimit({ origin: match.previous, request: match.request }, limit, count + 1)\n );\n }\n return results;\n };\n\n const inverseTree = recurseBackWithLimit(\n { origin: context.originModulePath, request: moduleName },\n // TODO: Do we need to expose this?\n 35\n );\n\n if (inverseTree.previous.length > 0) {\n debug('Found inverse graph:', JSON.stringify(inverseTree, null, 2));\n let extraMessage = chalk.bold('Import stack:');\n const printRecursive = (tree: InverseDepResult, depth: number = 0) => {\n let filename = path.relative(root, tree.origin);\n if (filename.match(/\\?ctx=[\\w\\d]+$/)) {\n filename = filename.replace(/\\?ctx=[\\w\\d]+$/, chalk.dim(' (require.context)'));\n } else {\n let formattedRequest = chalk.green(`\"${tree.request}\"`);\n\n if (\n // If bundling for web and the import is pulling internals from outside of react-native\n // then mark it as an invalid import.\n inputPlatform === 'web' &&\n !/^(node_modules\\/)?react-native\\//.test(filename) &&\n tree.request.match(/^react-native\\/.*/)\n ) {\n formattedRequest =\n formattedRequest +\n chalk`\\n {yellow Importing react-native internals is not supported on web.}`;\n }\n\n filename = filename + chalk`\\n{gray |} {cyan import} ${formattedRequest}\\n`;\n }\n let line = '\\n' + pad(depth) + chalk.gray(' ') + filename;\n if (filename.match(/node_modules/)) {\n line = chalk.gray(\n // Bold the node module name\n line.replace(/node_modules\\/([^/]+)/, (_match, p1) => {\n return 'node_modules/' + chalk.bold(p1);\n })\n );\n }\n extraMessage += line;\n for (const child of tree.previous) {\n printRecursive(\n child,\n // Only add depth if there are multiple children\n tree.previous.length > 1 ? depth + 1 : depth\n );\n }\n };\n printRecursive(inverseTree);\n\n debug('inverse graph message:', extraMessage);\n\n // @ts-expect-error\n error._expoImportStack = extraMessage;\n } else {\n debug('Found no inverse tree for:', context.originModulePath);\n }\n\n return error;\n }\n\n const depGraph: Map<\n // custom options\n string,\n Map<\n // platform\n string,\n Map<\n // origin module name\n string,\n Set<{\n // required module name\n path: string;\n // This isn't entirely accurate since a module can be imported multiple times in a file,\n // and use different names. But it's good enough for now.\n request: string;\n }>\n >\n >\n > = new Map();\n\n return {\n ...config,\n resolver: {\n ...config.resolver,\n resolveRequest(context, moduleName, platform) {\n const storeResult = (res: NonNullable<ReturnType<ExpoCustomMetroResolver>>) => {\n const inputPlatform = platform ?? 'null';\n\n const key = optionsKeyForContext(context);\n if (!depGraph.has(key)) depGraph.set(key, new Map());\n const mapByTarget = depGraph.get(key);\n if (!mapByTarget!.has(inputPlatform)) mapByTarget!.set(inputPlatform, new Map());\n const mapByPlatform = mapByTarget!.get(inputPlatform);\n if (!mapByPlatform!.has(context.originModulePath))\n mapByPlatform!.set(context.originModulePath, new Set());\n const setForModule = mapByPlatform!.get(context.originModulePath)!;\n\n const qualifiedModuleName = res?.type === 'sourceFile' ? res.filePath : moduleName;\n setForModule.add({ path: qualifiedModuleName, request: moduleName });\n };\n\n // If the user defined a resolver, run it first and depend on the documented\n // chaining logic: https://facebook.github.io/metro/docs/resolution/#resolution-algorithm\n //\n // config.resolver.resolveRequest = (context, moduleName, platform) => {\n //\n // // Do work...\n //\n // return context.resolveRequest(context, moduleName, platform);\n // };\n try {\n const firstResolver = originalResolveRequest ?? context.resolveRequest;\n const res = firstResolver(context, moduleName, platform);\n storeResult(res);\n return res;\n } catch (error: any) {\n throw mutateResolutionError(error, context, moduleName, platform);\n }\n },\n },\n };\n}\n"],"names":["getDefaultMetroResolver","withMetroErrorReportingResolver","withMetroMutatedResolverContext","withMetroResolvers","debug","require","projectRoot","context","moduleName","platform","metroResolver","resolve","optionsKeyForContext","canonicalize","JSON","stringify","customResolverOptions","config","inputResolvers","resolvers","filter","x","length","resolver","resolveRequest","originalResolveRequest","upstreamResolveRequest","universalContext","ctx","res","error","isResolutionError","isFailedToResolveNameError","isFailedToResolvePathError","name","constructor","environment","originModulePath","firstResolver","getContext","defaultResolveRequest","env","EXPO_METRO_UNSTABLE_ERRORS","mutateResolutionError","inputPlatform","mapByOrigin","depGraph","get","mapByPlatform","getReferences","origin","inverseOrigin","originKey","mapByTarget","found","values","find","resolution","path","push","previous","request","pad","num","Array","fill","join","root","server","unstable_serverRoot","recurseBackWithLimit","req","limit","count","results","inverse","match","inverseTree","extraMessage","chalk","bold","printRecursive","tree","depth","filename","relative","replace","dim","formattedRequest","green","test","line","gray","_match","p1","child","_expoImportStack","Map","storeResult","key","has","set","Set","setForModule","qualifiedModuleName","type","filePath","add"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/withMetroResolvers.ts"],"sourcesContent":["/**\n * Copyright © 2022 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 type { ConfigT as MetroConfig } from '@expo/metro/metro-config';\nimport type {\n ResolutionContext,\n CustomResolutionContext,\n CustomResolver,\n} from '@expo/metro/metro-resolver';\nimport { resolve as metroResolver } from '@expo/metro/metro-resolver';\n\nimport { isFailedToResolveNameError, isFailedToResolvePathError } from './metroErrors';\n\nconst debug = require('debug')('expo:metro:withMetroResolvers') as typeof console.log;\n\nexport type { CustomResolver as MetroResolver };\n\n/** Expo Metro Resolvers can return `null` to skip without throwing an error. Metro Resolvers will throw either a `FailedToResolveNameError` or `FailedToResolvePathError`. */\nexport type ExpoCustomMetroResolver = (\n ...args: Parameters<CustomResolver>\n) => ReturnType<CustomResolver> | null;\n\n/** @returns `MetroResolver` utilizing the upstream `resolve` method. */\nexport function getDefaultMetroResolver(projectRoot: string): CustomResolver {\n return (context: ResolutionContext, moduleName: string, platform: string | null) => {\n return metroResolver(context, moduleName, platform);\n };\n}\n\n/**\n * Extend the Metro config `resolver.resolveRequest` method with additional resolvers that can\n * exit early by returning a `Resolution` or skip to the next resolver by returning `null`.\n *\n * @param config Metro config.\n * @param resolvers custom MetroResolver to chain.\n * @returns a new `MetroConfig` with the `resolver.resolveRequest` method chained.\n */\nexport function withMetroResolvers(\n config: MetroConfig,\n inputResolvers: (ExpoCustomMetroResolver | undefined)[]\n): MetroConfig {\n const resolvers = inputResolvers.filter((x) => x != null);\n debug(\n `Appending ${\n resolvers.length\n } custom resolvers to Metro config. (has custom resolver: ${!!config.resolver?.resolveRequest})`\n );\n // const hasUserDefinedResolver = !!config.resolver?.resolveRequest;\n // const defaultResolveRequest = getDefaultMetroResolver(projectRoot);\n const originalResolveRequest = config.resolver?.resolveRequest;\n\n return {\n ...config,\n resolver: {\n ...config.resolver,\n resolveRequest(context, moduleName, platform) {\n const upstreamResolveRequest = context.resolveRequest;\n\n const universalContext = {\n ...context,\n resolveRequest(\n ctx: CustomResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n for (const resolver of resolvers) {\n try {\n const res = resolver(ctx, moduleName, platform);\n if (res) {\n return res;\n }\n } catch (error: any) {\n // If the error is directly related to a resolver not being able to resolve a module, then\n // we can ignore the error and try the next resolver. Otherwise, we should throw the error.\n const isResolutionError =\n isFailedToResolveNameError(error) || isFailedToResolvePathError(error);\n if (!isResolutionError) {\n throw error;\n }\n debug(\n `Custom resolver (${resolver.name || '<anonymous>'}) threw: ${error.constructor.name}. (module: ${moduleName}, platform: ${platform}, env: ${ctx.customResolverOptions?.environment}, origin: ${ctx.originModulePath})`\n );\n }\n }\n // If we haven't returned by now, use the original resolver or upstream resolver.\n return upstreamResolveRequest(ctx, moduleName, platform);\n },\n };\n\n // If the user defined a resolver, run it first and depend on the documented\n // chaining logic: https://facebook.github.io/metro/docs/resolution/#resolution-algorithm\n //\n // config.resolver.resolveRequest = (context, moduleName, platform) => {\n //\n // // Do work...\n //\n // return context.resolveRequest(context, moduleName, platform);\n // };\n const firstResolver = originalResolveRequest ?? universalContext.resolveRequest;\n return firstResolver(universalContext, moduleName, platform);\n },\n },\n };\n}\n\n/**\n * Hook into the Metro resolver chain and mutate the context so users can resolve against our custom assumptions.\n * For example, this will set `preferNativePlatform` to false when bundling for web.\n * */\nexport function withMetroMutatedResolverContext(\n config: MetroConfig,\n getContext: (\n ctx: CustomResolutionContext,\n moduleName: string,\n platform: string | null\n ) => CustomResolutionContext\n): MetroConfig {\n const defaultResolveRequest = getDefaultMetroResolver(config.projectRoot);\n const originalResolveRequest = config.resolver?.resolveRequest;\n\n return {\n ...config,\n resolver: {\n ...config.resolver,\n resolveRequest(context, moduleName, platform) {\n const universalContext = getContext(context, moduleName, platform);\n const firstResolver =\n originalResolveRequest ?? universalContext.resolveRequest ?? defaultResolveRequest;\n return firstResolver(universalContext, moduleName, platform);\n },\n },\n };\n}\n"],"names":["getDefaultMetroResolver","withMetroMutatedResolverContext","withMetroResolvers","debug","require","projectRoot","context","moduleName","platform","metroResolver","config","inputResolvers","resolvers","filter","x","length","resolver","resolveRequest","originalResolveRequest","upstreamResolveRequest","universalContext","ctx","res","error","isResolutionError","isFailedToResolveNameError","isFailedToResolvePathError","name","constructor","customResolverOptions","environment","originModulePath","firstResolver","getContext","defaultResolveRequest"],"mappings":"AAAA;;;;;CAKC;;;;;;;;;;;IAqBeA,uBAAuB;eAAvBA;;IAsFAC,+BAA+B;eAA/BA;;IAxEAC,kBAAkB;eAAlBA;;;;yBA5ByB;;;;;;6BAE8B;AAEvE,MAAMC,QAAQC,QAAQ,SAAS;AAUxB,SAASJ,wBAAwBK,WAAmB;IACzD,OAAO,CAACC,SAA4BC,YAAoBC;QACtD,OAAOC,IAAAA,wBAAa,EAACH,SAASC,YAAYC;IAC5C;AACF;AAUO,SAASN,mBACdQ,MAAmB,EACnBC,cAAuD;QAMSD,kBAIjCA;IAR/B,MAAME,YAAYD,eAAeE,MAAM,CAAC,CAACC,IAAMA,KAAK;IACpDX,MACE,CAAC,UAAU,EACTS,UAAUG,MAAM,CACjB,yDAAyD,EAAE,CAAC,GAACL,mBAAAA,OAAOM,QAAQ,qBAAfN,iBAAiBO,cAAc,EAAC,CAAC,CAAC;IAElG,oEAAoE;IACpE,sEAAsE;IACtE,MAAMC,0BAAyBR,oBAAAA,OAAOM,QAAQ,qBAAfN,kBAAiBO,cAAc;IAE9D,OAAO;QACL,GAAGP,MAAM;QACTM,UAAU;YACR,GAAGN,OAAOM,QAAQ;YAClBC,gBAAeX,OAAO,EAAEC,UAAU,EAAEC,QAAQ;gBAC1C,MAAMW,yBAAyBb,QAAQW,cAAc;gBAErD,MAAMG,mBAAmB;oBACvB,GAAGd,OAAO;oBACVW,gBACEI,GAA4B,EAC5Bd,UAAkB,EAClBC,QAAuB;wBAEvB,KAAK,MAAMQ,YAAYJ,UAAW;4BAChC,IAAI;gCACF,MAAMU,MAAMN,SAASK,KAAKd,YAAYC;gCACtC,IAAIc,KAAK;oCACP,OAAOA;gCACT;4BACF,EAAE,OAAOC,OAAY;oCAS4HF;gCAR/I,0FAA0F;gCAC1F,2FAA2F;gCAC3F,MAAMG,oBACJC,IAAAA,uCAA0B,EAACF,UAAUG,IAAAA,uCAA0B,EAACH;gCAClE,IAAI,CAACC,mBAAmB;oCACtB,MAAMD;gCACR;gCACApB,MACE,CAAC,iBAAiB,EAAEa,SAASW,IAAI,IAAI,cAAc,SAAS,EAAEJ,MAAMK,WAAW,CAACD,IAAI,CAAC,WAAW,EAAEpB,WAAW,YAAY,EAAEC,SAAS,OAAO,GAAEa,6BAAAA,IAAIQ,qBAAqB,qBAAzBR,2BAA2BS,WAAW,CAAC,UAAU,EAAET,IAAIU,gBAAgB,CAAC,CAAC,CAAC;4BAE3N;wBACF;wBACA,iFAAiF;wBACjF,OAAOZ,uBAAuBE,KAAKd,YAAYC;oBACjD;gBACF;gBAEA,4EAA4E;gBAC5E,yFAAyF;gBACzF,EAAE;gBACF,wEAAwE;gBACxE,EAAE;gBACF,iBAAiB;gBACjB,EAAE;gBACF,iEAAiE;gBACjE,KAAK;gBACL,MAAMwB,gBAAgBd,0BAA0BE,iBAAiBH,cAAc;gBAC/E,OAAOe,cAAcZ,kBAAkBb,YAAYC;YACrD;QACF;IACF;AACF;AAMO,SAASP,gCACdS,MAAmB,EACnBuB,UAI4B;QAGGvB;IAD/B,MAAMwB,wBAAwBlC,wBAAwBU,OAAOL,WAAW;IACxE,MAAMa,0BAAyBR,mBAAAA,OAAOM,QAAQ,qBAAfN,iBAAiBO,cAAc;IAE9D,OAAO;QACL,GAAGP,MAAM;QACTM,UAAU;YACR,GAAGN,OAAOM,QAAQ;YAClBC,gBAAeX,OAAO,EAAEC,UAAU,EAAEC,QAAQ;gBAC1C,MAAMY,mBAAmBa,WAAW3B,SAASC,YAAYC;gBACzD,MAAMwB,gBACJd,0BAA0BE,iBAAiBH,cAAc,IAAIiB;gBAC/D,OAAOF,cAAcZ,kBAAkBb,YAAYC;YACrD;QACF;IACF;AACF"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "withMetroSupervisingTransformWorker", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return withMetroSupervisingTransformWorker;
9
+ }
10
+ });
11
+ function _metroconfig() {
12
+ const data = require("@expo/metro-config");
13
+ _metroconfig = function() {
14
+ return data;
15
+ };
16
+ return data;
17
+ }
18
+ const debug = require('debug')('expo:metro:withMetroSupervisingTransformWorker');
19
+ // The default babel transformer is either `@expo/metro-config/babel-transformer` set by the user
20
+ // or @expo/metro-config/build/babel-transformer
21
+ const defaultBabelTransformerPaths = [
22
+ require.resolve('@expo/metro-config/babel-transformer'),
23
+ require.resolve('@expo/metro-config/build/babel-transformer')
24
+ ];
25
+ function withMetroSupervisingTransformWorker(config) {
26
+ var _config_transformer, _config_transformer1;
27
+ // NOTE: This is usually a required property, but we don't always set it in mocks
28
+ const originalBabelTransformerPath = (_config_transformer = config.transformer) == null ? void 0 : _config_transformer.babelTransformerPath;
29
+ const originalTransformerPath = config.transformerPath;
30
+ const hasDefaultTransformerPath = originalTransformerPath === _metroconfig().unstable_transformerPath;
31
+ const hasDefaultBabelTransformerPath = !originalBabelTransformerPath || defaultBabelTransformerPaths.includes(originalBabelTransformerPath);
32
+ if (hasDefaultTransformerPath && hasDefaultBabelTransformerPath) {
33
+ return config;
34
+ }
35
+ // DEBUGGING: When set to false the supervisor is disabled for debugging
36
+ if (((_config_transformer1 = config.transformer) == null ? void 0 : _config_transformer1.expo_customTransformerPath) === false) {
37
+ debug('Skipping transform worker supervisor: transformer.expo_customTransformerPath is false');
38
+ return config;
39
+ }
40
+ // We modify the config if the user either has a custom transformerPath or
41
+ // a custom transformer.babelTransformerPath
42
+ // NOTE: It's not a bad thing if we load the superivising transformer even if
43
+ // we don't need to. It will do nothing to our transformer
44
+ if (!hasDefaultTransformerPath) {
45
+ debug('Detected customized "transformerPath"');
46
+ }
47
+ if (!hasDefaultBabelTransformerPath) {
48
+ debug('Detected customized "transformer.babelTransformerPath"');
49
+ }
50
+ debug('Applying transform worker supervisor to "transformerPath"');
51
+ return {
52
+ ...config,
53
+ transformerPath: _metroconfig().internal_supervisingTransformerPath,
54
+ transformer: {
55
+ ...config.transformer,
56
+ // Only pass the custom transformer path, if the user has set one, otherwise we're only applying
57
+ // the supervisor for the Babel transformer
58
+ expo_customTransformerPath: !hasDefaultTransformerPath ? originalTransformerPath : undefined
59
+ }
60
+ };
61
+ }
62
+
63
+ //# sourceMappingURL=withMetroSupervisingTransformWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/start/server/metro/withMetroSupervisingTransformWorker.ts"],"sourcesContent":["import type { ConfigT as MetroConfig } from '@expo/metro/metro-config';\nimport { unstable_transformerPath, internal_supervisingTransformerPath } from '@expo/metro-config';\n\nconst debug = require('debug')(\n 'expo:metro:withMetroSupervisingTransformWorker'\n) as typeof console.log;\n\ndeclare module '@expo/metro/metro-transform-worker' {\n export interface JsTransformerConfig {\n expo_customTransformerPath?: string | false;\n }\n}\n\n// The default babel transformer is either `@expo/metro-config/babel-transformer` set by the user\n// or @expo/metro-config/build/babel-transformer\nconst defaultBabelTransformerPaths = [\n require.resolve('@expo/metro-config/babel-transformer'),\n require.resolve('@expo/metro-config/build/babel-transformer'),\n];\n\n/** Adds a wrapper around a user's transformerPath or babelTransformerPath\n * @remarks\n * It's relatively common still for people to set custom transformerPath\n * or babelTransformerPaths. These are used to customize how files are transformed\n * and wrap around Expo's transformer/babel-transformer.\n *\n * This config override customizes them.\n * If a user has a custom transformer or babelTransformerPath set, we\n * first load the \"supervising transformer\"\n *\n * This is a transformer entrypoint that's always supposed to load first and\n * loads the user's custom transformer from `config.transformer.expo_customTransformerPath`\n * instead of `config.transformerPath`\n *\n * This supervisor has two tasks:\n * - It adds a try-catch. When the user's transformer fails to load, we output a better error message\n * - It forces the same versions of Metro and @expo/metro-config to load that we depend on\n * (unless threading is disabled, which makes this override unsafe)\n *\n * We do this because transformers and babel transformers *must not* use different\n * versions of Metro. This is unsupported and undefined behavior and will lead to\n * bugs and errors.\n */\nexport function withMetroSupervisingTransformWorker(config: MetroConfig): MetroConfig {\n // NOTE: This is usually a required property, but we don't always set it in mocks\n const originalBabelTransformerPath = config.transformer?.babelTransformerPath;\n const originalTransformerPath = config.transformerPath;\n\n const hasDefaultTransformerPath = originalTransformerPath === unstable_transformerPath;\n const hasDefaultBabelTransformerPath =\n !originalBabelTransformerPath ||\n defaultBabelTransformerPaths.includes(originalBabelTransformerPath);\n if (hasDefaultTransformerPath && hasDefaultBabelTransformerPath) {\n return config;\n }\n\n // DEBUGGING: When set to false the supervisor is disabled for debugging\n if (config.transformer?.expo_customTransformerPath === false) {\n debug('Skipping transform worker supervisor: transformer.expo_customTransformerPath is false');\n return config;\n }\n\n // We modify the config if the user either has a custom transformerPath or\n // a custom transformer.babelTransformerPath\n // NOTE: It's not a bad thing if we load the superivising transformer even if\n // we don't need to. It will do nothing to our transformer\n if (!hasDefaultTransformerPath) {\n debug('Detected customized \"transformerPath\"');\n }\n if (!hasDefaultBabelTransformerPath) {\n debug('Detected customized \"transformer.babelTransformerPath\"');\n }\n\n debug('Applying transform worker supervisor to \"transformerPath\"');\n return {\n ...config,\n transformerPath: internal_supervisingTransformerPath,\n transformer: {\n ...config.transformer,\n // Only pass the custom transformer path, if the user has set one, otherwise we're only applying\n // the supervisor for the Babel transformer\n expo_customTransformerPath: !hasDefaultTransformerPath ? originalTransformerPath : undefined,\n },\n };\n}\n"],"names":["withMetroSupervisingTransformWorker","debug","require","defaultBabelTransformerPaths","resolve","config","originalBabelTransformerPath","transformer","babelTransformerPath","originalTransformerPath","transformerPath","hasDefaultTransformerPath","unstable_transformerPath","hasDefaultBabelTransformerPath","includes","expo_customTransformerPath","internal_supervisingTransformerPath","undefined"],"mappings":";;;;+BA2CgBA;;;eAAAA;;;;yBA1C8D;;;;;;AAE9E,MAAMC,QAAQC,QAAQ,SACpB;AASF,iGAAiG;AACjG,gDAAgD;AAChD,MAAMC,+BAA+B;IACnCD,QAAQE,OAAO,CAAC;IAChBF,QAAQE,OAAO,CAAC;CACjB;AAyBM,SAASJ,oCAAoCK,MAAmB;QAEhCA,qBAYjCA;IAbJ,iFAAiF;IACjF,MAAMC,gCAA+BD,sBAAAA,OAAOE,WAAW,qBAAlBF,oBAAoBG,oBAAoB;IAC7E,MAAMC,0BAA0BJ,OAAOK,eAAe;IAEtD,MAAMC,4BAA4BF,4BAA4BG,uCAAwB;IACtF,MAAMC,iCACJ,CAACP,gCACDH,6BAA6BW,QAAQ,CAACR;IACxC,IAAIK,6BAA6BE,gCAAgC;QAC/D,OAAOR;IACT;IAEA,wEAAwE;IACxE,IAAIA,EAAAA,uBAAAA,OAAOE,WAAW,qBAAlBF,qBAAoBU,0BAA0B,MAAK,OAAO;QAC5Dd,MAAM;QACN,OAAOI;IACT;IAEA,0EAA0E;IAC1E,4CAA4C;IAC5C,6EAA6E;IAC7E,0DAA0D;IAC1D,IAAI,CAACM,2BAA2B;QAC9BV,MAAM;IACR;IACA,IAAI,CAACY,gCAAgC;QACnCZ,MAAM;IACR;IAEAA,MAAM;IACN,OAAO;QACL,GAAGI,MAAM;QACTK,iBAAiBM,kDAAmC;QACpDT,aAAa;YACX,GAAGF,OAAOE,WAAW;YACrB,gGAAgG;YAChG,2CAA2C;YAC3CQ,4BAA4B,CAACJ,4BAA4BF,0BAA0BQ;QACrF;IACF;AACF"}
@@ -20,7 +20,7 @@ _export(exports, {
20
20
  }
21
21
  });
22
22
  function _http() {
23
- const data = require("@expo/server/build/vendor/http");
23
+ const data = require("@expo/server/adapter/http");
24
24
  _http = function() {
25
25
  return data;
26
26
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/createBuiltinAPIRequestHandler.ts"],"sourcesContent":["import { convertRequest, RequestHandler, respond } from '@expo/server/build/vendor/http';\n\nimport type { ServerNext, ServerRequest, ServerResponse } from './server.types';\n\nexport function createBuiltinAPIRequestHandler(\n matchRequest: (request: Request) => boolean,\n handlers: Record<string, (req: Request) => Promise<Response>>\n): RequestHandler {\n return createRequestHandler((req) => {\n if (!matchRequest(req)) {\n winterNext();\n }\n const handler = handlers[req.method];\n if (!handler) {\n notAllowed();\n }\n return handler(req);\n });\n}\n\n/**\n * Returns a request handler for http that serves the response using Remix.\n */\nexport function createRequestHandler(\n handleRequest: (request: Request) => Promise<Response>\n): RequestHandler {\n return async (req: ServerRequest, res: ServerResponse, next: ServerNext) => {\n if (!req?.url || !req.method) {\n return next();\n }\n // These headers (added by other middleware) break the browser preview of RSC.\n res.removeHeader('X-Content-Type-Options');\n res.removeHeader('Cache-Control');\n res.removeHeader('Expires');\n res.removeHeader('Surrogate-Control');\n\n try {\n const request = convertRequest(req, res);\n const response = await handleRequest(request);\n return await respond(res, response);\n } catch (error: unknown) {\n if (error instanceof Error) {\n return await respond(\n res,\n new Response('Internal Server Error: ' + error.message, {\n status: 500,\n headers: {\n 'Content-Type': 'text/plain',\n },\n })\n );\n } else if (error instanceof Response) {\n return await respond(res, error);\n }\n // http doesn't support async functions, so we have to pass along the\n // error manually using next().\n // @ts-expect-error\n next(error);\n }\n };\n}\n\nfunction notAllowed(): never {\n throw new Response('Method Not Allowed', {\n status: 405,\n headers: {\n 'Content-Type': 'text/plain',\n },\n });\n}\n\nexport function winterNext(): never {\n // eslint-disable-next-line no-throw-literal\n throw undefined;\n}\n"],"names":["createBuiltinAPIRequestHandler","createRequestHandler","winterNext","matchRequest","handlers","req","handler","method","notAllowed","handleRequest","res","next","url","removeHeader","request","convertRequest","response","respond","error","Error","Response","message","status","headers","undefined"],"mappings":";;;;;;;;;;;IAIgBA,8BAA8B;eAA9BA;;IAmBAC,oBAAoB;eAApBA;;IAgDAC,UAAU;eAAVA;;;;yBAvEwC;;;;;;AAIjD,SAASF,+BACdG,YAA2C,EAC3CC,QAA6D;IAE7D,OAAOH,qBAAqB,CAACI;QAC3B,IAAI,CAACF,aAAaE,MAAM;YACtBH;QACF;QACA,MAAMI,UAAUF,QAAQ,CAACC,IAAIE,MAAM,CAAC;QACpC,IAAI,CAACD,SAAS;YACZE;QACF;QACA,OAAOF,QAAQD;IACjB;AACF;AAKO,SAASJ,qBACdQ,aAAsD;IAEtD,OAAO,OAAOJ,KAAoBK,KAAqBC;QACrD,IAAI,EAACN,uBAAAA,IAAKO,GAAG,KAAI,CAACP,IAAIE,MAAM,EAAE;YAC5B,OAAOI;QACT;QACA,8EAA8E;QAC9ED,IAAIG,YAAY,CAAC;QACjBH,IAAIG,YAAY,CAAC;QACjBH,IAAIG,YAAY,CAAC;QACjBH,IAAIG,YAAY,CAAC;QAEjB,IAAI;YACF,MAAMC,UAAUC,IAAAA,sBAAc,EAACV,KAAKK;YACpC,MAAMM,WAAW,MAAMP,cAAcK;YACrC,OAAO,MAAMG,IAAAA,eAAO,EAACP,KAAKM;QAC5B,EAAE,OAAOE,OAAgB;YACvB,IAAIA,iBAAiBC,OAAO;gBAC1B,OAAO,MAAMF,IAAAA,eAAO,EAClBP,KACA,IAAIU,SAAS,4BAA4BF,MAAMG,OAAO,EAAE;oBACtDC,QAAQ;oBACRC,SAAS;wBACP,gBAAgB;oBAClB;gBACF;YAEJ,OAAO,IAAIL,iBAAiBE,UAAU;gBACpC,OAAO,MAAMH,IAAAA,eAAO,EAACP,KAAKQ;YAC5B;YACA,qEAAqE;YACrE,+BAA+B;YAC/B,mBAAmB;YACnBP,KAAKO;QACP;IACF;AACF;AAEA,SAASV;IACP,MAAM,IAAIY,SAAS,sBAAsB;QACvCE,QAAQ;QACRC,SAAS;YACP,gBAAgB;QAClB;IACF;AACF;AAEO,SAASrB;IACd,4CAA4C;IAC5C,MAAMsB;AACR"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/createBuiltinAPIRequestHandler.ts"],"sourcesContent":["import { convertRequest, RequestHandler, respond } from '@expo/server/adapter/http';\n\nimport type { ServerNext, ServerRequest, ServerResponse } from './server.types';\n\nexport function createBuiltinAPIRequestHandler(\n matchRequest: (request: Request) => boolean,\n handlers: Record<string, (req: Request) => Promise<Response>>\n): RequestHandler {\n return createRequestHandler((req) => {\n if (!matchRequest(req)) {\n winterNext();\n }\n const handler = handlers[req.method];\n if (!handler) {\n notAllowed();\n }\n return handler(req);\n });\n}\n\n/**\n * Returns a request handler for http that serves the response using Remix.\n */\nexport function createRequestHandler(\n handleRequest: (request: Request) => Promise<Response>\n): RequestHandler {\n return async (req: ServerRequest, res: ServerResponse, next: ServerNext) => {\n if (!req?.url || !req.method) {\n return next();\n }\n // These headers (added by other middleware) break the browser preview of RSC.\n res.removeHeader('X-Content-Type-Options');\n res.removeHeader('Cache-Control');\n res.removeHeader('Expires');\n res.removeHeader('Surrogate-Control');\n\n try {\n const request = convertRequest(req, res);\n const response = await handleRequest(request);\n return await respond(res, response);\n } catch (error: unknown) {\n if (error instanceof Error) {\n return await respond(\n res,\n new Response('Internal Server Error: ' + error.message, {\n status: 500,\n headers: {\n 'Content-Type': 'text/plain',\n },\n })\n );\n } else if (error instanceof Response) {\n return await respond(res, error);\n }\n // http doesn't support async functions, so we have to pass along the\n // error manually using next().\n // @ts-expect-error\n next(error);\n }\n };\n}\n\nfunction notAllowed(): never {\n throw new Response('Method Not Allowed', {\n status: 405,\n headers: {\n 'Content-Type': 'text/plain',\n },\n });\n}\n\nexport function winterNext(): never {\n // eslint-disable-next-line no-throw-literal\n throw undefined;\n}\n"],"names":["createBuiltinAPIRequestHandler","createRequestHandler","winterNext","matchRequest","handlers","req","handler","method","notAllowed","handleRequest","res","next","url","removeHeader","request","convertRequest","response","respond","error","Error","Response","message","status","headers","undefined"],"mappings":";;;;;;;;;;;IAIgBA,8BAA8B;eAA9BA;;IAmBAC,oBAAoB;eAApBA;;IAgDAC,UAAU;eAAVA;;;;yBAvEwC;;;;;;AAIjD,SAASF,+BACdG,YAA2C,EAC3CC,QAA6D;IAE7D,OAAOH,qBAAqB,CAACI;QAC3B,IAAI,CAACF,aAAaE,MAAM;YACtBH;QACF;QACA,MAAMI,UAAUF,QAAQ,CAACC,IAAIE,MAAM,CAAC;QACpC,IAAI,CAACD,SAAS;YACZE;QACF;QACA,OAAOF,QAAQD;IACjB;AACF;AAKO,SAASJ,qBACdQ,aAAsD;IAEtD,OAAO,OAAOJ,KAAoBK,KAAqBC;QACrD,IAAI,EAACN,uBAAAA,IAAKO,GAAG,KAAI,CAACP,IAAIE,MAAM,EAAE;YAC5B,OAAOI;QACT;QACA,8EAA8E;QAC9ED,IAAIG,YAAY,CAAC;QACjBH,IAAIG,YAAY,CAAC;QACjBH,IAAIG,YAAY,CAAC;QACjBH,IAAIG,YAAY,CAAC;QAEjB,IAAI;YACF,MAAMC,UAAUC,IAAAA,sBAAc,EAACV,KAAKK;YACpC,MAAMM,WAAW,MAAMP,cAAcK;YACrC,OAAO,MAAMG,IAAAA,eAAO,EAACP,KAAKM;QAC5B,EAAE,OAAOE,OAAgB;YACvB,IAAIA,iBAAiBC,OAAO;gBAC1B,OAAO,MAAMF,IAAAA,eAAO,EAClBP,KACA,IAAIU,SAAS,4BAA4BF,MAAMG,OAAO,EAAE;oBACtDC,QAAQ;oBACRC,SAAS;wBACP,gBAAgB;oBAClB;gBACF;YAEJ,OAAO,IAAIL,iBAAiBE,UAAU;gBACpC,OAAO,MAAMH,IAAAA,eAAO,EAACP,KAAKQ;YAC5B;YACA,qEAAqE;YACrE,+BAA+B;YAC/B,mBAAmB;YACnBP,KAAKO;QACP;IACF;AACF;AAEA,SAASV;IACP,MAAM,IAAIY,SAAS,sBAAsB;QACvCE,QAAQ;QACRC,SAAS;YACP,gBAAgB;QAClB;IACF;AACF;AAEO,SAASrB;IACd,4CAA4C;IAC5C,MAAMsB;AACR"}
@@ -108,7 +108,7 @@ function getMetroDirectBundleOptionsForExpoConfig(projectRoot, exp, options) {
108
108
  });
109
109
  }
110
110
  function getMetroDirectBundleOptions(options) {
111
- const { mainModuleName, platform, mode, minify, environment, serializerOutput, serializerIncludeMaps, bytecode, lazy, engine, preserveEnvVars, asyncRoutes, baseUrl, routerRoot, isExporting, inlineSourceMap, splitChunks, usedExports, reactCompiler, optimize, domRoot, clientBoundaries, runModule, modulesOnly, useMd5Filename, liveBindings } = withDefaults(options);
111
+ const { mainModuleName, platform, mode, minify, environment, serializerOutput, serializerIncludeMaps, bytecode, lazy, engine, preserveEnvVars, asyncRoutes, baseUrl, routerRoot, isExporting, inlineSourceMap, splitChunks, usedExports, reactCompiler, optimize, domRoot, clientBoundaries, runModule, modulesOnly, useMd5Filename, hosted, liveBindings } = withDefaults(options);
112
112
  const dev = mode !== 'production';
113
113
  const isHermes = engine === 'hermes';
114
114
  if (isExporting) {
@@ -138,6 +138,7 @@ function getMetroDirectBundleOptions(options) {
138
138
  bytecode: bytecode ? '1' : undefined,
139
139
  reactCompiler: reactCompiler ? String(reactCompiler) : undefined,
140
140
  dom: domRoot,
141
+ hosted: hosted ? '1' : undefined,
141
142
  useMd5Filename: useMd5Filename || undefined,
142
143
  liveBindings: !liveBindings ? String(liveBindings) : undefined
143
144
  };
@@ -194,7 +195,7 @@ function createBundleOsPath(options) {
194
195
  return `${mainModuleName}.bundle?${queryParams.toString()}`;
195
196
  }
196
197
  function createBundleUrlSearchParams(options) {
197
- const { platform, mode, minify, environment, serializerOutput, serializerIncludeMaps, lazy, bytecode, engine, preserveEnvVars, asyncRoutes, baseUrl, routerRoot, reactCompiler, inlineSourceMap, isExporting, clientBoundaries, splitChunks, usedExports, optimize, domRoot, modulesOnly, runModule, liveBindings } = withDefaults(options);
198
+ const { platform, mode, minify, environment, serializerOutput, serializerIncludeMaps, lazy, bytecode, engine, preserveEnvVars, asyncRoutes, baseUrl, routerRoot, reactCompiler, inlineSourceMap, isExporting, clientBoundaries, splitChunks, usedExports, optimize, domRoot, modulesOnly, runModule, hosted, liveBindings } = withDefaults(options);
198
199
  const dev = String(mode !== 'production');
199
200
  const queryParams = new URLSearchParams({
200
201
  platform: encodeURIComponent(platform),
@@ -242,6 +243,9 @@ function createBundleUrlSearchParams(options) {
242
243
  if (domRoot) {
243
244
  queryParams.append('transform.dom', domRoot);
244
245
  }
246
+ if (hosted) {
247
+ queryParams.append('transform.hosted', '1');
248
+ }
245
249
  if (environment) {
246
250
  queryParams.append('resolver.environment', environment);
247
251
  queryParams.append('transform.environment', environment);
@@ -299,6 +303,7 @@ function getMetroOptionsFromUrl(urlFragment) {
299
303
  minify: isTruthy(getStringParam('minify') ?? 'false'),
300
304
  lazy: isTruthy(getStringParam('lazy') ?? 'false'),
301
305
  routerRoot: getStringParam('transform.routerRoot') ?? 'app',
306
+ hosted: isTruthy(getStringParam('transform.hosted')),
302
307
  isExporting: isTruthy(getStringParam('resolver.exporting') ?? 'false'),
303
308
  environment: assertEnvironment(getStringParam('transform.environment') ?? 'node'),
304
309
  platform: url.searchParams.get('platform') ?? 'web',
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/start/server/middleware/metroOptions.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport type { BundleOptions as MetroBundleOptions } from 'metro/src/shared/types';\nimport resolveFrom from 'resolve-from';\n\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { toPosixPath } from '../../../utils/filePath';\nimport { getRouterDirectoryModuleIdWithManifest } from '../metro/router';\n\nconst debug = require('debug')('expo:metro:options') as typeof console.log;\n\nexport type MetroEnvironment = 'node' | 'react-server' | 'client';\n\nexport type ExpoMetroOptions = {\n platform: string;\n mainModuleName: string;\n mode: string;\n minify?: boolean;\n environment?: MetroEnvironment;\n serializerOutput?: 'static';\n serializerIncludeMaps?: boolean;\n lazy?: boolean;\n engine?: 'hermes';\n preserveEnvVars?: boolean;\n bytecode: boolean;\n /** Enable async routes (route-based bundle splitting) in Expo Router. */\n asyncRoutes?: boolean;\n /** Module ID relative to the projectRoot for the Expo Router app directory. */\n routerRoot: string;\n /** Enable React compiler support in Babel. */\n reactCompiler: boolean;\n baseUrl?: string;\n isExporting: boolean;\n /** Is bundling a DOM Component (\"use dom\"). Requires the entry dom component file path. */\n domRoot?: string;\n /** Exporting MD5 filename based on file contents, for EAS Update. */\n useMd5Filename?: boolean;\n inlineSourceMap?: boolean;\n clientBoundaries?: string[];\n splitChunks?: boolean;\n usedExports?: boolean;\n /** Enable optimized bundling (required for tree shaking). */\n optimize?: boolean;\n\n modulesOnly?: boolean;\n runModule?: boolean;\n /** Disable live bindings (enabled by default, required for circular deps) in experimental import export support. */\n liveBindings?: boolean;\n};\n\n// See: @expo/metro-config/src/serializer/fork/baseJSBundle.ts `ExpoSerializerOptions`\nexport type SerializerOptions = {\n includeSourceMaps?: boolean;\n output?: 'static';\n splitChunks?: boolean;\n usedExports?: boolean;\n exporting?: boolean;\n};\n\nexport type ExpoMetroBundleOptions = MetroBundleOptions & {\n serializerOptions?: SerializerOptions;\n};\n\nexport function isServerEnvironment(environment?: any): boolean {\n return environment === 'node' || environment === 'react-server';\n}\n\nfunction withDefaults({\n mode = 'development',\n minify = mode === 'production',\n preserveEnvVars = mode !== 'development' && env.EXPO_NO_CLIENT_ENV_VARS,\n lazy,\n environment,\n ...props\n}: ExpoMetroOptions): ExpoMetroOptions {\n if (props.bytecode) {\n if (props.platform === 'web') {\n throw new CommandError('Cannot use bytecode with the web platform');\n }\n if (props.engine !== 'hermes') {\n throw new CommandError('Bytecode is only supported with the Hermes engine');\n }\n }\n\n const optimize =\n props.optimize ??\n (environment !== 'node' && mode === 'production' && env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH);\n\n return {\n mode,\n minify,\n preserveEnvVars,\n optimize,\n usedExports: optimize && env.EXPO_UNSTABLE_TREE_SHAKING,\n lazy: !props.isExporting && lazy,\n environment: environment === 'client' ? undefined : environment,\n liveBindings: env.EXPO_UNSTABLE_LIVE_BINDINGS,\n ...props,\n };\n}\n\nexport function getBaseUrlFromExpoConfig(exp: ExpoConfig) {\n return exp.experiments?.baseUrl?.trim().replace(/\\/+$/, '') ?? '';\n}\n\nexport function getAsyncRoutesFromExpoConfig(exp: ExpoConfig, mode: string, platform: string) {\n let asyncRoutesSetting;\n\n if (exp.extra?.router?.asyncRoutes) {\n const asyncRoutes = exp.extra?.router?.asyncRoutes;\n if (['boolean', 'string'].includes(typeof asyncRoutes)) {\n asyncRoutesSetting = asyncRoutes;\n } else if (typeof asyncRoutes === 'object') {\n asyncRoutesSetting = asyncRoutes[platform] ?? asyncRoutes.default;\n }\n }\n\n return [mode, true].includes(asyncRoutesSetting);\n}\n\nexport function getMetroDirectBundleOptionsForExpoConfig(\n projectRoot: string,\n exp: ExpoConfig,\n options: Omit<ExpoMetroOptions, 'baseUrl' | 'reactCompiler' | 'routerRoot' | 'asyncRoutes'>\n): Partial<ExpoMetroBundleOptions> {\n return getMetroDirectBundleOptions({\n ...options,\n reactCompiler: !!exp.experiments?.reactCompiler,\n baseUrl: getBaseUrlFromExpoConfig(exp),\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n asyncRoutes: getAsyncRoutesFromExpoConfig(exp, options.mode, options.platform),\n });\n}\n\nexport function getMetroDirectBundleOptions(\n options: ExpoMetroOptions\n): Partial<ExpoMetroBundleOptions> {\n const {\n mainModuleName,\n platform,\n mode,\n minify,\n environment,\n serializerOutput,\n serializerIncludeMaps,\n bytecode,\n lazy,\n engine,\n preserveEnvVars,\n asyncRoutes,\n baseUrl,\n routerRoot,\n isExporting,\n inlineSourceMap,\n splitChunks,\n usedExports,\n reactCompiler,\n optimize,\n domRoot,\n clientBoundaries,\n runModule,\n modulesOnly,\n useMd5Filename,\n liveBindings,\n } = withDefaults(options);\n\n const dev = mode !== 'production';\n const isHermes = engine === 'hermes';\n\n if (isExporting) {\n debug('Disabling lazy bundling for export build');\n options.lazy = false;\n }\n\n let fakeSourceUrl: string | undefined;\n let fakeSourceMapUrl: string | undefined;\n\n // TODO: Upstream support to Metro for passing custom serializer options.\n if (serializerIncludeMaps != null || serializerOutput != null) {\n fakeSourceUrl = new URL(\n createBundleUrlPath(options).replace(/^\\//, ''),\n 'http://localhost:8081'\n ).toString();\n if (serializerIncludeMaps) {\n fakeSourceMapUrl = fakeSourceUrl.replace('.bundle?', '.map?');\n }\n }\n\n const customTransformOptions: ExpoMetroBundleOptions['customTransformOptions'] = {\n __proto__: null,\n optimize: optimize || undefined,\n engine,\n clientBoundaries,\n preserveEnvVars: preserveEnvVars || undefined,\n // Use string to match the query param behavior.\n asyncRoutes: asyncRoutes ? String(asyncRoutes) : undefined,\n environment,\n baseUrl: baseUrl || undefined,\n routerRoot,\n bytecode: bytecode ? '1' : undefined,\n reactCompiler: reactCompiler ? String(reactCompiler) : undefined,\n dom: domRoot,\n useMd5Filename: useMd5Filename || undefined,\n liveBindings: !liveBindings ? String(liveBindings) : undefined,\n };\n\n // Iterate and delete undefined values\n for (const key in customTransformOptions) {\n if (customTransformOptions[key] === undefined) {\n delete customTransformOptions[key];\n }\n }\n\n const bundleOptions: Partial<ExpoMetroBundleOptions> = {\n platform,\n entryFile: mainModuleName,\n dev,\n minify: minify ?? !dev,\n inlineSourceMap: inlineSourceMap ?? false,\n lazy: (!isExporting && lazy) || undefined,\n unstable_transformProfile: isHermes ? 'hermes-stable' : 'default',\n customTransformOptions,\n runModule,\n modulesOnly,\n customResolverOptions: {\n __proto__: null,\n environment,\n exporting: isExporting || undefined,\n },\n sourceMapUrl: fakeSourceMapUrl,\n sourceUrl: fakeSourceUrl,\n serializerOptions: {\n splitChunks,\n usedExports: usedExports || undefined,\n output: serializerOutput,\n includeSourceMaps: serializerIncludeMaps,\n exporting: isExporting || undefined,\n },\n };\n\n return bundleOptions;\n}\n\nexport function createBundleUrlPathFromExpoConfig(\n projectRoot: string,\n exp: ExpoConfig,\n options: Omit<ExpoMetroOptions, 'reactCompiler' | 'baseUrl' | 'routerRoot'>\n): string {\n return createBundleUrlPath({\n ...options,\n reactCompiler: !!exp.experiments?.reactCompiler,\n baseUrl: getBaseUrlFromExpoConfig(exp),\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n });\n}\n\nexport function createBundleUrlPath(options: ExpoMetroOptions): string {\n const queryParams = createBundleUrlSearchParams(options);\n return `/${encodeURI(options.mainModuleName.replace(/^\\/+/, ''))}.bundle?${queryParams.toString()}`;\n}\n\n/**\n * Create a bundle URL, containing all required query parameters, using a valid \"os path\".\n * On POSIX systems, this would look something like `/Users/../project/file.js?dev=false&..`.\n * On UNIX systems, this would look something like `C:\\Users\\..\\project\\file.js?dev=false&..`.\n * This path can safely be used with `path.*` modifiers and resolved.\n */\nexport function createBundleOsPath(options: ExpoMetroOptions): string {\n const queryParams = createBundleUrlSearchParams(options);\n const mainModuleName = toPosixPath(options.mainModuleName);\n return `${mainModuleName}.bundle?${queryParams.toString()}`;\n}\n\nexport function createBundleUrlSearchParams(options: ExpoMetroOptions): URLSearchParams {\n const {\n platform,\n mode,\n minify,\n environment,\n serializerOutput,\n serializerIncludeMaps,\n lazy,\n bytecode,\n engine,\n preserveEnvVars,\n asyncRoutes,\n baseUrl,\n routerRoot,\n reactCompiler,\n inlineSourceMap,\n isExporting,\n clientBoundaries,\n splitChunks,\n usedExports,\n optimize,\n domRoot,\n modulesOnly,\n runModule,\n liveBindings,\n } = withDefaults(options);\n\n const dev = String(mode !== 'production');\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev,\n // TODO: Is this still needed?\n hot: String(false),\n });\n\n // Lazy bundling must be disabled for bundle splitting to work.\n if (!isExporting && lazy) {\n queryParams.append('lazy', String(lazy));\n }\n\n if (inlineSourceMap) {\n queryParams.append('inlineSourceMap', String(inlineSourceMap));\n }\n\n if (minify) {\n queryParams.append('minify', String(minify));\n }\n\n // We split bytecode from the engine since you could technically use Hermes without bytecode.\n // Hermes indicates the type of language features you want to transform out of the JS, whereas bytecode\n // indicates whether you want to use the Hermes bytecode format.\n if (engine) {\n queryParams.append('transform.engine', engine);\n }\n if (bytecode) {\n queryParams.append('transform.bytecode', '1');\n }\n if (asyncRoutes) {\n queryParams.append('transform.asyncRoutes', String(asyncRoutes));\n }\n if (preserveEnvVars) {\n queryParams.append('transform.preserveEnvVars', String(preserveEnvVars));\n }\n if (baseUrl) {\n queryParams.append('transform.baseUrl', baseUrl);\n }\n if (clientBoundaries?.length) {\n queryParams.append('transform.clientBoundaries', JSON.stringify(clientBoundaries));\n }\n if (routerRoot != null) {\n queryParams.append('transform.routerRoot', routerRoot);\n }\n if (reactCompiler) {\n queryParams.append('transform.reactCompiler', String(reactCompiler));\n }\n if (domRoot) {\n queryParams.append('transform.dom', domRoot);\n }\n\n if (environment) {\n queryParams.append('resolver.environment', environment);\n queryParams.append('transform.environment', environment);\n }\n\n if (isExporting) {\n queryParams.append('resolver.exporting', String(isExporting));\n }\n\n if (splitChunks) {\n queryParams.append('serializer.splitChunks', String(splitChunks));\n }\n if (usedExports) {\n queryParams.append('serializer.usedExports', String(usedExports));\n }\n if (optimize) {\n queryParams.append('transform.optimize', String(optimize));\n }\n if (serializerOutput) {\n queryParams.append('serializer.output', serializerOutput);\n }\n if (serializerIncludeMaps) {\n queryParams.append('serializer.map', String(serializerIncludeMaps));\n }\n if (engine === 'hermes') {\n queryParams.append('unstable_transformProfile', 'hermes-stable');\n }\n\n if (modulesOnly != null) {\n queryParams.set('modulesOnly', String(modulesOnly));\n }\n if (runModule != null) {\n queryParams.set('runModule', String(runModule));\n }\n\n if (liveBindings === false) {\n queryParams.append('transform.liveBindings', String(false));\n }\n\n return queryParams;\n}\n\n/**\n * Convert all path separators to `/`, including on Windows.\n * Metro asumes that all module specifiers are posix paths.\n * References to directories can still be Windows-style paths in Metro.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#importing_features_into_your_script\n * @see https://github.com/facebook/metro/pull/1286\n */\nexport function convertPathToModuleSpecifier(pathLike: string) {\n return toPosixPath(pathLike);\n}\n\nexport function getMetroOptionsFromUrl(urlFragment: string) {\n const url = new URL(urlFragment, 'http://localhost:0');\n const getStringParam = (key: string) => {\n const param = url.searchParams.get(key);\n if (Array.isArray(param)) {\n throw new Error(`Expected single value for ${key}`);\n }\n return param;\n };\n\n let pathname = url.pathname;\n if (pathname.endsWith('.bundle')) {\n pathname = pathname.slice(0, -'.bundle'.length);\n }\n\n const options: ExpoMetroOptions = {\n mode: isTruthy(getStringParam('dev') ?? 'true') ? 'development' : 'production',\n minify: isTruthy(getStringParam('minify') ?? 'false'),\n lazy: isTruthy(getStringParam('lazy') ?? 'false'),\n routerRoot: getStringParam('transform.routerRoot') ?? 'app',\n isExporting: isTruthy(getStringParam('resolver.exporting') ?? 'false'),\n environment: assertEnvironment(getStringParam('transform.environment') ?? 'node'),\n platform: url.searchParams.get('platform') ?? 'web',\n bytecode: isTruthy(getStringParam('transform.bytecode') ?? 'false'),\n mainModuleName: convertPathToModuleSpecifier(pathname),\n reactCompiler: isTruthy(getStringParam('transform.reactCompiler') ?? 'false'),\n asyncRoutes: isTruthy(getStringParam('transform.asyncRoutes') ?? 'false'),\n baseUrl: getStringParam('transform.baseUrl') ?? undefined,\n // clientBoundaries: JSON.parse(getStringParam('transform.clientBoundaries') ?? '[]'),\n engine: assertEngine(getStringParam('transform.engine')),\n runModule: isTruthy(getStringParam('runModule') ?? 'true'),\n modulesOnly: isTruthy(getStringParam('modulesOnly') ?? 'false'),\n liveBindings: isTruthy(getStringParam('transform.liveBindings') ?? 'true'),\n };\n\n return options;\n}\n\nfunction isTruthy(value: string | null): boolean {\n return value === 'true' || value === '1';\n}\n\nfunction assertEnvironment(environment: string | undefined): MetroEnvironment | undefined {\n if (!environment) {\n return undefined;\n }\n if (!['node', 'react-server', 'client'].includes(environment)) {\n throw new Error(`Expected transform.environment to be one of: node, react-server, client`);\n }\n return environment as MetroEnvironment;\n}\nfunction assertEngine(engine: string | undefined | null): 'hermes' | undefined {\n if (!engine) {\n return undefined;\n }\n if (!['hermes'].includes(engine)) {\n throw new Error(`Expected transform.engine to be one of: hermes`);\n }\n return engine as 'hermes';\n}\n"],"names":["convertPathToModuleSpecifier","createBundleOsPath","createBundleUrlPath","createBundleUrlPathFromExpoConfig","createBundleUrlSearchParams","getAsyncRoutesFromExpoConfig","getBaseUrlFromExpoConfig","getMetroDirectBundleOptions","getMetroDirectBundleOptionsForExpoConfig","getMetroOptionsFromUrl","isServerEnvironment","debug","require","environment","withDefaults","mode","minify","preserveEnvVars","env","EXPO_NO_CLIENT_ENV_VARS","lazy","props","bytecode","platform","CommandError","engine","optimize","EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH","usedExports","EXPO_UNSTABLE_TREE_SHAKING","isExporting","undefined","liveBindings","EXPO_UNSTABLE_LIVE_BINDINGS","exp","experiments","baseUrl","trim","replace","asyncRoutesSetting","extra","router","asyncRoutes","includes","default","projectRoot","options","reactCompiler","routerRoot","getRouterDirectoryModuleIdWithManifest","mainModuleName","serializerOutput","serializerIncludeMaps","inlineSourceMap","splitChunks","domRoot","clientBoundaries","runModule","modulesOnly","useMd5Filename","dev","isHermes","fakeSourceUrl","fakeSourceMapUrl","URL","toString","customTransformOptions","__proto__","String","dom","key","bundleOptions","entryFile","unstable_transformProfile","customResolverOptions","exporting","sourceMapUrl","sourceUrl","serializerOptions","output","includeSourceMaps","queryParams","encodeURI","toPosixPath","URLSearchParams","encodeURIComponent","hot","append","length","JSON","stringify","set","pathLike","urlFragment","url","getStringParam","param","searchParams","get","Array","isArray","Error","pathname","endsWith","slice","isTruthy","assertEnvironment","assertEngine","value"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/start/server/middleware/metroOptions.ts"],"sourcesContent":["import { ExpoConfig } from '@expo/config';\nimport type { BundleOptions as MetroBundleOptions } from '@expo/metro/metro/shared/types.flow';\n\nimport { env } from '../../../utils/env';\nimport { CommandError } from '../../../utils/errors';\nimport { toPosixPath } from '../../../utils/filePath';\nimport { getRouterDirectoryModuleIdWithManifest } from '../metro/router';\n\nconst debug = require('debug')('expo:metro:options') as typeof console.log;\n\nexport type MetroEnvironment = 'node' | 'react-server' | 'client';\n\nexport type ExpoMetroOptions = {\n platform: string;\n mainModuleName: string;\n mode: string;\n minify?: boolean;\n environment?: MetroEnvironment;\n serializerOutput?: 'static';\n serializerIncludeMaps?: boolean;\n lazy?: boolean;\n engine?: 'hermes';\n preserveEnvVars?: boolean;\n bytecode: boolean;\n /** Enable async routes (route-based bundle splitting) in Expo Router. */\n asyncRoutes?: boolean;\n /** Module ID relative to the projectRoot for the Expo Router app directory. */\n routerRoot: string;\n /** Enable React compiler support in Babel. */\n reactCompiler: boolean;\n baseUrl?: string;\n isExporting: boolean;\n /** Is bundling a DOM Component (\"use dom\"). Requires the entry dom component file path. */\n domRoot?: string;\n /** Exporting MD5 filename based on file contents, for EAS Update. */\n useMd5Filename?: boolean;\n inlineSourceMap?: boolean;\n clientBoundaries?: string[];\n splitChunks?: boolean;\n usedExports?: boolean;\n /** Enable optimized bundling (required for tree shaking). */\n optimize?: boolean;\n\n modulesOnly?: boolean;\n runModule?: boolean;\n\n /** Should assets be exported for hosting. Always true on web. Always false for embedded builds. Optional for native exports. */\n hosted?: boolean;\n /** Disable live bindings (enabled by default, required for circular deps) in experimental import export support. */\n liveBindings?: boolean;\n};\n\n// See: @expo/metro-config/src/serializer/fork/baseJSBundle.ts `ExpoSerializerOptions`\nexport type SerializerOptions = {\n includeSourceMaps?: boolean;\n output?: 'static';\n splitChunks?: boolean;\n usedExports?: boolean;\n exporting?: boolean;\n};\n\nexport type ExpoMetroBundleOptions = MetroBundleOptions & {\n serializerOptions?: SerializerOptions;\n};\n\nexport function isServerEnvironment(environment?: any): boolean {\n return environment === 'node' || environment === 'react-server';\n}\n\nfunction withDefaults({\n mode = 'development',\n minify = mode === 'production',\n preserveEnvVars = mode !== 'development' && env.EXPO_NO_CLIENT_ENV_VARS,\n lazy,\n environment,\n ...props\n}: ExpoMetroOptions): ExpoMetroOptions {\n if (props.bytecode) {\n if (props.platform === 'web') {\n throw new CommandError('Cannot use bytecode with the web platform');\n }\n if (props.engine !== 'hermes') {\n throw new CommandError('Bytecode is only supported with the Hermes engine');\n }\n }\n\n const optimize =\n props.optimize ??\n (environment !== 'node' && mode === 'production' && env.EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH);\n\n return {\n mode,\n minify,\n preserveEnvVars,\n optimize,\n usedExports: optimize && env.EXPO_UNSTABLE_TREE_SHAKING,\n lazy: !props.isExporting && lazy,\n environment: environment === 'client' ? undefined : environment,\n liveBindings: env.EXPO_UNSTABLE_LIVE_BINDINGS,\n ...props,\n };\n}\n\nexport function getBaseUrlFromExpoConfig(exp: ExpoConfig) {\n return exp.experiments?.baseUrl?.trim().replace(/\\/+$/, '') ?? '';\n}\n\nexport function getAsyncRoutesFromExpoConfig(exp: ExpoConfig, mode: string, platform: string) {\n let asyncRoutesSetting;\n\n if (exp.extra?.router?.asyncRoutes) {\n const asyncRoutes = exp.extra?.router?.asyncRoutes;\n if (['boolean', 'string'].includes(typeof asyncRoutes)) {\n asyncRoutesSetting = asyncRoutes;\n } else if (typeof asyncRoutes === 'object') {\n asyncRoutesSetting = asyncRoutes[platform] ?? asyncRoutes.default;\n }\n }\n\n return [mode, true].includes(asyncRoutesSetting);\n}\n\nexport function getMetroDirectBundleOptionsForExpoConfig(\n projectRoot: string,\n exp: ExpoConfig,\n options: Omit<ExpoMetroOptions, 'baseUrl' | 'reactCompiler' | 'routerRoot' | 'asyncRoutes'>\n): Partial<ExpoMetroBundleOptions> {\n return getMetroDirectBundleOptions({\n ...options,\n reactCompiler: !!exp.experiments?.reactCompiler,\n baseUrl: getBaseUrlFromExpoConfig(exp),\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n asyncRoutes: getAsyncRoutesFromExpoConfig(exp, options.mode, options.platform),\n });\n}\n\nexport function getMetroDirectBundleOptions(\n options: ExpoMetroOptions\n): Partial<ExpoMetroBundleOptions> {\n const {\n mainModuleName,\n platform,\n mode,\n minify,\n environment,\n serializerOutput,\n serializerIncludeMaps,\n bytecode,\n lazy,\n engine,\n preserveEnvVars,\n asyncRoutes,\n baseUrl,\n routerRoot,\n isExporting,\n inlineSourceMap,\n splitChunks,\n usedExports,\n reactCompiler,\n optimize,\n domRoot,\n clientBoundaries,\n runModule,\n modulesOnly,\n useMd5Filename,\n hosted,\n liveBindings,\n } = withDefaults(options);\n\n const dev = mode !== 'production';\n const isHermes = engine === 'hermes';\n\n if (isExporting) {\n debug('Disabling lazy bundling for export build');\n options.lazy = false;\n }\n\n let fakeSourceUrl: string | undefined;\n let fakeSourceMapUrl: string | undefined;\n\n // TODO: Upstream support to Metro for passing custom serializer options.\n if (serializerIncludeMaps != null || serializerOutput != null) {\n fakeSourceUrl = new URL(\n createBundleUrlPath(options).replace(/^\\//, ''),\n 'http://localhost:8081'\n ).toString();\n if (serializerIncludeMaps) {\n fakeSourceMapUrl = fakeSourceUrl.replace('.bundle?', '.map?');\n }\n }\n\n const customTransformOptions: ExpoMetroBundleOptions['customTransformOptions'] = {\n __proto__: null,\n optimize: optimize || undefined,\n engine,\n clientBoundaries,\n preserveEnvVars: preserveEnvVars || undefined,\n // Use string to match the query param behavior.\n asyncRoutes: asyncRoutes ? String(asyncRoutes) : undefined,\n environment,\n baseUrl: baseUrl || undefined,\n routerRoot,\n bytecode: bytecode ? '1' : undefined,\n reactCompiler: reactCompiler ? String(reactCompiler) : undefined,\n dom: domRoot,\n hosted: hosted ? '1' : undefined,\n useMd5Filename: useMd5Filename || undefined,\n liveBindings: !liveBindings ? String(liveBindings) : undefined,\n };\n\n // Iterate and delete undefined values\n for (const key in customTransformOptions) {\n if (customTransformOptions[key] === undefined) {\n delete customTransformOptions[key];\n }\n }\n\n const bundleOptions: Partial<ExpoMetroBundleOptions> = {\n platform,\n entryFile: mainModuleName,\n dev,\n minify: minify ?? !dev,\n inlineSourceMap: inlineSourceMap ?? false,\n lazy: (!isExporting && lazy) || undefined,\n unstable_transformProfile: isHermes ? 'hermes-stable' : 'default',\n customTransformOptions,\n runModule,\n modulesOnly,\n customResolverOptions: {\n __proto__: null,\n environment,\n exporting: isExporting || undefined,\n },\n sourceMapUrl: fakeSourceMapUrl,\n sourceUrl: fakeSourceUrl,\n serializerOptions: {\n splitChunks,\n usedExports: usedExports || undefined,\n output: serializerOutput,\n includeSourceMaps: serializerIncludeMaps,\n exporting: isExporting || undefined,\n },\n };\n\n return bundleOptions;\n}\n\nexport function createBundleUrlPathFromExpoConfig(\n projectRoot: string,\n exp: ExpoConfig,\n options: Omit<ExpoMetroOptions, 'reactCompiler' | 'baseUrl' | 'routerRoot'>\n): string {\n return createBundleUrlPath({\n ...options,\n reactCompiler: !!exp.experiments?.reactCompiler,\n baseUrl: getBaseUrlFromExpoConfig(exp),\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n });\n}\n\nexport function createBundleUrlPath(options: ExpoMetroOptions): string {\n const queryParams = createBundleUrlSearchParams(options);\n return `/${encodeURI(options.mainModuleName.replace(/^\\/+/, ''))}.bundle?${queryParams.toString()}`;\n}\n\n/**\n * Create a bundle URL, containing all required query parameters, using a valid \"os path\".\n * On POSIX systems, this would look something like `/Users/../project/file.js?dev=false&..`.\n * On UNIX systems, this would look something like `C:\\Users\\..\\project\\file.js?dev=false&..`.\n * This path can safely be used with `path.*` modifiers and resolved.\n */\nexport function createBundleOsPath(options: ExpoMetroOptions): string {\n const queryParams = createBundleUrlSearchParams(options);\n const mainModuleName = toPosixPath(options.mainModuleName);\n return `${mainModuleName}.bundle?${queryParams.toString()}`;\n}\n\nexport function createBundleUrlSearchParams(options: ExpoMetroOptions): URLSearchParams {\n const {\n platform,\n mode,\n minify,\n environment,\n serializerOutput,\n serializerIncludeMaps,\n lazy,\n bytecode,\n engine,\n preserveEnvVars,\n asyncRoutes,\n baseUrl,\n routerRoot,\n reactCompiler,\n inlineSourceMap,\n isExporting,\n clientBoundaries,\n splitChunks,\n usedExports,\n optimize,\n domRoot,\n modulesOnly,\n runModule,\n hosted,\n liveBindings,\n } = withDefaults(options);\n\n const dev = String(mode !== 'production');\n const queryParams = new URLSearchParams({\n platform: encodeURIComponent(platform),\n dev,\n // TODO: Is this still needed?\n hot: String(false),\n });\n\n // Lazy bundling must be disabled for bundle splitting to work.\n if (!isExporting && lazy) {\n queryParams.append('lazy', String(lazy));\n }\n\n if (inlineSourceMap) {\n queryParams.append('inlineSourceMap', String(inlineSourceMap));\n }\n\n if (minify) {\n queryParams.append('minify', String(minify));\n }\n\n // We split bytecode from the engine since you could technically use Hermes without bytecode.\n // Hermes indicates the type of language features you want to transform out of the JS, whereas bytecode\n // indicates whether you want to use the Hermes bytecode format.\n if (engine) {\n queryParams.append('transform.engine', engine);\n }\n if (bytecode) {\n queryParams.append('transform.bytecode', '1');\n }\n if (asyncRoutes) {\n queryParams.append('transform.asyncRoutes', String(asyncRoutes));\n }\n if (preserveEnvVars) {\n queryParams.append('transform.preserveEnvVars', String(preserveEnvVars));\n }\n if (baseUrl) {\n queryParams.append('transform.baseUrl', baseUrl);\n }\n if (clientBoundaries?.length) {\n queryParams.append('transform.clientBoundaries', JSON.stringify(clientBoundaries));\n }\n if (routerRoot != null) {\n queryParams.append('transform.routerRoot', routerRoot);\n }\n if (reactCompiler) {\n queryParams.append('transform.reactCompiler', String(reactCompiler));\n }\n if (domRoot) {\n queryParams.append('transform.dom', domRoot);\n }\n if (hosted) {\n queryParams.append('transform.hosted', '1');\n }\n\n if (environment) {\n queryParams.append('resolver.environment', environment);\n queryParams.append('transform.environment', environment);\n }\n\n if (isExporting) {\n queryParams.append('resolver.exporting', String(isExporting));\n }\n\n if (splitChunks) {\n queryParams.append('serializer.splitChunks', String(splitChunks));\n }\n if (usedExports) {\n queryParams.append('serializer.usedExports', String(usedExports));\n }\n if (optimize) {\n queryParams.append('transform.optimize', String(optimize));\n }\n if (serializerOutput) {\n queryParams.append('serializer.output', serializerOutput);\n }\n if (serializerIncludeMaps) {\n queryParams.append('serializer.map', String(serializerIncludeMaps));\n }\n if (engine === 'hermes') {\n queryParams.append('unstable_transformProfile', 'hermes-stable');\n }\n\n if (modulesOnly != null) {\n queryParams.set('modulesOnly', String(modulesOnly));\n }\n if (runModule != null) {\n queryParams.set('runModule', String(runModule));\n }\n\n if (liveBindings === false) {\n queryParams.append('transform.liveBindings', String(false));\n }\n\n return queryParams;\n}\n\n/**\n * Convert all path separators to `/`, including on Windows.\n * Metro asumes that all module specifiers are posix paths.\n * References to directories can still be Windows-style paths in Metro.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules#importing_features_into_your_script\n * @see https://github.com/facebook/metro/pull/1286\n */\nexport function convertPathToModuleSpecifier(pathLike: string) {\n return toPosixPath(pathLike);\n}\n\nexport function getMetroOptionsFromUrl(urlFragment: string) {\n const url = new URL(urlFragment, 'http://localhost:0');\n const getStringParam = (key: string) => {\n const param = url.searchParams.get(key);\n if (Array.isArray(param)) {\n throw new Error(`Expected single value for ${key}`);\n }\n return param;\n };\n\n let pathname = url.pathname;\n if (pathname.endsWith('.bundle')) {\n pathname = pathname.slice(0, -'.bundle'.length);\n }\n\n const options: ExpoMetroOptions = {\n mode: isTruthy(getStringParam('dev') ?? 'true') ? 'development' : 'production',\n minify: isTruthy(getStringParam('minify') ?? 'false'),\n lazy: isTruthy(getStringParam('lazy') ?? 'false'),\n routerRoot: getStringParam('transform.routerRoot') ?? 'app',\n hosted: isTruthy(getStringParam('transform.hosted')),\n isExporting: isTruthy(getStringParam('resolver.exporting') ?? 'false'),\n environment: assertEnvironment(getStringParam('transform.environment') ?? 'node'),\n platform: url.searchParams.get('platform') ?? 'web',\n bytecode: isTruthy(getStringParam('transform.bytecode') ?? 'false'),\n mainModuleName: convertPathToModuleSpecifier(pathname),\n reactCompiler: isTruthy(getStringParam('transform.reactCompiler') ?? 'false'),\n asyncRoutes: isTruthy(getStringParam('transform.asyncRoutes') ?? 'false'),\n baseUrl: getStringParam('transform.baseUrl') ?? undefined,\n // clientBoundaries: JSON.parse(getStringParam('transform.clientBoundaries') ?? '[]'),\n engine: assertEngine(getStringParam('transform.engine')),\n runModule: isTruthy(getStringParam('runModule') ?? 'true'),\n modulesOnly: isTruthy(getStringParam('modulesOnly') ?? 'false'),\n liveBindings: isTruthy(getStringParam('transform.liveBindings') ?? 'true'),\n };\n\n return options;\n}\n\nfunction isTruthy(value: string | null): boolean {\n return value === 'true' || value === '1';\n}\n\nfunction assertEnvironment(environment: string | undefined): MetroEnvironment | undefined {\n if (!environment) {\n return undefined;\n }\n if (!['node', 'react-server', 'client'].includes(environment)) {\n throw new Error(`Expected transform.environment to be one of: node, react-server, client`);\n }\n return environment as MetroEnvironment;\n}\nfunction assertEngine(engine: string | undefined | null): 'hermes' | undefined {\n if (!engine) {\n return undefined;\n }\n if (!['hermes'].includes(engine)) {\n throw new Error(`Expected transform.engine to be one of: hermes`);\n }\n return engine as 'hermes';\n}\n"],"names":["convertPathToModuleSpecifier","createBundleOsPath","createBundleUrlPath","createBundleUrlPathFromExpoConfig","createBundleUrlSearchParams","getAsyncRoutesFromExpoConfig","getBaseUrlFromExpoConfig","getMetroDirectBundleOptions","getMetroDirectBundleOptionsForExpoConfig","getMetroOptionsFromUrl","isServerEnvironment","debug","require","environment","withDefaults","mode","minify","preserveEnvVars","env","EXPO_NO_CLIENT_ENV_VARS","lazy","props","bytecode","platform","CommandError","engine","optimize","EXPO_UNSTABLE_METRO_OPTIMIZE_GRAPH","usedExports","EXPO_UNSTABLE_TREE_SHAKING","isExporting","undefined","liveBindings","EXPO_UNSTABLE_LIVE_BINDINGS","exp","experiments","baseUrl","trim","replace","asyncRoutesSetting","extra","router","asyncRoutes","includes","default","projectRoot","options","reactCompiler","routerRoot","getRouterDirectoryModuleIdWithManifest","mainModuleName","serializerOutput","serializerIncludeMaps","inlineSourceMap","splitChunks","domRoot","clientBoundaries","runModule","modulesOnly","useMd5Filename","hosted","dev","isHermes","fakeSourceUrl","fakeSourceMapUrl","URL","toString","customTransformOptions","__proto__","String","dom","key","bundleOptions","entryFile","unstable_transformProfile","customResolverOptions","exporting","sourceMapUrl","sourceUrl","serializerOptions","output","includeSourceMaps","queryParams","encodeURI","toPosixPath","URLSearchParams","encodeURIComponent","hot","append","length","JSON","stringify","set","pathLike","urlFragment","url","getStringParam","param","searchParams","get","Array","isArray","Error","pathname","endsWith","slice","isTruthy","assertEnvironment","assertEngine","value"],"mappings":"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"}
@@ -43,6 +43,9 @@ function resolvePlatformFromUserAgentHeader(req) {
43
43
  if (userAgent == null ? void 0 : userAgent.match(/Android/i)) {
44
44
  platform = 'android';
45
45
  }
46
+ if (userAgent == null ? void 0 : userAgent.match(/OculusBrowser|Quest/i)) {
47
+ platform = 'android';
48
+ }
46
49
  if (userAgent == null ? void 0 : userAgent.match(/iPhone|iPad/i)) {
47
50
  platform = 'ios';
48
51
  }