From 29a0ccfd921ae0f0dce413bd8ccb21ebb7231649 Mon Sep 17 00:00:00 2001 From: Florian Rappl Date: Mon, 19 Feb 2024 17:27:44 +0100 Subject: [PATCH] Improved interactive update of emulator website --- .../piral-cli/src/apps/upgrade-pilet.ts | 6 +++- src/tooling/piral-cli/src/common/package.ts | 16 ++++++--- src/tooling/piral-cli/src/common/website.ts | 33 +++++++++---------- 3 files changed, 31 insertions(+), 24 deletions(-) diff --git a/src/tooling/piral-cli/src/apps/upgrade-pilet.ts b/src/tooling/piral-cli/src/apps/upgrade-pilet.ts index bddd170c4..95ca457fb 100644 --- a/src/tooling/piral-cli/src/apps/upgrade-pilet.ts +++ b/src/tooling/piral-cli/src/apps/upgrade-pilet.ts @@ -1,5 +1,6 @@ import { resolve } from 'path'; import { LogLevels, NpmClientType } from '../types'; +import { isInteractive } from '../external'; import { installNpmPackage, checkExistingDirectory, @@ -99,7 +100,10 @@ export async function upgradePilet(baseDir = process.cwd(), options: UpgradePile } const npmClient = await determineNpmClient(root, defaultNpmClient); - const { apps, piletPackage } = await retrievePiletData(root); + + // in case we run from a user's CLI we want to allow updating + const interactive = isInteractive(); + const { apps, piletPackage } = await retrievePiletData(root, undefined, interactive); const { devDependencies = {}, dependencies = {}, source } = piletPackage; if (apps.length === 0) { diff --git a/src/tooling/piral-cli/src/common/package.ts b/src/tooling/piral-cli/src/common/package.ts index 4323ca378..3ea7159b1 100644 --- a/src/tooling/piral-cli/src/common/package.ts +++ b/src/tooling/piral-cli/src/common/package.ts @@ -158,7 +158,12 @@ async function loadPiralInstance(root: string, details?: PiralInstanceDetails): return appPackage; } -export async function findPiralInstance(proposedApp: string, rootDir: string, details?: PiralInstanceDetails) { +export async function findPiralInstance( + proposedApp: string, + rootDir: string, + details?: PiralInstanceDetails, + interactive = false, +) { const path = findPackageRoot(proposedApp, rootDir); const url = details?.url; @@ -167,7 +172,7 @@ export async function findPiralInstance(proposedApp: string, rootDir: string, de if (url) { log('generalDebug_0003', `Updating the emulator from remote "${url}" ...`); - await updateFromEmulatorWebsite(root, url); + await updateFromEmulatorWebsite(root, url, interactive); } return await loadPiralInstance(root, details); @@ -185,6 +190,7 @@ export async function findPiralInstances( piletPackage: PiletPackageData, piletDefinition: undefined | PiletDefinition, rootDir: string, + interactive?: boolean, ) { if (proposedApps) { // do nothing @@ -202,7 +208,7 @@ export async function findPiralInstances( if (proposedApps.length > 0) { return Promise.all( proposedApps.map((proposedApp) => - findPiralInstance(proposedApp, rootDir, piletDefinition?.piralInstances?.[proposedApp]), + findPiralInstance(proposedApp, rootDir, piletDefinition?.piralInstances?.[proposedApp], interactive), ), ); } @@ -776,13 +782,13 @@ export async function findPiletRoot(proposedRoot: string) { return dirname(packageJsonPath); } -export async function retrievePiletData(target: string, app?: string) { +export async function retrievePiletData(target: string, app?: string, interactive?: boolean) { const piletJsonPath = await findFile(target, piletJson); const proposedRoot = piletJsonPath ? dirname(piletJsonPath) : target; const root = await findPiletRoot(proposedRoot); const piletPackage = await readJson(root, packageJson); const piletDefinition: PiletDefinition = piletJsonPath && (await readJson(proposedRoot, piletJson)); - const appPackages = await findPiralInstances(app && [app], piletPackage, piletDefinition, root); + const appPackages = await findPiralInstances(app && [app], piletPackage, piletDefinition, root, interactive); const apps: Array = []; for (const appPackage of appPackages) { diff --git a/src/tooling/piral-cli/src/common/website.ts b/src/tooling/piral-cli/src/common/website.ts index 199deea0d..24128d8fb 100644 --- a/src/tooling/piral-cli/src/common/website.ts +++ b/src/tooling/piral-cli/src/common/website.ts @@ -8,29 +8,25 @@ import { ForceOverwrite } from './enums'; import { createDirectory, readJson, writeBinary } from './io'; import { writeJson } from './io'; import { progress, log } from './log'; -import { axios } from '../external'; +import { axios, isInteractive } from '../external'; import { EmulatorWebsiteManifestFiles, EmulatorWebsiteManifest } from '../types'; -async function requestManifest(url: string, httpsAgent?: Agent) { +async function requestManifest(url: string, interactive: boolean, httpsAgent?: Agent) { const opts = getAxiosOptions(url); try { return await axios.default.get(url, { ...opts, httpsAgent }); } catch (error) { - return await handleAxiosError(error, true, httpsAgent, async (mode, key) => { + return await handleAxiosError(error, interactive, httpsAgent, async (mode, key) => { const headers = getAuthorizationHeaders(mode, key); - - if (headers.authorization) { - await updateConfig('auth', { - [url]: { - mode: 'header', - key: 'authorization', - value: headers.authorization, - }, - }); - } - - return await axios.default.get(url, { headers, httpsAgent }); + await updateConfig('auth', { + [url]: { + mode: 'header', + key: 'authorization', + value: headers.authorization, + }, + }); + return await requestManifest(url, false, httpsAgent); }); } } @@ -99,13 +95,13 @@ async function createEmulatorFiles( await downloadEmulatorFiles(manifestUrl, appDir, emulatorJson.files, httpsAgent); } -export async function updateFromEmulatorWebsite(targetDir: string, manifestUrl: string) { +export async function updateFromEmulatorWebsite(targetDir: string, manifestUrl: string, interactive: boolean) { progress(`Updating emulator from %s ...`, manifestUrl); const ca = await getCertificate(); const httpsAgent = ca ? new Agent({ ca }) : undefined; try { - const response = await requestManifest(manifestUrl, httpsAgent); + const response = await requestManifest(manifestUrl, interactive, httpsAgent); const nextEmulator: EmulatorWebsiteManifest = response.data; const currentEmulator = await readJson(targetDir, packageJson); @@ -128,7 +124,8 @@ export async function scaffoldFromEmulatorWebsite(rootDir: string, manifestUrl: progress(`Downloading emulator from %s ...`, manifestUrl); const ca = await getCertificate(); const httpsAgent = ca ? new Agent({ ca }) : undefined; - const response = await requestManifest(manifestUrl, httpsAgent); + const interactive = isInteractive(); + const response = await requestManifest(manifestUrl, interactive, httpsAgent); const emulatorJson: EmulatorWebsiteManifest = response.data; const targetDir = resolve(rootDir, 'node_modules', emulatorJson.name); const appDir = resolve(targetDir, 'app');