boltdocs 3.3.5 → 3.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/{build-BVoMHMhw.mjs → build-BJnL-FHG.mjs} +1 -1
  2. package/dist/{build-B672n0hL.cjs → build-CxT38vPv.cjs} +1 -1
  3. package/dist/client/index.cjs +29 -12
  4. package/dist/client/index.d.cts +1 -1
  5. package/dist/client/index.d.ts +1 -1
  6. package/dist/client/index.js +27 -11
  7. package/dist/client/mdx.cjs +1 -1
  8. package/dist/client/mdx.js +1 -1
  9. package/dist/client/primitives.cjs +4 -4
  10. package/dist/client/primitives.d.cts +40 -9
  11. package/dist/client/primitives.d.ts +40 -9
  12. package/dist/client/primitives.js +4 -4
  13. package/dist/config-B3_iVsbi.mjs +7 -0
  14. package/dist/{config-PLvresCv.cjs → config-BC_qhXws.cjs} +1 -1
  15. package/dist/config-BJp3lGzE.cjs +7 -0
  16. package/dist/{dev-DbuhNcF5.cjs → dev-46NiL0MC.cjs} +1 -1
  17. package/dist/{dev-B49V6O6p.mjs → dev-C4kjO5xs.mjs} +1 -1
  18. package/dist/{docs-layout-CbZ7LDRe.js → docs-layout-D3Fmb0Wd.js} +16 -117
  19. package/dist/{docs-layout-vzfXed1Q.cjs → docs-layout-SgphExoE.cjs} +16 -123
  20. package/dist/{doctor-DMECtdK6.cjs → doctor-BqxOFRt3.cjs} +1 -1
  21. package/dist/{doctor-i8Qmd8DJ.mjs → doctor-Cv5lXnay.mjs} +1 -1
  22. package/dist/{doctor-FuFY1jBz.cjs → doctor-TS3JGNEU.cjs} +1 -1
  23. package/dist/{image-B-NDSDuY.js → image-BAiDReNd.js} +1 -1
  24. package/dist/{image-Hnaa2bJd.cjs → image-Bkx85rsq.cjs} +1 -1
  25. package/dist/{index-B3o307nd.d.ts → index-B1Mx0dHl.d.ts} +24 -4
  26. package/dist/{index-Bg-JtZeK.d.cts → index-DLaHgD-i.d.cts} +24 -4
  27. package/dist/{link-vZjmD-es.cjs → link-hLWOsx0x.cjs} +59 -28
  28. package/dist/{link-CgdI6O2o.js → link-q1qHNGK_.js} +54 -29
  29. package/dist/{mdx-BRT71V5Q.js → mdx-CJGWzBGy.js} +2 -2
  30. package/dist/{mdx-D0Absdq5.cjs → mdx-Qi0DmaY8.cjs} +2 -2
  31. package/dist/node/cli-entry.cjs +1 -1
  32. package/dist/node/cli-entry.mjs +1 -1
  33. package/dist/node/highlight.d.cts +2 -2
  34. package/dist/node/highlight.d.mts +2 -2
  35. package/dist/node/index.cjs +1 -1
  36. package/dist/node/index.d.cts +7 -4
  37. package/dist/node/index.d.mts +7 -4
  38. package/dist/node/index.mjs +1 -1
  39. package/dist/node/mdx/shiki-adapter.cjs +1 -1
  40. package/dist/node/mdx/shiki-adapter.d.cts +7 -2
  41. package/dist/node/mdx/shiki-adapter.d.mts +7 -2
  42. package/dist/node/mdx/shiki-adapter.mjs +1 -1
  43. package/dist/node-7Cfw6nMr.cjs +23 -0
  44. package/dist/node-CT2E84nY.mjs +23 -0
  45. package/dist/{package-CNqjEYE1.cjs → package-Bah2tHjK.cjs} +1 -1
  46. package/dist/{package-sdcKhDhe.mjs → package-D6bf68FR.mjs} +1 -1
  47. package/dist/plugin-AgNI3ktz.cjs +69 -0
  48. package/dist/plugin-BAv_pYLt.mjs +69 -0
  49. package/dist/{plugin-context-CscLcXjH.cjs → plugin-context-BZs5lvDu.cjs} +2 -2
  50. package/dist/{plugin-context-DuSg-Hax.mjs → plugin-context-b5qVVQSU.mjs} +1 -1
  51. package/dist/{plugin-lifecycle-BywrEoWK.cjs → plugin-lifecycle-s89gzTlh.cjs} +1 -1
  52. package/dist/{registry-sJqDv0kE.d.mts → registry-B8pt41zj.d.cts} +1 -1
  53. package/dist/{registry-BbB6NqSv.d.cts → registry-BrrH2X9c.d.mts} +1 -1
  54. package/dist/routes-CzhKOw67.cjs +6 -0
  55. package/dist/{routes-C3_w9fLX.cjs → routes-Dq_2EUIB.cjs} +1 -1
  56. package/dist/routes-Dw6g0bfF.mjs +6 -0
  57. package/dist/search-dialog-BYZS9aeO.cjs +747 -0
  58. package/dist/{search-dialog-x_qHU8ty.cjs → search-dialog-CguKVtUu.cjs} +145 -5
  59. package/dist/{search-dialog-B9mdxsUC.js → search-dialog-DQwod5Xc.js} +1 -1
  60. package/dist/search-dialog-DzObE-Ar.js +717 -0
  61. package/dist/{search-dialog-DCtm2dyR.cjs → search-dialog-QgKRRbsI.cjs} +1 -1
  62. package/dist/{search-dialog-BqkzDTq2.js → search-dialog-mYnqU4v7.js} +134 -6
  63. package/dist/{types-Db6zToZH.d.mts → types-74i_xUe2.d.mts} +1 -1
  64. package/dist/{types-o7iZ2BAR.d.cts → types-X_Pwk8Cg.d.cts} +1 -1
  65. package/dist/virtual-modules-C3S3Nz8r.cjs +40 -0
  66. package/dist/virtual-modules-CaxqrFd6.mjs +40 -0
  67. package/package.json +6 -5
  68. package/dist/config-CrsQJHQz.cjs +0 -7
  69. package/dist/config-DC0nMMk7.mjs +0 -7
  70. package/dist/node-BljvHMpS.cjs +0 -23
  71. package/dist/node-CWxGw4H4.mjs +0 -23
  72. package/dist/plugin-BPcm1cU0.mjs +0 -69
  73. package/dist/plugin-WUhxnpko.cjs +0 -69
  74. package/dist/routes-C0kb4ue6.cjs +0 -6
  75. package/dist/routes-C4wrLWwu.mjs +0 -6
  76. package/dist/search-dialog-Bp_ouN1c.cjs +0 -550
  77. package/dist/search-dialog-an2BNMj6.js +0 -526
  78. package/dist/virtual-modules-B2X4Ht2r.mjs +0 -39
  79. package/dist/virtual-modules-DPsdHKcu.cjs +0 -39
