UNPKG

@expo/cli

Version:
285 lines (284 loc) 12.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "exportAppAsync", { enumerable: true, get: ()=>exportAppAsync }); function _config() { const data = require("@expo/config"); _config = function() { return data; }; return data; } function _assert() { const data = /*#__PURE__*/ _interopRequireDefault(require("assert")); _assert = function() { return data; }; return data; } function _chalk() { const data = /*#__PURE__*/ _interopRequireDefault(require("chalk")); _chalk = function() { return data; }; return data; } function _path() { const data = /*#__PURE__*/ _interopRequireDefault(require("path")); _path = function() { return data; }; return data; } const _createMetadataJson = require("./createMetadataJson"); const _exportAssets = require("./exportAssets"); const _exportHermes = require("./exportHermes"); const _exportStaticAsync = require("./exportStaticAsync"); const _favicon = require("./favicon"); const _getPublicExpoManifest = require("./getPublicExpoManifest"); const _publicFolder = require("./publicFolder"); const _saveAssets = require("./saveAssets"); const _writeContents = require("./writeContents"); const _log = /*#__PURE__*/ _interopRequireWildcard(require("../log")); const _webSupportProjectPrerequisite = require("../start/doctor/web/WebSupportProjectPrerequisite"); const _devServerManager = require("../start/server/DevServerManager"); const _metroBundlerDevServer = require("../start/server/metro/MetroBundlerDevServer"); const _router = require("../start/server/metro/router"); const _serializeHtml = require("../start/server/metro/serializeHtml"); const _manifestMiddleware = require("../start/server/middleware/ManifestMiddleware"); const _metroOptions = require("../start/server/middleware/metroOptions"); const _webTemplate = require("../start/server/webTemplate"); const _env = require("../utils/env"); const _nodeEnv = require("../utils/nodeEnv"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for(var key in obj){ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } async function exportAppAsync(projectRoot, { platforms , outputDir , clear , dev , dumpAssetmap , sourceMaps , minify , bytecode , maxWorkers }) { var ref; (0, _nodeEnv.setNodeEnv)(dev ? "development" : "production"); require("@expo/env").load(projectRoot); const projectConfig = (0, _config().getConfig)(projectRoot); const exp = await (0, _getPublicExpoManifest.getPublicExpoManifestAsync)(projectRoot, { // Web doesn't require validation. skipValidation: platforms.length === 1 && platforms[0] === "web" }); if (platforms.includes("web")) { await new _webSupportProjectPrerequisite.WebSupportProjectPrerequisite(projectRoot).assertAsync(); } var ref1; const useServerRendering = [ "static", "server" ].includes((ref1 = (ref = exp.web) == null ? void 0 : ref.output) != null ? ref1 : ""); const baseUrl = (0, _metroOptions.getBaseUrlFromExpoConfig)(exp); if (!bytecode && (platforms.includes("ios") || platforms.includes("android"))) { _log.warn(`Bytecode makes the app startup faster, disabling bytecode is highly discouraged and should only be used for debugging purposes.`); } // Print out logs if (baseUrl) { _log.log(); _log.log(_chalk().default.gray`Using (experimental) base path: ${baseUrl}`); // Warn if not using an absolute path. if (!baseUrl.startsWith("/")) { _log.log(_chalk().default.yellow` Base path does not start with a slash. Requests will not be absolute.`); } } const mode = dev ? "development" : "production"; const publicPath = _path().default.resolve(projectRoot, _env.env.EXPO_PUBLIC_FOLDER); const outputPath = _path().default.resolve(projectRoot, outputDir); // Write the JS bundles to disk, and get the bundle file names (this could change with async chunk loading support). const files = new Map(); const devServerManager = await _devServerManager.DevServerManager.startMetroAsync(projectRoot, { minify, mode, port: 8081, isExporting: true, location: {}, resetDevServer: clear, maxWorkers }); const devServer = devServerManager.getDefaultDevServer(); (0, _assert().default)(devServer instanceof _metroBundlerDevServer.MetroBundlerDevServer); const bundles = {}; const spaPlatforms = useServerRendering ? platforms.filter((platform)=>platform !== "web") : platforms; try { // NOTE(kitten): The public folder is currently always copied, regardless of targetDomain // split. Hence, there's another separate `copyPublicFolderAsync` call below for `web` await (0, _publicFolder.copyPublicFolderAsync)(publicPath, outputPath); // Can be empty during web-only SSG. if (spaPlatforms.length) { await Promise.all(spaPlatforms.map(async (platform)=>{ var ref; // Assert early so the user doesn't have to wait until bundling is complete to find out that // Hermes won't be available. const isHermes = (0, _exportHermes.isEnableHermesManaged)(exp, platform); if (isHermes) { await (0, _exportHermes.assertEngineMismatchAsync)(projectRoot, exp, platform); } // Run metro bundler and create the JS bundles/source maps. const bundle = await devServer.legacySinglePageExportBundleAsync({ platform, splitChunks: !_env.env.EXPO_NO_BUNDLE_SPLITTING && platform === "web", mainModuleName: (0, _manifestMiddleware.getEntryWithServerRoot)(projectRoot, { platform, pkg: projectConfig.pkg }), mode: dev ? "development" : "production", engine: isHermes ? "hermes" : undefined, serializerIncludeMaps: sourceMaps, bytecode: bytecode && isHermes, reactCompiler: !!((ref = exp.experiments) == null ? void 0 : ref.reactCompiler) }); bundles[platform] = bundle; (0, _saveAssets.getFilesFromSerialAssets)(bundle.artifacts, { includeSourceMaps: sourceMaps, files }); if (platform === "web") { // TODO: Unify with exportStaticAsync // TODO: Maybe move to the serializer. let html = await (0, _serializeHtml.serializeHtmlWithAssets)({ isExporting: true, resources: bundle.artifacts, template: await (0, _webTemplate.createTemplateHtmlFromExpoConfigAsync)(projectRoot, { scripts: [], cssLinks: [], exp: projectConfig.exp }), baseUrl }); // Add the favicon assets to the HTML. const modifyHtml = await (0, _favicon.getVirtualFaviconAssetsAsync)(projectRoot, { outputDir, baseUrl, files, exp: projectConfig.exp }); if (modifyHtml) { html = modifyHtml(html); } // Generate SPA-styled HTML file. // If web exists, then write the template HTML file. files.set("index.html", { contents: html, targetDomain: "client" }); } })); // TODO: Use same asset system across platforms again. const { assets , embeddedHashSet } = await (0, _exportAssets.exportAssetsAsync)(projectRoot, { files, exp, outputDir: outputPath, bundles, baseUrl }); if (dumpAssetmap) { _log.log("Creating asset map"); files.set("assetmap.json", { contents: JSON.stringify((0, _writeContents.createAssetMap)({ assets })) }); } const fileNames = Object.fromEntries(Object.entries(bundles).map(([platform, bundle])=>[ platform, bundle.artifacts.filter((asset)=>asset.type === "js").map((asset)=>asset.filename), ])); // build source maps if (sourceMaps) { _log.log("Preparing additional debugging files"); // If we output source maps, then add a debug HTML file which the user can open in // the web browser to inspect the output like web. files.set("debug.html", { contents: (0, _writeContents.createSourceMapDebugHtml)({ fileNames: Object.values(fileNames).flat() }) }); } // Generate a `metadata.json` for EAS Update. const contents = (0, _createMetadataJson.createMetadataJson)({ bundles, fileNames, embeddedHashSet }); files.set("metadata.json", { contents: JSON.stringify(contents) }); } // Additional web-only steps... if (platforms.includes("web") && useServerRendering) { var ref2, ref3; const exportServer = ((ref2 = exp.web) == null ? void 0 : ref2.output) === "server"; if (exportServer) { // TODO: Remove when this is abstracted into the files map await (0, _publicFolder.copyPublicFolderAsync)(publicPath, _path().default.resolve(outputPath, "client")); } await (0, _exportStaticAsync.exportFromServerAsync)(projectRoot, devServer, { mode, files, clear: !!clear, outputDir: outputPath, minify, baseUrl, includeSourceMaps: sourceMaps, routerRoot: (0, _router.getRouterDirectoryModuleIdWithManifest)(projectRoot, exp), reactCompiler: !!((ref3 = exp.experiments) == null ? void 0 : ref3.reactCompiler), exportServer, maxWorkers, isExporting: true, exp: projectConfig.exp }); } } finally{ await devServerManager.stopAsync(); } // Write all files at the end for unified logging. await (0, _saveAssets.persistMetroFilesAsync)(files, outputPath); } //# sourceMappingURL=exportApp.js.map