@expo/cli 0.12.0 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/bin/cli +2 -2
- package/build/src/export/createBundles.js +0 -30
- package/build/src/export/createBundles.js.map +1 -1
- package/build/src/export/createMetadataJson.js +1 -0
- package/build/src/export/createMetadataJson.js.map +1 -1
- package/build/src/export/embed/exportEmbedAsync.js +2 -0
- package/build/src/export/embed/exportEmbedAsync.js.map +1 -1
- package/build/src/export/exportApp.js +42 -15
- package/build/src/export/exportApp.js.map +1 -1
- package/build/src/export/exportAssets.js +2 -2
- package/build/src/export/exportAssets.js.map +1 -1
- package/build/src/export/exportHermes.js +204 -0
- package/build/src/export/exportHermes.js.map +1 -0
- package/build/src/export/exportStaticAsync.js +58 -3
- package/build/src/export/exportStaticAsync.js.map +1 -1
- package/build/src/export/favicon.js +7 -7
- package/build/src/export/favicon.js.map +1 -1
- package/build/src/export/fork-bundleAsync.js +9 -11
- package/build/src/export/fork-bundleAsync.js.map +1 -1
- package/build/src/export/persistMetroAssets.js +118 -0
- package/build/src/export/persistMetroAssets.js.map +1 -0
- package/build/src/export/saveAssets.js.map +1 -1
- package/build/src/export/writeContents.js +2 -2
- package/build/src/export/writeContents.js.map +1 -1
- package/build/src/install/index.js +1 -0
- package/build/src/install/index.js.map +1 -1
- package/build/src/install/installAsync.js +1 -0
- package/build/src/install/installAsync.js.map +1 -1
- package/build/src/install/resolveOptions.js +7 -4
- package/build/src/install/resolveOptions.js.map +1 -1
- package/build/src/prebuild/index.js +2 -0
- package/build/src/prebuild/index.js.map +1 -1
- package/build/src/prebuild/prebuildAsync.js +2 -1
- package/build/src/prebuild/prebuildAsync.js.map +1 -1
- package/build/src/prebuild/resolveOptions.js +4 -2
- package/build/src/prebuild/resolveOptions.js.map +1 -1
- package/build/src/run/android/runAndroidAsync.js +5 -0
- package/build/src/run/android/runAndroidAsync.js.map +1 -1
- package/build/src/run/ios/runIosAsync.js +5 -0
- package/build/src/run/ios/runIosAsync.js.map +1 -1
- package/build/src/start/interface/interactiveActions.js +3 -3
- package/build/src/start/interface/interactiveActions.js.map +1 -1
- package/build/src/start/server/BundlerDevServer.js.map +1 -1
- package/build/src/start/server/getStaticRenderFunctions.js +7 -12
- package/build/src/start/server/getStaticRenderFunctions.js.map +1 -1
- package/build/src/start/server/metro/MetroBundlerDevServer.js +78 -54
- package/build/src/start/server/metro/MetroBundlerDevServer.js.map +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js +1 -1
- package/build/src/start/server/metro/MetroTerminalReporter.js.map +1 -1
- package/build/src/start/server/metro/bundleApiRoutes.js +67 -0
- package/build/src/start/server/metro/bundleApiRoutes.js.map +1 -0
- package/build/src/start/server/metro/createServerRouteMiddleware.js +112 -0
- package/build/src/start/server/metro/createServerRouteMiddleware.js.map +1 -0
- package/build/src/start/server/metro/fetchRouterManifest.js +60 -0
- package/build/src/start/server/metro/fetchRouterManifest.js.map +1 -0
- package/build/src/start/server/metro/instantiateMetro.js +31 -11
- package/build/src/start/server/metro/instantiateMetro.js.map +1 -1
- package/build/src/start/server/metro/metroErrorInterface.js +70 -10
- package/build/src/start/server/metro/metroErrorInterface.js.map +1 -1
- package/build/src/start/server/metro/resolveFromProject.js +13 -0
- package/build/src/start/server/metro/resolveFromProject.js.map +1 -1
- package/build/src/start/server/metro/router.js +32 -0
- package/build/src/start/server/metro/router.js.map +1 -1
- package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js +22 -0
- package/build/src/start/server/metro/waitForMetroToObserveTypeScriptFile.js.map +1 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js +18 -1
- package/build/src/start/server/metro/withMetroMultiPlatform.js.map +1 -1
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js +1 -1
- package/build/src/start/server/middleware/ExpoGoManifestHandlerMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/InterstitialPageMiddleware.js +3 -3
- package/build/src/start/server/middleware/InterstitialPageMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js +5 -1
- package/build/src/start/server/middleware/ManifestMiddleware.js.map +1 -1
- package/build/src/start/server/middleware/inspector/JsInspector.js +69 -0
- package/build/src/start/server/middleware/inspector/JsInspector.js.map +1 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowser.js +57 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowser.js.map +1 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js +13 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowser.types.js.map +1 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js +79 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplLinux.js.map +1 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js +78 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplMacOS.js.map +1 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js +123 -0
- package/build/src/start/server/middleware/inspector/LaunchBrowserImplWindows.js.map +1 -0
- package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js +64 -0
- package/build/src/start/server/middleware/inspector/createJsInspectorMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/inspector/middlwareMutations.js +19 -0
- package/build/src/start/server/middleware/inspector/middlwareMutations.js.map +1 -0
- package/build/src/start/server/middleware/mutations.js +19 -0
- package/build/src/start/server/middleware/mutations.js.map +1 -0
- package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js +31 -0
- package/build/src/start/server/middleware/remoteDevtoolsCorsMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js +17 -0
- package/build/src/start/server/middleware/remoteDevtoolsSecurityHeadersMiddleware.js.map +1 -0
- package/build/src/start/server/middleware/resolveAssets.js.map +1 -1
- package/build/src/start/server/middleware/suppressErrorMiddleware.js +16 -0
- package/build/src/start/server/middleware/suppressErrorMiddleware.js.map +1 -0
- package/build/src/start/server/type-generation/routes.js +3 -4
- package/build/src/start/server/type-generation/routes.js.map +1 -1
- package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js +1 -3
- package/build/src/start/server/type-generation/startTypescriptTypeGeneration.js.map +1 -1
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js +9 -82
- package/build/src/start/server/webpack/WebpackBundlerDevServer.js.map +1 -1
- package/build/src/utils/analytics/rudderstackClient.js +2 -2
- package/build/src/utils/codesigning.js.map +1 -1
- package/build/src/utils/port.js +45 -17
- package/build/src/utils/port.js.map +1 -1
- package/package.json +18 -12
- package/build/src/start/server/middleware/createDevServerMiddleware.js +0 -24
- package/build/src/start/server/middleware/createDevServerMiddleware.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/export/exportHermes.ts"],"sourcesContent":["import type { ExpoConfig, Platform } from '@expo/config';\nimport spawnAsync from '@expo/spawn-async';\nimport fs from 'fs-extra';\nimport os from 'os';\nimport path from 'path';\nimport process from 'process';\n\nimport {\n importMetroSourceMapComposeSourceMapsFromProject,\n resolveFromProject,\n} from '../start/server/metro/resolveFromProject';\n\nexport function importHermesCommandFromProject(projectRoot: string): string {\n const platformExecutable = getHermesCommandPlatform();\n const hermescLocations = [\n // Override hermesc dir by environment variables\n process.env['REACT_NATIVE_OVERRIDE_HERMES_DIR']\n ? `${process.env['REACT_NATIVE_OVERRIDE_HERMES_DIR']}/build/bin/hermesc`\n : '',\n\n // Building hermes from source\n 'react-native/ReactAndroid/hermes-engine/build/hermes/bin/hermesc',\n\n // Prebuilt hermesc in official react-native 0.69+\n `react-native/sdks/hermesc/${platformExecutable}`,\n\n // Legacy hermes-engine package\n `hermes-engine/${platformExecutable}`,\n ];\n\n for (const location of hermescLocations) {\n try {\n return resolveFromProject(projectRoot, location);\n } catch {}\n }\n throw new Error('Cannot find the hermesc executable.');\n}\n\nfunction getHermesCommandPlatform(): string {\n switch (os.platform()) {\n case 'darwin':\n return 'osx-bin/hermesc';\n case 'linux':\n return 'linux64-bin/hermesc';\n case 'win32':\n return 'win64-bin/hermesc.exe';\n default:\n throw new Error(`Unsupported host platform for Hermes compiler: ${os.platform()}`);\n }\n}\n\nexport function isEnableHermesManaged(expoConfig: ExpoConfig, platform: Platform): boolean {\n switch (platform) {\n case 'android': {\n return (expoConfig.android?.jsEngine ?? expoConfig.jsEngine) !== 'jsc';\n }\n case 'ios': {\n return (expoConfig.ios?.jsEngine ?? expoConfig.jsEngine) !== 'jsc';\n }\n default:\n return false;\n }\n}\n\ninterface HermesBundleOutput {\n hbc: Uint8Array;\n sourcemap: string;\n}\nexport async function buildHermesBundleAsync(\n projectRoot: string,\n code: string,\n map: string,\n optimize: boolean = false\n): Promise<HermesBundleOutput> {\n const tempDir = path.join(os.tmpdir(), `expo-bundler-${process.pid}`);\n await fs.ensureDir(tempDir);\n try {\n const tempBundleFile = path.join(tempDir, 'index.bundle');\n const tempSourcemapFile = path.join(tempDir, 'index.bundle.map');\n await fs.writeFile(tempBundleFile, code);\n await fs.writeFile(tempSourcemapFile, map);\n\n const tempHbcFile = path.join(tempDir, 'index.hbc');\n const hermesCommand = importHermesCommandFromProject(projectRoot);\n const args = ['-emit-binary', '-out', tempHbcFile, tempBundleFile, '-output-source-map'];\n if (optimize) {\n args.push('-O');\n }\n await spawnAsync(hermesCommand, args);\n\n const [hbc, sourcemap] = await Promise.all([\n fs.readFile(tempHbcFile),\n createHermesSourcemapAsync(projectRoot, map, `${tempHbcFile}.map`),\n ]);\n return {\n hbc,\n sourcemap,\n };\n } finally {\n await fs.remove(tempDir);\n }\n}\n\nexport async function createHermesSourcemapAsync(\n projectRoot: string,\n sourcemap: string,\n hermesMapFile: string\n): Promise<string> {\n const composeSourceMaps = importMetroSourceMapComposeSourceMapsFromProject(projectRoot);\n const bundlerSourcemap = JSON.parse(sourcemap);\n const hermesSourcemap = await fs.readJSON(hermesMapFile);\n return JSON.stringify(composeSourceMaps([bundlerSourcemap, hermesSourcemap]));\n}\n\nexport function parseGradleProperties(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (let line of content.split('\\n')) {\n line = line.trim();\n if (!line || line.startsWith('#')) {\n continue;\n }\n\n const sepIndex = line.indexOf('=');\n const key = line.substr(0, sepIndex);\n const value = line.substr(sepIndex + 1);\n result[key] = value;\n }\n return result;\n}\n\nexport async function maybeThrowFromInconsistentEngineAsync(\n projectRoot: string,\n configFilePath: string,\n platform: string,\n isHermesManaged: boolean\n): Promise<void> {\n const configFileName = path.basename(configFilePath);\n if (\n platform === 'android' &&\n (await maybeInconsistentEngineAndroidAsync(projectRoot, isHermesManaged))\n ) {\n throw new Error(\n `JavaScript engine configuration is inconsistent between ${configFileName} and Android native project.\\n` +\n `In ${configFileName}: Hermes is ${isHermesManaged ? 'enabled' : 'not enabled'}\\n` +\n `In Android native project: Hermes is ${isHermesManaged ? 'not enabled' : 'enabled'}\\n` +\n `Please check the following files for inconsistencies:\\n` +\n ` - ${configFilePath}\\n` +\n ` - ${path.join(projectRoot, 'android', 'gradle.properties')}\\n` +\n ` - ${path.join(projectRoot, 'android', 'app', 'build.gradle')}\\n` +\n 'Learn more: https://expo.fyi/hermes-android-config'\n );\n }\n\n if (platform === 'ios' && (await maybeInconsistentEngineIosAsync(projectRoot, isHermesManaged))) {\n throw new Error(\n `JavaScript engine configuration is inconsistent between ${configFileName} and iOS native project.\\n` +\n `In ${configFileName}: Hermes is ${isHermesManaged ? 'enabled' : 'not enabled'}\\n` +\n `In iOS native project: Hermes is ${isHermesManaged ? 'not enabled' : 'enabled'}\\n` +\n `Please check the following files for inconsistencies:\\n` +\n ` - ${configFilePath}\\n` +\n ` - ${path.join(projectRoot, 'ios', 'Podfile')}\\n` +\n ` - ${path.join(projectRoot, 'ios', 'Podfile.properties.json')}\\n` +\n 'Learn more: https://expo.fyi/hermes-ios-config'\n );\n }\n}\n\nexport async function maybeInconsistentEngineAndroidAsync(\n projectRoot: string,\n isHermesManaged: boolean\n): Promise<boolean> {\n // Trying best to check android native project if by chance to be consistent between app config\n\n // Check gradle.properties from prebuild template\n const gradlePropertiesPath = path.join(projectRoot, 'android', 'gradle.properties');\n if (fs.existsSync(gradlePropertiesPath)) {\n const props = parseGradleProperties(await fs.readFile(gradlePropertiesPath, 'utf8'));\n const isHermesBare = props['hermesEnabled'] === 'true';\n if (isHermesManaged !== isHermesBare) {\n return true;\n }\n }\n\n return false;\n}\n\nexport async function maybeInconsistentEngineIosAsync(\n projectRoot: string,\n isHermesManaged: boolean\n): Promise<boolean> {\n // Trying best to check ios native project if by chance to be consistent between app config\n\n // Check ios/Podfile for \":hermes_enabled => true\"\n const podfilePath = path.join(projectRoot, 'ios', 'Podfile');\n if (fs.existsSync(podfilePath)) {\n const content = await fs.readFile(podfilePath, 'utf8');\n const isPropsReference =\n content.search(\n /^\\s*:hermes_enabled\\s*=>\\s*podfile_properties\\['expo.jsEngine'\\]\\s*==\\s*nil\\s*\\|\\|\\s*podfile_properties\\['expo.jsEngine'\\]\\s*==\\s*'hermes',?/m\n ) >= 0;\n const isHermesBare = content.search(/^\\s*:hermes_enabled\\s*=>\\s*true,?\\s+/m) >= 0;\n if (!isPropsReference && isHermesManaged !== isHermesBare) {\n return true;\n }\n }\n\n // Check Podfile.properties.json from prebuild template\n const podfilePropertiesPath = path.join(projectRoot, 'ios', 'Podfile.properties.json');\n if (fs.existsSync(podfilePropertiesPath)) {\n const props = await parsePodfilePropertiesAsync(podfilePropertiesPath);\n const isHermesBare = props['expo.jsEngine'] === 'hermes';\n if (isHermesManaged !== isHermesBare) {\n return true;\n }\n }\n\n return false;\n}\n\n// https://github.com/facebook/hermes/blob/release-v0.5/include/hermes/BCGen/HBC/BytecodeFileFormat.h#L24-L25\nconst HERMES_MAGIC_HEADER = 'c61fbc03c103191f';\n\nexport async function isHermesBytecodeBundleAsync(file: string): Promise<boolean> {\n const header = await readHermesHeaderAsync(file);\n return header.slice(0, 8).toString('hex') === HERMES_MAGIC_HEADER;\n}\n\nexport async function getHermesBytecodeBundleVersionAsync(file: string): Promise<number> {\n const header = await readHermesHeaderAsync(file);\n if (header.slice(0, 8).toString('hex') !== HERMES_MAGIC_HEADER) {\n throw new Error('Invalid hermes bundle file');\n }\n return header.readUInt32LE(8);\n}\n\nasync function readHermesHeaderAsync(file: string): Promise<Buffer> {\n const fd = await fs.open(file, 'r');\n const buffer = Buffer.alloc(12);\n await fs.read(fd, buffer, 0, 12, null);\n await fs.close(fd);\n return buffer;\n}\n\nasync function parsePodfilePropertiesAsync(\n podfilePropertiesPath: string\n): Promise<Record<string, string>> {\n try {\n return JSON.parse(await fs.readFile(podfilePropertiesPath, 'utf8'));\n } catch {\n return {};\n }\n}\n"],"names":["importHermesCommandFromProject","isEnableHermesManaged","buildHermesBundleAsync","createHermesSourcemapAsync","parseGradleProperties","maybeThrowFromInconsistentEngineAsync","maybeInconsistentEngineAndroidAsync","maybeInconsistentEngineIosAsync","isHermesBytecodeBundleAsync","getHermesBytecodeBundleVersionAsync","projectRoot","platformExecutable","getHermesCommandPlatform","hermescLocations","process","env","location","resolveFromProject","Error","os","platform","expoConfig","android","jsEngine","ios","code","map","optimize","tempDir","path","join","tmpdir","pid","fs","ensureDir","tempBundleFile","tempSourcemapFile","writeFile","tempHbcFile","hermesCommand","args","push","spawnAsync","hbc","sourcemap","Promise","all","readFile","remove","hermesMapFile","composeSourceMaps","importMetroSourceMapComposeSourceMapsFromProject","bundlerSourcemap","JSON","parse","hermesSourcemap","readJSON","stringify","content","result","line","split","trim","startsWith","sepIndex","indexOf","key","substr","value","configFilePath","isHermesManaged","configFileName","basename","gradlePropertiesPath","existsSync","props","isHermesBare","podfilePath","isPropsReference","search","podfilePropertiesPath","parsePodfilePropertiesAsync","HERMES_MAGIC_HEADER","file","header","readHermesHeaderAsync","slice","toString","readUInt32LE","fd","open","buffer","Buffer","alloc","read","close"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ exports.exportFromServerAsync = exportFromServerAsync;
|
|
|
8
8
|
exports.modifyBundlesWithSourceMaps = modifyBundlesWithSourceMaps;
|
|
9
9
|
exports.getHtmlFiles = getHtmlFiles;
|
|
10
10
|
exports.getPathVariations = getPathVariations;
|
|
11
|
+
var _config = require("@expo/config");
|
|
11
12
|
var _assert = _interopRequireDefault(require("assert"));
|
|
12
13
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
13
14
|
var _fs = _interopRequireDefault(require("fs"));
|
|
@@ -19,6 +20,7 @@ var _log = require("../log");
|
|
|
19
20
|
var _devServerManager = require("../start/server/DevServerManager");
|
|
20
21
|
var _metroBundlerDevServer = require("../start/server/metro/MetroBundlerDevServer");
|
|
21
22
|
var _metroErrorInterface = require("../start/server/metro/metroErrorInterface");
|
|
23
|
+
var _router = require("../start/server/metro/router");
|
|
22
24
|
var _link = require("../utils/link");
|
|
23
25
|
function _interopRequireDefault(obj) {
|
|
24
26
|
return obj && obj.__esModule ? obj : {
|
|
@@ -74,8 +76,15 @@ async function getFilesToExportFromServerAsync(projectRoot, { manifest , renderA
|
|
|
74
76
|
}));
|
|
75
77
|
return files;
|
|
76
78
|
}
|
|
77
|
-
async function exportFromServerAsync(projectRoot, devServerManager, { outputDir , minify , includeMaps }) {
|
|
78
|
-
const
|
|
79
|
+
async function exportFromServerAsync(projectRoot, devServerManager, { outputDir , basePath , exportServer , minify , includeMaps }) {
|
|
80
|
+
const { exp } = (0, _config).getConfig(projectRoot, {
|
|
81
|
+
skipSDKVersionRequirement: true
|
|
82
|
+
});
|
|
83
|
+
const appDir = (0, _router).getRouterDirectoryWithManifest(projectRoot, exp);
|
|
84
|
+
const injectFaviconTag = await (0, _favicon).getVirtualFaviconAssetsAsync(projectRoot, {
|
|
85
|
+
outputDir,
|
|
86
|
+
basePath
|
|
87
|
+
});
|
|
79
88
|
const devServer = devServerManager.getDefaultDevServer();
|
|
80
89
|
(0, _assert).default(devServer instanceof _metroBundlerDevServer.MetroBundlerDevServer);
|
|
81
90
|
const [resources, { manifest , renderAsync }] = await Promise.all([
|
|
@@ -100,7 +109,8 @@ async function exportFromServerAsync(projectRoot, devServerManager, { outputDir
|
|
|
100
109
|
let html = await devServer.composeResourcesWithHtml({
|
|
101
110
|
mode: "production",
|
|
102
111
|
resources,
|
|
103
|
-
template
|
|
112
|
+
template,
|
|
113
|
+
basePath
|
|
104
114
|
});
|
|
105
115
|
if (injectFaviconTag) {
|
|
106
116
|
html = injectFaviconTag(html);
|
|
@@ -111,6 +121,19 @@ async function exportFromServerAsync(projectRoot, devServerManager, { outputDir
|
|
|
111
121
|
resources.forEach((resource)=>{
|
|
112
122
|
files.set(resource.filename, modifyBundlesWithSourceMaps(resource.filename, resource.source, includeMaps));
|
|
113
123
|
});
|
|
124
|
+
if (exportServer) {
|
|
125
|
+
const apiRoutes = await exportApiRoutesAsync({
|
|
126
|
+
outputDir,
|
|
127
|
+
server: devServer,
|
|
128
|
+
appDir
|
|
129
|
+
});
|
|
130
|
+
// Add the api routes to the files to export.
|
|
131
|
+
for (const [route, contents] of apiRoutes){
|
|
132
|
+
files.set(route, contents);
|
|
133
|
+
}
|
|
134
|
+
} else {
|
|
135
|
+
warnPossibleInvalidExportType(appDir);
|
|
136
|
+
}
|
|
114
137
|
_fs.default.mkdirSync(_path.default.join(outputDir), {
|
|
115
138
|
recursive: true
|
|
116
139
|
});
|
|
@@ -211,5 +234,37 @@ function getPathVariations(routePath) {
|
|
|
211
234
|
generateVariations(segments1, 0);
|
|
212
235
|
return Array.from(variations);
|
|
213
236
|
}
|
|
237
|
+
async function exportApiRoutesAsync({ outputDir , server , appDir }) {
|
|
238
|
+
const funcDir = _path.default.join(outputDir, "_expo/functions");
|
|
239
|
+
_fs.default.mkdirSync(_path.default.join(funcDir), {
|
|
240
|
+
recursive: true
|
|
241
|
+
});
|
|
242
|
+
const [manifest, files1] = await Promise.all([
|
|
243
|
+
server.getExpoRouterRoutesManifestAsync({
|
|
244
|
+
appDir
|
|
245
|
+
}),
|
|
246
|
+
server.exportExpoRouterApiRoutesAsync({
|
|
247
|
+
mode: "production",
|
|
248
|
+
appDir
|
|
249
|
+
}).then((routes)=>{
|
|
250
|
+
const files = new Map();
|
|
251
|
+
for (const [route, contents] of routes){
|
|
252
|
+
files.set(_path.default.join("_expo/functions", route), contents);
|
|
253
|
+
}
|
|
254
|
+
return files;
|
|
255
|
+
}),
|
|
256
|
+
]);
|
|
257
|
+
_log.Log.log(_chalk.default.bold`Exporting ${files1.size} API Routes.`);
|
|
258
|
+
files1.set("_expo/routes.json", JSON.stringify(manifest, null, 2));
|
|
259
|
+
return files1;
|
|
260
|
+
}
|
|
261
|
+
function warnPossibleInvalidExportType(appDir) {
|
|
262
|
+
const apiRoutes = (0, _router).getApiRoutesForDirectory(appDir);
|
|
263
|
+
if (apiRoutes.length) {
|
|
264
|
+
// TODO: Allow API Routes for native-only.
|
|
265
|
+
_log.Log.warn(_chalk.default.yellow`Skipping export for API routes because \`web.output\` is not "server". You may want to remove the routes: ${apiRoutes.map((v)=>_path.default.relative(appDir, v)
|
|
266
|
+
).join(", ")}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
214
269
|
|
|
215
270
|
//# sourceMappingURL=exportStaticAsync.js.map
|
|
@@ -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 assert from 'assert';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport path from 'path';\nimport prettyBytes from 'pretty-bytes';\nimport { inspect } from 'util';\n\nimport { getVirtualFaviconAssetsAsync } from './favicon';\nimport { Log } from '../log';\nimport { DevServerManager } from '../start/server/DevServerManager';\nimport { MetroBundlerDevServer } from '../start/server/metro/MetroBundlerDevServer';\nimport { logMetroErrorAsync } from '../start/server/metro/metroErrorInterface';\nimport { learnMore } from '../utils/link';\n\nconst debug = require('debug')('expo:export:generateStaticRoutes') as typeof console.log;\n\ntype Options = { outputDir: string; minify: boolean; includeMaps: boolean };\n\n/** @private */\nexport async function unstable_exportStaticAsync(projectRoot: string, options: Options) {\n Log.warn(\n `Experimental static rendering is enabled. ` +\n learnMore('https://docs.expo.dev/router/reference/static-rendering/')\n );\n\n // TODO: Prevent starting the watcher.\n const devServerManager = new DevServerManager(projectRoot, {\n minify: options.minify,\n mode: 'production',\n location: {},\n });\n await devServerManager.startAsync([\n {\n type: 'metro',\n options: {\n location: {},\n isExporting: true,\n },\n },\n ]);\n\n try {\n await exportFromServerAsync(projectRoot, devServerManager, options);\n } finally {\n await devServerManager.stopAsync();\n }\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 renderAsync,\n }: {\n manifest: any;\n renderAsync: (pathname: string) => Promise<string>;\n }\n): Promise<Map<string, string>> {\n // name : contents\n const files = new Map<string, string>();\n\n await Promise.all(\n getHtmlFiles({ manifest }).map(async (outputPath) => {\n const pathname = outputPath.replace(/(?:index)?\\.html$/, '');\n try {\n files.set(outputPath, '');\n const data = await renderAsync(pathname);\n files.set(outputPath, data);\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 return files;\n}\n\n/** Perform all fs commits */\nexport async function exportFromServerAsync(\n projectRoot: string,\n devServerManager: DevServerManager,\n { outputDir, minify, includeMaps }: Options\n): Promise<void> {\n const injectFaviconTag = await getVirtualFaviconAssetsAsync(projectRoot, outputDir);\n\n const devServer = devServerManager.getDefaultDevServer();\n assert(devServer instanceof MetroBundlerDevServer);\n\n const [resources, { manifest, renderAsync }] = await Promise.all([\n devServer.getStaticResourcesAsync({ mode: 'production', minify, includeMaps }),\n devServer.getStaticRenderFunctionAsync({\n mode: 'production',\n minify,\n }),\n ]);\n\n debug('Routes:\\n', inspect(manifest, { colors: true, depth: null }));\n\n const files = await getFilesToExportFromServerAsync(projectRoot, {\n manifest,\n async renderAsync(pathname: string) {\n const template = await renderAsync(pathname);\n let html = await devServer.composeResourcesWithHtml({\n mode: 'production',\n resources,\n template,\n });\n\n if (injectFaviconTag) {\n html = injectFaviconTag(html);\n }\n\n return html;\n },\n });\n\n resources.forEach((resource) => {\n files.set(\n resource.filename,\n modifyBundlesWithSourceMaps(resource.filename, resource.source, includeMaps)\n );\n });\n\n fs.mkdirSync(path.join(outputDir), { recursive: true });\n\n Log.log('');\n Log.log(chalk.bold`Exporting ${files.size} files:`);\n await Promise.all(\n [...files.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(async ([file, contents]) => {\n const length = Buffer.byteLength(contents, 'utf8');\n Log.log(file, chalk.gray`(${prettyBytes(length)})`);\n const outputPath = path.join(outputDir, file);\n await fs.promises.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.promises.writeFile(outputPath, contents);\n })\n );\n Log.log('');\n}\n\nexport function modifyBundlesWithSourceMaps(\n filename: string,\n source: string,\n includeMaps: boolean\n): string {\n if (filename.endsWith('.js')) {\n // If the bundle ends with source map URLs then update them to point to the correct location.\n\n // TODO: basePath support\n const normalizedFilename = '/' + filename.replace(/^\\/+/, '');\n //# sourceMappingURL=//localhost:8085/index.map?platform=web&dev=false&hot=false&lazy=true&minify=true&resolver.environment=client&transform.environment=client&serializer.output=static\n //# sourceURL=http://localhost:8085/index.bundle//&platform=web&dev=false&hot=false&lazy=true&minify=true&resolver.environment=client&transform.environment=client&serializer.output=static\n return source.replace(/^\\/\\/# (sourceMappingURL|sourceURL)=.*$/gm, (...props) => {\n if (includeMaps) {\n if (props[1] === 'sourceURL') {\n return `//# ${props[1]}=` + normalizedFilename;\n } else if (props[1] === 'sourceMappingURL') {\n const mapName = normalizedFilename + '.map';\n return `//# ${props[1]}=` + mapName;\n }\n }\n return '';\n });\n }\n return source;\n}\n\nexport function getHtmlFiles({ manifest }: { manifest: any }): string[] {\n const htmlFiles = new Set<string>();\n\n function traverseScreens(screens: string | { screens: any; path: string }, basePath = '') {\n for (const value of Object.values(screens)) {\n if (typeof value === 'string') {\n let filePath = basePath + value;\n if (value === '') {\n filePath =\n basePath === ''\n ? 'index'\n : basePath.endsWith('/')\n ? basePath + 'index'\n : basePath.slice(0, -1);\n }\n // TODO: Dedupe requests for alias routes.\n addOptionalGroups(filePath);\n } else if (typeof value === 'object' && value?.screens) {\n const newPath = basePath + value.path + '/';\n traverseScreens(value.screens, newPath);\n }\n }\n }\n\n function addOptionalGroups(path: string) {\n const variations = getPathVariations(path);\n for (const variation of variations) {\n htmlFiles.add(variation);\n }\n }\n\n traverseScreens(manifest.screens);\n\n return Array.from(htmlFiles).map((value) => {\n const parts = value.split('/');\n // Replace `:foo` with `[foo]` and `*foo` with `[...foo]`\n const partsWithGroups = parts.map((part) => {\n if (part.startsWith(':')) {\n return `[${part.slice(1)}]`;\n } else if (part.startsWith('*')) {\n return `[...${part.slice(1)}]`;\n }\n return part;\n });\n return partsWithGroups.join('/') + '.html';\n });\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>([routePath]);\n const segments = routePath.split('/');\n\n function generateVariations(segments: string[], index: number): void {\n if (index >= segments.length) {\n return;\n }\n\n const newSegments = [...segments];\n while (\n index < newSegments.length &&\n matchGroupName(newSegments[index]) &&\n newSegments.length > 1\n ) {\n newSegments.splice(index, 1);\n variations.add(newSegments.join('/'));\n generateVariations(newSegments, index + 1);\n }\n\n generateVariations(segments, index + 1);\n }\n\n generateVariations(segments, 0);\n\n return Array.from(variations);\n}\n"],"names":["unstable_exportStaticAsync","getFilesToExportFromServerAsync","exportFromServerAsync","modifyBundlesWithSourceMaps","getHtmlFiles","getPathVariations","debug","require","projectRoot","options","Log","warn","learnMore","devServerManager","DevServerManager","minify","mode","location","startAsync","type","isExporting","stopAsync","matchGroupName","name","match","manifest","renderAsync","files","Map","Promise","all","map","outputPath","pathname","replace","set","data","e","logMetroErrorAsync","error","Error","outputDir","includeMaps","injectFaviconTag","getVirtualFaviconAssetsAsync","devServer","getDefaultDevServer","assert","MetroBundlerDevServer","resources","getStaticResourcesAsync","getStaticRenderFunctionAsync","inspect","colors","depth","template","html","composeResourcesWithHtml","forEach","resource","filename","source","fs","mkdirSync","path","join","recursive","log","chalk","bold","size","entries","sort","a","b","localeCompare","file","contents","length","Buffer","byteLength","gray","prettyBytes","promises","mkdir","dirname","writeFile","endsWith","normalizedFilename","props","mapName","htmlFiles","Set","traverseScreens","screens","basePath","value","Object","values","filePath","slice","addOptionalGroups","newPath","variations","variation","add","Array","from","parts","split","partsWithGroups","part","startsWith","routePath","segments","generateVariations","index","newSegments","splice"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/export/exportStaticAsync.ts"],"sourcesContent":["/**\n * Copyright © 2022 650 Industries.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport { getConfig } from '@expo/config';\nimport assert from 'assert';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport path from 'path';\nimport prettyBytes from 'pretty-bytes';\nimport { inspect } from 'util';\n\nimport { getVirtualFaviconAssetsAsync } from './favicon';\nimport { Log } from '../log';\nimport { DevServerManager } from '../start/server/DevServerManager';\nimport { MetroBundlerDevServer } from '../start/server/metro/MetroBundlerDevServer';\nimport { logMetroErrorAsync } from '../start/server/metro/metroErrorInterface';\nimport {\n getApiRoutesForDirectory,\n getRouterDirectoryWithManifest,\n} from '../start/server/metro/router';\nimport { learnMore } from '../utils/link';\n\nconst debug = require('debug')('expo:export:generateStaticRoutes') as typeof console.log;\n\ntype Options = {\n outputDir: string;\n minify: boolean;\n exportServer: boolean;\n basePath: string;\n includeMaps: boolean;\n};\n\n/** @private */\nexport async function unstable_exportStaticAsync(projectRoot: string, options: Options) {\n Log.warn(\n `Experimental static rendering is enabled. ` +\n learnMore('https://docs.expo.dev/router/reference/static-rendering/')\n );\n\n // TODO: Prevent starting the watcher.\n const devServerManager = new DevServerManager(projectRoot, {\n minify: options.minify,\n mode: 'production',\n location: {},\n });\n await devServerManager.startAsync([\n {\n type: 'metro',\n options: {\n location: {},\n isExporting: true,\n },\n },\n ]);\n\n try {\n await exportFromServerAsync(projectRoot, devServerManager, options);\n } finally {\n await devServerManager.stopAsync();\n }\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 renderAsync,\n }: {\n manifest: any;\n renderAsync: (pathname: string) => Promise<string>;\n }\n): Promise<Map<string, string>> {\n // name : contents\n const files = new Map<string, string>();\n\n await Promise.all(\n getHtmlFiles({ manifest }).map(async (outputPath) => {\n const pathname = outputPath.replace(/(?:index)?\\.html$/, '');\n try {\n files.set(outputPath, '');\n const data = await renderAsync(pathname);\n files.set(outputPath, data);\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 return files;\n}\n\n/** Perform all fs commits */\nexport async function exportFromServerAsync(\n projectRoot: string,\n devServerManager: DevServerManager,\n { outputDir, basePath, exportServer, minify, includeMaps }: Options\n): Promise<void> {\n const { exp } = getConfig(projectRoot, { skipSDKVersionRequirement: true });\n const appDir = getRouterDirectoryWithManifest(projectRoot, exp);\n\n const injectFaviconTag = await getVirtualFaviconAssetsAsync(projectRoot, { outputDir, basePath });\n\n const devServer = devServerManager.getDefaultDevServer();\n assert(devServer instanceof MetroBundlerDevServer);\n\n const [resources, { manifest, renderAsync }] = await Promise.all([\n devServer.getStaticResourcesAsync({ mode: 'production', minify, includeMaps }),\n devServer.getStaticRenderFunctionAsync({\n mode: 'production',\n minify,\n }),\n ]);\n\n debug('Routes:\\n', inspect(manifest, { colors: true, depth: null }));\n\n const files = await getFilesToExportFromServerAsync(projectRoot, {\n manifest,\n async renderAsync(pathname: string) {\n const template = await renderAsync(pathname);\n let html = await devServer.composeResourcesWithHtml({\n mode: 'production',\n resources,\n template,\n basePath,\n });\n\n if (injectFaviconTag) {\n html = injectFaviconTag(html);\n }\n\n return html;\n },\n });\n\n resources.forEach((resource) => {\n files.set(\n resource.filename,\n modifyBundlesWithSourceMaps(resource.filename, resource.source, includeMaps)\n );\n });\n\n if (exportServer) {\n const apiRoutes = await exportApiRoutesAsync({ outputDir, server: devServer, appDir });\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 } else {\n warnPossibleInvalidExportType(appDir);\n }\n\n fs.mkdirSync(path.join(outputDir), { recursive: true });\n\n Log.log('');\n Log.log(chalk.bold`Exporting ${files.size} files:`);\n await Promise.all(\n [...files.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(async ([file, contents]) => {\n const length = Buffer.byteLength(contents, 'utf8');\n Log.log(file, chalk.gray`(${prettyBytes(length)})`);\n const outputPath = path.join(outputDir, file);\n await fs.promises.mkdir(path.dirname(outputPath), { recursive: true });\n await fs.promises.writeFile(outputPath, contents);\n })\n );\n Log.log('');\n}\n\nexport function modifyBundlesWithSourceMaps(\n filename: string,\n source: string,\n includeMaps: boolean\n): string {\n if (filename.endsWith('.js')) {\n // If the bundle ends with source map URLs then update them to point to the correct location.\n\n // TODO: basePath support\n const normalizedFilename = '/' + filename.replace(/^\\/+/, '');\n //# sourceMappingURL=//localhost:8085/index.map?platform=web&dev=false&hot=false&lazy=true&minify=true&resolver.environment=client&transform.environment=client&serializer.output=static\n //# sourceURL=http://localhost:8085/index.bundle//&platform=web&dev=false&hot=false&lazy=true&minify=true&resolver.environment=client&transform.environment=client&serializer.output=static\n return source.replace(/^\\/\\/# (sourceMappingURL|sourceURL)=.*$/gm, (...props) => {\n if (includeMaps) {\n if (props[1] === 'sourceURL') {\n return `//# ${props[1]}=` + normalizedFilename;\n } else if (props[1] === 'sourceMappingURL') {\n const mapName = normalizedFilename + '.map';\n return `//# ${props[1]}=` + mapName;\n }\n }\n return '';\n });\n }\n return source;\n}\n\nexport function getHtmlFiles({ manifest }: { manifest: any }): string[] {\n const htmlFiles = new Set<string>();\n\n function traverseScreens(screens: string | { screens: any; path: string }, basePath = '') {\n for (const value of Object.values(screens)) {\n if (typeof value === 'string') {\n let filePath = basePath + value;\n if (value === '') {\n filePath =\n basePath === ''\n ? 'index'\n : basePath.endsWith('/')\n ? basePath + 'index'\n : basePath.slice(0, -1);\n }\n // TODO: Dedupe requests for alias routes.\n addOptionalGroups(filePath);\n } else if (typeof value === 'object' && value?.screens) {\n const newPath = basePath + value.path + '/';\n traverseScreens(value.screens, newPath);\n }\n }\n }\n\n function addOptionalGroups(path: string) {\n const variations = getPathVariations(path);\n for (const variation of variations) {\n htmlFiles.add(variation);\n }\n }\n\n traverseScreens(manifest.screens);\n\n return Array.from(htmlFiles).map((value) => {\n const parts = value.split('/');\n // Replace `:foo` with `[foo]` and `*foo` with `[...foo]`\n const partsWithGroups = parts.map((part) => {\n if (part.startsWith(':')) {\n return `[${part.slice(1)}]`;\n } else if (part.startsWith('*')) {\n return `[...${part.slice(1)}]`;\n }\n return part;\n });\n return partsWithGroups.join('/') + '.html';\n });\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>([routePath]);\n const segments = routePath.split('/');\n\n function generateVariations(segments: string[], index: number): void {\n if (index >= segments.length) {\n return;\n }\n\n const newSegments = [...segments];\n while (\n index < newSegments.length &&\n matchGroupName(newSegments[index]) &&\n newSegments.length > 1\n ) {\n newSegments.splice(index, 1);\n variations.add(newSegments.join('/'));\n generateVariations(newSegments, index + 1);\n }\n\n generateVariations(segments, index + 1);\n }\n\n generateVariations(segments, 0);\n\n return Array.from(variations);\n}\n\nasync function exportApiRoutesAsync({\n outputDir,\n server,\n appDir,\n}: {\n outputDir: string;\n server: MetroBundlerDevServer;\n appDir: string;\n}): Promise<Map<string, string>> {\n const funcDir = path.join(outputDir, '_expo/functions');\n fs.mkdirSync(path.join(funcDir), { recursive: true });\n\n const [manifest, files] = await Promise.all([\n server.getExpoRouterRoutesManifestAsync({\n appDir,\n }),\n server\n .exportExpoRouterApiRoutesAsync({\n mode: 'production',\n appDir,\n })\n .then((routes) => {\n const files = new Map<string, string>();\n for (const [route, contents] of routes) {\n files.set(path.join('_expo/functions', route), contents);\n }\n return files;\n }),\n ]);\n\n Log.log(chalk.bold`Exporting ${files.size} API Routes.`);\n\n files.set('_expo/routes.json', JSON.stringify(manifest, null, 2));\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"],"names":["unstable_exportStaticAsync","getFilesToExportFromServerAsync","exportFromServerAsync","modifyBundlesWithSourceMaps","getHtmlFiles","getPathVariations","debug","require","projectRoot","options","Log","warn","learnMore","devServerManager","DevServerManager","minify","mode","location","startAsync","type","isExporting","stopAsync","matchGroupName","name","match","manifest","renderAsync","files","Map","Promise","all","map","outputPath","pathname","replace","set","data","e","logMetroErrorAsync","error","Error","outputDir","basePath","exportServer","includeMaps","exp","getConfig","skipSDKVersionRequirement","appDir","getRouterDirectoryWithManifest","injectFaviconTag","getVirtualFaviconAssetsAsync","devServer","getDefaultDevServer","assert","MetroBundlerDevServer","resources","getStaticResourcesAsync","getStaticRenderFunctionAsync","inspect","colors","depth","template","html","composeResourcesWithHtml","forEach","resource","filename","source","apiRoutes","exportApiRoutesAsync","server","route","contents","warnPossibleInvalidExportType","fs","mkdirSync","path","join","recursive","log","chalk","bold","size","entries","sort","a","b","localeCompare","file","length","Buffer","byteLength","gray","prettyBytes","promises","mkdir","dirname","writeFile","endsWith","normalizedFilename","props","mapName","htmlFiles","Set","traverseScreens","screens","value","Object","values","filePath","slice","addOptionalGroups","newPath","variations","variation","add","Array","from","parts","split","partsWithGroups","part","startsWith","routePath","segments","generateVariations","index","newSegments","splice","funcDir","getExpoRouterRoutesManifestAsync","exportExpoRouterApiRoutesAsync","then","routes","JSON","stringify","getApiRoutesForDirectory","yellow","v","relative"],"mappings":"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"}
|
|
@@ -21,7 +21,7 @@ function getUserDefinedFaviconFile(projectRoot) {
|
|
|
21
21
|
"./favicon.ico"
|
|
22
22
|
]);
|
|
23
23
|
}
|
|
24
|
-
async function getVirtualFaviconAssetsAsync(projectRoot, outputDir) {
|
|
24
|
+
async function getVirtualFaviconAssetsAsync(projectRoot, { basePath , outputDir }) {
|
|
25
25
|
const existing = getUserDefinedFaviconFile(projectRoot);
|
|
26
26
|
if (existing) {
|
|
27
27
|
debug("Using user-defined favicon.ico file.");
|
|
@@ -38,13 +38,13 @@ async function getVirtualFaviconAssetsAsync(projectRoot, outputDir) {
|
|
|
38
38
|
debug("Writing asset to disk: " + assetPath);
|
|
39
39
|
return _fs.default.promises.writeFile(assetPath, asset.source);
|
|
40
40
|
}));
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return html;
|
|
41
|
+
function injectFaviconTag(html) {
|
|
42
|
+
if (!html.includes("</head>")) {
|
|
43
|
+
return html;
|
|
44
|
+
}
|
|
45
|
+
return html.replace("</head>", `<link rel="shortcut icon" href="${basePath}/favicon.ico" /></head>`);
|
|
46
46
|
}
|
|
47
|
-
return
|
|
47
|
+
return injectFaviconTag;
|
|
48
48
|
}
|
|
49
49
|
async function getFaviconFromExpoConfigAsync(projectRoot) {
|
|
50
50
|
var ref;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/export/favicon.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport { generateFaviconAsync, generateImageAsync } from '@expo/image-utils';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { getUserDefinedFile } from './publicFolder';\n\nconst debug = require('debug')('expo:favicon') as typeof console.log;\n\n/** @returns the file system path for a user-defined favicon.ico file in the public folder. */\nexport function getUserDefinedFaviconFile(projectRoot: string): string | null {\n return getUserDefinedFile(projectRoot, ['./favicon.ico']);\n}\n\nexport async function getVirtualFaviconAssetsAsync(\n projectRoot: string,\n outputDir: string\n): Promise<((html: string) => string) | null> {\n const existing = getUserDefinedFaviconFile(projectRoot);\n if (existing) {\n debug('Using user-defined favicon.ico file.');\n return null;\n }\n\n const data = await getFaviconFromExpoConfigAsync(projectRoot);\n\n if (!data) {\n return null;\n }\n\n await Promise.all(\n [data].map((asset) => {\n const assetPath = path.join(outputDir, asset.path);\n debug('Writing asset to disk: ' + assetPath);\n return fs.promises.writeFile(assetPath, asset.source);\n })\n );\n\n
|
|
1
|
+
{"version":3,"sources":["../../../src/export/favicon.ts"],"sourcesContent":["import { getConfig } from '@expo/config';\nimport { generateFaviconAsync, generateImageAsync } from '@expo/image-utils';\nimport fs from 'fs';\nimport path from 'path';\n\nimport { getUserDefinedFile } from './publicFolder';\n\nconst debug = require('debug')('expo:favicon') as typeof console.log;\n\n/** @returns the file system path for a user-defined favicon.ico file in the public folder. */\nexport function getUserDefinedFaviconFile(projectRoot: string): string | null {\n return getUserDefinedFile(projectRoot, ['./favicon.ico']);\n}\n\nexport async function getVirtualFaviconAssetsAsync(\n projectRoot: string,\n { basePath, outputDir }: { outputDir: string; basePath: string }\n): Promise<((html: string) => string) | null> {\n const existing = getUserDefinedFaviconFile(projectRoot);\n if (existing) {\n debug('Using user-defined favicon.ico file.');\n return null;\n }\n\n const data = await getFaviconFromExpoConfigAsync(projectRoot);\n\n if (!data) {\n return null;\n }\n\n await Promise.all(\n [data].map((asset) => {\n const assetPath = path.join(outputDir, asset.path);\n debug('Writing asset to disk: ' + assetPath);\n return fs.promises.writeFile(assetPath, asset.source);\n })\n );\n\n function injectFaviconTag(html: string): string {\n if (!html.includes('</head>')) {\n return html;\n }\n return html.replace(\n '</head>',\n `<link rel=\"shortcut icon\" href=\"${basePath}/favicon.ico\" /></head>`\n );\n }\n\n return injectFaviconTag;\n}\n\nexport async function getFaviconFromExpoConfigAsync(projectRoot: string) {\n const { exp } = getConfig(projectRoot);\n\n const src = exp.web?.favicon ?? null;\n if (!src) {\n return null;\n }\n\n const dims = [16, 32, 48];\n const cacheType = 'favicon';\n\n const size = dims[dims.length - 1];\n const { source } = await generateImageAsync(\n { projectRoot, cacheType },\n {\n resizeMode: 'contain',\n src,\n backgroundColor: 'transparent',\n width: size,\n height: size,\n name: `favicon-${size}.png`,\n }\n );\n\n const faviconBuffer = await generateFaviconAsync(source, dims);\n\n return { source: faviconBuffer, path: 'favicon.ico' };\n}\n"],"names":["getUserDefinedFaviconFile","getVirtualFaviconAssetsAsync","getFaviconFromExpoConfigAsync","debug","require","projectRoot","getUserDefinedFile","basePath","outputDir","existing","data","Promise","all","map","asset","assetPath","path","join","fs","promises","writeFile","source","injectFaviconTag","html","includes","replace","exp","getConfig","src","web","favicon","dims","cacheType","size","length","generateImageAsync","resizeMode","backgroundColor","width","height","name","faviconBuffer","generateFaviconAsync"],"mappings":"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"}
|
|
@@ -5,34 +5,33 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
exports.bundleAsync = bundleAsync;
|
|
6
6
|
exports.getAssets = getAssets;
|
|
7
7
|
var _config = require("@expo/config");
|
|
8
|
-
var _hermesBundler = require("@expo/dev-server/build/HermesBundler");
|
|
9
|
-
var _importMetroFromProject = require("@expo/dev-server/build/metro/importMetroFromProject");
|
|
10
8
|
var _chalk = _interopRequireDefault(require("chalk"));
|
|
11
9
|
var _getAssets = _interopRequireDefault(require("metro/src/DeltaBundler/Serializers/getAssets"));
|
|
12
10
|
var _splitBundleOptions = _interopRequireDefault(require("metro/src/lib/splitBundleOptions"));
|
|
11
|
+
var _exportHermes = require("./exportHermes");
|
|
13
12
|
var _getCssModulesFromBundler = require("../start/server/metro/getCssModulesFromBundler");
|
|
14
13
|
var _instantiateMetro = require("../start/server/metro/instantiateMetro");
|
|
14
|
+
var _resolveFromProject = require("../start/server/metro/resolveFromProject");
|
|
15
15
|
function _interopRequireDefault(obj) {
|
|
16
16
|
return obj && obj.__esModule ? obj : {
|
|
17
17
|
default: obj
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
20
|
let nextBuildID = 0;
|
|
21
|
-
// Fork of @expo/dev-server bundleAsync to add Metro logging back.
|
|
22
21
|
async function assertEngineMismatchAsync(projectRoot, exp, platform) {
|
|
23
|
-
const isHermesManaged = (0,
|
|
22
|
+
const isHermesManaged = (0, _exportHermes).isEnableHermesManaged(exp, platform);
|
|
24
23
|
const paths = (0, _config).getConfigFilePaths(projectRoot);
|
|
25
24
|
var _dynamicConfigPath, ref;
|
|
26
25
|
const configFilePath = (ref = (_dynamicConfigPath = paths.dynamicConfigPath) != null ? _dynamicConfigPath : paths.staticConfigPath) != null ? ref : "app.json";
|
|
27
|
-
await (0,
|
|
26
|
+
await (0, _exportHermes).maybeThrowFromInconsistentEngineAsync(projectRoot, configFilePath, platform, isHermesManaged);
|
|
28
27
|
}
|
|
29
28
|
async function bundleAsync(projectRoot, expoConfig, options, bundles) {
|
|
30
29
|
// Assert early so the user doesn't have to wait until bundling is complete to find out that
|
|
31
30
|
// Hermes won't be available.
|
|
32
31
|
await Promise.all(bundles.map(({ platform })=>assertEngineMismatchAsync(projectRoot, expoConfig, platform)
|
|
33
32
|
));
|
|
34
|
-
const metro = (0,
|
|
35
|
-
const Server = (0,
|
|
33
|
+
const metro = (0, _resolveFromProject).importMetroFromProject(projectRoot);
|
|
34
|
+
const Server = (0, _resolveFromProject).importMetroServerFromProject(projectRoot);
|
|
36
35
|
const { config , reporter } = await (0, _instantiateMetro).loadMetroConfigAsync(projectRoot, options, {
|
|
37
36
|
exp: expoConfig,
|
|
38
37
|
isExporting: true
|
|
@@ -42,7 +41,7 @@ async function bundleAsync(projectRoot, expoConfig, options, bundles) {
|
|
|
42
41
|
});
|
|
43
42
|
const buildAsync = async (bundle)=>{
|
|
44
43
|
const buildID = `bundle_${nextBuildID++}_${bundle.platform}`;
|
|
45
|
-
const isHermes = (0,
|
|
44
|
+
const isHermes = (0, _exportHermes).isEnableHermesManaged(expoConfig, bundle.platform);
|
|
46
45
|
var _dev, _minify;
|
|
47
46
|
const bundleOptions = {
|
|
48
47
|
...Server.DEFAULT_BUNDLE_OPTIONS,
|
|
@@ -78,7 +77,6 @@ async function bundleAsync(projectRoot, expoConfig, options, bundles) {
|
|
|
78
77
|
const { code , map } = await metroServer.build(bundleOptions);
|
|
79
78
|
const [assets, css] = await Promise.all([
|
|
80
79
|
getAssets(metroServer, bundleOptions),
|
|
81
|
-
// metroServer.getAssets(bundleOptions),
|
|
82
80
|
(0, _getCssModulesFromBundler).getCssModulesFromBundler(config, metroServer.getBundler(), bundleOptions),
|
|
83
81
|
]);
|
|
84
82
|
reporter.update({
|
|
@@ -101,7 +99,7 @@ async function bundleAsync(projectRoot, expoConfig, options, bundles) {
|
|
|
101
99
|
};
|
|
102
100
|
const maybeAddHermesBundleAsync = async (bundle, bundleOutput)=>{
|
|
103
101
|
const { platform } = bundle;
|
|
104
|
-
const isHermesManaged = (0,
|
|
102
|
+
const isHermesManaged = (0, _exportHermes).isEnableHermesManaged(expoConfig, platform);
|
|
105
103
|
if (isHermesManaged) {
|
|
106
104
|
const platformTag = _chalk.default.bold({
|
|
107
105
|
ios: "iOS",
|
|
@@ -110,7 +108,7 @@ async function bundleAsync(projectRoot, expoConfig, options, bundles) {
|
|
|
110
108
|
}[platform] || platform);
|
|
111
109
|
reporter.terminal.log(`${platformTag} Building Hermes bytecode for the bundle`);
|
|
112
110
|
var _minify;
|
|
113
|
-
const hermesBundleOutput = await (0,
|
|
111
|
+
const hermesBundleOutput = await (0, _exportHermes).buildHermesBundleAsync(projectRoot, bundleOutput.code, bundleOutput.map, (_minify = bundle.minify) != null ? _minify : !bundle.dev);
|
|
114
112
|
bundleOutput.hermesBytecodeBundle = hermesBundleOutput.hbc;
|
|
115
113
|
bundleOutput.hermesSourcemap = hermesBundleOutput.sourcemap;
|
|
116
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/export/fork-bundleAsync.ts"],"sourcesContent":["import { ExpoConfig, getConfigFilePaths, Platform } from '@expo/config';\nimport {\n buildHermesBundleAsync,\n isEnableHermesManaged,\n maybeThrowFromInconsistentEngineAsync,\n} from '@expo/dev-server/build/HermesBundler';\nimport {\n importMetroFromProject,\n importMetroServerFromProject,\n} from '@expo/dev-server/build/metro/importMetroFromProject';\nimport type { LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport Metro, { AssetData } from 'metro';\nimport getMetroAssets from 'metro/src/DeltaBundler/Serializers/getAssets';\nimport splitBundleOptions from 'metro/src/lib/splitBundleOptions';\nimport type { BundleOptions as MetroBundleOptions } from 'metro/src/shared/types';\nimport { ConfigT } from 'metro-config';\n\nimport { CSSAsset, getCssModulesFromBundler } from '../start/server/metro/getCssModulesFromBundler';\nimport { loadMetroConfigAsync } from '../start/server/metro/instantiateMetro';\n\nexport type MetroDevServerOptions = LoadOptions & {\n logger: import('@expo/bunyan');\n quiet?: boolean;\n};\nexport type BundleOptions = {\n entryPoint: string;\n platform: 'android' | 'ios' | 'web';\n dev?: boolean;\n minify?: boolean;\n sourceMapUrl?: string;\n};\nexport type BundleAssetWithFileHashes = Metro.AssetData & {\n fileHashes: string[]; // added by the hashAssets asset plugin\n};\nexport type BundleOutput = {\n code: string;\n map?: string;\n hermesBytecodeBundle?: Uint8Array;\n hermesSourcemap?: string;\n css: CSSAsset[];\n assets: readonly BundleAssetWithFileHashes[];\n};\n\nlet nextBuildID = 0;\n\n// Fork of @expo/dev-server bundleAsync to add Metro logging back.\n\nasync function assertEngineMismatchAsync(projectRoot: string, exp: ExpoConfig, platform: Platform) {\n const isHermesManaged = isEnableHermesManaged(exp, platform);\n\n const paths = getConfigFilePaths(projectRoot);\n const configFilePath = paths.dynamicConfigPath ?? paths.staticConfigPath ?? 'app.json';\n await maybeThrowFromInconsistentEngineAsync(\n projectRoot,\n configFilePath,\n platform,\n isHermesManaged\n );\n}\n\nexport async function bundleAsync(\n projectRoot: string,\n expoConfig: ExpoConfig,\n options: MetroDevServerOptions,\n bundles: BundleOptions[]\n): Promise<BundleOutput[]> {\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 await Promise.all(\n bundles.map(({ platform }) => assertEngineMismatchAsync(projectRoot, expoConfig, platform))\n );\n\n const metro = importMetroFromProject(projectRoot);\n const Server = importMetroServerFromProject(projectRoot);\n\n const { config, reporter } = await loadMetroConfigAsync(projectRoot, options, {\n exp: expoConfig,\n isExporting: true,\n });\n\n const metroServer = await metro.runMetro(config, {\n watch: false,\n });\n\n const buildAsync = async (bundle: BundleOptions): Promise<BundleOutput> => {\n const buildID = `bundle_${nextBuildID++}_${bundle.platform}`;\n const isHermes = isEnableHermesManaged(expoConfig, bundle.platform);\n const bundleOptions: MetroBundleOptions = {\n ...Server.DEFAULT_BUNDLE_OPTIONS,\n bundleType: 'bundle',\n platform: bundle.platform,\n entryFile: bundle.entryPoint,\n dev: bundle.dev ?? false,\n minify: !isHermes && (bundle.minify ?? !bundle.dev),\n inlineSourceMap: false,\n sourceMapUrl: bundle.sourceMapUrl,\n createModuleIdFactory: config.serializer.createModuleIdFactory,\n onProgress: (transformedFileCount: number, totalFileCount: number) => {\n if (!options.quiet) {\n reporter.update({\n buildID,\n type: 'bundle_transform_progressed',\n transformedFileCount,\n totalFileCount,\n });\n }\n },\n };\n const bundleDetails = {\n ...bundleOptions,\n buildID,\n };\n reporter.update({\n buildID,\n type: 'bundle_build_started',\n bundleDetails,\n });\n try {\n const { code, map } = await metroServer.build(bundleOptions);\n const [assets, css] = await Promise.all([\n getAssets(metroServer, bundleOptions),\n // metroServer.getAssets(bundleOptions),\n getCssModulesFromBundler(config, metroServer.getBundler(), bundleOptions),\n ]);\n\n reporter.update({\n buildID,\n type: 'bundle_build_done',\n });\n return { code, map, assets: assets as readonly BundleAssetWithFileHashes[], css };\n } catch (error) {\n reporter.update({\n buildID,\n type: 'bundle_build_failed',\n });\n\n throw error;\n }\n };\n\n const maybeAddHermesBundleAsync = async (\n bundle: BundleOptions,\n bundleOutput: BundleOutput\n ): Promise<BundleOutput> => {\n const { platform } = bundle;\n const isHermesManaged = isEnableHermesManaged(expoConfig, platform);\n if (isHermesManaged) {\n const platformTag = chalk.bold(\n { ios: 'iOS', android: 'Android', web: 'Web' }[platform] || platform\n );\n\n reporter.terminal.log(`${platformTag} Building Hermes bytecode for the bundle`);\n\n const hermesBundleOutput = await buildHermesBundleAsync(\n projectRoot,\n bundleOutput.code,\n bundleOutput.map!,\n bundle.minify ?? !bundle.dev\n );\n bundleOutput.hermesBytecodeBundle = hermesBundleOutput.hbc;\n bundleOutput.hermesSourcemap = hermesBundleOutput.sourcemap;\n }\n return bundleOutput;\n };\n\n try {\n const intermediateOutputs = await Promise.all(bundles.map((bundle) => buildAsync(bundle)));\n const bundleOutputs: BundleOutput[] = [];\n for (let i = 0; i < bundles.length; ++i) {\n // hermesc does not support parallel building even we spawn processes.\n // we should build them sequentially.\n bundleOutputs.push(await maybeAddHermesBundleAsync(bundles[i], intermediateOutputs[i]));\n }\n return bundleOutputs;\n } catch (error) {\n // New line so errors don't show up inline with the progress bar\n console.log('');\n throw error;\n } finally {\n metroServer.end();\n }\n}\n\n// Forked out of Metro because the `this._getServerRootDir()` doesn't match the development\n// behavior.\nexport async function getAssets(\n metro: Metro.Server,\n options: MetroBundleOptions\n): Promise<readonly AssetData[]> {\n const { entryFile, onProgress, resolverOptions, transformOptions } = splitBundleOptions(options);\n\n // @ts-expect-error: _bundler isn't exposed on the type.\n const dependencies = await metro._bundler.getDependencies(\n [entryFile],\n transformOptions,\n resolverOptions,\n { onProgress, shallow: false, lazy: false }\n );\n\n // @ts-expect-error\n const _config = metro._config as ConfigT;\n\n return await getMetroAssets(dependencies, {\n processModuleFilter: _config.serializer.processModuleFilter,\n assetPlugins: _config.transformer.assetPlugins,\n platform: transformOptions.platform!,\n projectRoot: _config.projectRoot, // this._getServerRootDir(),\n publicPath: _config.transformer.publicPath,\n });\n}\n"],"names":["bundleAsync","getAssets","nextBuildID","assertEngineMismatchAsync","projectRoot","exp","platform","isHermesManaged","isEnableHermesManaged","paths","getConfigFilePaths","configFilePath","dynamicConfigPath","staticConfigPath","maybeThrowFromInconsistentEngineAsync","expoConfig","options","bundles","Promise","all","map","metro","importMetroFromProject","Server","importMetroServerFromProject","config","reporter","loadMetroConfigAsync","isExporting","metroServer","runMetro","watch","buildAsync","bundle","buildID","isHermes","bundleOptions","DEFAULT_BUNDLE_OPTIONS","bundleType","entryFile","entryPoint","dev","minify","inlineSourceMap","sourceMapUrl","createModuleIdFactory","serializer","onProgress","transformedFileCount","totalFileCount","quiet","update","type","bundleDetails","code","build","assets","css","getCssModulesFromBundler","getBundler","error","maybeAddHermesBundleAsync","bundleOutput","platformTag","chalk","bold","ios","android","web","terminal","log","hermesBundleOutput","buildHermesBundleAsync","hermesBytecodeBundle","hbc","hermesSourcemap","sourcemap","intermediateOutputs","bundleOutputs","i","length","push","console","end","resolverOptions","transformOptions","splitBundleOptions","dependencies","_bundler","getDependencies","shallow","lazy","_config","getMetroAssets","processModuleFilter","assetPlugins","transformer","publicPath"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/export/fork-bundleAsync.ts"],"sourcesContent":["import { ExpoConfig, getConfigFilePaths, Platform } from '@expo/config';\nimport type { LoadOptions } from '@expo/metro-config';\nimport chalk from 'chalk';\nimport Metro, { AssetData } from 'metro';\nimport getMetroAssets from 'metro/src/DeltaBundler/Serializers/getAssets';\nimport splitBundleOptions from 'metro/src/lib/splitBundleOptions';\nimport type { BundleOptions as MetroBundleOptions } from 'metro/src/shared/types';\nimport { ConfigT } from 'metro-config';\n\nimport {\n buildHermesBundleAsync,\n isEnableHermesManaged,\n maybeThrowFromInconsistentEngineAsync,\n} from './exportHermes';\nimport { CSSAsset, getCssModulesFromBundler } from '../start/server/metro/getCssModulesFromBundler';\nimport { loadMetroConfigAsync } from '../start/server/metro/instantiateMetro';\nimport {\n importMetroFromProject,\n importMetroServerFromProject,\n} from '../start/server/metro/resolveFromProject';\n\nexport type MetroDevServerOptions = LoadOptions & {\n quiet?: boolean;\n};\nexport type BundleOptions = {\n entryPoint: string;\n platform: 'android' | 'ios' | 'web';\n dev?: boolean;\n minify?: boolean;\n sourceMapUrl?: string;\n};\nexport type BundleAssetWithFileHashes = Metro.AssetData & {\n fileHashes: string[]; // added by the hashAssets asset plugin\n};\nexport type BundleOutput = {\n code: string;\n map?: string;\n hermesBytecodeBundle?: Uint8Array;\n hermesSourcemap?: string;\n css: CSSAsset[];\n assets: readonly BundleAssetWithFileHashes[];\n};\n\nlet nextBuildID = 0;\n\nasync function assertEngineMismatchAsync(projectRoot: string, exp: ExpoConfig, platform: Platform) {\n const isHermesManaged = isEnableHermesManaged(exp, platform);\n\n const paths = getConfigFilePaths(projectRoot);\n const configFilePath = paths.dynamicConfigPath ?? paths.staticConfigPath ?? 'app.json';\n await maybeThrowFromInconsistentEngineAsync(\n projectRoot,\n configFilePath,\n platform,\n isHermesManaged\n );\n}\n\nexport async function bundleAsync(\n projectRoot: string,\n expoConfig: ExpoConfig,\n options: MetroDevServerOptions,\n bundles: BundleOptions[]\n): Promise<BundleOutput[]> {\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 await Promise.all(\n bundles.map(({ platform }) => assertEngineMismatchAsync(projectRoot, expoConfig, platform))\n );\n\n const metro = importMetroFromProject(projectRoot);\n const Server = importMetroServerFromProject(projectRoot);\n\n const { config, reporter } = await loadMetroConfigAsync(projectRoot, options, {\n exp: expoConfig,\n isExporting: true,\n });\n\n const metroServer = await metro.runMetro(config, {\n watch: false,\n });\n\n const buildAsync = async (bundle: BundleOptions): Promise<BundleOutput> => {\n const buildID = `bundle_${nextBuildID++}_${bundle.platform}`;\n const isHermes = isEnableHermesManaged(expoConfig, bundle.platform);\n const bundleOptions: MetroBundleOptions = {\n ...Server.DEFAULT_BUNDLE_OPTIONS,\n bundleType: 'bundle',\n platform: bundle.platform,\n entryFile: bundle.entryPoint,\n dev: bundle.dev ?? false,\n minify: !isHermes && (bundle.minify ?? !bundle.dev),\n inlineSourceMap: false,\n sourceMapUrl: bundle.sourceMapUrl,\n createModuleIdFactory: config.serializer.createModuleIdFactory,\n onProgress: (transformedFileCount: number, totalFileCount: number) => {\n if (!options.quiet) {\n reporter.update({\n buildID,\n type: 'bundle_transform_progressed',\n transformedFileCount,\n totalFileCount,\n });\n }\n },\n };\n const bundleDetails = {\n ...bundleOptions,\n buildID,\n };\n reporter.update({\n buildID,\n type: 'bundle_build_started',\n bundleDetails,\n });\n try {\n const { code, map } = await metroServer.build(bundleOptions);\n const [assets, css] = await Promise.all([\n getAssets(metroServer, bundleOptions),\n getCssModulesFromBundler(config, metroServer.getBundler(), bundleOptions),\n ]);\n\n reporter.update({\n buildID,\n type: 'bundle_build_done',\n });\n return { code, map, assets: assets as readonly BundleAssetWithFileHashes[], css };\n } catch (error) {\n reporter.update({\n buildID,\n type: 'bundle_build_failed',\n });\n\n throw error;\n }\n };\n\n const maybeAddHermesBundleAsync = async (\n bundle: BundleOptions,\n bundleOutput: BundleOutput\n ): Promise<BundleOutput> => {\n const { platform } = bundle;\n const isHermesManaged = isEnableHermesManaged(expoConfig, platform);\n if (isHermesManaged) {\n const platformTag = chalk.bold(\n { ios: 'iOS', android: 'Android', web: 'Web' }[platform] || platform\n );\n\n reporter.terminal.log(`${platformTag} Building Hermes bytecode for the bundle`);\n\n const hermesBundleOutput = await buildHermesBundleAsync(\n projectRoot,\n bundleOutput.code,\n bundleOutput.map!,\n bundle.minify ?? !bundle.dev\n );\n bundleOutput.hermesBytecodeBundle = hermesBundleOutput.hbc;\n bundleOutput.hermesSourcemap = hermesBundleOutput.sourcemap;\n }\n return bundleOutput;\n };\n\n try {\n const intermediateOutputs = await Promise.all(bundles.map((bundle) => buildAsync(bundle)));\n const bundleOutputs: BundleOutput[] = [];\n for (let i = 0; i < bundles.length; ++i) {\n // hermesc does not support parallel building even we spawn processes.\n // we should build them sequentially.\n bundleOutputs.push(await maybeAddHermesBundleAsync(bundles[i], intermediateOutputs[i]));\n }\n return bundleOutputs;\n } catch (error) {\n // New line so errors don't show up inline with the progress bar\n console.log('');\n throw error;\n } finally {\n metroServer.end();\n }\n}\n\n// Forked out of Metro because the `this._getServerRootDir()` doesn't match the development\n// behavior.\nexport async function getAssets(\n metro: Metro.Server,\n options: MetroBundleOptions\n): Promise<readonly AssetData[]> {\n const { entryFile, onProgress, resolverOptions, transformOptions } = splitBundleOptions(options);\n\n // @ts-expect-error: _bundler isn't exposed on the type.\n const dependencies = await metro._bundler.getDependencies(\n [entryFile],\n transformOptions,\n resolverOptions,\n { onProgress, shallow: false, lazy: false }\n );\n\n // @ts-expect-error\n const _config = metro._config as ConfigT;\n\n return await getMetroAssets(dependencies, {\n processModuleFilter: _config.serializer.processModuleFilter,\n assetPlugins: _config.transformer.assetPlugins,\n platform: transformOptions.platform!,\n projectRoot: _config.projectRoot, // this._getServerRootDir(),\n publicPath: _config.transformer.publicPath,\n });\n}\n"],"names":["bundleAsync","getAssets","nextBuildID","assertEngineMismatchAsync","projectRoot","exp","platform","isHermesManaged","isEnableHermesManaged","paths","getConfigFilePaths","configFilePath","dynamicConfigPath","staticConfigPath","maybeThrowFromInconsistentEngineAsync","expoConfig","options","bundles","Promise","all","map","metro","importMetroFromProject","Server","importMetroServerFromProject","config","reporter","loadMetroConfigAsync","isExporting","metroServer","runMetro","watch","buildAsync","bundle","buildID","isHermes","bundleOptions","DEFAULT_BUNDLE_OPTIONS","bundleType","entryFile","entryPoint","dev","minify","inlineSourceMap","sourceMapUrl","createModuleIdFactory","serializer","onProgress","transformedFileCount","totalFileCount","quiet","update","type","bundleDetails","code","build","assets","css","getCssModulesFromBundler","getBundler","error","maybeAddHermesBundleAsync","bundleOutput","platformTag","chalk","bold","ios","android","web","terminal","log","hermesBundleOutput","buildHermesBundleAsync","hermesBytecodeBundle","hbc","hermesSourcemap","sourcemap","intermediateOutputs","bundleOutputs","i","length","push","console","end","resolverOptions","transformOptions","splitBundleOptions","dependencies","_bundler","getDependencies","shallow","lazy","_config","getMetroAssets","processModuleFilter","assetPlugins","transformer","publicPath"],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
exports.persistMetroAssetsAsync = persistMetroAssetsAsync;
|
|
6
|
+
exports.stripAssetPrefix = stripAssetPrefix;
|
|
7
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _log = require("../log");
|
|
10
|
+
function _interopRequireDefault(obj) {
|
|
11
|
+
return obj && obj.__esModule ? obj : {
|
|
12
|
+
default: obj
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function persistMetroAssetsAsync(assets, { platform , outputDirectory , basePath }) {
|
|
16
|
+
const files = assets.reduce((acc, asset)=>{
|
|
17
|
+
const validScales = new Set(filterPlatformAssetScales(platform, asset.scales));
|
|
18
|
+
asset.scales.forEach((scale, idx)=>{
|
|
19
|
+
if (!validScales.has(scale)) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
const src = asset.files[idx];
|
|
23
|
+
const dest = _path.default.join(outputDirectory, getAssetLocalPath(asset, {
|
|
24
|
+
scale,
|
|
25
|
+
basePath
|
|
26
|
+
}));
|
|
27
|
+
acc[src] = dest;
|
|
28
|
+
});
|
|
29
|
+
return acc;
|
|
30
|
+
}, {});
|
|
31
|
+
return copyAll(files);
|
|
32
|
+
}
|
|
33
|
+
function copyAll(filesToCopy) {
|
|
34
|
+
const queue = Object.keys(filesToCopy);
|
|
35
|
+
if (queue.length === 0) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
_log.Log.log(`Copying ${queue.length} asset files`);
|
|
39
|
+
return new Promise((resolve, reject)=>{
|
|
40
|
+
const copyNext = (error)=>{
|
|
41
|
+
if (error) {
|
|
42
|
+
return reject(error);
|
|
43
|
+
}
|
|
44
|
+
if (queue.length) {
|
|
45
|
+
// queue.length === 0 is checked in previous branch, so this is string
|
|
46
|
+
const src = queue.shift();
|
|
47
|
+
const dest = filesToCopy[src];
|
|
48
|
+
copy(src, dest, copyNext);
|
|
49
|
+
} else {
|
|
50
|
+
_log.Log.log("Persisted assets");
|
|
51
|
+
resolve();
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
copyNext();
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function copy(src, dest, callback) {
|
|
58
|
+
_fs.default.mkdir(_path.default.dirname(dest), {
|
|
59
|
+
recursive: true
|
|
60
|
+
}, (err)=>{
|
|
61
|
+
if (err) {
|
|
62
|
+
callback(err);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
_fs.default.createReadStream(src).pipe(_fs.default.createWriteStream(dest)).on("finish", callback);
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
const ALLOWED_SCALES = {
|
|
69
|
+
ios: [
|
|
70
|
+
1,
|
|
71
|
+
2,
|
|
72
|
+
3
|
|
73
|
+
]
|
|
74
|
+
};
|
|
75
|
+
function filterPlatformAssetScales(platform, scales) {
|
|
76
|
+
const whitelist = ALLOWED_SCALES[platform];
|
|
77
|
+
if (!whitelist) {
|
|
78
|
+
return scales;
|
|
79
|
+
}
|
|
80
|
+
const result = scales.filter((scale)=>whitelist.includes(scale)
|
|
81
|
+
);
|
|
82
|
+
if (!result.length && scales.length) {
|
|
83
|
+
// No matching scale found, but there are some available. Ideally we don't
|
|
84
|
+
// want to be in this situation and should throw, but for now as a fallback
|
|
85
|
+
// let's just use the closest larger image
|
|
86
|
+
const maxScale = whitelist[whitelist.length - 1];
|
|
87
|
+
for (const scale of scales){
|
|
88
|
+
if (scale > maxScale) {
|
|
89
|
+
result.push(scale);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// There is no larger scales available, use the largest we have
|
|
94
|
+
if (!result.length) {
|
|
95
|
+
result.push(scales[scales.length - 1]);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
function getAssetLocalPath(asset, { basePath , scale }) {
|
|
101
|
+
const suffix = scale === 1 ? "" : `@${scale}x`;
|
|
102
|
+
const fileName = `${asset.name + suffix}.${asset.type}`;
|
|
103
|
+
const adjustedHttpServerLocation = stripAssetPrefix(asset.httpServerLocation, basePath);
|
|
104
|
+
return _path.default.join(// Assets can have relative paths outside of the project root.
|
|
105
|
+
// Replace `../` with `_` to make sure they don't end up outside of
|
|
106
|
+
// the expected assets directory.
|
|
107
|
+
adjustedHttpServerLocation.replace(/^\/+/g, "").replace(/\.\.\//g, "_"), fileName);
|
|
108
|
+
}
|
|
109
|
+
function stripAssetPrefix(path, basePath) {
|
|
110
|
+
path = path.replace(/\/assets\?export_path=(.*)/, "$1");
|
|
111
|
+
// TODO: Windows?
|
|
112
|
+
if (basePath) {
|
|
113
|
+
return path.replace(/^\/+/g, "").replace(new RegExp(`^${basePath.replace(/^\/+/g, "").replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d")}`, "g"), "");
|
|
114
|
+
}
|
|
115
|
+
return path;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
//# sourceMappingURL=persistMetroAssets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/export/persistMetroAssets.ts"],"sourcesContent":["import fs from 'fs';\nimport type { AssetData, AssetDataWithoutFiles } from 'metro';\nimport path from 'path';\n\nimport { Log } from '../log';\n\nexport function persistMetroAssetsAsync(\n assets: readonly AssetData[],\n {\n platform,\n outputDirectory,\n basePath,\n }: {\n platform: string;\n outputDirectory: string;\n basePath?: string;\n }\n) {\n const files = assets.reduce<Record<string, string>>((acc, asset) => {\n const validScales = new Set(filterPlatformAssetScales(platform, asset.scales));\n\n asset.scales.forEach((scale, idx) => {\n if (!validScales.has(scale)) {\n return;\n }\n const src = asset.files[idx];\n const dest = path.join(outputDirectory, getAssetLocalPath(asset, { scale, basePath }));\n acc[src] = dest;\n });\n return acc;\n }, {});\n\n return copyAll(files);\n}\n\nfunction copyAll(filesToCopy: Record<string, string>) {\n const queue = Object.keys(filesToCopy);\n if (queue.length === 0) {\n return;\n }\n\n Log.log(`Copying ${queue.length} asset files`);\n return new Promise<void>((resolve, reject) => {\n const copyNext = (error?: NodeJS.ErrnoException) => {\n if (error) {\n return reject(error);\n }\n if (queue.length) {\n // queue.length === 0 is checked in previous branch, so this is string\n const src = queue.shift() as string;\n const dest = filesToCopy[src];\n copy(src, dest, copyNext);\n } else {\n Log.log('Persisted assets');\n resolve();\n }\n };\n copyNext();\n });\n}\n\nfunction copy(src: string, dest: string, callback: (error: NodeJS.ErrnoException) => void): void {\n fs.mkdir(path.dirname(dest), { recursive: true }, (err?) => {\n if (err) {\n callback(err);\n return;\n }\n fs.createReadStream(src).pipe(fs.createWriteStream(dest)).on('finish', callback);\n });\n}\n\nconst ALLOWED_SCALES: { [key: string]: number[] } = {\n ios: [1, 2, 3],\n};\n\nfunction filterPlatformAssetScales(platform: string, scales: readonly number[]): readonly number[] {\n const whitelist: number[] = ALLOWED_SCALES[platform];\n if (!whitelist) {\n return scales;\n }\n const result = scales.filter((scale) => whitelist.includes(scale));\n if (!result.length && scales.length) {\n // No matching scale found, but there are some available. Ideally we don't\n // want to be in this situation and should throw, but for now as a fallback\n // let's just use the closest larger image\n const maxScale = whitelist[whitelist.length - 1];\n for (const scale of scales) {\n if (scale > maxScale) {\n result.push(scale);\n break;\n }\n }\n\n // There is no larger scales available, use the largest we have\n if (!result.length) {\n result.push(scales[scales.length - 1]);\n }\n }\n return result;\n}\n\nfunction getAssetLocalPath(\n asset: AssetDataWithoutFiles,\n { basePath, scale }: { basePath?: string; scale: number }\n): string {\n const suffix = scale === 1 ? '' : `@${scale}x`;\n const fileName = `${asset.name + suffix}.${asset.type}`;\n\n const adjustedHttpServerLocation = stripAssetPrefix(asset.httpServerLocation, basePath);\n return path.join(\n // Assets can have relative paths outside of the project root.\n // Replace `../` with `_` to make sure they don't end up outside of\n // the expected assets directory.\n adjustedHttpServerLocation.replace(/^\\/+/g, '').replace(/\\.\\.\\//g, '_'),\n fileName\n );\n}\n\nexport function stripAssetPrefix(path: string, basePath?: string) {\n path = path.replace(/\\/assets\\?export_path=(.*)/, '$1');\n\n // TODO: Windows?\n if (basePath) {\n return path.replace(/^\\/+/g, '').replace(\n new RegExp(\n `^${basePath\n .replace(/^\\/+/g, '')\n .replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&')\n .replace(/-/g, '\\\\x2d')}`,\n 'g'\n ),\n ''\n );\n }\n return path;\n}\n"],"names":["persistMetroAssetsAsync","stripAssetPrefix","assets","platform","outputDirectory","basePath","files","reduce","acc","asset","validScales","Set","filterPlatformAssetScales","scales","forEach","scale","idx","has","src","dest","path","join","getAssetLocalPath","copyAll","filesToCopy","queue","Object","keys","length","Log","log","Promise","resolve","reject","copyNext","error","shift","copy","callback","fs","mkdir","dirname","recursive","err","createReadStream","pipe","createWriteStream","on","ALLOWED_SCALES","ios","whitelist","result","filter","includes","maxScale","push","suffix","fileName","name","type","adjustedHttpServerLocation","httpServerLocation","replace","RegExp"],"mappings":"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"}
|