@@ -3,4 +3,4 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- const e=require(`./chunk-D1Md3oWO.cjs`),t=require(`./node-BljvHMpS.cjs`),n=require(`./routes-C0kb4ue6.cjs`),r=require(`./update-check-DFQZyoSU.cjs`);let i=require(`node:path`);i=e.r(i);let a=require(`node:fs`);a=e.r(a);let o=require(`node:crypto`),s=require(`@bdocs/dui`),c=require(`@bdocs/ssg/node`);function l(e,t,n=e=>process.exit(e)){let r=!1;return{async shutdown(i){if(!r){r=!0;try{await e()}finally{t(),i!==void 0&&n(i)}}},isShuttingDown(){return r}}}function u(e){try{let t=Number.parseInt(a.default.readFileSync(e,`utf8`).trim(),10);return Number.isInteger(t)&&t>0?t:null}catch{return null}}function d(e){try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function f(e){let t=i.default.join(e,`.boltdocs`,`dev-server.lock`);for(a.default.mkdirSync(i.default.dirname(t),{recursive:!0});;)try{let e=a.default.openSync(t,`wx`);a.default.writeFileSync(e,`${process.pid}\n`),a.default.closeSync(e);let n=!1;return{release(){if(!n){n=!0;try{u(t)===process.pid&&a.default.unlinkSync(t)}catch{}}}}}catch(e){if(e.code!==`EEXIST`)throw e;let n=u(t);if(n&&d(n))throw Error(`A Boltdocs dev server is already running for this project (pid ${n})`);let r=`${t}.stale-${process.pid}-${(0,o.randomUUID)()}`;try{a.default.renameSync(t,r),a.default.unlinkSync(r)}catch(e){try{a.default.existsSync(r)&&a.default.unlinkSync(r)}catch{}if(e.code===`ENOENT`)continue;throw Error(`Could not recover stale Boltdocs dev lock: ${t}`)}}}let p=!1;async function m(e=process.cwd(),a={}){if(p)return;p=!0;let o=null,u=null,d=()=>{};r.t();let m,h=process.env.BOLTDOCS_DEBUG===`true`,g=performance.now();try{o=f(e),h&&console.log(`[boltdocs-dev] acquireLock: ${Math.round(performance.now()-g)}ms`);let _=performance.now(),v=performance.now(),y=await t.n(e,`development`,void 0,{skipTypes:!0,skipLinkTree:!0,skipRoutes:!0});m=y.__boltdocsConfig,h&&console.log(`[boltdocs-dev] createViteConfig: ${Math.round(performance.now()-v)}ms`),y.logLevel=`warn`,y.clearScreen=!1,a.port!==void 0&&(y.server=y.server||{},y.server.port=Number(a.port)),a.host!==void 0&&(y.server=y.server||{},y.server.host=a.host),a.force&&(y.optimizeDeps=y.optimizeDeps||{},y.optimizeDeps.force=!0);let b=performance.now();u=await(0,c.createServer)(y,{skipResolveConfig:!0}),h&&console.log(`[boltdocs-dev] createServer: ${Math.round(performance.now()-b)}ms`),d=()=>{process.off(`SIGINT`,S),process.off(`SIGTERM`,C)};let x=l(()=>u.close(),()=>{p=!1,o?.release(),d()}),S=()=>{x.shutdown(0)},C=()=>{x.shutdown(143)};process.once(`SIGINT`,S),process.once(`SIGTERM`,C);let w=performance.now();try{await u.listen()}catch(e){throw d(),e}h&&console.log(`[boltdocs-dev] server.listen: ${Math.round(performance.now()-w)}ms`),u.httpServer?.once(`close`,()=>{d(),p=!1,o?.release()}),t.l(m,e),n.t(m?.docsDir||i.default.resolve(e,`docs`),m).catch(e=>{(0,s.error)(`Background route generation failed:`,e)});let T=performance.now()-_;h&&console.log(`[boltdocs-dev] total startup: ${Math.round(T)}ms`);let E=u.resolvedUrls;console.log(r.o(E?.local?.[0]??`http://localhost:${a.port??5173}`,E?.network?.[0]??null,{readyIn:T})),u.bindCLIShortcuts({print:!1})}catch(e){if(d(),u)try{await u.close()}catch{}p=!1,o?.release(),(0,s.error)(`Failed to start dev server:`,e),process.exit(1)}}exports.devAction=m;
6
+ const e=require(`./chunk-D1Md3oWO.cjs`),t=require(`./node-7Cfw6nMr.cjs`),n=require(`./routes-CzhKOw67.cjs`),r=require(`./update-check-DFQZyoSU.cjs`);let i=require(`node:path`);i=e.r(i);let a=require(`node:fs`);a=e.r(a);let o=require(`node:crypto`),s=require(`@bdocs/dui`),c=require(`@bdocs/ssg/node`);function l(e,t,n=e=>process.exit(e)){let r=!1;return{async shutdown(i){if(!r){r=!0;try{await e()}finally{t(),i!==void 0&&n(i)}}},isShuttingDown(){return r}}}function u(e){try{let t=Number.parseInt(a.default.readFileSync(e,`utf8`).trim(),10);return Number.isInteger(t)&&t>0?t:null}catch{return null}}function d(e){try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function f(e){let t=i.default.join(e,`.boltdocs`,`dev-server.lock`);for(a.default.mkdirSync(i.default.dirname(t),{recursive:!0});;)try{let e=a.default.openSync(t,`wx`);a.default.writeFileSync(e,`${process.pid}\n`),a.default.closeSync(e);let n=!1;return{release(){if(!n){n=!0;try{u(t)===process.pid&&a.default.unlinkSync(t)}catch{}}}}}catch(e){if(e.code!==`EEXIST`)throw e;let n=u(t);if(n&&d(n))throw Error(`A Boltdocs dev server is already running for this project (pid ${n})`);let r=`${t}.stale-${process.pid}-${(0,o.randomUUID)()}`;try{a.default.renameSync(t,r),a.default.unlinkSync(r)}catch(e){try{a.default.existsSync(r)&&a.default.unlinkSync(r)}catch{}if(e.code===`ENOENT`)continue;throw Error(`Could not recover stale Boltdocs dev lock: ${t}`)}}}let p=!1;async function m(e=process.cwd(),a={}){if(p)return;p=!0;let o=null,u=null,d=()=>{};r.t();let m,h=process.env.BOLTDOCS_DEBUG===`true`,g=performance.now();try{o=f(e),h&&console.log(`[boltdocs-dev] acquireLock: ${Math.round(performance.now()-g)}ms`);let _=performance.now(),v=performance.now(),y=await t.n(e,`development`,void 0,{skipTypes:!0,skipLinkTree:!0,skipRoutes:!0});m=y.__boltdocsConfig,h&&console.log(`[boltdocs-dev] createViteConfig: ${Math.round(performance.now()-v)}ms`),y.logLevel=`warn`,y.clearScreen=!1,a.port!==void 0&&(y.server=y.server||{},y.server.port=Number(a.port)),a.host!==void 0&&(y.server=y.server||{},y.server.host=a.host),a.force&&(y.optimizeDeps=y.optimizeDeps||{},y.optimizeDeps.force=!0);let b=performance.now();u=await(0,c.createServer)(y,{skipResolveConfig:!0}),h&&console.log(`[boltdocs-dev] createServer: ${Math.round(performance.now()-b)}ms`),d=()=>{process.off(`SIGINT`,S),process.off(`SIGTERM`,C)};let x=l(()=>u.close(),()=>{p=!1,o?.release(),d()}),S=()=>{x.shutdown(0)},C=()=>{x.shutdown(143)};process.once(`SIGINT`,S),process.once(`SIGTERM`,C);let w=performance.now();try{await u.listen()}catch(e){throw d(),e}h&&console.log(`[boltdocs-dev] server.listen: ${Math.round(performance.now()-w)}ms`),u.httpServer?.once(`close`,()=>{d(),p=!1,o?.release()}),t.d(m,e),n.t(m?.docsDir||i.default.resolve(e,`docs`),m).catch(e=>{(0,s.error)(`Background route generation failed:`,e)});let T=performance.now()-_;h&&console.log(`[boltdocs-dev] total startup: ${Math.round(T)}ms`);let E=u.resolvedUrls;console.log(r.o(E?.local?.[0]??`http://localhost:${a.port??5173}`,E?.network?.[0]??null,{readyIn:T})),u.bindCLIShortcuts({print:!1})}catch(e){if(d(),u)try{await u.close()}catch{}p=!1,o?.release(),(0,s.error)(`Failed to start dev server:`,e),process.exit(1)}}exports.devAction=m;
@@ -3,4 +3,4 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import{n as e,u as t}from"./node-CWxGw4H4.mjs";import{t as n}from"./routes-C4wrLWwu.mjs";import{o as r,t as i}from"./update-check-BXD1atVv.mjs";import a from"node:path";import o from"node:fs";import{randomUUID as s}from"node:crypto";import{error as c}from"@bdocs/dui";import{createServer as l}from"@bdocs/ssg/node";function u(e,t,n=e=>process.exit(e)){let r=!1;return{async shutdown(i){if(!r){r=!0;try{await e()}finally{t(),i!==void 0&&n(i)}}},isShuttingDown(){return r}}}function d(e){try{let t=Number.parseInt(o.readFileSync(e,`utf8`).trim(),10);return Number.isInteger(t)&&t>0?t:null}catch{return null}}function f(e){try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function p(e){let t=a.join(e,`.boltdocs`,`dev-server.lock`);for(o.mkdirSync(a.dirname(t),{recursive:!0});;)try{let e=o.openSync(t,`wx`);o.writeFileSync(e,`${process.pid}\n`),o.closeSync(e);let n=!1;return{release(){if(!n){n=!0;try{d(t)===process.pid&&o.unlinkSync(t)}catch{}}}}}catch(e){if(e.code!==`EEXIST`)throw e;let n=d(t);if(n&&f(n))throw Error(`A Boltdocs dev server is already running for this project (pid ${n})`);let r=`${t}.stale-${process.pid}-${s()}`;try{o.renameSync(t,r),o.unlinkSync(r)}catch(e){try{o.existsSync(r)&&o.unlinkSync(r)}catch{}if(e.code===`ENOENT`)continue;throw Error(`Could not recover stale Boltdocs dev lock: ${t}`)}}}let m=!1;async function h(o=process.cwd(),s={}){if(m)return;m=!0;let d=null,f=null,h=()=>{};i();let g,_=process.env.BOLTDOCS_DEBUG===`true`,v=performance.now();try{d=p(o),_&&console.log(`[boltdocs-dev] acquireLock: ${Math.round(performance.now()-v)}ms`);let i=performance.now(),y=performance.now(),b=await e(o,`development`,void 0,{skipTypes:!0,skipLinkTree:!0,skipRoutes:!0});g=b.__boltdocsConfig,_&&console.log(`[boltdocs-dev] createViteConfig: ${Math.round(performance.now()-y)}ms`),b.logLevel=`warn`,b.clearScreen=!1,s.port!==void 0&&(b.server=b.server||{},b.server.port=Number(s.port)),s.host!==void 0&&(b.server=b.server||{},b.server.host=s.host),s.force&&(b.optimizeDeps=b.optimizeDeps||{},b.optimizeDeps.force=!0);let x=performance.now();f=await l(b,{skipResolveConfig:!0}),_&&console.log(`[boltdocs-dev] createServer: ${Math.round(performance.now()-x)}ms`),h=()=>{process.off(`SIGINT`,C),process.off(`SIGTERM`,w)};let S=u(()=>f.close(),()=>{m=!1,d?.release(),h()}),C=()=>{S.shutdown(0)},w=()=>{S.shutdown(143)};process.once(`SIGINT`,C),process.once(`SIGTERM`,w);let T=performance.now();try{await f.listen()}catch(e){throw h(),e}_&&console.log(`[boltdocs-dev] server.listen: ${Math.round(performance.now()-T)}ms`),f.httpServer?.once(`close`,()=>{h(),m=!1,d?.release()}),t(g,o),n(g?.docsDir||a.resolve(o,`docs`),g).catch(e=>{c(`Background route generation failed:`,e)});let E=performance.now()-i;_&&console.log(`[boltdocs-dev] total startup: ${Math.round(E)}ms`);let D=f.resolvedUrls;console.log(r(D?.local?.[0]??`http://localhost:${s.port??5173}`,D?.network?.[0]??null,{readyIn:E})),f.bindCLIShortcuts({print:!1})}catch(e){if(h(),f)try{await f.close()}catch{}m=!1,d?.release(),c(`Failed to start dev server:`,e),process.exit(1)}}export{h as devAction};
6
+ import{f as e,n as t}from"./node-CT2E84nY.mjs";import{t as n}from"./routes-Dw6g0bfF.mjs";import{o as r,t as i}from"./update-check-BXD1atVv.mjs";import a from"node:path";import o from"node:fs";import{randomUUID as s}from"node:crypto";import{error as c}from"@bdocs/dui";import{createServer as l}from"@bdocs/ssg/node";function u(e,t,n=e=>process.exit(e)){let r=!1;return{async shutdown(i){if(!r){r=!0;try{await e()}finally{t(),i!==void 0&&n(i)}}},isShuttingDown(){return r}}}function d(e){try{let t=Number.parseInt(o.readFileSync(e,`utf8`).trim(),10);return Number.isInteger(t)&&t>0?t:null}catch{return null}}function f(e){try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function p(e){let t=a.join(e,`.boltdocs`,`dev-server.lock`);for(o.mkdirSync(a.dirname(t),{recursive:!0});;)try{let e=o.openSync(t,`wx`);o.writeFileSync(e,`${process.pid}\n`),o.closeSync(e);let n=!1;return{release(){if(!n){n=!0;try{d(t)===process.pid&&o.unlinkSync(t)}catch{}}}}}catch(e){if(e.code!==`EEXIST`)throw e;let n=d(t);if(n&&f(n))throw Error(`A Boltdocs dev server is already running for this project (pid ${n})`);let r=`${t}.stale-${process.pid}-${s()}`;try{o.renameSync(t,r),o.unlinkSync(r)}catch(e){try{o.existsSync(r)&&o.unlinkSync(r)}catch{}if(e.code===`ENOENT`)continue;throw Error(`Could not recover stale Boltdocs dev lock: ${t}`)}}}let m=!1;async function h(o=process.cwd(),s={}){if(m)return;m=!0;let d=null,f=null,h=()=>{};i();let g,_=process.env.BOLTDOCS_DEBUG===`true`,v=performance.now();try{d=p(o),_&&console.log(`[boltdocs-dev] acquireLock: ${Math.round(performance.now()-v)}ms`);let i=performance.now(),y=performance.now(),b=await t(o,`development`,void 0,{skipTypes:!0,skipLinkTree:!0,skipRoutes:!0});g=b.__boltdocsConfig,_&&console.log(`[boltdocs-dev] createViteConfig: ${Math.round(performance.now()-y)}ms`),b.logLevel=`warn`,b.clearScreen=!1,s.port!==void 0&&(b.server=b.server||{},b.server.port=Number(s.port)),s.host!==void 0&&(b.server=b.server||{},b.server.host=s.host),s.force&&(b.optimizeDeps=b.optimizeDeps||{},b.optimizeDeps.force=!0);let x=performance.now();f=await l(b,{skipResolveConfig:!0}),_&&console.log(`[boltdocs-dev] createServer: ${Math.round(performance.now()-x)}ms`),h=()=>{process.off(`SIGINT`,C),process.off(`SIGTERM`,w)};let S=u(()=>f.close(),()=>{m=!1,d?.release(),h()}),C=()=>{S.shutdown(0)},w=()=>{S.shutdown(143)};process.once(`SIGINT`,C),process.once(`SIGTERM`,w);let T=performance.now();try{await f.listen()}catch(e){throw h(),e}_&&console.log(`[boltdocs-dev] server.listen: ${Math.round(performance.now()-T)}ms`),f.httpServer?.once(`close`,()=>{h(),m=!1,d?.release()}),e(g,o),n(g?.docsDir||a.resolve(o,`docs`),g).catch(e=>{c(`Background route generation failed:`,e)});let E=performance.now()-i;_&&console.log(`[boltdocs-dev] total startup: ${Math.round(E)}ms`);let D=f.resolvedUrls;console.log(r(D?.local?.[0]??`http://localhost:${s.port??5173}`,D?.network?.[0]??null,{readyIn:E})),f.bindCLIShortcuts({print:!1})}catch(e){if(h(),f)try{await f.close()}catch{}m=!1,d?.release(),c(`Failed to start dev server:`,e),process.exit(1)}}export{h as devAction};
@@ -3,8 +3,9 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import { G as useOptionalConfig, H as icons_exports, W as useConfig, d as resolvePublicAssetUrl, h as Check, l as useRoutesContext, o as cn, s as useLocalizedTo, t as Link, u as normalizePath, v as ChevronRight } from "./link-CgdI6O2o.js";
6
+ import { G as useConfig, K as useOptionalConfig, U as icons_exports, d as normalizePath, f as resolvePublicAssetUrl, g as Check, o as cn, s as useLocalizedTo, t as Link, u as useRoutesContext, y as ChevronRight } from "./link-q1qHNGK_.js";
7
7
  import { E as useLocation, L as defaultNavigate, O as useNavigate, m as parseUrlReference } from "./router-CZBxMRAH.js";
8
+ import { r as useSearchHighlight } from "./search-dialog-mYnqU4v7.js";
8
9
  import { Children, Fragment, createContext, use, useCallback, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from "react";
9
10
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
10
11
  import * as RAC from "react-aria-components";
@@ -251,9 +252,9 @@ function Tabs({ children, className = "", ...props }) {
251
252
  children
252
253
  });
253
254
  }
254
- function TabsList({ children, className = "" }) {
255
+ function TabsList({ children, className, role }) {
255
256
  return /* @__PURE__ */ jsx("div", {
256
- role: "tablist",
257
+ role: role === null ? void 0 : role ?? "tablist",
257
258
  className: cn("relative flex flex-row items-center overflow-x-auto", className),
258
259
  children
259
260
  });
@@ -569,112 +570,6 @@ function useSidebar(routes) {
569
570
  };
570
571
  }
571
572
 
572
- //#endregion
573
- //#region src/client/hooks/use-search-highlight.ts
574
- /**
575
- * Hook to highlight search terms based on the 'hl' query parameter.
576
- */
577
- function useSearchHighlight(containerSelector = ".boltdocs-page") {
578
- const { search } = useLocation();
579
- const query = new URLSearchParams(search).get("hl");
580
- useEffect(() => {
581
- if (!query) {
582
- clearHighlights(containerSelector);
583
- return;
584
- }
585
- const container = document.querySelector(containerSelector);
586
- if (!container) return;
587
- let rafId;
588
- const observer = new MutationObserver((mutations) => {
589
- if (mutations.some((m) => {
590
- const addedNodes = Array.from(m.addedNodes);
591
- const removedNodes = Array.from(m.removedNodes);
592
- return addedNodes.some((n) => !(n instanceof HTMLElement && n.hasAttribute("data-search-highlight"))) || removedNodes.some((n) => !(n instanceof HTMLElement && n.hasAttribute("data-search-highlight")));
593
- })) run();
594
- });
595
- function run() {
596
- cancelAnimationFrame(rafId);
597
- rafId = requestAnimationFrame(() => {
598
- observer.disconnect();
599
- clearHighlights(containerSelector);
600
- const terms = query.split(/\s+/).map((t) => t.trim()).filter((t) => t.length >= 2);
601
- if (terms.length > 0) highlightTerms(container, terms);
602
- observer.observe(container, {
603
- childList: true,
604
- subtree: true
605
- });
606
- });
607
- }
608
- run();
609
- return () => {
610
- cancelAnimationFrame(rafId);
611
- observer.disconnect();
612
- clearHighlights(containerSelector);
613
- };
614
- }, [query, containerSelector]);
615
- }
616
- function clearHighlights(selector) {
617
- document.querySelectorAll(`${selector} mark[data-search-highlight]`).forEach((mark) => {
618
- try {
619
- const parent = mark.parentNode;
620
- if (parent && parent.contains(mark)) {
621
- const text = mark.textContent || "";
622
- parent.replaceChild(document.createTextNode(text), mark);
623
- }
624
- } catch (e) {}
625
- });
626
- }
627
- function highlightTerms(container, terms) {
628
- const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT, { acceptNode: (node) => {
629
- const parent = node.parentElement;
630
- if (parent && (parent.tagName === "SCRIPT" || parent.tagName === "STYLE" || parent.tagName === "MARK" || parent.closest("pre") || parent.closest("code"))) return NodeFilter.FILTER_REJECT;
631
- return NodeFilter.FILTER_ACCEPT;
632
- } });
633
- const nodes = [];
634
- let node = walker.nextNode();
635
- while (node) {
636
- nodes.push(node);
637
- node = walker.nextNode();
638
- }
639
- const accentMap = {
640
- a: "[aáàäâã]",
641
- e: "[eéèëê]",
642
- i: "[iíìïî]",
643
- o: "[oóòöôõ]",
644
- u: "[uúùüû]",
645
- n: "[nñ]",
646
- c: "[cç]"
647
- };
648
- const prepareRegex = (term) => {
649
- let pattern = term.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
650
- pattern = pattern.split("").map((char) => {
651
- return accentMap[char.toLowerCase()] || char;
652
- }).join("");
653
- return pattern;
654
- };
655
- const combinedPattern = terms.map(prepareRegex).join("|");
656
- const regex = new RegExp(`(${combinedPattern})`, "gi");
657
- const matchRegexes = terms.map((term) => {
658
- const p = prepareRegex(term);
659
- return new RegExp(`^${p}$`, "i");
660
- });
661
- nodes.forEach((textNode) => {
662
- const text = textNode.textContent;
663
- if (text && regex.test(text)) {
664
- const fragment = document.createDocumentFragment();
665
- text.split(regex).forEach((part) => {
666
- if (matchRegexes.some((rx) => rx.test(part))) {
667
- const mark = document.createElement("mark");
668
- mark.textContent = part;
669
- mark.setAttribute("data-search-highlight", "true");
670
- fragment.appendChild(mark);
671
- } else if (part) fragment.appendChild(document.createTextNode(part));
672
- });
673
- if (textNode.parentNode) textNode.parentNode.replaceChild(fragment, textNode);
674
- }
675
- });
676
- }
677
-
678
573
  //#endregion
679
574
  //#region src/client/components/primitives/helpers/observer.ts
680
575
  function getItemId(url) {
@@ -838,9 +733,10 @@ function AnchorProvider({ toc, single = false, observerOptions, children }) {
838
733
  children
839
734
  });
840
735
  }
841
- function OnThisPage({ children, className }) {
736
+ function OnThisPage({ children, className, label = "On this page" }) {
842
737
  return /* @__PURE__ */ jsx("nav", {
843
738
  "data-otp-root": true,
739
+ "aria-label": label,
844
740
  className,
845
741
  children
846
742
  });
@@ -935,7 +831,7 @@ function OnThisPageIndicator({ style, className }) {
935
831
  const items = useItems();
936
832
  useEffect(() => {
937
833
  if (items.length === 0) return;
938
- const parent = containerRef.current?.parentElement;
834
+ const parent = containerRef.current?.offsetParent;
939
835
  if (!parent) return;
940
836
  const activeLinks = parent.querySelectorAll("a[data-active=\"true\"]");
941
837
  if (activeLinks.length > 0) {
@@ -960,6 +856,7 @@ function OnThisPageIndicator({ style, className }) {
960
856
  return /* @__PURE__ */ jsx("div", {
961
857
  ref: containerRef,
962
858
  "data-otp-indicator": true,
859
+ "aria-hidden": "true",
963
860
  className: cn("absolute", className),
964
861
  style: {
965
862
  transition: "transform 180ms cubic-bezier(0.2, 0.8, 0.2, 1), height 180ms cubic-bezier(0.2, 0.8, 0.2, 1), opacity 150ms",
@@ -973,9 +870,9 @@ function OnThisPageIndicator({ style, className }) {
973
870
  function OnThisPageItems({ headings = [], className, itemClassName, linkClassName, indicatorClassName }) {
974
871
  const activeIds = useActiveAnchors();
975
872
  if (headings.length === 0) return null;
976
- return /* @__PURE__ */ jsxs(OnThisPageList, {
873
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(OnThisPageIndicator, { className: indicatorClassName }), /* @__PURE__ */ jsx(OnThisPageList, {
977
874
  className,
978
- children: [/* @__PURE__ */ jsx(OnThisPageIndicator, { className: indicatorClassName }), headings.map((h) => /* @__PURE__ */ jsx(OnThisPageItem, {
875
+ children: headings.map((h) => /* @__PURE__ */ jsx(OnThisPageItem, {
979
876
  level: h.level,
980
877
  className: itemClassName,
981
878
  children: /* @__PURE__ */ jsx(OnThisPageLink, {
@@ -984,8 +881,8 @@ function OnThisPageItems({ headings = [], className, itemClassName, linkClassNam
984
881
  className: linkClassName,
985
882
  children: h.text
986
883
  })
987
- }, h.id))]
988
- });
884
+ }, h.id))
885
+ })] });
989
886
  }
990
887
  /**
991
888
  * High-level automated Table of Contents tree
@@ -1032,6 +929,7 @@ OnThisPage.Tree = OnThisPageTree;
1032
929
  //#region src/client/components/primitives/page-nav.tsx
1033
930
  function PageNav({ children, className }) {
1034
931
  return /* @__PURE__ */ jsx("nav", {
932
+ "aria-label": "Pagination",
1035
933
  className: cn("grid sm:grid-cols-2 gap-4", className),
1036
934
  children
1037
935
  });
@@ -1131,7 +1029,7 @@ function SidebarHeader({ children, className }) {
1131
1029
  * The scroll container doubles as the semantic `<nav>` landmark. State and
1132
1030
  * scroll-position handling live here; all visuals belong to the theme.
1133
1031
  */
1134
- function SidebarContent({ children, className }) {
1032
+ function SidebarContent({ children, className, label = "Docs navigation" }) {
1135
1033
  const scrollRef = useRef(null);
1136
1034
  useLayoutEffect(() => {
1137
1035
  if (scrollRef.current) scrollRef.current.scrollTop = sidebarScrollPos;
@@ -1148,6 +1046,7 @@ function SidebarContent({ children, className }) {
1148
1046
  return /* @__PURE__ */ jsx("nav", {
1149
1047
  ref: scrollRef,
1150
1048
  "data-sidebar-content": true,
1049
+ "aria-label": label,
1151
1050
  className,
1152
1051
  children
1153
1052
  });
@@ -1454,4 +1353,4 @@ const DocsLayout = Object.assign(DocsLayoutRoot, {
1454
1353
  });
1455
1354
 
1456
1355
  //#endregion
1457
- export { UIProvider as A, IconRenderer as C, Popover$1 as D, Menu as E, ButtonGroup as O, useSidebar as S, Tabs as T, ScrollProvider as _, SidebarHeader as a, useItems as b, SidebarLink as c, SidebarSubGroup as d, PageNav as f, OnThisPageTree as g, OnThisPageItems as h, SidebarGroup as i, useUI as j, Breadcrumbs$1 as k, SidebarMobile as l, OnThisPage as m, Sidebar as n, SidebarItem as o, AnchorProvider as p, SidebarContent as r, SidebarItems as s, DocsLayout as t, SidebarRoot as u, useActiveAnchor as v, resolveIcon as w, useSearchHighlight as x, useActiveAnchors as y };
1356
+ export { useUI as A, resolveIcon as C, ButtonGroup as D, Popover$1 as E, Breadcrumbs$1 as O, IconRenderer as S, Menu as T, ScrollProvider as _, SidebarHeader as a, useItems as b, SidebarLink as c, SidebarSubGroup as d, PageNav as f, OnThisPageTree as g, OnThisPageItems as h, SidebarGroup as i, UIProvider as k, SidebarMobile as l, OnThisPage as m, Sidebar as n, SidebarItem as o, AnchorProvider as p, SidebarContent as r, SidebarItems as s, DocsLayout as t, SidebarRoot as u, useActiveAnchor as v, Tabs as w, useSidebar as x, useActiveAnchors as y };
@@ -4,7 +4,8 @@
4
4
  * Licensed under the MIT License.
5
5
  */
6
6
  const require_router = require('./router-C3kygdRK.cjs');
7
- const require_link = require('./link-vZjmD-es.cjs');
7
+ const require_link = require('./link-hLWOsx0x.cjs');
8
+ const require_search_dialog = require('./search-dialog-CguKVtUu.cjs');
8
9
  let react = require("react");
9
10
  let react_jsx_runtime = require("react/jsx-runtime");
10
11
  let react_aria_components = require("react-aria-components");
@@ -254,9 +255,9 @@ function Tabs({ children, className = "", ...props }) {
254
255
  children
255
256
  });
256
257
  }
257
- function TabsList({ children, className = "" }) {
258
+ function TabsList({ children, className, role }) {
258
259
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
259
- role: "tablist",
260
+ role: role === null ? void 0 : role ?? "tablist",
260
261
  className: require_link.cn("relative flex flex-row items-center overflow-x-auto", className),
261
262
  children
262
263
  });
@@ -572,112 +573,6 @@ function useSidebar(routes) {
572
573
  };
573
574
  }
574
575
 
575
- //#endregion
576
- //#region src/client/hooks/use-search-highlight.ts
577
- /**
578
- * Hook to highlight search terms based on the 'hl' query parameter.
579
- */
580
- function useSearchHighlight(containerSelector = ".boltdocs-page") {
581
- const { search } = require_router.useLocation();
582
- const query = new URLSearchParams(search).get("hl");
583
- (0, react.useEffect)(() => {
584
- if (!query) {
585
- clearHighlights(containerSelector);
586
- return;
587
- }
588
- const container = document.querySelector(containerSelector);
589
- if (!container) return;
590
- let rafId;
591
- const observer = new MutationObserver((mutations) => {
592
- if (mutations.some((m) => {
593
- const addedNodes = Array.from(m.addedNodes);
594
- const removedNodes = Array.from(m.removedNodes);
595
- return addedNodes.some((n) => !(n instanceof HTMLElement && n.hasAttribute("data-search-highlight"))) || removedNodes.some((n) => !(n instanceof HTMLElement && n.hasAttribute("data-search-highlight")));
596
- })) run();
597
- });
598
- function run() {
599
- cancelAnimationFrame(rafId);
600
- rafId = requestAnimationFrame(() => {
601
- observer.disconnect();
602
- clearHighlights(containerSelector);
603
- const terms = query.split(/\s+/).map((t) => t.trim()).filter((t) => t.length >= 2);
604
- if (terms.length > 0) highlightTerms(container, terms);
605
- observer.observe(container, {
606
- childList: true,
607
- subtree: true
608
- });
609
- });
610
- }
611
- run();
612
- return () => {
613
- cancelAnimationFrame(rafId);
614
- observer.disconnect();
615
- clearHighlights(containerSelector);
616
- };
617
- }, [query, containerSelector]);
618
- }
619
- function clearHighlights(selector) {
620
- document.querySelectorAll(`${selector} mark[data-search-highlight]`).forEach((mark) => {
621
- try {
622
- const parent = mark.parentNode;
623
- if (parent && parent.contains(mark)) {
624
- const text = mark.textContent || "";
625
- parent.replaceChild(document.createTextNode(text), mark);
626
- }
627
- } catch (e) {}
628
- });
629
- }
630
- function highlightTerms(container, terms) {
631
- const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT, { acceptNode: (node) => {
632
- const parent = node.parentElement;
633
- if (parent && (parent.tagName === "SCRIPT" || parent.tagName === "STYLE" || parent.tagName === "MARK" || parent.closest("pre") || parent.closest("code"))) return NodeFilter.FILTER_REJECT;
634
- return NodeFilter.FILTER_ACCEPT;
635
- } });
636
- const nodes = [];
637
- let node = walker.nextNode();
638
- while (node) {
639
- nodes.push(node);
640
- node = walker.nextNode();
641
- }
642
- const accentMap = {
643
- a: "[aáàäâã]",
644
- e: "[eéèëê]",
645
- i: "[iíìïî]",
646
- o: "[oóòöôõ]",
647
- u: "[uúùüû]",
648
- n: "[nñ]",
649
- c: "[cç]"
650
- };
651
- const prepareRegex = (term) => {
652
- let pattern = term.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
653
- pattern = pattern.split("").map((char) => {
654
- return accentMap[char.toLowerCase()] || char;
655
- }).join("");
656
- return pattern;
657
- };
658
- const combinedPattern = terms.map(prepareRegex).join("|");
659
- const regex = new RegExp(`(${combinedPattern})`, "gi");
660
- const matchRegexes = terms.map((term) => {
661
- const p = prepareRegex(term);
662
- return new RegExp(`^${p}$`, "i");
663
- });
664
- nodes.forEach((textNode) => {
665
- const text = textNode.textContent;
666
- if (text && regex.test(text)) {
667
- const fragment = document.createDocumentFragment();
668
- text.split(regex).forEach((part) => {
669
- if (matchRegexes.some((rx) => rx.test(part))) {
670
- const mark = document.createElement("mark");
671
- mark.textContent = part;
672
- mark.setAttribute("data-search-highlight", "true");
673
- fragment.appendChild(mark);
674
- } else if (part) fragment.appendChild(document.createTextNode(part));
675
- });
676
- if (textNode.parentNode) textNode.parentNode.replaceChild(fragment, textNode);
677
- }
678
- });
679
- }
680
-
681
576
  //#endregion
682
577
  //#region src/client/components/primitives/helpers/observer.ts
683
578
  function getItemId(url) {
@@ -841,9 +736,10 @@ function AnchorProvider({ toc, single = false, observerOptions, children }) {
841
736
  children
842
737
  });
843
738
  }
844
- function OnThisPage({ children, className }) {
739
+ function OnThisPage({ children, className, label = "On this page" }) {
845
740
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
846
741
  "data-otp-root": true,
742
+ "aria-label": label,
847
743
  className,
848
744
  children
849
745
  });
@@ -938,7 +834,7 @@ function OnThisPageIndicator({ style, className }) {
938
834
  const items = useItems();
939
835
  (0, react.useEffect)(() => {
940
836
  if (items.length === 0) return;
941
- const parent = containerRef.current?.parentElement;
837
+ const parent = containerRef.current?.offsetParent;
942
838
  if (!parent) return;
943
839
  const activeLinks = parent.querySelectorAll("a[data-active=\"true\"]");
944
840
  if (activeLinks.length > 0) {
@@ -963,6 +859,7 @@ function OnThisPageIndicator({ style, className }) {
963
859
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
964
860
  ref: containerRef,
965
861
  "data-otp-indicator": true,
862
+ "aria-hidden": "true",
966
863
  className: require_link.cn("absolute", className),
967
864
  style: {
968
865
  transition: "transform 180ms cubic-bezier(0.2, 0.8, 0.2, 1), height 180ms cubic-bezier(0.2, 0.8, 0.2, 1), opacity 150ms",
@@ -976,9 +873,9 @@ function OnThisPageIndicator({ style, className }) {
976
873
  function OnThisPageItems({ headings = [], className, itemClassName, linkClassName, indicatorClassName }) {
977
874
  const activeIds = useActiveAnchors();
978
875
  if (headings.length === 0) return null;
979
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(OnThisPageList, {
876
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(OnThisPageIndicator, { className: indicatorClassName }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OnThisPageList, {
980
877
  className,
981
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(OnThisPageIndicator, { className: indicatorClassName }), headings.map((h) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OnThisPageItem, {
878
+ children: headings.map((h) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OnThisPageItem, {
982
879
  level: h.level,
983
880
  className: itemClassName,
984
881
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OnThisPageLink, {
@@ -987,8 +884,8 @@ function OnThisPageItems({ headings = [], className, itemClassName, linkClassNam
987
884
  className: linkClassName,
988
885
  children: h.text
989
886
  })
990
- }, h.id))]
991
- });
887
+ }, h.id))
888
+ })] });
992
889
  }
993
890
  /**
994
891
  * High-level automated Table of Contents tree
@@ -1035,6 +932,7 @@ OnThisPage.Tree = OnThisPageTree;
1035
932
  //#region src/client/components/primitives/page-nav.tsx
1036
933
  function PageNav({ children, className }) {
1037
934
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
935
+ "aria-label": "Pagination",
1038
936
  className: require_link.cn("grid sm:grid-cols-2 gap-4", className),
1039
937
  children
1040
938
  });
@@ -1134,7 +1032,7 @@ function SidebarHeader({ children, className }) {
1134
1032
  * The scroll container doubles as the semantic `<nav>` landmark. State and
1135
1033
  * scroll-position handling live here; all visuals belong to the theme.
1136
1034
  */
1137
- function SidebarContent({ children, className }) {
1035
+ function SidebarContent({ children, className, label = "Docs navigation" }) {
1138
1036
  const scrollRef = (0, react.useRef)(null);
1139
1037
  (0, react.useLayoutEffect)(() => {
1140
1038
  if (scrollRef.current) scrollRef.current.scrollTop = sidebarScrollPos;
@@ -1151,6 +1049,7 @@ function SidebarContent({ children, className }) {
1151
1049
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("nav", {
1152
1050
  ref: scrollRef,
1153
1051
  "data-sidebar-content": true,
1052
+ "aria-label": label,
1154
1053
  className,
1155
1054
  children
1156
1055
  });
@@ -1400,7 +1299,7 @@ const Sidebar = Object.assign(SidebarRoot, {
1400
1299
  * It doesn't render anything visible.
1401
1300
  */
1402
1301
  function SearchHighlight() {
1403
- useSearchHighlight(".boltdocs-page");
1302
+ require_search_dialog.useSearchHighlight(".boltdocs-page");
1404
1303
  return null;
1405
1304
  }
1406
1305
 
@@ -1625,12 +1524,6 @@ Object.defineProperty(exports, 'useItems', {
1625
1524
  return useItems;
1626
1525
  }
1627
1526
  });
1628
- Object.defineProperty(exports, 'useSearchHighlight', {
1629
- enumerable: true,
1630
- get: function () {
1631
- return useSearchHighlight;
1632
- }
1633
- });
1634
1527
  Object.defineProperty(exports, 'useSidebar', {
1635
1528
  enumerable: true,
1636
1529
  get: function () {
@@ -3,4 +3,4 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- const e=require(`./chunk-D1Md3oWO.cjs`),t=require(`./utils-ej6_SjIZ.cjs`),n=require(`./pages-external-DPiPFxxP.cjs`),r=require(`./config-CrsQJHQz.cjs`),i=require(`./update-check-DFQZyoSU.cjs`);let a=require(`node:path`);a=e.r(a);let o=require(`node:fs`);o=e.r(o);let s=require(`@bdocs/dui`),c=require(`fdir`),l=require(`picomatch`);l=e.r(l);let u=require(`fastest-levenshtein`);const d={$schema:`https://boltdocs.vercel.app/schemas/doctor-config.schema.json`,checks:{metadata:{enabled:!0,titleMin:10,titleMax:60,descriptionMin:50,required:[`title`,`description`],optional:[],validateDates:!1},links:{internal:!0,external:!1,timeout:1e4,concurrency:10,ignore:[]},i18n:{enabled:!0},performance:{enabled:!0,budgets:{maxJSBundleSize:`200kb`,maxCSSBundleSize:`30kb`,maxPageHTMLSize:`80kb`,maxImagesKB:500,maxBuildTime:3e4,maxFontCount:3}}},fix:{confirmChanges:!1,backupFiles:!1,backupPath:`.boltdocs/backups`},reporting:{format:`pretty`,outputFile:`.boltdocs/reports/doctor.json`,failOnError:!1,maxWarnings:-1},severity:{missingTranslation:`warning`,brokenLink:`high`,brokenAnchor:`warning`,largeFile:`warning`,orphanedPage:`low`,duplicateTitle:`low`,shortMetadata:`low`,missingMetadata:`warning`,malformedFrontmatter:`high`,invalidFrontmatter:`high`,budgetExceeded:`warning`},exclude:[]};function f(e,t){if(e==null)return t;if(typeof e==`number`)return e;let n=e.toLowerCase().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/);if(!n)return t;let r=Number.parseFloat(n[1]),i=n[2]||`b`;return Math.round(r*({b:1,kb:1024,mb:1024*1024,gb:1024*1024*1024}[i]||1))}function p(e,t,n){return e.doctorConfig.severity[t]||n}async function m(e,t){o.default.existsSync(t)||o.default.mkdirSync(t,{recursive:!0});let n=a.default.basename(e),r=new Date().toISOString().replace(/[:.]/g,`-`),i=a.default.join(t,`${n}.${r}.bak`);o.default.copyFileSync(e,i)}const h=new Map;function g(e){let n=h.get(e);if(n)return n;let r=(async()=>{let n=await t.d(e,!1);return{raw:n.raw,data:n.data,content:n.content}})();return h.set(e,r),r}const _=new Map;function v(e){if(_.has(e))return _.get(e);let t=!1;try{t=o.default.existsSync(e)&&o.default.statSync(e).isFile()}catch{t=!1}return _.set(e,t),t}async function y(e){let t=a.default.resolve(e,`doctor.json`);if(o.default.existsSync(t))try{let e=JSON.parse(o.default.readFileSync(t,`utf-8`));return{...d,...e,checks:{...d.checks,...e.checks,metadata:{...d.checks.metadata,...e.checks?.metadata},links:{...d.checks.links,...e.checks?.links},i18n:{...d.checks.i18n,...e.checks?.i18n},performance:{...d.checks.performance,...e.checks?.performance,budgets:{...d.checks.performance?.budgets,...e.checks?.performance?.budgets}}},fix:{...d.fix,...e.fix},reporting:{...d.reporting,...e.reporting},severity:{...d.severity,...e.severity},exclude:[...d.exclude,...e.exclude||[]]}}catch(e){(0,s.warn)(`Failed to parse doctor.json: ${e}`)}return d}async function b(e,r=process.cwd(),i,s){let l=a.default.resolve(r,`.boltdocs`,`generated`);o.default.existsSync(l)||o.default.mkdirSync(l,{recursive:!0});let u=s;u||=await new c.fdir().withFullPaths().filter(e=>e.endsWith(`.md`)||e.endsWith(`.mdx`)).crawl(e).withPromise();let d=i?.base||`/`,f=[];for(let n=0;n<u.length;n+=100){let r=u.slice(n,n+100),i=await Promise.all(r.map(async n=>{let r=a.default.isAbsolute(n)?n:a.default.resolve(e,n),i=a.default.relative(e,r),{data:o}=await g(r),s;return s=o.permalink?String(o.permalink).startsWith(`/`)?String(o.permalink):`/${o.permalink}`:t.a(i),d===`/`?s:(d.endsWith(`/`)?d:d+`/`)+(s.startsWith(`/`)?s.substring(1):s)}));f.push(...i)}f.includes(d)||f.push(d);let p=n.n(e,i);for(let e of p)f.includes(e)||f.push(e);let m={routes:Array.from(new Set(f)).sort(),timestamp:Date.now()};return o.default.writeFileSync(a.default.resolve(l,`link-tree.json`),JSON.stringify(m,null,2)),m}function x(e,t){if(e===t)return 1;if(!e||!t)return 0;let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean),i=n[n.length-1]||``,a=r[r.length-1]||``;if(i===a){let e=0;for(let t of n)r.includes(t)&&e++;return e>=2?.99:.9}if(i.length>3&&a.length>3&&(a.startsWith(i)||i.startsWith(a))&&Math.min(i.length,a.length)/Math.max(i.length,a.length)>.5)return .88;let o=1-(0,u.distance)(i,a)/Math.max(i.length,a.length);return o>.8?o*.95:1-(0,u.distance)(e,t)/Math.max(e.length,t.length)}const S=new Map;function C(e,t){if(S.has(e))return S.get(e);let n=e.length,r=``,i=0;for(let a of t){if(a===e)continue;let t=a.length,o=Math.max(n,t);if(o===0)continue;let s=1-Math.abs(n-t)/o;if(s<=.8&&s<=i)continue;let c=x(e,a);c>i&&(i=c,r=a)}let a={bestMatch:r,similarity:i};return S.set(e,a),a}function w(e,t,n){let r=/```[\s\S]*?```/g,i=/`[^`\n]*`/g,a=0,o=[],s=t=>{e=e.replace(t,e=>(o.push(e),`__BD_CODE_MASK_${a++}__`))};return s(r),s(i),e.split(t).join(n).replace(/__BD_CODE_MASK_(\d+)__/g,(e,t)=>o[Number(t)]??``)}async function T(e){let n=[];if(!e.doctorConfig.checks.metadata.enabled)return n;let{titleMin:r,titleMax:i,descriptionMin:o}=e.doctorConfig.checks.metadata,s=new Map;for(let c of e.files){let l=t.u(a.default.relative(e.docsDir,c));try{let{raw:a,data:u}=await g(c);if(a.trim().startsWith(`---`)&&a.split(`---`).length>=3&&Object.keys(u).length===0){let t=p(e,`malformedFrontmatter`,`high`);t!==`off`&&n.push({file:l,level:t,message:`Malformed frontmatter (YAML parsing failed).`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}let d=t.g.safeParse(u);if(!d.success){let t=p(e,`invalidFrontmatter`,`high`);if(t!==`off`)for(let e of d.error.issues)n.push({file:l,level:t,message:`Invalid frontmatter field "${e.path.join(`.`)}": ${e.message}`,suggestion:`Ensure the field follows the correct type.`})}let f=Array.from(new Set([`title`,...e.doctorConfig.checks.metadata.required]));for(let t of f)if(u[t]===void 0){let r=p(e,`missingMetadata`,`warning`);r!==`off`&&n.push({file:l,level:r,message:`Missing required frontmatter field: "${t}".`,suggestion:`Add the "${t}" field to your frontmatter.`})}if(e.doctorConfig.checks.metadata.validateDates){let t=[`date`,`lastUpdated`,...e.doctorConfig.checks.metadata.optional.filter(e=>e.toLowerCase().includes(`date`))];for(let r of t)if(u[r]&&Number.isNaN(Date.parse(String(u[r])))){let t=p(e,`invalidFrontmatter`,`high`);t!==`off`&&n.push({file:l,level:t,message:`Invalid date format in field "${r}": "${u[r]}".`,suggestion:`Use a valid ISO date format (e.g., YYYY-MM-DD).`})}}if(u.title){let t=String(u.title);if(t.length<r){let i=p(e,`shortMetadata`,`low`);i!==`off`&&n.push({file:l,level:i,message:`Title is too short (${t.length} chars).`,suggestion:`Titles should be at least ${r} characters for better SEO.`})}else if(t.length>i){let r=p(e,`shortMetadata`,`low`);r!==`off`&&n.push({file:l,level:r,message:`Title is too long (${t.length} chars).`,suggestion:`Titles should be under ${i} characters.`})}let a=s.get(t)||[];a.push(l),s.set(t,a)}if(u.description&&String(u.description).length<o){let t=p(e,`shortMetadata`,`low`);t!==`off`&&n.push({file:l,level:t,message:`Description is very short.`,suggestion:`Descriptions should ideally be at least ${o} characters.`})}}catch(t){if(t instanceof Error){let r=p(e,`malformedFrontmatter`,`high`);r!==`off`&&n.push({file:l,level:r,message:`Malformed frontmatter (YAML error): ${t.message}`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}}}for(let[t,r]of s.entries())if(r.length>1){let i=p(e,`duplicateTitle`,`low`);if(i!==`off`)for(let e of r)n.push({file:e,level:i,message:`Duplicate title found: "${t}"`,suggestion:`Ensure each page has a unique title. Also used in: ${r.filter(t=>t!==e).join(`, `)}`})}return n}const E=/(?:\[([^\]]*)\]\(([^)\s]+)(?:\s+["'][^"']*["'])?\))|(?:href=["']([^"']+)["'])|(?:<Link\s+[^>]*?to=["'](\/[^"']+)["'])/g,D=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`];function O(e){let t=[],n=e=>{t.includes(e)||t.push(e)};n(e),e.endsWith(`/`)?n(e.slice(0,-1)):n(e+`/`);let r=e.replace(/\.(md|mdx)$/i,``);r!==e&&(n(r),n(r+`/`));let i=e.replace(/\/index\.(md|mdx)$/i,``);return i!==e&&(n(i),n(i+`/`)),n(e.endsWith(`/`)?e+`index`:e+`/index`),e.endsWith(`/index`)&&n(e.replace(/\/index$/,``)),t}async function k(e){let n=[],{internal:r,external:i,ignore:c,timeout:l,concurrency:u}=e.doctorConfig.checks.links;if(!r&&!i&&!e.options.checkExternal)return n;let d=new Set,f=5e5;for(let s of e.files){let l=t.u(a.default.relative(e.docsDir,s)),{content:u}=await g(s),m=[...(u.length>f?u.slice(0,f):u).replace(/<!--[\s\S]*?-->/g,``).replace(/```[\s\S]*?```/g,``).replace(/`[^`\n]*`/g,``).matchAll(E)];for(let t of m){let u=t[2]||t[3]||t[4],f=!!t[2],m=!!t[4];if(!u||c.some(e=>u.includes(e)))continue;if(/^(https?:|mailto:|tel:|data:|javascript:|blob:|ftp:)/i.test(u)){(i||e.options.checkExternal)&&d.add({url:u,file:s});continue}if(u.startsWith(`//`)){(i||e.options.checkExternal)&&d.add({url:u,file:s});continue}if(!r||u.startsWith(`#`))continue;let g;try{g=decodeURIComponent(u.split(`#`)[0].split(`?`)[0])}catch{g=u.split(`#`)[0].split(`?`)[0]}if(!g)continue;let _=!1,y=!1,b=``;if(g.startsWith(`/`)){let t=O(g);for(let n of t)if(e.routeIndex.has(n)||e.routeIndexWithSlash.has(n)||e.routeIndexWithoutSlash.has(n)){_=!0;break}if(!_&&e.basePrefix)for(let n of t){let t=e.basePrefix+(n.startsWith(`/`)?n:`/`+n);if(t!==n&&(e.routeIndex.has(t)||e.routeIndexWithSlash.has(t))){y=!0,b=t;break}}if(!_&&!y){let t=g.replace(/^\/+/,``),n=a.default.join(e.docsDir,t);_=D.some(e=>v(n+e))}}else{let e=a.default.resolve(a.default.dirname(s),g);_=D.some(t=>v(e+t))}if(!_){let{bestMatch:t,similarity:r}=C(g,e.linkTree.routes);y&&(t=b,r=1);let i=r>.6||y,a=r>.75&&t!==g||y,c=p(e,`brokenLink`,`high`);c!==`off`&&n.push({file:l,level:c,message:`Broken internal link: "${u}"`,suggestion:i?`Did you mean "${t}"?`:`Ensure the target exists or check for typos.`,fix:a?async()=>{let e=u.includes(`#`)?`#`+u.split(`#`)[1]:``,n=f?`(${u})`:m?`to="${u}"`:`href="${u}"`,r=f?`(${t}${e})`:m?`to="${t}${e}"`:`href="${t}${e}"`,i=w(o.default.readFileSync(s,`utf-8`),n,r);o.default.writeFileSync(s,i),h.delete(s)}:void 0})}}}if(d.size>0){(0,s.info)(s.colors.gray(`Verifying ${d.size} external links...`));let r=new Map;for(let e of d)r.has(e.url)||r.set(e.url,[]),r.get(e.url).push(e.file);let i=async e=>{try{let t=new AbortController,n=setTimeout(()=>t.abort(),l),r=await fetch(e,{method:`HEAD`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}});return clearTimeout(n),!r.ok&&r.status!==404?{url:e,ok:(await fetch(e,{method:`GET`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}})).ok}:{url:e,ok:r.ok}}catch(t){return{url:e,ok:!1,error:t instanceof Error?t.message:String(t)}}},o=Array.from(r.keys()),c=[];for(let e=0;e<o.length;e+=u){let t=o.slice(e,e+u),n=await Promise.allSettled(t.map(i));c.push(...n.map(e=>e.status===`fulfilled`?e.value:{url:`unknown`,ok:!1,error:String(e.reason)}))}for(let i of c)if(!i.ok){let o=p(e,`brokenLink`,`warning`);if(o!==`off`){let s=r.get(i.url)||[];for(let r of s)n.push({file:t.u(a.default.relative(e.docsDir,r)),level:o,message:`Broken external link: "${i.url}"`,suggestion:`Verify the URL or update it if it's permanently down. Error: ${i.error||`Status >= 400`}`})}}}return n}async function A(e){let n=[];if(!e.doctorConfig.checks.i18n.enabled||!e.config.i18n)return n;let{defaultLocale:r,locales:i}=e.config.i18n,s=Object.keys(i),c=s.filter(e=>e!==r);if(c.length===0)return n;let l=a.default.resolve(e.docsDir),u=a.default.join(l,r),d=o.default.existsSync(u)&&o.default.statSync(u).isDirectory(),f=e=>{let t=a.default.resolve(e);if(t!==l&&!t.startsWith(l+a.default.sep))throw Error(`Refusing to write outside docs dir: ${t}`);return t};for(let i of e.files){let m=t.u(a.default.relative(e.docsDir,i)),h=m.split(`/`),g=h[0],_,y;if(s.includes(g)&&g!==r?(_=g,y=h.slice(1).join(`/`)):g===r&&d?(_=r,y=h.slice(1).join(`/`)):(_=r,y=m),y)if(_===r)for(let t of c){let r=a.default.join(l,t,y);if(!v(r)){let s=p(e,`missingTranslation`,`warning`);s!==`off`&&n.push({file:m,level:s,message:`Missing translation for locale "${t}"`,suggestion:`Create a version at "${t}/${y}".`,fix:async()=>{let e=f(r),t=a.default.dirname(e);o.default.existsSync(t)||o.default.mkdirSync(t,{recursive:!0}),o.default.copyFileSync(i,e)}})}}else{let t=a.default.join(l,y),s=d?a.default.join(u,y):``;if(!(v(t)||s!==``&&v(s))){let t=p(e,`missingTranslation`,`low`);t!==`off`&&n.push({file:m,level:t,message:`Orphaned translation (source missing in "${r}")`,suggestion:`Remove this file or create the source at "${r}/${y}".`,fix:async()=>{o.default.unlinkSync(f(i))}})}}}return n}async function j(e){let t=[];if(!e.config.theme?.sidebar)return t;let n=new Set,r=e.config.theme.sidebar;for(let[i,a]of Object.entries(r))for(let r of a){if(!r.text){let n=p(e,`invalidFrontmatter`,`warning`);n!==`off`&&t.push({file:`boltdocs.config.ts`,level:n,message:`Sidebar item in group "${i}" is missing a label.`,suggestion:`Add a "text" property to the sidebar item.`})}if(r.link&&(n.add(r.link),!e.routeIndex.has(r.link))){let{bestMatch:n,similarity:i}=C(r.link,e.linkTree.routes),a=i>.6,o=p(e,`brokenLink`,`high`);o!==`off`&&t.push({file:`boltdocs.config.ts`,level:o,message:`Broken sidebar link: "${r.link}"`,suggestion:a?`Did you mean "${n}"?`:`Ensure the route exists and is correctly formatted.`})}}for(let r of e.linkTree.routes)if(!(r===`/`||r===``)&&!n.has(r)){let n=p(e,`orphanedPage`,`low`);n!==`off`&&t.push({file:`Sidebar`,level:n,message:`Orphaned page found: "${r}" is not linked in the sidebar.`,suggestion:`Consider adding it to the sidebar for better discoverability.`})}return t}async function M(e){let t=[],n=e.doctorConfig.checks.performance;if(!n?.enabled)return t;let r=a.default.resolve(e.root,`.boltdocs`,`reports`,`performance.json`);if(!o.default.existsSync(r))return t.push({file:`(build)`,level:p(e,`budgetExceeded`,`warning`)??`warning`,message:"Performance metrics not found. Run `boltdocs build` first."}),t;let i;try{i=JSON.parse(o.default.readFileSync(r,`utf-8`))}catch{return t.push({file:`(build)`,level:p(e,`budgetExceeded`,`warning`)??`warning`,message:`Failed to parse performance metrics file.`}),t}let s=n.budgets,c=p(e,`budgetExceeded`,`warning`),l=f(s?.maxJSBundleSize,1/0),u=f(s?.maxCSSBundleSize,1/0),d=f(s?.maxPageHTMLSize,1/0),m=s?.maxImagesKB??1/0,h=s?.maxBuildTime??1/0,g=s?.maxFontCount??1/0;if(l!==1/0&&i.totalJSBundleSize>l){let e=(i.totalJSBundleSize/1024).toFixed(0),n=(l/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`JS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Code-split large dependencies or lazy-load route components.`})}if(u!==1/0&&i.totalCSSBundleSize>u){let e=(i.totalCSSBundleSize/1024).toFixed(0),n=(u/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`CSS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Remove unused styles or split CSS by route.`})}if(d!==1/0){for(let e of i.pages)if(e.htmlSize>d){let n=(e.htmlSize/1024).toFixed(0),r=(d/1024).toFixed(0);t.push({file:e.route,level:c,message:`Page HTML size exceeds budget: ${n}kb > ${r}kb`,suggestion:`Reduce the amount of inline content or split into sub-pages.`})}}let _=m*1024;if(m!==1/0&&i.totalImagesSize>_){let e=(i.totalImagesSize/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`Image assets exceed budget: ${e}kb > ${m}kb`,suggestion:`Optimize images with lossy compression or use next-gen formats (webp/avif).`})}if(h!==1/0&&i.buildTime>h){let e=(i.buildTime/1e3).toFixed(1),n=(h/1e3).toFixed(1);t.push({file:`(build)`,level:c,message:`Build time exceeds budget: ${e}s > ${n}s`,suggestion:"Check for large unoptimized assets or increase `concurrency` in SSG options."})}return g!==1/0&&i.fontCount>g&&t.push({file:`(build)`,level:c,message:`Font files exceed budget: ${i.fontCount} > ${g}`,suggestion:`Reduce the number of font families or use variable fonts.`}),t}async function N(e){let t=a.default.resolve(e,`doctor.json`);if(o.default.existsSync(t)){(0,s.warn)(`"doctor.json" already exists at ${e}.`);return}try{o.default.writeFileSync(t,JSON.stringify(d,null,2)),(0,s.success)(`Created "doctor.json" with default configuration.`)}catch(e){(0,s.error)(`Failed to create "doctor.json": ${e}`)}}async function P(e=process.cwd(),t={}){if(t.init){await N(e);return}i.t();try{let n=await y(e),{format:u}=n.reporting,d=performance.now(),f=await r.t(`docs`,e),p=a.default.resolve(e,`docs`);if(o.default.existsSync(p)||(u===`pretty`&&(0,s.error)(`Docs dir not found at ${p}`),process.exit(1)),u===`pretty`){let t=i.n?` ${i.i(`v${i.n}`)}`:``;console.log(`\n ${s.colors.bold(`⚡`)} ${i.s(`boltdocs`)}${t} ${s.colors.dim(`—`)} ${s.colors.bold(`doctor`)} ${s.colors.dim(`· documentation health check`)}\n`),console.log(` ${s.colors.dim(`Docs dir ${p}`)}\n ${s.colors.dim(`Reports ${e}/.boltdocs/reports/`)}\n`)}u===`pretty`&&(0,s.info)(s.colors.dim(`🔍 Discovering files and routes...`));let h=(0,l.default)(n.exclude||[]),g=await new c.fdir().withFullPaths().filter(e=>{if(!(e.endsWith(`.md`)||e.endsWith(`.mdx`)))return!1;let t=a.default.relative(p,e).replace(/\\/g,`/`),n=t.split(`/`).some(e=>e.startsWith(`_`)&&e!==`_index.md`&&e!==`_index.mdx`);return!h(t)&&!n}).crawl(p).withPromise();for(let e of g)_.set(e,!0);let v=await b(p,e,f,g),x=f.base||`/`,S=x===`/`?``:x.endsWith(`/`)?x.slice(0,-1):x,C=new Set(v.routes),w=new Set(v.routes.map(e=>e.endsWith(`/`)?e:e+`/`)),E=new Set(v.routes.map(e=>e.endsWith(`/`)?e.slice(0,-1):e));u===`pretty`&&(0,s.info)(s.colors.dim(`🧪 Running diagnostic checks in parallel...`));let D={root:e,docsDir:p,config:f,doctorConfig:n,linkTree:v,files:g,options:t,routeIndex:C,routeIndexWithSlash:w,routeIndexWithoutSlash:E,basePrefix:S};u===`pretty`&&(0,s.info)(s.colors.dim(`🧪 Running diagnostic checks in parallel...`));let O=[T(D),k(D),A(D),j(D)];t.budget&&O.push(M(D));let[N,P,F,I,...L]=await Promise.all(O),R=t.budget?L[0]??[]:[],z=[...N,...P,...F,...I,...R];if(u===`pretty`){let e=e=>e>0?s.colors.red(`${e} issue${e===1?``:`s`}`):s.colors.green(`OK`),n=[{label:`Metadata checks ${e(N.length)}`,done:N.length===0},{label:`Link checks ${e(P.length)}`,done:P.length===0},{label:`i18n checks ${e(F.length)}`,done:F.length===0},{label:`Sidebar checks ${e(I.length)}`,done:I.length===0}];t.budget&&n.push({label:`Performance budget ${e(R.length)}`,done:R.length===0}),console.log(`\n${(0,s.tasks)(n)}\n`)}let B=0;if(t.fix){for(let e of z)if(e.fix){if(D.doctorConfig.fix.confirmChanges&&!await(0,s.confirm)(`Fix issue in "${e.file}": ${e.message}?`))continue;if(D.doctorConfig.fix.backupFiles){let t=a.default.resolve(D.docsDir,e.file);o.default.existsSync(t)&&await m(t,a.default.resolve(D.root,D.doctorConfig.fix.backupPath))}await e.fix(),B++}}let V=((performance.now()-d)/1e3).toFixed(2),H=z.filter(e=>e.level===`high`).length,U=z.filter(e=>e.level===`warning`).length,W=z.filter(e=>e.level===`low`).length,G={summary:{total:z.length,high:H,warning:U,low:W,fixed:B,duration:V},issues:z.map(e=>({...e,fix:void 0}))};if(n.reporting.outputFile){let t=a.default.resolve(e,n.reporting.outputFile);o.default.existsSync(a.default.dirname(t))||o.default.mkdirSync(a.default.dirname(t),{recursive:!0}),o.default.writeFileSync(t,JSON.stringify(G,null,2))}if(u===`json`)console.log(JSON.stringify(G,null,2));else if(u===`pretty`){let e=z.reduce((e,t)=>(e[t.file]||(e[t.file]=[]),e[t.file].push(t),e),{});if(z.length>0){console.log((0,s.section)({title:`Issues`,colors:{title:i.r}}));for(let[n,r]of Object.entries(e)){let e=r.some(e=>e.level===`high`)?`high`:r.some(e=>e.level===`warning`)?`warning`:`low`,a=e.toUpperCase(),o=e===`high`?(0,s.badge)({label:a,status:`error`}):e===`warning`?(0,s.badge)({label:a,status:`warning`}):(0,s.badge)({label:a,colors:{text:`#ffffff`,bg:i.r}});console.log(`\n ${o} ${s.colors.bold(n)}`);for(let e of r){let n=e.level===`high`?`✖`:e.level===`warning`?`⚠`:`ℹ`,r=e.level===`high`?s.colors.red:e.level===`warning`?s.colors.yellow:e=>(0,s.colorize)(e,i.r,`fg`);console.log(` ${r(n)} ${e.message}`),e.suggestion&&console.log(` ${s.colors.dim(`💡 ${e.suggestion}`)}`),t.fix&&e.fix&&console.log(` ${s.colors.green(`✅ Fixed automatically`)}`)}}console.log(``)}z.length===0?(console.log(` ${s.colors.green.bold(`✨ Everything looks perfect!`)} ${s.colors.dim(`— your documentation is in great shape.`)}`),console.log(` ${s.colors.dim(`Scanned ${g.length} file${g.length===1?``:`s`} in ${V}s`)}`)):(console.log(`\n${(0,s.section)({title:`Summary`,colors:{title:i.r}})}`),H>0&&console.log(` ${(0,s.badge)({label:String(H),status:`error`})} ${s.colors.bold(`high`)}`),U>0&&console.log(` ${(0,s.badge)({label:String(U),status:`warning`})} ${s.colors.bold(`warning`)}${U===1?``:`s`}`),W>0&&console.log(` ${(0,s.badge)({label:String(W),colors:{text:`#ffffff`,bg:i.r}})} ${s.colors.bold(`low`)}`),console.log(` ${s.colors.dim(`Scanned ${g.length} file${g.length===1?``:`s`} in ${V}s`)}`),B>0&&(0,s.success)(`Successfully fixed ${B} issues automatically!`),H>0?(0,s.error)(`Please fix the critical errors before building for production.`):(0,s.success)(`No critical issues found. You are ready to go!`))}n.reporting.failOnError&&H>0&&process.exit(1),n.reporting.maxWarnings!==-1&&U>n.reporting.maxWarnings&&(u===`pretty`&&(0,s.error)(`Failed: Too many warnings (${U} > ${n.reporting.maxWarnings})`),process.exit(1))}catch(e){(0,s.error)(`Doctor failed: ${e}`),process.exit(1)}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return d}});
6
+ const e=require(`./chunk-D1Md3oWO.cjs`),t=require(`./utils-ej6_SjIZ.cjs`),n=require(`./pages-external-DPiPFxxP.cjs`),r=require(`./config-BJp3lGzE.cjs`),i=require(`./update-check-DFQZyoSU.cjs`);let a=require(`node:path`);a=e.r(a);let o=require(`node:fs`);o=e.r(o);let s=require(`@bdocs/dui`),c=require(`fdir`),l=require(`picomatch`);l=e.r(l);let u=require(`fastest-levenshtein`);const d={$schema:`https://boltdocs.vercel.app/schemas/doctor-config.schema.json`,checks:{metadata:{enabled:!0,titleMin:10,titleMax:60,descriptionMin:50,required:[`title`,`description`],optional:[],validateDates:!1},links:{internal:!0,external:!1,timeout:1e4,concurrency:10,ignore:[]},i18n:{enabled:!0},performance:{enabled:!0,budgets:{maxJSBundleSize:`200kb`,maxCSSBundleSize:`30kb`,maxPageHTMLSize:`80kb`,maxImagesKB:500,maxBuildTime:3e4,maxFontCount:3}}},fix:{confirmChanges:!1,backupFiles:!1,backupPath:`.boltdocs/backups`},reporting:{format:`pretty`,outputFile:`.boltdocs/reports/doctor.json`,failOnError:!1,maxWarnings:-1},severity:{missingTranslation:`warning`,brokenLink:`high`,brokenAnchor:`warning`,largeFile:`warning`,orphanedPage:`low`,duplicateTitle:`low`,shortMetadata:`low`,missingMetadata:`warning`,malformedFrontmatter:`high`,invalidFrontmatter:`high`,budgetExceeded:`warning`},exclude:[]};function f(e,t){if(e==null)return t;if(typeof e==`number`)return e;let n=e.toLowerCase().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/);if(!n)return t;let r=Number.parseFloat(n[1]),i=n[2]||`b`;return Math.round(r*({b:1,kb:1024,mb:1024*1024,gb:1024*1024*1024}[i]||1))}function p(e,t,n){return e.doctorConfig.severity[t]||n}async function m(e,t){o.default.existsSync(t)||o.default.mkdirSync(t,{recursive:!0});let n=a.default.basename(e),r=new Date().toISOString().replace(/[:.]/g,`-`),i=a.default.join(t,`${n}.${r}.bak`);o.default.copyFileSync(e,i)}const h=new Map;function g(e){let n=h.get(e);if(n)return n;let r=(async()=>{let n=await t.d(e,!1);return{raw:n.raw,data:n.data,content:n.content}})();return h.set(e,r),r}const _=new Map;function v(e){if(_.has(e))return _.get(e);let t=!1;try{t=o.default.existsSync(e)&&o.default.statSync(e).isFile()}catch{t=!1}return _.set(e,t),t}async function y(e){let t=a.default.resolve(e,`doctor.json`);if(o.default.existsSync(t))try{let e=JSON.parse(o.default.readFileSync(t,`utf-8`));return{...d,...e,checks:{...d.checks,...e.checks,metadata:{...d.checks.metadata,...e.checks?.metadata},links:{...d.checks.links,...e.checks?.links},i18n:{...d.checks.i18n,...e.checks?.i18n},performance:{...d.checks.performance,...e.checks?.performance,budgets:{...d.checks.performance?.budgets,...e.checks?.performance?.budgets}}},fix:{...d.fix,...e.fix},reporting:{...d.reporting,...e.reporting},severity:{...d.severity,...e.severity},exclude:[...d.exclude,...e.exclude||[]]}}catch(e){(0,s.warn)(`Failed to parse doctor.json: ${e}`)}return d}async function b(e,r=process.cwd(),i,s){let l=a.default.resolve(r,`.boltdocs`,`generated`);o.default.existsSync(l)||o.default.mkdirSync(l,{recursive:!0});let u=s;u||=await new c.fdir().withFullPaths().filter(e=>e.endsWith(`.md`)||e.endsWith(`.mdx`)).crawl(e).withPromise();let d=i?.base||`/`,f=[];for(let n=0;n<u.length;n+=100){let r=u.slice(n,n+100),i=await Promise.all(r.map(async n=>{let r=a.default.isAbsolute(n)?n:a.default.resolve(e,n),i=a.default.relative(e,r),{data:o}=await g(r),s;return s=o.permalink?String(o.permalink).startsWith(`/`)?String(o.permalink):`/${o.permalink}`:t.a(i),d===`/`?s:(d.endsWith(`/`)?d:d+`/`)+(s.startsWith(`/`)?s.substring(1):s)}));f.push(...i)}f.includes(d)||f.push(d);let p=n.n(e,i);for(let e of p)f.includes(e)||f.push(e);let m={routes:Array.from(new Set(f)).sort(),timestamp:Date.now()};return o.default.writeFileSync(a.default.resolve(l,`link-tree.json`),JSON.stringify(m,null,2)),m}function x(e,t){if(e===t)return 1;if(!e||!t)return 0;let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean),i=n[n.length-1]||``,a=r[r.length-1]||``;if(i===a){let e=0;for(let t of n)r.includes(t)&&e++;return e>=2?.99:.9}if(i.length>3&&a.length>3&&(a.startsWith(i)||i.startsWith(a))&&Math.min(i.length,a.length)/Math.max(i.length,a.length)>.5)return .88;let o=1-(0,u.distance)(i,a)/Math.max(i.length,a.length);return o>.8?o*.95:1-(0,u.distance)(e,t)/Math.max(e.length,t.length)}const S=new Map;function C(e,t){if(S.has(e))return S.get(e);let n=e.length,r=``,i=0;for(let a of t){if(a===e)continue;let t=a.length,o=Math.max(n,t);if(o===0)continue;let s=1-Math.abs(n-t)/o;if(s<=.8&&s<=i)continue;let c=x(e,a);c>i&&(i=c,r=a)}let a={bestMatch:r,similarity:i};return S.set(e,a),a}function w(e,t,n){let r=/```[\s\S]*?```/g,i=/`[^`\n]*`/g,a=0,o=[],s=t=>{e=e.replace(t,e=>(o.push(e),`__BD_CODE_MASK_${a++}__`))};return s(r),s(i),e.split(t).join(n).replace(/__BD_CODE_MASK_(\d+)__/g,(e,t)=>o[Number(t)]??``)}async function T(e){let n=[];if(!e.doctorConfig.checks.metadata.enabled)return n;let{titleMin:r,titleMax:i,descriptionMin:o}=e.doctorConfig.checks.metadata,s=new Map;for(let c of e.files){let l=t.u(a.default.relative(e.docsDir,c));try{let{raw:a,data:u}=await g(c);if(a.trim().startsWith(`---`)&&a.split(`---`).length>=3&&Object.keys(u).length===0){let t=p(e,`malformedFrontmatter`,`high`);t!==`off`&&n.push({file:l,level:t,message:`Malformed frontmatter (YAML parsing failed).`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}let d=t.g.safeParse(u);if(!d.success){let t=p(e,`invalidFrontmatter`,`high`);if(t!==`off`)for(let e of d.error.issues)n.push({file:l,level:t,message:`Invalid frontmatter field "${e.path.join(`.`)}": ${e.message}`,suggestion:`Ensure the field follows the correct type.`})}let f=Array.from(new Set([`title`,...e.doctorConfig.checks.metadata.required]));for(let t of f)if(u[t]===void 0){let r=p(e,`missingMetadata`,`warning`);r!==`off`&&n.push({file:l,level:r,message:`Missing required frontmatter field: "${t}".`,suggestion:`Add the "${t}" field to your frontmatter.`})}if(e.doctorConfig.checks.metadata.validateDates){let t=[`date`,`lastUpdated`,...e.doctorConfig.checks.metadata.optional.filter(e=>e.toLowerCase().includes(`date`))];for(let r of t)if(u[r]&&Number.isNaN(Date.parse(String(u[r])))){let t=p(e,`invalidFrontmatter`,`high`);t!==`off`&&n.push({file:l,level:t,message:`Invalid date format in field "${r}": "${u[r]}".`,suggestion:`Use a valid ISO date format (e.g., YYYY-MM-DD).`})}}if(u.title){let t=String(u.title);if(t.length<r){let i=p(e,`shortMetadata`,`low`);i!==`off`&&n.push({file:l,level:i,message:`Title is too short (${t.length} chars).`,suggestion:`Titles should be at least ${r} characters for better SEO.`})}else if(t.length>i){let r=p(e,`shortMetadata`,`low`);r!==`off`&&n.push({file:l,level:r,message:`Title is too long (${t.length} chars).`,suggestion:`Titles should be under ${i} characters.`})}let a=s.get(t)||[];a.push(l),s.set(t,a)}if(u.description&&String(u.description).length<o){let t=p(e,`shortMetadata`,`low`);t!==`off`&&n.push({file:l,level:t,message:`Description is very short.`,suggestion:`Descriptions should ideally be at least ${o} characters.`})}}catch(t){if(t instanceof Error){let r=p(e,`malformedFrontmatter`,`high`);r!==`off`&&n.push({file:l,level:r,message:`Malformed frontmatter (YAML error): ${t.message}`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}}}for(let[t,r]of s.entries())if(r.length>1){let i=p(e,`duplicateTitle`,`low`);if(i!==`off`)for(let e of r)n.push({file:e,level:i,message:`Duplicate title found: "${t}"`,suggestion:`Ensure each page has a unique title. Also used in: ${r.filter(t=>t!==e).join(`, `)}`})}return n}const E=/(?:\[([^\]]*)\]\(([^)\s]+)(?:\s+["'][^"']*["'])?\))|(?:href=["']([^"']+)["'])|(?:<Link\s+[^>]*?to=["'](\/[^"']+)["'])/g,D=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`];function O(e){let t=[],n=e=>{t.includes(e)||t.push(e)};n(e),e.endsWith(`/`)?n(e.slice(0,-1)):n(e+`/`);let r=e.replace(/\.(md|mdx)$/i,``);r!==e&&(n(r),n(r+`/`));let i=e.replace(/\/index\.(md|mdx)$/i,``);return i!==e&&(n(i),n(i+`/`)),n(e.endsWith(`/`)?e+`index`:e+`/index`),e.endsWith(`/index`)&&n(e.replace(/\/index$/,``)),t}async function k(e){let n=[],{internal:r,external:i,ignore:c,timeout:l,concurrency:u}=e.doctorConfig.checks.links;if(!r&&!i&&!e.options.checkExternal)return n;let d=new Set,f=5e5;for(let s of e.files){let l=t.u(a.default.relative(e.docsDir,s)),{content:u}=await g(s),m=[...(u.length>f?u.slice(0,f):u).replace(/<!--[\s\S]*?-->/g,``).replace(/```[\s\S]*?```/g,``).replace(/`[^`\n]*`/g,``).matchAll(E)];for(let t of m){let u=t[2]||t[3]||t[4],f=!!t[2],m=!!t[4];if(!u||c.some(e=>u.includes(e)))continue;if(/^(https?:|mailto:|tel:|data:|javascript:|blob:|ftp:)/i.test(u)){(i||e.options.checkExternal)&&d.add({url:u,file:s});continue}if(u.startsWith(`//`)){(i||e.options.checkExternal)&&d.add({url:u,file:s});continue}if(!r||u.startsWith(`#`))continue;let g;try{g=decodeURIComponent(u.split(`#`)[0].split(`?`)[0])}catch{g=u.split(`#`)[0].split(`?`)[0]}if(!g)continue;let _=!1,y=!1,b=``;if(g.startsWith(`/`)){let t=O(g);for(let n of t)if(e.routeIndex.has(n)||e.routeIndexWithSlash.has(n)||e.routeIndexWithoutSlash.has(n)){_=!0;break}if(!_&&e.basePrefix)for(let n of t){let t=e.basePrefix+(n.startsWith(`/`)?n:`/`+n);if(t!==n&&(e.routeIndex.has(t)||e.routeIndexWithSlash.has(t))){y=!0,b=t;break}}if(!_&&!y){let t=g.replace(/^\/+/,``),n=a.default.join(e.docsDir,t);_=D.some(e=>v(n+e))}}else{let e=a.default.resolve(a.default.dirname(s),g);_=D.some(t=>v(e+t))}if(!_){let{bestMatch:t,similarity:r}=C(g,e.linkTree.routes);y&&(t=b,r=1);let i=r>.6||y,a=r>.75&&t!==g||y,c=p(e,`brokenLink`,`high`);c!==`off`&&n.push({file:l,level:c,message:`Broken internal link: "${u}"`,suggestion:i?`Did you mean "${t}"?`:`Ensure the target exists or check for typos.`,fix:a?async()=>{let e=u.includes(`#`)?`#`+u.split(`#`)[1]:``,n=f?`(${u})`:m?`to="${u}"`:`href="${u}"`,r=f?`(${t}${e})`:m?`to="${t}${e}"`:`href="${t}${e}"`,i=w(o.default.readFileSync(s,`utf-8`),n,r);o.default.writeFileSync(s,i),h.delete(s)}:void 0})}}}if(d.size>0){(0,s.info)(s.colors.gray(`Verifying ${d.size} external links...`));let r=new Map;for(let e of d)r.has(e.url)||r.set(e.url,[]),r.get(e.url).push(e.file);let i=async e=>{try{let t=new AbortController,n=setTimeout(()=>t.abort(),l),r=await fetch(e,{method:`HEAD`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}});return clearTimeout(n),!r.ok&&r.status!==404?{url:e,ok:(await fetch(e,{method:`GET`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}})).ok}:{url:e,ok:r.ok}}catch(t){return{url:e,ok:!1,error:t instanceof Error?t.message:String(t)}}},o=Array.from(r.keys()),c=[];for(let e=0;e<o.length;e+=u){let t=o.slice(e,e+u),n=await Promise.allSettled(t.map(i));c.push(...n.map(e=>e.status===`fulfilled`?e.value:{url:`unknown`,ok:!1,error:String(e.reason)}))}for(let i of c)if(!i.ok){let o=p(e,`brokenLink`,`warning`);if(o!==`off`){let s=r.get(i.url)||[];for(let r of s)n.push({file:t.u(a.default.relative(e.docsDir,r)),level:o,message:`Broken external link: "${i.url}"`,suggestion:`Verify the URL or update it if it's permanently down. Error: ${i.error||`Status >= 400`}`})}}}return n}async function A(e){let n=[];if(!e.doctorConfig.checks.i18n.enabled||!e.config.i18n)return n;let{defaultLocale:r,locales:i}=e.config.i18n,s=Object.keys(i),c=s.filter(e=>e!==r);if(c.length===0)return n;let l=a.default.resolve(e.docsDir),u=a.default.join(l,r),d=o.default.existsSync(u)&&o.default.statSync(u).isDirectory(),f=e=>{let t=a.default.resolve(e);if(t!==l&&!t.startsWith(l+a.default.sep))throw Error(`Refusing to write outside docs dir: ${t}`);return t};for(let i of e.files){let m=t.u(a.default.relative(e.docsDir,i)),h=m.split(`/`),g=h[0],_,y;if(s.includes(g)&&g!==r?(_=g,y=h.slice(1).join(`/`)):g===r&&d?(_=r,y=h.slice(1).join(`/`)):(_=r,y=m),y)if(_===r)for(let t of c){let r=a.default.join(l,t,y);if(!v(r)){let s=p(e,`missingTranslation`,`warning`);s!==`off`&&n.push({file:m,level:s,message:`Missing translation for locale "${t}"`,suggestion:`Create a version at "${t}/${y}".`,fix:async()=>{let e=f(r),t=a.default.dirname(e);o.default.existsSync(t)||o.default.mkdirSync(t,{recursive:!0}),o.default.copyFileSync(i,e)}})}}else{let t=a.default.join(l,y),s=d?a.default.join(u,y):``;if(!(v(t)||s!==``&&v(s))){let t=p(e,`missingTranslation`,`low`);t!==`off`&&n.push({file:m,level:t,message:`Orphaned translation (source missing in "${r}")`,suggestion:`Remove this file or create the source at "${r}/${y}".`,fix:async()=>{o.default.unlinkSync(f(i))}})}}}return n}async function j(e){let t=[];if(!e.config.theme?.sidebar)return t;let n=new Set,r=e.config.theme.sidebar;for(let[i,a]of Object.entries(r))for(let r of a){if(!r.text){let n=p(e,`invalidFrontmatter`,`warning`);n!==`off`&&t.push({file:`boltdocs.config.ts`,level:n,message:`Sidebar item in group "${i}" is missing a label.`,suggestion:`Add a "text" property to the sidebar item.`})}if(r.link&&(n.add(r.link),!e.routeIndex.has(r.link))){let{bestMatch:n,similarity:i}=C(r.link,e.linkTree.routes),a=i>.6,o=p(e,`brokenLink`,`high`);o!==`off`&&t.push({file:`boltdocs.config.ts`,level:o,message:`Broken sidebar link: "${r.link}"`,suggestion:a?`Did you mean "${n}"?`:`Ensure the route exists and is correctly formatted.`})}}for(let r of e.linkTree.routes)if(!(r===`/`||r===``)&&!n.has(r)){let n=p(e,`orphanedPage`,`low`);n!==`off`&&t.push({file:`Sidebar`,level:n,message:`Orphaned page found: "${r}" is not linked in the sidebar.`,suggestion:`Consider adding it to the sidebar for better discoverability.`})}return t}async function M(e){let t=[],n=e.doctorConfig.checks.performance;if(!n?.enabled)return t;let r=a.default.resolve(e.root,`.boltdocs`,`reports`,`performance.json`);if(!o.default.existsSync(r))return t.push({file:`(build)`,level:p(e,`budgetExceeded`,`warning`)??`warning`,message:"Performance metrics not found. Run `boltdocs build` first."}),t;let i;try{i=JSON.parse(o.default.readFileSync(r,`utf-8`))}catch{return t.push({file:`(build)`,level:p(e,`budgetExceeded`,`warning`)??`warning`,message:`Failed to parse performance metrics file.`}),t}let s=n.budgets,c=p(e,`budgetExceeded`,`warning`),l=f(s?.maxJSBundleSize,1/0),u=f(s?.maxCSSBundleSize,1/0),d=f(s?.maxPageHTMLSize,1/0),m=s?.maxImagesKB??1/0,h=s?.maxBuildTime??1/0,g=s?.maxFontCount??1/0;if(l!==1/0&&i.totalJSBundleSize>l){let e=(i.totalJSBundleSize/1024).toFixed(0),n=(l/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`JS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Code-split large dependencies or lazy-load route components.`})}if(u!==1/0&&i.totalCSSBundleSize>u){let e=(i.totalCSSBundleSize/1024).toFixed(0),n=(u/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`CSS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Remove unused styles or split CSS by route.`})}if(d!==1/0){for(let e of i.pages)if(e.htmlSize>d){let n=(e.htmlSize/1024).toFixed(0),r=(d/1024).toFixed(0);t.push({file:e.route,level:c,message:`Page HTML size exceeds budget: ${n}kb > ${r}kb`,suggestion:`Reduce the amount of inline content or split into sub-pages.`})}}let _=m*1024;if(m!==1/0&&i.totalImagesSize>_){let e=(i.totalImagesSize/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`Image assets exceed budget: ${e}kb > ${m}kb`,suggestion:`Optimize images with lossy compression or use next-gen formats (webp/avif).`})}if(h!==1/0&&i.buildTime>h){let e=(i.buildTime/1e3).toFixed(1),n=(h/1e3).toFixed(1);t.push({file:`(build)`,level:c,message:`Build time exceeds budget: ${e}s > ${n}s`,suggestion:"Check for large unoptimized assets or increase `concurrency` in SSG options."})}return g!==1/0&&i.fontCount>g&&t.push({file:`(build)`,level:c,message:`Font files exceed budget: ${i.fontCount} > ${g}`,suggestion:`Reduce the number of font families or use variable fonts.`}),t}async function N(e){let t=a.default.resolve(e,`doctor.json`);if(o.default.existsSync(t)){(0,s.warn)(`"doctor.json" already exists at ${e}.`);return}try{o.default.writeFileSync(t,JSON.stringify(d,null,2)),(0,s.success)(`Created "doctor.json" with default configuration.`)}catch(e){(0,s.error)(`Failed to create "doctor.json": ${e}`)}}async function P(e=process.cwd(),t={}){if(t.init){await N(e);return}i.t();try{let n=await y(e),{format:u}=n.reporting,d=performance.now(),f=await r.t(`docs`,e),p=a.default.resolve(e,`docs`);if(o.default.existsSync(p)||(u===`pretty`&&(0,s.error)(`Docs dir not found at ${p}`),process.exit(1)),u===`pretty`){let t=i.n?` ${i.i(`v${i.n}`)}`:``;console.log(`\n ${s.colors.bold(`⚡`)} ${i.s(`boltdocs`)}${t} ${s.colors.dim(`—`)} ${s.colors.bold(`doctor`)} ${s.colors.dim(`· documentation health check`)}\n`),console.log(` ${s.colors.dim(`Docs dir ${p}`)}\n ${s.colors.dim(`Reports ${e}/.boltdocs/reports/`)}\n`)}u===`pretty`&&(0,s.info)(s.colors.dim(`🔍 Discovering files and routes...`));let h=(0,l.default)(n.exclude||[]),g=await new c.fdir().withFullPaths().filter(e=>{if(!(e.endsWith(`.md`)||e.endsWith(`.mdx`)))return!1;let t=a.default.relative(p,e).replace(/\\/g,`/`),n=t.split(`/`).some(e=>e.startsWith(`_`)&&e!==`_index.md`&&e!==`_index.mdx`);return!h(t)&&!n}).crawl(p).withPromise();for(let e of g)_.set(e,!0);let v=await b(p,e,f,g),x=f.base||`/`,S=x===`/`?``:x.endsWith(`/`)?x.slice(0,-1):x,C=new Set(v.routes),w=new Set(v.routes.map(e=>e.endsWith(`/`)?e:e+`/`)),E=new Set(v.routes.map(e=>e.endsWith(`/`)?e.slice(0,-1):e));u===`pretty`&&(0,s.info)(s.colors.dim(`🧪 Running diagnostic checks in parallel...`));let D={root:e,docsDir:p,config:f,doctorConfig:n,linkTree:v,files:g,options:t,routeIndex:C,routeIndexWithSlash:w,routeIndexWithoutSlash:E,basePrefix:S};u===`pretty`&&(0,s.info)(s.colors.dim(`🧪 Running diagnostic checks in parallel...`));let O=[T(D),k(D),A(D),j(D)];t.budget&&O.push(M(D));let[N,P,F,I,...L]=await Promise.all(O),R=t.budget?L[0]??[]:[],z=[...N,...P,...F,...I,...R];if(u===`pretty`){let e=e=>e>0?s.colors.red(`${e} issue${e===1?``:`s`}`):s.colors.green(`OK`),n=[{label:`Metadata checks ${e(N.length)}`,done:N.length===0},{label:`Link checks ${e(P.length)}`,done:P.length===0},{label:`i18n checks ${e(F.length)}`,done:F.length===0},{label:`Sidebar checks ${e(I.length)}`,done:I.length===0}];t.budget&&n.push({label:`Performance budget ${e(R.length)}`,done:R.length===0}),console.log(`\n${(0,s.tasks)(n)}\n`)}let B=0;if(t.fix){for(let e of z)if(e.fix){if(D.doctorConfig.fix.confirmChanges&&!await(0,s.confirm)(`Fix issue in "${e.file}": ${e.message}?`))continue;if(D.doctorConfig.fix.backupFiles){let t=a.default.resolve(D.docsDir,e.file);o.default.existsSync(t)&&await m(t,a.default.resolve(D.root,D.doctorConfig.fix.backupPath))}await e.fix(),B++}}let V=((performance.now()-d)/1e3).toFixed(2),H=z.filter(e=>e.level===`high`).length,U=z.filter(e=>e.level===`warning`).length,W=z.filter(e=>e.level===`low`).length,G={summary:{total:z.length,high:H,warning:U,low:W,fixed:B,duration:V},issues:z.map(e=>({...e,fix:void 0}))};if(n.reporting.outputFile){let t=a.default.resolve(e,n.reporting.outputFile);o.default.existsSync(a.default.dirname(t))||o.default.mkdirSync(a.default.dirname(t),{recursive:!0}),o.default.writeFileSync(t,JSON.stringify(G,null,2))}if(u===`json`)console.log(JSON.stringify(G,null,2));else if(u===`pretty`){let e=z.reduce((e,t)=>(e[t.file]||(e[t.file]=[]),e[t.file].push(t),e),{});if(z.length>0){console.log((0,s.section)({title:`Issues`,colors:{title:i.r}}));for(let[n,r]of Object.entries(e)){let e=r.some(e=>e.level===`high`)?`high`:r.some(e=>e.level===`warning`)?`warning`:`low`,a=e.toUpperCase(),o=e===`high`?(0,s.badge)({label:a,status:`error`}):e===`warning`?(0,s.badge)({label:a,status:`warning`}):(0,s.badge)({label:a,colors:{text:`#ffffff`,bg:i.r}});console.log(`\n ${o} ${s.colors.bold(n)}`);for(let e of r){let n=e.level===`high`?`✖`:e.level===`warning`?`⚠`:`ℹ`,r=e.level===`high`?s.colors.red:e.level===`warning`?s.colors.yellow:e=>(0,s.colorize)(e,i.r,`fg`);console.log(` ${r(n)} ${e.message}`),e.suggestion&&console.log(` ${s.colors.dim(`💡 ${e.suggestion}`)}`),t.fix&&e.fix&&console.log(` ${s.colors.green(`✅ Fixed automatically`)}`)}}console.log(``)}z.length===0?(console.log(` ${s.colors.green.bold(`✨ Everything looks perfect!`)} ${s.colors.dim(`— your documentation is in great shape.`)}`),console.log(` ${s.colors.dim(`Scanned ${g.length} file${g.length===1?``:`s`} in ${V}s`)}`)):(console.log(`\n${(0,s.section)({title:`Summary`,colors:{title:i.r}})}`),H>0&&console.log(` ${(0,s.badge)({label:String(H),status:`error`})} ${s.colors.bold(`high`)}`),U>0&&console.log(` ${(0,s.badge)({label:String(U),status:`warning`})} ${s.colors.bold(`warning`)}${U===1?``:`s`}`),W>0&&console.log(` ${(0,s.badge)({label:String(W),colors:{text:`#ffffff`,bg:i.r}})} ${s.colors.bold(`low`)}`),console.log(` ${s.colors.dim(`Scanned ${g.length} file${g.length===1?``:`s`} in ${V}s`)}`),B>0&&(0,s.success)(`Successfully fixed ${B} issues automatically!`),H>0?(0,s.error)(`Please fix the critical errors before building for production.`):(0,s.success)(`No critical issues found. You are ready to go!`))}n.reporting.failOnError&&H>0&&process.exit(1),n.reporting.maxWarnings!==-1&&U>n.reporting.maxWarnings&&(u===`pretty`&&(0,s.error)(`Failed: Too many warnings (${U} > ${n.reporting.maxWarnings})`),process.exit(1))}catch(e){(0,s.error)(`Doctor failed: ${e}`),process.exit(1)}}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return d}});