@expo/cli 56.1.16 → 57.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bin/cli +1 -1
- package/build/src/events/index.js +1 -1
- package/build/src/export/exportApp.js +30 -26
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/exportStaticAsync.js +19 -11
- package/build/src/export/exportStaticAsync.js.map +1 -1
- package/build/src/export/favicon.js +23 -31
- package/build/src/export/favicon.js.map +1 -1
- package/build/src/prebuild/clearNativeFolder.js +5 -8
- package/build/src/prebuild/clearNativeFolder.js.map +1 -1
- package/build/src/prebuild/index.js +3 -2
- package/build/src/prebuild/index.js.map +1 -1
- package/build/src/prebuild/prebuildAsync.js +15 -10
- package/build/src/prebuild/prebuildAsync.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +8 -2
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/webTemplate.js +6 -2
- package/build/src/start/server/webTemplate.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 +24 -24
package/build/bin/cli
CHANGED
|
@@ -76,7 +76,7 @@ function getInitMetadata() {
|
|
|
76
76
|
return {
|
|
77
77
|
format: 'v0-jsonl',
|
|
78
78
|
// Version is added in the build script.
|
|
79
|
-
version: "
|
|
79
|
+
version: "57.0.0" ?? 'UNVERSIONED'
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
82
|
function getWellKnownTemporaryLogFile(projectRoot, command) {
|
|
@@ -22,9 +22,9 @@ function _paths() {
|
|
|
22
22
|
};
|
|
23
23
|
return data;
|
|
24
24
|
}
|
|
25
|
-
function
|
|
26
|
-
const data =
|
|
27
|
-
|
|
25
|
+
function _html() {
|
|
26
|
+
const data = require("@expo/router-server/build/utils/html");
|
|
27
|
+
_html = function() {
|
|
28
28
|
return data;
|
|
29
29
|
};
|
|
30
30
|
return data;
|
|
@@ -36,16 +36,23 @@ function _chalk() {
|
|
|
36
36
|
};
|
|
37
37
|
return data;
|
|
38
38
|
}
|
|
39
|
-
function
|
|
40
|
-
const data = /*#__PURE__*/ _interop_require_default(require("
|
|
41
|
-
|
|
39
|
+
function _nodeassert() {
|
|
40
|
+
const data = /*#__PURE__*/ _interop_require_default(require("node:assert"));
|
|
41
|
+
_nodeassert = function() {
|
|
42
42
|
return data;
|
|
43
43
|
};
|
|
44
44
|
return data;
|
|
45
45
|
}
|
|
46
|
-
function
|
|
47
|
-
const data = /*#__PURE__*/ _interop_require_default(require("
|
|
48
|
-
|
|
46
|
+
function _nodefs() {
|
|
47
|
+
const data = /*#__PURE__*/ _interop_require_default(require("node:fs"));
|
|
48
|
+
_nodefs = function() {
|
|
49
|
+
return data;
|
|
50
|
+
};
|
|
51
|
+
return data;
|
|
52
|
+
}
|
|
53
|
+
function _nodepath() {
|
|
54
|
+
const data = /*#__PURE__*/ _interop_require_default(require("node:path"));
|
|
55
|
+
_nodepath = function() {
|
|
49
56
|
return data;
|
|
50
57
|
};
|
|
51
58
|
return data;
|
|
@@ -154,7 +161,7 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
|
|
|
154
161
|
}
|
|
155
162
|
const mode = dev ? 'development' : 'production';
|
|
156
163
|
const publicPath = (0, _publicFolder.getPublicFolderPath)(projectRoot);
|
|
157
|
-
const outputPath =
|
|
164
|
+
const outputPath = _nodepath().default.resolve(projectRoot, outputDir);
|
|
158
165
|
// Write the JS bundles to disk, and get the bundle file names (this could change with async chunk loading support).
|
|
159
166
|
const files = new Map();
|
|
160
167
|
const devServerManager = await _DevServerManager.DevServerManager.startMetroAsync(projectRoot, {
|
|
@@ -167,7 +174,7 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
|
|
|
167
174
|
maxWorkers
|
|
168
175
|
});
|
|
169
176
|
const devServer = devServerManager.getDefaultDevServer();
|
|
170
|
-
(0,
|
|
177
|
+
(0, _nodeassert().default)(devServer instanceof _MetroBundlerDevServer.MetroBundlerDevServer);
|
|
171
178
|
const bundles = {};
|
|
172
179
|
const domComponentAssetsMetadata = {};
|
|
173
180
|
const spaPlatforms = // TODO: Support server and static rendering for server component exports.
|
|
@@ -177,7 +184,7 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
|
|
|
177
184
|
// In RSC mode, we only need these to be in the client dir.
|
|
178
185
|
// TODO: Merge back with other copy after we add SSR.
|
|
179
186
|
try {
|
|
180
|
-
await (0, _publicFolder.copyPublicFolderAsync)(publicPath,
|
|
187
|
+
await (0, _publicFolder.copyPublicFolderAsync)(publicPath, _nodepath().default.join(outputPath, 'client'));
|
|
181
188
|
} catch (error) {
|
|
182
189
|
_log.error('Failed to copy public directory to dist directory');
|
|
183
190
|
throw error;
|
|
@@ -267,28 +274,25 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
|
|
|
267
274
|
];
|
|
268
275
|
}));
|
|
269
276
|
if (platform === 'web') {
|
|
277
|
+
const faviconAsset = await (0, _favicon.generateFaviconAssetAsync)(projectRoot, {
|
|
278
|
+
outputDir,
|
|
279
|
+
baseUrl,
|
|
280
|
+
files,
|
|
281
|
+
exp: projectConfig.exp
|
|
282
|
+
});
|
|
270
283
|
// TODO: Unify with exportStaticAsync
|
|
271
284
|
// TODO: Maybe move to the serializer.
|
|
272
|
-
|
|
285
|
+
const html = (0, _serializeHtml.serializeHtmlWithAssets)({
|
|
273
286
|
isExporting: true,
|
|
274
287
|
resources: bundle.artifacts,
|
|
275
288
|
template: await (0, _webTemplate.createTemplateHtmlFromExpoConfigAsync)(projectRoot, {
|
|
276
289
|
scripts: [],
|
|
277
290
|
cssLinks: [],
|
|
291
|
+
extraHead: faviconAsset ? (0, _html().createFaviconAsString)(faviconAsset.href) : undefined,
|
|
278
292
|
exp: projectConfig.exp
|
|
279
293
|
}),
|
|
280
294
|
baseUrl
|
|
281
295
|
});
|
|
282
|
-
// Add the favicon assets to the HTML.
|
|
283
|
-
const modifyHtml = await (0, _favicon.getVirtualFaviconAssetsAsync)(projectRoot, {
|
|
284
|
-
outputDir,
|
|
285
|
-
baseUrl,
|
|
286
|
-
files,
|
|
287
|
-
exp: projectConfig.exp
|
|
288
|
-
});
|
|
289
|
-
if (modifyHtml) {
|
|
290
|
-
html = modifyHtml(html);
|
|
291
|
-
}
|
|
292
296
|
// HACK: This is used for adding SSR shims in React Server Components.
|
|
293
297
|
templateHtml = html;
|
|
294
298
|
// Generate SPA-styled HTML file.
|
|
@@ -347,7 +351,7 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
|
|
|
347
351
|
const exportServer = ((_exp_web2 = exp.web) == null ? void 0 : _exp_web2.output) === 'server';
|
|
348
352
|
if (exportServer) {
|
|
349
353
|
// TODO: Remove when this is abstracted into the files map
|
|
350
|
-
await (0, _publicFolder.copyPublicFolderAsync)(publicPath,
|
|
354
|
+
await (0, _publicFolder.copyPublicFolderAsync)(publicPath, _nodepath().default.resolve(outputPath, 'client'));
|
|
351
355
|
}
|
|
352
356
|
if (skipSSG) {
|
|
353
357
|
_log.log('Skipping static site generation');
|
|
@@ -358,8 +362,8 @@ async function exportAppAsync(projectRoot, { platforms, outputDir, clear, dev, d
|
|
|
358
362
|
});
|
|
359
363
|
// Output a placeholder index.html if one doesn't exist in the public directory.
|
|
360
364
|
// This ensures native + API routes have some content at the root URL.
|
|
361
|
-
const placeholderIndex =
|
|
362
|
-
if (!
|
|
365
|
+
const placeholderIndex = _nodepath().default.resolve(outputPath, 'client/index.html');
|
|
366
|
+
if (!_nodefs().default.existsSync(placeholderIndex)) {
|
|
363
367
|
files.set('index.html', {
|
|
364
368
|
contents: `<html><body></body></html>`,
|
|
365
369
|
targetDomain: 'client'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/export/exportApp.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport type { Platform } from '@expo/config';\nimport { resolveRelativeEntryPoint } from '@expo/config/paths';\nimport type { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { type PlatformMetadata, createMetadataJson } from './createMetadataJson';\nimport { exportAssetsAsync } from './exportAssets';\nimport {\n addDomBundleToMetadataAsync,\n exportDomComponentAsync,\n transformNativeBundleForMd5Filename,\n transformDomEntryForMd5Filename,\n} from './exportDomComponents';\nimport { assertEngineMismatchAsync, isEnableHermesManaged } from './exportHermes';\nimport { exportApiRoutesStandaloneAsync, exportFromServerAsync } from './exportStaticAsync';\nimport { getVirtualFaviconAssetsAsync } from './favicon';\nimport { getPublicExpoManifestAsync } from './getPublicExpoManifest';\nimport { copyPublicFolderAsync, getPublicFolderPath } from './publicFolder';\nimport type { Options } from './resolveOptions';\nimport type { ExportAssetMap, BundleOutput, BundleAssetWithFileHashes } from './saveAssets';\nimport { getFilesFromSerialAssets, persistMetroFilesAsync } from './saveAssets';\nimport { createAssetMap } from './writeContents';\nimport * as Log from '../log';\nimport { WebSupportProjectPrerequisite } from '../start/doctor/web/WebSupportProjectPrerequisite';\nimport { DevServerManager } from '../start/server/DevServerManager';\nimport { MetroBundlerDevServer } from '../start/server/metro/MetroBundlerDevServer';\nimport { getRouterDirectoryModuleIdWithManifest } from '../start/server/metro/router';\nimport { serializeHtmlWithAssets } from '../start/server/metro/serializeHtml';\nimport { getBaseUrlFromExpoConfig } from '../start/server/middleware/metroOptions';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../start/server/webTemplate';\nimport { env } from '../utils/env';\nimport { CommandError } from '../utils/errors';\nimport { setNodeEnv, loadEnvFiles } from '../utils/nodeEnv';\n\nexport async function exportAppAsync(\n projectRoot: string,\n {\n platforms,\n outputDir,\n clear,\n dev,\n dumpAssetmap,\n sourceMaps,\n inlineSourceMaps,\n minify,\n bytecode,\n maxWorkers,\n skipSSG,\n hostedNative,\n }: Pick<\n Options,\n | 'dumpAssetmap'\n | 'sourceMaps'\n | 'inlineSourceMaps'\n | 'dev'\n | 'clear'\n | 'outputDir'\n | 'platforms'\n | 'minify'\n | 'bytecode'\n | 'maxWorkers'\n | 'skipSSG'\n | 'hostedNative'\n >\n): Promise<void> {\n // Force the environment during export and do not allow overriding it.\n const environment = dev ? 'development' : 'production';\n process.env.NODE_ENV = environment;\n setNodeEnv(environment);\n loadEnvFiles(projectRoot);\n\n const projectConfig = getConfig(projectRoot);\n const exp = await getPublicExpoManifestAsync(projectRoot, {\n // Web doesn't require validation.\n skipValidation: platforms.length === 1 && platforms[0] === 'web',\n });\n\n if (platforms.includes('web')) {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n }\n\n const useServerRendering = ['static', 'server'].includes(exp.web?.output ?? '');\n\n if (skipSSG && exp.web?.output !== 'server') {\n throw new CommandError('--no-ssg can only be used with `web.output: server`');\n }\n\n const baseUrl = getBaseUrlFromExpoConfig(exp);\n\n if (!bytecode && (platforms.includes('ios') || platforms.includes('android'))) {\n Log.warn(\n `Bytecode makes the app startup faster, disabling bytecode is highly discouraged and should only be used for debugging purposes.`\n );\n }\n\n // Print out logs\n if (baseUrl) {\n Log.log();\n Log.log(chalk.gray`Using (experimental) base path: ${baseUrl}`);\n // Warn if not using an absolute path.\n if (!baseUrl.startsWith('/')) {\n Log.log(\n chalk.yellow` Base path does not start with a slash. Requests will not be absolute.`\n );\n }\n }\n\n const mode = dev ? 'development' : 'production';\n const publicPath = getPublicFolderPath(projectRoot);\n const outputPath = path.resolve(projectRoot, outputDir);\n\n // Write the JS bundles to disk, and get the bundle file names (this could change with async chunk loading support).\n\n const files: ExportAssetMap = new Map();\n\n const devServerManager = await DevServerManager.startMetroAsync(projectRoot, {\n minify,\n mode,\n port: 8081,\n isExporting: true,\n location: {},\n resetDevServer: clear,\n maxWorkers,\n });\n\n const devServer = devServerManager.getDefaultDevServer();\n assert(devServer instanceof MetroBundlerDevServer);\n\n const bundles: Partial<Record<Platform, BundleOutput>> = {};\n const domComponentAssetsMetadata: Partial<Record<Platform, PlatformMetadata['assets']>> = {};\n\n const spaPlatforms =\n // TODO: Support server and static rendering for server component exports.\n useServerRendering && !devServer.isReactServerComponentsEnabled\n ? platforms.filter((platform) => platform !== 'web')\n : platforms;\n\n try {\n if (devServer.isReactServerComponentsEnabled) {\n // In RSC mode, we only need these to be in the client dir.\n // TODO: Merge back with other copy after we add SSR.\n try {\n await copyPublicFolderAsync(publicPath, path.join(outputPath, 'client'));\n } catch (error) {\n Log.error('Failed to copy public directory to dist directory');\n throw error;\n }\n } else {\n // NOTE(kitten): The public folder is currently always copied, regardless of targetDomain\n // split. Hence, there's another separate `copyPublicFolderAsync` call below for `web`\n await copyPublicFolderAsync(publicPath, outputPath);\n }\n\n let templateHtml: string | undefined;\n // Can be empty during web-only SSG.\n if (spaPlatforms.length) {\n await Promise.all(\n spaPlatforms.map(async (platform) => {\n // Assert early so the user doesn't have to wait until bundling is complete to find out that\n // Hermes won't be available.\n const isHermes = isEnableHermesManaged(exp, platform);\n if (isHermes) {\n await assertEngineMismatchAsync(projectRoot, exp, platform);\n }\n\n let bundle: {\n artifacts: SerialAsset[];\n assets: readonly BundleAssetWithFileHashes[];\n files?: ExportAssetMap;\n };\n\n try {\n // Run metro bundler and create the JS bundles/source maps.\n bundle = await devServer.nativeExportBundleAsync(\n exp,\n {\n platform,\n splitChunks:\n !env.EXPO_NO_BUNDLE_SPLITTING &&\n ((devServer.isReactServerComponentsEnabled && !bytecode) || platform === 'web'),\n mainModuleName: resolveRelativeEntryPoint(projectRoot, {\n platform,\n pkg: projectConfig.pkg,\n }),\n mode: dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n serializerIncludeMaps: sourceMaps || inlineSourceMaps,\n inlineSourceMap: inlineSourceMaps,\n bytecode: bytecode && isHermes,\n reactCompiler: !!exp.experiments?.reactCompiler,\n hosted: hostedNative,\n },\n files\n );\n } catch (error) {\n Log.log('');\n if (error instanceof Error) {\n Log.exception(error);\n } else {\n Log.error('Failed to bundle the app');\n Log.log(error as any);\n }\n process.exit(1);\n }\n\n bundles[platform] = bundle;\n\n getFilesFromSerialAssets(bundle.artifacts, {\n includeSourceMaps: sourceMaps,\n files,\n isServerHosted: devServer.isReactServerComponentsEnabled || hostedNative,\n });\n\n const expoDomComponentReferences = [\n ...new Set(\n bundle.artifacts\n .map((artifact) =>\n Array.isArray(artifact.metadata.expoDomComponentReferences)\n ? artifact.metadata.expoDomComponentReferences\n : []\n )\n .flat()\n ),\n ];\n await Promise.all(\n // TODO: Make a version of this which uses `this.metro.getBundler().buildGraphForEntries([])` to bundle all the DOM components at once.\n expoDomComponentReferences.map(async (filePath) => {\n const { bundle: platformDomComponentsBundle, htmlOutputName } =\n await exportDomComponentAsync({\n filePath,\n projectRoot,\n dev,\n devServer,\n isHermes,\n includeSourceMaps: sourceMaps,\n exp,\n files,\n useMd5Filename: true,\n });\n\n // Merge the assets from the DOM component into the output assets, deduplicating by hash.\n const existingHashes = new Set(bundle.assets.map((a) => a.hash));\n (bundle.assets as (typeof bundle.assets)[0][]).push(\n ...platformDomComponentsBundle.assets.filter((a) => !existingHashes.has(a.hash))\n );\n\n transformNativeBundleForMd5Filename({\n domComponentReference: filePath,\n nativeBundle: bundle,\n files,\n htmlOutputName,\n });\n domComponentAssetsMetadata[platform] = [\n ...(domComponentAssetsMetadata[platform] || []),\n ...(await addDomBundleToMetadataAsync(platformDomComponentsBundle)),\n ...transformDomEntryForMd5Filename({\n files,\n htmlOutputName,\n }),\n ];\n })\n );\n\n if (platform === 'web') {\n // TODO: Unify with exportStaticAsync\n // TODO: Maybe move to the serializer.\n let html = await serializeHtmlWithAssets({\n isExporting: true,\n resources: bundle.artifacts,\n template: await createTemplateHtmlFromExpoConfigAsync(projectRoot, {\n scripts: [],\n cssLinks: [],\n exp: projectConfig.exp,\n }),\n baseUrl,\n });\n\n // Add the favicon assets to the HTML.\n const modifyHtml = await getVirtualFaviconAssetsAsync(projectRoot, {\n outputDir,\n baseUrl,\n files,\n exp: projectConfig.exp,\n });\n if (modifyHtml) {\n html = modifyHtml(html);\n }\n\n // HACK: This is used for adding SSR shims in React Server Components.\n templateHtml = html;\n\n // Generate SPA-styled HTML file.\n // If web exists, then write the template HTML file.\n files.set('index.html', {\n contents: html,\n targetDomain: devServer.isReactServerComponentsEnabled ? 'server' : 'client',\n });\n }\n })\n );\n\n if (devServer.isReactServerComponentsEnabled) {\n const isWeb = platforms.includes('web');\n\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: !isWeb,\n templateHtml,\n });\n }\n\n // TODO: Use same asset system across platforms again.\n const { assets, embeddedHashSet } = await exportAssetsAsync(projectRoot, {\n files,\n exp,\n outputDir: outputPath,\n bundles,\n baseUrl,\n hostedNative,\n });\n\n if (dumpAssetmap) {\n Log.log('Creating asset map');\n files.set('assetmap.json', { contents: JSON.stringify(createAssetMap({ assets })) });\n }\n\n const targetDomain = devServer.isReactServerComponentsEnabled ? 'client/' : '';\n const fileNames = Object.fromEntries(\n Object.entries(bundles).map(([platform, bundle]) => [\n platform,\n bundle.artifacts\n .filter((asset) => asset.type === 'js')\n .map((asset) => targetDomain + asset.filename),\n ])\n );\n\n // Generate a `metadata.json` for EAS Update.\n const contents = createMetadataJson({\n bundles,\n fileNames,\n embeddedHashSet,\n domComponentAssetsMetadata,\n });\n files.set('metadata.json', { contents: JSON.stringify(contents) });\n }\n\n // Additional web-only steps...\n\n if (platforms.includes('web') && useServerRendering) {\n const exportServer = exp.web?.output === 'server';\n\n if (exportServer) {\n // TODO: Remove when this is abstracted into the files map\n await copyPublicFolderAsync(publicPath, path.resolve(outputPath, 'client'));\n }\n\n if (skipSSG) {\n Log.log('Skipping static site generation');\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: true,\n });\n\n // Output a placeholder index.html if one doesn't exist in the public directory.\n // This ensures native + API routes have some content at the root URL.\n const placeholderIndex = path.resolve(outputPath, 'client/index.html');\n if (!fs.existsSync(placeholderIndex)) {\n files.set('index.html', {\n contents: `<html><body></body></html>`,\n targetDomain: 'client',\n });\n }\n } else if (\n // TODO: Support static export with RSC.\n !devServer.isReactServerComponentsEnabled\n ) {\n await exportFromServerAsync(projectRoot, devServer, {\n mode,\n files,\n clear: !!clear,\n outputDir: outputPath,\n minify,\n baseUrl,\n includeSourceMaps: sourceMaps,\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n reactCompiler: !!exp.experiments?.reactCompiler,\n exportServer,\n maxWorkers,\n isExporting: true,\n exp: projectConfig.exp,\n });\n }\n }\n } finally {\n await devServerManager.stopAsync();\n }\n\n // Write all files at the end for unified logging.\n await persistMetroFilesAsync(files, outputPath);\n}\n"],"names":["exportAppAsync","projectRoot","platforms","outputDir","clear","dev","dumpAssetmap","sourceMaps","inlineSourceMaps","minify","bytecode","maxWorkers","skipSSG","hostedNative","exp","environment","process","env","NODE_ENV","setNodeEnv","loadEnvFiles","projectConfig","getConfig","getPublicExpoManifestAsync","skipValidation","length","includes","WebSupportProjectPrerequisite","assertAsync","useServerRendering","web","output","CommandError","baseUrl","getBaseUrlFromExpoConfig","Log","warn","log","chalk","gray","startsWith","yellow","mode","publicPath","getPublicFolderPath","outputPath","path","resolve","files","Map","devServerManager","DevServerManager","startMetroAsync","port","isExporting","location","resetDevServer","devServer","getDefaultDevServer","assert","MetroBundlerDevServer","bundles","domComponentAssetsMetadata","spaPlatforms","isReactServerComponentsEnabled","filter","platform","copyPublicFolderAsync","join","error","templateHtml","Promise","all","map","isHermes","isEnableHermesManaged","assertEngineMismatchAsync","bundle","nativeExportBundleAsync","splitChunks","EXPO_NO_BUNDLE_SPLITTING","mainModuleName","resolveRelativeEntryPoint","pkg","engine","undefined","serializerIncludeMaps","inlineSourceMap","reactCompiler","experiments","hosted","Error","exception","exit","getFilesFromSerialAssets","artifacts","includeSourceMaps","isServerHosted","expoDomComponentReferences","Set","artifact","Array","isArray","metadata","flat","filePath","platformDomComponentsBundle","htmlOutputName","exportDomComponentAsync","useMd5Filename","existingHashes","assets","a","hash","push","has","transformNativeBundleForMd5Filename","domComponentReference","nativeBundle","addDomBundleToMetadataAsync","transformDomEntryForMd5Filename","html","serializeHtmlWithAssets","resources","template","createTemplateHtmlFromExpoConfigAsync","scripts","cssLinks","modifyHtml","getVirtualFaviconAssetsAsync","set","contents","targetDomain","isWeb","exportApiRoutesStandaloneAsync","apiRoutesOnly","embeddedHashSet","exportAssetsAsync","JSON","stringify","createAssetMap","fileNames","Object","fromEntries","entries","asset","type","filename","createMetadataJson","exportServer","placeholderIndex","fs","existsSync","exportFromServerAsync","routerRoot","getRouterDirectoryModuleIdWithManifest","stopAsync","persistMetroFilesAsync"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/export/exportApp.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport type { Platform } from '@expo/config';\nimport { resolveRelativeEntryPoint } from '@expo/config/paths';\nimport type { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport { createFaviconAsString } from '@expo/router-server/build/utils/html';\nimport chalk from 'chalk';\nimport assert from 'node:assert';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nimport { type PlatformMetadata, createMetadataJson } from './createMetadataJson';\nimport { exportAssetsAsync } from './exportAssets';\nimport {\n addDomBundleToMetadataAsync,\n exportDomComponentAsync,\n transformNativeBundleForMd5Filename,\n transformDomEntryForMd5Filename,\n} from './exportDomComponents';\nimport { assertEngineMismatchAsync, isEnableHermesManaged } from './exportHermes';\nimport { exportApiRoutesStandaloneAsync, exportFromServerAsync } from './exportStaticAsync';\nimport { generateFaviconAssetAsync } from './favicon';\nimport { getPublicExpoManifestAsync } from './getPublicExpoManifest';\nimport { copyPublicFolderAsync, getPublicFolderPath } from './publicFolder';\nimport type { Options } from './resolveOptions';\nimport type { ExportAssetMap, BundleOutput, BundleAssetWithFileHashes } from './saveAssets';\nimport { getFilesFromSerialAssets, persistMetroFilesAsync } from './saveAssets';\nimport { createAssetMap } from './writeContents';\nimport * as Log from '../log';\nimport { WebSupportProjectPrerequisite } from '../start/doctor/web/WebSupportProjectPrerequisite';\nimport { DevServerManager } from '../start/server/DevServerManager';\nimport { MetroBundlerDevServer } from '../start/server/metro/MetroBundlerDevServer';\nimport { getRouterDirectoryModuleIdWithManifest } from '../start/server/metro/router';\nimport { serializeHtmlWithAssets } from '../start/server/metro/serializeHtml';\nimport { getBaseUrlFromExpoConfig } from '../start/server/middleware/metroOptions';\nimport { createTemplateHtmlFromExpoConfigAsync } from '../start/server/webTemplate';\nimport { env } from '../utils/env';\nimport { CommandError } from '../utils/errors';\nimport { setNodeEnv, loadEnvFiles } from '../utils/nodeEnv';\n\nexport async function exportAppAsync(\n projectRoot: string,\n {\n platforms,\n outputDir,\n clear,\n dev,\n dumpAssetmap,\n sourceMaps,\n inlineSourceMaps,\n minify,\n bytecode,\n maxWorkers,\n skipSSG,\n hostedNative,\n }: Pick<\n Options,\n | 'dumpAssetmap'\n | 'sourceMaps'\n | 'inlineSourceMaps'\n | 'dev'\n | 'clear'\n | 'outputDir'\n | 'platforms'\n | 'minify'\n | 'bytecode'\n | 'maxWorkers'\n | 'skipSSG'\n | 'hostedNative'\n >\n): Promise<void> {\n // Force the environment during export and do not allow overriding it.\n const environment = dev ? 'development' : 'production';\n process.env.NODE_ENV = environment;\n setNodeEnv(environment);\n loadEnvFiles(projectRoot);\n\n const projectConfig = getConfig(projectRoot);\n const exp = await getPublicExpoManifestAsync(projectRoot, {\n // Web doesn't require validation.\n skipValidation: platforms.length === 1 && platforms[0] === 'web',\n });\n\n if (platforms.includes('web')) {\n await new WebSupportProjectPrerequisite(projectRoot).assertAsync();\n }\n\n const useServerRendering = ['static', 'server'].includes(exp.web?.output ?? '');\n\n if (skipSSG && exp.web?.output !== 'server') {\n throw new CommandError('--no-ssg can only be used with `web.output: server`');\n }\n\n const baseUrl = getBaseUrlFromExpoConfig(exp);\n\n if (!bytecode && (platforms.includes('ios') || platforms.includes('android'))) {\n Log.warn(\n `Bytecode makes the app startup faster, disabling bytecode is highly discouraged and should only be used for debugging purposes.`\n );\n }\n\n // Print out logs\n if (baseUrl) {\n Log.log();\n Log.log(chalk.gray`Using (experimental) base path: ${baseUrl}`);\n // Warn if not using an absolute path.\n if (!baseUrl.startsWith('/')) {\n Log.log(\n chalk.yellow` Base path does not start with a slash. Requests will not be absolute.`\n );\n }\n }\n\n const mode = dev ? 'development' : 'production';\n const publicPath = getPublicFolderPath(projectRoot);\n const outputPath = path.resolve(projectRoot, outputDir);\n\n // Write the JS bundles to disk, and get the bundle file names (this could change with async chunk loading support).\n\n const files: ExportAssetMap = new Map();\n\n const devServerManager = await DevServerManager.startMetroAsync(projectRoot, {\n minify,\n mode,\n port: 8081,\n isExporting: true,\n location: {},\n resetDevServer: clear,\n maxWorkers,\n });\n\n const devServer = devServerManager.getDefaultDevServer();\n assert(devServer instanceof MetroBundlerDevServer);\n\n const bundles: Partial<Record<Platform, BundleOutput>> = {};\n const domComponentAssetsMetadata: Partial<Record<Platform, PlatformMetadata['assets']>> = {};\n\n const spaPlatforms =\n // TODO: Support server and static rendering for server component exports.\n useServerRendering && !devServer.isReactServerComponentsEnabled\n ? platforms.filter((platform) => platform !== 'web')\n : platforms;\n\n try {\n if (devServer.isReactServerComponentsEnabled) {\n // In RSC mode, we only need these to be in the client dir.\n // TODO: Merge back with other copy after we add SSR.\n try {\n await copyPublicFolderAsync(publicPath, path.join(outputPath, 'client'));\n } catch (error) {\n Log.error('Failed to copy public directory to dist directory');\n throw error;\n }\n } else {\n // NOTE(kitten): The public folder is currently always copied, regardless of targetDomain\n // split. Hence, there's another separate `copyPublicFolderAsync` call below for `web`\n await copyPublicFolderAsync(publicPath, outputPath);\n }\n\n let templateHtml: string | undefined;\n // Can be empty during web-only SSG.\n if (spaPlatforms.length) {\n await Promise.all(\n spaPlatforms.map(async (platform) => {\n // Assert early so the user doesn't have to wait until bundling is complete to find out that\n // Hermes won't be available.\n const isHermes = isEnableHermesManaged(exp, platform);\n if (isHermes) {\n await assertEngineMismatchAsync(projectRoot, exp, platform);\n }\n\n let bundle: {\n artifacts: SerialAsset[];\n assets: readonly BundleAssetWithFileHashes[];\n files?: ExportAssetMap;\n };\n\n try {\n // Run metro bundler and create the JS bundles/source maps.\n bundle = await devServer.nativeExportBundleAsync(\n exp,\n {\n platform,\n splitChunks:\n !env.EXPO_NO_BUNDLE_SPLITTING &&\n ((devServer.isReactServerComponentsEnabled && !bytecode) || platform === 'web'),\n mainModuleName: resolveRelativeEntryPoint(projectRoot, {\n platform,\n pkg: projectConfig.pkg,\n }),\n mode: dev ? 'development' : 'production',\n engine: isHermes ? 'hermes' : undefined,\n serializerIncludeMaps: sourceMaps || inlineSourceMaps,\n inlineSourceMap: inlineSourceMaps,\n bytecode: bytecode && isHermes,\n reactCompiler: !!exp.experiments?.reactCompiler,\n hosted: hostedNative,\n },\n files\n );\n } catch (error) {\n Log.log('');\n if (error instanceof Error) {\n Log.exception(error);\n } else {\n Log.error('Failed to bundle the app');\n Log.log(error as any);\n }\n process.exit(1);\n }\n\n bundles[platform] = bundle;\n\n getFilesFromSerialAssets(bundle.artifacts, {\n includeSourceMaps: sourceMaps,\n files,\n isServerHosted: devServer.isReactServerComponentsEnabled || hostedNative,\n });\n\n const expoDomComponentReferences = [\n ...new Set(\n bundle.artifacts\n .map((artifact) =>\n Array.isArray(artifact.metadata.expoDomComponentReferences)\n ? artifact.metadata.expoDomComponentReferences\n : []\n )\n .flat()\n ),\n ];\n await Promise.all(\n // TODO: Make a version of this which uses `this.metro.getBundler().buildGraphForEntries([])` to bundle all the DOM components at once.\n expoDomComponentReferences.map(async (filePath) => {\n const { bundle: platformDomComponentsBundle, htmlOutputName } =\n await exportDomComponentAsync({\n filePath,\n projectRoot,\n dev,\n devServer,\n isHermes,\n includeSourceMaps: sourceMaps,\n exp,\n files,\n useMd5Filename: true,\n });\n\n // Merge the assets from the DOM component into the output assets, deduplicating by hash.\n const existingHashes = new Set(bundle.assets.map((a) => a.hash));\n (bundle.assets as (typeof bundle.assets)[0][]).push(\n ...platformDomComponentsBundle.assets.filter((a) => !existingHashes.has(a.hash))\n );\n\n transformNativeBundleForMd5Filename({\n domComponentReference: filePath,\n nativeBundle: bundle,\n files,\n htmlOutputName,\n });\n domComponentAssetsMetadata[platform] = [\n ...(domComponentAssetsMetadata[platform] || []),\n ...(await addDomBundleToMetadataAsync(platformDomComponentsBundle)),\n ...transformDomEntryForMd5Filename({\n files,\n htmlOutputName,\n }),\n ];\n })\n );\n\n if (platform === 'web') {\n const faviconAsset = await generateFaviconAssetAsync(projectRoot, {\n outputDir,\n baseUrl,\n files,\n exp: projectConfig.exp,\n });\n\n // TODO: Unify with exportStaticAsync\n // TODO: Maybe move to the serializer.\n const html = serializeHtmlWithAssets({\n isExporting: true,\n resources: bundle.artifacts,\n template: await createTemplateHtmlFromExpoConfigAsync(projectRoot, {\n scripts: [],\n cssLinks: [],\n extraHead: faviconAsset ? createFaviconAsString(faviconAsset.href) : undefined,\n exp: projectConfig.exp,\n }),\n baseUrl,\n });\n\n // HACK: This is used for adding SSR shims in React Server Components.\n templateHtml = html;\n\n // Generate SPA-styled HTML file.\n // If web exists, then write the template HTML file.\n files.set('index.html', {\n contents: html,\n targetDomain: devServer.isReactServerComponentsEnabled ? 'server' : 'client',\n });\n }\n })\n );\n\n if (devServer.isReactServerComponentsEnabled) {\n const isWeb = platforms.includes('web');\n\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: !isWeb,\n templateHtml,\n });\n }\n\n // TODO: Use same asset system across platforms again.\n const { assets, embeddedHashSet } = await exportAssetsAsync(projectRoot, {\n files,\n exp,\n outputDir: outputPath,\n bundles,\n baseUrl,\n hostedNative,\n });\n\n if (dumpAssetmap) {\n Log.log('Creating asset map');\n files.set('assetmap.json', { contents: JSON.stringify(createAssetMap({ assets })) });\n }\n\n const targetDomain = devServer.isReactServerComponentsEnabled ? 'client/' : '';\n const fileNames = Object.fromEntries(\n Object.entries(bundles).map(([platform, bundle]) => [\n platform,\n bundle.artifacts\n .filter((asset) => asset.type === 'js')\n .map((asset) => targetDomain + asset.filename),\n ])\n );\n\n // Generate a `metadata.json` for EAS Update.\n const contents = createMetadataJson({\n bundles,\n fileNames,\n embeddedHashSet,\n domComponentAssetsMetadata,\n });\n files.set('metadata.json', { contents: JSON.stringify(contents) });\n }\n\n // Additional web-only steps...\n\n if (platforms.includes('web') && useServerRendering) {\n const exportServer = exp.web?.output === 'server';\n\n if (exportServer) {\n // TODO: Remove when this is abstracted into the files map\n await copyPublicFolderAsync(publicPath, path.resolve(outputPath, 'client'));\n }\n\n if (skipSSG) {\n Log.log('Skipping static site generation');\n await exportApiRoutesStandaloneAsync(devServer, {\n files,\n platform: 'web',\n apiRoutesOnly: true,\n });\n\n // Output a placeholder index.html if one doesn't exist in the public directory.\n // This ensures native + API routes have some content at the root URL.\n const placeholderIndex = path.resolve(outputPath, 'client/index.html');\n if (!fs.existsSync(placeholderIndex)) {\n files.set('index.html', {\n contents: `<html><body></body></html>`,\n targetDomain: 'client',\n });\n }\n } else if (\n // TODO: Support static export with RSC.\n !devServer.isReactServerComponentsEnabled\n ) {\n await exportFromServerAsync(projectRoot, devServer, {\n mode,\n files,\n clear: !!clear,\n outputDir: outputPath,\n minify,\n baseUrl,\n includeSourceMaps: sourceMaps,\n routerRoot: getRouterDirectoryModuleIdWithManifest(projectRoot, exp),\n reactCompiler: !!exp.experiments?.reactCompiler,\n exportServer,\n maxWorkers,\n isExporting: true,\n exp: projectConfig.exp,\n });\n }\n }\n } finally {\n await devServerManager.stopAsync();\n }\n\n // Write all files at the end for unified logging.\n await persistMetroFilesAsync(files, outputPath);\n}\n"],"names":["exportAppAsync","projectRoot","platforms","outputDir","clear","dev","dumpAssetmap","sourceMaps","inlineSourceMaps","minify","bytecode","maxWorkers","skipSSG","hostedNative","exp","environment","process","env","NODE_ENV","setNodeEnv","loadEnvFiles","projectConfig","getConfig","getPublicExpoManifestAsync","skipValidation","length","includes","WebSupportProjectPrerequisite","assertAsync","useServerRendering","web","output","CommandError","baseUrl","getBaseUrlFromExpoConfig","Log","warn","log","chalk","gray","startsWith","yellow","mode","publicPath","getPublicFolderPath","outputPath","path","resolve","files","Map","devServerManager","DevServerManager","startMetroAsync","port","isExporting","location","resetDevServer","devServer","getDefaultDevServer","assert","MetroBundlerDevServer","bundles","domComponentAssetsMetadata","spaPlatforms","isReactServerComponentsEnabled","filter","platform","copyPublicFolderAsync","join","error","templateHtml","Promise","all","map","isHermes","isEnableHermesManaged","assertEngineMismatchAsync","bundle","nativeExportBundleAsync","splitChunks","EXPO_NO_BUNDLE_SPLITTING","mainModuleName","resolveRelativeEntryPoint","pkg","engine","undefined","serializerIncludeMaps","inlineSourceMap","reactCompiler","experiments","hosted","Error","exception","exit","getFilesFromSerialAssets","artifacts","includeSourceMaps","isServerHosted","expoDomComponentReferences","Set","artifact","Array","isArray","metadata","flat","filePath","platformDomComponentsBundle","htmlOutputName","exportDomComponentAsync","useMd5Filename","existingHashes","assets","a","hash","push","has","transformNativeBundleForMd5Filename","domComponentReference","nativeBundle","addDomBundleToMetadataAsync","transformDomEntryForMd5Filename","faviconAsset","generateFaviconAssetAsync","html","serializeHtmlWithAssets","resources","template","createTemplateHtmlFromExpoConfigAsync","scripts","cssLinks","extraHead","createFaviconAsString","href","set","contents","targetDomain","isWeb","exportApiRoutesStandaloneAsync","apiRoutesOnly","embeddedHashSet","exportAssetsAsync","JSON","stringify","createAssetMap","fileNames","Object","fromEntries","entries","asset","type","filename","createMetadataJson","exportServer","placeholderIndex","fs","existsSync","exportFromServerAsync","routerRoot","getRouterDirectoryModuleIdWithManifest","stopAsync","persistMetroFilesAsync"],"mappings":"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"}
|
|
@@ -192,7 +192,7 @@ async function exportFromServerAsync(projectRoot, devServer, { outputDir, baseUr
|
|
|
192
192
|
const isExporting = true;
|
|
193
193
|
const isExportingWithSSR = exportServer && useServerRendering && !devServer.isReactServerComponentsEnabled;
|
|
194
194
|
const appDir = _path().default.join(projectRoot, routerRoot);
|
|
195
|
-
const
|
|
195
|
+
const faviconAsset = await (0, _favicon.generateFaviconAssetAsync)(projectRoot, {
|
|
196
196
|
outputDir,
|
|
197
197
|
baseUrl,
|
|
198
198
|
files,
|
|
@@ -219,7 +219,7 @@ async function exportFromServerAsync(projectRoot, devServer, { outputDir, baseUr
|
|
|
219
219
|
var _exp_extra_router, _exp_extra;
|
|
220
220
|
const normalizedPathname = pathname === '' ? '/' : pathname.startsWith('/') ? pathname : `/${pathname}`;
|
|
221
221
|
const useServerLoaders = exp == null ? void 0 : (_exp_extra = exp.extra) == null ? void 0 : (_exp_extra_router = _exp_extra.router) == null ? void 0 : _exp_extra_router.unstable_useServerDataLoaders;
|
|
222
|
-
|
|
222
|
+
const renderOpts = {};
|
|
223
223
|
if (useServerLoaders) {
|
|
224
224
|
const loaderResponse = await executeLoaderAsync(normalizedPathname, route);
|
|
225
225
|
if (loaderResponse !== undefined) {
|
|
@@ -233,14 +233,19 @@ async function exportFromServerAsync(projectRoot, devServer, { outputDir, baseUr
|
|
|
233
233
|
targetDomain: 'client',
|
|
234
234
|
loaderId: loaderKey
|
|
235
235
|
});
|
|
236
|
-
renderOpts = {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
key: loaderKey
|
|
240
|
-
}
|
|
236
|
+
renderOpts.loader = {
|
|
237
|
+
data,
|
|
238
|
+
key: loaderKey
|
|
241
239
|
};
|
|
242
240
|
}
|
|
243
241
|
}
|
|
242
|
+
if (faviconAsset) {
|
|
243
|
+
renderOpts.assets = {
|
|
244
|
+
css: [],
|
|
245
|
+
js: [],
|
|
246
|
+
favicon: faviconAsset.href
|
|
247
|
+
};
|
|
248
|
+
}
|
|
244
249
|
const template = await renderAsync(normalizedPathname, route, renderOpts);
|
|
245
250
|
let html = (0, _serializeHtml.serializeHtmlWithAssets)({
|
|
246
251
|
isExporting,
|
|
@@ -250,9 +255,6 @@ async function exportFromServerAsync(projectRoot, devServer, { outputDir, baseUr
|
|
|
250
255
|
route,
|
|
251
256
|
hydrate: true
|
|
252
257
|
});
|
|
253
|
-
if (injectFaviconTag) {
|
|
254
|
-
html = injectFaviconTag(html);
|
|
255
|
-
}
|
|
256
258
|
if (scriptTags) {
|
|
257
259
|
// Inject script tags into the HTML.
|
|
258
260
|
// <script type="type/expo" data-platform="ios" src="..." />
|
|
@@ -317,6 +319,11 @@ async function exportFromServerAsync(projectRoot, devServer, { outputDir, baseUr
|
|
|
317
319
|
}
|
|
318
320
|
const toAssetUrl = (filename)=>baseUrl ? `${baseUrl}/${filename}` : `/${filename}`;
|
|
319
321
|
const cssAssets = resources.artifacts.filter((asset)=>asset.type === 'css').map((asset)=>toAssetUrl(asset.filename));
|
|
322
|
+
// External stylesheets (`@import url(https://...)`) are extracted out of the bundled CSS.
|
|
323
|
+
const externalCssAssets = resources.artifacts.filter((asset)=>asset.type === 'css-external').map((asset)=>({
|
|
324
|
+
href: asset.filename,
|
|
325
|
+
media: asset.metadata.media
|
|
326
|
+
}));
|
|
320
327
|
const jsArtifacts = resources.artifacts.filter((asset)=>asset.type === 'js');
|
|
321
328
|
const orderedJsAssets = (0, _serializeHtml.assetsRequiresSort)(jsArtifacts);
|
|
322
329
|
const syncJs = orderedJsAssets.filter((asset)=>!asset.metadata.isAsync);
|
|
@@ -353,8 +360,9 @@ async function exportFromServerAsync(projectRoot, devServer, { outputDir, baseUr
|
|
|
353
360
|
callback: (manifest)=>{
|
|
354
361
|
manifest.assets = {
|
|
355
362
|
css: cssAssets,
|
|
363
|
+
externalCss: externalCssAssets,
|
|
356
364
|
js: syncJsAssets,
|
|
357
|
-
favicon:
|
|
365
|
+
favicon: faviconAsset == null ? void 0 : faviconAsset.href
|
|
358
366
|
};
|
|
359
367
|
manifest.rendering = {
|
|
360
368
|
mode: 'ssr',
|
|
@@ -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 type { ExpoConfig } from '@expo/config';\nimport type { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport chalk from 'chalk';\nimport type { 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 type { ExportAssetMap } from './saveAssets';\nimport { getFilesFromSerialAssets } from './saveAssets';\nimport { Log } from '../log';\nimport type {\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 = {\n css: cssAssets,\n js: syncJsAssets,\n favicon: injectFaviconTag ? `${baseUrl}/favicon.ico` : undefined,\n };\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 (head && 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 (head && current) {\n current = `${current}/${head}`;\n } else {\n current = head ?? current;\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","favicon","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":"AAAA;;;;;CAKC;;;;;;;;;;;QA0kBqBA;eAAAA;;QAxYAC;eAAAA;;QAhHAC;eAAAA;;QA2VNC;eAAAA;;QAqHAC;eAAAA;;QAjeAC;eAAAA;;;;gEA9DE;;;;;;;yBAEwC;;;;;;;yBACrB;;;;;;;gEAEpB;;;;;;;gEACO;;;;;;;yBACA;;;;;;yBAEqB;oCACL;4BAEC;qBACrB;qCAKe;wBACiC;+BAK7D;sBACmB;;;;;;AAE1B,MAAMC,QAAQC,QAAQ,SAAS;AAmCxB,SAASF,iBAAiBG,IAAY,EAAEC,UAA4B;IACzE,MAAMC,iBAAiBD,WACpBE,GAAG,CAAC,CAACC,MACJA,IAAIC,QAAQ,KAAK,QACb,CAAC,aAAa,EAAED,IAAIE,GAAG,CAAC,WAAW,CAAC,GACpC,CAAC,8BAA8B,EAAEF,IAAIE,GAAG,CAAC,iBAAiB,EAAEF,IAAIC,QAAQ,CAAC,WAAW,CAAC,EAE1FE,IAAI,CAAC;IACRP,OAAOA,KAAKQ,OAAO,CAAC,WAAW,GAAGN,eAAe,SAAS,CAAC;IAC3D,OAAOF;AACT;AAEA,6BAA6B,GAC7B,SAASS,eAAeC,IAAY;QAC3BA;IAAP,QAAOA,cAAAA,KAAKC,KAAK,CAAC,sCAAXD,WAA8B,CAAC,EAAE;AAC1C;AAEO,eAAehB,gCACpBkB,WAAmB,EACnB,EACEC,QAAQ,EACRC,cAAc,EACdC,WAAW,EACX,8DAA8D;AAC9D,kEAAkE;AAClE,aAAa;AACbC,YAAY,EACZC,oBAAoB,EACpB,kBAAkB;AAClBC,QAAQ,IAAIC,KAAK,EAclB;IAED,IAAI,CAACH,gBAAgBF,gBAAgB;QACnC,oFAAoF;QACpF,iEAAiE;QACjE,MAAMM,uBAAuB;YAC3BC,SAASP,eAAeO,OAAO;YAC/BC,WAAWR,eAAeQ,SAAS;QACrC;QACAJ,MAAMK,GAAG,CAAC,sBAAsB;YAC9BC,UAAUC,KAAKC,SAAS,CAACN,sBAAsB,MAAM;YACrDO,cAAc;QAChB;IACF;IAEA,8EAA8E;IAC9E,IAAIV,sBAAsB;QACxB,OAAOC;IACT;IAEA,MAAMU,QAAQC,GAAG,CACflC,aAAa;QAAEkB;QAAUiB,wBAAwB,CAACd;IAAa,GAAGb,GAAG,CACnE,OAAO,EAAE4B,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,EAAE;QAClC,oDAAoD;QACpD,IAAIF,MAAMG,IAAI,KAAK,WAAW;YAC5B;QACF;QAEA,IAAI;YACF,MAAMP,eAAeX,eAAe,WAAW;YAC/CE,MAAMK,GAAG,CAACS,UAAU;gBAAER,UAAU;gBAAIG;YAAa;YACjD,MAAMQ,OAAO,MAAMpB,YAAY;gBAAEgB;gBAAOC;gBAAUC;YAAS;YAC3Df,MAAMK,GAAG,CAACS,UAAU;gBAClBR,UAAUW;gBACVC,SAASH;gBACTN;YACF;QACF,EAAE,OAAOU,GAAQ;YACf,MAAMC,IAAAA,uCAAkB,EAAC;gBAAEC,OAAOF;gBAAGzB;YAAY;YACjD,MAAM,IAAI4B,MAAM,wCAAwCP;QAC1D;IACF;IAIJ,OAAOf;AACT;AAEA,SAASuB,iCACP5B,QAAmC,EACnC6B,QAAmC;IAEnC,MAAMC,iBAAiB,CAACC;QACtBC,OAAOC,MAAM,CAACF,SAASzC,GAAG,CAAC,CAAC4C;YAC1B,IAAI,OAAOA,UAAU,UAAU;gBAC7B,IAAIA,MAAMC,MAAM,EAAEN,SAASK,MAAMC,MAAM;gBACvCL,eAAeI,MAAMH,OAAO;YAC9B;QACF;IACF;IAEAD,eAAe9B,SAAS+B,OAAO;AACjC;AAEA,wCAAwC;AACxC,SAASK,+BAA+BpC,QAAmC,EAAEqC,MAAc;IACzFT,iCAAiC5B,UAAU,CAACkB;QAC1C,IAAIoB,MAAMC,OAAO,CAACrB,MAAMsB,WAAW,GAAG;YACpCtB,MAAMsB,WAAW,GAAGtB,MAAMsB,WAAW,CAAClD,GAAG,CAAC,CAACmD;gBACzC,+BAA+B;gBAC/B,IAAIC,IAAAA,2BAAoB,EAACD,aAAa;oBACpC,OAAOA;gBACT;gBAEA,IAAIA,WAAWE,UAAU,CAAC,MAAM;oBAC9B,OAAOC,eAAI,CAACC,OAAO,CAACR,QAAQI;gBAC9B,OAAO,IAAI,CAACG,eAAI,CAACE,UAAU,CAACL,aAAa;oBACvC,OAAOM,IAAAA,sBAAW,EAACV,QAAQI;gBAC7B;gBACA,OAAOA;YACT;QACF;IACF;AACF;AAGO,eAAe7D,sBACpBmB,WAAmB,EACnBiD,SAAgC,EAChC,EACEC,SAAS,EACTC,OAAO,EACP/C,YAAY,EACZgD,iBAAiB,EACjBC,UAAU,EACV/C,QAAQ,IAAIC,KAAK,EACjB+C,GAAG,EACHjE,UAAU,EACF;QAEiBiE,mBAAAA,YAGzBA;IAHF,MAAMC,qBAAqBD,CAAAA,wBAAAA,aAAAA,IAAKE,KAAK,sBAAVF,oBAAAA,WAAYG,MAAM,qBAAlBH,kBAAoBI,2BAA2B,KAAI;IAE9E,MAAMC,YACJL,CAAAA,wBAAAA,WAAAA,IAAKM,GAAG,qBAARN,SAAUO,MAAM,MAAK,YAAYN,qBAC7B,CAAC,6BAA6B,EAAEO,IAAAA,eAAS,EAAC,uDAAuD,GACjG,CAAC,6BAA6B,EAAEA,IAAAA,eAAS,EAAC,uDAAuD;IACvGC,QAAG,CAACC,GAAG,CAACL;IAER,MAAMlE,WAAW;IACjB,MAAMwE,cAAc;IACpB,MAAMC,qBACJ9D,gBAAgBmD,sBAAsB,CAACN,UAAUkB,8BAA8B;IACjF,MAAM7B,SAASO,eAAI,CAAClD,IAAI,CAACK,aAAaqD;IACtC,MAAMe,mBAAmB,MAAMC,IAAAA,qCAA4B,EAACrE,aAAa;QACvEkD;QACAC;QACA7C;QACAgD;IACF;IAEA,MAAM,CAACgB,WAAW,EAAErE,QAAQ,EAAEC,cAAc,EAAEC,WAAW,EAAEoE,kBAAkB,EAAE,CAAC,GAC9E,MAAMvD,QAAQC,GAAG,CAAC;QAChBgC,UAAUuB,uBAAuB,CAAC;YAChCpB;QACF;QACAH,UAAUwB,4BAA4B;KACvC;IAEHpC,+BAA+BpC,UAAUqC;IAEzCpD,MAAM,aAAawF,IAAAA,eAAO,EAACzE,UAAU;QAAE0E,QAAQ;QAAMC,OAAO;IAAK;IAEjE,MAAM9F,gCAAgCkB,aAAa;QACjDM;QACAL;QACAC;QACAE;QACAC,sBAAsB6D;QACtB,MAAM/D,aAAY,EAAEkB,QAAQ,EAAEF,KAAK,EAAE;gBAIVmC,mBAAAA;YAHzB,MAAMuB,qBACJxD,aAAa,KAAK,MAAMA,SAASuB,UAAU,CAAC,OAAOvB,WAAW,CAAC,CAAC,EAAEA,UAAU;YAE9E,MAAMyD,mBAAmBxB,wBAAAA,aAAAA,IAAKE,KAAK,sBAAVF,oBAAAA,WAAYG,MAAM,qBAAlBH,kBAAoByB,6BAA6B;YAC1E,IAAIC;YAEJ,IAAIF,kBAAkB;gBACpB,MAAMG,iBAAiB,MAAMV,mBAAmBM,oBAAoB1D;gBAEpE,IAAI8D,mBAAmBC,WAAW;oBAChC,MAAM3D,OAAO,MAAM0D,eAAeE,IAAI;oBACtC,uEAAuE;oBACvE,yDAAyD;oBACzD,MAAMC,YAAYC,IAAAA,yBAAa,EAAClE,MAAMmE,UAAU;oBAChD,MAAMC,iBAAiB,CAAC,aAAa,EAAEH,WAAW;oBAClD9E,MAAMK,GAAG,CAAC4E,gBAAgB;wBACxB3E,UAAUC,KAAKC,SAAS,CAACS,MAAM,MAAM;wBACrCR,cAAc;wBACdyE,UAAUJ;oBACZ;oBAEAJ,aAAa;wBAAES,QAAQ;4BAAElE;4BAAMmE,KAAKN;wBAAU;oBAAE;gBAClD;YACF;YAEA,MAAMO,WAAW,MAAMxF,YAAY0E,oBAAoB1D,OAAO6D;YAC9D,IAAI5F,OAAOwG,IAAAA,sCAAuB,EAAC;gBACjC3B;gBACAK,WAAWA,UAAUuB,SAAS;gBAC9BF;gBACAxC;gBACAhC;gBACA2E,SAAS;YACX;YAEA,IAAI1B,kBAAkB;gBACpBhF,OAAOgF,iBAAiBhF;YAC1B;YAEA,IAAIC,YAAY;gBACd,oCAAoC;gBACpC,4DAA4D;gBAC5DD,OAAOH,iBAAiBG,MAAMC;YAChC;YAEA,OAAOD;QACT;IACF;IAEA2G,IAAAA,oCAAwB,EAACzB,UAAUuB,SAAS,EAAE;QAC5CpG;QACA2D;QACA9C;QACA0F,gBAAgB;IAClB;IAEA,IAAI1B,UAAU2B,MAAM,EAAE;QACpB,+CAA+C;QAC/C,0GAA0G;QAC1G,MAAMC,IAAAA,2CAAuB,EAAClG,aAAasE,UAAU2B,MAAM,EAAE;YAC3D3F;YACAb;YACA0G,iBAAiBjD;YACjBC;QACF;IACF;IAEA,IAAI/C,cAAc;QAChB,MAAMgG,YAAY,MAAMC,qBAAqB;YAC3C5G,UAAU;YACV6G,QAAQrD;YACRhD,UAAUC;YACV,4EAA4E;YAC5EkD,mBAAmB;QACrB;QAEA,6CAA6C;QAC7C,KAAK,MAAM,CAACjC,OAAOP,SAAS,IAAIwF,UAAW;YACzC9F,MAAMK,GAAG,CAACQ,OAAOP;QACnB;QAEA,wEAAwE;QACxE,IAAIsD,oBAAoB;gBAQGZ,oBAAAA;YAPzB,MAAML,UAAUsD,iCAAiC,CAAC;gBAChDjG;gBACA8C,mBAAmB;gBACnB3D,UAAU;YACZ;YAEA,4DAA4D;YAC5D,MAAMqF,mBAAmBxB,wBAAAA,cAAAA,IAAKE,KAAK,sBAAVF,qBAAAA,YAAYG,MAAM,qBAAlBH,mBAAoByB,6BAA6B;YAC1E,IAAID,kBAAkB;oBAEKR;gBADzB,4FAA4F;gBAC5F,MAAMkC,oBAAmBlC,uBAAAA,UAAUuB,SAAS,qBAAnBvB,qBAAqBmC,OAAO,CACnD,CAACC;wBAAaA;2BAAAA,EAAAA,qBAAAA,SAASC,QAAQ,qBAAjBD,mBAAmBF,gBAAgB,KAAI,EAAE;;gBAGzD,MAAMI,mBAAmB;oBACvB3D;oBACA/C;oBACAoC;oBACAhC;oBACAb,UAAU;oBACV+G;gBACF;YACF;YAEA,MAAMK,aAAa,CAACC,WAClB3D,UAAU,GAAGA,QAAQ,CAAC,EAAE2D,UAAU,GAAG,CAAC,CAAC,EAAEA,UAAU;YAErD,MAAMC,YAAYzC,UAAUuB,SAAS,CAClCmB,MAAM,CAAC,CAACC,QAAUA,MAAM3F,IAAI,KAAK,OACjC/B,GAAG,CAAC,CAAC0H,QAAUJ,WAAWI,MAAMH,QAAQ;YAE3C,MAAMI,cAAc5C,UAAUuB,SAAS,CAACmB,MAAM,CAAC,CAACC,QAAUA,MAAM3F,IAAI,KAAK;YACzE,MAAM6F,kBAAkBC,IAAAA,iCAAkB,EAACF;YAC3C,MAAMG,SAASF,gBAAgBH,MAAM,CAAC,CAACC,QAAU,CAACA,MAAMN,QAAQ,CAACW,OAAO;YACxE,MAAMC,UAAUJ,gBAAgBH,MAAM,CAAC,CAACC,QAAUA,MAAMN,QAAQ,CAACW,OAAO;YAExE,MAAME,eAAeH,OAAO9H,GAAG,CAAC,CAAC0H,QAAUJ,WAAWI,MAAMH,QAAQ;YAEpE,MAAMW,aAAa1I,aAAa;gBAAEkB;gBAAUiB,wBAAwB;YAAM;YAE1E,0CAA0C;YAC1C,MAAMwG,cAAc,IAAInH;YACxB,KAAK,MAAM,EAAEY,KAAK,EAAE,IAAIsG,WAAY;gBAClC,IAAI,CAACtG,MAAMsB,WAAW,IAAI,CAACF,MAAMC,OAAO,CAACrB,MAAMsB,WAAW,GAAG;oBAC3D;gBACF;gBAEA,MAAMkF,gBAA+B,EAAE;gBACvC,KAAK,MAAMC,cAAcL,QAAS;oBAChC,IAAI,CAACK,WAAWjB,QAAQ,CAACkB,WAAW,IAAI,CAACtF,MAAMC,OAAO,CAACoF,WAAWjB,QAAQ,CAACkB,WAAW,GAAG;wBACvF;oBACF;oBACA,MAAMC,qBAAqB3G,MAAMsB,WAAW,CAACsF,IAAI,CAAC,CAACrF,aACjD,AAACkF,WAAWjB,QAAQ,CAACkB,WAAW,CAAcG,QAAQ,CAACtF;oBAEzD,IAAIoF,oBAAoB;wBACtBH,cAAcM,IAAI,CAACL;oBACrB;gBACF;gBAEA,IAAID,cAAcO,MAAM,GAAG,GAAG;oBAC5B,MAAMC,SAASC,IAAAA,6CAA8B,EAACT,eAAexG,MAAMsB,WAAW;oBAC9EiF,YAAY/G,GAAG,CACbQ,MAAMmE,UAAU,EAChB6C,OAAO5I,GAAG,CAAC,CAAC8I,QAAUxB,WAAWwB,MAAMvB,QAAQ;gBAEnD;YACF;YAEA,yDAAyD;YACzDwB,4BAA4B;gBAC1BhI;gBACAwB,UAAU,CAAC7B;oBACTA,SAASgG,MAAM,GAAG;wBAChBsC,KAAKxB;wBACLyB,IAAIhB;wBACJiB,SAASrE,mBAAmB,GAAGjB,QAAQ,YAAY,CAAC,GAAG+B;oBACzD;oBACAjF,SAASyI,SAAS,GAAG;wBACnBC,MAAM;wBACNC,MAAM;oBACR;oBAEA,KAAK,MAAMzH,SAASlB,SAASwH,UAAU,CAAE;wBACvC,MAAMoB,cAAcnB,YAAYoB,GAAG,CAAC3H,MAAMyH,IAAI;wBAC9C,IAAIC,aAAa;4BACf1H,MAAM8E,MAAM,GAAG;gCAAEsC,KAAK,EAAE;gCAAEC,IAAIK;4BAAY;wBAC5C;oBACF;gBACF;YACF;QACF;IACF,OAAO;QACLE,8BAA8BzG;IAChC;IAEA,OAAOhC;AACT;AAEO,SAASvB,aAAa,EAC3BkB,QAAQ,EACRiB,sBAAsB,EAIvB;IACC,MAAM8H,YAAY,IAAIC;IAEtB,SAASC,gBACPlH,OAA6C,EAC7Cb,KAAuB,EACvBgC,UAAU,EAAE;QAEZ,KAAK,MAAM,CAACuC,KAAKvD,MAAM,IAAIF,OAAOkH,OAAO,CAACnH,SAAU;YAClD,IAAIoH,OAAsB;YAC1B,IAAI,OAAOjH,UAAU,UAAU;gBAC7BiH,OAAOjH;YACT,OAAO,IAAIA,MAAMH,OAAO,IAAIC,OAAOoH,IAAI,CAAClH,MAAMH,OAAO,EAAEkG,MAAM,KAAK,GAAG;gBACnE,8CAA8C;gBAC9C,IAAIxC,QAAQvD,MAAMU,IAAI,GAAG,UAAU;oBACjCuG,OAAO1D;gBACT,OAAO;oBACL0D,OAAOjH,MAAMU,IAAI;gBACnB;gBAEA1B,QAAQgB,MAAMC,MAAM,IAAI;YAC1B;YAEA,IAAIgH,QAAQ,MAAM;gBAChB,IAAIhI,WAAW+B,UAAUiG;gBAEzB,IAAIA,SAAS,IAAI;oBACfhI,WACE+B,YAAY,KACR,UACAA,QAAQmG,QAAQ,CAAC,OACfnG,UAAU,UACVA,QAAQoG,KAAK,CAAC,GAAG,CAAC;gBAC5B,OAAO,IACL,4FAA4F;gBAC5FC,IAAAA,sCAA0B,EAACpI,cAAc,IACzC;oBACAA,YAAY;gBACd;gBAEA,kGAAkG;gBAClG,IAAI,CAACD,OAAO;oBACV,MAAM,IAAIS,MACR,CAAC,qCAAqC,EAAER,SAAS,uCAAuC,CAAC;gBAE7F;gBAEA,IAAIF,wBAAwB;oBAC1B,0CAA0C;oBAC1CuI,kBAAkBrI,UAAUD;gBAC9B,OAAO;oBACL6H,UAAUU,GAAG,CAAC;wBACZtI;wBACAD;oBACF;gBACF;YACF,OAAO,IAAI,OAAOgB,UAAU,aAAYA,yBAAAA,MAAOH,OAAO,GAAE;gBACtD,+BAA+B;gBAC/B,MAAM2H,UAAUxH,MAAMU,IAAI,GAAGM,UAAUhB,MAAMU,IAAI,GAAG,MAAMM;gBAC1D+F,gBAAgB/G,MAAMH,OAAO,EAAEG,MAAMC,MAAM,IAAI,MAAMuH;YACvD;QACF;IACF;IAEA,SAASF,kBAAkB5G,IAAY,EAAE1B,KAAgB;QACvD,MAAMyI,aAAa5K,kBAAkB6D;QACrC,KAAK,MAAMgH,aAAaD,WAAY;YAClCZ,UAAUU,GAAG,CAAC;gBAAEtI,UAAUyI;gBAAW1I;YAAM;QAC7C;IACF;IAEA+H,gBAAgBjJ,SAAS+B,OAAO,EAAE;IAElC,OAAO8H,SAASvH,MAAMwH,IAAI,CAACf,YAAY,CAAC7G,QAAUA,MAAMf,QAAQ,EAAE7B,GAAG,CAAC,CAAC4C;QACrE,MAAM6H,QAAQ7H,MAAMf,QAAQ,CAAC6I,KAAK,CAAC;QACnC,yDAAyD;QACzD,MAAMC,kBAAkBF,MAAMzK,GAAG,CAAC,CAAC4K;YACjC,IAAIA,SAAS,cAAc;gBACzB,OAAO,CAAC,UAAU,CAAC;YACrB,OAAO,IAAIA,KAAKvH,UAAU,CAAC,MAAM;gBAC/B,OAAO,CAAC,CAAC,EAAEuH,KAAKZ,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO,IAAIY,KAAKvH,UAAU,CAAC,MAAM;gBAC/B,OAAO,CAAC,IAAI,EAAEuH,KAAKZ,KAAK,CAAC,GAAG,CAAC,CAAC;YAChC;YACA,OAAOY;QACT;QACA,MAAMC,mBAAmBF,gBAAgBvK,IAAI,CAAC;QAC9C,MAAMyB,WAAWgJ,mBAAmB;QACpC,OAAO;YACL,GAAGjI,KAAK;YACRf;YACAC,UAAU+I,iBAAiBxK,OAAO,CAAC,gBAAgB;QACrD;IACF;AACF;AAEA,SAASkK,SAAYO,KAAU,EAAE3E,GAAyB;IACxD,MAAM4E,OAAO,IAAIrB;IACjB,MAAMsB,SAAc,EAAE;IACtB,KAAK,MAAMpI,SAASkI,MAAO;QACzB,MAAMG,KAAK9E,IAAIvD;QACf,IAAI,CAACmI,KAAKG,GAAG,CAACD,KAAK;YACjBF,KAAKZ,GAAG,CAACc;YACTD,OAAOtC,IAAI,CAAC9F;QACd;IACF;IACA,OAAOoI;AACT;AAIO,SAASvL,kBAAkB0L,SAAiB;IACjD,MAAMd,aAAa,IAAIX;IACvB,MAAM0B,WAAWD,UAAUT,KAAK,CAAC;IAEjC,SAASW,mBAAmBD,QAAkB,EAAEE,UAAU,EAAE;QAC1D,IAAIF,SAASzC,MAAM,KAAK,GAAG;YACzB,IAAI2C,SAASjB,WAAWF,GAAG,CAACmB;YAC5B;QACF;QAEA,MAAM,CAACC,MAAM,GAAGC,KAAK,GAAGJ;QAExB,IAAIG,QAAQjL,eAAeiL,OAAO;YAChC,MAAME,SAASF,KAAKvB,KAAK,CAAC,GAAG,CAAC,GAAGU,KAAK,CAAC;YAEvC,IAAIe,OAAO9C,MAAM,GAAG,GAAG;gBACrB,KAAK,MAAM+C,SAASD,OAAQ;oBAC1B,uDAAuD;oBACvDJ,mBAAmB;wBAAC,CAAC,CAAC,EAAEK,MAAMC,IAAI,GAAG,CAAC,CAAC;2BAAKH;qBAAK,EAAEF;gBACrD;gBACA;YACF,OAAO;gBACL,4CAA4C;gBAC5CD,mBAAmBG,MAAMF,UAAU,GAAGA,QAAQ,EAAE,EAAEG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAEA,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;YACjF,qEAAqE;YACvE;QACF,OAAO,IAAIF,QAAQD,SAAS;YAC1BA,UAAU,GAAGA,QAAQ,CAAC,EAAEC,MAAM;QAChC,OAAO;YACLD,UAAUC,QAAQD;QACpB;QAEAD,mBAAmBG,MAAMF;IAC3B;IAEAD,mBAAmBD;IAEnB,OAAOpI,MAAMwH,IAAI,CAACH;AACpB;AAEO,eAAehL,+BACpBqE,SAAgC,EAChC,EACE3C,QAAQ,IAAIC,KAAK,EACjBd,QAAQ,EACR0L,aAAa,EACbC,YAAY,EAMb;IAED,MAAM,EAAElL,cAAc,EAAEmL,YAAY,EAAE,GAAG,MAAMpI,UAAUqI,sBAAsB;IAE/E,MAAMlF,YAAY,MAAMC,qBAAqB;QAC3CC,QAAQrD;QACRhD,UAAUC;QACV,4EAA4E;QAC5EkD,mBAAmB;QACnB3D;QACA0L;IACF;IAEA,6CAA6C;IAC7C,KAAK,MAAM,CAAChK,OAAOP,SAAS,IAAIwF,UAAW;QACzC9F,MAAMK,GAAG,CAACQ,OAAOP;IACnB;IAEA,IAAIwK,gBAAgBnI,UAAUkB,8BAA8B,EAAE;QAC5D,wGAAwG;QACxG,MAAMrF,gCAAgCmE,UAAUjD,WAAW,EAAE;YAC3DC,UAAUoL;YACVnL;YACAE,cAAc;YACdE;YACAH,aAAa,OAAO,EAAEkB,QAAQ,EAAED,QAAQ,EAAE;gBACxCd,MAAMK,GAAG,CAACS,UAAU;oBAClBR,UAAUwK;oBACV5J,SAASH;oBACTN,cAAc;gBAChB;gBACA,OAAOqK;YACT;QACF;IACF;IAEA,OAAO9K;AACT;AAEA,eAAe+F,qBAAqB,EAClCjD,iBAAiB,EACjBkD,MAAM,EACN7G,QAAQ,EACR0L,aAAa,EACb,GAAGI,OAMJ;IACC,MAAM,EAAEtL,QAAQ,EAAEK,KAAK,EAAE,GAAG,MAAMgG,OAAOkF,8BAA8B,CAAC;QACtEtI,WAAW;QACXuI,mBAAmBF,MAAMtL,QAAQ;QACjCmD;QACA3D;IACF;IAEA,8KAA8K;IAC9K,IAAI0L,eAAe;QACjBlL,SAASwH,UAAU,GAAG,EAAE;QACxBxH,SAASyL,cAAc,GAAG,EAAE;IAC9B;IAEApL,MAAMK,GAAG,CAAC,qBAAqB;QAC7BC,UAAUC,KAAKC,SAAS,CAACb,UAAU,MAAM;QACzCc,cAAc;IAChB;IAEA,OAAOT;AACT;AAEA,SAASyI,8BAA8BzG,MAAc;IACnD,MAAM8D,YAAYuF,IAAAA,gCAAwB,EAACrJ;IAC3C,IAAI8D,UAAU8B,MAAM,EAAE;QACpB,0CAA0C;QAC1CnE,QAAG,CAAC6H,IAAI,CACNC,gBAAK,CAACC,MAAM,CAAC,0GAA0G,EAAE1F,UACtH7G,GAAG,CAAC,CAACwM,IAAMlJ,eAAI,CAACmJ,QAAQ,CAAC1J,QAAQyJ,IACjCpM,IAAI,CAAC,MAAM,CAAC;IAEnB;IAEA,MAAMsM,iBAAiBC,IAAAA,iCAAyB,EAAC5J;IACjD,IAAI2J,gBAAgB;QAClBlI,QAAG,CAAC6H,IAAI,CACNC,gBAAK,CAACC,MAAM,CAAC,8FAA8F,EAAEjJ,eAAI,CAACmJ,QAAQ,CAAC1J,QAAQ2J,gBAAgB,CAAC;IAExJ;AACF;AAEA;;;CAGC,GACD,eAAerF,mBAAmB,EAChC3D,SAAS,EACT/C,cAAc,EACdoC,MAAM,EACNhC,KAAK,EACLb,QAAQ,EACR+G,gBAAgB,EASjB;IACC,MAAM/D,cAAgD,EAAE;IAExD,KAAK,MAAMtB,SAASjB,eAAeuH,UAAU,CAAE;QAC7C,wBAAwB;QACxB,IAAItG,MAAMgL,SAAS,EAAE;YACnB;QACF;QAEA,MAAM/K,WAAWyB,eAAI,CAACE,UAAU,CAAC5B,MAAMyH,IAAI,IAAIzH,MAAMyH,IAAI,GAAG/F,eAAI,CAAClD,IAAI,CAAC2C,QAAQnB,MAAMyH,IAAI;QAExF,IAAIpC,iBAAiBwB,QAAQ,CAAC5G,WAAW;YACvCqB,YAAYwF,IAAI,CAAC;gBACfW,MAAMxH;gBACNgL,MAAMjL,MAAMiL,IAAI;YAClB;QACF;IACF;IAEA,IAAI3J,YAAYyF,MAAM,KAAK,GAAG;QAC5BhJ,MAAM;QACN;IACF;IAEA,MAAMmN,oBAAoB5J,YAAYlD,GAAG,CAAC,CAACkC,IAAMA,EAAE2K,IAAI;IACvDlN,MAAM,gCAAgCmN;IAEtC,MAAMpJ,UAAUqJ,4BAA4B,CAAC;QAC3C7M;QACAgD;QACAnC;QACA4C,WAAW;QACXE,mBAAmB;IACrB;IAEA,sEAAsE;IACtEkF,4BAA4B;QAC1BhI;QACAwB,UAAU,CAAC7B;YACT,MAAMsM,oBAAoB,IAAItD,IAAIoD;YAClC,KAAK,MAAMlL,SAASlB,SAASwH,UAAU,CAAE;gBACvC,IAAI8E,kBAAkB9B,GAAG,CAACtJ,MAAMiL,IAAI,GAAG;oBACrCjL,MAAMsE,MAAM,GAAG,CAAC,aAAa,EAAEtE,MAAMiL,IAAI,CAAC,GAAG,CAAC;gBAChD;YACF;QACF;IACF;IAEAlN,MAAM,gCAAgCmN;AACxC;AAEA,4FAA4F;AAC5F,2BAA2B;AAC3B,SAAS/D,4BAA4B,EACnChI,KAAK,EACLwB,QAAQ,EAIT;IACC,MAAM0K,kBAAkBlM,MAAMwI,GAAG,CAAC;IAClC,IAAI0D,iBAAiB;QACnB,MAAMvM,WAAWY,KAAK4L,KAAK,CAACD,gBAAgB5L,QAAQ;QACpDkB,SAAS7B;QAETK,MAAMK,GAAG,CAAC,qBAAqB;YAC7B,GAAG6L,eAAe;YAClB5L,UAAUC,KAAKC,SAAS,CAACb,UAAU,MAAM;QAC3C;IACF;AACF"}
|
|
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 type { ExpoConfig } from '@expo/config';\nimport type { SerialAsset } from '@expo/metro-config/build/serializer/serializerAssets';\nimport type { GetStaticContentOptions } from '@expo/router-server/build/static/renderStaticContent';\nimport chalk from 'chalk';\nimport type { 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 { generateFaviconAssetAsync } from './favicon';\nimport { persistMetroAssetsAsync } from './persistMetroAssets';\nimport type { ExportAssetMap } from './saveAssets';\nimport { getFilesFromSerialAssets } from './saveAssets';\nimport { Log } from '../log';\nimport type {\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 faviconAsset = await generateFaviconAssetAsync(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 const renderOpts: GetStaticContentOptions = {};\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 if (faviconAsset) {\n renderOpts.assets = { css: [], js: [], favicon: faviconAsset.href };\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 (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 // External stylesheets (`@import url(https://...)`) are extracted out of the bundled CSS.\n const externalCssAssets = resources.artifacts\n .filter((asset) => asset.type === 'css-external')\n .map((asset) => ({\n href: asset.filename,\n media: asset.metadata.media,\n }));\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 = {\n css: cssAssets,\n externalCss: externalCssAssets,\n js: syncJsAssets,\n favicon: faviconAsset?.href,\n };\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 (head && 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 (head && current) {\n current = `${current}/${head}`;\n } else {\n current = head ?? current;\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","faviconAsset","generateFaviconAssetAsync","resources","executeLoaderAsync","getStaticResourcesAsync","getStaticRenderFunctionAsync","inspect","colors","depth","normalizedPathname","useServerLoaders","unstable_useServerDataLoaders","renderOpts","loaderResponse","undefined","json","loaderKey","getContextKey","contextKey","fileSystemPath","loaderId","loader","key","assets","css","js","favicon","href","template","serializeHtmlWithAssets","artifacts","hydrate","getFilesFromSerialAssets","isServerHosted","persistMetroAssetsAsync","outputDirectory","apiRoutes","exportApiRoutesAsync","server","exportExpoRouterRenderModuleAsync","loaderReferences","flatMap","artifact","metadata","exportLoadersAsync","toAssetUrl","filename","cssAssets","filter","asset","externalCssAssets","media","jsArtifacts","orderedJsAssets","assetsRequiresSort","syncJs","isAsync","asyncJs","syncJsAssets","htmlRoutes","routeAssets","matchedChunks","asyncChunk","modulePaths","hasRouteEntryPoint","some","includes","push","length","sorted","sortMatchedAssetsByEntryPoints","chunk","updateExportManifestInFiles","externalCss","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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"}
|