@expo/cli 0.10.11 → 0.11.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 +2 -2
- package/build/src/api/endpoint.js +10 -0
- package/build/src/api/endpoint.js.map +1 -1
- package/build/src/api/graphql/queries/UserQuery.js +2 -1
- package/build/src/api/graphql/queries/UserQuery.js.map +1 -1
- package/build/src/api/user/UserSettings.js.map +1 -1
- package/build/src/api/user/actions.js +6 -1
- package/build/src/api/user/actions.js.map +1 -1
- package/build/src/api/user/expoSsoLauncher.js +127 -0
- package/build/src/api/user/expoSsoLauncher.js.map +1 -0
- package/build/src/api/user/user.js +46 -18
- package/build/src/api/user/user.js.map +1 -1
- package/build/src/graphql/generated.js +25 -1
- package/build/src/graphql/generated.js.map +1 -1
- package/build/src/login/index.js +7 -2
- package/build/src/login/index.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +4 -2
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js +9 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js +2 -2
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/metro/withMetroResolvers.js +161 -20
- package/build/src/start/server/metro/withMetroResolvers.js.map +1 -1
- package/build/src/start/server/middleware/ClassicManifestMiddleware.js +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +23 -6
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/type-generation/routes.js +3 -0
- package/build/src/start/server/type-generation/routes.js.map +1 -1
- package/build/src/utils/analytics/rudderstackClient.js +2 -2
- package/build/src/utils/env.js +3 -0
- package/build/src/utils/env.js.map +1 -1
- package/package.json +8 -8
- package/static/react-devtools-page/index.html +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/MetroTerminalReporter.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Terminal } from 'metro-core';\nimport path from 'path';\n\nimport { learnMore } from '../../../utils/link';\nimport { logWarning, TerminalReporter } from './TerminalReporter';\nimport { BuildPhase, BundleDetails, BundleProgress, SnippetError } from './TerminalReporter.types';\nimport { NODE_STDLIB_MODULES } from './externals';\n\nconst MAX_PROGRESS_BAR_CHAR_WIDTH = 16;\nconst DARK_BLOCK_CHAR = '\\u2593';\nconst LIGHT_BLOCK_CHAR = '\\u2591';\n/**\n * Extends the default Metro logger and adds some additional features.\n * Also removes the giant Metro logo from the output.\n */\nexport class MetroTerminalReporter extends TerminalReporter {\n constructor(public projectRoot: string, terminal: Terminal) {\n super(terminal);\n }\n\n // Used for testing\n _getElapsedTime(startTime: number): number {\n return Date.now() - startTime;\n }\n /**\n * Extends the bundle progress to include the current platform that we're bundling.\n *\n * @returns `iOS path/to/bundle.js ▓▓▓▓▓░░░░░░░░░░░ 36.6% (4790/7922)`\n */\n _getBundleStatusMessage(progress: BundleProgress, phase: BuildPhase): string {\n const platform = getPlatformTagForBuildDetails(progress.bundleDetails);\n const inProgress = phase === 'in_progress';\n\n if (!inProgress) {\n const status = phase === 'done' ? `Bundling complete ` : `Bundling failed `;\n const color = phase === 'done' ? chalk.green : chalk.red;\n\n const startTime = this._bundleTimers.get(progress.bundleDetails.buildID!);\n const time = startTime != null ? chalk.dim(this._getElapsedTime(startTime) + 'ms') : '';\n // iOS Bundling complete 150ms\n return color(platform + status) + time;\n }\n\n const localPath = path.relative('.', progress.bundleDetails.entryFile);\n const filledBar = Math.floor(progress.ratio * MAX_PROGRESS_BAR_CHAR_WIDTH);\n\n const _progress = inProgress\n ? chalk.green.bgGreen(DARK_BLOCK_CHAR.repeat(filledBar)) +\n chalk.bgWhite.white(LIGHT_BLOCK_CHAR.repeat(MAX_PROGRESS_BAR_CHAR_WIDTH - filledBar)) +\n chalk.bold(` ${(100 * progress.ratio).toFixed(1).padStart(4)}% `) +\n chalk.dim(\n `(${progress.transformedFileCount\n .toString()\n .padStart(progress.totalFileCount.toString().length)}/${progress.totalFileCount})`\n )\n : '';\n\n return (\n platform +\n chalk.reset.dim(`${path.dirname(localPath)}/`) +\n chalk.bold(path.basename(localPath)) +\n ' ' +\n _progress\n );\n }\n\n _logInitializing(port: number, hasReducedPerformance: boolean): void {\n // Don't print a giant logo...\n this.terminal.log('Starting Metro Bundler');\n }\n\n shouldFilterClientLog(event: {\n type: 'client_log';\n level: 'trace' | 'info' | 'warn' | 'log' | 'group' | 'groupCollapsed' | 'groupEnd' | 'debug';\n data: unknown[];\n }): boolean {\n return isAppRegistryStartupMessage(event.data);\n }\n\n /** Print the cache clear message. */\n transformCacheReset(): void {\n logWarning(\n this.terminal,\n chalk`Bundler cache is empty, rebuilding {dim (this may take a minute)}`\n );\n }\n\n /** One of the first logs that will be printed */\n dependencyGraphLoading(hasReducedPerformance: boolean): void {\n // this.terminal.log('Dependency graph is loading...');\n if (hasReducedPerformance) {\n // Extends https://github.com/facebook/metro/blob/347b1d7ed87995d7951aaa9fd597c04b06013dac/packages/metro/src/lib/TerminalReporter.js#L283-L290\n this.terminal.log(\n chalk.red(\n [\n 'Metro is operating with reduced performance.',\n 'Please fix the problem above and restart Metro.',\n ].join('\\n')\n )\n );\n }\n }\n\n _logBundlingError(error: SnippetError): void {\n const moduleResolutionError = formatUsingNodeStandardLibraryError(this.projectRoot, error);\n if (moduleResolutionError) {\n return this.terminal.log(maybeAppendCodeFrame(moduleResolutionError, error.message));\n }\n return super._logBundlingError(error);\n }\n}\n\n/**\n * Formats an error where the user is attempting to import a module from the Node.js standard library.\n * Exposed for testing.\n *\n * @param error\n * @returns error message or null if not a module resolution error\n */\nexport function formatUsingNodeStandardLibraryError(\n projectRoot: string,\n error: SnippetError\n): string | null {\n if (!error.message) {\n return null;\n }\n const { targetModuleName, originModulePath } = error;\n if (!targetModuleName || !originModulePath) {\n return null;\n }\n const relativePath = path.relative(projectRoot, originModulePath);\n\n const DOCS_PAGE_URL =\n 'https://docs.expo.dev/workflow/using-libraries/#using-third-party-libraries';\n\n if (isNodeStdLibraryModule(targetModuleName)) {\n if (originModulePath.includes('node_modules')) {\n return [\n `The package at \"${chalk.bold(\n relativePath\n )}\" attempted to import the Node standard library module \"${chalk.bold(\n targetModuleName\n )}\".`,\n `It failed because the native React runtime does not include the Node standard library.`,\n learnMore(DOCS_PAGE_URL),\n ].join('\\n');\n } else {\n return [\n `You attempted attempted to import the Node standard library module \"${chalk.bold(\n targetModuleName\n )}\" from \"${chalk.bold(relativePath)}\".`,\n `It failed because the native React runtime does not include the Node standard library.`,\n learnMore(DOCS_PAGE_URL),\n ].join('\\n');\n }\n }\n return `Unable to resolve \"${targetModuleName}\" from \"${relativePath}\"`;\n}\n\nexport function isNodeStdLibraryModule(moduleName: string): boolean {\n return /^node:/.test(moduleName) || NODE_STDLIB_MODULES.includes(moduleName);\n}\n\n/** If the code frame can be found then append it to the existing message. */\nfunction maybeAppendCodeFrame(message: string, rawMessage: string): string {\n const codeFrame = stripMetroInfo(rawMessage);\n if (codeFrame) {\n message += '\\n' + codeFrame;\n }\n return message;\n}\n\n/**\n * Remove the Metro cache clearing steps if they exist.\n * In future versions we won't need this.\n * Returns the remaining code frame logs.\n */\nexport function stripMetroInfo(errorMessage: string): string | null {\n // Newer versions of Metro don't include the list.\n if (!errorMessage.includes('4. Remove the cache')) {\n return null;\n }\n const lines = errorMessage.split('\\n');\n const index = lines.findIndex((line) => line.includes('4. Remove the cache'));\n if (index === -1) {\n return null;\n }\n return lines.slice(index + 1).join('\\n');\n}\n\n/** @returns if the message matches the initial startup log */\nfunction isAppRegistryStartupMessage(body: any[]): boolean {\n return (\n body.length === 1 &&\n (/^Running application \"main\" with appParams:/.test(body[0]) ||\n /^Running \"main\" with \\{/.test(body[0]))\n );\n}\n\n/** @returns platform specific tag for a `BundleDetails` object */\nfunction getPlatformTagForBuildDetails(bundleDetails?: BundleDetails | null): string {\n const platform = bundleDetails?.platform ?? null;\n if (platform) {\n const formatted = { ios: 'iOS', android: 'Android', web: 'Web' }[platform] || platform;\n return `${chalk.bold(formatted)} `;\n }\n\n return '';\n}\n"],"names":["formatUsingNodeStandardLibraryError","isNodeStdLibraryModule","stripMetroInfo","MAX_PROGRESS_BAR_CHAR_WIDTH","DARK_BLOCK_CHAR","LIGHT_BLOCK_CHAR","MetroTerminalReporter","TerminalReporter","constructor","projectRoot","terminal","_getElapsedTime","startTime","Date","now","_getBundleStatusMessage","progress","phase","platform","getPlatformTagForBuildDetails","bundleDetails","inProgress","status","color","chalk","green","red","_bundleTimers","get","buildID","time","dim","localPath","path","relative","entryFile","filledBar","Math","floor","ratio","_progress","bgGreen","repeat","bgWhite","white","bold","toFixed","padStart","transformedFileCount","toString","totalFileCount","length","reset","dirname","basename","_logInitializing","port","hasReducedPerformance","log","shouldFilterClientLog","event","isAppRegistryStartupMessage","data","transformCacheReset","logWarning","dependencyGraphLoading","join","_logBundlingError","error","moduleResolutionError","maybeAppendCodeFrame","message","targetModuleName","originModulePath","relativePath","DOCS_PAGE_URL","includes","learnMore","moduleName","test","NODE_STDLIB_MODULES","rawMessage","codeFrame","errorMessage","lines","split","index","findIndex","line","slice","body","formatted","ios","android","web"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/MetroTerminalReporter.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { Terminal } from 'metro-core';\nimport path from 'path';\n\nimport { learnMore } from '../../../utils/link';\nimport { logWarning, TerminalReporter } from './TerminalReporter';\nimport { BuildPhase, BundleDetails, BundleProgress, SnippetError } from './TerminalReporter.types';\nimport { NODE_STDLIB_MODULES } from './externals';\n\nconst MAX_PROGRESS_BAR_CHAR_WIDTH = 16;\nconst DARK_BLOCK_CHAR = '\\u2593';\nconst LIGHT_BLOCK_CHAR = '\\u2591';\n/**\n * Extends the default Metro logger and adds some additional features.\n * Also removes the giant Metro logo from the output.\n */\nexport class MetroTerminalReporter extends TerminalReporter {\n constructor(public projectRoot: string, terminal: Terminal) {\n super(terminal);\n }\n\n // Used for testing\n _getElapsedTime(startTime: number): number {\n return Date.now() - startTime;\n }\n /**\n * Extends the bundle progress to include the current platform that we're bundling.\n *\n * @returns `iOS path/to/bundle.js ▓▓▓▓▓░░░░░░░░░░░ 36.6% (4790/7922)`\n */\n _getBundleStatusMessage(progress: BundleProgress, phase: BuildPhase): string {\n const platform = getPlatformTagForBuildDetails(progress.bundleDetails);\n const inProgress = phase === 'in_progress';\n\n if (!inProgress) {\n const status = phase === 'done' ? `Bundling complete ` : `Bundling failed `;\n const color = phase === 'done' ? chalk.green : chalk.red;\n\n const startTime = this._bundleTimers.get(progress.bundleDetails.buildID!);\n const time = startTime != null ? chalk.dim(this._getElapsedTime(startTime) + 'ms') : '';\n // iOS Bundling complete 150ms\n return color(platform + status) + time;\n }\n\n const localPath = path.relative('.', progress.bundleDetails.entryFile);\n const filledBar = Math.floor(progress.ratio * MAX_PROGRESS_BAR_CHAR_WIDTH);\n\n const _progress = inProgress\n ? chalk.green.bgGreen(DARK_BLOCK_CHAR.repeat(filledBar)) +\n chalk.bgWhite.white(LIGHT_BLOCK_CHAR.repeat(MAX_PROGRESS_BAR_CHAR_WIDTH - filledBar)) +\n chalk.bold(` ${(100 * progress.ratio).toFixed(1).padStart(4)}% `) +\n chalk.dim(\n `(${progress.transformedFileCount\n .toString()\n .padStart(progress.totalFileCount.toString().length)}/${progress.totalFileCount})`\n )\n : '';\n\n return (\n platform +\n chalk.reset.dim(`${path.dirname(localPath)}/`) +\n chalk.bold(path.basename(localPath)) +\n ' ' +\n _progress\n );\n }\n\n _logInitializing(port: number, hasReducedPerformance: boolean): void {\n // Don't print a giant logo...\n this.terminal.log('Starting Metro Bundler');\n }\n\n shouldFilterClientLog(event: {\n type: 'client_log';\n level: 'trace' | 'info' | 'warn' | 'log' | 'group' | 'groupCollapsed' | 'groupEnd' | 'debug';\n data: unknown[];\n }): boolean {\n return isAppRegistryStartupMessage(event.data);\n }\n\n /** Print the cache clear message. */\n transformCacheReset(): void {\n logWarning(\n this.terminal,\n chalk`Bundler cache is empty, rebuilding {dim (this may take a minute)}`\n );\n }\n\n /** One of the first logs that will be printed */\n dependencyGraphLoading(hasReducedPerformance: boolean): void {\n // this.terminal.log('Dependency graph is loading...');\n if (hasReducedPerformance) {\n // Extends https://github.com/facebook/metro/blob/347b1d7ed87995d7951aaa9fd597c04b06013dac/packages/metro/src/lib/TerminalReporter.js#L283-L290\n this.terminal.log(\n chalk.red(\n [\n 'Metro is operating with reduced performance.',\n 'Please fix the problem above and restart Metro.',\n ].join('\\n')\n )\n );\n }\n }\n\n _logBundlingError(error: SnippetError): void {\n const moduleResolutionError = formatUsingNodeStandardLibraryError(this.projectRoot, error);\n const cause = error.cause as undefined | { _expoImportStack?: string };\n if (moduleResolutionError) {\n let message = maybeAppendCodeFrame(moduleResolutionError, error.message);\n if (cause?._expoImportStack) {\n message += `\\n\\n${cause?._expoImportStack}`;\n }\n return this.terminal.log(message);\n }\n if (cause?._expoImportStack) {\n error.message += `\\n\\n${cause._expoImportStack}`;\n }\n return super._logBundlingError(error);\n }\n}\n\n/**\n * Formats an error where the user is attempting to import a module from the Node.js standard library.\n * Exposed for testing.\n *\n * @param error\n * @returns error message or null if not a module resolution error\n */\nexport function formatUsingNodeStandardLibraryError(\n projectRoot: string,\n error: SnippetError\n): string | null {\n if (!error.message) {\n return null;\n }\n const { targetModuleName, originModulePath } = error;\n if (!targetModuleName || !originModulePath) {\n return null;\n }\n const relativePath = path.relative(projectRoot, originModulePath);\n\n const DOCS_PAGE_URL =\n 'https://docs.expo.dev/workflow/using-libraries/#using-third-party-libraries';\n\n if (isNodeStdLibraryModule(targetModuleName)) {\n if (originModulePath.includes('node_modules')) {\n return [\n `The package at \"${chalk.bold(\n relativePath\n )}\" attempted to import the Node standard library module \"${chalk.bold(\n targetModuleName\n )}\".`,\n `It failed because the native React runtime does not include the Node standard library.`,\n learnMore(DOCS_PAGE_URL),\n ].join('\\n');\n } else {\n return [\n `You attempted attempted to import the Node standard library module \"${chalk.bold(\n targetModuleName\n )}\" from \"${chalk.bold(relativePath)}\".`,\n `It failed because the native React runtime does not include the Node standard library.`,\n learnMore(DOCS_PAGE_URL),\n ].join('\\n');\n }\n }\n return `Unable to resolve \"${targetModuleName}\" from \"${relativePath}\"`;\n}\n\nexport function isNodeStdLibraryModule(moduleName: string): boolean {\n return /^node:/.test(moduleName) || NODE_STDLIB_MODULES.includes(moduleName);\n}\n\n/** If the code frame can be found then append it to the existing message. */\nfunction maybeAppendCodeFrame(message: string, rawMessage: string): string {\n const codeFrame = stripMetroInfo(rawMessage);\n if (codeFrame) {\n message += '\\n' + codeFrame;\n }\n return message;\n}\n\n/**\n * Remove the Metro cache clearing steps if they exist.\n * In future versions we won't need this.\n * Returns the remaining code frame logs.\n */\nexport function stripMetroInfo(errorMessage: string): string | null {\n // Newer versions of Metro don't include the list.\n if (!errorMessage.includes('4. Remove the cache')) {\n return null;\n }\n const lines = errorMessage.split('\\n');\n const index = lines.findIndex((line) => line.includes('4. Remove the cache'));\n if (index === -1) {\n return null;\n }\n return lines.slice(index + 1).join('\\n');\n}\n\n/** @returns if the message matches the initial startup log */\nfunction isAppRegistryStartupMessage(body: any[]): boolean {\n return (\n body.length === 1 &&\n (/^Running application \"main\" with appParams:/.test(body[0]) ||\n /^Running \"main\" with \\{/.test(body[0]))\n );\n}\n\n/** @returns platform specific tag for a `BundleDetails` object */\nfunction getPlatformTagForBuildDetails(bundleDetails?: BundleDetails | null): string {\n const platform = bundleDetails?.platform ?? null;\n if (platform) {\n const formatted = { ios: 'iOS', android: 'Android', web: 'Web' }[platform] || platform;\n return `${chalk.bold(formatted)} `;\n }\n\n return '';\n}\n"],"names":["formatUsingNodeStandardLibraryError","isNodeStdLibraryModule","stripMetroInfo","MAX_PROGRESS_BAR_CHAR_WIDTH","DARK_BLOCK_CHAR","LIGHT_BLOCK_CHAR","MetroTerminalReporter","TerminalReporter","constructor","projectRoot","terminal","_getElapsedTime","startTime","Date","now","_getBundleStatusMessage","progress","phase","platform","getPlatformTagForBuildDetails","bundleDetails","inProgress","status","color","chalk","green","red","_bundleTimers","get","buildID","time","dim","localPath","path","relative","entryFile","filledBar","Math","floor","ratio","_progress","bgGreen","repeat","bgWhite","white","bold","toFixed","padStart","transformedFileCount","toString","totalFileCount","length","reset","dirname","basename","_logInitializing","port","hasReducedPerformance","log","shouldFilterClientLog","event","isAppRegistryStartupMessage","data","transformCacheReset","logWarning","dependencyGraphLoading","join","_logBundlingError","error","moduleResolutionError","cause","message","maybeAppendCodeFrame","_expoImportStack","targetModuleName","originModulePath","relativePath","DOCS_PAGE_URL","includes","learnMore","moduleName","test","NODE_STDLIB_MODULES","rawMessage","codeFrame","errorMessage","lines","split","index","findIndex","line","slice","body","formatted","ios","android","web"],"mappings":"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"}
|
|
@@ -68,7 +68,8 @@ function withExtendedResolver(config, { projectRoot , tsconfig , platforms , isT
|
|
|
68
68
|
const extraNodeModules = {};
|
|
69
69
|
const aliases = {
|
|
70
70
|
web: {
|
|
71
|
-
"react-native": "react-native-web"
|
|
71
|
+
"react-native": "react-native-web",
|
|
72
|
+
"react-native/index": "react-native-web"
|
|
72
73
|
}
|
|
73
74
|
};
|
|
74
75
|
if (isWebEnabled) {
|
|
@@ -180,7 +181,6 @@ function withExtendedResolver(config, { projectRoot , tsconfig , platforms , isT
|
|
|
180
181
|
function doResolve(moduleName) {
|
|
181
182
|
return resolve({
|
|
182
183
|
...context,
|
|
183
|
-
preferNativePlatform: platform !== "web",
|
|
184
184
|
resolveRequest: undefined,
|
|
185
185
|
mainFields,
|
|
186
186
|
// Passing `mainFields` directly won't be considered (in certain version of Metro)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/start/server/metro/withMetroMultiPlatform.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 fs from 'fs';\nimport { ConfigT } from 'metro-config';\nimport { Resolution, ResolutionContext } from 'metro-resolver';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { Log } from '../../../log';\nimport { FileNotifier } from '../../../utils/FileNotifier';\nimport { env } from '../../../utils/env';\nimport { installExitHooks } from '../../../utils/exit';\nimport { isInteractive } from '../../../utils/interactive';\nimport { learnMore } from '../../../utils/link';\nimport { loadTsConfigPathsAsync, TsConfigPaths } from '../../../utils/tsconfig/loadTsConfigPaths';\nimport { resolveWithTsConfigPaths } from '../../../utils/tsconfig/resolveWithTsConfigPaths';\nimport { WebSupportProjectPrerequisite } from '../../doctor/web/WebSupportProjectPrerequisite';\nimport { PlatformBundlers } from '../platformBundlers';\nimport {\n EXTERNAL_REQUIRE_NATIVE_POLYFILL,\n EXTERNAL_REQUIRE_POLYFILL,\n getNodeExternalModuleId,\n isNodeExternal,\n setupNodeExternals,\n} from './externals';\nimport { isFailedToResolveNameError, isFailedToResolvePathError } from './metroErrors';\nimport { importMetroResolverFromProject } from './resolveFromProject';\nimport { getAppRouterRelativeEntryPath } from './router';\nimport { withMetroResolvers } from './withMetroResolvers';\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\nconst debug = require('debug')('expo:start:server:metro:multi-platform') as typeof console.log;\n\nfunction withWebPolyfills(config: ConfigT, projectRoot: string): ConfigT {\n const originalGetPolyfills = config.serializer.getPolyfills\n ? config.serializer.getPolyfills.bind(config.serializer)\n : () => [];\n\n const getPolyfills = (ctx: { platform: string | null }): readonly string[] => {\n if (ctx.platform === 'web') {\n return [\n // NOTE: We might need this for all platforms\n path.join(projectRoot, EXTERNAL_REQUIRE_POLYFILL),\n // TODO: runtime polyfills, i.e. Fast Refresh, error overlay, React Dev Tools...\n ];\n }\n // Generally uses `rn-get-polyfills`\n const polyfills = originalGetPolyfills(ctx);\n\n return [...polyfills, EXTERNAL_REQUIRE_NATIVE_POLYFILL];\n };\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n getPolyfills,\n },\n };\n}\n\nfunction normalizeSlashes(p: string) {\n return p.replace(/\\\\/g, '/');\n}\n\n/**\n * Apply custom resolvers to do the following:\n * - Disable `.native.js` extensions on web.\n * - Alias `react-native` to `react-native-web` on web.\n * - Redirect `react-native-web/dist/modules/AssetRegistry/index.js` to `@react-native/assets/registry.js` on web.\n * - Add support for `tsconfig.json`/`jsconfig.json` aliases via `compilerOptions.paths`.\n */\nexport function withExtendedResolver(\n config: ConfigT,\n {\n projectRoot,\n tsconfig,\n platforms,\n isTsconfigPathsEnabled,\n }: {\n projectRoot: string;\n tsconfig: TsConfigPaths | null;\n platforms: string[];\n isTsconfigPathsEnabled?: boolean;\n }\n) {\n // Get the `transformer.assetRegistryPath`\n // this needs to be unified since you can't dynamically\n // swap out the transformer based on platform.\n const assetRegistryPath = fs.realpathSync(\n // This is the native asset registry alias for native.\n path.resolve(resolveFrom(projectRoot, 'react-native/Libraries/Image/AssetRegistry'))\n // NOTE(EvanBacon): This is the newer import but it doesn't work in the expo/expo monorepo.\n // path.resolve(resolveFrom(projectRoot, '@react-native/assets/registry.js'))\n );\n\n const isWebEnabled = platforms.includes('web');\n\n const { resolve } = importMetroResolverFromProject(projectRoot);\n\n const extraNodeModules: { [key: string]: Record<string, string> } = {};\n\n const aliases: { [key: string]: Record<string, string> } = {\n web: {\n 'react-native': 'react-native-web',\n },\n };\n\n if (isWebEnabled) {\n // Allow `react-native-web` to be optional when web is not enabled but path aliases is.\n extraNodeModules['web'] = {\n 'react-native': path.resolve(require.resolve('react-native-web/package.json'), '..'),\n };\n }\n\n const preferredMainFields: { [key: string]: string[] } = {\n // Defaults from Expo Webpack. Most packages using `react-native` don't support web\n // in the `react-native` field, so we should prefer the `browser` field.\n // https://github.com/expo/router/issues/37\n web: ['browser', 'module', 'main'],\n };\n\n let tsConfigResolve = tsconfig?.paths\n ? resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsconfig.paths ?? {},\n baseUrl: tsconfig.baseUrl,\n })\n : null;\n\n if (isTsconfigPathsEnabled && isInteractive()) {\n // TODO: We should track all the files that used imports and invalidate them\n // currently the user will need to save all the files that use imports to\n // use the new aliases.\n const configWatcher = new FileNotifier(projectRoot, ['./tsconfig.json', './jsconfig.json']);\n configWatcher.startObserving(() => {\n debug('Reloading tsconfig.json');\n loadTsConfigPathsAsync(projectRoot).then((tsConfigPaths) => {\n if (tsConfigPaths?.paths && !!Object.keys(tsConfigPaths.paths).length) {\n debug('Enabling tsconfig.json paths support');\n tsConfigResolve = resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsConfigPaths.paths ?? {},\n baseUrl: tsConfigPaths.baseUrl,\n });\n } else {\n debug('Disabling tsconfig.json paths support');\n tsConfigResolve = null;\n }\n });\n });\n\n // TODO: This probably prevents the process from exiting.\n installExitHooks(() => {\n configWatcher.stopObserving();\n });\n } else {\n debug('Skipping tsconfig.json paths support');\n }\n\n return withMetroResolvers(config, projectRoot, [\n // Add a resolver to alias the web asset resolver.\n (immutableContext: ResolutionContext, moduleName: string, platform: string | null) => {\n let context = {\n ...immutableContext,\n } as Mutable<ResolutionContext> & {\n mainFields: string[];\n customResolverOptions?: Record<string, string>;\n };\n\n const environment = context.customResolverOptions?.environment;\n const isNode = environment === 'node';\n\n // TODO: We need to prevent the require.context from including API routes as these use externals.\n // Should be fine after async routes lands.\n if (isNode) {\n const moduleId = isNodeExternal(moduleName);\n if (moduleId) {\n moduleName = getNodeExternalModuleId(context.originModulePath, moduleId);\n debug(`Redirecting Node.js external \"${moduleId}\" to \"${moduleName}\"`);\n }\n }\n\n // Conditionally remap `react-native` to `react-native-web` on web in\n // a way that doesn't require Babel to resolve the alias.\n if (platform && platform in aliases && aliases[platform][moduleName]) {\n moduleName = aliases[platform][moduleName];\n }\n\n // TODO: We may be able to remove this in the future, it's doing no harm\n // by staying here.\n // Conditionally remap `react-native` to `react-native-web`\n if (platform && platform in extraNodeModules) {\n context.extraNodeModules = {\n ...extraNodeModules[platform],\n ...context.extraNodeModules,\n };\n }\n\n if (tsconfig?.baseUrl && isTsconfigPathsEnabled) {\n context = {\n ...context,\n nodeModulesPaths: [\n ...immutableContext.nodeModulesPaths,\n // add last to ensure node modules are resolved first\n tsconfig.baseUrl,\n ],\n };\n }\n\n let mainFields: string[] = context.mainFields;\n\n if (isNode) {\n // Node.js runtimes should only be importing main at the moment.\n // This is a temporary fix until we can support the package.json exports.\n mainFields = ['main'];\n } else if (env.EXPO_METRO_NO_MAIN_FIELD_OVERRIDE) {\n mainFields = context.mainFields;\n } else if (platform && platform in preferredMainFields) {\n mainFields = preferredMainFields[platform];\n }\n function doResolve(moduleName: string): Resolution | null {\n return resolve(\n {\n ...context,\n preferNativePlatform: platform !== 'web',\n resolveRequest: undefined,\n\n mainFields,\n\n // Passing `mainFields` directly won't be considered (in certain version of Metro)\n // we need to extend the `getPackageMainPath` directly to\n // use platform specific `mainFields`.\n // @ts-ignore\n getPackageMainPath(packageJsonPath) {\n // @ts-expect-error: mainFields is not on type\n const package_ = context.moduleCache.getPackage(packageJsonPath);\n return package_.getMain(mainFields);\n },\n },\n moduleName,\n platform\n );\n }\n\n function optionalResolve(moduleName: string): Resolution | null {\n try {\n return doResolve(moduleName);\n } catch (error) {\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 }\n return null;\n }\n\n let result: Resolution | null = null;\n\n if (tsConfigResolve) {\n result = tsConfigResolve(\n {\n originModulePath: context.originModulePath,\n moduleName,\n },\n optionalResolve\n );\n }\n\n result ??= doResolve(moduleName);\n\n if (result) {\n // Replace the web resolver with the original one.\n // This is basically an alias for web-only.\n if (shouldAliasAssetRegistryForWeb(platform, result)) {\n // @ts-expect-error: `readonly` for some reason.\n result.filePath = assetRegistryPath;\n }\n }\n return result;\n },\n ]);\n}\n\n/** @returns `true` if the incoming resolution should be swapped on web. */\nexport function shouldAliasAssetRegistryForWeb(\n platform: string | null,\n result: Resolution\n): boolean {\n return (\n platform === 'web' &&\n result?.type === 'sourceFile' &&\n typeof result?.filePath === 'string' &&\n normalizeSlashes(result.filePath).endsWith(\n 'react-native-web/dist/modules/AssetRegistry/index.js'\n )\n );\n}\n\n/** Add support for `react-native-web` and the Web platform. */\nexport async function withMetroMultiPlatformAsync(\n projectRoot: string,\n {\n config,\n platformBundlers,\n isTsconfigPathsEnabled,\n webOutput,\n routerDirectory,\n }: {\n config: ConfigT;\n isTsconfigPathsEnabled: boolean;\n platformBundlers: PlatformBundlers;\n webOutput?: 'single' | 'static';\n routerDirectory: string;\n }\n) {\n // Auto pick app entry for router.\n process.env.EXPO_ROUTER_APP_ROOT = getAppRouterRelativeEntryPath(projectRoot, routerDirectory);\n\n // Required for @expo/metro-runtime to format paths in the web LogBox.\n process.env.EXPO_PUBLIC_PROJECT_ROOT = process.env.EXPO_PUBLIC_PROJECT_ROOT ?? projectRoot;\n\n if (webOutput === 'static') {\n // Enable static rendering in runtime space.\n process.env.EXPO_PUBLIC_USE_STATIC = '1';\n }\n\n // Ensure the cache is invalidated if these values change.\n // @ts-expect-error\n config.transformer._expoRouterRootDirectory = process.env.EXPO_ROUTER_APP_ROOT;\n // @ts-expect-error\n config.transformer._expoRouterWebRendering = webOutput;\n // TODO: import mode\n\n if (platformBundlers.web === 'metro') {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n } else if (!isTsconfigPathsEnabled) {\n // Bail out early for performance enhancements if no special features are enabled.\n return config;\n }\n\n let tsconfig: null | TsConfigPaths = null;\n\n if (isTsconfigPathsEnabled) {\n Log.warn(\n chalk.yellow`Experimental path aliases feature is enabled. ` +\n learnMore('https://docs.expo.dev/guides/typescript/#path-aliases')\n );\n tsconfig = await loadTsConfigPathsAsync(projectRoot);\n }\n\n await setupNodeExternals(projectRoot);\n\n return withMetroMultiPlatform(projectRoot, {\n config,\n platformBundlers,\n tsconfig,\n isTsconfigPathsEnabled,\n });\n}\n\nfunction withMetroMultiPlatform(\n projectRoot: string,\n {\n config,\n platformBundlers,\n isTsconfigPathsEnabled,\n tsconfig,\n }: {\n config: ConfigT;\n isTsconfigPathsEnabled: boolean;\n platformBundlers: PlatformBundlers;\n tsconfig: TsConfigPaths | null;\n }\n) {\n let expoConfigPlatforms = Object.entries(platformBundlers)\n .filter(([, bundler]) => bundler === 'metro')\n .map(([platform]) => platform);\n\n if (Array.isArray(config.resolver.platforms)) {\n expoConfigPlatforms = [...new Set(expoConfigPlatforms.concat(config.resolver.platforms))];\n }\n\n // @ts-expect-error: typed as `readonly`.\n config.resolver.platforms = expoConfigPlatforms;\n\n if (expoConfigPlatforms.includes('web')) {\n config = withWebPolyfills(config, projectRoot);\n }\n\n return withExtendedResolver(config, {\n projectRoot,\n tsconfig,\n isTsconfigPathsEnabled,\n platforms: expoConfigPlatforms,\n });\n}\n"],"names":["withExtendedResolver","shouldAliasAssetRegistryForWeb","withMetroMultiPlatformAsync","debug","require","withWebPolyfills","config","projectRoot","originalGetPolyfills","serializer","getPolyfills","bind","ctx","platform","path","join","EXTERNAL_REQUIRE_POLYFILL","polyfills","EXTERNAL_REQUIRE_NATIVE_POLYFILL","normalizeSlashes","p","replace","tsconfig","platforms","isTsconfigPathsEnabled","assetRegistryPath","fs","realpathSync","resolve","resolveFrom","isWebEnabled","includes","importMetroResolverFromProject","extraNodeModules","aliases","web","preferredMainFields","tsConfigResolve","paths","resolveWithTsConfigPaths","baseUrl","isInteractive","configWatcher","FileNotifier","startObserving","loadTsConfigPathsAsync","then","tsConfigPaths","Object","keys","length","installExitHooks","stopObserving","withMetroResolvers","immutableContext","moduleName","context","environment","customResolverOptions","isNode","moduleId","isNodeExternal","getNodeExternalModuleId","originModulePath","nodeModulesPaths","mainFields","env","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","doResolve","preferNativePlatform","resolveRequest","undefined","getPackageMainPath","packageJsonPath","package_","moduleCache","getPackage","getMain","optionalResolve","error","isResolutionError","isFailedToResolveNameError","isFailedToResolvePathError","result","filePath","type","endsWith","platformBundlers","webOutput","routerDirectory","process","EXPO_ROUTER_APP_ROOT","getAppRouterRelativeEntryPath","EXPO_PUBLIC_PROJECT_ROOT","EXPO_PUBLIC_USE_STATIC","transformer","_expoRouterRootDirectory","_expoRouterWebRendering","WebSupportProjectPrerequisite","assertAsync","Log","warn","chalk","yellow","learnMore","setupNodeExternals","withMetroMultiPlatform","expoConfigPlatforms","entries","filter","bundler","map","Array","isArray","resolver","Set","concat"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/start/server/metro/withMetroMultiPlatform.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 fs from 'fs';\nimport { ConfigT } from 'metro-config';\nimport { Resolution, ResolutionContext } from 'metro-resolver';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\n\nimport { Log } from '../../../log';\nimport { FileNotifier } from '../../../utils/FileNotifier';\nimport { env } from '../../../utils/env';\nimport { installExitHooks } from '../../../utils/exit';\nimport { isInteractive } from '../../../utils/interactive';\nimport { learnMore } from '../../../utils/link';\nimport { loadTsConfigPathsAsync, TsConfigPaths } from '../../../utils/tsconfig/loadTsConfigPaths';\nimport { resolveWithTsConfigPaths } from '../../../utils/tsconfig/resolveWithTsConfigPaths';\nimport { WebSupportProjectPrerequisite } from '../../doctor/web/WebSupportProjectPrerequisite';\nimport { PlatformBundlers } from '../platformBundlers';\nimport {\n EXTERNAL_REQUIRE_NATIVE_POLYFILL,\n EXTERNAL_REQUIRE_POLYFILL,\n getNodeExternalModuleId,\n isNodeExternal,\n setupNodeExternals,\n} from './externals';\nimport { isFailedToResolveNameError, isFailedToResolvePathError } from './metroErrors';\nimport { importMetroResolverFromProject } from './resolveFromProject';\nimport { getAppRouterRelativeEntryPath } from './router';\nimport { withMetroResolvers } from './withMetroResolvers';\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n\nconst debug = require('debug')('expo:start:server:metro:multi-platform') as typeof console.log;\n\nfunction withWebPolyfills(config: ConfigT, projectRoot: string): ConfigT {\n const originalGetPolyfills = config.serializer.getPolyfills\n ? config.serializer.getPolyfills.bind(config.serializer)\n : () => [];\n\n const getPolyfills = (ctx: { platform: string | null }): readonly string[] => {\n if (ctx.platform === 'web') {\n return [\n // NOTE: We might need this for all platforms\n path.join(projectRoot, EXTERNAL_REQUIRE_POLYFILL),\n // TODO: runtime polyfills, i.e. Fast Refresh, error overlay, React Dev Tools...\n ];\n }\n // Generally uses `rn-get-polyfills`\n const polyfills = originalGetPolyfills(ctx);\n\n return [...polyfills, EXTERNAL_REQUIRE_NATIVE_POLYFILL];\n };\n\n return {\n ...config,\n serializer: {\n ...config.serializer,\n getPolyfills,\n },\n };\n}\n\nfunction normalizeSlashes(p: string) {\n return p.replace(/\\\\/g, '/');\n}\n\n/**\n * Apply custom resolvers to do the following:\n * - Disable `.native.js` extensions on web.\n * - Alias `react-native` to `react-native-web` on web.\n * - Redirect `react-native-web/dist/modules/AssetRegistry/index.js` to `@react-native/assets/registry.js` on web.\n * - Add support for `tsconfig.json`/`jsconfig.json` aliases via `compilerOptions.paths`.\n */\nexport function withExtendedResolver(\n config: ConfigT,\n {\n projectRoot,\n tsconfig,\n platforms,\n isTsconfigPathsEnabled,\n }: {\n projectRoot: string;\n tsconfig: TsConfigPaths | null;\n platforms: string[];\n isTsconfigPathsEnabled?: boolean;\n }\n) {\n // Get the `transformer.assetRegistryPath`\n // this needs to be unified since you can't dynamically\n // swap out the transformer based on platform.\n const assetRegistryPath = fs.realpathSync(\n // This is the native asset registry alias for native.\n path.resolve(resolveFrom(projectRoot, 'react-native/Libraries/Image/AssetRegistry'))\n // NOTE(EvanBacon): This is the newer import but it doesn't work in the expo/expo monorepo.\n // path.resolve(resolveFrom(projectRoot, '@react-native/assets/registry.js'))\n );\n\n const isWebEnabled = platforms.includes('web');\n\n const { resolve } = importMetroResolverFromProject(projectRoot);\n\n const extraNodeModules: { [key: string]: Record<string, string> } = {};\n\n const aliases: { [key: string]: Record<string, string> } = {\n web: {\n 'react-native': 'react-native-web',\n 'react-native/index': 'react-native-web',\n },\n };\n\n if (isWebEnabled) {\n // Allow `react-native-web` to be optional when web is not enabled but path aliases is.\n extraNodeModules['web'] = {\n 'react-native': path.resolve(require.resolve('react-native-web/package.json'), '..'),\n };\n }\n\n const preferredMainFields: { [key: string]: string[] } = {\n // Defaults from Expo Webpack. Most packages using `react-native` don't support web\n // in the `react-native` field, so we should prefer the `browser` field.\n // https://github.com/expo/router/issues/37\n web: ['browser', 'module', 'main'],\n };\n\n let tsConfigResolve = tsconfig?.paths\n ? resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsconfig.paths ?? {},\n baseUrl: tsconfig.baseUrl,\n })\n : null;\n\n if (isTsconfigPathsEnabled && isInteractive()) {\n // TODO: We should track all the files that used imports and invalidate them\n // currently the user will need to save all the files that use imports to\n // use the new aliases.\n const configWatcher = new FileNotifier(projectRoot, ['./tsconfig.json', './jsconfig.json']);\n configWatcher.startObserving(() => {\n debug('Reloading tsconfig.json');\n loadTsConfigPathsAsync(projectRoot).then((tsConfigPaths) => {\n if (tsConfigPaths?.paths && !!Object.keys(tsConfigPaths.paths).length) {\n debug('Enabling tsconfig.json paths support');\n tsConfigResolve = resolveWithTsConfigPaths.bind(resolveWithTsConfigPaths, {\n paths: tsConfigPaths.paths ?? {},\n baseUrl: tsConfigPaths.baseUrl,\n });\n } else {\n debug('Disabling tsconfig.json paths support');\n tsConfigResolve = null;\n }\n });\n });\n\n // TODO: This probably prevents the process from exiting.\n installExitHooks(() => {\n configWatcher.stopObserving();\n });\n } else {\n debug('Skipping tsconfig.json paths support');\n }\n\n return withMetroResolvers(config, projectRoot, [\n // Add a resolver to alias the web asset resolver.\n (immutableContext: ResolutionContext, moduleName: string, platform: string | null) => {\n let context = {\n ...immutableContext,\n } as Mutable<ResolutionContext> & {\n mainFields: string[];\n customResolverOptions?: Record<string, string>;\n };\n\n const environment = context.customResolverOptions?.environment;\n const isNode = environment === 'node';\n\n // TODO: We need to prevent the require.context from including API routes as these use externals.\n // Should be fine after async routes lands.\n if (isNode) {\n const moduleId = isNodeExternal(moduleName);\n if (moduleId) {\n moduleName = getNodeExternalModuleId(context.originModulePath, moduleId);\n debug(`Redirecting Node.js external \"${moduleId}\" to \"${moduleName}\"`);\n }\n }\n\n // Conditionally remap `react-native` to `react-native-web` on web in\n // a way that doesn't require Babel to resolve the alias.\n if (platform && platform in aliases && aliases[platform][moduleName]) {\n moduleName = aliases[platform][moduleName];\n }\n\n // TODO: We may be able to remove this in the future, it's doing no harm\n // by staying here.\n // Conditionally remap `react-native` to `react-native-web`\n if (platform && platform in extraNodeModules) {\n context.extraNodeModules = {\n ...extraNodeModules[platform],\n ...context.extraNodeModules,\n };\n }\n\n if (tsconfig?.baseUrl && isTsconfigPathsEnabled) {\n context = {\n ...context,\n nodeModulesPaths: [\n ...immutableContext.nodeModulesPaths,\n // add last to ensure node modules are resolved first\n tsconfig.baseUrl,\n ],\n };\n }\n\n let mainFields: string[] = context.mainFields;\n\n if (isNode) {\n // Node.js runtimes should only be importing main at the moment.\n // This is a temporary fix until we can support the package.json exports.\n mainFields = ['main'];\n } else if (env.EXPO_METRO_NO_MAIN_FIELD_OVERRIDE) {\n mainFields = context.mainFields;\n } else if (platform && platform in preferredMainFields) {\n mainFields = preferredMainFields[platform];\n }\n function doResolve(moduleName: string): Resolution | null {\n return resolve(\n {\n ...context,\n resolveRequest: undefined,\n mainFields,\n\n // Passing `mainFields` directly won't be considered (in certain version of Metro)\n // we need to extend the `getPackageMainPath` directly to\n // use platform specific `mainFields`.\n // @ts-ignore\n getPackageMainPath(packageJsonPath) {\n // @ts-expect-error: mainFields is not on type\n const package_ = context.moduleCache.getPackage(packageJsonPath);\n return package_.getMain(mainFields);\n },\n },\n moduleName,\n platform\n );\n }\n\n function optionalResolve(moduleName: string): Resolution | null {\n try {\n return doResolve(moduleName);\n } catch (error) {\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 }\n return null;\n }\n\n let result: Resolution | null = null;\n\n if (tsConfigResolve) {\n result = tsConfigResolve(\n {\n originModulePath: context.originModulePath,\n moduleName,\n },\n optionalResolve\n );\n }\n\n result ??= doResolve(moduleName);\n\n if (result) {\n // Replace the web resolver with the original one.\n // This is basically an alias for web-only.\n if (shouldAliasAssetRegistryForWeb(platform, result)) {\n // @ts-expect-error: `readonly` for some reason.\n result.filePath = assetRegistryPath;\n }\n }\n return result;\n },\n ]);\n}\n\n/** @returns `true` if the incoming resolution should be swapped on web. */\nexport function shouldAliasAssetRegistryForWeb(\n platform: string | null,\n result: Resolution\n): boolean {\n return (\n platform === 'web' &&\n result?.type === 'sourceFile' &&\n typeof result?.filePath === 'string' &&\n normalizeSlashes(result.filePath).endsWith(\n 'react-native-web/dist/modules/AssetRegistry/index.js'\n )\n );\n}\n\n/** Add support for `react-native-web` and the Web platform. */\nexport async function withMetroMultiPlatformAsync(\n projectRoot: string,\n {\n config,\n platformBundlers,\n isTsconfigPathsEnabled,\n webOutput,\n routerDirectory,\n }: {\n config: ConfigT;\n isTsconfigPathsEnabled: boolean;\n platformBundlers: PlatformBundlers;\n webOutput?: 'single' | 'static';\n routerDirectory: string;\n }\n) {\n // Auto pick app entry for router.\n process.env.EXPO_ROUTER_APP_ROOT = getAppRouterRelativeEntryPath(projectRoot, routerDirectory);\n\n // Required for @expo/metro-runtime to format paths in the web LogBox.\n process.env.EXPO_PUBLIC_PROJECT_ROOT = process.env.EXPO_PUBLIC_PROJECT_ROOT ?? projectRoot;\n\n if (webOutput === 'static') {\n // Enable static rendering in runtime space.\n process.env.EXPO_PUBLIC_USE_STATIC = '1';\n }\n\n // Ensure the cache is invalidated if these values change.\n // @ts-expect-error\n config.transformer._expoRouterRootDirectory = process.env.EXPO_ROUTER_APP_ROOT;\n // @ts-expect-error\n config.transformer._expoRouterWebRendering = webOutput;\n // TODO: import mode\n\n if (platformBundlers.web === 'metro') {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n } else if (!isTsconfigPathsEnabled) {\n // Bail out early for performance enhancements if no special features are enabled.\n return config;\n }\n\n let tsconfig: null | TsConfigPaths = null;\n\n if (isTsconfigPathsEnabled) {\n Log.warn(\n chalk.yellow`Experimental path aliases feature is enabled. ` +\n learnMore('https://docs.expo.dev/guides/typescript/#path-aliases')\n );\n tsconfig = await loadTsConfigPathsAsync(projectRoot);\n }\n\n await setupNodeExternals(projectRoot);\n\n return withMetroMultiPlatform(projectRoot, {\n config,\n platformBundlers,\n tsconfig,\n isTsconfigPathsEnabled,\n });\n}\n\nfunction withMetroMultiPlatform(\n projectRoot: string,\n {\n config,\n platformBundlers,\n isTsconfigPathsEnabled,\n tsconfig,\n }: {\n config: ConfigT;\n isTsconfigPathsEnabled: boolean;\n platformBundlers: PlatformBundlers;\n tsconfig: TsConfigPaths | null;\n }\n) {\n let expoConfigPlatforms = Object.entries(platformBundlers)\n .filter(([, bundler]) => bundler === 'metro')\n .map(([platform]) => platform);\n\n if (Array.isArray(config.resolver.platforms)) {\n expoConfigPlatforms = [...new Set(expoConfigPlatforms.concat(config.resolver.platforms))];\n }\n\n // @ts-expect-error: typed as `readonly`.\n config.resolver.platforms = expoConfigPlatforms;\n\n if (expoConfigPlatforms.includes('web')) {\n config = withWebPolyfills(config, projectRoot);\n }\n\n return withExtendedResolver(config, {\n projectRoot,\n tsconfig,\n isTsconfigPathsEnabled,\n platforms: expoConfigPlatforms,\n });\n}\n"],"names":["withExtendedResolver","shouldAliasAssetRegistryForWeb","withMetroMultiPlatformAsync","debug","require","withWebPolyfills","config","projectRoot","originalGetPolyfills","serializer","getPolyfills","bind","ctx","platform","path","join","EXTERNAL_REQUIRE_POLYFILL","polyfills","EXTERNAL_REQUIRE_NATIVE_POLYFILL","normalizeSlashes","p","replace","tsconfig","platforms","isTsconfigPathsEnabled","assetRegistryPath","fs","realpathSync","resolve","resolveFrom","isWebEnabled","includes","importMetroResolverFromProject","extraNodeModules","aliases","web","preferredMainFields","tsConfigResolve","paths","resolveWithTsConfigPaths","baseUrl","isInteractive","configWatcher","FileNotifier","startObserving","loadTsConfigPathsAsync","then","tsConfigPaths","Object","keys","length","installExitHooks","stopObserving","withMetroResolvers","immutableContext","moduleName","context","environment","customResolverOptions","isNode","moduleId","isNodeExternal","getNodeExternalModuleId","originModulePath","nodeModulesPaths","mainFields","env","EXPO_METRO_NO_MAIN_FIELD_OVERRIDE","doResolve","resolveRequest","undefined","getPackageMainPath","packageJsonPath","package_","moduleCache","getPackage","getMain","optionalResolve","error","isResolutionError","isFailedToResolveNameError","isFailedToResolvePathError","result","filePath","type","endsWith","platformBundlers","webOutput","routerDirectory","process","EXPO_ROUTER_APP_ROOT","getAppRouterRelativeEntryPath","EXPO_PUBLIC_PROJECT_ROOT","EXPO_PUBLIC_USE_STATIC","transformer","_expoRouterRootDirectory","_expoRouterWebRendering","WebSupportProjectPrerequisite","assertAsync","Log","warn","chalk","yellow","learnMore","setupNodeExternals","withMetroMultiPlatform","expoConfigPlatforms","entries","filter","bundler","map","Array","isArray","resolver","Set","concat"],"mappings":"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"}
|
|
@@ -4,8 +4,16 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
});
|
|
5
5
|
exports.getDefaultMetroResolver = getDefaultMetroResolver;
|
|
6
6
|
exports.withMetroResolvers = withMetroResolvers;
|
|
7
|
+
var _chalk = _interopRequireDefault(require("chalk"));
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _env = require("../../../utils/env");
|
|
7
10
|
var _metroErrors = require("./metroErrors");
|
|
8
11
|
var _resolveFromProject = require("./resolveFromProject");
|
|
12
|
+
function _interopRequireDefault(obj) {
|
|
13
|
+
return obj && obj.__esModule ? obj : {
|
|
14
|
+
default: obj
|
|
15
|
+
};
|
|
16
|
+
}
|
|
9
17
|
const debug = require("debug")("expo:metro:withMetroResolvers");
|
|
10
18
|
function getDefaultMetroResolver(projectRoot) {
|
|
11
19
|
const { resolve } = (0, _resolveFromProject).importMetroResolverFromProject(projectRoot);
|
|
@@ -13,41 +21,174 @@ function getDefaultMetroResolver(projectRoot) {
|
|
|
13
21
|
return resolve(context, moduleName, platform);
|
|
14
22
|
};
|
|
15
23
|
}
|
|
24
|
+
function optionsKeyForContext(context) {
|
|
25
|
+
const canonicalize = require("metro-core/src/canonicalize");
|
|
26
|
+
var _customResolverOptions, ref;
|
|
27
|
+
// Compound key for the resolver cache
|
|
28
|
+
return (ref = JSON.stringify((_customResolverOptions = context.customResolverOptions) != null ? _customResolverOptions : {}, canonicalize)) != null ? ref : "";
|
|
29
|
+
}
|
|
16
30
|
function withMetroResolvers(config, projectRoot, resolvers) {
|
|
17
31
|
debug(`Appending ${resolvers.length} custom resolvers to Metro config. (has custom resolver: ${!!config.resolver.resolveRequest})`);
|
|
18
32
|
const originalResolveRequest = config.resolver.resolveRequest || getDefaultMetroResolver(projectRoot);
|
|
33
|
+
function mutateResolutionError(error, context, moduleName, platform) {
|
|
34
|
+
var ref;
|
|
35
|
+
if (!_env.env.EXPO_METRO_UNSTABLE_ERRORS || !platform) {
|
|
36
|
+
debug("Cannot mutate resolution error");
|
|
37
|
+
return error;
|
|
38
|
+
}
|
|
39
|
+
const mapByOrigin = depGraph.get(optionsKeyForContext(context));
|
|
40
|
+
const mapByPlatform = mapByOrigin == null ? void 0 : mapByOrigin.get(platform);
|
|
41
|
+
if (!mapByPlatform) {
|
|
42
|
+
return error;
|
|
43
|
+
}
|
|
44
|
+
// collect all references inversely using some expensive lookup
|
|
45
|
+
const getReferences = (origin)=>{
|
|
46
|
+
const inverseOrigin = [];
|
|
47
|
+
if (!mapByPlatform) {
|
|
48
|
+
return inverseOrigin;
|
|
49
|
+
}
|
|
50
|
+
for (const [originKey, mapByTarget] of mapByPlatform){
|
|
51
|
+
// search comparing origin to path
|
|
52
|
+
const found = [
|
|
53
|
+
...mapByTarget.values()
|
|
54
|
+
].find((resolution)=>resolution.path === origin
|
|
55
|
+
);
|
|
56
|
+
if (found) {
|
|
57
|
+
inverseOrigin.push({
|
|
58
|
+
origin,
|
|
59
|
+
previous: originKey,
|
|
60
|
+
request: found.request
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return inverseOrigin;
|
|
65
|
+
};
|
|
66
|
+
const pad = (num)=>{
|
|
67
|
+
return new Array(num).fill(" ").join("");
|
|
68
|
+
};
|
|
69
|
+
var ref1, ref2;
|
|
70
|
+
const root = (ref2 = (ref1 = (ref = config.server) == null ? void 0 : ref.unstable_serverRoot) != null ? ref1 : config.projectRoot) != null ? ref2 : projectRoot;
|
|
71
|
+
const recurseBackWithLimit = (req, limit, count = 0)=>{
|
|
72
|
+
const results = {
|
|
73
|
+
origin: req.origin,
|
|
74
|
+
request: req.request,
|
|
75
|
+
previous: []
|
|
76
|
+
};
|
|
77
|
+
if (count >= limit) {
|
|
78
|
+
return results;
|
|
79
|
+
}
|
|
80
|
+
const inverse = getReferences(req.origin);
|
|
81
|
+
for (const match of inverse){
|
|
82
|
+
// Use more qualified name if possible
|
|
83
|
+
// results.origin = match.origin;
|
|
84
|
+
// Found entry point
|
|
85
|
+
if (req.origin === match.previous) {
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
results.previous.push(recurseBackWithLimit({
|
|
89
|
+
origin: match.previous,
|
|
90
|
+
request: match.request
|
|
91
|
+
}, limit, count + 1));
|
|
92
|
+
}
|
|
93
|
+
return results;
|
|
94
|
+
};
|
|
95
|
+
const inverseTree = recurseBackWithLimit({
|
|
96
|
+
origin: context.originModulePath,
|
|
97
|
+
request: moduleName
|
|
98
|
+
}, // TODO: Do we need to expose this?
|
|
99
|
+
35);
|
|
100
|
+
if (inverseTree.previous.length > 0) {
|
|
101
|
+
debug("Found inverse graph:", JSON.stringify(inverseTree, null, 2));
|
|
102
|
+
let extraMessage = _chalk.default.bold("Import stack:");
|
|
103
|
+
const printRecursive = (tree, depth = 0)=>{
|
|
104
|
+
let filename = _path.default.relative(root, tree.origin);
|
|
105
|
+
if (filename.match(/\?ctx=[\w\d]+$/)) {
|
|
106
|
+
filename = filename.replace(/\?ctx=[\w\d]+$/, _chalk.default.dim(" (require.context)"));
|
|
107
|
+
} else {
|
|
108
|
+
let formattedRequest = _chalk.default.green(`"${tree.request}"`);
|
|
109
|
+
if (// If bundling for web and the import is pulling internals from outside of react-native
|
|
110
|
+
// then mark it as an invalid import.
|
|
111
|
+
platform === "web" && !/^(node_modules\/)?react-native\//.test(filename) && tree.request.match(/^react-native\/.*/)) {
|
|
112
|
+
formattedRequest = formattedRequest + _chalk.default`\n {yellow Importing react-native internals is not supported on web.}`;
|
|
113
|
+
}
|
|
114
|
+
filename = filename + _chalk.default`\n{gray |} {cyan import} ${formattedRequest}\n`;
|
|
115
|
+
}
|
|
116
|
+
let line = "\n" + pad(depth) + _chalk.default.gray(" ") + filename;
|
|
117
|
+
if (filename.match(/node_modules/)) {
|
|
118
|
+
line = _chalk.default.gray(// Bold the node module name
|
|
119
|
+
line.replace(/node_modules\/([^/]+)/, (_match, p1)=>{
|
|
120
|
+
return "node_modules/" + _chalk.default.bold(p1);
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
extraMessage += line;
|
|
124
|
+
for (const child of tree.previous){
|
|
125
|
+
printRecursive(child, // Only add depth if there are multiple children
|
|
126
|
+
tree.previous.length > 1 ? depth + 1 : depth);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
printRecursive(inverseTree);
|
|
130
|
+
// @ts-expect-error
|
|
131
|
+
error._expoImportStack = extraMessage;
|
|
132
|
+
} else {
|
|
133
|
+
debug("Found no inverse tree for:", context.originModulePath);
|
|
134
|
+
}
|
|
135
|
+
return error;
|
|
136
|
+
}
|
|
137
|
+
const depGraph = new Map();
|
|
19
138
|
return {
|
|
20
139
|
...config,
|
|
21
140
|
resolver: {
|
|
22
141
|
...config.resolver,
|
|
23
142
|
resolveRequest (context, moduleName, platform) {
|
|
143
|
+
const storeResult = (res)=>{
|
|
144
|
+
if (!_env.env.EXPO_METRO_UNSTABLE_ERRORS || !platform) return;
|
|
145
|
+
const key = optionsKeyForContext(context);
|
|
146
|
+
if (!depGraph.has(key)) depGraph.set(key, new Map());
|
|
147
|
+
const mapByTarget = depGraph.get(key);
|
|
148
|
+
if (!mapByTarget.has(platform)) mapByTarget.set(platform, new Map());
|
|
149
|
+
const mapByPlatform = mapByTarget.get(platform);
|
|
150
|
+
if (!mapByPlatform.has(context.originModulePath)) mapByPlatform.set(context.originModulePath, new Set());
|
|
151
|
+
const setForModule = mapByPlatform.get(context.originModulePath);
|
|
152
|
+
const qualifiedModuleName = (res == null ? void 0 : res.type) === "sourceFile" ? res.filePath : moduleName;
|
|
153
|
+
setForModule.add({
|
|
154
|
+
path: qualifiedModuleName,
|
|
155
|
+
request: moduleName
|
|
156
|
+
});
|
|
157
|
+
};
|
|
24
158
|
const universalContext = {
|
|
25
159
|
...context,
|
|
26
160
|
preferNativePlatform: platform !== "web"
|
|
27
161
|
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
162
|
+
try {
|
|
163
|
+
for (const resolver of resolvers){
|
|
164
|
+
try {
|
|
165
|
+
const resolution = resolver(universalContext, moduleName, platform);
|
|
166
|
+
if (resolution) {
|
|
167
|
+
storeResult(resolution);
|
|
168
|
+
return resolution;
|
|
169
|
+
}
|
|
170
|
+
} catch (error) {
|
|
171
|
+
// If no user-defined resolver, use Expo's default behavior.
|
|
172
|
+
// This prevents extraneous resolution attempts on failure.
|
|
173
|
+
if (!config.resolver.resolveRequest) {
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
// If the error is directly related to a resolver not being able to resolve a module, then
|
|
177
|
+
// we can ignore the error and try the next resolver. Otherwise, we should throw the error.
|
|
178
|
+
const isResolutionError = (0, _metroErrors).isFailedToResolveNameError(error) || (0, _metroErrors).isFailedToResolvePathError(error);
|
|
179
|
+
if (!isResolutionError) {
|
|
180
|
+
throw error;
|
|
181
|
+
}
|
|
182
|
+
debug(`Custom resolver threw: ${error.constructor.name}. (module: ${moduleName}, platform: ${platform})`);
|
|
45
183
|
}
|
|
46
|
-
debug(`Custom resolver threw: ${error.constructor.name}. (module: ${moduleName}, platform: ${platform})`);
|
|
47
184
|
}
|
|
185
|
+
// If we haven't returned by now, use the original resolver or upstream resolver.
|
|
186
|
+
const res = originalResolveRequest(universalContext, moduleName, platform);
|
|
187
|
+
storeResult(res);
|
|
188
|
+
return res;
|
|
189
|
+
} catch (error) {
|
|
190
|
+
throw mutateResolutionError(error, universalContext, moduleName, platform);
|
|
48
191
|
}
|
|
49
|
-
// If we haven't returned by now, use the original resolver or upstream resolver.
|
|
50
|
-
return originalResolveRequest(universalContext, moduleName, platform);
|
|
51
192
|
}
|
|
52
193
|
}
|
|
53
194
|
};
|
|
@@ -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 { ConfigT as MetroConfig } from 'metro-config';\nimport { ResolutionContext } from 'metro-resolver';\n\nimport { isFailedToResolveNameError, isFailedToResolvePathError } from './metroErrors';\nimport { importMetroResolverFromProject } from './resolveFromProject';\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 const { resolve } = importMetroResolverFromProject(projectRoot);\n return (context: ResolutionContext, moduleName: string, platform: string | null) => {\n return resolve(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 projectRoot path to the project root used to resolve the default Metro resolver.\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 projectRoot: string,\n resolvers: ExpoCustomMetroResolver[]\n): MetroConfig {\n debug(\n `Appending ${\n resolvers.length\n } custom resolvers to Metro config. (has custom resolver: ${!!config.resolver.resolveRequest})`\n );\n const originalResolveRequest =\n config.resolver.resolveRequest || getDefaultMetroResolver(projectRoot);\n\n return {\n ...config,\n resolver: {\n ...config.resolver,\n resolveRequest(context, moduleName, platform) {\n const universalContext = {\n ...context,\n preferNativePlatform: platform !== 'web',\n };\n\n for (const resolver of resolvers) {\n try {\n const resolution = resolver(universalContext, moduleName, platform);\n if (resolution) {\n return resolution;\n }\n } catch (error: any) {\n // If no user-defined resolver, use Expo's default behavior.\n // This prevents extraneous resolution attempts on failure.\n if (!config.resolver.resolveRequest) {\n throw error;\n }\n\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 threw: ${error.constructor.name}. (module: ${moduleName}, platform: ${platform})`\n );\n }\n }\n // If we haven't returned by now, use the original resolver or upstream resolver.\n return originalResolveRequest(universalContext, moduleName, platform);\n },\n },\n };\n}\n"],"names":["getDefaultMetroResolver","withMetroResolvers","debug","require","projectRoot","resolve","importMetroResolverFromProject","context","moduleName","platform","config","resolvers","length","resolver","resolveRequest","originalResolveRequest","universalContext","preferNativePlatform","resolution","error","isResolutionError","isFailedToResolveNameError","isFailedToResolvePathError","constructor","name"],"mappings":"AAMA;;;;QAgBgBA,uBAAuB,GAAvBA,uBAAuB;QAgBvBC,kBAAkB,GAAlBA,kBAAkB;AA7BqC,IAAA,YAAe,WAAf,eAAe,CAAA;AACvC,IAAA,mBAAsB,WAAtB,sBAAsB,CAAA;AAErE,MAAMC,KAAK,GAAGC,OAAO,CAAC,OAAO,CAAC,CAAC,+BAA+B,CAAC,AAAsB,AAAC;AAU/E,SAASH,uBAAuB,CAACI,WAAmB,EAAiB;IAC1E,MAAM,EAAEC,OAAO,CAAA,EAAE,GAAGC,CAAAA,GAAAA,mBAA8B,AAAa,CAAA,+BAAb,CAACF,WAAW,CAAC,AAAC;IAChE,OAAO,CAACG,OAA0B,EAAEC,UAAkB,EAAEC,QAAuB,GAAK;QAClF,OAAOJ,OAAO,CAACE,OAAO,EAAEC,UAAU,EAAEC,QAAQ,CAAC,CAAC;KAC/C,CAAC;CACH;AAWM,SAASR,kBAAkB,CAChCS,MAAmB,EACnBN,WAAmB,EACnBO,SAAoC,EACvB;IACbT,KAAK,CACH,CAAC,UAAU,EACTS,SAAS,CAACC,MAAM,CACjB,yDAAyD,EAAE,CAAC,CAACF,MAAM,CAACG,QAAQ,CAACC,cAAc,CAAC,CAAC,CAAC,CAChG,CAAC;IACF,MAAMC,sBAAsB,GAC1BL,MAAM,CAACG,QAAQ,CAACC,cAAc,IAAId,uBAAuB,CAACI,WAAW,CAAC,AAAC;IAEzE,OAAO;QACL,GAAGM,MAAM;QACTG,QAAQ,EAAE;YACR,GAAGH,MAAM,CAACG,QAAQ;YAClBC,cAAc,EAACP,OAAO,EAAEC,UAAU,EAAEC,QAAQ,EAAE;gBAC5C,MAAMO,gBAAgB,GAAG;oBACvB,GAAGT,OAAO;oBACVU,oBAAoB,EAAER,QAAQ,KAAK,KAAK;iBACzC,AAAC;gBAEF,KAAK,MAAMI,QAAQ,IAAIF,SAAS,CAAE;oBAChC,IAAI;wBACF,MAAMO,UAAU,GAAGL,QAAQ,CAACG,gBAAgB,EAAER,UAAU,EAAEC,QAAQ,CAAC,AAAC;wBACpE,IAAIS,UAAU,EAAE;4BACd,OAAOA,UAAU,CAAC;yBACnB;qBACF,CAAC,OAAOC,KAAK,EAAO;wBACnB,4DAA4D;wBAC5D,2DAA2D;wBAC3D,IAAI,CAACT,MAAM,CAACG,QAAQ,CAACC,cAAc,EAAE;4BACnC,MAAMK,KAAK,CAAC;yBACb;wBAED,0FAA0F;wBAC1F,2FAA2F;wBAC3F,MAAMC,iBAAiB,GACrBC,CAAAA,GAAAA,YAA0B,AAAO,CAAA,2BAAP,CAACF,KAAK,CAAC,IAAIG,CAAAA,GAAAA,YAA0B,AAAO,CAAA,2BAAP,CAACH,KAAK,CAAC,AAAC;wBACzE,IAAI,CAACC,iBAAiB,EAAE;4BACtB,MAAMD,KAAK,CAAC;yBACb;wBACDjB,KAAK,CACH,CAAC,uBAAuB,EAAEiB,KAAK,CAACI,WAAW,CAACC,IAAI,CAAC,WAAW,EAAEhB,UAAU,CAAC,YAAY,EAAEC,QAAQ,CAAC,CAAC,CAAC,CACnG,CAAC;qBACH;iBACF;gBACD,iFAAiF;gBACjF,OAAOM,sBAAsB,CAACC,gBAAgB,EAAER,UAAU,EAAEC,QAAQ,CAAC,CAAC;aACvE;SACF;KACF,CAAC;CACH"}
|
|
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 { ResolutionContext } from 'metro-resolver';\nimport path from 'path';\n\nimport { env } from '../../../utils/env';\nimport { isFailedToResolveNameError, isFailedToResolvePathError } from './metroErrors';\nimport { importMetroResolverFromProject } from './resolveFromProject';\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 const { resolve } = importMetroResolverFromProject(projectRoot);\n return (context: ResolutionContext, moduleName: string, platform: string | null) => {\n return 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 projectRoot path to the project root used to resolve the default Metro resolver.\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 projectRoot: string,\n resolvers: ExpoCustomMetroResolver[]\n): MetroConfig {\n debug(\n `Appending ${\n resolvers.length\n } custom resolvers to Metro config. (has custom resolver: ${!!config.resolver.resolveRequest})`\n );\n const originalResolveRequest =\n config.resolver.resolveRequest || getDefaultMetroResolver(projectRoot);\n\n function mutateResolutionError(\n error: Error,\n context: ResolutionContext,\n moduleName: string,\n platform: string | null\n ) {\n if (!env.EXPO_METRO_UNSTABLE_ERRORS || !platform) {\n debug('Cannot mutate resolution error');\n return error;\n }\n\n const mapByOrigin = depGraph.get(optionsKeyForContext(context));\n const mapByPlatform = mapByOrigin?.get(platform);\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 ?? 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 platform === '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 // @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 if (!env.EXPO_METRO_UNSTABLE_ERRORS || !platform) return;\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(platform)) mapByTarget!.set(platform, new Map());\n const mapByPlatform = mapByTarget!.get(platform);\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 const universalContext = {\n ...context,\n preferNativePlatform: platform !== 'web',\n };\n\n try {\n for (const resolver of resolvers) {\n try {\n const resolution = resolver(universalContext, moduleName, platform);\n if (resolution) {\n storeResult(resolution);\n return resolution;\n }\n } catch (error: any) {\n // If no user-defined resolver, use Expo's default behavior.\n // This prevents extraneous resolution attempts on failure.\n if (!config.resolver.resolveRequest) {\n throw error;\n }\n\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 threw: ${error.constructor.name}. (module: ${moduleName}, platform: ${platform})`\n );\n }\n }\n // If we haven't returned by now, use the original resolver or upstream resolver.\n const res = originalResolveRequest(universalContext, moduleName, platform);\n storeResult(res);\n return res;\n } catch (error: any) {\n throw mutateResolutionError(error, universalContext, moduleName, platform);\n }\n },\n },\n };\n}\n"],"names":["getDefaultMetroResolver","withMetroResolvers","debug","require","projectRoot","resolve","importMetroResolverFromProject","context","moduleName","platform","optionsKeyForContext","canonicalize","JSON","stringify","customResolverOptions","config","resolvers","length","resolver","resolveRequest","originalResolveRequest","mutateResolutionError","error","env","EXPO_METRO_UNSTABLE_ERRORS","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","originModulePath","extraMessage","chalk","bold","printRecursive","tree","depth","filename","relative","replace","dim","formattedRequest","green","test","line","gray","_match","p1","child","_expoImportStack","Map","storeResult","res","key","has","set","Set","setForModule","qualifiedModuleName","type","filePath","add","universalContext","preferNativePlatform","isResolutionError","isFailedToResolveNameError","isFailedToResolvePathError","constructor","name"],"mappings":"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"}
|
|
@@ -138,7 +138,7 @@ async function createHostInfoAsync() {
|
|
|
138
138
|
host: await _userSettings.default.getAnonymousIdentifierAsync(),
|
|
139
139
|
server: "expo",
|
|
140
140
|
// Defined in the build step
|
|
141
|
-
serverVersion: "0.
|
|
141
|
+
serverVersion: "0.11.0",
|
|
142
142
|
serverDriver: _manifestMiddleware.DEVELOPER_TOOL,
|
|
143
143
|
serverOS: _os.default.platform(),
|
|
144
144
|
serverOSVersion: _os.default.release()
|
|
@@ -6,11 +6,13 @@ exports.getWorkspaceRoot = getWorkspaceRoot;
|
|
|
6
6
|
exports.getEntryWithServerRoot = getEntryWithServerRoot;
|
|
7
7
|
exports.getMetroServerRoot = getMetroServerRoot;
|
|
8
8
|
exports.resolveMainModuleName = resolveMainModuleName;
|
|
9
|
+
exports.shouldEnableAsyncImports = shouldEnableAsyncImports;
|
|
9
10
|
exports.createBundleUrlPath = createBundleUrlPath;
|
|
10
11
|
exports.DEVELOPER_TOOL = void 0;
|
|
11
12
|
var _config = require("@expo/config");
|
|
12
13
|
var _findYarnWorkspaceRoot = _interopRequireDefault(require("find-yarn-workspace-root"));
|
|
13
14
|
var _path = _interopRequireDefault(require("path"));
|
|
15
|
+
var _resolveFrom = _interopRequireDefault(require("resolve-from"));
|
|
14
16
|
var _url = require("url");
|
|
15
17
|
var Log = _interopRequireWildcard(require("../../../log"));
|
|
16
18
|
var _env = require("../../../utils/env");
|
|
@@ -74,14 +76,26 @@ function resolveMainModuleName(projectRoot, projectConfig, platform) {
|
|
|
74
76
|
debug(`Resolved entry point: ${entryPoint} (project root: ${projectRoot})`);
|
|
75
77
|
return (0, _url1).stripExtension(entryPoint, "js");
|
|
76
78
|
}
|
|
77
|
-
function
|
|
79
|
+
function shouldEnableAsyncImports(projectRoot) {
|
|
80
|
+
if (_env.env.EXPO_NO_METRO_LAZY) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
// `@expo/metro-runtime` includes support for the fetch + eval runtime code required
|
|
84
|
+
// to support async imports. If it's not installed, we can't support async imports.
|
|
85
|
+
// If it is installed, the user MUST import it somewhere in their project.
|
|
86
|
+
// Expo Router automatically pulls this in, so we can check for it.
|
|
87
|
+
return _resolveFrom.default.silent(projectRoot, "@expo/metro-runtime") != null;
|
|
88
|
+
}
|
|
89
|
+
function createBundleUrlPath({ platform , mainModuleName , mode , minify =mode === "production" , environment , serializerOutput , lazy }) {
|
|
78
90
|
const queryParams = new URLSearchParams({
|
|
79
91
|
platform: encodeURIComponent(platform),
|
|
80
92
|
dev: String(mode !== "production"),
|
|
81
93
|
// TODO: Is this still needed?
|
|
82
|
-
hot: String(false)
|
|
83
|
-
lazy: String(!_env.env.EXPO_NO_METRO_LAZY)
|
|
94
|
+
hot: String(false)
|
|
84
95
|
});
|
|
96
|
+
if (lazy) {
|
|
97
|
+
queryParams.append("lazy", String(lazy));
|
|
98
|
+
}
|
|
85
99
|
if (minify) {
|
|
86
100
|
queryParams.append("minify", String(minify));
|
|
87
101
|
}
|
|
@@ -165,7 +179,8 @@ class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
|
165
179
|
mode: (_mode = this.options.mode) != null ? _mode : "development",
|
|
166
180
|
minify: this.options.minify,
|
|
167
181
|
platform,
|
|
168
|
-
mainModuleName
|
|
182
|
+
mainModuleName,
|
|
183
|
+
lazy: shouldEnableAsyncImports(this.projectRoot)
|
|
169
184
|
});
|
|
170
185
|
return this.options.constructUrl({
|
|
171
186
|
scheme: "http",
|
|
@@ -178,9 +193,11 @@ class ManifestMiddleware extends _expoMiddleware.ExpoMiddleware {
|
|
|
178
193
|
platform: encodeURIComponent(platform),
|
|
179
194
|
dev: String(this.options.mode !== "production"),
|
|
180
195
|
// TODO: Is this still needed?
|
|
181
|
-
hot: String(false)
|
|
182
|
-
lazy: String(!_env.env.EXPO_NO_METRO_LAZY)
|
|
196
|
+
hot: String(false)
|
|
183
197
|
});
|
|
198
|
+
if (shouldEnableAsyncImports(this.projectRoot)) {
|
|
199
|
+
queryParams.append("lazy", String(true));
|
|
200
|
+
}
|
|
184
201
|
if (this.options.minify) {
|
|
185
202
|
queryParams.append("minify", String(this.options.minify));
|
|
186
203
|
}
|