From 5cf61c8135ed9d15eadbbe2e38456af0f3ca9af9 Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Thu, 10 Apr 2025 18:35:39 +0200 Subject: [PATCH 1/2] fix: don't exit hot reload on JS/TS build errors --- src/services/build/build.javascript.ts | 40 +++++++++++++++--------- src/services/build/build.services.ts | 16 +++++----- src/services/upgrade/upgrade.services.ts | 2 +- src/types/build.ts | 1 + 4 files changed, 36 insertions(+), 23 deletions(-) diff --git a/src/services/build/build.javascript.ts b/src/services/build/build.javascript.ts index 2fae52d0..943c87e9 100644 --- a/src/services/build/build.javascript.ts +++ b/src/services/build/build.javascript.ts @@ -19,26 +19,38 @@ import {readPackageJson} from '../../utils/pkg.utils'; import {detectPackageManager} from '../../utils/pm.utils'; import {confirmAndExit} from '../../utils/prompt.utils'; -export const buildTypeScript = async ({path}: Pick = {}) => { - await build({lang: 'ts', path}); +export const buildTypeScript = async ({ + path, + exitOnError +}: Pick = {}) => { + await build({lang: 'ts', path, exitOnError}); }; -export const buildJavaScript = async ({path}: Pick = {}) => { - await build({lang: 'mjs', path}); +export const buildJavaScript = async ({ + path, + exitOnError +}: Pick = {}) => { + await build({lang: 'mjs', path, exitOnError}); }; -type BuildArgsTsJs = {lang: Omit} & Pick; +type BuildArgsTsJs = {lang: Omit} & Pick; -const build = async (params: BuildArgsTsJs) => { +const build = async ({exitOnError, ...params}: BuildArgsTsJs) => { await installEsbuild(); await createTargetDir(); - const metadata = await prepareMetadata(); + try { + const metadata = await prepareMetadata(); - const buildResult = await buildWithEsbuild({params, metadata}); + const buildResult = await buildWithEsbuild({params, metadata}); - printResults({metadata, buildResult}); + printResults({metadata, buildResult}); + } catch (_error: unknown) { + if (exitOnError !== false) { + process.exit(1); + } + } }; interface BuildResult { @@ -50,7 +62,7 @@ const buildWithEsbuild = async ({ params: {lang, path}, metadata }: { - params: BuildArgsTsJs; + params: Omit; metadata: BuildMetadata; }): Promise => { const infile = @@ -76,14 +88,14 @@ const buildWithEsbuild = async ({ } if (errors.length > 0) { - process.exit(1); + throw new Error(); } const entry = Object.entries(metafile.outputs); if (entry.length === 0) { console.log(red('Unexpected: No metafile resulting from the build was found.')); - process.exit(1); + throw new Error(); } return { @@ -148,9 +160,9 @@ const prepareMetadata = async (): Promise => { ...(notEmptyString(version) && {version}), ...(notEmptyString(functionsVersion) && {juno}) }; - } catch (_err: unknown) { + } catch (err: unknown) { console.log(red('⚠️ Could not read build metadata from package.json.')); - process.exit(1); + throw err; } }; diff --git a/src/services/build/build.services.ts b/src/services/build/build.services.ts index 05365159..b0d7d94f 100644 --- a/src/services/build/build.services.ts +++ b/src/services/build/build.services.ts @@ -26,17 +26,17 @@ export const build = async (args?: string[]) => { await executeBuild(params); }; -const executeBuild = async ({lang, path}: Omit) => { +const executeBuild = async ({lang, path, exitOnError}: Omit) => { // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check switch (lang) { case 'rs': await buildRust({path}); return; case 'ts': - await buildTypeScript({path}); + await buildTypeScript({path, exitOnError}); return; case 'mjs': - await buildJavaScript({path}); + await buildJavaScript({path, exitOnError}); return; } @@ -52,7 +52,7 @@ const executeBuild = async ({lang, path}: Omit) => { nonNullish(path) && extname(path) === extname(DEVELOPER_PROJECT_SATELLITE_INDEX_TS); if (isPathTypeScript) { - await buildTypeScript({path}); + await buildTypeScript({path, exitOnError}); return; } @@ -60,7 +60,7 @@ const executeBuild = async ({lang, path}: Omit) => { nonNullish(path) && extname(path) === extname(DEVELOPER_PROJECT_SATELLITE_INDEX_MJS); if (isPathJavaScript) { - await buildJavaScript({path}); + await buildJavaScript({path, exitOnError}); return; } @@ -70,12 +70,12 @@ const executeBuild = async ({lang, path}: Omit) => { } if (existsSync(DEVELOPER_PROJECT_SATELLITE_INDEX_TS)) { - await buildTypeScript(); + await buildTypeScript({exitOnError}); return; } if (existsSync(DEVELOPER_PROJECT_SATELLITE_INDEX_MJS)) { - await buildJavaScript(); + await buildJavaScript({exitOnError}); return; } @@ -89,7 +89,7 @@ const executeBuild = async ({lang, path}: Omit) => { export const watchBuild = ({watch, path, ...params}: BuildArgs) => { const doBuild = async () => { console.log(`\n⏱ Rebuilding serverless functions...`); - await executeBuild({path, ...params}); + await executeBuild({path, exitOnError: false, ...params}); }; const DEFAULT_TIMEOUT = 10_000; diff --git a/src/services/upgrade/upgrade.services.ts b/src/services/upgrade/upgrade.services.ts index a48f4e51..256df8b7 100644 --- a/src/services/upgrade/upgrade.services.ts +++ b/src/services/upgrade/upgrade.services.ts @@ -287,6 +287,6 @@ export const consoleUpgradeResult = ({ return; } - // eslint-disable-next-line @typescript-eslint/only-throw-error + throw err; }; diff --git a/src/types/build.ts b/src/types/build.ts index 74ea442d..f4905525 100644 --- a/src/types/build.ts +++ b/src/types/build.ts @@ -4,4 +4,5 @@ export interface BuildArgs { lang?: BuildLang; path?: string | undefined; watch?: boolean | string; + exitOnError?: boolean; } From f6baeea3ccd2718e8631b239d4c8fd6cf590e20f Mon Sep 17 00:00:00 2001 From: David Dal Busco Date: Thu, 10 Apr 2025 18:40:34 +0200 Subject: [PATCH 2/2] chore: fmt --- src/services/upgrade/upgrade.services.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/services/upgrade/upgrade.services.ts b/src/services/upgrade/upgrade.services.ts index 256df8b7..49ce2386 100644 --- a/src/services/upgrade/upgrade.services.ts +++ b/src/services/upgrade/upgrade.services.ts @@ -287,6 +287,5 @@ export const consoleUpgradeResult = ({ return; } - throw err; };