@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.
- package/build/bin/cli +1 -1
- package/build/metro-require/require.js +24 -13
- package/build/src/api/getExpoSchema.js +8 -7
- package/build/src/api/getExpoSchema.js.map +1 -1
- package/build/src/expoUpdatesExports.js +28 -0
- package/build/src/expoUpdatesExports.js.map +1 -0
- package/build/src/export/embed/exportEmbedAsync.js +26 -25
- package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
- package/build/src/export/embed/resolveOptions.js +1 -1
- package/build/src/export/embed/resolveOptions.js.map +1 -1
- package/build/src/export/exportApp.js +7 -4
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/exportAssets.js +20 -4
- package/build/src/export/exportAssets.js.map +1 -1
- package/build/src/export/exportAsync.js +2 -2
- package/build/src/export/exportAsync.js.map +1 -1
- package/build/src/export/exportHermes.js +34 -9
- package/build/src/export/exportHermes.js.map +1 -1
- package/build/src/export/exportStaticAsync.js +23 -2
- package/build/src/export/exportStaticAsync.js.map +1 -1
- package/build/src/export/index.js +1 -0
- package/build/src/export/index.js.map +1 -1
- package/build/src/export/metroAssetLocalPath.js.map +1 -1
- package/build/src/export/persistMetroAssets.js.map +1 -1
- package/build/src/export/resolveOptions.js +1 -0
- package/build/src/export/resolveOptions.js.map +1 -1
- package/build/src/export/saveAssets.js +12 -0
- package/build/src/export/saveAssets.js.map +1 -1
- package/build/src/install/checkPackages.js +9 -1
- package/build/src/install/checkPackages.js.map +1 -1
- package/build/src/lint/lintAsync.js +2 -0
- package/build/src/lint/lintAsync.js.map +1 -1
- package/build/src/prebuild/prebuildAsync.js +18 -0
- package/build/src/prebuild/prebuildAsync.js.map +1 -1
- package/build/src/prebuild/resolveLocalTemplate.js +42 -0
- package/build/src/prebuild/resolveLocalTemplate.js.map +1 -0
- package/build/src/prebuild/resolveTemplate.js +17 -7
- package/build/src/prebuild/resolveTemplate.js.map +1 -1
- package/build/src/prebuild/updateFromTemplate.js +1 -0
- package/build/src/prebuild/updateFromTemplate.js.map +1 -1
- package/build/src/prebuild/updatePackageJson.js +5 -3
- package/build/src/prebuild/updatePackageJson.js.map +1 -1
- package/build/src/run/android/resolveOptions.js +2 -2
- package/build/src/run/android/resolveOptions.js.map +1 -1
- package/build/src/run/ios/options/resolveOptions.js +2 -2
- package/build/src/run/ios/options/resolveOptions.js.map +1 -1
- package/build/src/run/ios/runIosAsync.js +3 -0
- package/build/src/run/ios/runIosAsync.js.map +1 -1
- package/build/src/serve/serveAsync.js +5 -2
- package/build/src/serve/serveAsync.js.map +1 -1
- package/build/src/start/platforms/ExpoGoInstaller.js +1 -1
- package/build/src/start/platforms/ExpoGoInstaller.js.map +1 -1
- package/build/src/start/server/DevToolsPluginManager.js +7 -35
- package/build/src/start/server/DevToolsPluginManager.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +88 -56
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js +66 -25
- package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/TerminalReporter.js +6 -6
- package/build/src/start/server/metro/TerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/createExpoAutolinkingResolver.js +121 -0
- package/build/src/start/server/metro/createExpoAutolinkingResolver.js.map +1 -0
- package/build/src/start/server/metro/createExpoFallbackResolver.js +1 -0
- package/build/src/start/server/metro/createExpoFallbackResolver.js.map +1 -1
- package/build/src/start/server/metro/createExpoMetroResolver.js.map +1 -1
- package/build/src/start/server/metro/createJResolver.js.map +1 -1
- package/build/src/start/server/metro/createServerComponentsMiddleware.js +4 -4
- package/build/src/start/server/metro/createServerComponentsMiddleware.js.map +1 -1
- package/build/src/start/server/metro/createServerRouteMiddleware.js +54 -8
- package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -1
- package/build/src/start/server/metro/debugging/attachAtlas.js +2 -0
- package/build/src/start/server/metro/debugging/attachAtlas.js.map +1 -1
- package/build/src/start/server/metro/dev-server/createMetroMiddleware.js +1 -1
- package/build/src/start/server/metro/dev-server/createMetroMiddleware.js.map +1 -1
- package/build/src/start/server/metro/fetchRouterManifest.js +1 -0
- package/build/src/start/server/metro/fetchRouterManifest.js.map +1 -1
- package/build/src/start/server/metro/formatFileCandidates.js.map +1 -1
- package/build/src/start/server/metro/getCssModulesFromBundler.js +10 -9
- package/build/src/start/server/metro/getCssModulesFromBundler.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +44 -40
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/metroErrorInterface.js +79 -12
- package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
- package/build/src/start/server/metro/metroVirtualModules.js.map +1 -1
- package/build/src/start/server/metro/metroWatchTypeScriptFiles.js.map +1 -1
- package/build/src/start/server/metro/router.js +75 -0
- package/build/src/start/server/metro/router.js.map +1 -1
- package/build/src/start/server/metro/runServer-fork.js +19 -19
- package/build/src/start/server/metro/runServer-fork.js.map +1 -1
- package/build/src/start/server/metro/serializeHtml.js +45 -5
- package/build/src/start/server/metro/serializeHtml.js.map +1 -1
- package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -1
- package/build/src/start/server/metro/withMetroErrorReportingResolver.js +267 -0
- package/build/src/start/server/metro/withMetroErrorReportingResolver.js.map +1 -0
- package/build/src/start/server/metro/withMetroMultiPlatform.js +58 -82
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/metro/withMetroResolvers.js +2 -219
- package/build/src/start/server/metro/withMetroResolvers.js.map +1 -1
- package/build/src/start/server/metro/withMetroSupervisingTransformWorker.js +63 -0
- package/build/src/start/server/metro/withMetroSupervisingTransformWorker.js.map +1 -0
- package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js +1 -1
- package/build/src/start/server/middleware/createBuiltinAPIRequestHandler.js.map +1 -1
- package/build/src/start/server/middleware/metroOptions.js +7 -2
- package/build/src/start/server/middleware/metroOptions.js.map +1 -1
- package/build/src/start/server/middleware/resolvePlatform.js +3 -0
- package/build/src/start/server/middleware/resolvePlatform.js.map +1 -1
- package/build/src/start/server/serverLogLikeMetro.js +13 -11
- package/build/src/start/server/serverLogLikeMetro.js.map +1 -1
- package/build/src/start/server/type-generation/routes.js.map +1 -1
- package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
- package/build/src/types.d.ts +2 -0
- package/build/src/utils/build-cache-providers/index.js.map +1 -1
- package/build/src/utils/dir.js +7 -0
- package/build/src/utils/dir.js.map +1 -1
- package/build/src/utils/env.js +9 -4
- package/build/src/utils/env.js.map +1 -1
- package/build/src/utils/errors.js +1 -1
- package/build/src/utils/errors.js.map +1 -1
- package/build/src/utils/git.js +2 -2
- package/build/src/utils/git.js.map +1 -1
- package/build/src/utils/telemetry/clients/FetchClient.js +1 -1
- package/build/src/utils/telemetry/utils/context.js +1 -1
- package/build/src/utils/tsconfig/resolveWithTsConfigPaths.js.map +1 -1
- package/internal/unstable-expo-updates-exports.d.ts +31 -0
- package/internal/unstable-expo-updates-exports.js +3 -0
- package/package.json +33 -17
- package/static/template/[...rsc]+api.ts +1 -1
- package/build/src/start/server/metro/createExpoStickyResolver.js +0 -137
- package/build/src/start/server/metro/createExpoStickyResolver.js.map +0 -1
- package/build/src/start/server/metro/metroPrivateServer.js +0 -28
- package/build/src/start/server/metro/metroPrivateServer.js.map +0 -1
- package/build/src/utils/jsonSchemaDeref.js +0 -150
- package/build/src/utils/jsonSchemaDeref.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/runServer-fork.ts"],"sourcesContent":["// Copyright © 2023 650 Industries.\n// Copyright (c) Meta Platforms, Inc. and affiliates.\n//\n// Forks https://github.com/facebook/metro/blob/b80d9a0f638ee9fb82ff69cd3c8d9f4309ca1da2/packages/metro/src/index.flow.js#L57\n// and adds the ability to access the bundler instance.\nimport
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/runServer-fork.ts"],"sourcesContent":["// Copyright © 2023 650 Industries.\n// Copyright (c) Meta Platforms, Inc. and affiliates.\n//\n// Forks https://github.com/facebook/metro/blob/b80d9a0f638ee9fb82ff69cd3c8d9f4309ca1da2/packages/metro/src/index.flow.js#L57\n// and adds the ability to access the bundler instance.\nimport { createConnectMiddleware } from '@expo/metro/metro';\nimport type { RunServerOptions } from '@expo/metro/metro';\nimport MetroHmrServer, { type Client as MetroHmrClient } from '@expo/metro/metro/HmrServer';\nimport Server from '@expo/metro/metro/Server';\nimport createWebsocketServer from '@expo/metro/metro/lib/createWebsocketServer';\nimport type { ConfigT } from '@expo/metro/metro-config';\nimport assert from 'assert';\nimport http from 'http';\nimport https from 'https';\nimport { parse } from 'url';\nimport type { WebSocketServer } from 'ws';\n\nimport { MetroBundlerDevServer } from './MetroBundlerDevServer';\nimport { Log } from '../../../log';\nimport { getRunningProcess } from '../../../utils/getRunningProcess';\nimport type { ConnectAppType } from '../middleware/server.types';\n\nexport const runServer = async (\n metroBundler: MetroBundlerDevServer,\n config: ConfigT,\n {\n hasReducedPerformance = false,\n host,\n onError,\n onReady,\n secureServerOptions,\n waitForBundler = false,\n websocketEndpoints = {},\n watch,\n }: RunServerOptions,\n {\n mockServer,\n }: {\n // Use a mock server object instead of creating a real server, this is used in export cases where we want to reuse codepaths but not actually start a server.\n mockServer: boolean;\n }\n): Promise<{\n server: http.Server | https.Server;\n hmrServer: MetroHmrServer<MetroHmrClient> | null;\n metro: Server;\n}> => {\n // await earlyPortCheck(host, config.server.port);\n\n // if (secure != null || secureCert != null || secureKey != null) {\n // // eslint-disable-next-line no-console\n // console.warn(\n // chalk.inverse.yellow.bold(' DEPRECATED '),\n // 'The `secure`, `secureCert`, and `secureKey` options are now deprecated. ' +\n // 'Use the `secureServerOptions` object instead to pass options to ' +\n // \"Metro's https development server.\",\n // );\n // }\n\n const { middleware, end, metroServer } = await createConnectMiddleware(config, {\n hasReducedPerformance,\n waitForBundler,\n watch,\n });\n\n if (!mockServer) {\n assert(typeof (middleware as any).use === 'function');\n }\n const serverApp = middleware as ConnectAppType;\n\n let httpServer: http.Server | https.Server;\n\n if (secureServerOptions != null) {\n httpServer = https.createServer(secureServerOptions, serverApp);\n } else {\n httpServer = http.createServer(serverApp);\n }\n\n httpServer.on('error', (error) => {\n if ('code' in error && error.code === 'EADDRINUSE') {\n // If `Error: listen EADDRINUSE: address already in use :::8081` then print additional info\n // about the process before throwing.\n const info = getRunningProcess(config.server.port);\n if (info) {\n Log.error(\n `Port ${config.server.port} is busy running ${info.command} in: ${info.directory}`\n );\n }\n }\n\n if (onError) {\n onError(error);\n }\n end();\n });\n\n // Disable any kind of automatic timeout behavior for incoming\n // requests in case it takes the packager more than the default\n // timeout of 120 seconds to respond to a request.\n httpServer.timeout = 0;\n\n httpServer.on('close', () => {\n end();\n });\n\n // Extend the close method to ensure all websocket servers are closed, and connections are terminated\n const originalClose = httpServer.close.bind(httpServer);\n\n httpServer.close = function closeHttpServer(callback) {\n originalClose(callback);\n\n // Close all websocket servers, including possible client connections (see: https://github.com/websockets/ws/issues/2137#issuecomment-1507469375)\n for (const endpoint of Object.values(websocketEndpoints) as WebSocketServer[]) {\n endpoint.close();\n endpoint.clients.forEach((client) => client.terminate());\n }\n\n // Forcibly close active connections\n this.closeAllConnections();\n return this;\n };\n\n if (mockServer) {\n return { server: httpServer, hmrServer: null, metro: metroServer };\n }\n\n return new Promise<{\n server: http.Server | https.Server;\n hmrServer: MetroHmrServer<MetroHmrClient>;\n metro: Server;\n }>((resolve, reject) => {\n httpServer.on('error', (error) => {\n reject(error);\n });\n\n httpServer.listen(config.server.port, host, () => {\n if (onReady) {\n onReady(httpServer);\n }\n\n const hmrServer = new MetroHmrServer(\n metroServer.getBundler(),\n metroServer.getCreateModuleId(),\n config\n );\n\n Object.assign(websocketEndpoints, {\n '/hot': createWebsocketServer({\n websocketServer: hmrServer,\n }),\n });\n\n httpServer.on('upgrade', (request, socket, head) => {\n const { pathname } = parse(request.url!);\n if (pathname != null && websocketEndpoints[pathname]) {\n websocketEndpoints[pathname].handleUpgrade(request, socket, head, (ws) => {\n websocketEndpoints[pathname].emit('connection', ws, request);\n });\n } else {\n socket.destroy();\n }\n });\n\n resolve({ server: httpServer, hmrServer, metro: metroServer });\n });\n });\n};\n"],"names":["runServer","metroBundler","config","hasReducedPerformance","host","onError","onReady","secureServerOptions","waitForBundler","websocketEndpoints","watch","mockServer","middleware","end","metroServer","createConnectMiddleware","assert","use","serverApp","httpServer","https","createServer","http","on","error","code","info","getRunningProcess","server","port","Log","command","directory","timeout","originalClose","close","bind","closeHttpServer","callback","endpoint","Object","values","clients","forEach","client","terminate","closeAllConnections","hmrServer","metro","Promise","resolve","reject","listen","MetroHmrServer","getBundler","getCreateModuleId","assign","createWebsocketServer","websocketServer","request","socket","head","pathname","parse","url","handleUpgrade","ws","emit","destroy"],"mappings":"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"}
|
|
@@ -2,9 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
assetsRequiresSort: function() {
|
|
13
|
+
return assetsRequiresSort;
|
|
14
|
+
},
|
|
15
|
+
serializeHtmlWithAssets: function() {
|
|
8
16
|
return serializeHtmlWithAssets;
|
|
9
17
|
}
|
|
10
18
|
});
|
|
@@ -52,8 +60,8 @@ function htmlFromSerialAssets(assets, { isExporting, template, baseUrl, bundleUr
|
|
|
52
60
|
// External link tags will be passed through as-is.
|
|
53
61
|
return source;
|
|
54
62
|
}).join('');
|
|
55
|
-
const
|
|
56
|
-
const scripts = bundleUrl ? `<script src="${bundleUrl}" defer></script>` :
|
|
63
|
+
const orderedJsAssets = assetsRequiresSort(assets.filter((asset)=>asset.type === 'js'));
|
|
64
|
+
const scripts = bundleUrl ? `<script src="${bundleUrl}" defer></script>` : orderedJsAssets.map(({ filename, metadata })=>{
|
|
57
65
|
// TODO: Mark dependencies of the HTML and include them to prevent waterfalls.
|
|
58
66
|
if (metadata.isAsync) {
|
|
59
67
|
// We have the data required to match async chunks to the route's HTML file.
|
|
@@ -79,5 +87,37 @@ function htmlFromSerialAssets(assets, { isExporting, template, baseUrl, bundleUr
|
|
|
79
87
|
}
|
|
80
88
|
return template.replace('</head>', `${styleString}</head>`).replace('</body>', `${scripts}\n</body>`);
|
|
81
89
|
}
|
|
90
|
+
function assetsRequiresSort(assets) {
|
|
91
|
+
const lookup = new Map();
|
|
92
|
+
const visited = new Set();
|
|
93
|
+
const visiting = new Set();
|
|
94
|
+
const result = [];
|
|
95
|
+
assets.forEach((a)=>{
|
|
96
|
+
lookup.set(a.filename, a);
|
|
97
|
+
});
|
|
98
|
+
function visit(name) {
|
|
99
|
+
var _module_metadata_requires;
|
|
100
|
+
if (visited.has(name)) return;
|
|
101
|
+
if (visiting.has(name)) throw new Error(`Circular dependencies in assets are not allowed. Found cycle: ${[
|
|
102
|
+
...visiting,
|
|
103
|
+
name
|
|
104
|
+
].join(' -> ')}`);
|
|
105
|
+
visiting.add(name);
|
|
106
|
+
const module = lookup.get(name);
|
|
107
|
+
if (!module) throw new Error(`Asset not found: ${name}`);
|
|
108
|
+
(_module_metadata_requires = module.metadata.requires) == null ? void 0 : _module_metadata_requires.forEach((dependency)=>{
|
|
109
|
+
visit(dependency);
|
|
110
|
+
});
|
|
111
|
+
visiting.delete(name);
|
|
112
|
+
visited.add(name);
|
|
113
|
+
result.push(module);
|
|
114
|
+
}
|
|
115
|
+
assets.forEach((a)=>{
|
|
116
|
+
if (!visited.has(a.filename)) {
|
|
117
|
+
visit(a.filename);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
82
122
|
|
|
83
123
|
//# sourceMappingURL=serializeHtml.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/serializeHtml.ts"],"sourcesContent":["import { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport { RouteNode } from 'expo-router/build/Route';\n\nconst debug = require('debug')('expo:metro:html') as typeof console.log;\n\nexport function serializeHtmlWithAssets({\n resources,\n template,\n devBundleUrl,\n baseUrl,\n route,\n isExporting,\n hydrate,\n}: {\n resources: SerialAsset[];\n template: string;\n /** asset prefix used for deploying to non-standard origins like GitHub pages. */\n baseUrl: string;\n devBundleUrl?: string;\n route?: RouteNode;\n isExporting: boolean;\n hydrate?: boolean;\n}): string {\n if (!resources) {\n return '';\n }\n return htmlFromSerialAssets(resources, {\n isExporting,\n template,\n baseUrl,\n bundleUrl: isExporting ? undefined : devBundleUrl,\n route,\n hydrate,\n });\n}\n\n/**\n * Combine the path segments of a URL.\n * This filters out empty segments and avoids duplicate slashes when joining.\n * If base url is empty, it will be treated as a root path, adding `/` to the beginning.\n */\nfunction combineUrlPath(baseUrl: string, ...segments: string[]) {\n return [baseUrl || '/', ...segments]\n .filter(Boolean)\n .map((segment, index) => {\n const segmentIsBaseUrl = index === 0;\n // Do not remove leading slashes from baseUrl\n return segment.replace(segmentIsBaseUrl ? /\\/+$/g : /^\\/+|\\/+$/g, '');\n })\n .join('/');\n}\n\nfunction htmlFromSerialAssets(\n assets: SerialAsset[],\n {\n isExporting,\n template,\n baseUrl,\n bundleUrl,\n route,\n hydrate,\n }: {\n isExporting: boolean;\n template: string;\n baseUrl: string;\n /** This is dev-only. */\n bundleUrl?: string;\n route?: RouteNode;\n hydrate?: boolean;\n }\n) {\n // Combine the CSS modules into tags that have hot refresh data attributes.\n const styleString = assets\n .filter((asset) => asset.type.startsWith('css'))\n .map(({ type, metadata, filename, source }) => {\n if (type === 'css') {\n if (isExporting) {\n return [\n `<link rel=\"preload\" href=\"${combineUrlPath(baseUrl, filename)}\" as=\"style\">`,\n `<link rel=\"stylesheet\" href=\"${combineUrlPath(baseUrl, filename)}\">`,\n ].join('');\n } else {\n return `<style data-expo-css-hmr=\"${metadata.hmrId}\">` + source + '\\n</style>';\n }\n }\n // External link tags will be passed through as-is.\n return source;\n })\n .join('');\n\n const
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/serializeHtml.ts"],"sourcesContent":["import type { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport type { RouteNode } from 'expo-router/build/Route';\n\nconst debug = require('debug')('expo:metro:html') as typeof console.log;\n\nexport function serializeHtmlWithAssets({\n resources,\n template,\n devBundleUrl,\n baseUrl,\n route,\n isExporting,\n hydrate,\n}: {\n resources: SerialAsset[];\n template: string;\n /** asset prefix used for deploying to non-standard origins like GitHub pages. */\n baseUrl: string;\n devBundleUrl?: string;\n route?: RouteNode;\n isExporting: boolean;\n hydrate?: boolean;\n}): string {\n if (!resources) {\n return '';\n }\n return htmlFromSerialAssets(resources, {\n isExporting,\n template,\n baseUrl,\n bundleUrl: isExporting ? undefined : devBundleUrl,\n route,\n hydrate,\n });\n}\n\n/**\n * Combine the path segments of a URL.\n * This filters out empty segments and avoids duplicate slashes when joining.\n * If base url is empty, it will be treated as a root path, adding `/` to the beginning.\n */\nfunction combineUrlPath(baseUrl: string, ...segments: string[]) {\n return [baseUrl || '/', ...segments]\n .filter(Boolean)\n .map((segment, index) => {\n const segmentIsBaseUrl = index === 0;\n // Do not remove leading slashes from baseUrl\n return segment.replace(segmentIsBaseUrl ? /\\/+$/g : /^\\/+|\\/+$/g, '');\n })\n .join('/');\n}\n\nfunction htmlFromSerialAssets(\n assets: SerialAsset[],\n {\n isExporting,\n template,\n baseUrl,\n bundleUrl,\n route,\n hydrate,\n }: {\n isExporting: boolean;\n template: string;\n baseUrl: string;\n /** This is dev-only. */\n bundleUrl?: string;\n route?: RouteNode;\n hydrate?: boolean;\n }\n) {\n // Combine the CSS modules into tags that have hot refresh data attributes.\n const styleString = assets\n .filter((asset) => asset.type.startsWith('css'))\n .map(({ type, metadata, filename, source }) => {\n if (type === 'css') {\n if (isExporting) {\n return [\n `<link rel=\"preload\" href=\"${combineUrlPath(baseUrl, filename)}\" as=\"style\">`,\n `<link rel=\"stylesheet\" href=\"${combineUrlPath(baseUrl, filename)}\">`,\n ].join('');\n } else {\n return `<style data-expo-css-hmr=\"${metadata.hmrId}\">` + source + '\\n</style>';\n }\n }\n // External link tags will be passed through as-is.\n return source;\n })\n .join('');\n\n const orderedJsAssets = assetsRequiresSort(assets.filter((asset) => asset.type === 'js'));\n\n const scripts = bundleUrl\n ? `<script src=\"${bundleUrl}\" defer></script>`\n : orderedJsAssets\n .map(({ filename, metadata }) => {\n // TODO: Mark dependencies of the HTML and include them to prevent waterfalls.\n if (metadata.isAsync) {\n // We have the data required to match async chunks to the route's HTML file.\n if (\n route?.entryPoints &&\n metadata.modulePaths &&\n Array.isArray(route.entryPoints) &&\n Array.isArray(metadata.modulePaths)\n ) {\n // TODO: Handle module IDs like `expo-router/build/views/Unmatched.js`\n const doesAsyncChunkContainRouteEntryPoint = route.entryPoints.some((entryPoint) =>\n (metadata.modulePaths as string[]).includes(entryPoint)\n );\n if (!doesAsyncChunkContainRouteEntryPoint) {\n return '';\n }\n debug('Linking async chunk %s to HTML for route %s', filename, route.contextKey);\n // Pass through to the next condition.\n } else {\n return '';\n }\n // Mark async chunks as defer so they don't block the page load.\n // return `<script src=\"${combineUrlPath(baseUrl, filename)\" defer></script>`;\n }\n\n return `<script src=\"${combineUrlPath(baseUrl, filename)}\" defer></script>`;\n })\n .join('');\n\n if (hydrate) {\n const hydrateScript = `<script type=\"module\">globalThis.__EXPO_ROUTER_HYDRATE__=true;</script>`;\n template = template.replace('</head>', `${hydrateScript}</head>`);\n }\n\n return template\n .replace('</head>', `${styleString}</head>`)\n .replace('</body>', `${scripts}\\n</body>`);\n}\n\n/**\n * Sorts assets based on the requires tree. DFS order.\n */\nexport function assetsRequiresSort(assets: SerialAsset[]): SerialAsset[] {\n const lookup = new Map<string, SerialAsset>();\n const visited = new Set();\n const visiting = new Set();\n const result: SerialAsset[] = [];\n\n assets.forEach((a) => {\n lookup.set(a.filename, a);\n });\n\n function visit(name: string) {\n if (visited.has(name)) return;\n if (visiting.has(name))\n throw new Error(\n `Circular dependencies in assets are not allowed. Found cycle: ${[...visiting, name].join(' -> ')}`\n );\n\n visiting.add(name);\n\n const module = lookup.get(name);\n if (!module) throw new Error(`Asset not found: ${name}`);\n\n module.metadata.requires?.forEach((dependency) => {\n visit(dependency);\n });\n\n visiting.delete(name);\n visited.add(name);\n result.push(module);\n }\n\n assets.forEach((a) => {\n if (!visited.has(a.filename)) {\n visit(a.filename);\n }\n });\n\n return result;\n}\n"],"names":["assetsRequiresSort","serializeHtmlWithAssets","debug","require","resources","template","devBundleUrl","baseUrl","route","isExporting","hydrate","htmlFromSerialAssets","bundleUrl","undefined","combineUrlPath","segments","filter","Boolean","map","segment","index","segmentIsBaseUrl","replace","join","assets","styleString","asset","type","startsWith","metadata","filename","source","hmrId","orderedJsAssets","scripts","isAsync","entryPoints","modulePaths","Array","isArray","doesAsyncChunkContainRouteEntryPoint","some","entryPoint","includes","contextKey","hydrateScript","lookup","Map","visited","Set","visiting","result","forEach","a","set","visit","name","module","has","Error","add","get","requires","dependency","delete","push"],"mappings":";;;;;;;;;;;IA0IgBA,kBAAkB;eAAlBA;;IArIAC,uBAAuB;eAAvBA;;;AAFhB,MAAMC,QAAQC,QAAQ,SAAS;AAExB,SAASF,wBAAwB,EACtCG,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,OAAO,EACPC,KAAK,EACLC,WAAW,EACXC,OAAO,EAUR;IACC,IAAI,CAACN,WAAW;QACd,OAAO;IACT;IACA,OAAOO,qBAAqBP,WAAW;QACrCK;QACAJ;QACAE;QACAK,WAAWH,cAAcI,YAAYP;QACrCE;QACAE;IACF;AACF;AAEA;;;;CAIC,GACD,SAASI,eAAeP,OAAe,EAAE,GAAGQ,QAAkB;IAC5D,OAAO;QAACR,WAAW;WAAQQ;KAAS,CACjCC,MAAM,CAACC,SACPC,GAAG,CAAC,CAACC,SAASC;QACb,MAAMC,mBAAmBD,UAAU;QACnC,6CAA6C;QAC7C,OAAOD,QAAQG,OAAO,CAACD,mBAAmB,UAAU,cAAc;IACpE,GACCE,IAAI,CAAC;AACV;AAEA,SAASZ,qBACPa,MAAqB,EACrB,EACEf,WAAW,EACXJ,QAAQ,EACRE,OAAO,EACPK,SAAS,EACTJ,KAAK,EACLE,OAAO,EASR;IAED,2EAA2E;IAC3E,MAAMe,cAAcD,OACjBR,MAAM,CAAC,CAACU,QAAUA,MAAMC,IAAI,CAACC,UAAU,CAAC,QACxCV,GAAG,CAAC,CAAC,EAAES,IAAI,EAAEE,QAAQ,EAAEC,QAAQ,EAAEC,MAAM,EAAE;QACxC,IAAIJ,SAAS,OAAO;YAClB,IAAIlB,aAAa;gBACf,OAAO;oBACL,CAAC,0BAA0B,EAAEK,eAAeP,SAASuB,UAAU,aAAa,CAAC;oBAC7E,CAAC,6BAA6B,EAAEhB,eAAeP,SAASuB,UAAU,EAAE,CAAC;iBACtE,CAACP,IAAI,CAAC;YACT,OAAO;gBACL,OAAO,CAAC,0BAA0B,EAAEM,SAASG,KAAK,CAAC,EAAE,CAAC,GAAGD,SAAS;YACpE;QACF;QACA,mDAAmD;QACnD,OAAOA;IACT,GACCR,IAAI,CAAC;IAER,MAAMU,kBAAkBjC,mBAAmBwB,OAAOR,MAAM,CAAC,CAACU,QAAUA,MAAMC,IAAI,KAAK;IAEnF,MAAMO,UAAUtB,YACZ,CAAC,aAAa,EAAEA,UAAU,iBAAiB,CAAC,GAC5CqB,gBACGf,GAAG,CAAC,CAAC,EAAEY,QAAQ,EAAED,QAAQ,EAAE;QAC1B,8EAA8E;QAC9E,IAAIA,SAASM,OAAO,EAAE;YACpB,4EAA4E;YAC5E,IACE3B,CAAAA,yBAAAA,MAAO4B,WAAW,KAClBP,SAASQ,WAAW,IACpBC,MAAMC,OAAO,CAAC/B,MAAM4B,WAAW,KAC/BE,MAAMC,OAAO,CAACV,SAASQ,WAAW,GAClC;gBACA,sEAAsE;gBACtE,MAAMG,uCAAuChC,MAAM4B,WAAW,CAACK,IAAI,CAAC,CAACC,aACnE,AAACb,SAASQ,WAAW,CAAcM,QAAQ,CAACD;gBAE9C,IAAI,CAACF,sCAAsC;oBACzC,OAAO;gBACT;gBACAtC,MAAM,+CAA+C4B,UAAUtB,MAAMoC,UAAU;YAC/E,sCAAsC;YACxC,OAAO;gBACL,OAAO;YACT;QACA,gEAAgE;QAChE,8EAA8E;QAChF;QAEA,OAAO,CAAC,aAAa,EAAE9B,eAAeP,SAASuB,UAAU,iBAAiB,CAAC;IAC7E,GACCP,IAAI,CAAC;IAEZ,IAAIb,SAAS;QACX,MAAMmC,gBAAgB,CAAC,uEAAuE,CAAC;QAC/FxC,WAAWA,SAASiB,OAAO,CAAC,WAAW,GAAGuB,cAAc,OAAO,CAAC;IAClE;IAEA,OAAOxC,SACJiB,OAAO,CAAC,WAAW,GAAGG,YAAY,OAAO,CAAC,EAC1CH,OAAO,CAAC,WAAW,GAAGY,QAAQ,SAAS,CAAC;AAC7C;AAKO,SAASlC,mBAAmBwB,MAAqB;IACtD,MAAMsB,SAAS,IAAIC;IACnB,MAAMC,UAAU,IAAIC;IACpB,MAAMC,WAAW,IAAID;IACrB,MAAME,SAAwB,EAAE;IAEhC3B,OAAO4B,OAAO,CAAC,CAACC;QACdP,OAAOQ,GAAG,CAACD,EAAEvB,QAAQ,EAAEuB;IACzB;IAEA,SAASE,MAAMC,IAAY;YAYzBC;QAXA,IAAIT,QAAQU,GAAG,CAACF,OAAO;QACvB,IAAIN,SAASQ,GAAG,CAACF,OACf,MAAM,IAAIG,MACR,CAAC,8DAA8D,EAAE;eAAIT;YAAUM;SAAK,CAACjC,IAAI,CAAC,SAAS;QAGvG2B,SAASU,GAAG,CAACJ;QAEb,MAAMC,SAASX,OAAOe,GAAG,CAACL;QAC1B,IAAI,CAACC,QAAQ,MAAM,IAAIE,MAAM,CAAC,iBAAiB,EAAEH,MAAM;SAEvDC,4BAAAA,OAAO5B,QAAQ,CAACiC,QAAQ,qBAAxBL,0BAA0BL,OAAO,CAAC,CAACW;YACjCR,MAAMQ;QACR;QAEAb,SAASc,MAAM,CAACR;QAChBR,QAAQY,GAAG,CAACJ;QACZL,OAAOc,IAAI,CAACR;IACd;IAEAjC,OAAO4B,OAAO,CAAC,CAACC;QACd,IAAI,CAACL,QAAQU,GAAG,CAACL,EAAEvB,QAAQ,GAAG;YAC5ByB,MAAMF,EAAEvB,QAAQ;QAClB;IACF;IAEA,OAAOqB;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/waitForMetroToObserveTypeScriptFile.ts"],"sourcesContent":["import path from 'path';\n\nimport type { ServerLike } from '../BundlerDevServer';\n\nconst debug = require('debug')('expo:start:server:metro:waitForTypescript') as typeof console.log;\n\nexport type FileChangeEvent = {\n filePath: string;\n metadata?: {\n type: 'f' | 'd' | 'l'; // Regular file / Directory / Symlink\n } | null;\n type: string;\n};\n\n/**\n * Use the native file watcher / Metro ruleset to detect if a\n * TypeScript file is added to the project during development.\n */\nexport function waitForMetroToObserveTypeScriptFile(\n projectRoot: string,\n runner: {\n metro:
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/waitForMetroToObserveTypeScriptFile.ts"],"sourcesContent":["import type MetroServer from '@expo/metro/metro/Server';\nimport path from 'path';\n\nimport type { ServerLike } from '../BundlerDevServer';\n\nconst debug = require('debug')('expo:start:server:metro:waitForTypescript') as typeof console.log;\n\nexport type FileChangeEvent = {\n filePath: string;\n metadata?: {\n type: 'f' | 'd' | 'l'; // Regular file / Directory / Symlink\n } | null;\n type: string;\n};\n\n/**\n * Use the native file watcher / Metro ruleset to detect if a\n * TypeScript file is added to the project during development.\n */\nexport function waitForMetroToObserveTypeScriptFile(\n projectRoot: string,\n runner: {\n metro: MetroServer;\n server: ServerLike;\n },\n callback: () => Promise<void>\n): () => void {\n const watcher = runner.metro.getBundler().getBundler().getWatcher();\n\n const tsconfigPath = path.join(projectRoot, 'tsconfig.json');\n\n const listener = ({ eventsQueue }: { eventsQueue: FileChangeEvent[] }) => {\n for (const event of eventsQueue) {\n if (\n event.type === 'add' &&\n event.metadata?.type !== 'd' &&\n // We need to ignore node_modules because Metro will add all of the files in node_modules to the watcher.\n !/node_modules/.test(event.filePath)\n ) {\n const { filePath } = event;\n // Is TypeScript?\n if (\n // If the user adds a TypeScript file to the observable files in their project.\n /\\.tsx?$/.test(filePath) ||\n // Or if the user adds a tsconfig.json file to the project root.\n filePath === tsconfigPath\n ) {\n debug('Detected TypeScript file added to the project: ', filePath);\n callback();\n off();\n return;\n }\n }\n }\n };\n\n debug('Waiting for TypeScript files to be added to the project...');\n watcher.addListener('change', listener);\n\n const off = () => {\n watcher.removeListener('change', listener);\n };\n\n runner.server.addListener?.('close', off);\n return off;\n}\n\nexport function observeFileChanges(\n runner: {\n metro: MetroServer;\n server: ServerLike;\n },\n files: string[],\n callback: () => void | Promise<void>\n): () => void {\n const watcher = runner.metro.getBundler().getBundler().getWatcher();\n\n const listener = ({\n eventsQueue,\n }: {\n eventsQueue: {\n filePath: string;\n metadata?: {\n type: 'f' | 'd' | 'l'; // Regular file / Directory / Symlink\n } | null;\n type: string;\n }[];\n }) => {\n for (const event of eventsQueue) {\n if (\n // event.type === 'add' &&\n event.metadata?.type !== 'd' &&\n // We need to ignore node_modules because Metro will add all of the files in node_modules to the watcher.\n !/node_modules/.test(event.filePath)\n ) {\n const { filePath } = event;\n // Is TypeScript?\n if (files.includes(filePath)) {\n debug('Observed change:', filePath);\n callback();\n return;\n }\n }\n }\n };\n\n debug('Watching file changes:', files);\n watcher.addListener('change', listener);\n\n const off = () => {\n watcher.removeListener('change', listener);\n };\n\n runner.server.addListener?.('close', off);\n return off;\n}\n\nexport function observeAnyFileChanges(\n runner: {\n metro: MetroServer;\n server: ServerLike;\n },\n callback: (events: FileChangeEvent[]) => void | Promise<void>\n): () => void {\n const watcher = runner.metro.getBundler().getBundler().getWatcher();\n\n const listener = ({ eventsQueue }: { eventsQueue: FileChangeEvent[] }) => {\n callback(eventsQueue);\n };\n\n watcher.addListener('change', listener);\n\n const off = () => {\n watcher.removeListener('change', listener);\n };\n\n runner.server.addListener?.('close', off);\n return off;\n}\n"],"names":["observeAnyFileChanges","observeFileChanges","waitForMetroToObserveTypeScriptFile","debug","require","projectRoot","runner","callback","watcher","metro","getBundler","getWatcher","tsconfigPath","path","join","listener","eventsQueue","event","type","metadata","test","filePath","off","addListener","removeListener","server","files","includes"],"mappings":";;;;;;;;;;;IAqHgBA,qBAAqB;eAArBA;;IAlDAC,kBAAkB;eAAlBA;;IAhDAC,mCAAmC;eAAnCA;;;;gEAlBC;;;;;;;;;;;AAIjB,MAAMC,QAAQC,QAAQ,SAAS;AAcxB,SAASF,oCACdG,WAAmB,EACnBC,MAGC,EACDC,QAA6B;IAE7B,MAAMC,UAAUF,OAAOG,KAAK,CAACC,UAAU,GAAGA,UAAU,GAAGC,UAAU;IAEjE,MAAMC,eAAeC,eAAI,CAACC,IAAI,CAACT,aAAa;IAE5C,MAAMU,WAAW,CAAC,EAAEC,WAAW,EAAsC;QACnE,KAAK,MAAMC,SAASD,YAAa;gBAG7BC;YAFF,IACEA,MAAMC,IAAI,KAAK,SACfD,EAAAA,kBAAAA,MAAME,QAAQ,qBAAdF,gBAAgBC,IAAI,MAAK,OACzB,yGAAyG;YACzG,CAAC,eAAeE,IAAI,CAACH,MAAMI,QAAQ,GACnC;gBACA,MAAM,EAAEA,QAAQ,EAAE,GAAGJ;gBACrB,iBAAiB;gBACjB,IACE,+EAA+E;gBAC/E,UAAUG,IAAI,CAACC,aACf,gEAAgE;gBAChEA,aAAaT,cACb;oBACAT,MAAM,mDAAmDkB;oBACzDd;oBACAe;oBACA;gBACF;YACF;QACF;IACF;IAEAnB,MAAM;IACNK,QAAQe,WAAW,CAAC,UAAUR;IAE9B,MAAMO,MAAM;QACVd,QAAQgB,cAAc,CAAC,UAAUT;IACnC;IAEAT,OAAOmB,MAAM,CAACF,WAAW,oBAAzBjB,OAAOmB,MAAM,CAACF,WAAW,MAAzBjB,OAAOmB,MAAM,EAAe,SAASH;IACrC,OAAOA;AACT;AAEO,SAASrB,mBACdK,MAGC,EACDoB,KAAe,EACfnB,QAAoC;IAEpC,MAAMC,UAAUF,OAAOG,KAAK,CAACC,UAAU,GAAGA,UAAU,GAAGC,UAAU;IAEjE,MAAMI,WAAW,CAAC,EAChBC,WAAW,EASZ;QACC,KAAK,MAAMC,SAASD,YAAa;gBAE7B,0BAA0B;YAC1BC;YAFF,IAEEA,EAAAA,kBAAAA,MAAME,QAAQ,qBAAdF,gBAAgBC,IAAI,MAAK,OACzB,yGAAyG;YACzG,CAAC,eAAeE,IAAI,CAACH,MAAMI,QAAQ,GACnC;gBACA,MAAM,EAAEA,QAAQ,EAAE,GAAGJ;gBACrB,iBAAiB;gBACjB,IAAIS,MAAMC,QAAQ,CAACN,WAAW;oBAC5BlB,MAAM,oBAAoBkB;oBAC1Bd;oBACA;gBACF;YACF;QACF;IACF;IAEAJ,MAAM,0BAA0BuB;IAChClB,QAAQe,WAAW,CAAC,UAAUR;IAE9B,MAAMO,MAAM;QACVd,QAAQgB,cAAc,CAAC,UAAUT;IACnC;IAEAT,OAAOmB,MAAM,CAACF,WAAW,oBAAzBjB,OAAOmB,MAAM,CAACF,WAAW,MAAzBjB,OAAOmB,MAAM,EAAe,SAASH;IACrC,OAAOA;AACT;AAEO,SAAStB,sBACdM,MAGC,EACDC,QAA6D;IAE7D,MAAMC,UAAUF,OAAOG,KAAK,CAACC,UAAU,GAAGA,UAAU,GAAGC,UAAU;IAEjE,MAAMI,WAAW,CAAC,EAAEC,WAAW,EAAsC;QACnET,SAASS;IACX;IAEAR,QAAQe,WAAW,CAAC,UAAUR;IAE9B,MAAMO,MAAM;QACVd,QAAQgB,cAAc,CAAC,UAAUT;IACnC;IAEAT,OAAOmB,MAAM,CAACF,WAAW,oBAAzBjB,OAAOmB,MAAM,CAACF,WAAW,MAAzBjB,OAAOmB,MAAM,EAAe,SAASH;IACrC,OAAOA;AACT"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
createMutateResolutionError: function() {
|
|
13
|
+
return createMutateResolutionError;
|
|
14
|
+
},
|
|
15
|
+
withMetroErrorReportingResolver: function() {
|
|
16
|
+
return withMetroErrorReportingResolver;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
function _chalk() {
|
|
20
|
+
const data = /*#__PURE__*/ _interop_require_default(require("chalk"));
|
|
21
|
+
_chalk = function() {
|
|
22
|
+
return data;
|
|
23
|
+
};
|
|
24
|
+
return data;
|
|
25
|
+
}
|
|
26
|
+
function _path() {
|
|
27
|
+
const data = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
28
|
+
_path = function() {
|
|
29
|
+
return data;
|
|
30
|
+
};
|
|
31
|
+
return data;
|
|
32
|
+
}
|
|
33
|
+
function _util() {
|
|
34
|
+
const data = require("util");
|
|
35
|
+
_util = function() {
|
|
36
|
+
return data;
|
|
37
|
+
};
|
|
38
|
+
return data;
|
|
39
|
+
}
|
|
40
|
+
const _dir = require("../../../utils/dir");
|
|
41
|
+
const _env = require("../../../utils/env");
|
|
42
|
+
function _interop_require_default(obj) {
|
|
43
|
+
return obj && obj.__esModule ? obj : {
|
|
44
|
+
default: obj
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const debug = require('debug')('expo:metro:withMetroResolvers');
|
|
48
|
+
// TODO: Do we need to expose this?
|
|
49
|
+
const STACK_DEPTH_LIMIT = 35;
|
|
50
|
+
const STACK_COUNT_LIMIT = 2000;
|
|
51
|
+
function withMetroErrorReportingResolver(config) {
|
|
52
|
+
var _config_resolver;
|
|
53
|
+
if (!_env.env.EXPO_METRO_UNSTABLE_ERRORS) {
|
|
54
|
+
return config;
|
|
55
|
+
}
|
|
56
|
+
const originalResolveRequest = (_config_resolver = config.resolver) == null ? void 0 : _config_resolver.resolveRequest;
|
|
57
|
+
const depGraph = new Map();
|
|
58
|
+
const mutateResolutionError = createMutateResolutionError(config, depGraph);
|
|
59
|
+
return {
|
|
60
|
+
...config,
|
|
61
|
+
resolver: {
|
|
62
|
+
...config.resolver,
|
|
63
|
+
resolveRequest (context, moduleName, platform) {
|
|
64
|
+
const storeResult = (res)=>{
|
|
65
|
+
const inputPlatform = platform ?? 'null';
|
|
66
|
+
const key = optionsKeyForContext(context);
|
|
67
|
+
if (!depGraph.has(key)) depGraph.set(key, new Map());
|
|
68
|
+
const mapByTarget = depGraph.get(key);
|
|
69
|
+
if (!mapByTarget.has(inputPlatform)) mapByTarget.set(inputPlatform, new Map());
|
|
70
|
+
const mapByPlatform = mapByTarget.get(inputPlatform);
|
|
71
|
+
if (!mapByPlatform.has(context.originModulePath)) mapByPlatform.set(context.originModulePath, new Set());
|
|
72
|
+
const setForModule = mapByPlatform.get(context.originModulePath);
|
|
73
|
+
const qualifiedModuleName = (res == null ? void 0 : res.type) === 'sourceFile' ? res.filePath : moduleName;
|
|
74
|
+
setForModule.add({
|
|
75
|
+
path: qualifiedModuleName,
|
|
76
|
+
request: moduleName
|
|
77
|
+
});
|
|
78
|
+
};
|
|
79
|
+
// If the user defined a resolver, run it first and depend on the documented
|
|
80
|
+
// chaining logic: https://facebook.github.io/metro/docs/resolution/#resolution-algorithm
|
|
81
|
+
//
|
|
82
|
+
// config.resolver.resolveRequest = (context, moduleName, platform) => {
|
|
83
|
+
//
|
|
84
|
+
// // Do work...
|
|
85
|
+
//
|
|
86
|
+
// return context.resolveRequest(context, moduleName, platform);
|
|
87
|
+
// };
|
|
88
|
+
try {
|
|
89
|
+
const firstResolver = originalResolveRequest ?? context.resolveRequest;
|
|
90
|
+
const res = firstResolver(context, moduleName, platform);
|
|
91
|
+
storeResult(res);
|
|
92
|
+
return res;
|
|
93
|
+
} catch (error) {
|
|
94
|
+
throw mutateResolutionError(error, context, moduleName, platform);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function optionsKeyForContext(context) {
|
|
101
|
+
const canonicalize = require('@expo/metro/metro-core/canonicalize');
|
|
102
|
+
// Compound key for the resolver cache
|
|
103
|
+
return JSON.stringify(context.customResolverOptions ?? {}, canonicalize) ?? '';
|
|
104
|
+
}
|
|
105
|
+
const createMutateResolutionError = (config, depGraph, stackDepthLimit = STACK_DEPTH_LIMIT, stackCountLimit = STACK_COUNT_LIMIT)=>(error, context, moduleName, platform)=>{
|
|
106
|
+
var _config_server;
|
|
107
|
+
const inputPlatform = platform ?? 'null';
|
|
108
|
+
const mapByOrigin = depGraph.get(optionsKeyForContext(context));
|
|
109
|
+
const mapByPlatform = mapByOrigin == null ? void 0 : mapByOrigin.get(inputPlatform);
|
|
110
|
+
if (!mapByPlatform) {
|
|
111
|
+
return error;
|
|
112
|
+
}
|
|
113
|
+
// collect all references inversely using some expensive lookup
|
|
114
|
+
const getReferences = (origin)=>{
|
|
115
|
+
const inverseOrigin = [];
|
|
116
|
+
if (!mapByPlatform) {
|
|
117
|
+
return inverseOrigin;
|
|
118
|
+
}
|
|
119
|
+
for (const [originKey, mapByTarget] of mapByPlatform){
|
|
120
|
+
// search comparing origin to path
|
|
121
|
+
const found = [
|
|
122
|
+
...mapByTarget.values()
|
|
123
|
+
].find((resolution)=>resolution.path === origin);
|
|
124
|
+
if (found) {
|
|
125
|
+
inverseOrigin.push({
|
|
126
|
+
origin,
|
|
127
|
+
previous: originKey,
|
|
128
|
+
request: found.request
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return inverseOrigin;
|
|
133
|
+
};
|
|
134
|
+
const root = ((_config_server = config.server) == null ? void 0 : _config_server.unstable_serverRoot) ?? config.projectRoot;
|
|
135
|
+
const projectRoot = config.projectRoot;
|
|
136
|
+
let stackCounter = 0;
|
|
137
|
+
let inverseStack;
|
|
138
|
+
/** @returns boolean - done */ const saveStack = (stack)=>{
|
|
139
|
+
stackCounter++;
|
|
140
|
+
if (!inverseStack) {
|
|
141
|
+
// First stack, save it
|
|
142
|
+
inverseStack = stack;
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
if (stackCounter >= stackCountLimit) {
|
|
146
|
+
// Too many stacks explored, stop searching
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
if (stack.circular || stack.limited) {
|
|
150
|
+
// Not better than the current one, skip
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
if (inverseStack.circular || inverseStack.limited) {
|
|
154
|
+
// Current one is better than the previous one, save it
|
|
155
|
+
inverseStack = stack;
|
|
156
|
+
// No return as we want to continue validation the new stack
|
|
157
|
+
}
|
|
158
|
+
if (inverseStack.projectRoot) {
|
|
159
|
+
// The best possible stack already acquired, skip
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
const stackOrigin = stack.frames[stack.frames.length - 1].origin;
|
|
163
|
+
if (stackOrigin && (0, _dir.isPathInside)(stackOrigin, projectRoot) && !stackOrigin.includes('node_modules')) {
|
|
164
|
+
// The best stack to show to users is the one leading from the project code.
|
|
165
|
+
stack.serverRoot = true;
|
|
166
|
+
inverseStack = stack;
|
|
167
|
+
return true;
|
|
168
|
+
}
|
|
169
|
+
if (// Has to be after the project root check
|
|
170
|
+
stackOrigin && (0, _dir.isPathInside)(stackOrigin, root) && !stackOrigin.includes('node_modules')) {
|
|
171
|
+
// The best stack to show to users is the one leading from the monorepo code.
|
|
172
|
+
stack.serverRoot = true;
|
|
173
|
+
inverseStack = stack;
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
// If new stack is not better do nothing
|
|
177
|
+
return false;
|
|
178
|
+
};
|
|
179
|
+
/** @returns boolean - done */ const recurseBackWithLimit = (frame, limit, stack = {
|
|
180
|
+
frames: []
|
|
181
|
+
}, visited = new Set())=>{
|
|
182
|
+
stack.frames.push(frame);
|
|
183
|
+
if (visited.has(frame.origin)) {
|
|
184
|
+
stack.circular = true;
|
|
185
|
+
return saveStack(stack);
|
|
186
|
+
}
|
|
187
|
+
if (stack.frames.length >= limit) {
|
|
188
|
+
stack.limited = true;
|
|
189
|
+
return saveStack(stack);
|
|
190
|
+
}
|
|
191
|
+
visited.add(frame.origin);
|
|
192
|
+
const inverse = getReferences(frame.origin);
|
|
193
|
+
if (inverse.length === 0) {
|
|
194
|
+
// No more references, push the stack and return
|
|
195
|
+
return saveStack(stack);
|
|
196
|
+
}
|
|
197
|
+
for (const match of inverse){
|
|
198
|
+
// Use more qualified name if possible
|
|
199
|
+
// results.origin = match.origin;
|
|
200
|
+
// Found entry point
|
|
201
|
+
if (frame.origin === match.previous) {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
const isDone = recurseBackWithLimit({
|
|
205
|
+
origin: match.previous,
|
|
206
|
+
request: match.request
|
|
207
|
+
}, limit, {
|
|
208
|
+
frames: [
|
|
209
|
+
...stack.frames
|
|
210
|
+
]
|
|
211
|
+
}, new Set(visited));
|
|
212
|
+
if (isDone) {
|
|
213
|
+
return true; // Stop search
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return false; // Continue search
|
|
217
|
+
};
|
|
218
|
+
recurseBackWithLimit({
|
|
219
|
+
origin: context.originModulePath,
|
|
220
|
+
request: moduleName
|
|
221
|
+
}, stackDepthLimit);
|
|
222
|
+
debug('Number of explored stacks:', stackCounter);
|
|
223
|
+
if (inverseStack && inverseStack.frames.length > 0) {
|
|
224
|
+
const formattedImport = (0, _chalk().default)`{gray |} {cyan import} `;
|
|
225
|
+
const importMessagePadding = ' '.repeat((0, _util().stripVTControlCharacters)(formattedImport).length + 1);
|
|
226
|
+
debug('Found inverse graph:', JSON.stringify(inverseStack, null, 2));
|
|
227
|
+
let extraMessage = _chalk().default.bold(`Import stack${stackCounter >= stackCountLimit ? ` (${stackCounter})` : ''}:`);
|
|
228
|
+
for (const frame of inverseStack.frames){
|
|
229
|
+
let currentMessage = '';
|
|
230
|
+
let filename = _path().default.relative(root, frame.origin);
|
|
231
|
+
if (filename.match(/\?ctx=[\w\d]+$/)) {
|
|
232
|
+
filename = filename.replace(/\?ctx=[\w\d]+$/, _chalk().default.dim(' (require.context)'));
|
|
233
|
+
} else {
|
|
234
|
+
let formattedRequest = _chalk().default.green(`"${frame.request}"`);
|
|
235
|
+
if (// If bundling for web and the import is pulling internals from outside of react-native
|
|
236
|
+
// then mark it as an invalid import.
|
|
237
|
+
inputPlatform === 'web' && !/^(node_modules\/)?react-native\//.test(filename) && frame.request.match(/^react-native\/.*/)) {
|
|
238
|
+
formattedRequest = formattedRequest + (0, _chalk().default)`\n${importMessagePadding}{yellow ^ Importing react-native internals is not supported on web.}`;
|
|
239
|
+
}
|
|
240
|
+
filename = filename + (0, _chalk().default)`\n${formattedImport}${formattedRequest}`;
|
|
241
|
+
}
|
|
242
|
+
let line = '\n' + _chalk().default.gray(' ') + filename;
|
|
243
|
+
if (filename.match(/node_modules/)) {
|
|
244
|
+
line = _chalk().default.gray(// Bold the node module name
|
|
245
|
+
line.replace(/node_modules\/([^/]+)/, (_match, p1)=>{
|
|
246
|
+
return 'node_modules/' + _chalk().default.bold(p1);
|
|
247
|
+
}));
|
|
248
|
+
}
|
|
249
|
+
currentMessage += `\n${line}`;
|
|
250
|
+
extraMessage += currentMessage;
|
|
251
|
+
}
|
|
252
|
+
if (inverseStack.circular) {
|
|
253
|
+
extraMessage += (0, _chalk().default)`\n${importMessagePadding}{yellow ^ The import above creates circular dependency.}`;
|
|
254
|
+
}
|
|
255
|
+
if (inverseStack.limited) {
|
|
256
|
+
extraMessage += (0, _chalk().default)`\n\n {bold {yellow Depth limit reached. The actual stack is longer than what you can see above.}}`;
|
|
257
|
+
}
|
|
258
|
+
extraMessage += '\n';
|
|
259
|
+
// @ts-expect-error
|
|
260
|
+
error._expoImportStack = extraMessage;
|
|
261
|
+
} else {
|
|
262
|
+
debug('Found no inverse tree for:', context.originModulePath);
|
|
263
|
+
}
|
|
264
|
+
return error;
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
//# sourceMappingURL=withMetroErrorReportingResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/withMetroErrorReportingResolver.ts"],"sourcesContent":["import type { ConfigT as MetroConfig } from '@expo/metro/metro-config';\nimport type { ResolutionContext } from '@expo/metro/metro-resolver';\nimport chalk from 'chalk';\nimport path from 'path';\nimport { stripVTControlCharacters } from 'util';\n\nimport type { ExpoCustomMetroResolver } from './withMetroResolvers';\nimport { isPathInside } from '../../../utils/dir';\nimport { env } from '../../../utils/env';\n\nconst debug = require('debug')('expo:metro:withMetroResolvers') as typeof console.log;\n\n// TODO: Do we need to expose this?\nconst STACK_DEPTH_LIMIT = 35;\nconst STACK_COUNT_LIMIT = 2_000;\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 const depGraph: DepGraph = new Map();\n\n const mutateResolutionError = createMutateResolutionError(config, depGraph);\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\nexport type 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>;\n\nfunction optionsKeyForContext(context: ResolutionContext) {\n const canonicalize: typeof import('@expo/metro/metro-core/canonicalize').default = require('@expo/metro/metro-core/canonicalize');\n // Compound key for the resolver cache\n return JSON.stringify(context.customResolverOptions ?? {}, canonicalize) ?? '';\n}\n\nexport const createMutateResolutionError =\n (\n config: MetroConfig,\n depGraph: DepGraph,\n stackDepthLimit = STACK_DEPTH_LIMIT,\n stackCountLimit = STACK_COUNT_LIMIT\n ) =>\n (error: Error, context: ResolutionContext, moduleName: string, platform: string | null) => {\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 root = config.server?.unstable_serverRoot ?? config.projectRoot;\n const projectRoot = config.projectRoot;\n\n type Frame = {\n origin: string;\n request: string;\n };\n type Stack = {\n circular?: boolean;\n limited?: boolean;\n serverRoot?: boolean;\n projectRoot?: boolean;\n frames: Frame[];\n };\n\n let stackCounter = 0;\n let inverseStack: Stack | undefined;\n /** @returns boolean - done */\n const saveStack = (stack: Stack): boolean => {\n stackCounter++;\n\n if (!inverseStack) {\n // First stack, save it\n inverseStack = stack;\n return false;\n }\n\n if (stackCounter >= stackCountLimit) {\n // Too many stacks explored, stop searching\n return true;\n }\n\n if (stack.circular || stack.limited) {\n // Not better than the current one, skip\n return false;\n }\n\n if (inverseStack.circular || inverseStack.limited) {\n // Current one is better than the previous one, save it\n inverseStack = stack;\n // No return as we want to continue validation the new stack\n }\n\n if (inverseStack.projectRoot) {\n // The best possible stack already acquired, skip\n return true;\n }\n\n const stackOrigin = stack.frames[stack.frames.length - 1].origin;\n\n if (\n stackOrigin &&\n isPathInside(stackOrigin, projectRoot) &&\n !stackOrigin.includes('node_modules')\n ) {\n // The best stack to show to users is the one leading from the project code.\n stack.serverRoot = true;\n inverseStack = stack;\n return true;\n }\n\n if (\n // Has to be after the project root check\n stackOrigin &&\n isPathInside(stackOrigin, root) &&\n !stackOrigin.includes('node_modules')\n ) {\n // The best stack to show to users is the one leading from the monorepo code.\n stack.serverRoot = true;\n inverseStack = stack;\n return false;\n }\n\n // If new stack is not better do nothing\n return false;\n };\n\n /** @returns boolean - done */\n const recurseBackWithLimit = (\n frame: { origin: string; request: string },\n limit: number,\n stack: Stack = { frames: [] },\n visited: Set<string> = new Set()\n ): boolean => {\n stack.frames.push(frame);\n\n if (visited.has(frame.origin)) {\n stack.circular = true;\n return saveStack(stack);\n }\n\n if (stack.frames.length >= limit) {\n stack.limited = true;\n return saveStack(stack);\n }\n\n visited.add(frame.origin);\n\n const inverse = getReferences(frame.origin);\n if (inverse.length === 0) {\n // No more references, push the stack and return\n return saveStack(stack);\n }\n\n for (const match of inverse) {\n // Use more qualified name if possible\n // results.origin = match.origin;\n // Found entry point\n if (frame.origin === match.previous) {\n continue;\n }\n\n const isDone = recurseBackWithLimit(\n { origin: match.previous, request: match.request },\n limit,\n {\n frames: [...stack.frames],\n },\n new Set(visited)\n );\n\n if (isDone) {\n return true; // Stop search\n }\n }\n\n return false; // Continue search\n };\n\n recurseBackWithLimit(\n { origin: context.originModulePath, request: moduleName },\n stackDepthLimit\n );\n\n debug('Number of explored stacks:', stackCounter);\n\n if (inverseStack && inverseStack.frames.length > 0) {\n const formattedImport = chalk`{gray |} {cyan import} `;\n const importMessagePadding = ' '.repeat(stripVTControlCharacters(formattedImport).length + 1);\n\n debug('Found inverse graph:', JSON.stringify(inverseStack, null, 2));\n\n let extraMessage = chalk.bold(\n `Import stack${stackCounter >= stackCountLimit ? ` (${stackCounter})` : ''}:`\n );\n\n for (const frame of inverseStack.frames) {\n let currentMessage = '';\n let filename = path.relative(root, frame.origin);\n\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(`\"${frame.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 frame.request.match(/^react-native\\/.*/)\n ) {\n formattedRequest =\n formattedRequest +\n chalk`\\n${importMessagePadding}{yellow ^ Importing react-native internals is not supported on web.}`;\n }\n\n filename = filename + chalk`\\n${formattedImport}${formattedRequest}`;\n }\n\n let line = '\\n' + 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 currentMessage += `\\n${line}`;\n extraMessage += currentMessage;\n }\n\n if (inverseStack.circular) {\n extraMessage += chalk`\\n${importMessagePadding}{yellow ^ The import above creates circular dependency.}`;\n }\n\n if (inverseStack.limited) {\n extraMessage += chalk`\\n\\n {bold {yellow Depth limit reached. The actual stack is longer than what you can see above.}}`;\n }\n\n extraMessage += '\\n';\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"],"names":["createMutateResolutionError","withMetroErrorReportingResolver","debug","require","STACK_DEPTH_LIMIT","STACK_COUNT_LIMIT","config","env","EXPO_METRO_UNSTABLE_ERRORS","originalResolveRequest","resolver","resolveRequest","depGraph","Map","mutateResolutionError","context","moduleName","platform","storeResult","res","inputPlatform","key","optionsKeyForContext","has","set","mapByTarget","get","mapByPlatform","originModulePath","Set","setForModule","qualifiedModuleName","type","filePath","add","path","request","firstResolver","error","canonicalize","JSON","stringify","customResolverOptions","stackDepthLimit","stackCountLimit","mapByOrigin","getReferences","origin","inverseOrigin","originKey","found","values","find","resolution","push","previous","root","server","unstable_serverRoot","projectRoot","stackCounter","inverseStack","saveStack","stack","circular","limited","stackOrigin","frames","length","isPathInside","includes","serverRoot","recurseBackWithLimit","frame","limit","visited","inverse","match","isDone","formattedImport","chalk","importMessagePadding","repeat","stripVTControlCharacters","extraMessage","bold","currentMessage","filename","relative","replace","dim","formattedRequest","green","test","line","gray","_match","p1","_expoImportStack"],"mappings":"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"}
|