From 46c4c0e053f830585b9ef229ce1c259df00a80f8 Mon Sep 17 00:00:00 2001 From: Erika <3019731+Princesseuh@users.noreply.github.com> Date: Mon, 28 Aug 2023 15:15:14 +0200 Subject: [PATCH] feat(cli): Add docs error link to errors in the CLI (#8251) --- .changeset/chatty-ways-hunt.md | 5 +++++ packages/astro/src/core/errors/dev/utils.ts | 19 ++++++++++++++++++- packages/astro/src/core/errors/dev/vite.ts | 15 ++------------- packages/astro/src/core/messages.ts | 7 ++++++- 4 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 .changeset/chatty-ways-hunt.md diff --git a/.changeset/chatty-ways-hunt.md b/.changeset/chatty-ways-hunt.md new file mode 100644 index 000000000..d6a9584a1 --- /dev/null +++ b/.changeset/chatty-ways-hunt.md @@ -0,0 +1,5 @@ +--- +'astro': patch +--- + +Adds a link to the error reference in the CLI when an error occurs diff --git a/packages/astro/src/core/errors/dev/utils.ts b/packages/astro/src/core/errors/dev/utils.ts index 69026b6cd..837b52fde 100644 --- a/packages/astro/src/core/errors/dev/utils.ts +++ b/packages/astro/src/core/errors/dev/utils.ts @@ -9,6 +9,7 @@ import { normalizePath } from 'vite'; import type { SSRError } from '../../../@types/astro.js'; import { removeLeadingForwardSlashWindows } from '../../path.js'; import { AggregateError, type ErrorWithMetadata } from '../errors.js'; +import { AstroErrorData } from '../index.js'; import { codeFrame } from '../printer.js'; import { normalizeLF } from '../utils.js'; @@ -206,13 +207,29 @@ function cleanErrorStack(stack: string) { .join('\n'); } +export function getDocsForError(err: ErrorWithMetadata): string | undefined { + if (err.name in AstroErrorData) { + return `https://docs.astro.build/en/reference/errors/${getKebabErrorName(err.name)}/`; + } + + return undefined; + + /** + * The docs has kebab-case urls for errors, so we need to convert the error name + * @param errorName + */ + function getKebabErrorName(errorName: string): string { + return errorName.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase(); + } +} + /** * Render a subset of Markdown to HTML or a CLI output */ export function renderErrorMarkdown(markdown: string, target: 'html' | 'cli') { const linkRegex = /\[(.+)\]\((.+)\)/gm; const boldRegex = /\*\*(.+)\*\*/gm; - const urlRegex = / (\b(https?|ftp):\/\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|]) /gim; + const urlRegex = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\\/%?=~_|!:,.;]*[-A-Z0-9+&@#\\/%=~_|])/gim; const codeRegex = /`([^`]+)`/gim; if (target === 'html') { diff --git a/packages/astro/src/core/errors/dev/vite.ts b/packages/astro/src/core/errors/dev/vite.ts index 76ada2865..11e7cfe74 100644 --- a/packages/astro/src/core/errors/dev/vite.ts +++ b/packages/astro/src/core/errors/dev/vite.ts @@ -7,7 +7,7 @@ import { FailedToLoadModuleSSR, InvalidGlob, MdxIntegrationMissingError } from ' import { AstroError, type ErrorWithMetadata } from '../errors.js'; import { createSafeError } from '../utils.js'; import type { SSRLoadedRenderer } from './../../../@types/astro.js'; -import { renderErrorMarkdown } from './utils.js'; +import { getDocsForError, renderErrorMarkdown } from './utils.js'; export function enhanceViteSSRError({ error, @@ -137,10 +137,7 @@ export async function getViteErrorPayload(err: ErrorWithMetadata): Promise