@expo/cli 55.0.13 → 55.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bin/cli +1 -1
- package/build/src/events/index.js +1 -1
- package/build/src/export/embed/exportEmbedAsync.js +4 -1
- package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
- package/build/src/export/embed/index.js +5 -0
- package/build/src/export/embed/index.js.map +1 -1
- package/build/src/export/embed/resolveOptions.js +2 -1
- package/build/src/export/embed/resolveOptions.js.map +1 -1
- package/build/src/export/exportStaticAsync.js +3 -2
- package/build/src/export/exportStaticAsync.js.map +1 -1
- package/build/src/start/platforms/ios/devicectl.js +1 -0
- package/build/src/start/platforms/ios/devicectl.js.map +1 -1
- package/build/src/start/server/metro/dev-server/createMetroMiddleware.js +6 -4
- package/build/src/start/server/metro/dev-server/createMetroMiddleware.js.map +1 -1
- package/build/src/start/server/metro/instantiateMetro.js +5 -4
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/runServer-fork.js +1 -1
- package/build/src/start/server/metro/runServer-fork.js.map +1 -1
- package/build/src/start/server/metro/serializeHtml.js +16 -1
- package/build/src/start/server/metro/serializeHtml.js.map +1 -1
- package/build/src/start/startAsync.js +6 -1
- package/build/src/start/startAsync.js.map +1 -1
- package/build/src/utils/telemetry/clients/FetchClient.js +1 -1
- package/build/src/utils/telemetry/utils/context.js +1 -1
- package/package.json +3 -3
package/build/bin/cli
CHANGED
|
@@ -291,8 +291,11 @@ async function exportEmbedBundleAndAssetsAsync(projectRoot, options) {
|
|
|
291
291
|
sourceMapUrl,
|
|
292
292
|
unstable_transformProfile: options.unstableTransformProfile || (isHermes ? 'hermes-stable' : 'default')
|
|
293
293
|
});
|
|
294
|
+
// We optimistically build the server-side API routes code here, to ensure they're
|
|
295
|
+
// valid or to enable parallel deployment in the future (TBD). This is disabled using
|
|
296
|
+
// the explicit `--skip-server` flag.
|
|
294
297
|
const apiRoutesEnabled = devServer.isReactServerComponentsEnabled || ((_exp_web = exp.web) == null ? void 0 : _exp_web.output) === 'server';
|
|
295
|
-
if (apiRoutesEnabled) {
|
|
298
|
+
if (!options.skipServer && apiRoutesEnabled) {
|
|
296
299
|
await (0, _exportServer.exportStandaloneServerAsync)(projectRoot, devServer, {
|
|
297
300
|
exp,
|
|
298
301
|
pkg,
|
|
@@ -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 Server from '@expo/metro/metro/Server';\nimport splitBundleOptions from '@expo/metro/metro/lib/splitBundleOptions';\nimport * as output from '@expo/metro/metro/shared/output/bundle';\nimport type { BundleOptions } from '@expo/metro/metro/shared/types';\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 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 { 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, loadEnvFiles } 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\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 loadEnvFiles(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 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: Awaited<ReturnType<Server['build']>>;\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 maxWorkers: options.maxWorkers,\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 const directBundleOptions = 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 hosted: false,\n });\n\n // TODO(cedric): check if we can use the proper `bundleType=bundle` and `entryPoint=mainModuleName` properties\n const bundleRequest: BundleOptions = {\n ...Server.DEFAULT_BUNDLE_OPTIONS,\n ...directBundleOptions,\n\n // NOTE(@kitten): Cast non-optional defaults\n lazy: directBundleOptions.lazy ?? Server.DEFAULT_BUNDLE_OPTIONS.lazy,\n modulesOnly: directBundleOptions.modulesOnly ?? Server.DEFAULT_BUNDLE_OPTIONS.modulesOnly,\n runModule: directBundleOptions.runModule ?? Server.DEFAULT_BUNDLE_OPTIONS.runModule,\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 // @ts-ignore-error TODO(@kitten): Very unclear why this is here. Remove?\n bundleType: 'todo',\n });\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 isHosted: false,\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","loadEnvFiles","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","directBundleOptions","getMetroDirectBundleOptionsForExpoConfig","hosted","bundleRequest","Server","DEFAULT_BUNDLE_OPTIONS","lazy","modulesOnly","runModule","watch","onProgress","resolverOptions","transformOptions","splitBundleOptions","bundleType","dependencies","_bundler","getDependencies","shallow","_config","getMetroAssets","processModuleFilter","serializer","assetPlugins","transformer","publicPath","isHosted","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 Server from '@expo/metro/metro/Server';\nimport splitBundleOptions from '@expo/metro/metro/lib/splitBundleOptions';\nimport * as output from '@expo/metro/metro/shared/output/bundle';\nimport type { BundleOptions } from '@expo/metro/metro/shared/types';\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 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 { 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, loadEnvFiles } 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\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 loadEnvFiles(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 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: Awaited<ReturnType<Server['build']>>;\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 // We optimistically build the server-side API routes code here, to ensure they're\n // valid or to enable parallel deployment in the future (TBD). This is disabled using\n // the explicit `--skip-server` flag.\n const apiRoutesEnabled =\n devServer.isReactServerComponentsEnabled || exp.web?.output === 'server';\n if (!options.skipServer && 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 maxWorkers: options.maxWorkers,\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 const directBundleOptions = 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 hosted: false,\n });\n\n // TODO(cedric): check if we can use the proper `bundleType=bundle` and `entryPoint=mainModuleName` properties\n const bundleRequest: BundleOptions = {\n ...Server.DEFAULT_BUNDLE_OPTIONS,\n ...directBundleOptions,\n\n // NOTE(@kitten): Cast non-optional defaults\n lazy: directBundleOptions.lazy ?? Server.DEFAULT_BUNDLE_OPTIONS.lazy,\n modulesOnly: directBundleOptions.modulesOnly ?? Server.DEFAULT_BUNDLE_OPTIONS.modulesOnly,\n runModule: directBundleOptions.runModule ?? Server.DEFAULT_BUNDLE_OPTIONS.runModule,\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 // @ts-ignore-error TODO(@kitten): Very unclear why this is here. Remove?\n bundleType: 'todo',\n });\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 isHosted: false,\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","loadEnvFiles","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","skipServer","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","directBundleOptions","getMetroDirectBundleOptionsForExpoConfig","hosted","bundleRequest","Server","DEFAULT_BUNDLE_OPTIONS","lazy","modulesOnly","runModule","watch","onProgress","resolverOptions","transformOptions","splitBundleOptions","bundleType","dependencies","_bundler","getDependencies","shallow","_config","getMetroAssets","processModuleFilter","serializer","assetPlugins","transformer","publicPath","isHosted","Error"],"mappings":"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"}
|
|
@@ -85,6 +85,11 @@ const expoExportEmbed = async (argv)=>{
|
|
|
85
85
|
'--asset-catalog-dest': String,
|
|
86
86
|
'--unstable-transform-profile': String,
|
|
87
87
|
'--config': String,
|
|
88
|
+
// By default we also export a standalone server, which is mostly done
|
|
89
|
+
// during the `export:embed` native build to ensure that the server is
|
|
90
|
+
// valid, or to deploy it later (TBD). This can be skipped using this
|
|
91
|
+
// flag explicitly
|
|
92
|
+
'--skip-server': Boolean,
|
|
88
93
|
// Hack: This is added because react-native-xcode.sh script always includes this value.
|
|
89
94
|
// If supplied, we'll do nothing with the value, but at least the process won't crash.
|
|
90
95
|
// Note that we also don't show this value in the `--help` prompt since we don't want people to use it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/export/embed/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport arg from 'arg';\nimport chalk from 'chalk';\nimport path from 'path';\n\nimport { Command } from '../../../bin/cli';\nimport { assertWithOptionsArgs, printHelp } from '../../utils/args';\n\nexport const expoExportEmbed: Command = async (argv) => {\n const rawArgsMap: arg.Spec = {\n // Types\n '--entry-file': String,\n '--platform': String,\n '--transformer': String,\n '--bundle-output': String,\n '--bundle-encoding': String,\n '--max-workers': Number,\n '--sourcemap-output': String,\n '--sourcemap-sources-root': String,\n '--assets-dest': String,\n '--asset-catalog-dest': String,\n '--unstable-transform-profile': String,\n '--config': String,\n\n // Hack: This is added because react-native-xcode.sh script always includes this value.\n // If supplied, we'll do nothing with the value, but at least the process won't crash.\n // Note that we also don't show this value in the `--help` prompt since we don't want people to use it.\n '--config-cmd': String,\n\n // New flag to guess the other flags based on the environment.\n '--eager': Boolean,\n // Export the bundle as Hermes bytecode bundle\n '--bytecode': Boolean,\n\n // This is here for compatibility with the `npx react-native bundle` command.\n // devs should use `DEBUG=expo:*` instead.\n '--verbose': Boolean,\n '--help': Boolean,\n // Aliases\n '-h': '--help',\n '-v': '--verbose',\n };\n const args = assertWithOptionsArgs(rawArgsMap, {\n argv,\n permissive: true,\n });\n\n if (args['--help']) {\n printHelp(\n `(Internal) Export the JavaScript bundle during a native build script for embedding in a native binary`,\n chalk`npx expo export:embed {dim <dir>}`,\n [\n chalk`<dir> Directory of the Expo project. {dim Default: Current working directory}`,\n `--entry-file <path> Path to the root JS file, either absolute or relative to JS root`,\n `--platform <string> Either \"ios\" or \"android\" (default: \"ios\")`,\n `--transformer <string> Specify a custom transformer to be used`,\n `--dev [boolean] If false, warnings are disabled and the bundle is minified (default: true)`,\n `--minify [boolean] Allows overriding whether bundle is minified. This defaults to false if dev is true, and true if dev is false. Disabling minification can be useful for speeding up production builds for testing purposes.`,\n `--bundle-output <string> File name where to store the resulting bundle, ex. /tmp/groups.bundle`,\n `--bundle-encoding <string> Encoding the bundle should be written in (https://nodejs.org/api/buffer.html#buffer_buffer). (default: \"utf8\")`,\n `--max-workers <number> Specifies the maximum number of workers the worker-pool will spawn for transforming files. This defaults to the number of the cores available on your machine.`,\n `--sourcemap-output <string> File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map`,\n `--sourcemap-sources-root <string> Path to make sourcemap's sources entries relative to, ex. /root/dir`,\n `--sourcemap-use-absolute-path Report SourceMapURL using its full path`,\n `--assets-dest <string> Directory name where to store assets referenced in the bundle`,\n `--asset-catalog-dest <string> Directory to create an iOS Asset Catalog for images`,\n `--unstable-transform-profile <string> Experimental, transform JS for a specific JS engine. Currently supported: hermes, hermes-canary, default`,\n `--reset-cache Removes cached files`,\n `--eager Eagerly export the bundle with default options`,\n `--bytecode Export the bundle as Hermes bytecode bundle`,\n `-v, --verbose Enables debug logging`,\n\n `--config <string> Path to the CLI configuration file`,\n // This is seemingly unused.\n `--read-global-cache Try to fetch transformed JS code from the global cache, if configured.`,\n\n `-h, --help Usage info`,\n ].join('\\n')\n );\n }\n\n const [\n { exportEmbedAsync },\n { resolveOptions },\n { logCmdError },\n { resolveCustomBooleanArgsAsync },\n ] = await Promise.all([\n import('./exportEmbedAsync.js'),\n import('./resolveOptions.js'),\n import('../../utils/errors.js'),\n import('../../utils/resolveArgs.js'),\n ]);\n\n return (async () => {\n const parsed = await resolveCustomBooleanArgsAsync(argv ?? [], rawArgsMap, {\n '--eager': Boolean,\n '--bytecode': Boolean,\n '--dev': Boolean,\n '--minify': Boolean,\n '--sourcemap-use-absolute-path': Boolean,\n '--reset-cache': Boolean,\n '--read-global-cache': Boolean,\n });\n\n const projectRoot = path.resolve(parsed.projectRoot);\n return exportEmbedAsync(projectRoot, resolveOptions(projectRoot, args, parsed));\n })().catch(logCmdError);\n};\n"],"names":["expoExportEmbed","argv","rawArgsMap","String","Number","Boolean","args","assertWithOptionsArgs","permissive","printHelp","chalk","join","exportEmbedAsync","resolveOptions","logCmdError","resolveCustomBooleanArgsAsync","Promise","all","parsed","projectRoot","path","resolve","catch"],"mappings":";;;;;+BAQaA;;;eAAAA;;;;gEANK;;;;;;;gEACD;;;;;;sBAGgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE1C,MAAMA,kBAA2B,OAAOC;IAC7C,MAAMC,aAAuB;QAC3B,QAAQ;QACR,gBAAgBC;QAChB,cAAcA;QACd,iBAAiBA;QACjB,mBAAmBA;QACnB,qBAAqBA;QACrB,iBAAiBC;QACjB,sBAAsBD;QACtB,4BAA4BA;QAC5B,iBAAiBA;QACjB,wBAAwBA;QACxB,gCAAgCA;QAChC,YAAYA;QAEZ,uFAAuF;QACvF,sFAAsF;QACtF,uGAAuG;QACvG,
|
|
1
|
+
{"version":3,"sources":["../../../../src/export/embed/index.ts"],"sourcesContent":["#!/usr/bin/env node\nimport arg from 'arg';\nimport chalk from 'chalk';\nimport path from 'path';\n\nimport { Command } from '../../../bin/cli';\nimport { assertWithOptionsArgs, printHelp } from '../../utils/args';\n\nexport const expoExportEmbed: Command = async (argv) => {\n const rawArgsMap: arg.Spec = {\n // Types\n '--entry-file': String,\n '--platform': String,\n '--transformer': String,\n '--bundle-output': String,\n '--bundle-encoding': String,\n '--max-workers': Number,\n '--sourcemap-output': String,\n '--sourcemap-sources-root': String,\n '--assets-dest': String,\n '--asset-catalog-dest': String,\n '--unstable-transform-profile': String,\n '--config': String,\n\n // By default we also export a standalone server, which is mostly done\n // during the `export:embed` native build to ensure that the server is\n // valid, or to deploy it later (TBD). This can be skipped using this\n // flag explicitly\n '--skip-server': Boolean,\n\n // Hack: This is added because react-native-xcode.sh script always includes this value.\n // If supplied, we'll do nothing with the value, but at least the process won't crash.\n // Note that we also don't show this value in the `--help` prompt since we don't want people to use it.\n '--config-cmd': String,\n\n // New flag to guess the other flags based on the environment.\n '--eager': Boolean,\n // Export the bundle as Hermes bytecode bundle\n '--bytecode': Boolean,\n\n // This is here for compatibility with the `npx react-native bundle` command.\n // devs should use `DEBUG=expo:*` instead.\n '--verbose': Boolean,\n '--help': Boolean,\n // Aliases\n '-h': '--help',\n '-v': '--verbose',\n };\n const args = assertWithOptionsArgs(rawArgsMap, {\n argv,\n permissive: true,\n });\n\n if (args['--help']) {\n printHelp(\n `(Internal) Export the JavaScript bundle during a native build script for embedding in a native binary`,\n chalk`npx expo export:embed {dim <dir>}`,\n [\n chalk`<dir> Directory of the Expo project. {dim Default: Current working directory}`,\n `--entry-file <path> Path to the root JS file, either absolute or relative to JS root`,\n `--platform <string> Either \"ios\" or \"android\" (default: \"ios\")`,\n `--transformer <string> Specify a custom transformer to be used`,\n `--dev [boolean] If false, warnings are disabled and the bundle is minified (default: true)`,\n `--minify [boolean] Allows overriding whether bundle is minified. This defaults to false if dev is true, and true if dev is false. Disabling minification can be useful for speeding up production builds for testing purposes.`,\n `--bundle-output <string> File name where to store the resulting bundle, ex. /tmp/groups.bundle`,\n `--bundle-encoding <string> Encoding the bundle should be written in (https://nodejs.org/api/buffer.html#buffer_buffer). (default: \"utf8\")`,\n `--max-workers <number> Specifies the maximum number of workers the worker-pool will spawn for transforming files. This defaults to the number of the cores available on your machine.`,\n `--sourcemap-output <string> File name where to store the sourcemap file for resulting bundle, ex. /tmp/groups.map`,\n `--sourcemap-sources-root <string> Path to make sourcemap's sources entries relative to, ex. /root/dir`,\n `--sourcemap-use-absolute-path Report SourceMapURL using its full path`,\n `--assets-dest <string> Directory name where to store assets referenced in the bundle`,\n `--asset-catalog-dest <string> Directory to create an iOS Asset Catalog for images`,\n `--unstable-transform-profile <string> Experimental, transform JS for a specific JS engine. Currently supported: hermes, hermes-canary, default`,\n `--reset-cache Removes cached files`,\n `--eager Eagerly export the bundle with default options`,\n `--bytecode Export the bundle as Hermes bytecode bundle`,\n `-v, --verbose Enables debug logging`,\n\n `--config <string> Path to the CLI configuration file`,\n // This is seemingly unused.\n `--read-global-cache Try to fetch transformed JS code from the global cache, if configured.`,\n\n `-h, --help Usage info`,\n ].join('\\n')\n );\n }\n\n const [\n { exportEmbedAsync },\n { resolveOptions },\n { logCmdError },\n { resolveCustomBooleanArgsAsync },\n ] = await Promise.all([\n import('./exportEmbedAsync.js'),\n import('./resolveOptions.js'),\n import('../../utils/errors.js'),\n import('../../utils/resolveArgs.js'),\n ]);\n\n return (async () => {\n const parsed = await resolveCustomBooleanArgsAsync(argv ?? [], rawArgsMap, {\n '--eager': Boolean,\n '--bytecode': Boolean,\n '--dev': Boolean,\n '--minify': Boolean,\n '--sourcemap-use-absolute-path': Boolean,\n '--reset-cache': Boolean,\n '--read-global-cache': Boolean,\n });\n\n const projectRoot = path.resolve(parsed.projectRoot);\n return exportEmbedAsync(projectRoot, resolveOptions(projectRoot, args, parsed));\n })().catch(logCmdError);\n};\n"],"names":["expoExportEmbed","argv","rawArgsMap","String","Number","Boolean","args","assertWithOptionsArgs","permissive","printHelp","chalk","join","exportEmbedAsync","resolveOptions","logCmdError","resolveCustomBooleanArgsAsync","Promise","all","parsed","projectRoot","path","resolve","catch"],"mappings":";;;;;+BAQaA;;;eAAAA;;;;gEANK;;;;;;;gEACD;;;;;;sBAGgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE1C,MAAMA,kBAA2B,OAAOC;IAC7C,MAAMC,aAAuB;QAC3B,QAAQ;QACR,gBAAgBC;QAChB,cAAcA;QACd,iBAAiBA;QACjB,mBAAmBA;QACnB,qBAAqBA;QACrB,iBAAiBC;QACjB,sBAAsBD;QACtB,4BAA4BA;QAC5B,iBAAiBA;QACjB,wBAAwBA;QACxB,gCAAgCA;QAChC,YAAYA;QAEZ,sEAAsE;QACtE,sEAAsE;QACtE,qEAAqE;QACrE,kBAAkB;QAClB,iBAAiBE;QAEjB,uFAAuF;QACvF,sFAAsF;QACtF,uGAAuG;QACvG,gBAAgBF;QAEhB,8DAA8D;QAC9D,WAAWE;QACX,8CAA8C;QAC9C,cAAcA;QAEd,6EAA6E;QAC7E,0CAA0C;QAC1C,aAAaA;QACb,UAAUA;QACV,UAAU;QACV,MAAM;QACN,MAAM;IACR;IACA,MAAMC,OAAOC,IAAAA,2BAAqB,EAACL,YAAY;QAC7CD;QACAO,YAAY;IACd;IAEA,IAAIF,IAAI,CAAC,SAAS,EAAE;QAClBG,IAAAA,eAAS,EACP,CAAC,qGAAqG,CAAC,EACvGC,IAAAA,gBAAK,CAAA,CAAC,iCAAiC,CAAC,EACxC;YACEA,IAAAA,gBAAK,CAAA,CAAC,8GAA8G,CAAC;YACrH,CAAC,uGAAuG,CAAC;YACzG,CAAC,iFAAiF,CAAC;YACnF,CAAC,8EAA8E,CAAC;YAChF,CAAC,iHAAiH,CAAC;YACnH,CAAC,kPAAkP,CAAC;YACpP,CAAC,4GAA4G,CAAC;YAC9G,CAAC,qJAAqJ,CAAC;YACvJ,CAAC,qMAAqM,CAAC;YACvM,CAAC,4HAA4H,CAAC;YAC9H,CAAC,0GAA0G,CAAC;YAC5G,CAAC,8EAA8E,CAAC;YAChF,CAAC,oGAAoG,CAAC;YACtG,CAAC,0FAA0F,CAAC;YAC5F,CAAC,+IAA+I,CAAC;YACjJ,CAAC,2DAA2D,CAAC;YAC7D,CAAC,qFAAqF,CAAC;YACvF,CAAC,kFAAkF,CAAC;YACpF,CAAC,4DAA4D,CAAC;YAE9D,CAAC,yEAAyE,CAAC;YAC3E,4BAA4B;YAC5B,CAAC,6GAA6G,CAAC;YAE/G,CAAC,iDAAiD,CAAC;SACpD,CAACC,IAAI,CAAC;IAEX;IAEA,MAAM,CACJ,EAAEC,gBAAgB,EAAE,EACpB,EAAEC,cAAc,EAAE,EAClB,EAAEC,WAAW,EAAE,EACf,EAAEC,6BAA6B,EAAE,CAClC,GAAG,MAAMC,QAAQC,GAAG,CAAC;QACpB,mEAAA,QAAO;QACP,mEAAA,QAAO;QACP,mEAAA,QAAO;QACP,mEAAA,QAAO;KACR;IAED,OAAO,AAAC,CAAA;QACN,MAAMC,SAAS,MAAMH,8BAA8Bd,QAAQ,EAAE,EAAEC,YAAY;YACzE,WAAWG;YACX,cAAcA;YACd,SAASA;YACT,YAAYA;YACZ,iCAAiCA;YACjC,iBAAiBA;YACjB,uBAAuBA;QACzB;QAEA,MAAMc,cAAcC,eAAI,CAACC,OAAO,CAACH,OAAOC,WAAW;QACnD,OAAOP,iBAAiBO,aAAaN,eAAeM,aAAab,MAAMY;IACzE,CAAA,IAAKI,KAAK,CAACR;AACb"}
|
|
@@ -97,7 +97,8 @@ function resolveOptions(projectRoot, args, parsed) {
|
|
|
97
97
|
dev,
|
|
98
98
|
minify: parsed.args['--minify'],
|
|
99
99
|
eager: !!parsed.args['--eager'],
|
|
100
|
-
bytecode: parsed.args['--bytecode']
|
|
100
|
+
bytecode: parsed.args['--bytecode'],
|
|
101
|
+
skipServer: !!parsed.args['--skip-server']
|
|
101
102
|
};
|
|
102
103
|
if (commonOptions.eager) {
|
|
103
104
|
return resolveEagerOptionsAsync(projectRoot, commonOptions);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/export/embed/resolveOptions.ts"],"sourcesContent":["import { resolveEntryPoint } from '@expo/config/paths';\nimport type { OutputOptions } from '@expo/metro/metro/shared/types';\nimport canonicalize from '@expo/metro/metro-core/canonicalize';\nimport arg from 'arg';\nimport os from 'os';\nimport path from 'path';\n\nimport { env } from '../../utils/env';\nimport { CommandError } from '../../utils/errors';\nimport { resolveCustomBooleanArgsAsync } from '../../utils/resolveArgs';\nimport { isAndroidUsingHermes, isIosUsingHermes } from '../exportHermes';\n\nexport interface Options {\n assetsDest?: string;\n assetCatalogDest?: string;\n entryFile: string;\n resetCache: boolean;\n transformer?: string;\n minify?: boolean;\n config?: string;\n platform: string;\n dev: boolean;\n bundleOutput: string;\n bundleEncoding?: OutputOptions['bundleEncoding'];\n maxWorkers?: number;\n sourcemapOutput?: string;\n sourcemapSourcesRoot?: string;\n sourcemapUseAbsolutePath: boolean;\n verbose: boolean;\n unstableTransformProfile?: string;\n eager?: boolean;\n bytecode?: boolean;\n}\n\nfunction assertIsBoolean(val: any): asserts val is boolean {\n if (typeof val !== 'boolean') {\n throw new CommandError(`Expected boolean, got ${typeof val}`);\n }\n}\n\nfunction getBundleEncoding(encoding: string | undefined): OutputOptions['bundleEncoding'] {\n return encoding === 'utf8' || encoding === 'utf16le' || encoding === 'ascii'\n ? encoding\n : undefined;\n}\n\nexport function resolveOptions(\n projectRoot: string,\n args: arg.Result<arg.Spec>,\n parsed: Awaited<ReturnType<typeof resolveCustomBooleanArgsAsync>>\n): Options {\n const dev = parsed.args['--dev'] ?? true;\n assertIsBoolean(dev);\n\n const platform = args['--platform'];\n if (!platform) {\n throw new CommandError(`Missing required argument: --platform`);\n }\n\n const bundleOutput = args['--bundle-output'];\n\n const commonOptions = {\n entryFile: args['--entry-file'] ?? resolveEntryPoint(projectRoot, { platform }),\n assetCatalogDest: args['--asset-catalog-dest'],\n platform,\n transformer: args['--transformer'],\n // TODO: Support `--dev false`\n // dev: false,\n bundleOutput,\n bundleEncoding: getBundleEncoding(args['--bundle-encoding']) ?? 'utf8',\n maxWorkers: args['--max-workers'],\n sourcemapOutput: args['--sourcemap-output'],\n sourcemapSourcesRoot: args['--sourcemap-sources-root'],\n sourcemapUseAbsolutePath: !!parsed.args['--sourcemap-use-absolute-path'],\n assetsDest: args['--assets-dest'],\n unstableTransformProfile: args['--unstable-transform-profile'],\n resetCache: !!parsed.args['--reset-cache'],\n verbose: args['--verbose'] ?? env.EXPO_DEBUG,\n config: args['--config'] ? path.resolve(args['--config']) : undefined,\n dev,\n minify: parsed.args['--minify'] as boolean | undefined,\n eager: !!parsed.args['--eager'],\n bytecode: parsed.args['--bytecode'] as boolean | undefined,\n };\n\n if (commonOptions.eager) {\n return resolveEagerOptionsAsync(projectRoot, commonOptions);\n }\n\n // Perform extra assertions after the eager options are resolved.\n\n if (!bundleOutput) {\n throw new CommandError(`Missing required argument: --bundle-output`);\n }\n\n const minify = parsed.args['--minify'] ?? !dev;\n assertIsBoolean(minify);\n\n return { ...commonOptions, minify, bundleOutput };\n}\n\nfunction getTemporaryPath() {\n return path.join(os.tmpdir(), Math.random().toString(36).substring(2));\n}\n\n/** Best effort guess of which options will be used for the export:embed invocation that is called from the native build scripts. */\nexport function resolveEagerOptionsAsync(\n projectRoot: string,\n {\n dev,\n platform,\n assetsDest,\n bundleOutput,\n minify,\n ...options\n }: Partial<Omit<Options, 'platform' | 'dev'>> & {\n platform: string;\n dev: boolean;\n }\n): Options {\n // If the minify prop is undefined, then check if the project is using hermes.\n minify ??= !(platform === 'android'\n ? isAndroidUsingHermes(projectRoot)\n : isIosUsingHermes(projectRoot));\n\n let destination: string | undefined;\n\n if (!assetsDest) {\n destination ??= getTemporaryPath();\n assetsDest = path.join(destination, 'assets');\n }\n\n if (!bundleOutput) {\n destination ??= getTemporaryPath();\n bundleOutput =\n platform === 'ios'\n ? path.join(destination, 'main.jsbundle')\n : path.join(destination, 'index.js');\n }\n\n return {\n ...options,\n eager: options.eager ?? true,\n bundleOutput,\n assetsDest,\n entryFile: options.entryFile ?? resolveEntryPoint(projectRoot, { platform }),\n resetCache: !!options.resetCache,\n platform,\n minify,\n dev,\n bundleEncoding: 'utf8',\n sourcemapUseAbsolutePath: false,\n verbose: env.EXPO_DEBUG,\n };\n}\n\nexport function getExportEmbedOptionsKey({\n // Extract all values that won't change the Metro results.\n resetCache,\n assetsDest,\n bundleOutput,\n verbose,\n maxWorkers,\n eager,\n ...options\n}: Options) {\n // Create a sorted key for the options, removing values that won't change the Metro results.\n return JSON.stringify(options, canonicalize);\n}\n\nexport function deserializeEagerKey(key: string) {\n return JSON.parse(key) as { options: Options; key: string };\n}\n"],"names":["deserializeEagerKey","getExportEmbedOptionsKey","resolveEagerOptionsAsync","resolveOptions","assertIsBoolean","val","CommandError","getBundleEncoding","encoding","undefined","projectRoot","args","parsed","dev","platform","bundleOutput","commonOptions","entryFile","resolveEntryPoint","assetCatalogDest","transformer","bundleEncoding","maxWorkers","sourcemapOutput","sourcemapSourcesRoot","sourcemapUseAbsolutePath","assetsDest","unstableTransformProfile","resetCache","verbose","env","EXPO_DEBUG","config","path","resolve","minify","eager","bytecode","getTemporaryPath","join","os","tmpdir","Math","random","toString","substring","options","isAndroidUsingHermes","isIosUsingHermes","destination","JSON","stringify","canonicalize","key","parse"],"mappings":";;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../../../../src/export/embed/resolveOptions.ts"],"sourcesContent":["import { resolveEntryPoint } from '@expo/config/paths';\nimport type { OutputOptions } from '@expo/metro/metro/shared/types';\nimport canonicalize from '@expo/metro/metro-core/canonicalize';\nimport arg from 'arg';\nimport os from 'os';\nimport path from 'path';\n\nimport { env } from '../../utils/env';\nimport { CommandError } from '../../utils/errors';\nimport { resolveCustomBooleanArgsAsync } from '../../utils/resolveArgs';\nimport { isAndroidUsingHermes, isIosUsingHermes } from '../exportHermes';\n\nexport interface Options {\n assetsDest?: string;\n assetCatalogDest?: string;\n entryFile: string;\n resetCache: boolean;\n transformer?: string;\n minify?: boolean;\n config?: string;\n platform: string;\n dev: boolean;\n bundleOutput: string;\n bundleEncoding?: OutputOptions['bundleEncoding'];\n maxWorkers?: number;\n sourcemapOutput?: string;\n sourcemapSourcesRoot?: string;\n sourcemapUseAbsolutePath: boolean;\n verbose: boolean;\n unstableTransformProfile?: string;\n eager?: boolean;\n bytecode?: boolean;\n skipServer?: boolean;\n}\n\nfunction assertIsBoolean(val: any): asserts val is boolean {\n if (typeof val !== 'boolean') {\n throw new CommandError(`Expected boolean, got ${typeof val}`);\n }\n}\n\nfunction getBundleEncoding(encoding: string | undefined): OutputOptions['bundleEncoding'] {\n return encoding === 'utf8' || encoding === 'utf16le' || encoding === 'ascii'\n ? encoding\n : undefined;\n}\n\nexport function resolveOptions(\n projectRoot: string,\n args: arg.Result<arg.Spec>,\n parsed: Awaited<ReturnType<typeof resolveCustomBooleanArgsAsync>>\n): Options {\n const dev = parsed.args['--dev'] ?? true;\n assertIsBoolean(dev);\n\n const platform = args['--platform'];\n if (!platform) {\n throw new CommandError(`Missing required argument: --platform`);\n }\n\n const bundleOutput = args['--bundle-output'];\n\n const commonOptions = {\n entryFile: args['--entry-file'] ?? resolveEntryPoint(projectRoot, { platform }),\n assetCatalogDest: args['--asset-catalog-dest'],\n platform,\n transformer: args['--transformer'],\n // TODO: Support `--dev false`\n // dev: false,\n bundleOutput,\n bundleEncoding: getBundleEncoding(args['--bundle-encoding']) ?? 'utf8',\n maxWorkers: args['--max-workers'],\n sourcemapOutput: args['--sourcemap-output'],\n sourcemapSourcesRoot: args['--sourcemap-sources-root'],\n sourcemapUseAbsolutePath: !!parsed.args['--sourcemap-use-absolute-path'],\n assetsDest: args['--assets-dest'],\n unstableTransformProfile: args['--unstable-transform-profile'],\n resetCache: !!parsed.args['--reset-cache'],\n verbose: args['--verbose'] ?? env.EXPO_DEBUG,\n config: args['--config'] ? path.resolve(args['--config']) : undefined,\n dev,\n minify: parsed.args['--minify'] as boolean | undefined,\n eager: !!parsed.args['--eager'],\n bytecode: parsed.args['--bytecode'] as boolean | undefined,\n skipServer: !!parsed.args['--skip-server'],\n };\n\n if (commonOptions.eager) {\n return resolveEagerOptionsAsync(projectRoot, commonOptions);\n }\n\n // Perform extra assertions after the eager options are resolved.\n\n if (!bundleOutput) {\n throw new CommandError(`Missing required argument: --bundle-output`);\n }\n\n const minify = parsed.args['--minify'] ?? !dev;\n assertIsBoolean(minify);\n\n return { ...commonOptions, minify, bundleOutput };\n}\n\nfunction getTemporaryPath() {\n return path.join(os.tmpdir(), Math.random().toString(36).substring(2));\n}\n\n/** Best effort guess of which options will be used for the export:embed invocation that is called from the native build scripts. */\nexport function resolveEagerOptionsAsync(\n projectRoot: string,\n {\n dev,\n platform,\n assetsDest,\n bundleOutput,\n minify,\n ...options\n }: Partial<Omit<Options, 'platform' | 'dev'>> & {\n platform: string;\n dev: boolean;\n }\n): Options {\n // If the minify prop is undefined, then check if the project is using hermes.\n minify ??= !(platform === 'android'\n ? isAndroidUsingHermes(projectRoot)\n : isIosUsingHermes(projectRoot));\n\n let destination: string | undefined;\n\n if (!assetsDest) {\n destination ??= getTemporaryPath();\n assetsDest = path.join(destination, 'assets');\n }\n\n if (!bundleOutput) {\n destination ??= getTemporaryPath();\n bundleOutput =\n platform === 'ios'\n ? path.join(destination, 'main.jsbundle')\n : path.join(destination, 'index.js');\n }\n\n return {\n ...options,\n eager: options.eager ?? true,\n bundleOutput,\n assetsDest,\n entryFile: options.entryFile ?? resolveEntryPoint(projectRoot, { platform }),\n resetCache: !!options.resetCache,\n platform,\n minify,\n dev,\n bundleEncoding: 'utf8',\n sourcemapUseAbsolutePath: false,\n verbose: env.EXPO_DEBUG,\n };\n}\n\nexport function getExportEmbedOptionsKey({\n // Extract all values that won't change the Metro results.\n resetCache,\n assetsDest,\n bundleOutput,\n verbose,\n maxWorkers,\n eager,\n ...options\n}: Options) {\n // Create a sorted key for the options, removing values that won't change the Metro results.\n return JSON.stringify(options, canonicalize);\n}\n\nexport function deserializeEagerKey(key: string) {\n return JSON.parse(key) as { options: Options; key: string };\n}\n"],"names":["deserializeEagerKey","getExportEmbedOptionsKey","resolveEagerOptionsAsync","resolveOptions","assertIsBoolean","val","CommandError","getBundleEncoding","encoding","undefined","projectRoot","args","parsed","dev","platform","bundleOutput","commonOptions","entryFile","resolveEntryPoint","assetCatalogDest","transformer","bundleEncoding","maxWorkers","sourcemapOutput","sourcemapSourcesRoot","sourcemapUseAbsolutePath","assetsDest","unstableTransformProfile","resetCache","verbose","env","EXPO_DEBUG","config","path","resolve","minify","eager","bytecode","skipServer","getTemporaryPath","join","os","tmpdir","Math","random","toString","substring","options","isAndroidUsingHermes","isIosUsingHermes","destination","JSON","stringify","canonicalize","key","parse"],"mappings":"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"}
|
|
@@ -339,11 +339,12 @@ async function exportFromServerAsync(projectRoot, devServer, { outputDir, baseUr
|
|
|
339
339
|
}
|
|
340
340
|
const hasRouteEntryPoint = route.entryPoints.some((entryPoint)=>asyncChunk.metadata.modulePaths.includes(entryPoint));
|
|
341
341
|
if (hasRouteEntryPoint) {
|
|
342
|
-
matchedChunks.push(
|
|
342
|
+
matchedChunks.push(asyncChunk);
|
|
343
343
|
}
|
|
344
344
|
}
|
|
345
345
|
if (matchedChunks.length > 0) {
|
|
346
|
-
|
|
346
|
+
const sorted = (0, _serializeHtml.sortMatchedAssetsByEntryPoints)(matchedChunks, route.entryPoints);
|
|
347
|
+
routeAssets.set(route.contextKey, sorted.map((chunk)=>toAssetUrl(chunk.filename)));
|
|
347
348
|
}
|
|
348
349
|
}
|
|
349
350
|
// Add assets and rendering config to the routes manifest
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/export/exportStaticAsync.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 { ExpoConfig } from '@expo/config';\nimport chalk from 'chalk';\nimport { RouteNode } from 'expo-router/build/Route';\nimport { getContextKey, stripGroupSegmentsFromPath } from 'expo-router/build/matchers';\nimport { shouldLinkExternally } from 'expo-router/build/utils/url';\nimport { type RoutesManifest } from 'expo-server/private';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport { inspect } from 'util';\n\nimport { getVirtualFaviconAssetsAsync } from './favicon';\nimport { persistMetroAssetsAsync } from './persistMetroAssets';\nimport { ExportAssetMap, getFilesFromSerialAssets } from './saveAssets';\nimport { Log } from '../log';\nimport {\n ExpoRouterRuntimeManifest,\n MetroBundlerDevServer,\n} from '../start/server/metro/MetroBundlerDevServer';\nimport { logMetroErrorAsync } from '../start/server/metro/metroErrorInterface';\nimport { getApiRoutesForDirectory, getMiddlewareForDirectory } from '../start/server/metro/router';\nimport { assetsRequiresSort, serializeHtmlWithAssets } from '../start/server/metro/serializeHtml';\nimport { learnMore } from '../utils/link';\n\nconst debug = require('debug')('expo:export:generateStaticRoutes') as typeof console.log;\n\ntype ExtraScriptTag = {\n platform: string;\n src: string;\n};\n\ntype Options = {\n mode: 'production' | 'development';\n files?: ExportAssetMap;\n outputDir: string;\n minify: boolean;\n exportServer: boolean;\n baseUrl: string;\n includeSourceMaps: boolean;\n entryPoint?: string;\n clear: boolean;\n routerRoot: string;\n reactCompiler: boolean;\n maxWorkers?: number;\n isExporting: boolean;\n exp?: ExpoConfig;\n // <script type=\"type/expo\" data-platform=\"ios\" src=\"...\" />\n scriptTags?: ExtraScriptTag[];\n};\n\ntype HtmlRequestLocation = {\n /** The output file path name to use relative to the static folder. */\n filePath: string;\n /** The pathname to make requests to in order to fetch the HTML. */\n pathname: string;\n /** The runtime route node object, used to associate async modules with the static HTML. */\n route: RouteNode;\n};\n\nexport function injectScriptTags(html: string, scriptTags: ExtraScriptTag[]): string {\n const scriptTagsHtml = scriptTags\n .map((tag) =>\n tag.platform === 'web'\n ? `<script src=\"${tag.src}\"></script>`\n : `<script type=\"type/expo\" src=\"${tag.src}\" data-platform=\"${tag.platform}\"></script>`\n )\n .join('\\n');\n html = html.replace('</head>', `${scriptTagsHtml}\\n</head>`);\n return html;\n}\n\n/** Match `(page)` -> `page` */\nfunction matchGroupName(name: string): string | undefined {\n return name.match(/^\\(([^/]+?)\\)$/)?.[1];\n}\n\nexport async function getFilesToExportFromServerAsync(\n projectRoot: string,\n {\n manifest,\n serverManifest,\n renderAsync,\n // Servers can handle group routes automatically and therefore\n // don't require the build-time generation of every possible group\n // variation.\n exportServer,\n skipHtmlPrerendering,\n // name : contents\n files = new Map(),\n }: {\n manifest: ExpoRouterRuntimeManifest;\n serverManifest: RoutesManifest;\n renderAsync: (requestLocation: HtmlRequestLocation) => Promise<string>;\n exportServer?: boolean;\n /**\n * Skip HTML pre-rendering when SSR is enabled (HTML will be rendered at runtime).\n *\n * This is separate from `exportServer` because RSC mode also uses `exportServer: true`,\n * but still needs placeholder HTML files.\n */\n skipHtmlPrerendering?: boolean;\n files?: ExportAssetMap;\n }\n): Promise<ExportAssetMap> {\n if (!exportServer && serverManifest) {\n // When we're not exporting a `server` output, we provide a `_expo/.routes.json` for\n // EAS Hosting to recognize the `headers` and `redirects` configs\n const subsetServerManifest = {\n headers: serverManifest.headers,\n redirects: serverManifest.redirects,\n };\n files.set('_expo/.routes.json', {\n contents: JSON.stringify(subsetServerManifest, null, 2),\n targetDomain: 'client',\n });\n }\n\n // Skip HTML pre-rendering in SSR mode since HTML will be rendered at runtime.\n if (skipHtmlPrerendering) {\n return files;\n }\n\n await Promise.all(\n getHtmlFiles({ manifest, includeGroupVariations: !exportServer }).map(\n async ({ route, filePath, pathname }) => {\n // Rewrite routes should not be statically generated\n if (route.type === 'rewrite') {\n return;\n }\n\n try {\n const targetDomain = exportServer ? 'server' : 'client';\n files.set(filePath, { contents: '', targetDomain });\n const data = await renderAsync({ route, filePath, pathname });\n files.set(filePath, {\n contents: data,\n routeId: pathname,\n targetDomain,\n });\n } catch (e: any) {\n await logMetroErrorAsync({ error: e, projectRoot });\n throw new Error('Failed to statically export route: ' + pathname);\n }\n }\n )\n );\n\n return files;\n}\n\nfunction modifyRouteNodeInRuntimeManifest(\n manifest: ExpoRouterRuntimeManifest,\n callback: (route: RouteNode) => any\n) {\n const iterateScreens = (screens: ExpoRouterRuntimeManifest['screens']) => {\n Object.values(screens).map((value) => {\n if (typeof value !== 'string') {\n if (value._route) callback(value._route);\n iterateScreens(value.screens);\n }\n });\n };\n\n iterateScreens(manifest.screens);\n}\n\n// TODO: Do this earlier in the process.\nfunction makeRuntimeEntryPointsAbsolute(manifest: ExpoRouterRuntimeManifest, appDir: string) {\n modifyRouteNodeInRuntimeManifest(manifest, (route) => {\n if (Array.isArray(route.entryPoints)) {\n route.entryPoints = route.entryPoints.map((entryPoint) => {\n // TODO(@hassankhan): ENG-16577\n if (shouldLinkExternally(entryPoint)) {\n return entryPoint;\n }\n\n if (entryPoint.startsWith('.')) {\n return path.resolve(appDir, entryPoint);\n } else if (!path.isAbsolute(entryPoint)) {\n return resolveFrom(appDir, entryPoint);\n }\n return entryPoint;\n });\n }\n });\n}\n\n/** Perform all fs commits */\nexport async function exportFromServerAsync(\n projectRoot: string,\n devServer: MetroBundlerDevServer,\n {\n outputDir,\n baseUrl,\n exportServer,\n includeSourceMaps,\n routerRoot,\n files = new Map(),\n exp,\n scriptTags,\n }: Options\n): Promise<ExportAssetMap> {\n const useServerRendering = exp?.extra?.router?.unstable_useServerRendering ?? false;\n\n const logOutput =\n exp?.web?.output === 'server' && useServerRendering\n ? `Server rendering is enabled. ${learnMore('https://docs.expo.dev/router/web/server-rendering/')}`\n : `Static rendering is enabled. ${learnMore('https://docs.expo.dev/router/web/static-rendering/')}`;\n Log.log(logOutput);\n\n const platform = 'web';\n const isExporting = true;\n const isExportingWithSSR =\n exportServer && useServerRendering && !devServer.isReactServerComponentsEnabled;\n const appDir = path.join(projectRoot, routerRoot);\n const injectFaviconTag = await getVirtualFaviconAssetsAsync(projectRoot, {\n outputDir,\n baseUrl,\n files,\n exp,\n });\n\n const [resources, { manifest, serverManifest, renderAsync, executeLoaderAsync }] =\n await Promise.all([\n devServer.getStaticResourcesAsync({\n includeSourceMaps,\n }),\n devServer.getStaticRenderFunctionAsync(),\n ]);\n\n makeRuntimeEntryPointsAbsolute(manifest, appDir);\n\n debug('Routes:\\n', inspect(manifest, { colors: true, depth: null }));\n\n await getFilesToExportFromServerAsync(projectRoot, {\n files,\n manifest,\n serverManifest,\n exportServer,\n skipHtmlPrerendering: isExportingWithSSR,\n async renderAsync({ pathname, route }) {\n const normalizedPathname =\n pathname === '' ? '/' : pathname.startsWith('/') ? pathname : `/${pathname}`;\n\n const useServerLoaders = exp?.extra?.router?.unstable_useServerDataLoaders;\n let renderOpts;\n\n if (useServerLoaders) {\n const loaderResponse = await executeLoaderAsync(normalizedPathname, route);\n\n if (loaderResponse !== undefined) {\n const data = await loaderResponse.json();\n // Transforms a `route.contextKey` into a normalized path. For example,\n // `./nested/[id]/index.tsx` becomes `/nested/[id]/index`\n const loaderKey = getContextKey(route.contextKey);\n const fileSystemPath = `_expo/loaders${loaderKey}`;\n files.set(fileSystemPath, {\n contents: JSON.stringify(data, null, 2),\n targetDomain: 'client',\n loaderId: loaderKey,\n });\n\n renderOpts = { loader: { data, key: loaderKey } };\n }\n }\n\n const template = await renderAsync(normalizedPathname, route, renderOpts);\n let html = serializeHtmlWithAssets({\n isExporting,\n resources: resources.artifacts,\n template,\n baseUrl,\n route,\n hydrate: true,\n });\n\n if (injectFaviconTag) {\n html = injectFaviconTag(html);\n }\n\n if (scriptTags) {\n // Inject script tags into the HTML.\n // <script type=\"type/expo\" data-platform=\"ios\" src=\"...\" />\n html = injectScriptTags(html, scriptTags);\n }\n\n return html;\n },\n });\n\n getFilesFromSerialAssets(resources.artifacts, {\n platform,\n includeSourceMaps,\n files,\n isServerHosted: true,\n });\n\n if (resources.assets) {\n // TODO: Collect files without writing to disk.\n // NOTE(kitten): Re. above, this is now using `files` except for iOS catalog output, which isn't used here\n await persistMetroAssetsAsync(projectRoot, resources.assets, {\n files,\n platform,\n outputDirectory: outputDir,\n baseUrl,\n });\n }\n\n if (exportServer) {\n const apiRoutes = await exportApiRoutesAsync({\n platform: 'web',\n server: devServer,\n manifest: serverManifest,\n // NOTE(kitten): For now, we always output source maps for API route exports\n includeSourceMaps: true,\n });\n\n // Add the api routes to the files to export.\n for (const [route, contents] of apiRoutes) {\n files.set(route, contents);\n }\n\n // Export SSR render module and add SSR configuration to routes manifest\n if (isExportingWithSSR) {\n await devServer.exportExpoRouterRenderModuleAsync({\n files,\n includeSourceMaps: true,\n platform: 'web',\n });\n\n // Export loader bundles for routes that have loader exports\n const useServerLoaders = exp?.extra?.router?.unstable_useServerDataLoaders;\n if (useServerLoaders) {\n // Get `loaderReferences` from client bundle metadata to determine which routes have loaders\n const loaderReferences = resources.artifacts?.flatMap(\n (artifact) => artifact.metadata?.loaderReferences ?? []\n );\n\n await exportLoadersAsync({\n devServer,\n serverManifest,\n appDir,\n files,\n platform: 'web',\n loaderReferences,\n });\n }\n\n const toAssetUrl = (filename: string) =>\n baseUrl ? `${baseUrl}/${filename}` : `/${filename}`;\n\n const cssAssets = resources.artifacts\n .filter((asset) => asset.type === 'css')\n .map((asset) => toAssetUrl(asset.filename));\n\n const jsArtifacts = resources.artifacts.filter((asset) => asset.type === 'js');\n const orderedJsAssets = assetsRequiresSort(jsArtifacts);\n const syncJs = orderedJsAssets.filter((asset) => !asset.metadata.isAsync);\n const asyncJs = orderedJsAssets.filter((asset) => asset.metadata.isAsync);\n\n const syncJsAssets = syncJs.map((asset) => toAssetUrl(asset.filename));\n\n const htmlRoutes = getHtmlFiles({ manifest, includeGroupVariations: false });\n\n // Build per-route async chunk assignments\n const routeAssets = new Map<string, string[]>();\n for (const { route } of htmlRoutes) {\n if (!route.entryPoints || !Array.isArray(route.entryPoints)) {\n continue;\n }\n\n const matchedChunks: string[] = [];\n for (const asyncChunk of asyncJs) {\n if (!asyncChunk.metadata.modulePaths || !Array.isArray(asyncChunk.metadata.modulePaths)) {\n continue;\n }\n const hasRouteEntryPoint = route.entryPoints.some((entryPoint) =>\n (asyncChunk.metadata.modulePaths as string[]).includes(entryPoint)\n );\n if (hasRouteEntryPoint) {\n matchedChunks.push(toAssetUrl(asyncChunk.filename));\n }\n }\n\n if (matchedChunks.length > 0) {\n routeAssets.set(route.contextKey, matchedChunks);\n }\n }\n\n // Add assets and rendering config to the routes manifest\n updateExportManifestInFiles({\n files,\n callback: (manifest) => {\n manifest.assets = { css: cssAssets, js: syncJsAssets };\n manifest.rendering = {\n mode: 'ssr',\n file: '_expo/server/render.js',\n };\n\n for (const route of manifest.htmlRoutes) {\n const asyncChunks = routeAssets.get(route.file);\n if (asyncChunks) {\n route.assets = { css: [], js: asyncChunks };\n }\n }\n },\n });\n }\n } else {\n warnPossibleInvalidExportType(appDir);\n }\n\n return files;\n}\n\nexport function getHtmlFiles({\n manifest,\n includeGroupVariations,\n}: {\n manifest: ExpoRouterRuntimeManifest;\n includeGroupVariations?: boolean;\n}): HtmlRequestLocation[] {\n const htmlFiles = new Set<Omit<HtmlRequestLocation, 'pathname'>>();\n\n function traverseScreens(\n screens: ExpoRouterRuntimeManifest['screens'],\n route: RouteNode | null,\n baseUrl = ''\n ) {\n for (const [key, value] of Object.entries(screens)) {\n let leaf: string | null = null;\n if (typeof value === 'string') {\n leaf = value;\n } else if (value.screens && Object.keys(value.screens).length === 0) {\n // Ensure the trailing index is accounted for.\n if (key === value.path + '/index') {\n leaf = key;\n } else {\n leaf = value.path;\n }\n\n route = value._route ?? null;\n }\n\n if (leaf != null) {\n let filePath = baseUrl + leaf;\n\n if (leaf === '') {\n filePath =\n baseUrl === ''\n ? 'index'\n : baseUrl.endsWith('/')\n ? baseUrl + 'index'\n : baseUrl.slice(0, -1);\n } else if (\n // If the path is a collection of group segments leading to an index route, append `/index`.\n stripGroupSegmentsFromPath(filePath) === ''\n ) {\n filePath += '/index';\n }\n\n // This should never happen, the type of `string | object` originally comes from React Navigation.\n if (!route) {\n throw new Error(\n `Internal error: Route not found for \"${filePath}\" while collecting static export paths.`\n );\n }\n\n if (includeGroupVariations) {\n // TODO: Dedupe requests for alias routes.\n addOptionalGroups(filePath, route);\n } else {\n htmlFiles.add({\n filePath,\n route,\n });\n }\n } else if (typeof value === 'object' && value?.screens) {\n // The __root slot has no path.\n const newPath = value.path ? baseUrl + value.path + '/' : baseUrl;\n traverseScreens(value.screens, value._route ?? null, newPath);\n }\n }\n }\n\n function addOptionalGroups(path: string, route: RouteNode) {\n const variations = getPathVariations(path);\n for (const variation of variations) {\n htmlFiles.add({ filePath: variation, route });\n }\n }\n\n traverseScreens(manifest.screens, null);\n\n return uniqueBy(Array.from(htmlFiles), (value) => value.filePath).map((value) => {\n const parts = value.filePath.split('/');\n // Replace `:foo` with `[foo]` and `*foo` with `[...foo]`\n const partsWithGroups = parts.map((part) => {\n if (part === '*not-found') {\n return `+not-found`;\n } else if (part.startsWith(':')) {\n return `[${part.slice(1)}]`;\n } else if (part.startsWith('*')) {\n return `[...${part.slice(1)}]`;\n }\n return part;\n });\n const filePathLocation = partsWithGroups.join('/');\n const filePath = filePathLocation + '.html';\n return {\n ...value,\n filePath,\n pathname: filePathLocation.replace(/(\\/?index)?$/, ''),\n };\n });\n}\n\nfunction uniqueBy<T>(array: T[], key: (value: T) => string): T[] {\n const seen = new Set<string>();\n const result: T[] = [];\n for (const value of array) {\n const id = key(value);\n if (!seen.has(id)) {\n seen.add(id);\n result.push(value);\n }\n }\n return result;\n}\n\n// Given a route like `(foo)/bar/(baz)`, return all possible variations of the route.\n// e.g. `(foo)/bar/(baz)`, `(foo)/bar/baz`, `foo/bar/(baz)`, `foo/bar/baz`,\nexport function getPathVariations(routePath: string): string[] {\n const variations = new Set<string>();\n const segments = routePath.split('/');\n\n function generateVariations(segments: string[], current = ''): void {\n if (segments.length === 0) {\n if (current) variations.add(current);\n return;\n }\n\n const [head, ...rest] = segments;\n\n if (matchGroupName(head)) {\n const groups = head.slice(1, -1).split(',');\n\n if (groups.length > 1) {\n for (const group of groups) {\n // If there are multiple groups, recurse on each group.\n generateVariations([`(${group.trim()})`, ...rest], current);\n }\n return;\n } else {\n // Start a fork where this group is included\n generateVariations(rest, current ? `${current}/(${groups[0]})` : `(${groups[0]})`);\n // This code will continue and add paths without this group included`\n }\n } else if (current) {\n current = `${current}/${head}`;\n } else {\n current = head;\n }\n\n generateVariations(rest, current);\n }\n\n generateVariations(segments);\n\n return Array.from(variations);\n}\n\nexport async function exportApiRoutesStandaloneAsync(\n devServer: MetroBundlerDevServer,\n {\n files = new Map(),\n platform,\n apiRoutesOnly,\n templateHtml,\n }: {\n files?: ExportAssetMap;\n platform: string;\n apiRoutesOnly: boolean;\n templateHtml?: string;\n }\n) {\n const { serverManifest, htmlManifest } = await devServer.getServerManifestAsync();\n\n const apiRoutes = await exportApiRoutesAsync({\n server: devServer,\n manifest: serverManifest,\n // NOTE(kitten): For now, we always output source maps for API route exports\n includeSourceMaps: true,\n platform,\n apiRoutesOnly,\n });\n\n // Add the api routes to the files to export.\n for (const [route, contents] of apiRoutes) {\n files.set(route, contents);\n }\n\n if (templateHtml && devServer.isReactServerComponentsEnabled) {\n // TODO: Export an HTML entry for each file. This is a temporary solution until we have SSR/SSG for RSC.\n await getFilesToExportFromServerAsync(devServer.projectRoot, {\n manifest: htmlManifest,\n serverManifest,\n exportServer: true,\n files,\n renderAsync: async ({ pathname, filePath }) => {\n files.set(filePath, {\n contents: templateHtml!,\n routeId: pathname,\n targetDomain: 'server',\n });\n return templateHtml!;\n },\n });\n }\n\n return files;\n}\n\nasync function exportApiRoutesAsync({\n includeSourceMaps,\n server,\n platform,\n apiRoutesOnly,\n ...props\n}: Pick<Options, 'includeSourceMaps'> & {\n server: MetroBundlerDevServer;\n manifest: RoutesManifest<string>;\n platform: string;\n apiRoutesOnly?: boolean;\n}): Promise<ExportAssetMap> {\n const { manifest, files } = await server.exportExpoRouterApiRoutesAsync({\n outputDir: '_expo/functions',\n prerenderManifest: props.manifest,\n includeSourceMaps,\n platform,\n });\n\n // HACK: Clear out the HTML and 404 routes if we're only exporting API routes. This is used for native apps that are using API routes but haven't implemented web support yet.\n if (apiRoutesOnly) {\n manifest.htmlRoutes = [];\n manifest.notFoundRoutes = [];\n }\n\n files.set('_expo/routes.json', {\n contents: JSON.stringify(manifest, null, 2),\n targetDomain: 'server',\n });\n\n return files;\n}\n\nfunction warnPossibleInvalidExportType(appDir: string) {\n const apiRoutes = getApiRoutesForDirectory(appDir);\n if (apiRoutes.length) {\n // TODO: Allow API Routes for native-only.\n Log.warn(\n chalk.yellow`Skipping export for API routes because \\`web.output\\` is not \"server\". You may want to remove the routes: ${apiRoutes\n .map((v) => path.relative(appDir, v))\n .join(', ')}`\n );\n }\n\n const middlewareFile = getMiddlewareForDirectory(appDir);\n if (middlewareFile) {\n Log.warn(\n chalk.yellow`Skipping export for middleware because \\`web.output\\` is not \"server\". You may want to remove ${path.relative(appDir, middlewareFile)}`\n );\n }\n}\n\n/**\n * Export loader bundles for routes that have loader exports and updates routes in the manifest\n * with a `loader` property.\n */\nasync function exportLoadersAsync({\n devServer,\n serverManifest,\n appDir,\n files,\n platform,\n loaderReferences,\n}: {\n devServer: MetroBundlerDevServer;\n serverManifest: RoutesManifest<string>;\n appDir: string;\n files: ExportAssetMap;\n platform: string;\n /** File paths of modules with loader exports from client bundle metadata */\n loaderReferences: string[];\n}): Promise<void> {\n const entryPoints: { file: string; page: string }[] = [];\n\n for (const route of serverManifest.htmlRoutes) {\n // Skip generated routes\n if (route.generated) {\n continue;\n }\n\n const filePath = path.isAbsolute(route.file) ? route.file : path.join(appDir, route.file);\n\n if (loaderReferences.includes(filePath)) {\n entryPoints.push({\n file: filePath,\n page: route.page,\n });\n }\n }\n\n if (entryPoints.length === 0) {\n debug('No routes with loaders to bundle');\n return;\n }\n\n const entryPointModules = entryPoints.map((e) => e.page);\n debug('Bundling loaders for routes:', entryPointModules);\n\n await devServer.exportExpoRouterLoadersAsync({\n platform,\n entryPoints,\n files,\n outputDir: '_expo/loaders',\n includeSourceMaps: true,\n });\n\n // Update `htmlRoutes` in routes manifest for routes that have loaders\n updateExportManifestInFiles({\n files,\n callback: (manifest) => {\n const routesWithLoaders = new Set(entryPointModules);\n for (const route of manifest.htmlRoutes) {\n if (routesWithLoaders.has(route.page)) {\n route.loader = `_expo/loaders${route.page}.js`;\n }\n }\n },\n });\n\n debug('Exported loaders for routes:', entryPointModules);\n}\n\n// NOTE(@hassankhan): We should ideally persist the manifest to `files` only once instead of\n// modifying it afterwards.\nfunction updateExportManifestInFiles({\n files,\n callback,\n}: {\n files: ExportAssetMap;\n callback: (manifest: RoutesManifest<string>) => void;\n}) {\n const routesJsonEntry = files.get('_expo/routes.json');\n if (routesJsonEntry) {\n const manifest = JSON.parse(routesJsonEntry.contents as string);\n callback(manifest);\n\n files.set('_expo/routes.json', {\n ...routesJsonEntry,\n contents: JSON.stringify(manifest, null, 2),\n });\n }\n}\n"],"names":["exportApiRoutesStandaloneAsync","exportFromServerAsync","getFilesToExportFromServerAsync","getHtmlFiles","getPathVariations","injectScriptTags","debug","require","html","scriptTags","scriptTagsHtml","map","tag","platform","src","join","replace","matchGroupName","name","match","projectRoot","manifest","serverManifest","renderAsync","exportServer","skipHtmlPrerendering","files","Map","subsetServerManifest","headers","redirects","set","contents","JSON","stringify","targetDomain","Promise","all","includeGroupVariations","route","filePath","pathname","type","data","routeId","e","logMetroErrorAsync","error","Error","modifyRouteNodeInRuntimeManifest","callback","iterateScreens","screens","Object","values","value","_route","makeRuntimeEntryPointsAbsolute","appDir","Array","isArray","entryPoints","entryPoint","shouldLinkExternally","startsWith","path","resolve","isAbsolute","resolveFrom","devServer","outputDir","baseUrl","includeSourceMaps","routerRoot","exp","useServerRendering","extra","router","unstable_useServerRendering","logOutput","web","output","learnMore","Log","log","isExporting","isExportingWithSSR","isReactServerComponentsEnabled","injectFaviconTag","getVirtualFaviconAssetsAsync","resources","executeLoaderAsync","getStaticResourcesAsync","getStaticRenderFunctionAsync","inspect","colors","depth","normalizedPathname","useServerLoaders","unstable_useServerDataLoaders","renderOpts","loaderResponse","undefined","json","loaderKey","getContextKey","contextKey","fileSystemPath","loaderId","loader","key","template","serializeHtmlWithAssets","artifacts","hydrate","getFilesFromSerialAssets","isServerHosted","assets","persistMetroAssetsAsync","outputDirectory","apiRoutes","exportApiRoutesAsync","server","exportExpoRouterRenderModuleAsync","loaderReferences","flatMap","artifact","metadata","exportLoadersAsync","toAssetUrl","filename","cssAssets","filter","asset","jsArtifacts","orderedJsAssets","assetsRequiresSort","syncJs","isAsync","asyncJs","syncJsAssets","htmlRoutes","routeAssets","matchedChunks","asyncChunk","modulePaths","hasRouteEntryPoint","some","includes","push","length","updateExportManifestInFiles","css","js","rendering","mode","file","asyncChunks","get","warnPossibleInvalidExportType","htmlFiles","Set","traverseScreens","entries","leaf","keys","endsWith","slice","stripGroupSegmentsFromPath","addOptionalGroups","add","newPath","variations","variation","uniqueBy","from","parts","split","partsWithGroups","part","filePathLocation","array","seen","result","id","has","routePath","segments","generateVariations","current","head","rest","groups","group","trim","apiRoutesOnly","templateHtml","htmlManifest","getServerManifestAsync","props","exportExpoRouterApiRoutesAsync","prerenderManifest","notFoundRoutes","getApiRoutesForDirectory","warn","chalk","yellow","v","relative","middlewareFile","getMiddlewareForDirectory","generated","page","entryPointModules","exportExpoRouterLoadersAsync","routesWithLoaders","routesJsonEntry","parse"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/export/exportStaticAsync.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 { ExpoConfig } from '@expo/config';\nimport type { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport chalk from 'chalk';\nimport { RouteNode } from 'expo-router/build/Route';\nimport { getContextKey, stripGroupSegmentsFromPath } from 'expo-router/build/matchers';\nimport { shouldLinkExternally } from 'expo-router/build/utils/url';\nimport { type RoutesManifest } from 'expo-server/private';\nimport path from 'path';\nimport resolveFrom from 'resolve-from';\nimport { inspect } from 'util';\n\nimport { getVirtualFaviconAssetsAsync } from './favicon';\nimport { persistMetroAssetsAsync } from './persistMetroAssets';\nimport { ExportAssetMap, getFilesFromSerialAssets } from './saveAssets';\nimport { Log } from '../log';\nimport {\n ExpoRouterRuntimeManifest,\n MetroBundlerDevServer,\n} from '../start/server/metro/MetroBundlerDevServer';\nimport { logMetroErrorAsync } from '../start/server/metro/metroErrorInterface';\nimport { getApiRoutesForDirectory, getMiddlewareForDirectory } from '../start/server/metro/router';\nimport {\n assetsRequiresSort,\n serializeHtmlWithAssets,\n sortMatchedAssetsByEntryPoints,\n} from '../start/server/metro/serializeHtml';\nimport { learnMore } from '../utils/link';\n\nconst debug = require('debug')('expo:export:generateStaticRoutes') as typeof console.log;\n\ntype ExtraScriptTag = {\n platform: string;\n src: string;\n};\n\ntype Options = {\n mode: 'production' | 'development';\n files?: ExportAssetMap;\n outputDir: string;\n minify: boolean;\n exportServer: boolean;\n baseUrl: string;\n includeSourceMaps: boolean;\n entryPoint?: string;\n clear: boolean;\n routerRoot: string;\n reactCompiler: boolean;\n maxWorkers?: number;\n isExporting: boolean;\n exp?: ExpoConfig;\n // <script type=\"type/expo\" data-platform=\"ios\" src=\"...\" />\n scriptTags?: ExtraScriptTag[];\n};\n\ntype HtmlRequestLocation = {\n /** The output file path name to use relative to the static folder. */\n filePath: string;\n /** The pathname to make requests to in order to fetch the HTML. */\n pathname: string;\n /** The runtime route node object, used to associate async modules with the static HTML. */\n route: RouteNode;\n};\n\nexport function injectScriptTags(html: string, scriptTags: ExtraScriptTag[]): string {\n const scriptTagsHtml = scriptTags\n .map((tag) =>\n tag.platform === 'web'\n ? `<script src=\"${tag.src}\"></script>`\n : `<script type=\"type/expo\" src=\"${tag.src}\" data-platform=\"${tag.platform}\"></script>`\n )\n .join('\\n');\n html = html.replace('</head>', `${scriptTagsHtml}\\n</head>`);\n return html;\n}\n\n/** Match `(page)` -> `page` */\nfunction matchGroupName(name: string): string | undefined {\n return name.match(/^\\(([^/]+?)\\)$/)?.[1];\n}\n\nexport async function getFilesToExportFromServerAsync(\n projectRoot: string,\n {\n manifest,\n serverManifest,\n renderAsync,\n // Servers can handle group routes automatically and therefore\n // don't require the build-time generation of every possible group\n // variation.\n exportServer,\n skipHtmlPrerendering,\n // name : contents\n files = new Map(),\n }: {\n manifest: ExpoRouterRuntimeManifest;\n serverManifest: RoutesManifest;\n renderAsync: (requestLocation: HtmlRequestLocation) => Promise<string>;\n exportServer?: boolean;\n /**\n * Skip HTML pre-rendering when SSR is enabled (HTML will be rendered at runtime).\n *\n * This is separate from `exportServer` because RSC mode also uses `exportServer: true`,\n * but still needs placeholder HTML files.\n */\n skipHtmlPrerendering?: boolean;\n files?: ExportAssetMap;\n }\n): Promise<ExportAssetMap> {\n if (!exportServer && serverManifest) {\n // When we're not exporting a `server` output, we provide a `_expo/.routes.json` for\n // EAS Hosting to recognize the `headers` and `redirects` configs\n const subsetServerManifest = {\n headers: serverManifest.headers,\n redirects: serverManifest.redirects,\n };\n files.set('_expo/.routes.json', {\n contents: JSON.stringify(subsetServerManifest, null, 2),\n targetDomain: 'client',\n });\n }\n\n // Skip HTML pre-rendering in SSR mode since HTML will be rendered at runtime.\n if (skipHtmlPrerendering) {\n return files;\n }\n\n await Promise.all(\n getHtmlFiles({ manifest, includeGroupVariations: !exportServer }).map(\n async ({ route, filePath, pathname }) => {\n // Rewrite routes should not be statically generated\n if (route.type === 'rewrite') {\n return;\n }\n\n try {\n const targetDomain = exportServer ? 'server' : 'client';\n files.set(filePath, { contents: '', targetDomain });\n const data = await renderAsync({ route, filePath, pathname });\n files.set(filePath, {\n contents: data,\n routeId: pathname,\n targetDomain,\n });\n } catch (e: any) {\n await logMetroErrorAsync({ error: e, projectRoot });\n throw new Error('Failed to statically export route: ' + pathname);\n }\n }\n )\n );\n\n return files;\n}\n\nfunction modifyRouteNodeInRuntimeManifest(\n manifest: ExpoRouterRuntimeManifest,\n callback: (route: RouteNode) => any\n) {\n const iterateScreens = (screens: ExpoRouterRuntimeManifest['screens']) => {\n Object.values(screens).map((value) => {\n if (typeof value !== 'string') {\n if (value._route) callback(value._route);\n iterateScreens(value.screens);\n }\n });\n };\n\n iterateScreens(manifest.screens);\n}\n\n// TODO: Do this earlier in the process.\nfunction makeRuntimeEntryPointsAbsolute(manifest: ExpoRouterRuntimeManifest, appDir: string) {\n modifyRouteNodeInRuntimeManifest(manifest, (route) => {\n if (Array.isArray(route.entryPoints)) {\n route.entryPoints = route.entryPoints.map((entryPoint) => {\n // TODO(@hassankhan): ENG-16577\n if (shouldLinkExternally(entryPoint)) {\n return entryPoint;\n }\n\n if (entryPoint.startsWith('.')) {\n return path.resolve(appDir, entryPoint);\n } else if (!path.isAbsolute(entryPoint)) {\n return resolveFrom(appDir, entryPoint);\n }\n return entryPoint;\n });\n }\n });\n}\n\n/** Perform all fs commits */\nexport async function exportFromServerAsync(\n projectRoot: string,\n devServer: MetroBundlerDevServer,\n {\n outputDir,\n baseUrl,\n exportServer,\n includeSourceMaps,\n routerRoot,\n files = new Map(),\n exp,\n scriptTags,\n }: Options\n): Promise<ExportAssetMap> {\n const useServerRendering = exp?.extra?.router?.unstable_useServerRendering ?? false;\n\n const logOutput =\n exp?.web?.output === 'server' && useServerRendering\n ? `Server rendering is enabled. ${learnMore('https://docs.expo.dev/router/web/server-rendering/')}`\n : `Static rendering is enabled. ${learnMore('https://docs.expo.dev/router/web/static-rendering/')}`;\n Log.log(logOutput);\n\n const platform = 'web';\n const isExporting = true;\n const isExportingWithSSR =\n exportServer && useServerRendering && !devServer.isReactServerComponentsEnabled;\n const appDir = path.join(projectRoot, routerRoot);\n const injectFaviconTag = await getVirtualFaviconAssetsAsync(projectRoot, {\n outputDir,\n baseUrl,\n files,\n exp,\n });\n\n const [resources, { manifest, serverManifest, renderAsync, executeLoaderAsync }] =\n await Promise.all([\n devServer.getStaticResourcesAsync({\n includeSourceMaps,\n }),\n devServer.getStaticRenderFunctionAsync(),\n ]);\n\n makeRuntimeEntryPointsAbsolute(manifest, appDir);\n\n debug('Routes:\\n', inspect(manifest, { colors: true, depth: null }));\n\n await getFilesToExportFromServerAsync(projectRoot, {\n files,\n manifest,\n serverManifest,\n exportServer,\n skipHtmlPrerendering: isExportingWithSSR,\n async renderAsync({ pathname, route }) {\n const normalizedPathname =\n pathname === '' ? '/' : pathname.startsWith('/') ? pathname : `/${pathname}`;\n\n const useServerLoaders = exp?.extra?.router?.unstable_useServerDataLoaders;\n let renderOpts;\n\n if (useServerLoaders) {\n const loaderResponse = await executeLoaderAsync(normalizedPathname, route);\n\n if (loaderResponse !== undefined) {\n const data = await loaderResponse.json();\n // Transforms a `route.contextKey` into a normalized path. For example,\n // `./nested/[id]/index.tsx` becomes `/nested/[id]/index`\n const loaderKey = getContextKey(route.contextKey);\n const fileSystemPath = `_expo/loaders${loaderKey}`;\n files.set(fileSystemPath, {\n contents: JSON.stringify(data, null, 2),\n targetDomain: 'client',\n loaderId: loaderKey,\n });\n\n renderOpts = { loader: { data, key: loaderKey } };\n }\n }\n\n const template = await renderAsync(normalizedPathname, route, renderOpts);\n let html = serializeHtmlWithAssets({\n isExporting,\n resources: resources.artifacts,\n template,\n baseUrl,\n route,\n hydrate: true,\n });\n\n if (injectFaviconTag) {\n html = injectFaviconTag(html);\n }\n\n if (scriptTags) {\n // Inject script tags into the HTML.\n // <script type=\"type/expo\" data-platform=\"ios\" src=\"...\" />\n html = injectScriptTags(html, scriptTags);\n }\n\n return html;\n },\n });\n\n getFilesFromSerialAssets(resources.artifacts, {\n platform,\n includeSourceMaps,\n files,\n isServerHosted: true,\n });\n\n if (resources.assets) {\n // TODO: Collect files without writing to disk.\n // NOTE(kitten): Re. above, this is now using `files` except for iOS catalog output, which isn't used here\n await persistMetroAssetsAsync(projectRoot, resources.assets, {\n files,\n platform,\n outputDirectory: outputDir,\n baseUrl,\n });\n }\n\n if (exportServer) {\n const apiRoutes = await exportApiRoutesAsync({\n platform: 'web',\n server: devServer,\n manifest: serverManifest,\n // NOTE(kitten): For now, we always output source maps for API route exports\n includeSourceMaps: true,\n });\n\n // Add the api routes to the files to export.\n for (const [route, contents] of apiRoutes) {\n files.set(route, contents);\n }\n\n // Export SSR render module and add SSR configuration to routes manifest\n if (isExportingWithSSR) {\n await devServer.exportExpoRouterRenderModuleAsync({\n files,\n includeSourceMaps: true,\n platform: 'web',\n });\n\n // Export loader bundles for routes that have loader exports\n const useServerLoaders = exp?.extra?.router?.unstable_useServerDataLoaders;\n if (useServerLoaders) {\n // Get `loaderReferences` from client bundle metadata to determine which routes have loaders\n const loaderReferences = resources.artifacts?.flatMap(\n (artifact) => artifact.metadata?.loaderReferences ?? []\n );\n\n await exportLoadersAsync({\n devServer,\n serverManifest,\n appDir,\n files,\n platform: 'web',\n loaderReferences,\n });\n }\n\n const toAssetUrl = (filename: string) =>\n baseUrl ? `${baseUrl}/${filename}` : `/${filename}`;\n\n const cssAssets = resources.artifacts\n .filter((asset) => asset.type === 'css')\n .map((asset) => toAssetUrl(asset.filename));\n\n const jsArtifacts = resources.artifacts.filter((asset) => asset.type === 'js');\n const orderedJsAssets = assetsRequiresSort(jsArtifacts);\n const syncJs = orderedJsAssets.filter((asset) => !asset.metadata.isAsync);\n const asyncJs = orderedJsAssets.filter((asset) => asset.metadata.isAsync);\n\n const syncJsAssets = syncJs.map((asset) => toAssetUrl(asset.filename));\n\n const htmlRoutes = getHtmlFiles({ manifest, includeGroupVariations: false });\n\n // Build per-route async chunk assignments\n const routeAssets = new Map<string, string[]>();\n for (const { route } of htmlRoutes) {\n if (!route.entryPoints || !Array.isArray(route.entryPoints)) {\n continue;\n }\n\n const matchedChunks: SerialAsset[] = [];\n for (const asyncChunk of asyncJs) {\n if (!asyncChunk.metadata.modulePaths || !Array.isArray(asyncChunk.metadata.modulePaths)) {\n continue;\n }\n const hasRouteEntryPoint = route.entryPoints.some((entryPoint) =>\n (asyncChunk.metadata.modulePaths as string[]).includes(entryPoint)\n );\n if (hasRouteEntryPoint) {\n matchedChunks.push(asyncChunk);\n }\n }\n\n if (matchedChunks.length > 0) {\n const sorted = sortMatchedAssetsByEntryPoints(matchedChunks, route.entryPoints);\n routeAssets.set(\n route.contextKey,\n sorted.map((chunk) => toAssetUrl(chunk.filename))\n );\n }\n }\n\n // Add assets and rendering config to the routes manifest\n updateExportManifestInFiles({\n files,\n callback: (manifest) => {\n manifest.assets = { css: cssAssets, js: syncJsAssets };\n manifest.rendering = {\n mode: 'ssr',\n file: '_expo/server/render.js',\n };\n\n for (const route of manifest.htmlRoutes) {\n const asyncChunks = routeAssets.get(route.file);\n if (asyncChunks) {\n route.assets = { css: [], js: asyncChunks };\n }\n }\n },\n });\n }\n } else {\n warnPossibleInvalidExportType(appDir);\n }\n\n return files;\n}\n\nexport function getHtmlFiles({\n manifest,\n includeGroupVariations,\n}: {\n manifest: ExpoRouterRuntimeManifest;\n includeGroupVariations?: boolean;\n}): HtmlRequestLocation[] {\n const htmlFiles = new Set<Omit<HtmlRequestLocation, 'pathname'>>();\n\n function traverseScreens(\n screens: ExpoRouterRuntimeManifest['screens'],\n route: RouteNode | null,\n baseUrl = ''\n ) {\n for (const [key, value] of Object.entries(screens)) {\n let leaf: string | null = null;\n if (typeof value === 'string') {\n leaf = value;\n } else if (value.screens && Object.keys(value.screens).length === 0) {\n // Ensure the trailing index is accounted for.\n if (key === value.path + '/index') {\n leaf = key;\n } else {\n leaf = value.path;\n }\n\n route = value._route ?? null;\n }\n\n if (leaf != null) {\n let filePath = baseUrl + leaf;\n\n if (leaf === '') {\n filePath =\n baseUrl === ''\n ? 'index'\n : baseUrl.endsWith('/')\n ? baseUrl + 'index'\n : baseUrl.slice(0, -1);\n } else if (\n // If the path is a collection of group segments leading to an index route, append `/index`.\n stripGroupSegmentsFromPath(filePath) === ''\n ) {\n filePath += '/index';\n }\n\n // This should never happen, the type of `string | object` originally comes from React Navigation.\n if (!route) {\n throw new Error(\n `Internal error: Route not found for \"${filePath}\" while collecting static export paths.`\n );\n }\n\n if (includeGroupVariations) {\n // TODO: Dedupe requests for alias routes.\n addOptionalGroups(filePath, route);\n } else {\n htmlFiles.add({\n filePath,\n route,\n });\n }\n } else if (typeof value === 'object' && value?.screens) {\n // The __root slot has no path.\n const newPath = value.path ? baseUrl + value.path + '/' : baseUrl;\n traverseScreens(value.screens, value._route ?? null, newPath);\n }\n }\n }\n\n function addOptionalGroups(path: string, route: RouteNode) {\n const variations = getPathVariations(path);\n for (const variation of variations) {\n htmlFiles.add({ filePath: variation, route });\n }\n }\n\n traverseScreens(manifest.screens, null);\n\n return uniqueBy(Array.from(htmlFiles), (value) => value.filePath).map((value) => {\n const parts = value.filePath.split('/');\n // Replace `:foo` with `[foo]` and `*foo` with `[...foo]`\n const partsWithGroups = parts.map((part) => {\n if (part === '*not-found') {\n return `+not-found`;\n } else if (part.startsWith(':')) {\n return `[${part.slice(1)}]`;\n } else if (part.startsWith('*')) {\n return `[...${part.slice(1)}]`;\n }\n return part;\n });\n const filePathLocation = partsWithGroups.join('/');\n const filePath = filePathLocation + '.html';\n return {\n ...value,\n filePath,\n pathname: filePathLocation.replace(/(\\/?index)?$/, ''),\n };\n });\n}\n\nfunction uniqueBy<T>(array: T[], key: (value: T) => string): T[] {\n const seen = new Set<string>();\n const result: T[] = [];\n for (const value of array) {\n const id = key(value);\n if (!seen.has(id)) {\n seen.add(id);\n result.push(value);\n }\n }\n return result;\n}\n\n// Given a route like `(foo)/bar/(baz)`, return all possible variations of the route.\n// e.g. `(foo)/bar/(baz)`, `(foo)/bar/baz`, `foo/bar/(baz)`, `foo/bar/baz`,\nexport function getPathVariations(routePath: string): string[] {\n const variations = new Set<string>();\n const segments = routePath.split('/');\n\n function generateVariations(segments: string[], current = ''): void {\n if (segments.length === 0) {\n if (current) variations.add(current);\n return;\n }\n\n const [head, ...rest] = segments;\n\n if (matchGroupName(head)) {\n const groups = head.slice(1, -1).split(',');\n\n if (groups.length > 1) {\n for (const group of groups) {\n // If there are multiple groups, recurse on each group.\n generateVariations([`(${group.trim()})`, ...rest], current);\n }\n return;\n } else {\n // Start a fork where this group is included\n generateVariations(rest, current ? `${current}/(${groups[0]})` : `(${groups[0]})`);\n // This code will continue and add paths without this group included`\n }\n } else if (current) {\n current = `${current}/${head}`;\n } else {\n current = head;\n }\n\n generateVariations(rest, current);\n }\n\n generateVariations(segments);\n\n return Array.from(variations);\n}\n\nexport async function exportApiRoutesStandaloneAsync(\n devServer: MetroBundlerDevServer,\n {\n files = new Map(),\n platform,\n apiRoutesOnly,\n templateHtml,\n }: {\n files?: ExportAssetMap;\n platform: string;\n apiRoutesOnly: boolean;\n templateHtml?: string;\n }\n) {\n const { serverManifest, htmlManifest } = await devServer.getServerManifestAsync();\n\n const apiRoutes = await exportApiRoutesAsync({\n server: devServer,\n manifest: serverManifest,\n // NOTE(kitten): For now, we always output source maps for API route exports\n includeSourceMaps: true,\n platform,\n apiRoutesOnly,\n });\n\n // Add the api routes to the files to export.\n for (const [route, contents] of apiRoutes) {\n files.set(route, contents);\n }\n\n if (templateHtml && devServer.isReactServerComponentsEnabled) {\n // TODO: Export an HTML entry for each file. This is a temporary solution until we have SSR/SSG for RSC.\n await getFilesToExportFromServerAsync(devServer.projectRoot, {\n manifest: htmlManifest,\n serverManifest,\n exportServer: true,\n files,\n renderAsync: async ({ pathname, filePath }) => {\n files.set(filePath, {\n contents: templateHtml!,\n routeId: pathname,\n targetDomain: 'server',\n });\n return templateHtml!;\n },\n });\n }\n\n return files;\n}\n\nasync function exportApiRoutesAsync({\n includeSourceMaps,\n server,\n platform,\n apiRoutesOnly,\n ...props\n}: Pick<Options, 'includeSourceMaps'> & {\n server: MetroBundlerDevServer;\n manifest: RoutesManifest<string>;\n platform: string;\n apiRoutesOnly?: boolean;\n}): Promise<ExportAssetMap> {\n const { manifest, files } = await server.exportExpoRouterApiRoutesAsync({\n outputDir: '_expo/functions',\n prerenderManifest: props.manifest,\n includeSourceMaps,\n platform,\n });\n\n // HACK: Clear out the HTML and 404 routes if we're only exporting API routes. This is used for native apps that are using API routes but haven't implemented web support yet.\n if (apiRoutesOnly) {\n manifest.htmlRoutes = [];\n manifest.notFoundRoutes = [];\n }\n\n files.set('_expo/routes.json', {\n contents: JSON.stringify(manifest, null, 2),\n targetDomain: 'server',\n });\n\n return files;\n}\n\nfunction warnPossibleInvalidExportType(appDir: string) {\n const apiRoutes = getApiRoutesForDirectory(appDir);\n if (apiRoutes.length) {\n // TODO: Allow API Routes for native-only.\n Log.warn(\n chalk.yellow`Skipping export for API routes because \\`web.output\\` is not \"server\". You may want to remove the routes: ${apiRoutes\n .map((v) => path.relative(appDir, v))\n .join(', ')}`\n );\n }\n\n const middlewareFile = getMiddlewareForDirectory(appDir);\n if (middlewareFile) {\n Log.warn(\n chalk.yellow`Skipping export for middleware because \\`web.output\\` is not \"server\". You may want to remove ${path.relative(appDir, middlewareFile)}`\n );\n }\n}\n\n/**\n * Export loader bundles for routes that have loader exports and updates routes in the manifest\n * with a `loader` property.\n */\nasync function exportLoadersAsync({\n devServer,\n serverManifest,\n appDir,\n files,\n platform,\n loaderReferences,\n}: {\n devServer: MetroBundlerDevServer;\n serverManifest: RoutesManifest<string>;\n appDir: string;\n files: ExportAssetMap;\n platform: string;\n /** File paths of modules with loader exports from client bundle metadata */\n loaderReferences: string[];\n}): Promise<void> {\n const entryPoints: { file: string; page: string }[] = [];\n\n for (const route of serverManifest.htmlRoutes) {\n // Skip generated routes\n if (route.generated) {\n continue;\n }\n\n const filePath = path.isAbsolute(route.file) ? route.file : path.join(appDir, route.file);\n\n if (loaderReferences.includes(filePath)) {\n entryPoints.push({\n file: filePath,\n page: route.page,\n });\n }\n }\n\n if (entryPoints.length === 0) {\n debug('No routes with loaders to bundle');\n return;\n }\n\n const entryPointModules = entryPoints.map((e) => e.page);\n debug('Bundling loaders for routes:', entryPointModules);\n\n await devServer.exportExpoRouterLoadersAsync({\n platform,\n entryPoints,\n files,\n outputDir: '_expo/loaders',\n includeSourceMaps: true,\n });\n\n // Update `htmlRoutes` in routes manifest for routes that have loaders\n updateExportManifestInFiles({\n files,\n callback: (manifest) => {\n const routesWithLoaders = new Set(entryPointModules);\n for (const route of manifest.htmlRoutes) {\n if (routesWithLoaders.has(route.page)) {\n route.loader = `_expo/loaders${route.page}.js`;\n }\n }\n },\n });\n\n debug('Exported loaders for routes:', entryPointModules);\n}\n\n// NOTE(@hassankhan): We should ideally persist the manifest to `files` only once instead of\n// modifying it afterwards.\nfunction updateExportManifestInFiles({\n files,\n callback,\n}: {\n files: ExportAssetMap;\n callback: (manifest: RoutesManifest<string>) => void;\n}) {\n const routesJsonEntry = files.get('_expo/routes.json');\n if (routesJsonEntry) {\n const manifest = JSON.parse(routesJsonEntry.contents as string);\n callback(manifest);\n\n files.set('_expo/routes.json', {\n ...routesJsonEntry,\n contents: JSON.stringify(manifest, null, 2),\n });\n }\n}\n"],"names":["exportApiRoutesStandaloneAsync","exportFromServerAsync","getFilesToExportFromServerAsync","getHtmlFiles","getPathVariations","injectScriptTags","debug","require","html","scriptTags","scriptTagsHtml","map","tag","platform","src","join","replace","matchGroupName","name","match","projectRoot","manifest","serverManifest","renderAsync","exportServer","skipHtmlPrerendering","files","Map","subsetServerManifest","headers","redirects","set","contents","JSON","stringify","targetDomain","Promise","all","includeGroupVariations","route","filePath","pathname","type","data","routeId","e","logMetroErrorAsync","error","Error","modifyRouteNodeInRuntimeManifest","callback","iterateScreens","screens","Object","values","value","_route","makeRuntimeEntryPointsAbsolute","appDir","Array","isArray","entryPoints","entryPoint","shouldLinkExternally","startsWith","path","resolve","isAbsolute","resolveFrom","devServer","outputDir","baseUrl","includeSourceMaps","routerRoot","exp","useServerRendering","extra","router","unstable_useServerRendering","logOutput","web","output","learnMore","Log","log","isExporting","isExportingWithSSR","isReactServerComponentsEnabled","injectFaviconTag","getVirtualFaviconAssetsAsync","resources","executeLoaderAsync","getStaticResourcesAsync","getStaticRenderFunctionAsync","inspect","colors","depth","normalizedPathname","useServerLoaders","unstable_useServerDataLoaders","renderOpts","loaderResponse","undefined","json","loaderKey","getContextKey","contextKey","fileSystemPath","loaderId","loader","key","template","serializeHtmlWithAssets","artifacts","hydrate","getFilesFromSerialAssets","isServerHosted","assets","persistMetroAssetsAsync","outputDirectory","apiRoutes","exportApiRoutesAsync","server","exportExpoRouterRenderModuleAsync","loaderReferences","flatMap","artifact","metadata","exportLoadersAsync","toAssetUrl","filename","cssAssets","filter","asset","jsArtifacts","orderedJsAssets","assetsRequiresSort","syncJs","isAsync","asyncJs","syncJsAssets","htmlRoutes","routeAssets","matchedChunks","asyncChunk","modulePaths","hasRouteEntryPoint","some","includes","push","length","sorted","sortMatchedAssetsByEntryPoints","chunk","updateExportManifestInFiles","css","js","rendering","mode","file","asyncChunks","get","warnPossibleInvalidExportType","htmlFiles","Set","traverseScreens","entries","leaf","keys","endsWith","slice","stripGroupSegmentsFromPath","addOptionalGroups","add","newPath","variations","variation","uniqueBy","from","parts","split","partsWithGroups","part","filePathLocation","array","seen","result","id","has","routePath","segments","generateVariations","current","head","rest","groups","group","trim","apiRoutesOnly","templateHtml","htmlManifest","getServerManifestAsync","props","exportExpoRouterApiRoutesAsync","prerenderManifest","notFoundRoutes","getApiRoutesForDirectory","warn","chalk","yellow","v","relative","middlewareFile","getMiddlewareForDirectory","generated","page","entryPointModules","exportExpoRouterLoadersAsync","routesWithLoaders","routesJsonEntry","parse"],"mappings":"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"}
|