"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.action = action; exports.default = void 0; function _axios() { const data = _interopRequireDefault(require("axios")); _axios = function () { return data; }; return data; } function _crypto() { const data = _interopRequireDefault(require("crypto")); _crypto = function () { return data; }; return data; } function _fsExtra() { const data = _interopRequireDefault(require("fs-extra")); _fsExtra = function () { return data; }; return data; } function _validator() { const data = _interopRequireDefault(require("validator")); _validator = function () { return data; }; return data; } function _path() { const data = _interopRequireDefault(require("path")); _path = function () { return data; }; return data; } function _targz() { const data = _interopRequireDefault(require("targz")); _targz = function () { return data; }; return data; } function _xdl() { const data = require("@expo/xdl"); _xdl = function () { return data; }; return data; } function _log() { const data = _interopRequireDefault(require("../log")); _log = function () { return data; }; return data; } function _exit() { const data = require("../exit"); _exit = function () { return data; }; return data; } function _CommandError() { const data = _interopRequireDefault(require("../CommandError")); _CommandError = function () { return data; }; return data; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } async function action(projectDir, options = {}) { const outputPath = _path().default.resolve(projectDir, options.outputDir); if (_fsExtra().default.existsSync(outputPath)) { throw new (_CommandError().default)('OUTPUT_DIR_EXISTS', `Output directory ${outputPath} already exists. Aborting export.`); } if (!options.publicUrl) { throw new (_CommandError().default)('MISSING_PUBLIC_URL', 'Missing required option: --public-url'); } // If we are not in dev mode, ensure that url is https if (!options.dev && !_xdl().UrlUtils.isHttps(options.publicUrl)) { throw new (_CommandError().default)('INVALID_PUBLIC_URL', '--public-url must be a valid HTTPS URL.'); } else if (!_validator().default.isURL(options.publicUrl, { protocols: ['http', 'https'] })) { console.warn(`Dev Mode: publicUrl ${options.publicUrl} does not conform to HTTP format.`); } const status = await _xdl().Project.currentStatus(projectDir); let startedOurOwn = false; if (status !== 'running') { (0, _log().default)('Unable to find an existing Expo CLI instance for this directory, starting a new one...'); (0, _exit().installExitHooks)(projectDir); const startOpts = { reset: options.clear, nonPersistent: true }; if (options.maxWorkers) { startOpts.maxWorkers = options.maxWorkers; } (0, _log().default)('Exporting your app...'); await _xdl().Project.startAsync(projectDir, startOpts, !options.quiet); startedOurOwn = true; } // Make outputDir an absolute path if it isnt already const exportOptions = { dumpAssetmap: options.dumpAssetmap, dumpSourcemap: options.dumpSourcemap, isDev: options.dev }; const absoluteOutputDir = _path().default.resolve(process.cwd(), options.outputDir); await _xdl().Project.exportForAppHosting(projectDir, options.publicUrl, options.assetUrl, absoluteOutputDir, exportOptions); if (startedOurOwn) { (0, _log().default)('Terminating server processes.'); await _xdl().Project.stopAsync(projectDir); } // Merge src dirs/urls into a multimanifest if specified const mergeSrcDirs = []; // src urls were specified to merge in, so download and decompress them if (options.mergeSrcUrl.length > 0) { // delete .tmp if it exists and recreate it anew const tmpFolder = _path().default.resolve(projectDir, _path().default.join('.tmp')); await _fsExtra().default.remove(tmpFolder); await _fsExtra().default.ensureDir(tmpFolder); // Download the urls into a tmp dir const downloadDecompressPromises = options.mergeSrcUrl.map(async url => { // Add the absolute paths to srcDir const uniqFilename = `${_path().default.basename(url, '.tar.gz')}_${_crypto().default.randomBytes(16).toString('hex')}`; const tmpFileCompressed = _path().default.resolve(tmpFolder, uniqFilename + '_compressed'); const tmpFolderUncompressed = _path().default.resolve(tmpFolder, uniqFilename); await download(url, tmpFileCompressed); await decompress(tmpFileCompressed, tmpFolderUncompressed); // add the decompressed folder to be merged mergeSrcDirs.push(tmpFolderUncompressed); }); await Promise.all(downloadDecompressPromises); } // add any local src dirs to be merged mergeSrcDirs.push(...options.mergeSrcDir); if (mergeSrcDirs.length > 0) { const srcDirs = options.mergeSrcDir.concat(options.mergeSrcUrl).join(' '); (0, _log().default)(`Starting project merge of ${srcDirs} into ${options.outputDir}`); // Merge app distributions await _xdl().Project.mergeAppDistributions(projectDir, [...mergeSrcDirs, options.outputDir], // merge stuff in srcDirs and outputDir together options.outputDir); (0, _log().default)(`Project merge was successful. Your merged files can be found in ${options.outputDir}`); } (0, _log().default)(`Export was successful. Your exported files can be found in ${options.outputDir}`); } const download = async (uri, filename) => { return new Promise((resolve, reject) => { (0, _axios().default)(uri).pipe(_fsExtra().default.createWriteStream(filename)).on('close', () => resolve(null)).on('error', err => { reject(err); }); }); }; const decompress = async (src, dest) => { return new Promise((resolve, reject) => { _targz().default.decompress({ src, dest }, error => { if (error) { reject(error); } else { resolve(null); } }); }); }; function collect(val, memo) { memo.push(val); return memo; } var _default = program => { program.command('export [project-dir]').description('Exports the static files of the app for hosting it on a web server.').option('-p, --public-url <url>', 'The public url that will host the static files. (Required)').option('--output-dir <dir>', 'The directory to export the static files to. Default directory is `dist`', 'dist').option('-a, --asset-url <url>', "The absolute or relative url that will host the asset files. Default is './assets', which will be resolved against the public-url.", './assets').option('-d, --dump-assetmap', 'Dump the asset map for further processing.').option('--dev', 'Configures static files for developing locally using a non-https server').option('-s, --dump-sourcemap', 'Dump the source map for debugging the JS bundle.').option('-q, --quiet', 'Suppress verbose output from the React Native packager.').option('--merge-src-dir [dir]', 'A repeatable source dir to merge in.', collect, []).option('--merge-src-url [url]', 'A repeatable source tar.gz file URL to merge in.', collect, []).option('--max-workers [num]', 'Maximum number of tasks to allow Metro to spawn.').asyncActionProjectDir(action, false, true); }; exports.default = _default; //# sourceMappingURL=../__sourcemaps__/commands/export.js.map