@expo/cli 1.0.0-canary-20250331-817737a → 1.0.0-canary-20250402-161f57b

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 CHANGED
@@ -123,7 +123,7 @@ const args = (0, _arg().default)({
123
123
  });
124
124
  if (args['--version']) {
125
125
  // Version is added in the build script.
126
- console.log("1.0.0-canary-20250331-817737a");
126
+ console.log("1.0.0-canary-20250402-161f57b");
127
127
  process.exit(0);
128
128
  }
129
129
  if (args['--non-interactive']) {
@@ -236,7 +236,7 @@ async function exportEmbedBundleAndAssetsAsync(projectRoot, options) {
236
236
  const files = new Map();
237
237
  try {
238
238
  var _exp_experiments, _exp_web, _bundles_artifacts_filter_;
239
- const bundles = await devServer.nativeExportBundleAsync({
239
+ const bundles = await devServer.nativeExportBundleAsync(exp, {
240
240
  // TODO: Re-enable when we get bytecode chunk splitting working again.
241
241
  splitChunks: false,
242
242
  mainModuleName: (0, _filePath.resolveRealEntryFilePath)(projectRoot, options.entryFile),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/export/embed/exportEmbedAsync.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { getConfig } from '@expo/config';\nimport getMetroAssets from '@expo/metro-config/build/transform-worker/getAssets';\nimport assert from 'assert';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport Server from 'metro/src/Server';\nimport splitBundleOptions from 'metro/src/lib/splitBundleOptions';\nimport output from 'metro/src/shared/output/bundle';\nimport type { BundleOptions } from 'metro/src/shared/types';\nimport path from 'path';\n\nimport { deserializeEagerKey, getExportEmbedOptionsKey, Options } from './resolveOptions';\nimport { isExecutingFromXcodebuild, logMetroErrorInXcode } from './xcodeCompilerLogger';\nimport { Log } from '../../log';\nimport { DevServerManager } from '../../start/server/DevServerManager';\nimport { MetroBundlerDevServer } from '../../start/server/metro/MetroBundlerDevServer';\nimport { loadMetroConfigAsync } from '../../start/server/metro/instantiateMetro';\nimport { assertMetroPrivateServer } from '../../start/server/metro/metroPrivateServer';\nimport { DOM_COMPONENTS_BUNDLE_DIR } from '../../start/server/middleware/DomComponentsMiddleware';\nimport { getMetroDirectBundleOptionsForExpoConfig } from '../../start/server/middleware/metroOptions';\nimport { stripAnsi } from '../../utils/ansi';\nimport { copyAsync, removeAsync } from '../../utils/dir';\nimport { env } from '../../utils/env';\nimport { setNodeEnv } from '../../utils/nodeEnv';\nimport { exportDomComponentAsync } from '../exportDomComponents';\nimport { isEnableHermesManaged } from '../exportHermes';\nimport { persistMetroAssetsAsync } from '../persistMetroAssets';\nimport { copyPublicFolderAsync } from '../publicFolder';\nimport { BundleAssetWithFileHashes, ExportAssetMap, persistMetroFilesAsync } from '../saveAssets';\nimport { exportStandaloneServerAsync } from './exportServer';\nimport { ensureProcessExitsAfterDelay } from '../../utils/exit';\nimport { resolveRealEntryFilePath } from '../../utils/filePath';\n\nconst debug = require('debug')('expo:export:embed');\n\n/**\n * Extended type for the Metro server build result to support the `code` property as a `Buffer`.\n */\ntype ExtendedMetroServerBuildResult =\n | Awaited<ReturnType<Server['build']>>\n | {\n code: string | Buffer;\n };\n\nfunction guessCopiedAppleBundlePath(bundleOutput: string) {\n // Ensure the path is familiar before guessing.\n if (\n !bundleOutput.match(/\\/Xcode\\/DerivedData\\/.*\\/Build\\/Products\\//) &&\n !bundleOutput.match(/\\/CoreSimulator\\/Devices\\/.*\\/data\\/Containers\\/Bundle\\/Application\\//)\n ) {\n debug('Bundling to non-standard location:', bundleOutput);\n return false;\n }\n const bundleName = path.basename(bundleOutput);\n const bundleParent = path.dirname(bundleOutput);\n const possiblePath = globSync(`*.app/${bundleName}`, {\n cwd: bundleParent,\n absolute: true,\n // bundle identifiers can start with dots.\n dot: true,\n })[0];\n debug('Possible path for previous bundle:', possiblePath);\n return possiblePath;\n}\n\nexport async function exportEmbedAsync(projectRoot: string, options: Options) {\n // The React Native build scripts always enable the cache reset but we shouldn't need this in CI environments.\n // By disabling it, we can eagerly bundle code before the build and reuse the cached artifacts in subsequent builds.\n if (env.CI && options.resetCache) {\n debug('CI environment detected, disabling automatic cache reset');\n options.resetCache = false;\n }\n\n setNodeEnv(options.dev ? 'development' : 'production');\n require('@expo/env').load(projectRoot);\n\n // This is an optimized codepath that can occur during `npx expo run` and does not occur during builds from Xcode or Android Studio.\n // Here we reconcile a bundle pass that was run before the native build process. This order can fail faster and is show better errors since the logs won't be obscured by Xcode and Android Studio.\n // This path is also used for automatically deploying server bundles to a remote host.\n const eagerBundleOptions = env.__EXPO_EAGER_BUNDLE_OPTIONS\n ? deserializeEagerKey(env.__EXPO_EAGER_BUNDLE_OPTIONS)\n : null;\n if (eagerBundleOptions) {\n // Get the cache key for the current process to compare against the eager key.\n const inputKey = getExportEmbedOptionsKey(options);\n\n // If the app was bundled previously in the same process, then we should reuse the Metro cache.\n options.resetCache = false;\n\n if (eagerBundleOptions.key === inputKey) {\n // Copy the eager bundleOutput and assets to the new locations.\n await removeAsync(options.bundleOutput);\n\n copyAsync(eagerBundleOptions.options.bundleOutput, options.bundleOutput);\n\n if (eagerBundleOptions.options.assetsDest && options.assetsDest) {\n copyAsync(eagerBundleOptions.options.assetsDest, options.assetsDest);\n }\n\n console.log('info: Copied output to binary:', options.bundleOutput);\n return;\n }\n // TODO: sourcemapOutput is set on Android but not during eager. This is tolerable since it doesn't invalidate the Metro cache.\n console.log(' Eager key:', eagerBundleOptions.key);\n console.log('Request key:', inputKey);\n\n // TODO: We may want an analytic event here in the future to understand when this happens.\n console.warn('warning: Eager bundle does not match new options, bundling again.');\n }\n\n await exportEmbedInternalAsync(projectRoot, options);\n\n // Ensure the process closes after bundling\n ensureProcessExitsAfterDelay();\n}\n\nexport async function exportEmbedInternalAsync(projectRoot: string, options: Options) {\n // Ensure we delete the old bundle to trigger a failure if the bundle cannot be created.\n await removeAsync(options.bundleOutput);\n\n // The iOS bundle is copied in to the Xcode project, so we need to remove the old one\n // to prevent Xcode from loading the old one after a build failure.\n if (options.platform === 'ios') {\n const previousPath = guessCopiedAppleBundlePath(options.bundleOutput);\n if (previousPath && fs.existsSync(previousPath)) {\n debug('Removing previous iOS bundle:', previousPath);\n await removeAsync(previousPath);\n }\n }\n\n const { bundle, assets, files } = await exportEmbedBundleAndAssetsAsync(projectRoot, options);\n\n fs.mkdirSync(path.dirname(options.bundleOutput), { recursive: true, mode: 0o755 });\n\n // On Android, dom components proxy files should write to the assets directory instead of the res directory.\n // We use the bundleOutput directory to get the assets directory.\n const domComponentProxyOutputDir =\n options.platform === 'android' ? path.dirname(options.bundleOutput) : options.assetsDest;\n const hasDomComponents = domComponentProxyOutputDir && files.size > 0;\n\n // Persist bundle and source maps.\n await Promise.all([\n // @ts-expect-error: The `save()` method from metro is typed to support `code: string` only but it also supports `Buffer` actually.\n output.save(bundle, options, Log.log),\n\n // Write dom components proxy files.\n hasDomComponents ? persistMetroFilesAsync(files, domComponentProxyOutputDir) : null,\n // Copy public folder for dom components only if\n hasDomComponents\n ? copyPublicFolderAsync(\n path.resolve(projectRoot, env.EXPO_PUBLIC_FOLDER),\n path.join(domComponentProxyOutputDir, DOM_COMPONENTS_BUNDLE_DIR)\n )\n : null,\n\n // NOTE(EvanBacon): This may need to be adjusted in the future if want to support baseUrl on native\n // platforms when doing production embeds (unlikely).\n options.assetsDest\n ? persistMetroAssetsAsync(projectRoot, assets, {\n platform: options.platform,\n outputDirectory: options.assetsDest,\n iosAssetCatalogDirectory: options.assetCatalogDest,\n })\n : null,\n ]);\n}\n\nexport async function exportEmbedBundleAndAssetsAsync(\n projectRoot: string,\n options: Options\n): Promise<{\n bundle: ExtendedMetroServerBuildResult;\n assets: readonly BundleAssetWithFileHashes[];\n files: ExportAssetMap;\n}> {\n const devServerManager = await DevServerManager.startMetroAsync(projectRoot, {\n minify: options.minify,\n mode: options.dev ? 'development' : 'production',\n port: 8081,\n isExporting: true,\n location: {},\n resetDevServer: options.resetCache,\n maxWorkers: options.maxWorkers,\n });\n\n const devServer = devServerManager.getDefaultDevServer();\n assert(devServer instanceof MetroBundlerDevServer);\n\n const { exp, pkg } = getConfig(projectRoot, { skipSDKVersionRequirement: true });\n const isHermes = isEnableHermesManaged(exp, options.platform);\n\n let sourceMapUrl = options.sourcemapOutput;\n if (sourceMapUrl && !options.sourcemapUseAbsolutePath) {\n sourceMapUrl = path.basename(sourceMapUrl);\n }\n\n const files: ExportAssetMap = new Map();\n\n try {\n const bundles = await devServer.nativeExportBundleAsync(\n {\n // TODO: Re-enable when we get bytecode chunk splitting working again.\n splitChunks: false, //devServer.isReactServerComponentsEnabled,\n mainModuleName: resolveRealEntryFilePath(projectRoot, options.entryFile),\n platform: options.platform,\n minify: options.minify,\n mode: options.dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n serializerIncludeMaps: !!sourceMapUrl,\n bytecode: options.bytecode ?? false,\n // source map inline\n reactCompiler: !!exp.experiments?.reactCompiler,\n },\n files,\n {\n sourceMapUrl,\n unstable_transformProfile: (options.unstableTransformProfile ||\n (isHermes ? 'hermes-stable' : 'default')) as BundleOptions['unstable_transformProfile'],\n }\n );\n\n const apiRoutesEnabled =\n devServer.isReactServerComponentsEnabled || exp.web?.output === 'server';\n\n if (apiRoutesEnabled) {\n await exportStandaloneServerAsync(projectRoot, devServer, {\n exp,\n pkg,\n files,\n options,\n });\n }\n\n // TODO: Remove duplicates...\n const expoDomComponentReferences = bundles.artifacts\n .map((artifact) =>\n Array.isArray(artifact.metadata.expoDomComponentReferences)\n ? artifact.metadata.expoDomComponentReferences\n : []\n )\n .flat();\n if (expoDomComponentReferences.length > 0) {\n await Promise.all(\n // TODO: Make a version of this which uses `this.metro.getBundler().buildGraphForEntries([])` to bundle all the DOM components at once.\n expoDomComponentReferences.map(async (filePath) => {\n const { bundle } = await exportDomComponentAsync({\n filePath,\n projectRoot,\n dev: options.dev,\n devServer,\n isHermes,\n includeSourceMaps: !!sourceMapUrl,\n exp,\n files,\n });\n\n if (options.assetsDest) {\n // Save assets like a typical bundler, preserving the file paths on web.\n // This is saving web-style inside of a native app's binary.\n await persistMetroAssetsAsync(\n projectRoot,\n bundle.assets.map((asset) => ({\n ...asset,\n httpServerLocation: path.join(DOM_COMPONENTS_BUNDLE_DIR, asset.httpServerLocation),\n })),\n {\n files,\n platform: 'web',\n outputDirectory: options.assetsDest,\n }\n );\n }\n })\n );\n }\n\n return {\n files,\n bundle: {\n code: bundles.artifacts.filter((a: any) => a.type === 'js')[0].source,\n // Can be optional when source maps aren't enabled.\n map: bundles.artifacts.filter((a: any) => a.type === 'map')[0]?.source.toString(),\n },\n assets: bundles.assets,\n };\n } catch (error: any) {\n if (isError(error)) {\n // Log using Xcode error format so the errors are picked up by xcodebuild.\n // https://developer.apple.com/documentation/xcode/running-custom-scripts-during-a-build#Log-errors-and-warnings-from-your-script\n if (options.platform === 'ios') {\n // If the error is about to be presented in Xcode, strip the ansi characters from the message.\n if ('message' in error && isExecutingFromXcodebuild()) {\n error.message = stripAnsi(error.message) as string;\n }\n logMetroErrorInXcode(projectRoot, error);\n }\n }\n throw error;\n } finally {\n devServerManager.stopAsync();\n }\n}\n\n// Exports for expo-updates\nexport async function createMetroServerAndBundleRequestAsync(\n projectRoot: string,\n options: Pick<\n Options,\n | 'maxWorkers'\n | 'config'\n | 'platform'\n | 'sourcemapOutput'\n | 'sourcemapUseAbsolutePath'\n | 'entryFile'\n | 'minify'\n | 'dev'\n | 'resetCache'\n | 'unstableTransformProfile'\n >\n): Promise<{ server: Server; bundleRequest: BundleOptions }> {\n const exp = getConfig(projectRoot, { skipSDKVersionRequirement: true }).exp;\n\n // TODO: This is slow ~40ms\n const { config } = await loadMetroConfigAsync(\n projectRoot,\n {\n // TODO: This is always enabled in the native script and there's no way to disable it.\n resetCache: options.resetCache,\n\n maxWorkers: options.maxWorkers,\n config: options.config,\n },\n {\n exp,\n isExporting: true,\n getMetroBundler() {\n return server.getBundler().getBundler();\n },\n }\n );\n\n const isHermes = isEnableHermesManaged(exp, options.platform);\n\n let sourceMapUrl = options.sourcemapOutput;\n if (sourceMapUrl && !options.sourcemapUseAbsolutePath) {\n sourceMapUrl = path.basename(sourceMapUrl);\n }\n\n // TODO(cedric): check if we can use the proper `bundleType=bundle` and `entryPoint=mainModuleName` properties\n // @ts-expect-error: see above\n const bundleRequest: BundleOptions = {\n ...Server.DEFAULT_BUNDLE_OPTIONS,\n ...getMetroDirectBundleOptionsForExpoConfig(projectRoot, exp, {\n splitChunks: false,\n mainModuleName: resolveRealEntryFilePath(projectRoot, options.entryFile),\n platform: options.platform,\n minify: options.minify,\n mode: options.dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n isExporting: true,\n // Never output bytecode in the exported bundle since that is hardcoded in the native run script.\n bytecode: false,\n }),\n sourceMapUrl,\n unstable_transformProfile: (options.unstableTransformProfile ||\n (isHermes ? 'hermes-stable' : 'default')) as BundleOptions['unstable_transformProfile'],\n };\n\n const server = new Server(config, {\n watch: false,\n });\n\n return { server, bundleRequest };\n}\n\nexport async function exportEmbedAssetsAsync(\n server: Server,\n bundleRequest: BundleOptions,\n projectRoot: string,\n options: Pick<Options, 'platform'>\n) {\n try {\n const { entryFile, onProgress, resolverOptions, transformOptions } = splitBundleOptions({\n ...bundleRequest,\n bundleType: 'todo',\n });\n\n assertMetroPrivateServer(server);\n\n const dependencies = await server._bundler.getDependencies(\n [entryFile],\n transformOptions,\n resolverOptions,\n { onProgress, shallow: false, lazy: false }\n );\n\n const config = server._config;\n\n return getMetroAssets(dependencies, {\n processModuleFilter: config.serializer.processModuleFilter,\n assetPlugins: config.transformer.assetPlugins,\n platform: transformOptions.platform!,\n // Forked out of Metro because the `this._getServerRootDir()` doesn't match the development\n // behavior.\n projectRoot: config.projectRoot, // this._getServerRootDir(),\n publicPath: config.transformer.publicPath,\n });\n } catch (error: any) {\n if (isError(error)) {\n // Log using Xcode error format so the errors are picked up by xcodebuild.\n // https://developer.apple.com/documentation/xcode/running-custom-scripts-during-a-build#Log-errors-and-warnings-from-your-script\n if (options.platform === 'ios') {\n // If the error is about to be presented in Xcode, strip the ansi characters from the message.\n if ('message' in error && isExecutingFromXcodebuild()) {\n error.message = stripAnsi(error.message) as string;\n }\n logMetroErrorInXcode(projectRoot, error);\n }\n }\n throw error;\n }\n}\n\nfunction isError(error: any): error is Error {\n return error instanceof Error;\n}\n"],"names":["createMetroServerAndBundleRequestAsync","exportEmbedAssetsAsync","exportEmbedAsync","exportEmbedBundleAndAssetsAsync","exportEmbedInternalAsync","debug","require","guessCopiedAppleBundlePath","bundleOutput","match","bundleName","path","basename","bundleParent","dirname","possiblePath","globSync","cwd","absolute","dot","projectRoot","options","env","CI","resetCache","setNodeEnv","dev","load","eagerBundleOptions","__EXPO_EAGER_BUNDLE_OPTIONS","deserializeEagerKey","inputKey","getExportEmbedOptionsKey","key","removeAsync","copyAsync","assetsDest","console","log","warn","ensureProcessExitsAfterDelay","platform","previousPath","fs","existsSync","bundle","assets","files","mkdirSync","recursive","mode","domComponentProxyOutputDir","hasDomComponents","size","Promise","all","output","save","Log","persistMetroFilesAsync","copyPublicFolderAsync","resolve","EXPO_PUBLIC_FOLDER","join","DOM_COMPONENTS_BUNDLE_DIR","persistMetroAssetsAsync","outputDirectory","iosAssetCatalogDirectory","assetCatalogDest","devServerManager","DevServerManager","startMetroAsync","minify","port","isExporting","location","resetDevServer","maxWorkers","devServer","getDefaultDevServer","assert","MetroBundlerDevServer","exp","pkg","getConfig","skipSDKVersionRequirement","isHermes","isEnableHermesManaged","sourceMapUrl","sourcemapOutput","sourcemapUseAbsolutePath","Map","bundles","nativeExportBundleAsync","splitChunks","mainModuleName","resolveRealEntryFilePath","entryFile","engine","undefined","serializerIncludeMaps","bytecode","reactCompiler","experiments","unstable_transformProfile","unstableTransformProfile","apiRoutesEnabled","isReactServerComponentsEnabled","web","exportStandaloneServerAsync","expoDomComponentReferences","artifacts","map","artifact","Array","isArray","metadata","flat","length","filePath","exportDomComponentAsync","includeSourceMaps","asset","httpServerLocation","code","filter","a","type","source","toString","error","isError","isExecutingFromXcodebuild","message","stripAnsi","logMetroErrorInXcode","stopAsync","config","loadMetroConfigAsync","getMetroBundler","server","getBundler","bundleRequest","Server","DEFAULT_BUNDLE_OPTIONS","getMetroDirectBundleOptionsForExpoConfig","watch","onProgress","resolverOptions","transformOptions","splitBundleOptions","bundleType","assertMetroPrivateServer","dependencies","_bundler","getDependencies","shallow","lazy","_config","getMetroAssets","processModuleFilter","serializer","assetPlugins","transformer","publicPath","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/export/embed/exportEmbedAsync.ts"],"sourcesContent":["/**\n * Copyright © 2023 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { getConfig } from '@expo/config';\nimport getMetroAssets from '@expo/metro-config/build/transform-worker/getAssets';\nimport assert from 'assert';\nimport fs from 'fs';\nimport { sync as globSync } from 'glob';\nimport Server from 'metro/src/Server';\nimport splitBundleOptions from 'metro/src/lib/splitBundleOptions';\nimport output from 'metro/src/shared/output/bundle';\nimport type { BundleOptions } from 'metro/src/shared/types';\nimport path from 'path';\n\nimport { deserializeEagerKey, getExportEmbedOptionsKey, Options } from './resolveOptions';\nimport { isExecutingFromXcodebuild, logMetroErrorInXcode } from './xcodeCompilerLogger';\nimport { Log } from '../../log';\nimport { DevServerManager } from '../../start/server/DevServerManager';\nimport { MetroBundlerDevServer } from '../../start/server/metro/MetroBundlerDevServer';\nimport { loadMetroConfigAsync } from '../../start/server/metro/instantiateMetro';\nimport { assertMetroPrivateServer } from '../../start/server/metro/metroPrivateServer';\nimport { DOM_COMPONENTS_BUNDLE_DIR } from '../../start/server/middleware/DomComponentsMiddleware';\nimport { getMetroDirectBundleOptionsForExpoConfig } from '../../start/server/middleware/metroOptions';\nimport { stripAnsi } from '../../utils/ansi';\nimport { copyAsync, removeAsync } from '../../utils/dir';\nimport { env } from '../../utils/env';\nimport { setNodeEnv } from '../../utils/nodeEnv';\nimport { exportDomComponentAsync } from '../exportDomComponents';\nimport { isEnableHermesManaged } from '../exportHermes';\nimport { persistMetroAssetsAsync } from '../persistMetroAssets';\nimport { copyPublicFolderAsync } from '../publicFolder';\nimport { BundleAssetWithFileHashes, ExportAssetMap, persistMetroFilesAsync } from '../saveAssets';\nimport { exportStandaloneServerAsync } from './exportServer';\nimport { ensureProcessExitsAfterDelay } from '../../utils/exit';\nimport { resolveRealEntryFilePath } from '../../utils/filePath';\n\nconst debug = require('debug')('expo:export:embed');\n\n/**\n * Extended type for the Metro server build result to support the `code` property as a `Buffer`.\n */\ntype ExtendedMetroServerBuildResult =\n | Awaited<ReturnType<Server['build']>>\n | {\n code: string | Buffer;\n };\n\nfunction guessCopiedAppleBundlePath(bundleOutput: string) {\n // Ensure the path is familiar before guessing.\n if (\n !bundleOutput.match(/\\/Xcode\\/DerivedData\\/.*\\/Build\\/Products\\//) &&\n !bundleOutput.match(/\\/CoreSimulator\\/Devices\\/.*\\/data\\/Containers\\/Bundle\\/Application\\//)\n ) {\n debug('Bundling to non-standard location:', bundleOutput);\n return false;\n }\n const bundleName = path.basename(bundleOutput);\n const bundleParent = path.dirname(bundleOutput);\n const possiblePath = globSync(`*.app/${bundleName}`, {\n cwd: bundleParent,\n absolute: true,\n // bundle identifiers can start with dots.\n dot: true,\n })[0];\n debug('Possible path for previous bundle:', possiblePath);\n return possiblePath;\n}\n\nexport async function exportEmbedAsync(projectRoot: string, options: Options) {\n // The React Native build scripts always enable the cache reset but we shouldn't need this in CI environments.\n // By disabling it, we can eagerly bundle code before the build and reuse the cached artifacts in subsequent builds.\n if (env.CI && options.resetCache) {\n debug('CI environment detected, disabling automatic cache reset');\n options.resetCache = false;\n }\n\n setNodeEnv(options.dev ? 'development' : 'production');\n require('@expo/env').load(projectRoot);\n\n // This is an optimized codepath that can occur during `npx expo run` and does not occur during builds from Xcode or Android Studio.\n // Here we reconcile a bundle pass that was run before the native build process. This order can fail faster and is show better errors since the logs won't be obscured by Xcode and Android Studio.\n // This path is also used for automatically deploying server bundles to a remote host.\n const eagerBundleOptions = env.__EXPO_EAGER_BUNDLE_OPTIONS\n ? deserializeEagerKey(env.__EXPO_EAGER_BUNDLE_OPTIONS)\n : null;\n if (eagerBundleOptions) {\n // Get the cache key for the current process to compare against the eager key.\n const inputKey = getExportEmbedOptionsKey(options);\n\n // If the app was bundled previously in the same process, then we should reuse the Metro cache.\n options.resetCache = false;\n\n if (eagerBundleOptions.key === inputKey) {\n // Copy the eager bundleOutput and assets to the new locations.\n await removeAsync(options.bundleOutput);\n\n copyAsync(eagerBundleOptions.options.bundleOutput, options.bundleOutput);\n\n if (eagerBundleOptions.options.assetsDest && options.assetsDest) {\n copyAsync(eagerBundleOptions.options.assetsDest, options.assetsDest);\n }\n\n console.log('info: Copied output to binary:', options.bundleOutput);\n return;\n }\n // TODO: sourcemapOutput is set on Android but not during eager. This is tolerable since it doesn't invalidate the Metro cache.\n console.log(' Eager key:', eagerBundleOptions.key);\n console.log('Request key:', inputKey);\n\n // TODO: We may want an analytic event here in the future to understand when this happens.\n console.warn('warning: Eager bundle does not match new options, bundling again.');\n }\n\n await exportEmbedInternalAsync(projectRoot, options);\n\n // Ensure the process closes after bundling\n ensureProcessExitsAfterDelay();\n}\n\nexport async function exportEmbedInternalAsync(projectRoot: string, options: Options) {\n // Ensure we delete the old bundle to trigger a failure if the bundle cannot be created.\n await removeAsync(options.bundleOutput);\n\n // The iOS bundle is copied in to the Xcode project, so we need to remove the old one\n // to prevent Xcode from loading the old one after a build failure.\n if (options.platform === 'ios') {\n const previousPath = guessCopiedAppleBundlePath(options.bundleOutput);\n if (previousPath && fs.existsSync(previousPath)) {\n debug('Removing previous iOS bundle:', previousPath);\n await removeAsync(previousPath);\n }\n }\n\n const { bundle, assets, files } = await exportEmbedBundleAndAssetsAsync(projectRoot, options);\n\n fs.mkdirSync(path.dirname(options.bundleOutput), { recursive: true, mode: 0o755 });\n\n // On Android, dom components proxy files should write to the assets directory instead of the res directory.\n // We use the bundleOutput directory to get the assets directory.\n const domComponentProxyOutputDir =\n options.platform === 'android' ? path.dirname(options.bundleOutput) : options.assetsDest;\n const hasDomComponents = domComponentProxyOutputDir && files.size > 0;\n\n // Persist bundle and source maps.\n await Promise.all([\n // @ts-expect-error: The `save()` method from metro is typed to support `code: string` only but it also supports `Buffer` actually.\n output.save(bundle, options, Log.log),\n\n // Write dom components proxy files.\n hasDomComponents ? persistMetroFilesAsync(files, domComponentProxyOutputDir) : null,\n // Copy public folder for dom components only if\n hasDomComponents\n ? copyPublicFolderAsync(\n path.resolve(projectRoot, env.EXPO_PUBLIC_FOLDER),\n path.join(domComponentProxyOutputDir, DOM_COMPONENTS_BUNDLE_DIR)\n )\n : null,\n\n // NOTE(EvanBacon): This may need to be adjusted in the future if want to support baseUrl on native\n // platforms when doing production embeds (unlikely).\n options.assetsDest\n ? persistMetroAssetsAsync(projectRoot, assets, {\n platform: options.platform,\n outputDirectory: options.assetsDest,\n iosAssetCatalogDirectory: options.assetCatalogDest,\n })\n : null,\n ]);\n}\n\nexport async function exportEmbedBundleAndAssetsAsync(\n projectRoot: string,\n options: Options\n): Promise<{\n bundle: ExtendedMetroServerBuildResult;\n assets: readonly BundleAssetWithFileHashes[];\n files: ExportAssetMap;\n}> {\n const devServerManager = await DevServerManager.startMetroAsync(projectRoot, {\n minify: options.minify,\n mode: options.dev ? 'development' : 'production',\n port: 8081,\n isExporting: true,\n location: {},\n resetDevServer: options.resetCache,\n maxWorkers: options.maxWorkers,\n });\n\n const devServer = devServerManager.getDefaultDevServer();\n assert(devServer instanceof MetroBundlerDevServer);\n\n const { exp, pkg } = getConfig(projectRoot, { skipSDKVersionRequirement: true });\n const isHermes = isEnableHermesManaged(exp, options.platform);\n\n let sourceMapUrl = options.sourcemapOutput;\n if (sourceMapUrl && !options.sourcemapUseAbsolutePath) {\n sourceMapUrl = path.basename(sourceMapUrl);\n }\n\n const files: ExportAssetMap = new Map();\n\n try {\n const bundles = await devServer.nativeExportBundleAsync(\n exp,\n {\n // TODO: Re-enable when we get bytecode chunk splitting working again.\n splitChunks: false, //devServer.isReactServerComponentsEnabled,\n mainModuleName: resolveRealEntryFilePath(projectRoot, options.entryFile),\n platform: options.platform,\n minify: options.minify,\n mode: options.dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n serializerIncludeMaps: !!sourceMapUrl,\n bytecode: options.bytecode ?? false,\n // source map inline\n reactCompiler: !!exp.experiments?.reactCompiler,\n },\n files,\n {\n sourceMapUrl,\n unstable_transformProfile: (options.unstableTransformProfile ||\n (isHermes ? 'hermes-stable' : 'default')) as BundleOptions['unstable_transformProfile'],\n }\n );\n\n const apiRoutesEnabled =\n devServer.isReactServerComponentsEnabled || exp.web?.output === 'server';\n\n if (apiRoutesEnabled) {\n await exportStandaloneServerAsync(projectRoot, devServer, {\n exp,\n pkg,\n files,\n options,\n });\n }\n\n // TODO: Remove duplicates...\n const expoDomComponentReferences = bundles.artifacts\n .map((artifact) =>\n Array.isArray(artifact.metadata.expoDomComponentReferences)\n ? artifact.metadata.expoDomComponentReferences\n : []\n )\n .flat();\n if (expoDomComponentReferences.length > 0) {\n await Promise.all(\n // TODO: Make a version of this which uses `this.metro.getBundler().buildGraphForEntries([])` to bundle all the DOM components at once.\n expoDomComponentReferences.map(async (filePath) => {\n const { bundle } = await exportDomComponentAsync({\n filePath,\n projectRoot,\n dev: options.dev,\n devServer,\n isHermes,\n includeSourceMaps: !!sourceMapUrl,\n exp,\n files,\n });\n\n if (options.assetsDest) {\n // Save assets like a typical bundler, preserving the file paths on web.\n // This is saving web-style inside of a native app's binary.\n await persistMetroAssetsAsync(\n projectRoot,\n bundle.assets.map((asset) => ({\n ...asset,\n httpServerLocation: path.join(DOM_COMPONENTS_BUNDLE_DIR, asset.httpServerLocation),\n })),\n {\n files,\n platform: 'web',\n outputDirectory: options.assetsDest,\n }\n );\n }\n })\n );\n }\n\n return {\n files,\n bundle: {\n code: bundles.artifacts.filter((a: any) => a.type === 'js')[0].source,\n // Can be optional when source maps aren't enabled.\n map: bundles.artifacts.filter((a: any) => a.type === 'map')[0]?.source.toString(),\n },\n assets: bundles.assets,\n };\n } catch (error: any) {\n if (isError(error)) {\n // Log using Xcode error format so the errors are picked up by xcodebuild.\n // https://developer.apple.com/documentation/xcode/running-custom-scripts-during-a-build#Log-errors-and-warnings-from-your-script\n if (options.platform === 'ios') {\n // If the error is about to be presented in Xcode, strip the ansi characters from the message.\n if ('message' in error && isExecutingFromXcodebuild()) {\n error.message = stripAnsi(error.message) as string;\n }\n logMetroErrorInXcode(projectRoot, error);\n }\n }\n throw error;\n } finally {\n devServerManager.stopAsync();\n }\n}\n\n// Exports for expo-updates\nexport async function createMetroServerAndBundleRequestAsync(\n projectRoot: string,\n options: Pick<\n Options,\n | 'maxWorkers'\n | 'config'\n | 'platform'\n | 'sourcemapOutput'\n | 'sourcemapUseAbsolutePath'\n | 'entryFile'\n | 'minify'\n | 'dev'\n | 'resetCache'\n | 'unstableTransformProfile'\n >\n): Promise<{ server: Server; bundleRequest: BundleOptions }> {\n const exp = getConfig(projectRoot, { skipSDKVersionRequirement: true }).exp;\n\n // TODO: This is slow ~40ms\n const { config } = await loadMetroConfigAsync(\n projectRoot,\n {\n // TODO: This is always enabled in the native script and there's no way to disable it.\n resetCache: options.resetCache,\n\n maxWorkers: options.maxWorkers,\n config: options.config,\n },\n {\n exp,\n isExporting: true,\n getMetroBundler() {\n return server.getBundler().getBundler();\n },\n }\n );\n\n const isHermes = isEnableHermesManaged(exp, options.platform);\n\n let sourceMapUrl = options.sourcemapOutput;\n if (sourceMapUrl && !options.sourcemapUseAbsolutePath) {\n sourceMapUrl = path.basename(sourceMapUrl);\n }\n\n // TODO(cedric): check if we can use the proper `bundleType=bundle` and `entryPoint=mainModuleName` properties\n // @ts-expect-error: see above\n const bundleRequest: BundleOptions = {\n ...Server.DEFAULT_BUNDLE_OPTIONS,\n ...getMetroDirectBundleOptionsForExpoConfig(projectRoot, exp, {\n splitChunks: false,\n mainModuleName: resolveRealEntryFilePath(projectRoot, options.entryFile),\n platform: options.platform,\n minify: options.minify,\n mode: options.dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n isExporting: true,\n // Never output bytecode in the exported bundle since that is hardcoded in the native run script.\n bytecode: false,\n }),\n sourceMapUrl,\n unstable_transformProfile: (options.unstableTransformProfile ||\n (isHermes ? 'hermes-stable' : 'default')) as BundleOptions['unstable_transformProfile'],\n };\n\n const server = new Server(config, {\n watch: false,\n });\n\n return { server, bundleRequest };\n}\n\nexport async function exportEmbedAssetsAsync(\n server: Server,\n bundleRequest: BundleOptions,\n projectRoot: string,\n options: Pick<Options, 'platform'>\n) {\n try {\n const { entryFile, onProgress, resolverOptions, transformOptions } = splitBundleOptions({\n ...bundleRequest,\n bundleType: 'todo',\n });\n\n assertMetroPrivateServer(server);\n\n const dependencies = await server._bundler.getDependencies(\n [entryFile],\n transformOptions,\n resolverOptions,\n { onProgress, shallow: false, lazy: false }\n );\n\n const config = server._config;\n\n return getMetroAssets(dependencies, {\n processModuleFilter: config.serializer.processModuleFilter,\n assetPlugins: config.transformer.assetPlugins,\n platform: transformOptions.platform!,\n // Forked out of Metro because the `this._getServerRootDir()` doesn't match the development\n // behavior.\n projectRoot: config.projectRoot, // this._getServerRootDir(),\n publicPath: config.transformer.publicPath,\n });\n } catch (error: any) {\n if (isError(error)) {\n // Log using Xcode error format so the errors are picked up by xcodebuild.\n // https://developer.apple.com/documentation/xcode/running-custom-scripts-during-a-build#Log-errors-and-warnings-from-your-script\n if (options.platform === 'ios') {\n // If the error is about to be presented in Xcode, strip the ansi characters from the message.\n if ('message' in error && isExecutingFromXcodebuild()) {\n error.message = stripAnsi(error.message) as string;\n }\n logMetroErrorInXcode(projectRoot, error);\n }\n }\n throw error;\n }\n}\n\nfunction isError(error: any): error is Error {\n return error instanceof Error;\n}\n"],"names":["createMetroServerAndBundleRequestAsync","exportEmbedAssetsAsync","exportEmbedAsync","exportEmbedBundleAndAssetsAsync","exportEmbedInternalAsync","debug","require","guessCopiedAppleBundlePath","bundleOutput","match","bundleName","path","basename","bundleParent","dirname","possiblePath","globSync","cwd","absolute","dot","projectRoot","options","env","CI","resetCache","setNodeEnv","dev","load","eagerBundleOptions","__EXPO_EAGER_BUNDLE_OPTIONS","deserializeEagerKey","inputKey","getExportEmbedOptionsKey","key","removeAsync","copyAsync","assetsDest","console","log","warn","ensureProcessExitsAfterDelay","platform","previousPath","fs","existsSync","bundle","assets","files","mkdirSync","recursive","mode","domComponentProxyOutputDir","hasDomComponents","size","Promise","all","output","save","Log","persistMetroFilesAsync","copyPublicFolderAsync","resolve","EXPO_PUBLIC_FOLDER","join","DOM_COMPONENTS_BUNDLE_DIR","persistMetroAssetsAsync","outputDirectory","iosAssetCatalogDirectory","assetCatalogDest","devServerManager","DevServerManager","startMetroAsync","minify","port","isExporting","location","resetDevServer","maxWorkers","devServer","getDefaultDevServer","assert","MetroBundlerDevServer","exp","pkg","getConfig","skipSDKVersionRequirement","isHermes","isEnableHermesManaged","sourceMapUrl","sourcemapOutput","sourcemapUseAbsolutePath","Map","bundles","nativeExportBundleAsync","splitChunks","mainModuleName","resolveRealEntryFilePath","entryFile","engine","undefined","serializerIncludeMaps","bytecode","reactCompiler","experiments","unstable_transformProfile","unstableTransformProfile","apiRoutesEnabled","isReactServerComponentsEnabled","web","exportStandaloneServerAsync","expoDomComponentReferences","artifacts","map","artifact","Array","isArray","metadata","flat","length","filePath","exportDomComponentAsync","includeSourceMaps","asset","httpServerLocation","code","filter","a","type","source","toString","error","isError","isExecutingFromXcodebuild","message","stripAnsi","logMetroErrorInXcode","stopAsync","config","loadMetroConfigAsync","getMetroBundler","server","getBundler","bundleRequest","Server","DEFAULT_BUNDLE_OPTIONS","getMetroDirectBundleOptionsForExpoConfig","watch","onProgress","resolverOptions","transformOptions","splitBundleOptions","bundleType","assertMetroPrivateServer","dependencies","_bundler","getDependencies","shallow","lazy","_config","getMetroAssets","processModuleFilter","serializer","assetPlugins","transformer","publicPath","Error"],"mappings":"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"}
@@ -193,7 +193,7 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
193
193
  await (0, _exportHermes.assertEngineMismatchAsync)(projectRoot, exp, platform);
194
194
  }
195
195
  // Run metro bundler and create the JS bundles/source maps.
196
- const bundle = await devServer.nativeExportBundleAsync({
196
+ const bundle = await devServer.nativeExportBundleAsync(exp, {
197
197
  platform,
198
198
  splitChunks: !_env.env.EXPO_NO_BUNDLE_SPLITTING && (devServer.isReactServerComponentsEnabled && !bytecode || platform === 'web'),
199
199
  mainModuleName: (0, _ManifestMiddleware.getEntryWithServerRoot)(projectRoot, {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/export/exportApp.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport type { Platform } from '@expo/config';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { type PlatformMetadata, createMetadataJson } from './createMetadataJson';\nimport { exportAssetsAsync } from './exportAssets';\nimport {\n addDomBundleToMetadataAsync,\n exportDomComponentAsync,\n transformNativeBundleForMd5Filename,\n transformDomEntryForMd5Filename,\n} from './exportDomComponents';\nimport { assertEngineMismatchAsync, isEnableHermesManaged } from './exportHermes';\nimport { exportApiRoutesStandaloneAsync, exportFromServerAsync } from './exportStaticAsync';\nimport { getVirtualFaviconAssetsAsync } from './favicon';\nimport { getPublicExpoManifestAsync } from './getPublicExpoManifest';\nimport { copyPublicFolderAsync } from './publicFolder';\nimport { Options } from './resolveOptions';\nimport {\n ExportAssetMap,\n BundleOutput,\n getFilesFromSerialAssets,\n persistMetroFilesAsync,\n} from './saveAssets';\nimport { createAssetMap } from './writeContents';\nimport * as Log from '../log';\nimport { WebSupportProjectPrerequisite } from '../start/doctor/web/WebSupportProjectPrerequisite';\nimport { DevServerManager } from '../start/server/DevServerManager';\nimport { MetroBundlerDevServer } from '../start/server/metro/MetroBundlerDevServer';\nimport { getRouterDirectoryModuleIdWithManifest } from '../start/server/metro/router';\nimport { serializeHtmlWithAssets } from '../start/server/metro/serializeHtml';\nimport { getEntryWithServerRoot } from '../start/server/middleware/ManifestMiddleware';\nimport { getBaseUrlFromExpoConfig } from '../start/server/middleware/metroOptions';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../start/server/webTemplate';\nimport { env } from '../utils/env';\nimport { CommandError } from '../utils/errors';\nimport { setNodeEnv } from '../utils/nodeEnv';\n\nexport async function exportAppAsync(\n projectRoot: string,\n {\n platforms,\n outputDir,\n clear,\n dev,\n dumpAssetmap,\n sourceMaps,\n minify,\n bytecode,\n maxWorkers,\n skipSSG,\n }: Pick<\n Options,\n | 'dumpAssetmap'\n | 'sourceMaps'\n | 'dev'\n | 'clear'\n | 'outputDir'\n | 'platforms'\n | 'minify'\n | 'bytecode'\n | 'maxWorkers'\n | 'skipSSG'\n >\n): Promise<void> {\n // Force the environment during export and do not allow overriding it.\n const environment = dev ? 'development' : 'production';\n process.env.NODE_ENV = environment;\n setNodeEnv(environment);\n\n require('@expo/env').load(projectRoot);\n\n const projectConfig = getConfig(projectRoot);\n const exp = await getPublicExpoManifestAsync(projectRoot, {\n // Web doesn't require validation.\n skipValidation: platforms.length === 1 && platforms[0] === 'web',\n });\n\n if (platforms.includes('web')) {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n }\n\n const useServerRendering = ['static', 'server'].includes(exp.web?.output ?? '');\n\n if (skipSSG && exp.web?.output !== 'server') {\n throw new CommandError('--no-ssg can only be used with `web.output: server`');\n }\n\n const baseUrl = getBaseUrlFromExpoConfig(exp);\n\n if (!bytecode && (platforms.includes('ios') || platforms.includes('android'))) {\n Log.warn(\n `Bytecode makes the app startup faster, disabling bytecode is highly discouraged and should only be used for debugging purposes.`\n );\n }\n\n // Print out logs\n if (baseUrl) {\n Log.log();\n Log.log(chalk.gray`Using (experimental) base path: ${baseUrl}`);\n // Warn if not using an absolute path.\n if (!baseUrl.startsWith('/')) {\n Log.log(\n chalk.yellow` Base path does not start with a slash. Requests will not be absolute.`\n );\n }\n }\n\n const mode = dev ? 'development' : 'production';\n const publicPath = path.resolve(projectRoot, env.EXPO_PUBLIC_FOLDER);\n const outputPath = path.resolve(projectRoot, outputDir);\n\n // Write the JS bundles to disk, and get the bundle file names (this could change with async chunk loading support).\n\n const files: ExportAssetMap = new Map();\n\n const devServerManager = await DevServerManager.startMetroAsync(projectRoot, {\n minify,\n mode,\n port: 8081,\n isExporting: true,\n location: {},\n resetDevServer: clear,\n maxWorkers,\n });\n\n const devServer = devServerManager.getDefaultDevServer();\n assert(devServer instanceof MetroBundlerDevServer);\n\n const bundles: Partial<Record<Platform, BundleOutput>> = {};\n const domComponentAssetsMetadata: Partial<Record<Platform, PlatformMetadata['assets']>> = {};\n\n const spaPlatforms =\n // TODO: Support server and static rendering for server component exports.\n useServerRendering && !devServer.isReactServerComponentsEnabled\n ? platforms.filter((platform) => platform !== 'web')\n : platforms;\n\n try {\n if (devServer.isReactServerComponentsEnabled) {\n // In RSC mode, we only need these to be in the client dir.\n // TODO: Merge back with other copy after we add SSR.\n try {\n await copyPublicFolderAsync(publicPath, path.join(outputPath, 'client'));\n } catch (error) {\n Log.error('Failed to copy public directory to dist directory');\n throw error;\n }\n } else {\n // NOTE(kitten): The public folder is currently always copied, regardless of targetDomain\n // split. Hence, there's another separate `copyPublicFolderAsync` call below for `web`\n await copyPublicFolderAsync(publicPath, outputPath);\n }\n\n let templateHtml: string | undefined;\n // Can be empty during web-only SSG.\n if (spaPlatforms.length) {\n await Promise.all(\n spaPlatforms.map(async (platform) => {\n // Assert early so the user doesn't have to wait until bundling is complete to find out that\n // Hermes won't be available.\n const isHermes = isEnableHermesManaged(exp, platform);\n if (isHermes) {\n await assertEngineMismatchAsync(projectRoot, exp, platform);\n }\n\n // Run metro bundler and create the JS bundles/source maps.\n const bundle = await devServer.nativeExportBundleAsync(\n {\n platform,\n splitChunks:\n !env.EXPO_NO_BUNDLE_SPLITTING &&\n ((devServer.isReactServerComponentsEnabled && !bytecode) || platform === 'web'),\n mainModuleName: getEntryWithServerRoot(projectRoot, {\n platform,\n pkg: projectConfig.pkg,\n }),\n mode: dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n serializerIncludeMaps: sourceMaps,\n bytecode: bytecode && isHermes,\n reactCompiler: !!exp.experiments?.reactCompiler,\n },\n files\n );\n\n bundles[platform] = bundle;\n\n getFilesFromSerialAssets(bundle.artifacts, {\n includeSourceMaps: sourceMaps,\n files,\n isServerHosted: devServer.isReactServerComponentsEnabled,\n });\n\n // TODO: Remove duplicates...\n const expoDomComponentReferences = bundle.artifacts\n .map((artifact) =>\n Array.isArray(artifact.metadata.expoDomComponentReferences)\n ? artifact.metadata.expoDomComponentReferences\n : []\n )\n .flat();\n await Promise.all(\n // TODO: Make a version of this which uses `this.metro.getBundler().buildGraphForEntries([])` to bundle all the DOM components at once.\n expoDomComponentReferences.map(async (filePath) => {\n const { bundle: platformDomComponentsBundle, htmlOutputName } =\n await exportDomComponentAsync({\n filePath,\n projectRoot,\n dev,\n devServer,\n isHermes,\n includeSourceMaps: sourceMaps,\n exp,\n files,\n useMd5Filename: true,\n });\n\n // Merge the assets from the DOM component into the output assets.\n // @ts-expect-error: mutate assets\n bundle.assets.push(...platformDomComponentsBundle.assets);\n\n transformNativeBundleForMd5Filename({\n domComponentReference: filePath,\n nativeBundle: bundle,\n files,\n htmlOutputName,\n });\n domComponentAssetsMetadata[platform] = [\n ...(await addDomBundleToMetadataAsync(platformDomComponentsBundle)),\n ...transformDomEntryForMd5Filename({\n files,\n htmlOutputName,\n }),\n ];\n })\n );\n\n if (platform === 'web') {\n // TODO: Unify with exportStaticAsync\n // TODO: Maybe move to the serializer.\n let html = await serializeHtmlWithAssets({\n isExporting: true,\n resources: bundle.artifacts,\n template: await createTemplateHtmlFromExpoConfigAsync(projectRoot, {\n scripts: [],\n cssLinks: [],\n exp: projectConfig.exp,\n }),\n baseUrl,\n });\n\n // Add the favicon assets to the HTML.\n const modifyHtml = await getVirtualFaviconAssetsAsync(projectRoot, {\n outputDir,\n baseUrl,\n files,\n exp: projectConfig.exp,\n });\n if (modifyHtml) {\n html = modifyHtml(html);\n }\n\n // HACK: This is used for adding SSR shims in React Server Components.\n templateHtml = html;\n\n // Generate SPA-styled HTML file.\n // If web exists, then write the template HTML file.\n files.set('index.html', {\n contents: html,\n targetDomain: devServer.isReactServerComponentsEnabled ? 'server' : 'client',\n });\n }\n })\n );\n\n if (devServer.isReactServerComponentsEnabled) {\n const isWeb = platforms.includes('web');\n\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: !isWeb,\n templateHtml,\n });\n }\n\n // TODO: Use same asset system across platforms again.\n const { assets, embeddedHashSet } = await exportAssetsAsync(projectRoot, {\n files,\n exp,\n outputDir: outputPath,\n bundles,\n baseUrl,\n });\n\n if (dumpAssetmap) {\n Log.log('Creating asset map');\n files.set('assetmap.json', { contents: JSON.stringify(createAssetMap({ assets })) });\n }\n\n const targetDomain = devServer.isReactServerComponentsEnabled ? 'client/' : '';\n const fileNames = Object.fromEntries(\n Object.entries(bundles).map(([platform, bundle]) => [\n platform,\n bundle.artifacts\n .filter((asset) => asset.type === 'js')\n .map((asset) => targetDomain + asset.filename),\n ])\n );\n\n // Generate a `metadata.json` for EAS Update.\n const contents = createMetadataJson({\n bundles,\n fileNames,\n embeddedHashSet,\n domComponentAssetsMetadata,\n });\n files.set('metadata.json', { contents: JSON.stringify(contents) });\n }\n\n // Additional web-only steps...\n\n if (platforms.includes('web') && useServerRendering) {\n const exportServer = exp.web?.output === 'server';\n\n if (exportServer) {\n // TODO: Remove when this is abstracted into the files map\n await copyPublicFolderAsync(publicPath, path.resolve(outputPath, 'client'));\n }\n\n if (skipSSG) {\n Log.log('Skipping static site generation');\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: true,\n });\n\n // Output a placeholder index.html if one doesn't exist in the public directory.\n // This ensures native + API routes have some content at the root URL.\n const placeholderIndex = path.resolve(outputPath, 'client/index.html');\n if (!fs.existsSync(placeholderIndex)) {\n files.set('index.html', {\n contents: `<html><body></body></html>`,\n targetDomain: 'client',\n });\n }\n } else if (\n // TODO: Support static export with RSC.\n !devServer.isReactServerComponentsEnabled\n ) {\n await exportFromServerAsync(projectRoot, devServer, {\n mode,\n files,\n clear: !!clear,\n outputDir: outputPath,\n minify,\n baseUrl,\n includeSourceMaps: sourceMaps,\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n reactCompiler: !!exp.experiments?.reactCompiler,\n exportServer,\n maxWorkers,\n isExporting: true,\n exp: projectConfig.exp,\n });\n }\n }\n } finally {\n await devServerManager.stopAsync();\n }\n\n // Write all files at the end for unified logging.\n await persistMetroFilesAsync(files, outputPath);\n}\n"],"names":["exportAppAsync","projectRoot","platforms","outputDir","clear","dev","dumpAssetmap","sourceMaps","minify","bytecode","maxWorkers","skipSSG","exp","environment","process","env","NODE_ENV","setNodeEnv","require","load","projectConfig","getConfig","getPublicExpoManifestAsync","skipValidation","length","includes","WebSupportProjectPrerequisite","assertAsync","useServerRendering","web","output","CommandError","baseUrl","getBaseUrlFromExpoConfig","Log","warn","log","chalk","gray","startsWith","yellow","mode","publicPath","path","resolve","EXPO_PUBLIC_FOLDER","outputPath","files","Map","devServerManager","DevServerManager","startMetroAsync","port","isExporting","location","resetDevServer","devServer","getDefaultDevServer","assert","MetroBundlerDevServer","bundles","domComponentAssetsMetadata","spaPlatforms","isReactServerComponentsEnabled","filter","platform","copyPublicFolderAsync","join","error","templateHtml","Promise","all","map","isHermes","isEnableHermesManaged","assertEngineMismatchAsync","bundle","nativeExportBundleAsync","splitChunks","EXPO_NO_BUNDLE_SPLITTING","mainModuleName","getEntryWithServerRoot","pkg","engine","undefined","serializerIncludeMaps","reactCompiler","experiments","getFilesFromSerialAssets","artifacts","includeSourceMaps","isServerHosted","expoDomComponentReferences","artifact","Array","isArray","metadata","flat","filePath","platformDomComponentsBundle","htmlOutputName","exportDomComponentAsync","useMd5Filename","assets","push","transformNativeBundleForMd5Filename","domComponentReference","nativeBundle","addDomBundleToMetadataAsync","transformDomEntryForMd5Filename","html","serializeHtmlWithAssets","resources","template","createTemplateHtmlFromExpoConfigAsync","scripts","cssLinks","modifyHtml","getVirtualFaviconAssetsAsync","set","contents","targetDomain","isWeb","exportApiRoutesStandaloneAsync","apiRoutesOnly","embeddedHashSet","exportAssetsAsync","JSON","stringify","createAssetMap","fileNames","Object","fromEntries","entries","asset","type","filename","createMetadataJson","exportServer","placeholderIndex","fs","existsSync","exportFromServerAsync","routerRoot","getRouterDirectoryModuleIdWithManifest","stopAsync","persistMetroFilesAsync"],"mappings":";;;;+BAyCsBA;;;eAAAA;;;;yBAzCI;;;;;;;gEAEP;;;;;;;gEACD;;;;;;;gEACH;;;;;;;gEACE;;;;;;oCAEyC;8BACxB;qCAM3B;8BAC0D;mCACK;yBACzB;uCACF;8BACL;4BAO/B;+BACwB;6DACV;+CACyB;kCACb;uCACK;wBACiB;+BACf;oCACD;8BACE;6BACa;qBAClC;wBACS;yBACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEpB,eAAeA,eACpBC,WAAmB,EACnB,EACEC,SAAS,EACTC,SAAS,EACTC,KAAK,EACLC,GAAG,EACHC,YAAY,EACZC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRC,UAAU,EACVC,OAAO,EAaR;QAmBwDC,UAE1CA;IAnBf,sEAAsE;IACtE,MAAMC,cAAcR,MAAM,gBAAgB;IAC1CS,QAAQC,GAAG,CAACC,QAAQ,GAAGH;IACvBI,IAAAA,mBAAU,EAACJ;IAEXK,QAAQ,aAAaC,IAAI,CAAClB;IAE1B,MAAMmB,gBAAgBC,IAAAA,mBAAS,EAACpB;IAChC,MAAMW,MAAM,MAAMU,IAAAA,iDAA0B,EAACrB,aAAa;QACxD,kCAAkC;QAClCsB,gBAAgBrB,UAAUsB,MAAM,KAAK,KAAKtB,SAAS,CAAC,EAAE,KAAK;IAC7D;IAEA,IAAIA,UAAUuB,QAAQ,CAAC,QAAQ;QAC7B,MAAM,IAAIC,4DAA6B,CAACzB,aAAa0B,WAAW;IAClE;IAEA,MAAMC,qBAAqB;QAAC;QAAU;KAAS,CAACH,QAAQ,CAACb,EAAAA,WAAAA,IAAIiB,GAAG,qBAAPjB,SAASkB,MAAM,KAAI;IAE5E,IAAInB,WAAWC,EAAAA,YAAAA,IAAIiB,GAAG,qBAAPjB,UAASkB,MAAM,MAAK,UAAU;QAC3C,MAAM,IAAIC,oBAAY,CAAC;IACzB;IAEA,MAAMC,UAAUC,IAAAA,sCAAwB,EAACrB;IAEzC,IAAI,CAACH,YAAaP,CAAAA,UAAUuB,QAAQ,CAAC,UAAUvB,UAAUuB,QAAQ,CAAC,UAAS,GAAI;QAC7ES,KAAIC,IAAI,CACN,CAAC,+HAA+H,CAAC;IAErI;IAEA,iBAAiB;IACjB,IAAIH,SAAS;QACXE,KAAIE,GAAG;QACPF,KAAIE,GAAG,CAACC,gBAAK,CAACC,IAAI,CAAC,gCAAgC,EAAEN,QAAQ,CAAC;QAC9D,sCAAsC;QACtC,IAAI,CAACA,QAAQO,UAAU,CAAC,MAAM;YAC5BL,KAAIE,GAAG,CACLC,gBAAK,CAACG,MAAM,CAAC,uEAAuE,CAAC;QAEzF;IACF;IAEA,MAAMC,OAAOpC,MAAM,gBAAgB;IACnC,MAAMqC,aAAaC,eAAI,CAACC,OAAO,CAAC3C,aAAac,QAAG,CAAC8B,kBAAkB;IACnE,MAAMC,aAAaH,eAAI,CAACC,OAAO,CAAC3C,aAAaE;IAE7C,oHAAoH;IAEpH,MAAM4C,QAAwB,IAAIC;IAElC,MAAMC,mBAAmB,MAAMC,kCAAgB,CAACC,eAAe,CAAClD,aAAa;QAC3EO;QACAiC;QACAW,MAAM;QACNC,aAAa;QACbC,UAAU,CAAC;QACXC,gBAAgBnD;QAChBM;IACF;IAEA,MAAM8C,YAAYP,iBAAiBQ,mBAAmB;IACtDC,IAAAA,iBAAM,EAACF,qBAAqBG,4CAAqB;IAEjD,MAAMC,UAAmD,CAAC;IAC1D,MAAMC,6BAAoF,CAAC;IAE3F,MAAMC,eACJ,0EAA0E;IAC1ElC,sBAAsB,CAAC4B,UAAUO,8BAA8B,GAC3D7D,UAAU8D,MAAM,CAAC,CAACC,WAAaA,aAAa,SAC5C/D;IAEN,IAAI;QACF,IAAIsD,UAAUO,8BAA8B,EAAE;YAC5C,2DAA2D;YAC3D,qDAAqD;YACrD,IAAI;gBACF,MAAMG,IAAAA,mCAAqB,EAACxB,YAAYC,eAAI,CAACwB,IAAI,CAACrB,YAAY;YAChE,EAAE,OAAOsB,OAAO;gBACdlC,KAAIkC,KAAK,CAAC;gBACV,MAAMA;YACR;QACF,OAAO;YACL,yFAAyF;YACzF,sFAAsF;YACtF,MAAMF,IAAAA,mCAAqB,EAACxB,YAAYI;QAC1C;QAEA,IAAIuB;QACJ,oCAAoC;QACpC,IAAIP,aAAatC,MAAM,EAAE;YACvB,MAAM8C,QAAQC,GAAG,CACfT,aAAaU,GAAG,CAAC,OAAOP;oBAuBDrD;gBAtBrB,4FAA4F;gBAC5F,6BAA6B;gBAC7B,MAAM6D,WAAWC,IAAAA,mCAAqB,EAAC9D,KAAKqD;gBAC5C,IAAIQ,UAAU;oBACZ,MAAME,IAAAA,uCAAyB,EAAC1E,aAAaW,KAAKqD;gBACpD;gBAEA,2DAA2D;gBAC3D,MAAMW,SAAS,MAAMpB,UAAUqB,uBAAuB,CACpD;oBACEZ;oBACAa,aACE,CAAC/D,QAAG,CAACgE,wBAAwB,IAC5B,CAAA,AAACvB,UAAUO,8BAA8B,IAAI,CAACtD,YAAawD,aAAa,KAAI;oBAC/Ee,gBAAgBC,IAAAA,0CAAsB,EAAChF,aAAa;wBAClDgE;wBACAiB,KAAK9D,cAAc8D,GAAG;oBACxB;oBACAzC,MAAMpC,MAAM,gBAAgB;oBAC5B8E,QAAQV,WAAW,WAAWW;oBAC9BC,uBAAuB9E;oBACvBE,UAAUA,YAAYgE;oBACtBa,eAAe,CAAC,GAAC1E,mBAAAA,IAAI2E,WAAW,qBAAf3E,iBAAiB0E,aAAa;gBACjD,GACAvC;gBAGFa,OAAO,CAACK,SAAS,GAAGW;gBAEpBY,IAAAA,oCAAwB,EAACZ,OAAOa,SAAS,EAAE;oBACzCC,mBAAmBnF;oBACnBwC;oBACA4C,gBAAgBnC,UAAUO,8BAA8B;gBAC1D;gBAEA,6BAA6B;gBAC7B,MAAM6B,6BAA6BhB,OAAOa,SAAS,CAChDjB,GAAG,CAAC,CAACqB,WACJC,MAAMC,OAAO,CAACF,SAASG,QAAQ,CAACJ,0BAA0B,IACtDC,SAASG,QAAQ,CAACJ,0BAA0B,GAC5C,EAAE,EAEPK,IAAI;gBACP,MAAM3B,QAAQC,GAAG,CACf,uIAAuI;gBACvIqB,2BAA2BpB,GAAG,CAAC,OAAO0B;oBACpC,MAAM,EAAEtB,QAAQuB,2BAA2B,EAAEC,cAAc,EAAE,GAC3D,MAAMC,IAAAA,4CAAuB,EAAC;wBAC5BH;wBACAjG;wBACAI;wBACAmD;wBACAiB;wBACAiB,mBAAmBnF;wBACnBK;wBACAmC;wBACAuD,gBAAgB;oBAClB;oBAEF,kEAAkE;oBAClE,kCAAkC;oBAClC1B,OAAO2B,MAAM,CAACC,IAAI,IAAIL,4BAA4BI,MAAM;oBAExDE,IAAAA,wDAAmC,EAAC;wBAClCC,uBAAuBR;wBACvBS,cAAc/B;wBACd7B;wBACAqD;oBACF;oBACAvC,0BAA0B,CAACI,SAAS,GAAG;2BACjC,MAAM2C,IAAAA,gDAA2B,EAACT;2BACnCU,IAAAA,oDAA+B,EAAC;4BACjC9D;4BACAqD;wBACF;qBACD;gBACH;gBAGF,IAAInC,aAAa,OAAO;oBACtB,qCAAqC;oBACrC,sCAAsC;oBACtC,IAAI6C,OAAO,MAAMC,IAAAA,sCAAuB,EAAC;wBACvC1D,aAAa;wBACb2D,WAAWpC,OAAOa,SAAS;wBAC3BwB,UAAU,MAAMC,IAAAA,kDAAqC,EAACjH,aAAa;4BACjEkH,SAAS,EAAE;4BACXC,UAAU,EAAE;4BACZxG,KAAKQ,cAAcR,GAAG;wBACxB;wBACAoB;oBACF;oBAEA,sCAAsC;oBACtC,MAAMqF,aAAa,MAAMC,IAAAA,qCAA4B,EAACrH,aAAa;wBACjEE;wBACA6B;wBACAe;wBACAnC,KAAKQ,cAAcR,GAAG;oBACxB;oBACA,IAAIyG,YAAY;wBACdP,OAAOO,WAAWP;oBACpB;oBAEA,sEAAsE;oBACtEzC,eAAeyC;oBAEf,iCAAiC;oBACjC,oDAAoD;oBACpD/D,MAAMwE,GAAG,CAAC,cAAc;wBACtBC,UAAUV;wBACVW,cAAcjE,UAAUO,8BAA8B,GAAG,WAAW;oBACtE;gBACF;YACF;YAGF,IAAIP,UAAUO,8BAA8B,EAAE;gBAC5C,MAAM2D,QAAQxH,UAAUuB,QAAQ,CAAC;gBAEjC,MAAMkG,IAAAA,iDAA8B,EAACnE,WAAW;oBAC9CT;oBACAkB,UAAU;oBACV2D,eAAe,CAACF;oBAChBrD;gBACF;YACF;YAEA,sDAAsD;YACtD,MAAM,EAAEkC,MAAM,EAAEsB,eAAe,EAAE,GAAG,MAAMC,IAAAA,+BAAiB,EAAC7H,aAAa;gBACvE8C;gBACAnC;gBACAT,WAAW2C;gBACXc;gBACA5B;YACF;YAEA,IAAI1B,cAAc;gBAChB4B,KAAIE,GAAG,CAAC;gBACRW,MAAMwE,GAAG,CAAC,iBAAiB;oBAAEC,UAAUO,KAAKC,SAAS,CAACC,IAAAA,6BAAc,EAAC;wBAAE1B;oBAAO;gBAAI;YACpF;YAEA,MAAMkB,eAAejE,UAAUO,8BAA8B,GAAG,YAAY;YAC5E,MAAMmE,YAAYC,OAAOC,WAAW,CAClCD,OAAOE,OAAO,CAACzE,SAASY,GAAG,CAAC,CAAC,CAACP,UAAUW,OAAO,GAAK;oBAClDX;oBACAW,OAAOa,SAAS,CACbzB,MAAM,CAAC,CAACsE,QAAUA,MAAMC,IAAI,KAAK,MACjC/D,GAAG,CAAC,CAAC8D,QAAUb,eAAea,MAAME,QAAQ;iBAChD;YAGH,6CAA6C;YAC7C,MAAMhB,WAAWiB,IAAAA,sCAAkB,EAAC;gBAClC7E;gBACAsE;gBACAL;gBACAhE;YACF;YACAd,MAAMwE,GAAG,CAAC,iBAAiB;gBAAEC,UAAUO,KAAKC,SAAS,CAACR;YAAU;QAClE;QAEA,+BAA+B;QAE/B,IAAItH,UAAUuB,QAAQ,CAAC,UAAUG,oBAAoB;gBAC9BhB;YAArB,MAAM8H,eAAe9H,EAAAA,YAAAA,IAAIiB,GAAG,qBAAPjB,UAASkB,MAAM,MAAK;YAEzC,IAAI4G,cAAc;gBAChB,0DAA0D;gBAC1D,MAAMxE,IAAAA,mCAAqB,EAACxB,YAAYC,eAAI,CAACC,OAAO,CAACE,YAAY;YACnE;YAEA,IAAInC,SAAS;gBACXuB,KAAIE,GAAG,CAAC;gBACR,MAAMuF,IAAAA,iDAA8B,EAACnE,WAAW;oBAC9CT;oBACAkB,UAAU;oBACV2D,eAAe;gBACjB;gBAEA,gFAAgF;gBAChF,sEAAsE;gBACtE,MAAMe,mBAAmBhG,eAAI,CAACC,OAAO,CAACE,YAAY;gBAClD,IAAI,CAAC8F,aAAE,CAACC,UAAU,CAACF,mBAAmB;oBACpC5F,MAAMwE,GAAG,CAAC,cAAc;wBACtBC,UAAU,CAAC,0BAA0B,CAAC;wBACtCC,cAAc;oBAChB;gBACF;YACF,OAAO,IACL,wCAAwC;YACxC,CAACjE,UAAUO,8BAA8B,EACzC;oBAUmBnD;gBATnB,MAAMkI,IAAAA,wCAAqB,EAAC7I,aAAauD,WAAW;oBAClDf;oBACAM;oBACA3C,OAAO,CAAC,CAACA;oBACTD,WAAW2C;oBACXtC;oBACAwB;oBACA0D,mBAAmBnF;oBACnBwI,YAAYC,IAAAA,8CAAsC,EAAC/I,aAAaW;oBAChE0E,eAAe,CAAC,GAAC1E,mBAAAA,IAAI2E,WAAW,qBAAf3E,iBAAiB0E,aAAa;oBAC/CoD;oBACAhI;oBACA2C,aAAa;oBACbzC,KAAKQ,cAAcR,GAAG;gBACxB;YACF;QACF;IACF,SAAU;QACR,MAAMqC,iBAAiBgG,SAAS;IAClC;IAEA,kDAAkD;IAClD,MAAMC,IAAAA,kCAAsB,EAACnG,OAAOD;AACtC"}
1
+ {"version":3,"sources":["../../../src/export/exportApp.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport type { Platform } from '@expo/config';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { type PlatformMetadata, createMetadataJson } from './createMetadataJson';\nimport { exportAssetsAsync } from './exportAssets';\nimport {\n addDomBundleToMetadataAsync,\n exportDomComponentAsync,\n transformNativeBundleForMd5Filename,\n transformDomEntryForMd5Filename,\n} from './exportDomComponents';\nimport { assertEngineMismatchAsync, isEnableHermesManaged } from './exportHermes';\nimport { exportApiRoutesStandaloneAsync, exportFromServerAsync } from './exportStaticAsync';\nimport { getVirtualFaviconAssetsAsync } from './favicon';\nimport { getPublicExpoManifestAsync } from './getPublicExpoManifest';\nimport { copyPublicFolderAsync } from './publicFolder';\nimport { Options } from './resolveOptions';\nimport {\n ExportAssetMap,\n BundleOutput,\n getFilesFromSerialAssets,\n persistMetroFilesAsync,\n} from './saveAssets';\nimport { createAssetMap } from './writeContents';\nimport * as Log from '../log';\nimport { WebSupportProjectPrerequisite } from '../start/doctor/web/WebSupportProjectPrerequisite';\nimport { DevServerManager } from '../start/server/DevServerManager';\nimport { MetroBundlerDevServer } from '../start/server/metro/MetroBundlerDevServer';\nimport { getRouterDirectoryModuleIdWithManifest } from '../start/server/metro/router';\nimport { serializeHtmlWithAssets } from '../start/server/metro/serializeHtml';\nimport { getEntryWithServerRoot } from '../start/server/middleware/ManifestMiddleware';\nimport { getBaseUrlFromExpoConfig } from '../start/server/middleware/metroOptions';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../start/server/webTemplate';\nimport { env } from '../utils/env';\nimport { CommandError } from '../utils/errors';\nimport { setNodeEnv } from '../utils/nodeEnv';\n\nexport async function exportAppAsync(\n projectRoot: string,\n {\n platforms,\n outputDir,\n clear,\n dev,\n dumpAssetmap,\n sourceMaps,\n minify,\n bytecode,\n maxWorkers,\n skipSSG,\n }: Pick<\n Options,\n | 'dumpAssetmap'\n | 'sourceMaps'\n | 'dev'\n | 'clear'\n | 'outputDir'\n | 'platforms'\n | 'minify'\n | 'bytecode'\n | 'maxWorkers'\n | 'skipSSG'\n >\n): Promise<void> {\n // Force the environment during export and do not allow overriding it.\n const environment = dev ? 'development' : 'production';\n process.env.NODE_ENV = environment;\n setNodeEnv(environment);\n\n require('@expo/env').load(projectRoot);\n\n const projectConfig = getConfig(projectRoot);\n const exp = await getPublicExpoManifestAsync(projectRoot, {\n // Web doesn't require validation.\n skipValidation: platforms.length === 1 && platforms[0] === 'web',\n });\n\n if (platforms.includes('web')) {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n }\n\n const useServerRendering = ['static', 'server'].includes(exp.web?.output ?? '');\n\n if (skipSSG && exp.web?.output !== 'server') {\n throw new CommandError('--no-ssg can only be used with `web.output: server`');\n }\n\n const baseUrl = getBaseUrlFromExpoConfig(exp);\n\n if (!bytecode && (platforms.includes('ios') || platforms.includes('android'))) {\n Log.warn(\n `Bytecode makes the app startup faster, disabling bytecode is highly discouraged and should only be used for debugging purposes.`\n );\n }\n\n // Print out logs\n if (baseUrl) {\n Log.log();\n Log.log(chalk.gray`Using (experimental) base path: ${baseUrl}`);\n // Warn if not using an absolute path.\n if (!baseUrl.startsWith('/')) {\n Log.log(\n chalk.yellow` Base path does not start with a slash. Requests will not be absolute.`\n );\n }\n }\n\n const mode = dev ? 'development' : 'production';\n const publicPath = path.resolve(projectRoot, env.EXPO_PUBLIC_FOLDER);\n const outputPath = path.resolve(projectRoot, outputDir);\n\n // Write the JS bundles to disk, and get the bundle file names (this could change with async chunk loading support).\n\n const files: ExportAssetMap = new Map();\n\n const devServerManager = await DevServerManager.startMetroAsync(projectRoot, {\n minify,\n mode,\n port: 8081,\n isExporting: true,\n location: {},\n resetDevServer: clear,\n maxWorkers,\n });\n\n const devServer = devServerManager.getDefaultDevServer();\n assert(devServer instanceof MetroBundlerDevServer);\n\n const bundles: Partial<Record<Platform, BundleOutput>> = {};\n const domComponentAssetsMetadata: Partial<Record<Platform, PlatformMetadata['assets']>> = {};\n\n const spaPlatforms =\n // TODO: Support server and static rendering for server component exports.\n useServerRendering && !devServer.isReactServerComponentsEnabled\n ? platforms.filter((platform) => platform !== 'web')\n : platforms;\n\n try {\n if (devServer.isReactServerComponentsEnabled) {\n // In RSC mode, we only need these to be in the client dir.\n // TODO: Merge back with other copy after we add SSR.\n try {\n await copyPublicFolderAsync(publicPath, path.join(outputPath, 'client'));\n } catch (error) {\n Log.error('Failed to copy public directory to dist directory');\n throw error;\n }\n } else {\n // NOTE(kitten): The public folder is currently always copied, regardless of targetDomain\n // split. Hence, there's another separate `copyPublicFolderAsync` call below for `web`\n await copyPublicFolderAsync(publicPath, outputPath);\n }\n\n let templateHtml: string | undefined;\n // Can be empty during web-only SSG.\n if (spaPlatforms.length) {\n await Promise.all(\n spaPlatforms.map(async (platform) => {\n // Assert early so the user doesn't have to wait until bundling is complete to find out that\n // Hermes won't be available.\n const isHermes = isEnableHermesManaged(exp, platform);\n if (isHermes) {\n await assertEngineMismatchAsync(projectRoot, exp, platform);\n }\n\n // Run metro bundler and create the JS bundles/source maps.\n const bundle = await devServer.nativeExportBundleAsync(\n exp,\n {\n platform,\n splitChunks:\n !env.EXPO_NO_BUNDLE_SPLITTING &&\n ((devServer.isReactServerComponentsEnabled && !bytecode) || platform === 'web'),\n mainModuleName: getEntryWithServerRoot(projectRoot, {\n platform,\n pkg: projectConfig.pkg,\n }),\n mode: dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n serializerIncludeMaps: sourceMaps,\n bytecode: bytecode && isHermes,\n reactCompiler: !!exp.experiments?.reactCompiler,\n },\n files\n );\n\n bundles[platform] = bundle;\n\n getFilesFromSerialAssets(bundle.artifacts, {\n includeSourceMaps: sourceMaps,\n files,\n isServerHosted: devServer.isReactServerComponentsEnabled,\n });\n\n // TODO: Remove duplicates...\n const expoDomComponentReferences = bundle.artifacts\n .map((artifact) =>\n Array.isArray(artifact.metadata.expoDomComponentReferences)\n ? artifact.metadata.expoDomComponentReferences\n : []\n )\n .flat();\n await Promise.all(\n // TODO: Make a version of this which uses `this.metro.getBundler().buildGraphForEntries([])` to bundle all the DOM components at once.\n expoDomComponentReferences.map(async (filePath) => {\n const { bundle: platformDomComponentsBundle, htmlOutputName } =\n await exportDomComponentAsync({\n filePath,\n projectRoot,\n dev,\n devServer,\n isHermes,\n includeSourceMaps: sourceMaps,\n exp,\n files,\n useMd5Filename: true,\n });\n\n // Merge the assets from the DOM component into the output assets.\n // @ts-expect-error: mutate assets\n bundle.assets.push(...platformDomComponentsBundle.assets);\n\n transformNativeBundleForMd5Filename({\n domComponentReference: filePath,\n nativeBundle: bundle,\n files,\n htmlOutputName,\n });\n domComponentAssetsMetadata[platform] = [\n ...(await addDomBundleToMetadataAsync(platformDomComponentsBundle)),\n ...transformDomEntryForMd5Filename({\n files,\n htmlOutputName,\n }),\n ];\n })\n );\n\n if (platform === 'web') {\n // TODO: Unify with exportStaticAsync\n // TODO: Maybe move to the serializer.\n let html = await serializeHtmlWithAssets({\n isExporting: true,\n resources: bundle.artifacts,\n template: await createTemplateHtmlFromExpoConfigAsync(projectRoot, {\n scripts: [],\n cssLinks: [],\n exp: projectConfig.exp,\n }),\n baseUrl,\n });\n\n // Add the favicon assets to the HTML.\n const modifyHtml = await getVirtualFaviconAssetsAsync(projectRoot, {\n outputDir,\n baseUrl,\n files,\n exp: projectConfig.exp,\n });\n if (modifyHtml) {\n html = modifyHtml(html);\n }\n\n // HACK: This is used for adding SSR shims in React Server Components.\n templateHtml = html;\n\n // Generate SPA-styled HTML file.\n // If web exists, then write the template HTML file.\n files.set('index.html', {\n contents: html,\n targetDomain: devServer.isReactServerComponentsEnabled ? 'server' : 'client',\n });\n }\n })\n );\n\n if (devServer.isReactServerComponentsEnabled) {\n const isWeb = platforms.includes('web');\n\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: !isWeb,\n templateHtml,\n });\n }\n\n // TODO: Use same asset system across platforms again.\n const { assets, embeddedHashSet } = await exportAssetsAsync(projectRoot, {\n files,\n exp,\n outputDir: outputPath,\n bundles,\n baseUrl,\n });\n\n if (dumpAssetmap) {\n Log.log('Creating asset map');\n files.set('assetmap.json', { contents: JSON.stringify(createAssetMap({ assets })) });\n }\n\n const targetDomain = devServer.isReactServerComponentsEnabled ? 'client/' : '';\n const fileNames = Object.fromEntries(\n Object.entries(bundles).map(([platform, bundle]) => [\n platform,\n bundle.artifacts\n .filter((asset) => asset.type === 'js')\n .map((asset) => targetDomain + asset.filename),\n ])\n );\n\n // Generate a `metadata.json` for EAS Update.\n const contents = createMetadataJson({\n bundles,\n fileNames,\n embeddedHashSet,\n domComponentAssetsMetadata,\n });\n files.set('metadata.json', { contents: JSON.stringify(contents) });\n }\n\n // Additional web-only steps...\n\n if (platforms.includes('web') && useServerRendering) {\n const exportServer = exp.web?.output === 'server';\n\n if (exportServer) {\n // TODO: Remove when this is abstracted into the files map\n await copyPublicFolderAsync(publicPath, path.resolve(outputPath, 'client'));\n }\n\n if (skipSSG) {\n Log.log('Skipping static site generation');\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: true,\n });\n\n // Output a placeholder index.html if one doesn't exist in the public directory.\n // This ensures native + API routes have some content at the root URL.\n const placeholderIndex = path.resolve(outputPath, 'client/index.html');\n if (!fs.existsSync(placeholderIndex)) {\n files.set('index.html', {\n contents: `<html><body></body></html>`,\n targetDomain: 'client',\n });\n }\n } else if (\n // TODO: Support static export with RSC.\n !devServer.isReactServerComponentsEnabled\n ) {\n await exportFromServerAsync(projectRoot, devServer, {\n mode,\n files,\n clear: !!clear,\n outputDir: outputPath,\n minify,\n baseUrl,\n includeSourceMaps: sourceMaps,\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n reactCompiler: !!exp.experiments?.reactCompiler,\n exportServer,\n maxWorkers,\n isExporting: true,\n exp: projectConfig.exp,\n });\n }\n }\n } finally {\n await devServerManager.stopAsync();\n }\n\n // Write all files at the end for unified logging.\n await persistMetroFilesAsync(files, outputPath);\n}\n"],"names":["exportAppAsync","projectRoot","platforms","outputDir","clear","dev","dumpAssetmap","sourceMaps","minify","bytecode","maxWorkers","skipSSG","exp","environment","process","env","NODE_ENV","setNodeEnv","require","load","projectConfig","getConfig","getPublicExpoManifestAsync","skipValidation","length","includes","WebSupportProjectPrerequisite","assertAsync","useServerRendering","web","output","CommandError","baseUrl","getBaseUrlFromExpoConfig","Log","warn","log","chalk","gray","startsWith","yellow","mode","publicPath","path","resolve","EXPO_PUBLIC_FOLDER","outputPath","files","Map","devServerManager","DevServerManager","startMetroAsync","port","isExporting","location","resetDevServer","devServer","getDefaultDevServer","assert","MetroBundlerDevServer","bundles","domComponentAssetsMetadata","spaPlatforms","isReactServerComponentsEnabled","filter","platform","copyPublicFolderAsync","join","error","templateHtml","Promise","all","map","isHermes","isEnableHermesManaged","assertEngineMismatchAsync","bundle","nativeExportBundleAsync","splitChunks","EXPO_NO_BUNDLE_SPLITTING","mainModuleName","getEntryWithServerRoot","pkg","engine","undefined","serializerIncludeMaps","reactCompiler","experiments","getFilesFromSerialAssets","artifacts","includeSourceMaps","isServerHosted","expoDomComponentReferences","artifact","Array","isArray","metadata","flat","filePath","platformDomComponentsBundle","htmlOutputName","exportDomComponentAsync","useMd5Filename","assets","push","transformNativeBundleForMd5Filename","domComponentReference","nativeBundle","addDomBundleToMetadataAsync","transformDomEntryForMd5Filename","html","serializeHtmlWithAssets","resources","template","createTemplateHtmlFromExpoConfigAsync","scripts","cssLinks","modifyHtml","getVirtualFaviconAssetsAsync","set","contents","targetDomain","isWeb","exportApiRoutesStandaloneAsync","apiRoutesOnly","embeddedHashSet","exportAssetsAsync","JSON","stringify","createAssetMap","fileNames","Object","fromEntries","entries","asset","type","filename","createMetadataJson","exportServer","placeholderIndex","fs","existsSync","exportFromServerAsync","routerRoot","getRouterDirectoryModuleIdWithManifest","stopAsync","persistMetroFilesAsync"],"mappings":"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"}
@@ -251,11 +251,12 @@ class MetroBundlerDevServer extends _BundlerDevServer.BundlerDevServer {
251
251
  };
252
252
  }
253
253
  async getExpoRouterRoutesManifestAsync({ appDir }) {
254
- var _exp_extra_router, _exp_extra;
254
+ var _exp_extra;
255
255
  // getBuiltTimeServerManifest
256
256
  const { exp } = (0, _config().getConfig)(this.projectRoot);
257
257
  const manifest = await (0, _fetchRouterManifest.fetchManifest)(this.projectRoot, {
258
- ...(_exp_extra = exp.extra) == null ? void 0 : (_exp_extra_router = _exp_extra.router) == null ? void 0 : _exp_extra_router.platformRoutes,
258
+ ...(_exp_extra = exp.extra) == null ? void 0 : _exp_extra.router,
259
+ preserveRedirectAndRewrites: true,
259
260
  asJson: true,
260
261
  appDir
261
262
  });
@@ -265,18 +266,24 @@ class MetroBundlerDevServer extends _BundlerDevServer.BundlerDevServer {
265
266
  return manifest;
266
267
  }
267
268
  async getServerManifestAsync() {
269
+ var _exp_extra, _exp_extra1;
270
+ const { exp } = (0, _config().getConfig)(this.projectRoot);
268
271
  // NOTE: This could probably be folded back into `renderStaticContent` when expo-asset and font support RSC.
269
272
  const { getBuildTimeServerManifestAsync, getManifest } = await this.ssrLoadModule('expo-router/build/static/getServerManifest.js', {
270
273
  // Only use react-server environment when the routes are using react-server rendering by default.
271
274
  environment: this.isReactServerRoutesEnabled ? 'react-server' : 'node'
272
275
  });
273
276
  return {
274
- serverManifest: await getBuildTimeServerManifestAsync(),
275
- htmlManifest: await getManifest()
277
+ serverManifest: await getBuildTimeServerManifestAsync({
278
+ ...(_exp_extra = exp.extra) == null ? void 0 : _exp_extra.router
279
+ }),
280
+ htmlManifest: await getManifest({
281
+ ...(_exp_extra1 = exp.extra) == null ? void 0 : _exp_extra1.router
282
+ })
276
283
  };
277
284
  }
278
285
  async getStaticRenderFunctionAsync() {
279
- var _exp_extra;
286
+ var _exp_extra, _exp_extra1;
280
287
  const url = this.getDevServerUrlOrAssert();
281
288
  const { getStaticContent, getManifest, getBuildTimeServerManifestAsync } = await this.ssrLoadModule('expo-router/node/render.js', {
282
289
  // This must always use the legacy rendering resolution (no `react-server`) because it leverages
@@ -285,11 +292,13 @@ class MetroBundlerDevServer extends _BundlerDevServer.BundlerDevServer {
285
292
  });
286
293
  const { exp } = (0, _config().getConfig)(this.projectRoot);
287
294
  return {
288
- serverManifest: await getBuildTimeServerManifestAsync(),
295
+ serverManifest: await getBuildTimeServerManifestAsync({
296
+ ...(_exp_extra = exp.extra) == null ? void 0 : _exp_extra.router
297
+ }),
289
298
  // Get routes from Expo Router.
290
299
  manifest: await getManifest({
291
300
  preserveApiRoutes: false,
292
- ...(_exp_extra = exp.extra) == null ? void 0 : _exp_extra.router
301
+ ...(_exp_extra1 = exp.extra) == null ? void 0 : _exp_extra1.router
293
302
  }),
294
303
  // Get route generating function
295
304
  async renderAsync (path) {
@@ -505,13 +514,14 @@ class MetroBundlerDevServer extends _BundlerDevServer.BundlerDevServer {
505
514
  map
506
515
  };
507
516
  }
508
- async nativeExportBundleAsync(options, files, extraOptions = {}) {
517
+ async nativeExportBundleAsync(exp, options, files, extraOptions = {}) {
509
518
  if (this.isReactServerComponentsEnabled) {
510
- return this.singlePageReactServerComponentExportAsync(options, files, extraOptions);
519
+ return this.singlePageReactServerComponentExportAsync(exp, options, files, extraOptions);
511
520
  }
512
521
  return this.legacySinglePageExportBundleAsync(options, extraOptions);
513
522
  }
514
- async singlePageReactServerComponentExportAsync(options, files, extraOptions = {}) {
523
+ async singlePageReactServerComponentExportAsync(exp, options, files, extraOptions = {}) {
524
+ var _exp_extra;
515
525
  const getReactServerReferences = (artifacts)=>{
516
526
  // Get the React server action boundaries from the client bundle.
517
527
  return unique(artifacts.filter((a)=>a.type === 'js').map((artifact)=>{
@@ -593,10 +603,12 @@ class MetroBundlerDevServer extends _BundlerDevServer.BundlerDevServer {
593
603
  ssrManifest.set(boundary, null);
594
604
  });
595
605
  }
606
+ const routerOptions = (_exp_extra = exp.extra) == null ? void 0 : _exp_extra.router;
596
607
  // Export the static RSC files
597
608
  await this.rscRenderer.exportRoutesAsync({
598
609
  platform: options.platform,
599
- ssrManifest
610
+ ssrManifest,
611
+ routerOptions
600
612
  }, files);
601
613
  // Save the SSR manifest so we can perform more replacements in the server renderer and with server actions.
602
614
  files.set(`_expo/rsc/${options.platform}/ssr-manifest.js`, {
@@ -661,7 +673,7 @@ class MetroBundlerDevServer extends _BundlerDevServer.BundlerDevServer {
661
673
  });
662
674
  }
663
675
  async startImplementationAsync(options) {
664
- var _exp_experiments, _exp_experiments1, _exp_experiments2, _exp_experiments3, _exp_experiments4, _exp_web, _exp_web1, _exp_experiments5, _exp_web2, _exp_extra_router, _exp_extra;
676
+ var _exp_experiments, _exp_experiments1, _exp_experiments2, _exp_experiments3, _exp_experiments4, _exp_web, _exp_web1, _exp_experiments5, _exp_extra, _exp_web2, _exp_extra_router, _exp_extra1;
665
677
  options.port = await this.resolvePortAsync(options);
666
678
  this.urlCreator = this.getUrlCreator(options);
667
679
  const config = (0, _config().getConfig)(this.projectRoot, {
@@ -684,11 +696,12 @@ class MetroBundlerDevServer extends _BundlerDevServer.BundlerDevServer {
684
696
  const reactCompiler = !!((_exp_experiments5 = exp.experiments) == null ? void 0 : _exp_experiments5.reactCompiler);
685
697
  const appDir = _path().default.join(this.projectRoot, routerRoot);
686
698
  const mode = options.mode ?? 'development';
699
+ const routerOptions = (_exp_extra = exp.extra) == null ? void 0 : _exp_extra.router;
687
700
  if (isReactServerComponentsEnabled && ((_exp_web2 = exp.web) == null ? void 0 : _exp_web2.output) === 'static') {
688
701
  throw new _errors.CommandError(`Experimental server component support does not support 'web.output: ${exp.web.output}' yet. Use 'web.output: "server"' during the experimental phase.`);
689
702
  }
690
703
  // Error early about the window.location polyfill when React Server Components are enabled.
691
- if (isReactServerComponentsEnabled && (exp == null ? void 0 : (_exp_extra = exp.extra) == null ? void 0 : (_exp_extra_router = _exp_extra.router) == null ? void 0 : _exp_extra_router.origin) === false) {
704
+ if (isReactServerComponentsEnabled && (exp == null ? void 0 : (_exp_extra1 = exp.extra) == null ? void 0 : (_exp_extra_router = _exp_extra1.router) == null ? void 0 : _exp_extra_router.origin) === false) {
692
705
  const configPath = config.dynamicConfigPath ?? config.staticConfigPath ?? '/app.json';
693
706
  const configFileName = _path().default.basename(configPath);
694
707
  throw new _errors.CommandError(`The Expo Router "origin" property in the Expo config (${configFileName}) cannot be "false" when React Server Components is enabled. Remove it from the ${configFileName} file and try again.`);
@@ -795,7 +808,8 @@ class MetroBundlerDevServer extends _BundlerDevServer.BundlerDevServer {
795
808
  ssrLoadModule: this.ssrLoadModule.bind(this),
796
809
  ssrLoadModuleArtifacts: this.metroImportAsArtifactsAsync.bind(this),
797
810
  useClientRouter: isReactServerActionsOnlyEnabled,
798
- createModuleId: metro._createModuleId.bind(metro)
811
+ createModuleId: metro._createModuleId.bind(metro),
812
+ routerOptions
799
813
  });
800
814
  this.rscRenderer = rscMiddleware;
801
815
  middleware.use(rscMiddleware.middleware);
@@ -842,7 +856,8 @@ class MetroBundlerDevServer extends _BundlerDevServer.BundlerDevServer {
842
856
  ssrLoadModule: this.ssrLoadModule.bind(this),
843
857
  ssrLoadModuleArtifacts: this.metroImportAsArtifactsAsync.bind(this),
844
858
  useClientRouter: isReactServerActionsOnlyEnabled,
845
- createModuleId: metro._createModuleId.bind(metro)
859
+ createModuleId: metro._createModuleId.bind(metro),
860
+ routerOptions
846
861
  });
847
862
  this.rscRenderer = rscMiddleware;
848
863
  }