@@ -221,6 +221,7 @@ export async function createVitePressPlugin(
221221 this . environment . mode === 'dev' &&
222222 this . environment . name === 'client'
223223 ) {
224+ logDeadLinks ( deadLinks , siteConfig . logger , true )
224225 const payload : PageDataPayload = {
225226 path : `/${ siteConfig . rewrites . map [ relativePath ] || relativePath } ` ,
226227 pageData
@@ -238,15 +239,7 @@ export async function createVitePressPlugin(
238239
239240 renderStart ( ) {
240241 if ( allDeadLinks . length > 0 ) {
241- allDeadLinks . forEach ( ( { url, file } , i ) => {
242- siteConfig . logger . warn (
243- c . yellow (
244- `${ i === 0 ? '\n\n' : '' } (!) Found dead link ${ c . cyan (
245- url
246- ) } in file ${ c . white ( c . dim ( file ) ) } `
247- )
248- )
249- } )
242+ logDeadLinks ( allDeadLinks , siteConfig . logger )
250243 siteConfig . logger . info (
251244 c . cyan (
252245 '\nIf this is expected, you can disable this check via config. Refer: https://vitepress.dev/reference/site-config#ignoredeadlinks\n'
@@ -423,3 +416,22 @@ export async function createVitePressPlugin(
423416 await dynamicRoutesPlugin ( siteConfig )
424417 ]
425418}
419+
420+ function logDeadLinks (
421+ deadLinks : MarkdownCompileResult [ 'deadLinks' ] ,
422+ logger : SiteConfig [ 'logger' ] ,
423+ devMode = false
424+ ) {
425+ const logged = new Set < string > ( )
426+ deadLinks . forEach ( ( { url, file } , i ) => {
427+ const key = `${ file } :::${ url } `
428+ if ( logged . has ( key ) ) return
429+ logged . add ( key )
430+ const prefix = '\n' . repeat ( i === 0 ? ( devMode ? 1 : 2 ) : 0 )
431+ logger . warn (
432+ c . yellow (
433+ `${ prefix } (!) Found dead link ${ c . cyan ( url ) } in file ${ c . white ( c . dim ( file ) ) } `
434+ )
435+ )
436+ } )
437+ }
0 commit comments