From 9d2fdb293d6a7323e10126cebad18ef9a2ea2800 Mon Sep 17 00:00:00 2001 From: Nate Moore Date: Thu, 1 Feb 2024 15:59:14 -0600 Subject: [PATCH] Improve `astro sync` error handling (#9888) * fix(#9711): improve `astro sync` error handling * Update .changeset/healthy-jokes-deny.md * update unit tests --------- Co-authored-by: Arsh <69170106+lilnasy@users.noreply.github.com> --- .changeset/healthy-jokes-deny.md | 5 ++++ packages/astro/src/core/errors/errors.ts | 2 +- packages/astro/src/core/sync/index.ts | 13 ++++++++- .../collections-mixed-content-errors.test.js | 28 ++----------------- 4 files changed, 21 insertions(+), 27 deletions(-) create mode 100644 .changeset/healthy-jokes-deny.md diff --git a/.changeset/healthy-jokes-deny.md b/.changeset/healthy-jokes-deny.md new file mode 100644 index 0000000000..d5b9c5d1ad --- /dev/null +++ b/.changeset/healthy-jokes-deny.md @@ -0,0 +1,5 @@ +--- +"astro": patch +--- + +Improves error handling logic for the `astro sync` command. diff --git a/packages/astro/src/core/errors/errors.ts b/packages/astro/src/core/errors/errors.ts index 37373527b0..88ff70de35 100644 --- a/packages/astro/src/core/errors/errors.ts +++ b/packages/astro/src/core/errors/errors.ts @@ -27,7 +27,7 @@ type ErrorTypes = | 'AggregateError'; export function isAstroError(e: unknown): e is AstroError { - return e instanceof Error && (e as AstroError).type === 'AstroError'; + return e instanceof AstroError; } export class AstroError extends Error { diff --git a/packages/astro/src/core/sync/index.ts b/packages/astro/src/core/sync/index.ts index 8b78c9d306..ce121033b7 100644 --- a/packages/astro/src/core/sync/index.ts +++ b/packages/astro/src/core/sync/index.ts @@ -18,6 +18,8 @@ import { createVite } from '../create-vite.js'; import { AstroError, AstroErrorData, createSafeError, isAstroError } from '../errors/index.js'; import type { Logger } from '../logger/core.js'; import { ensureProcessNodeEnv } from '../util.js'; +import { formatErrorMessage } from '../messages.js'; +import { collectErrorMetadata } from '../errors/dev/utils.js'; export type ProcessExit = 0 | 1; @@ -55,7 +57,16 @@ export default async function sync( command: 'build', }); - return await syncInternal(settings, { ...options, logger }); + try { + return await syncInternal(settings, { ...options, logger }); + } catch (err) { + const error = createSafeError(err); + logger.error( + 'content', + formatErrorMessage(collectErrorMetadata(error), logger.level() === 'debug') + '\n' + ); + return 1; + } } /** diff --git a/packages/astro/test/units/dev/collections-mixed-content-errors.test.js b/packages/astro/test/units/dev/collections-mixed-content-errors.test.js index a8e282a881..9cad4f5e8a 100644 --- a/packages/astro/test/units/dev/collections-mixed-content-errors.test.js +++ b/packages/astro/test/units/dev/collections-mixed-content-errors.test.js @@ -35,14 +35,7 @@ name: Ben root ); - try { - await sync({ fs }); - expect.fail(0, 1, 'Expected sync to throw'); - } catch (e) { - expect(e).to.be.instanceOf(Error); - expect(e.type).to.equal('AstroError'); - expect(e.message).to.include('authors'); - } + expect(await sync({ fs })).to.equal(1); }); it('raises "mixed content" error when data in content collection', async () => { @@ -70,15 +63,7 @@ title: Post root ); - try { - await sync({ fs }); - expect.fail(0, 1, 'Expected sync to throw'); - } catch (e) { - expect(e).to.be.instanceOf(Error); - expect(e.type).to.equal('AstroError'); - - expect(e.message).to.include('blog'); - } + expect(await sync({ fs })).to.equal(1); }); it('raises error when data collection configured as content collection', async () => { @@ -101,14 +86,7 @@ title: Post root ); - try { - await sync({ fs }); - expect.fail(0, 1, 'Expected sync to throw'); - } catch (e) { - expect(e).to.be.instanceOf(Error); - expect(e.type).to.equal('AstroError'); - expect(e.hint).to.include("Try adding `type: 'data'`"); - } + expect(await sync({ fs })).to.equal(1); }); it('does not raise error for empty collection with config', async () => {