UNPKG

piral-cli

Version:

The standard CLI for creating and building a Piral instance or a Pilet.

119 lines 5.67 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateFromEmulatorWebsite = updateFromEmulatorWebsite; exports.scaffoldFromEmulatorWebsite = scaffoldFromEmulatorWebsite; const path_1 = require("path"); const template_1 = require("./template"); const http_1 = require("./http"); const constants_1 = require("./constants"); const config_1 = require("./config"); const enums_1 = require("./enums"); const io_1 = require("./io"); const io_2 = require("./io"); const log_1 = require("./log"); const external_1 = require("../external"); async function requestManifest(url, httpsAgent, interactive) { const opts = (0, http_1.getAxiosOptions)(url); try { return await external_1.axios.get(url, { ...opts, httpsAgent }); } catch (error) { return await (0, http_1.handleAxiosError)(error, interactive, httpsAgent, async (mode, key) => { const headers = (0, http_1.getAuthorizationHeaders)(mode, key); await (0, config_1.updateConfig)('auth', { [url]: { mode: 'header', key: 'authorization', value: headers.authorization, }, }); return await requestManifest(url, httpsAgent, false); }); } } async function downloadEmulatorFiles(manifestUrl, targetDir, appDir, files, httpsAgent) { const requiredFiles = [files.typings, files.main, files.app]; const optionalFiles = [files.always, files.once]; const opts = { ...(0, http_1.getAxiosOptions)(manifestUrl), httpsAgent, responseType: 'arraybuffer', }; const downloadFiles = (files, target) => { return files .filter((file) => file && typeof file === 'string') .map(async (file) => { const url = new URL(file, manifestUrl); const res = await external_1.axios.get(url.href, opts); const data = res.data; await (0, io_1.writeBinary)(target, file, data); }); }; await Promise.all([...downloadFiles(requiredFiles, appDir), ...downloadFiles(optionalFiles, targetDir)]); } async function createEmulatorFiles(targetDir, appDir, manifestUrl, emulatorJson, httpsAgent) { const mainFile = 'index.js'; const appDirName = (0, path_1.relative)(targetDir, appDir); await (0, io_2.writeJson)(targetDir, constants_1.packageJson, { name: emulatorJson.name, description: emulatorJson.description, version: emulatorJson.version, importmap: emulatorJson.importmap, pilets: emulatorJson.scaffolding.pilets, piralCLI: { version: emulatorJson.scaffolding.cli, timestamp: emulatorJson.timestamp, source: manifestUrl, generated: true, }, files: emulatorJson.files.assets, main: path_1.posix.join(appDirName, mainFile), typings: path_1.posix.join(appDirName, emulatorJson.files.typings), app: path_1.posix.join(appDirName, emulatorJson.files.app), peerDependencies: {}, optionalDependencies: emulatorJson.dependencies.optional, devDependencies: emulatorJson.dependencies.included, sharedDependencies: [Object.keys(emulatorJson.importmap.imports)], }, true); // actually including this one hints that the app shell should have been included - which is forbidden await (0, template_1.createPiralStubIndexIfNotExists)(appDir, mainFile, enums_1.ForceOverwrite.yes, { name: emulatorJson.name, outFile: emulatorJson.files.main, }); await downloadEmulatorFiles(manifestUrl, targetDir, appDir, emulatorJson.files, httpsAgent); } async function updateFromEmulatorWebsite(targetDir, manifestUrl, httpsAgent, interactive) { (0, log_1.progress)(`Updating emulator from %s ...`, manifestUrl); try { const response = await requestManifest(manifestUrl, httpsAgent, interactive); const nextEmulator = response.data; const currentEmulator = await (0, io_1.readJson)(targetDir, constants_1.packageJson); if (currentEmulator.name !== nextEmulator.name) { (0, log_1.log)('remoteEmulatorNameChanged_0121', currentEmulator.name); } else if (currentEmulator.piralCLI.timstamp !== nextEmulator.timestamp) { (0, log_1.log)('generalDebug_0003', `The timestamp on "${currentEmulator.name}" is different (${nextEmulator.timestamp}).`); const appDir = (0, path_1.resolve)(targetDir, 'app'); await createEmulatorFiles(targetDir, appDir, manifestUrl, nextEmulator, httpsAgent); } else { (0, log_1.log)('generalDebug_0003', `Nothing to update for "${currentEmulator.name}".`); } } catch (ex) { (0, log_1.log)('generalDebug_0003', `HTTP request for emulator update failed: ${ex}`); (0, log_1.log)('skipEmulatorUpdate_0120', manifestUrl); } } async function scaffoldFromEmulatorWebsite(rootDir, manifestUrl, httpsAgent) { (0, log_1.progress)(`Downloading emulator from %s ...`, manifestUrl); const interactive = (0, external_1.isInteractive)(); const response = await requestManifest(manifestUrl, httpsAgent, interactive); const emulatorJson = response.data; const targetDir = (0, path_1.resolve)(rootDir, 'node_modules', emulatorJson.name); const appDir = (0, path_1.resolve)(targetDir, 'app'); await (0, io_1.createDirectory)(appDir); await createEmulatorFiles(targetDir, appDir, manifestUrl, emulatorJson, httpsAgent); return { name: emulatorJson.name, path: targetDir }; } //# sourceMappingURL=website.js.map