From 26f77601624abc6a93e93c8bfa56aac4c122f752 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Rold=C3=A1n?= Date: Fri, 17 Jan 2025 17:16:53 +0100 Subject: [PATCH 1/2] Don't start the dev session if there are build errors --- .../dev/processes/dev-session.test.ts | 18 ++++++++++++++++++ .../cli/services/dev/processes/dev-session.ts | 19 +++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/packages/app/src/cli/services/dev/processes/dev-session.test.ts b/packages/app/src/cli/services/dev/processes/dev-session.test.ts index d403fcddc2d..d5b745cdada 100644 --- a/packages/app/src/cli/services/dev/processes/dev-session.test.ts +++ b/packages/app/src/cli/services/dev/processes/dev-session.test.ts @@ -7,6 +7,7 @@ import { testAppAccessConfigExtension, testAppLinked, testDeveloperPlatformClient, + testFunctionExtension, testUIExtension, testWebhookExtensions, } from '../../../models/app/app.test-data.js' @@ -205,4 +206,21 @@ describe('pushUpdatesForDevSession', () => { expect(developerPlatformClient.refreshToken).toHaveBeenCalledOnce() expect(developerPlatformClient.devSessionUpdate).toHaveBeenCalledTimes(2) }) + + test('prints build errors', async () => { + // Given + const extension = await testFunctionExtension() + const event = {app, extensionEvents: [{type: 'updated', extension, buildResult: {status: 'error'}}]} + + // When + try { + await pushUpdatesForDevSession({stderr, stdout, abortSignal: abortController.signal}, options) + appWatcher.emit('ready', event) + await flushPromises() + // eslint-disable-next-line no-catch-all/no-catch-all + } catch (error: any) { + expect(error.message).toBe('Dev session aborted, build errors detected in extensions') + } + expect(developerPlatformClient.devSessionCreate).not.toHaveBeenCalled() + }) }) diff --git a/packages/app/src/cli/services/dev/processes/dev-session.ts b/packages/app/src/cli/services/dev/processes/dev-session.ts index c7ff3a3c729..c286df51df2 100644 --- a/packages/app/src/cli/services/dev/processes/dev-session.ts +++ b/packages/app/src/cli/services/dev/processes/dev-session.ts @@ -147,6 +147,15 @@ export const pushUpdatesForDevSession: DevProcessFunction = a ) }) .onStart(async (event) => { + const buildErrors = event.extensionEvents.filter((eve) => eve.buildResult?.status === 'error') + if (buildErrors.length) { + const errors = buildErrors.map((error) => ({ + error: 'Build error. Please review your code and try again.', + prefix: error.extension.handle, + })) + await printMultipleErrors(errors, processOptions.stdout) + throw new AbortError('Dev session aborted, build errors detected in extensions.') + } const result = await bundleExtensionsAndUpload({...processOptions, app: event.app}) await handleDevSessionResult(result, {...processOptions, app: event.app}) }) @@ -335,6 +344,16 @@ async function printError(message: string, stdout: Writable, prefix?: string) { await printLogMessage(outputContent`${content}`.value, stdout, prefix) } +async function printMultipleErrors(errors: {error: string; prefix: string}[], stdout: Writable) { + const header = outputToken.errorText(`❌ Error`) + await printLogMessage(outputContent`${header}`.value, stdout, 'dev-session') + const messages = errors.map((error) => { + const content = outputToken.errorText(`└ ${error.error}`) + return printLogMessage(outputContent`${content}`.value, stdout, error.prefix) + }) + await Promise.all(messages) +} + async function printSuccess(message: string, stdout: Writable) { await printLogMessage(outputContent`${outputToken.green(message)}`.value, stdout) } From fe089c668afc4ba4362fb06b9b909ce88fed29b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Isaac=20Rold=C3=A1n?= Date: Fri, 17 Jan 2025 18:11:56 +0100 Subject: [PATCH 2/2] Remove test --- .../services/dev/processes/dev-session.test.ts | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/packages/app/src/cli/services/dev/processes/dev-session.test.ts b/packages/app/src/cli/services/dev/processes/dev-session.test.ts index d5b745cdada..d403fcddc2d 100644 --- a/packages/app/src/cli/services/dev/processes/dev-session.test.ts +++ b/packages/app/src/cli/services/dev/processes/dev-session.test.ts @@ -7,7 +7,6 @@ import { testAppAccessConfigExtension, testAppLinked, testDeveloperPlatformClient, - testFunctionExtension, testUIExtension, testWebhookExtensions, } from '../../../models/app/app.test-data.js' @@ -206,21 +205,4 @@ describe('pushUpdatesForDevSession', () => { expect(developerPlatformClient.refreshToken).toHaveBeenCalledOnce() expect(developerPlatformClient.devSessionUpdate).toHaveBeenCalledTimes(2) }) - - test('prints build errors', async () => { - // Given - const extension = await testFunctionExtension() - const event = {app, extensionEvents: [{type: 'updated', extension, buildResult: {status: 'error'}}]} - - // When - try { - await pushUpdatesForDevSession({stderr, stdout, abortSignal: abortController.signal}, options) - appWatcher.emit('ready', event) - await flushPromises() - // eslint-disable-next-line no-catch-all/no-catch-all - } catch (error: any) { - expect(error.message).toBe('Dev session aborted, build errors detected in extensions') - } - expect(developerPlatformClient.devSessionCreate).not.toHaveBeenCalled() - }) })