From ae041448aa3cba182b0622c3ddfdb1d1c86479ff Mon Sep 17 00:00:00 2001 From: Divyansh Singh <40380293+brc-dd@users.noreply.github.com> Date: Sat, 29 Apr 2023 19:39:07 +0530 Subject: [PATCH] refactor: improve error message on encountering dead links fixes #2281 closes #2307 closes #2314 Co-authored-by: jd-solanki Co-authored-by: Christian Georgi --- src/node/markdownToVue.ts | 16 +++------------- src/node/plugin.ts | 30 +++++++++++++++++++++++------- 2 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/node/markdownToVue.ts b/src/node/markdownToVue.ts index 056ae1b5..c38ec541 100644 --- a/src/node/markdownToVue.ts +++ b/src/node/markdownToVue.ts @@ -3,7 +3,6 @@ import _debug from 'debug' import fs from 'fs' import { LRUCache } from 'lru-cache' import path from 'path' -import c from 'picocolors' import type { SiteConfig } from './config' import { createMarkdownRenderer, @@ -26,7 +25,7 @@ const includesRE = //g export interface MarkdownCompileResult { vueSrc: string pageData: PageData - deadLinks: string[] + deadLinks: { url: string; file: string }[] includes: string[] } @@ -115,18 +114,9 @@ export async function createMarkdownToVueRenderFn( } = env // validate data.links - const deadLinks: string[] = [] + const deadLinks: MarkdownCompileResult['deadLinks'] = [] const recordDeadLink = (url: string) => { - ;(siteConfig?.logger ?? console).warn( - c.yellow( - `\n(!) Found dead link ${c.cyan(url)} in file ${c.white( - c.dim(file) - )}\nIf it is intended, you can use:\n ${c.cyan( - `${url}` - )}` - ) - ) - deadLinks.push(url) + deadLinks.push({ url, file: path.relative(srcDir, fileOrig) }) } function shouldIgnoreDeadLink(url: string) { diff --git a/src/node/plugin.ts b/src/node/plugin.ts index c6ab131f..5e823cb9 100644 --- a/src/node/plugin.ts +++ b/src/node/plugin.ts @@ -15,7 +15,11 @@ import { resolveAliases } from './alias' import { resolveUserConfig, resolvePages, type SiteConfig } from './config' -import { clearCache, createMarkdownToVueRenderFn } from './markdownToVue' +import { + clearCache, + createMarkdownToVueRenderFn, + type MarkdownCompileResult +} from './markdownToVue' import { slash, type PageDataPayload } from './shared' import { staticDataPlugin } from './plugins/staticDataPlugin' import { webFontsPlugin } from './plugins/webFontsPlugin' @@ -94,7 +98,7 @@ export async function createVitePressPlugin( } let siteData = site - let hasDeadLinks = false + let allDeadLinks: MarkdownCompileResult['deadLinks'] = [] let config: ResolvedConfig const vitePressPlugin: Plugin = { @@ -184,9 +188,7 @@ export async function createVitePressPlugin( id, config.publicDir ) - if (deadLinks.length) { - hasDeadLinks = true - } + allDeadLinks.push(...deadLinks) if (includes.length) { includes.forEach((i) => { this.addWatchFile(i) @@ -197,8 +199,22 @@ export async function createVitePressPlugin( }, renderStart() { - if (hasDeadLinks) { - throw new Error(`One or more pages contain dead links.`) + if (allDeadLinks.length > 0) { + allDeadLinks.forEach(({ url, file }, i) => { + siteConfig.logger.warn( + c.yellow( + `${i === 0 ? '\n\n' : ''}(!) Found dead link ${c.cyan( + url + )} in file ${c.white(c.dim(file))}` + ) + ) + }) + siteConfig.logger.info( + c.cyan( + '\nIf this is expected, you can disable this check via config. Refer: https://vitepress.dev/reference/site-config#ignoredeadlinks\n' + ) + ) + throw new Error(`${allDeadLinks.length} dead link(s) found.`) } },