boltdocs 2.8.4 → 2.9.0

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 (87) hide show
  1. package/bin/boltdocs.js +7 -6
  2. package/dist/{banner-DFACg5Dy.d.cts → banner-C_xkGxzI.d.cts} +1 -1
  3. package/dist/{banner-BLTQUA2O.d.ts → banner-D2NddBfF.d.ts} +1 -1
  4. package/dist/cache-C2PiGyg8.cjs +6 -0
  5. package/dist/cache-DFW4R3S0.mjs +6 -0
  6. package/dist/chunk-Ds5LZdWN.cjs +6 -0
  7. package/dist/client/index.cjs +464 -279
  8. package/dist/client/index.d.cts +74 -8
  9. package/dist/client/index.d.ts +74 -8
  10. package/dist/client/index.js +463 -280
  11. package/dist/client/mdx.cjs +1 -1
  12. package/dist/client/mdx.js +1 -1
  13. package/dist/client/primitives.cjs +4 -4
  14. package/dist/client/primitives.d.cts +1 -1
  15. package/dist/client/primitives.d.ts +1 -1
  16. package/dist/client/primitives.js +4 -4
  17. package/dist/client/theme/neutral.css +5 -3
  18. package/dist/client/theme/reset.css +19 -0
  19. package/dist/{docs-layout-CVCf3xkZ.cjs → docs-layout-3TpAt6MB.cjs} +302 -238
  20. package/dist/{docs-layout-BBv6wILp.js → docs-layout-6FQ8__ok.js} +303 -239
  21. package/dist/doctor-BY1tSmQd.mjs +34 -0
  22. package/dist/{doctor-DT4jh07O.cjs → doctor-Bknon8f5.cjs} +1 -1
  23. package/dist/doctor-DcFLi4t1.cjs +34 -0
  24. package/dist/{doctor-BGPdO1Ah.mjs → doctor-wsPTzt8Y.mjs} +1 -1
  25. package/dist/{generator-CC2yHzhZ.cjs → generator-BEIF6MOx.cjs} +2 -2
  26. package/dist/{generator-BHCrLU6h.mjs → generator-DILs0EFN.mjs} +1 -1
  27. package/dist/handler-B31cxNw0.mjs +6 -0
  28. package/dist/handler-DfhH9D1b.mjs +28 -0
  29. package/dist/handler-Djy0HfsI.cjs +28 -0
  30. package/dist/{icons-dev-C8sFxeBk.cjs → icons-dev-BryEFkJu.cjs} +90 -4
  31. package/dist/{icons-dev-CFcv5Nb8.js → icons-dev-kJyGWNeg.js} +73 -5
  32. package/dist/{image-DCMxxidi.cjs → image-B9YA_oQ_.cjs} +17 -9
  33. package/dist/{image-DufDOid8.js → image-CjYu9Eml.js} +17 -9
  34. package/dist/{mdx-Bto8CvGl.js → mdx-Cy_c2zio.js} +116 -33
  35. package/dist/{mdx-BH9kHiF9.cjs → mdx-WXjAMS8Y.cjs} +121 -32
  36. package/dist/{meta-loader-Cv9O0Pzl.cjs → meta-loader-D0V6oOQt.cjs} +1 -1
  37. package/dist/node/cli-entry.cjs +3 -3
  38. package/dist/node/cli-entry.mjs +3 -3
  39. package/dist/node/index.cjs +1 -1
  40. package/dist/node/index.d.cts +368 -24
  41. package/dist/node/index.d.mts +369 -24
  42. package/dist/node/index.mjs +1 -1
  43. package/dist/node/routes/worker.cjs +1 -1
  44. package/dist/node/routes/worker.mjs +1 -1
  45. package/dist/node-DV-EPtMU.mjs +160 -0
  46. package/dist/node-vOVNRABe.cjs +160 -0
  47. package/dist/{package-DlgexgpQ.mjs → package-BK_82QLX.mjs} +1 -1
  48. package/dist/{package-CwNjt3Sd.cjs → package-OxKE0p6j.cjs} +1 -1
  49. package/dist/{parser-B7-6PyQz.cjs → parser-C2Pw18LY.cjs} +1 -1
  50. package/dist/{parser-BzB-zCkF.cjs → parser-DJoEF96Y.cjs} +1 -1
  51. package/dist/{parser-9LqyiEnB.mjs → parser-DScG_PTs.mjs} +1 -1
  52. package/dist/routes--LYHSHT7.cjs +6 -0
  53. package/dist/routes-BAsfsn_e.mjs +6 -0
  54. package/dist/routes-C6Kr2HFN.cjs +6 -0
  55. package/dist/routes-CKgGAy8P.mjs +6 -0
  56. package/dist/{search-dialog-Cvux-qSk.cjs → search-dialog-BhXg05Ri.cjs} +1 -1
  57. package/dist/{search-dialog-CmHYOt18.cjs → search-dialog-BsAiQgnx.cjs} +2 -2
  58. package/dist/{search-dialog-jHZ21G4i.js → search-dialog-CaOO1Q4i.js} +2 -2
  59. package/dist/{search-dialog-Cr7SC8Xt.cjs → search-dialog-CzwvKoLW.cjs} +1 -1
  60. package/dist/{search-dialog-DBNaG5At.js → search-dialog-DRNJsxOv.js} +1 -1
  61. package/dist/{search-dialog-e86WPpck.js → search-dialog-DaR66wl0.js} +1 -1
  62. package/dist/shiki-adapter-CUtj-xKv.cjs +6 -0
  63. package/dist/shiki-adapter-EZptJAmW.mjs +6 -0
  64. package/dist/shiki-adapter-F-P-lDon.mjs +6 -0
  65. package/dist/shiki-adapter-PQBl32AN.cjs +6 -0
  66. package/dist/{sidebar-kQBonN82.d.ts → sidebar-BtJyWHy4.d.cts} +42 -5
  67. package/dist/{sidebar---RgTmZD.d.cts → sidebar-C4fuRYYS.d.ts} +42 -5
  68. package/dist/{utils-BYITg7T5.mjs → utils-DC4Wq-S2.mjs} +1 -1
  69. package/dist/{utils-Cjmx1hhk.cjs → utils-wHud9ny5.cjs} +1 -1
  70. package/dist/worker-pool-BS1LX67P.cjs +6 -0
  71. package/dist/worker-pool-DRv8ef4z.mjs +6 -0
  72. package/package.json +6 -3
  73. package/src/shared/types.ts +36 -3
  74. package/dist/cache-BMUyNiiA.mjs +0 -6
  75. package/dist/cache-CKm45d2w.cjs +0 -6
  76. package/dist/chunk-CU-zTemE.cjs +0 -6
  77. package/dist/doctor-Dnv77Lfx.mjs +0 -28
  78. package/dist/doctor-VBPlQf7d.cjs +0 -28
  79. package/dist/node-JM9bx0mO.cjs +0 -160
  80. package/dist/node-q-Y2mdLX.mjs +0 -160
  81. package/dist/routes-3sAccArX.cjs +0 -6
  82. package/dist/routes-DZpXqq1p.mjs +0 -6
  83. package/dist/routes-DjoxNeef.mjs +0 -6
  84. package/dist/routes-DpJnb2VS.cjs +0 -6
  85. package/dist/worker-pool-DXLyeHJg.cjs +0 -6
  86. package/dist/worker-pool-Kn4F9gDq.mjs +0 -6
  87. /package/dist/{meta-loader-DzwDFtdT.mjs → meta-loader-By22EnYa.mjs} +0 -0
@@ -3,8 +3,8 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- const require_icons_dev = require('./icons-dev-C8sFxeBk.cjs');
7
- const require_search_dialog = require('./search-dialog-Cvux-qSk.cjs');
6
+ const require_icons_dev = require('./icons-dev-BryEFkJu.cjs');
7
+ const require_search_dialog = require('./search-dialog-BhXg05Ri.cjs');
8
8
  let react = require("react");
9
9
  let react_router_dom = require("react-router-dom");
10
10
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -3,8 +3,8 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import { J as Search, et as useConfig, x as useRoutes } from "./icons-dev-CFcv5Nb8.js";
7
- import { n as Navbar, r as ErrorBoundary, t as SearchDialog$1 } from "./search-dialog-e86WPpck.js";
6
+ import { Z as Search, rt as useConfig, x as useRoutes } from "./icons-dev-kJyGWNeg.js";
7
+ import { n as Navbar, r as ErrorBoundary, t as SearchDialog$1 } from "./search-dialog-DaR66wl0.js";
8
8
  import { useCallback, useEffect, useMemo, useState } from "react";
9
9
  import { useNavigate } from "react-router-dom";
10
10
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -3,6 +3,6 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- const require_search_dialog = require('./search-dialog-CmHYOt18.cjs');
6
+ const require_search_dialog = require('./search-dialog-BsAiQgnx.cjs');
7
7
 
8
8
  exports.SearchDialog = require_search_dialog.SearchDialog;
@@ -3,6 +3,6 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import { t as SearchDialog } from "./search-dialog-jHZ21G4i.js";
6
+ import { t as SearchDialog } from "./search-dialog-CaOO1Q4i.js";
7
7
 
8
8
  export { SearchDialog };
@@ -3,7 +3,7 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import { G as Moon, I as FileText, K as MoreVertical, L as Hash, N as CornerDownLeft, P as ExternalLink, Y as Sun, Z as X, _ as Link, h as XSocial, o as Discord, s as Github, t as Bluesky, y as cn } from "./icons-dev-CFcv5Nb8.js";
6
+ import { B as Hash, J as Moon, N as CornerDownLeft, P as ExternalLink, Q as Sun, Y as MoreVertical, _ as Link, et as X, h as XSocial, o as Discord, s as Github, t as Bluesky, y as cn, z as FileText } from "./icons-dev-kJyGWNeg.js";
7
7
  import { Component, useEffect, useState } from "react";
8
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
9
9
  import * as RAC from "react-aria-components";
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Boltdocs - https://boltdocs.vercel.app
3
+ * Copyright (c) 2026 Jesus Alcala
4
+ * Licensed under the MIT License.
5
+ */
6
+ const e=require(`./chunk-Ds5LZdWN.cjs`),t=require(`./utils-wHud9ny5.cjs`);let n=require(`@bdocs/dui`),r=require(`shiki/engine/javascript`),i=require(`shiki/core`),a=require(`@shikijs/themes/github-light`);a=e.n(a);let o=require(`@shikijs/themes/github-dark`);o=e.n(o);let s=require(`@shikijs/themes/tokyo-night`);s=e.n(s);let c=require(`@shikijs/themes/dracula`);c=e.n(c);let l=require(`@shikijs/themes/nord`);l=e.n(l);let u=require(`@shikijs/themes/one-dark-pro`);u=e.n(u);let d=require(`@shikijs/themes/one-light`);d=e.n(d);let f=require(`@shikijs/langs/html`);f=e.n(f);let p=require(`@shikijs/langs/js`);p=e.n(p);let m=require(`@shikijs/langs/ts`);m=e.n(m);let h=require(`@shikijs/langs/tsx`);h=e.n(h);let g=require(`@shikijs/langs/css`);g=e.n(g);let _=require(`@shikijs/langs/json`);_=e.n(_);let v=require(`@shikijs/langs/bash`);v=e.n(v);let y=require(`@shikijs/langs/markdown`);y=e.n(y);let b=require(`@shikijs/langs/mdx`);b=e.n(b);let x=require(`@shikijs/langs/yaml`);x=e.n(x);let S=require(`@shikijs/langs/rust`);S=e.n(S);let C=require(`@shikijs/langs/toml`);C=e.n(C);let w=require(`@shikijs/langs/csv`);w=e.n(w);const T={ROOT:`root`,ELEMENT:`element`,TEXT:`text`,COMMENT:`comment`,CODE:`code`,INLINE_CODE:`inlineCode`,HEADING:`heading`,PARAGRAPH:`paragraph`,LINK:`link`,IMAGE:`image`,LIST:`list`,LIST_ITEM:`listItem`,JSX_FLOW_ELEMENT:`mdxJsxFlowElement`,JSX_TEXT_ELEMENT:`mdxJsxTextElement`,JSX_ATTRIBUTE:`mdxJsxAttribute`,FLOW_EXPRESSION:`mdxFlowExpression`,TEXT_EXPRESSION:`mdxTextExpression`,ESM:`mdxjsEsm`},E={TITLE:`data-title`,LANG:`data-lang`,HIGHLIGHTED:`data-highlighted`,HIGHLIGHTED_HTML:`data-highlighted-html`},D={LINE_NUMBERS:`shiki-line-numbers`,WORD_WRAP:`shiki-word-wrap`,FALLBACK:`shiki-fallback`},O={LIGHT:`github-light`,DARK:`github-dark`},k={LANG:`plaintext`,MDX_DEFAULT_LANG:`text`},A=[a.default.default||a.default,o.default.default||o.default,s.default.default||s.default,c.default.default||c.default,l.default.default||l.default,u.default.default||u.default,d.default.default||d.default],j=[f.default,p.default,m.default,h.default,g.default,_.default,v.default,y.default,b.default,x.default,S.default,C.default,w.default];let M=null,N=null;const P=()=>(M??=(0,r.createJavaScriptRegexEngine)(),M),F=async e=>N||(N=(0,i.createHighlighterCore)({themes:A,langs:j,engine:P()}),N),I=(e={})=>{let{activateByDefault:t=!1}=e;return{name:`boltdocs:line-numbers`,pre(e){let n=this.options.meta?.lineNumbers===!0;(t||n)&&this.addClassToHast(e,D.LINE_NUMBERS)}}},L=(e={})=>{let{activateByDefault:t=!1}=e;return{name:`boltdocs:word-wrap`,pre(e){let n=this.options.meta?.wordWrap===!0;(t||n)&&this.addClassToHast(e,D.WORD_WRAP)}}},R=()=>({name:`AddTitleProperty`,pre(e){let t=this.options.meta?.title;t&&(e.properties[E.TITLE]=t)}}),z=()=>({name:`AddLanguageProperty`,pre(e){e.properties[E.LANG]=this.options.lang||k.LANG}});function B(e){let t={};if(!e)return t;/lineNumbers|showLineNumbers/.test(e)&&(t.lineNumbers=!0),/wordWrap|word-wrap/.test(e)&&(t.wordWrap=!0);let n=e.match(/title=(["'])(.*?)\1/);return n&&(t.title=n[2]),t}var V=class{config;constructor(e){this.config=e}getTheme(){return this.config?.theme?.codeTheme||{light:O.LIGHT,dark:O.DARK}}async getHighlighter(){return await F(this.getTheme())}getOptions(e,t){let n=this.getTheme(),r={},i=``;typeof t==`string`?(i=t,r=B(t)):t&&(r=t,i=t.__raw||``);let a={lang:e||k.LANG,meta:{__raw:i,...r},transformers:[I(),L(),R(),z()]};return typeof n==`object`?a.themes={light:n.light,dark:n.dark}:a.theme=n,a}async render(e,r,i){try{let t=await this.getHighlighter(),n=this.getOptions(r,i);return t.codeToHtml(e,n)}catch(r){return(0,n.error)(`[ShikiAdapter] Failed to render code:`,r),`<pre class="${D.FALLBACK}"><code>${t.n(e)}</code></pre>`}}};let H=null,U;function W(e){let t=JSON.stringify(e?.theme?.codeTheme||null);return(H===null||U!==t)&&(H=new V(e),U=t),H}Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return V}});
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Boltdocs - https://boltdocs.vercel.app
3
+ * Copyright (c) 2026 Jesus Alcala
4
+ * Licensed under the MIT License.
5
+ */
6
+ import{n as e}from"./shiki-adapter-F-P-lDon.mjs";export{e as getShikiAdapter};
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Boltdocs - https://boltdocs.vercel.app
3
+ * Copyright (c) 2026 Jesus Alcala
4
+ * Licensed under the MIT License.
5
+ */
6
+ import{n as e}from"./utils-DC4Wq-S2.mjs";import{error as t}from"@bdocs/dui";import{createJavaScriptRegexEngine as n}from"shiki/engine/javascript";import{createHighlighterCore as r}from"shiki/core";import i from"@shikijs/themes/github-light";import a from"@shikijs/themes/github-dark";import o from"@shikijs/themes/tokyo-night";import s from"@shikijs/themes/dracula";import c from"@shikijs/themes/nord";import l from"@shikijs/themes/one-dark-pro";import u from"@shikijs/themes/one-light";import d from"@shikijs/langs/html";import f from"@shikijs/langs/js";import p from"@shikijs/langs/ts";import m from"@shikijs/langs/tsx";import h from"@shikijs/langs/css";import g from"@shikijs/langs/json";import _ from"@shikijs/langs/bash";import v from"@shikijs/langs/markdown";import y from"@shikijs/langs/mdx";import b from"@shikijs/langs/yaml";import x from"@shikijs/langs/rust";import S from"@shikijs/langs/toml";import C from"@shikijs/langs/csv";const w={ROOT:`root`,ELEMENT:`element`,TEXT:`text`,COMMENT:`comment`,CODE:`code`,INLINE_CODE:`inlineCode`,HEADING:`heading`,PARAGRAPH:`paragraph`,LINK:`link`,IMAGE:`image`,LIST:`list`,LIST_ITEM:`listItem`,JSX_FLOW_ELEMENT:`mdxJsxFlowElement`,JSX_TEXT_ELEMENT:`mdxJsxTextElement`,JSX_ATTRIBUTE:`mdxJsxAttribute`,FLOW_EXPRESSION:`mdxFlowExpression`,TEXT_EXPRESSION:`mdxTextExpression`,ESM:`mdxjsEsm`},T={TITLE:`data-title`,LANG:`data-lang`,HIGHLIGHTED:`data-highlighted`,HIGHLIGHTED_HTML:`data-highlighted-html`},E={LINE_NUMBERS:`shiki-line-numbers`,WORD_WRAP:`shiki-word-wrap`,FALLBACK:`shiki-fallback`},D={LIGHT:`github-light`,DARK:`github-dark`},O={LANG:`plaintext`,MDX_DEFAULT_LANG:`text`},k=[i.default||i,a.default||a,o.default||o,s.default||s,c.default||c,l.default||l,u.default||u],A=[d,f,p,m,h,g,_,v,y,b,x,S,C];let j=null,M=null;const N=()=>(j??=n(),j),P=async e=>M||(M=r({themes:k,langs:A,engine:N()}),M),F=(e={})=>{let{activateByDefault:t=!1}=e;return{name:`boltdocs:line-numbers`,pre(e){let n=this.options.meta?.lineNumbers===!0;(t||n)&&this.addClassToHast(e,E.LINE_NUMBERS)}}},I=(e={})=>{let{activateByDefault:t=!1}=e;return{name:`boltdocs:word-wrap`,pre(e){let n=this.options.meta?.wordWrap===!0;(t||n)&&this.addClassToHast(e,E.WORD_WRAP)}}},L=()=>({name:`AddTitleProperty`,pre(e){let t=this.options.meta?.title;t&&(e.properties[T.TITLE]=t)}}),R=()=>({name:`AddLanguageProperty`,pre(e){e.properties[T.LANG]=this.options.lang||O.LANG}});function z(e){let t={};if(!e)return t;/lineNumbers|showLineNumbers/.test(e)&&(t.lineNumbers=!0),/wordWrap|word-wrap/.test(e)&&(t.wordWrap=!0);let n=e.match(/title=(["'])(.*?)\1/);return n&&(t.title=n[2]),t}var B=class{config;constructor(e){this.config=e}getTheme(){return this.config?.theme?.codeTheme||{light:D.LIGHT,dark:D.DARK}}async getHighlighter(){return await P(this.getTheme())}getOptions(e,t){let n=this.getTheme(),r={},i=``;typeof t==`string`?(i=t,r=z(t)):t&&(r=t,i=t.__raw||``);let a={lang:e||O.LANG,meta:{__raw:i,...r},transformers:[F(),I(),L(),R()]};return typeof n==`object`?a.themes={light:n.light,dark:n.dark}:a.theme=n,a}async render(n,r,i){try{let e=await this.getHighlighter(),t=this.getOptions(r,i);return e.codeToHtml(n,t)}catch(r){return t(`[ShikiAdapter] Failed to render code:`,r),`<pre class="${E.FALLBACK}"><code>${e(n)}</code></pre>`}}};let V=null,H;function U(e){let t=JSON.stringify(e?.theme?.codeTheme||null);return(V===null||H!==t)&&(V=new B(e),H=t),V}export{O as a,T as i,U as n,w as o,z as r,E as s,B as t};
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Boltdocs - https://boltdocs.vercel.app
3
+ * Copyright (c) 2026 Jesus Alcala
4
+ * Licensed under the MIT License.
5
+ */
6
+ const e=require(`./shiki-adapter-CUtj-xKv.cjs`);exports.getShikiAdapter=e.n;
@@ -1,8 +1,8 @@
1
1
 
2
2
  import * as React$2 from "react";
3
3
  import { ComponentType, ReactNode } from "react";
4
- import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
4
  import { Plugin } from "vite";
5
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
6
6
 
7
7
  //#region src/shared/types.d.ts
8
8
  /**
@@ -196,10 +196,42 @@ interface BoltdocsAlgoliaConfig {
196
196
  apiKey: string;
197
197
  indexName: string;
198
198
  }
199
+ /**
200
+ * Configuration for Giscus comments.
201
+ */
202
+ interface BoltdocsGiscusConfig {
203
+ repo: string;
204
+ repoId: string;
205
+ category?: string;
206
+ categoryId?: string;
207
+ mapping?: 'pathname' | 'url' | 'title' | 'og:title' | 'specific' | 'number';
208
+ strict?: '0' | '1' | boolean;
209
+ reactionsEnabled?: '0' | '1' | boolean;
210
+ emitMetadata?: '0' | '1' | boolean;
211
+ inputPosition?: 'top' | 'bottom';
212
+ theme?: string;
213
+ darkTheme?: string;
214
+ lang?: string;
215
+ loading?: 'lazy' | 'eager';
216
+ }
217
+ /**
218
+ * Configuration for custom feedback system using GitHub Discussions API.
219
+ */
220
+ interface BoltdocsCustomFeedbackConfig {
221
+ enabled: boolean;
222
+ owner: string;
223
+ repo: string;
224
+ categorySlug?: string;
225
+ endpoint?: string;
226
+ }
199
227
  interface BoltdocsIntegrationsConfig {
200
228
  ga4?: BoltdocsGA4Config;
201
229
  gtm?: BoltdocsGTMConfig;
202
230
  algolia?: BoltdocsAlgoliaConfig;
231
+ feedback?: {
232
+ giscus?: BoltdocsGiscusConfig;
233
+ custom?: BoltdocsCustomFeedbackConfig;
234
+ };
203
235
  }
204
236
  /**
205
237
  * The root configuration object for Boltdocs.
@@ -217,9 +249,8 @@ interface BoltdocsConfig$1 {
217
249
  security?: BoltdocsSecurityConfig;
218
250
  seo?: BoltdocsSeoConfig;
219
251
  integrations?: BoltdocsIntegrationsConfig;
220
- /** Aggregated metadata from local meta.json files */
221
- directoryMeta?: Record<string, any>;
222
- vite?: any;
252
+ directoryMeta?: Record<string, unknown>;
253
+ vite?: unknown;
223
254
  }
224
255
  /**
225
256
  * Global namespace for Boltdocs types that can be augmented by generated code.
@@ -478,10 +509,16 @@ declare function SidebarGroup({
478
509
  title,
479
510
  icon: Icon,
480
511
  children,
481
- className
512
+ className,
513
+ collapsible,
514
+ collapsed,
515
+ active
482
516
  }: {
483
517
  title?: string;
484
518
  icon?: React.ElementType;
519
+ collapsible?: boolean;
520
+ collapsed?: boolean;
521
+ active?: boolean;
485
522
  } & ComponentBase): _$react_jsx_runtime0.JSX.Element;
486
523
  /**
487
524
  * Sidebar Link
@@ -1,8 +1,8 @@
1
1
 
2
2
  import * as React$2 from "react";
3
3
  import { ComponentType, ReactNode } from "react";
4
- import { Plugin } from "vite";
5
4
  import * as _$react_jsx_runtime0 from "react/jsx-runtime";
5
+ import { Plugin } from "vite";
6
6
 
7
7
  //#region src/shared/types.d.ts
8
8
  /**
@@ -196,10 +196,42 @@ interface BoltdocsAlgoliaConfig {
196
196
  apiKey: string;
197
197
  indexName: string;
198
198
  }
199
+ /**
200
+ * Configuration for Giscus comments.
201
+ */
202
+ interface BoltdocsGiscusConfig {
203
+ repo: string;
204
+ repoId: string;
205
+ category?: string;
206
+ categoryId?: string;
207
+ mapping?: 'pathname' | 'url' | 'title' | 'og:title' | 'specific' | 'number';
208
+ strict?: '0' | '1' | boolean;
209
+ reactionsEnabled?: '0' | '1' | boolean;
210
+ emitMetadata?: '0' | '1' | boolean;
211
+ inputPosition?: 'top' | 'bottom';
212
+ theme?: string;
213
+ darkTheme?: string;
214
+ lang?: string;
215
+ loading?: 'lazy' | 'eager';
216
+ }
217
+ /**
218
+ * Configuration for custom feedback system using GitHub Discussions API.
219
+ */
220
+ interface BoltdocsCustomFeedbackConfig {
221
+ enabled: boolean;
222
+ owner: string;
223
+ repo: string;
224
+ categorySlug?: string;
225
+ endpoint?: string;
226
+ }
199
227
  interface BoltdocsIntegrationsConfig {
200
228
  ga4?: BoltdocsGA4Config;
201
229
  gtm?: BoltdocsGTMConfig;
202
230
  algolia?: BoltdocsAlgoliaConfig;
231
+ feedback?: {
232
+ giscus?: BoltdocsGiscusConfig;
233
+ custom?: BoltdocsCustomFeedbackConfig;
234
+ };
203
235
  }
204
236
  /**
205
237
  * The root configuration object for Boltdocs.
@@ -217,9 +249,8 @@ interface BoltdocsConfig$1 {
217
249
  security?: BoltdocsSecurityConfig;
218
250
  seo?: BoltdocsSeoConfig;
219
251
  integrations?: BoltdocsIntegrationsConfig;
220
- /** Aggregated metadata from local meta.json files */
221
- directoryMeta?: Record<string, any>;
222
- vite?: any;
252
+ directoryMeta?: Record<string, unknown>;
253
+ vite?: unknown;
223
254
  }
224
255
  /**
225
256
  * Global namespace for Boltdocs types that can be augmented by generated code.
@@ -478,10 +509,16 @@ declare function SidebarGroup({
478
509
  title,
479
510
  icon: Icon,
480
511
  children,
481
- className
512
+ className,
513
+ collapsible,
514
+ collapsed,
515
+ active
482
516
  }: {
483
517
  title?: string;
484
518
  icon?: React.ElementType;
519
+ collapsible?: boolean;
520
+ collapsed?: boolean;
521
+ active?: boolean;
485
522
  } & ComponentBase): _$react_jsx_runtime0.JSX.Element;
486
523
  /**
487
524
  * Sidebar Link
@@ -3,5 +3,5 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import e from"node:fs";import t from"isomorphic-dompurify";import{z as n}from"zod";import{error as r}from"@bdocs/dui";const i=/^[a-zA-Z0-9\-_/.()\[\]]+$/,a=n.looseObject({title:n.string().max(200).optional(),description:n.string().max(500).optional(),permalink:n.string().optional(),sidebarPosition:n.number().optional(),sidebarLabel:n.string().max(100).optional(),sidebarHidden:n.boolean().optional(),hidden:n.boolean().optional(),category:n.string().max(50).optional(),order:n.number().optional(),badge:n.union([n.string().max(50),n.object({text:n.string().max(50),expires:n.string().optional()})]).optional(),icon:n.string().max(50).optional(),date:n.union([n.string(),n.date()]).optional(),lastUpdated:n.union([n.string(),n.date()]).optional(),groupTitle:n.string().max(100).optional(),groupPosition:n.number().optional(),seo:n.record(n.string(),n.any()).optional(),tags:n.array(n.string().max(50)).optional(),author:n.union([n.string().max(100),n.object({name:n.string().max(100),avatar:n.string().optional(),url:n.string().optional(),image:n.string().optional()})]).optional(),draft:n.boolean().optional(),excerpt:n.string().max(500).optional(),coverImage:n.string().nullable().optional()});function o(e){let t=e.trim();if(!t.startsWith(`---`))return{data:{},content:e,rawMatter:``};let n=t.indexOf(`---`,3);if(n===-1||n===3)return{data:{},content:e,rawMatter:``};let r=t.slice(3,n).trim(),i=t.slice(n+3).trim();return s(r)?{data:{},content:i,rawMatter:r}:{data:c(r),content:i,rawMatter:r}}function s(e){let t=!1,n=!1;for(let r=0;r<e.length;r++){let i=e[r],a=r>0?e[r-1]:``;i===`'`&&!n&&a!==`\\`?t=!t:i===`"`&&!t&&a!==`\\`&&(n=!n)}return t||n}function c(e){let t=e.split(`
6
+ import e from"node:fs";import t from"isomorphic-dompurify";import{z as n}from"zod";import{error as r}from"@bdocs/dui";const i=/^[a-zA-Z0-9\-_/.()[\]]+$/,a=n.looseObject({title:n.string().max(200).optional(),description:n.string().max(500).optional(),permalink:n.string().optional(),sidebarPosition:n.number().optional(),sidebarLabel:n.string().max(100).optional(),sidebarHidden:n.boolean().optional(),hidden:n.boolean().optional(),category:n.string().max(50).optional(),order:n.number().optional(),badge:n.union([n.string().max(50),n.object({text:n.string().max(50),expires:n.string().optional()})]).optional(),icon:n.string().max(50).optional(),date:n.union([n.string(),n.date()]).optional(),lastUpdated:n.union([n.string(),n.date()]).optional(),groupTitle:n.string().max(100).optional(),groupPosition:n.number().optional(),seo:n.record(n.string(),n.any()).optional(),tags:n.array(n.string().max(50)).optional(),author:n.union([n.string().max(100),n.object({name:n.string().max(100),avatar:n.string().optional(),url:n.string().optional(),image:n.string().optional()})]).optional(),draft:n.boolean().optional(),excerpt:n.string().max(500).optional(),coverImage:n.string().nullable().optional()});function o(e){let t=e.trim();if(!t.startsWith(`---`))return{data:{},content:e,rawMatter:``};let n=t.indexOf(`---`,3);if(n===-1||n===3)return{data:{},content:e,rawMatter:``};let r=t.slice(3,n).trim(),i=t.slice(n+3).trim();return s(r)?{data:{},content:i,rawMatter:r}:{data:c(r),content:i,rawMatter:r}}function s(e){let t=!1,n=!1;for(let r=0;r<e.length;r++){let i=e[r],a=r>0?e[r-1]:``;i===`'`&&!n&&a!==`\\`?t=!t:i===`"`&&!t&&a!==`\\`&&(n=!n)}return t||n}function c(e){let t=e.split(`
7
7
  `),n={},r=0;for(;r<t.length;){let e=t[r],i=e.trim();if(!i||i.startsWith(`#`)){r++;continue}let a=i.indexOf(`:`);if(a!==-1){let o=i.slice(0,a).trim(),s=i.slice(a+1).trim();if(s===``){let i=l(t.slice(r+1),e.search(/\S|$/));i.value===void 0?r++:(n[o]=i.value,r+=i.linesConsumed+1)}else n[o]=u(s),r++}else r++}return n}function l(e,t){if(e.length===0)return{value:void 0,linesConsumed:0};if(e[0].trim().startsWith(`-`)){let n=[],r=0;for(;r<e.length;){let i=e[r],a=i.search(/\S|$/),o=i.trim();if(!o||o.startsWith(`#`)){r++;continue}if(o.startsWith(`-`)){let e=o.slice(1).trim();if(e.includes(`:`)){let t={},r=e.split(/,\s*/);for(let e of r){let n=e.indexOf(`:`);if(n!==-1){let r=e.slice(0,n).trim();t[r]=u(e.slice(n+1).trim())}}n.push(t)}else n.push(e)}else if(a>t&&n.length>0){let e=n[n.length-1];if(typeof e==`object`&&e){let t=e,n=o.indexOf(`:`);if(n!==-1){let e=o.slice(0,n).trim();t[e]=u(o.slice(n+1).trim())}}}else break;r++}return{value:n.length>0?n:void 0,linesConsumed:r}}let n={},r=0;for(;r<e.length;){let i=e[r],a=i.search(/\S|$/),o=i.trim();if(!o||o.startsWith(`#`)){r++;continue}if(a<=t)break;let s=o.indexOf(`:`);if(s!==-1){let e=o.slice(0,s).trim();n[e]=u(o.slice(s+1).trim())}r++}return{value:Object.keys(n).length>0?n:void 0,linesConsumed:r}}function u(e){let t=e.trim();if(t===`true`)return!0;if(t===`false`)return!1;if(t===`null`||t===`~`)return null;if(/^-?\d+(\.\d+)?$/.test(t))return Number(t);if(t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`))return t.slice(1,-1);if(t.startsWith(`[`)&&t.endsWith(`]`)){let e=t.slice(1,-1).trim();return e?e.split(/,\s*/).map(e=>u(e.trim())):[]}if(t.startsWith(`{`)&&t.endsWith(`}`)){let e=t.slice(1,-1).trim(),n={},r=e.split(/,\s*/);for(let e of r){let t=e.indexOf(`:`);if(t!==-1){let r=e.slice(0,t).trim();n[r]=u(e.slice(t+1).trim())}}return n}return t}var d=class e extends Error{constructor(t){super(t),this.name=`SecurityViolationError`,Object.setPrototypeOf(this,e.prototype)}},f=class e extends d{constructor(t){super(t),this.name=`PathTraversalError`,Object.setPrototypeOf(this,e.prototype)}},p=class e extends d{constructor(t){super(t),this.name=`EncodingSecurityError`,Object.setPrototypeOf(this,e.prototype)}},m=class e extends d{constructor(t){super(t),this.name=`ValidationError`,Object.setPrototypeOf(this,e.prototype)}};function h(e){return e.replace(/\\/g,`/`)}function g(e){return e.replace(/^\d+\./,``)}function _(e){let t=e.match(/^(\d+)\./);return t?parseInt(t[1],10):void 0}function v(e){return/\.mdx?$/.test(e)}function y(t){try{return e.statSync(t).mtimeMs}catch{return 0}}function b(e,t,n){let{data:r,content:i,rawMatter:s}=o(t);if(s&&s.length>10240)throw k(`FRONTMATTER_TOO_LARGE`,`Frontmatter block exceeds size limit`,{size:s.length,file:e}),new m(`Security breach: Frontmatter size exceeds limit of 10240 bytes`);if(!n)return{data:r,content:i};let c=a.safeParse(r),l={...c.success?c.data:{}};return l.title&&=E(l.title).trim(),l.description&&=E(l.description).trim(),{data:l,content:i}}async function x(t,n=!0){let r=``;try{r=await e.promises.readFile(t,`utf-8`);let{data:i,content:a}=b(t,r,n);if(n&&!i.lastUpdated)try{i.lastUpdated=(await e.promises.stat(t)).mtimeMs}catch{i.lastUpdated=0}return{data:i,content:a,raw:r}}catch(e){if(e instanceof m)throw e;return{data:{},content:r,raw:r}}}function S(e){return e.replace(/&/g,`&amp;`).replace(/"/g,`&quot;`).replace(/'/g,`&apos;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}function C(e){return S(e)}function w(e){let t=h(e).split(`/`).map(e=>O(g(e))).join(`/`).replace(/\/$/,``);return t=t.replace(/\.mdx?$/,``),(t===`index`||t.endsWith(`/index`))&&(t=t.replace(/index$/,``)),t.startsWith(`/`)||(t=`/`+t),t.length>1&&t.endsWith(`/`)&&(t=t.slice(0,-1)),t}function T(e){return t.sanitize(e,{ALLOWED_TAGS:`b.i.em.strong.a.p.br.code.pre.span.div.h1.h2.h3.h4.h5.h6.ul.ol.li.table.thead.tbody.tr.th.td.blockquote.hr`.split(`.`),ALLOWED_ATTR:[`href`,`title`,`target`,`class`,`id`,`src`,`alt`,`width`,`height`],FORCE_BODY:!0})}t.addHook(`afterSanitizeAttributes`,e=>{if(e.hasAttribute(`href`)){let t=e.getAttribute(`href`)?.toLowerCase()||``;(t.startsWith(`javascript:`)||t.startsWith(`data:`)||t.startsWith(`vbscript:`))&&e.removeAttribute(`href`)}if(e.hasAttribute(`src`)){let t=e.getAttribute(`src`)?.toLowerCase()||``;(t.startsWith(`javascript:`)||t.startsWith(`data:`)||t.startsWith(`vbscript:`))&&e.removeAttribute(`src`)}});function E(e){return e?e.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,``).replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,``).replace(/<!--[\s\S]*?-->/g,``).replace(/<[^>]+>/g,` `).replace(/\s+/g,` `).trim():``}function D(e){return e.charAt(0).toUpperCase()+e.slice(1)}function O(e){return e.replace(/[^a-zA-Z0-9\-_/.]/g,``).split(`/`).filter(e=>e!==`..`&&e!==`.`).map(e=>e.replace(/\.\.+/g,`.`)).join(`/`)}function k(e,t,n={}){let i=new Date().toISOString(),a={...n};for(let e in a)typeof a[e]==`string`&&a[e].includes(`:`)&&(a[e]=a[e].split(/[\\/]/).pop()||a[e]);r(`[SECURITY][${i}] TYPE: ${e} | MESSAGE: ${t} | DETAILS: ${JSON.stringify(a)}`)}function A(){return{dir:process.env.BOLTDOCS_CACHE_DIR||`.boltdocs/cache`,noCache:process.env.BOLTDOCS_NO_CACHE===`1`,lruLimit:parseInt(process.env.BOLTDOCS_CACHE_LRU_LIMIT||`2000`,10),lruTTL:parseInt(process.env.BOLTDOCS_CACHE_LRU_TTL||`14400000`,10),compress:process.env.BOLTDOCS_CACHE_COMPRESS!==`0`}}export{f as _,w as a,i as b,v as c,x as d,O as f,p as g,g as h,_ as i,k as l,E as m,S as n,A as o,T as p,C as r,y as s,D as t,h as u,m as v,a as y};
@@ -3,5 +3,5 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- const e=require(`./chunk-CU-zTemE.cjs`);let t=require(`node:fs`);t=e.t(t);let n=require(`isomorphic-dompurify`);n=e.t(n);let r=require(`zod`),i=require(`@bdocs/dui`);const a=/^[a-zA-Z0-9\-_/.()\[\]]+$/,o=r.z.looseObject({title:r.z.string().max(200).optional(),description:r.z.string().max(500).optional(),permalink:r.z.string().optional(),sidebarPosition:r.z.number().optional(),sidebarLabel:r.z.string().max(100).optional(),sidebarHidden:r.z.boolean().optional(),hidden:r.z.boolean().optional(),category:r.z.string().max(50).optional(),order:r.z.number().optional(),badge:r.z.union([r.z.string().max(50),r.z.object({text:r.z.string().max(50),expires:r.z.string().optional()})]).optional(),icon:r.z.string().max(50).optional(),date:r.z.union([r.z.string(),r.z.date()]).optional(),lastUpdated:r.z.union([r.z.string(),r.z.date()]).optional(),groupTitle:r.z.string().max(100).optional(),groupPosition:r.z.number().optional(),seo:r.z.record(r.z.string(),r.z.any()).optional(),tags:r.z.array(r.z.string().max(50)).optional(),author:r.z.union([r.z.string().max(100),r.z.object({name:r.z.string().max(100),avatar:r.z.string().optional(),url:r.z.string().optional(),image:r.z.string().optional()})]).optional(),draft:r.z.boolean().optional(),excerpt:r.z.string().max(500).optional(),coverImage:r.z.string().nullable().optional()});function s(e){let t=e.trim();if(!t.startsWith(`---`))return{data:{},content:e,rawMatter:``};let n=t.indexOf(`---`,3);if(n===-1||n===3)return{data:{},content:e,rawMatter:``};let r=t.slice(3,n).trim(),i=t.slice(n+3).trim();return c(r)?{data:{},content:i,rawMatter:r}:{data:l(r),content:i,rawMatter:r}}function c(e){let t=!1,n=!1;for(let r=0;r<e.length;r++){let i=e[r],a=r>0?e[r-1]:``;i===`'`&&!n&&a!==`\\`?t=!t:i===`"`&&!t&&a!==`\\`&&(n=!n)}return t||n}function l(e){let t=e.split(`
6
+ const e=require(`./chunk-Ds5LZdWN.cjs`);let t=require(`node:fs`);t=e.n(t);let n=require(`isomorphic-dompurify`);n=e.n(n);let r=require(`zod`),i=require(`@bdocs/dui`);const a=/^[a-zA-Z0-9\-_/.()[\]]+$/,o=r.z.looseObject({title:r.z.string().max(200).optional(),description:r.z.string().max(500).optional(),permalink:r.z.string().optional(),sidebarPosition:r.z.number().optional(),sidebarLabel:r.z.string().max(100).optional(),sidebarHidden:r.z.boolean().optional(),hidden:r.z.boolean().optional(),category:r.z.string().max(50).optional(),order:r.z.number().optional(),badge:r.z.union([r.z.string().max(50),r.z.object({text:r.z.string().max(50),expires:r.z.string().optional()})]).optional(),icon:r.z.string().max(50).optional(),date:r.z.union([r.z.string(),r.z.date()]).optional(),lastUpdated:r.z.union([r.z.string(),r.z.date()]).optional(),groupTitle:r.z.string().max(100).optional(),groupPosition:r.z.number().optional(),seo:r.z.record(r.z.string(),r.z.any()).optional(),tags:r.z.array(r.z.string().max(50)).optional(),author:r.z.union([r.z.string().max(100),r.z.object({name:r.z.string().max(100),avatar:r.z.string().optional(),url:r.z.string().optional(),image:r.z.string().optional()})]).optional(),draft:r.z.boolean().optional(),excerpt:r.z.string().max(500).optional(),coverImage:r.z.string().nullable().optional()});function s(e){let t=e.trim();if(!t.startsWith(`---`))return{data:{},content:e,rawMatter:``};let n=t.indexOf(`---`,3);if(n===-1||n===3)return{data:{},content:e,rawMatter:``};let r=t.slice(3,n).trim(),i=t.slice(n+3).trim();return c(r)?{data:{},content:i,rawMatter:r}:{data:l(r),content:i,rawMatter:r}}function c(e){let t=!1,n=!1;for(let r=0;r<e.length;r++){let i=e[r],a=r>0?e[r-1]:``;i===`'`&&!n&&a!==`\\`?t=!t:i===`"`&&!t&&a!==`\\`&&(n=!n)}return t||n}function l(e){let t=e.split(`
7
7
  `),n={},r=0;for(;r<t.length;){let e=t[r],i=e.trim();if(!i||i.startsWith(`#`)){r++;continue}let a=i.indexOf(`:`);if(a!==-1){let o=i.slice(0,a).trim(),s=i.slice(a+1).trim();if(s===``){let i=u(t.slice(r+1),e.search(/\S|$/));i.value===void 0?r++:(n[o]=i.value,r+=i.linesConsumed+1)}else n[o]=d(s),r++}else r++}return n}function u(e,t){if(e.length===0)return{value:void 0,linesConsumed:0};if(e[0].trim().startsWith(`-`)){let n=[],r=0;for(;r<e.length;){let i=e[r],a=i.search(/\S|$/),o=i.trim();if(!o||o.startsWith(`#`)){r++;continue}if(o.startsWith(`-`)){let e=o.slice(1).trim();if(e.includes(`:`)){let t={},r=e.split(/,\s*/);for(let e of r){let n=e.indexOf(`:`);if(n!==-1){let r=e.slice(0,n).trim();t[r]=d(e.slice(n+1).trim())}}n.push(t)}else n.push(e)}else if(a>t&&n.length>0){let e=n[n.length-1];if(typeof e==`object`&&e){let t=e,n=o.indexOf(`:`);if(n!==-1){let e=o.slice(0,n).trim();t[e]=d(o.slice(n+1).trim())}}}else break;r++}return{value:n.length>0?n:void 0,linesConsumed:r}}let n={},r=0;for(;r<e.length;){let i=e[r],a=i.search(/\S|$/),o=i.trim();if(!o||o.startsWith(`#`)){r++;continue}if(a<=t)break;let s=o.indexOf(`:`);if(s!==-1){let e=o.slice(0,s).trim();n[e]=d(o.slice(s+1).trim())}r++}return{value:Object.keys(n).length>0?n:void 0,linesConsumed:r}}function d(e){let t=e.trim();if(t===`true`)return!0;if(t===`false`)return!1;if(t===`null`||t===`~`)return null;if(/^-?\d+(\.\d+)?$/.test(t))return Number(t);if(t.startsWith(`"`)&&t.endsWith(`"`)||t.startsWith(`'`)&&t.endsWith(`'`))return t.slice(1,-1);if(t.startsWith(`[`)&&t.endsWith(`]`)){let e=t.slice(1,-1).trim();return e?e.split(/,\s*/).map(e=>d(e.trim())):[]}if(t.startsWith(`{`)&&t.endsWith(`}`)){let e=t.slice(1,-1).trim(),n={},r=e.split(/,\s*/);for(let e of r){let t=e.indexOf(`:`);if(t!==-1){let r=e.slice(0,t).trim();n[r]=d(e.slice(t+1).trim())}}return n}return t}var f=class e extends Error{constructor(t){super(t),this.name=`SecurityViolationError`,Object.setPrototypeOf(this,e.prototype)}},p=class e extends f{constructor(t){super(t),this.name=`PathTraversalError`,Object.setPrototypeOf(this,e.prototype)}},m=class e extends f{constructor(t){super(t),this.name=`EncodingSecurityError`,Object.setPrototypeOf(this,e.prototype)}},h=class e extends f{constructor(t){super(t),this.name=`ValidationError`,Object.setPrototypeOf(this,e.prototype)}};function g(e){return e.replace(/\\/g,`/`)}function _(e){return e.replace(/^\d+\./,``)}function v(e){let t=e.match(/^(\d+)\./);return t?parseInt(t[1],10):void 0}function y(e){return/\.mdx?$/.test(e)}function b(e){try{return t.default.statSync(e).mtimeMs}catch{return 0}}function x(e,t,n){let{data:r,content:i,rawMatter:a}=s(t);if(a&&a.length>10240)throw A(`FRONTMATTER_TOO_LARGE`,`Frontmatter block exceeds size limit`,{size:a.length,file:e}),new h(`Security breach: Frontmatter size exceeds limit of 10240 bytes`);if(!n)return{data:r,content:i};let c=o.safeParse(r),l={...c.success?c.data:{}};return l.title&&=D(l.title).trim(),l.description&&=D(l.description).trim(),{data:l,content:i}}async function S(e,n=!0){let r=``;try{r=await t.default.promises.readFile(e,`utf-8`);let{data:i,content:a}=x(e,r,n);if(n&&!i.lastUpdated)try{i.lastUpdated=(await t.default.promises.stat(e)).mtimeMs}catch{i.lastUpdated=0}return{data:i,content:a,raw:r}}catch(e){if(e instanceof h)throw e;return{data:{},content:r,raw:r}}}function C(e){return e.replace(/&/g,`&amp;`).replace(/"/g,`&quot;`).replace(/'/g,`&apos;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`)}function w(e){return C(e)}function T(e){let t=g(e).split(`/`).map(e=>k(_(e))).join(`/`).replace(/\/$/,``);return t=t.replace(/\.mdx?$/,``),(t===`index`||t.endsWith(`/index`))&&(t=t.replace(/index$/,``)),t.startsWith(`/`)||(t=`/`+t),t.length>1&&t.endsWith(`/`)&&(t=t.slice(0,-1)),t}function E(e){return n.default.sanitize(e,{ALLOWED_TAGS:`b.i.em.strong.a.p.br.code.pre.span.div.h1.h2.h3.h4.h5.h6.ul.ol.li.table.thead.tbody.tr.th.td.blockquote.hr`.split(`.`),ALLOWED_ATTR:[`href`,`title`,`target`,`class`,`id`,`src`,`alt`,`width`,`height`],FORCE_BODY:!0})}n.default.addHook(`afterSanitizeAttributes`,e=>{if(e.hasAttribute(`href`)){let t=e.getAttribute(`href`)?.toLowerCase()||``;(t.startsWith(`javascript:`)||t.startsWith(`data:`)||t.startsWith(`vbscript:`))&&e.removeAttribute(`href`)}if(e.hasAttribute(`src`)){let t=e.getAttribute(`src`)?.toLowerCase()||``;(t.startsWith(`javascript:`)||t.startsWith(`data:`)||t.startsWith(`vbscript:`))&&e.removeAttribute(`src`)}});function D(e){return e?e.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,``).replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,``).replace(/<!--[\s\S]*?-->/g,``).replace(/<[^>]+>/g,` `).replace(/\s+/g,` `).trim():``}function O(e){return e.charAt(0).toUpperCase()+e.slice(1)}function k(e){return e.replace(/[^a-zA-Z0-9\-_/.]/g,``).split(`/`).filter(e=>e!==`..`&&e!==`.`).map(e=>e.replace(/\.\.+/g,`.`)).join(`/`)}function A(e,t,n={}){let r=new Date().toISOString(),a={...n};for(let e in a)typeof a[e]==`string`&&a[e].includes(`:`)&&(a[e]=a[e].split(/[\\/]/).pop()||a[e]);(0,i.error)(`[SECURITY][${r}] TYPE: ${e} | MESSAGE: ${t} | DETAILS: ${JSON.stringify(a)}`)}function j(){return{dir:process.env.BOLTDOCS_CACHE_DIR||`.boltdocs/cache`,noCache:process.env.BOLTDOCS_NO_CACHE===`1`,lruLimit:parseInt(process.env.BOLTDOCS_CACHE_LRU_LIMIT||`2000`,10),lruTTL:parseInt(process.env.BOLTDOCS_CACHE_LRU_TTL||`14400000`,10),compress:process.env.BOLTDOCS_CACHE_COMPRESS!==`0`}}Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return o}});
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Boltdocs - https://boltdocs.vercel.app
3
+ * Copyright (c) 2026 Jesus Alcala
4
+ * Licensed under the MIT License.
5
+ */
6
+ const e=require(`./chunk-Ds5LZdWN.cjs`);let t=require(`node:path`);t=e.n(t);let n=require(`node:fs`);n=e.n(n);let r=require(`node:os`);r=e.n(r);let i=require(`node:url`),a=require(`node:worker_threads`);const o=t.default.dirname((0,i.fileURLToPath)(require(`url`).pathToFileURL(__filename).href)),s=new class{workers=[];workerTasks=new WeakMap;queue=[];activeWorkers=0;maxWorkers;maxQueueSize;constructor(e,t=2e3){this.maxWorkers=e||Math.max(1,r.default.cpus().length-1),this.maxQueueSize=t}idleWorkers=[];async parseFile(e,t,n,r){return this.queue.length>=this.maxQueueSize?Promise.reject(Error(`[boltdocs] WorkerPool queue is full (limit: ${this.maxQueueSize}). Too many files enqueued simultaneously. Consider increasing maxQueueSize.`)):new Promise((i,a)=>{this.queue.push({task:{type:`PARSE_FILE`,file:e,docsDir:t,basePath:n,config:r},resolve:i,reject:a}),this.processNext()})}processNext(){if(this.queue.length===0)return;let e=this.idleWorkers.pop();if(!e){if(this.activeWorkers>=this.maxWorkers)return;this.activeWorkers++;let t=this.getWorkerPath(),n=new a.Worker(t,{execArgv:t.endsWith(`.ts`)?[`--loader`,`tsx`,`--no-deprecation`]:[`--no-deprecation`]});e=n,this.workers.push(n);let r=(e,t)=>{let n=this.workers.indexOf(e);if(n===-1)return;let r=this.workerTasks.get(e);r&&(this.workerTasks.delete(e),r.reject(t||Error(`Worker terminated unexpectedly`))),this.activeWorkers--;let i=this.idleWorkers.indexOf(e);i>-1&&this.idleWorkers.splice(i,1),this.workers.splice(n,1),e.terminate(),this.processNext()};n.on(`message`,e=>{let t=this.workerTasks.get(n);t&&(this.workerTasks.delete(n),e.type===`SUCCESS`?t.resolve(e.result):t.reject(Error(e.error))),this.idleWorkers.push(n),this.processNext()}),n.on(`error`,e=>{r(n,e)}),n.on(`exit`,e=>{e!==0&&r(n,Error(`Worker exited with code ${e}`))})}let{task:t,resolve:n,reject:r}=this.queue.shift();this.workerTasks.set(e,{resolve:n,reject:r}),e.postMessage(t)}getWorkerPath(){if(require(`url`).pathToFileURL(__filename).href.includes(`/dist/`)||t.default.extname(require(`url`).pathToFileURL(__filename).href)===`.mjs`){let e=[t.default.resolve(o,`node/routes/worker.mjs`),t.default.resolve(o,`worker.mjs`),t.default.resolve(o,`./node/routes/worker.mjs`)];for(let t of e)if(n.default.existsSync(t))return t;return t.default.resolve(o,`node/routes/worker.mjs`)}return t.default.resolve(o,`worker.ts`)}async terminate(){let e=[...this.workers];await Promise.all(e.map(e=>e.terminate())),this.idleWorkers=[],this.workers=[],this.activeWorkers=0}};exports.pool=s;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Boltdocs - https://boltdocs.vercel.app
3
+ * Copyright (c) 2026 Jesus Alcala
4
+ * Licensed under the MIT License.
5
+ */
6
+ import e from"node:path";import t from"node:fs";import{fileURLToPath as n}from"node:url";import r from"node:os";import{Worker as i}from"node:worker_threads";const a=e.dirname(n(import.meta.url)),o=new class{workers=[];workerTasks=new WeakMap;queue=[];activeWorkers=0;maxWorkers;maxQueueSize;constructor(e,t=2e3){this.maxWorkers=e||Math.max(1,r.cpus().length-1),this.maxQueueSize=t}idleWorkers=[];async parseFile(e,t,n,r){return this.queue.length>=this.maxQueueSize?Promise.reject(Error(`[boltdocs] WorkerPool queue is full (limit: ${this.maxQueueSize}). Too many files enqueued simultaneously. Consider increasing maxQueueSize.`)):new Promise((i,a)=>{this.queue.push({task:{type:`PARSE_FILE`,file:e,docsDir:t,basePath:n,config:r},resolve:i,reject:a}),this.processNext()})}processNext(){if(this.queue.length===0)return;let e=this.idleWorkers.pop();if(!e){if(this.activeWorkers>=this.maxWorkers)return;this.activeWorkers++;let t=this.getWorkerPath(),n=new i(t,{execArgv:t.endsWith(`.ts`)?[`--loader`,`tsx`,`--no-deprecation`]:[`--no-deprecation`]});e=n,this.workers.push(n);let r=(e,t)=>{let n=this.workers.indexOf(e);if(n===-1)return;let r=this.workerTasks.get(e);r&&(this.workerTasks.delete(e),r.reject(t||Error(`Worker terminated unexpectedly`))),this.activeWorkers--;let i=this.idleWorkers.indexOf(e);i>-1&&this.idleWorkers.splice(i,1),this.workers.splice(n,1),e.terminate(),this.processNext()};n.on(`message`,e=>{let t=this.workerTasks.get(n);t&&(this.workerTasks.delete(n),e.type===`SUCCESS`?t.resolve(e.result):t.reject(Error(e.error))),this.idleWorkers.push(n),this.processNext()}),n.on(`error`,e=>{r(n,e)}),n.on(`exit`,e=>{e!==0&&r(n,Error(`Worker exited with code ${e}`))})}let{task:t,resolve:n,reject:r}=this.queue.shift();this.workerTasks.set(e,{resolve:n,reject:r}),e.postMessage(t)}getWorkerPath(){if(import.meta.url.includes(`/dist/`)||e.extname(import.meta.url)===`.mjs`){let n=[e.resolve(a,`node/routes/worker.mjs`),e.resolve(a,`worker.mjs`),e.resolve(a,`./node/routes/worker.mjs`)];for(let e of n)if(t.existsSync(e))return e;return e.resolve(a,`node/routes/worker.mjs`)}return e.resolve(a,`worker.ts`)}async terminate(){let e=[...this.workers];await Promise.all(e.map(e=>e.terminate())),this.idleWorkers=[],this.workers=[],this.activeWorkers=0}};export{o as pool};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "boltdocs",
3
- "version": "2.8.4",
3
+ "version": "2.9.0",
4
4
  "description": "A lightweight documentation generator for React projects.",
5
5
  "main": "dist/node/index.mjs",
6
6
  "module": "dist/node/index.mjs",
@@ -59,6 +59,7 @@
59
59
  "author": "Jesus Alcala",
60
60
  "license": "MIT",
61
61
  "dependencies": {
62
+ "@bdocs/dui": "^0.2.0",
62
63
  "@mdx-js/rollup": "3.1.1",
63
64
  "@tailwindcss/vite": "4.3.0",
64
65
  "@vitejs/plugin-react": "6.0.1",
@@ -85,9 +86,8 @@
85
86
  "tailwind-merge": "3.5.0",
86
87
  "unist-util-visit": "5.1.0",
87
88
  "vite": "7.0.0 || 8.0.0",
88
- "vite-plugin-image-optimizer": "2.0.3",
89
89
  "zod": "4.3.6",
90
- "@bdocs/dui": "0.1.2",
90
+ "@bdocs/plugin-image-optimizer": "0.2.0",
91
91
  "@bdocs/ssg": "0.1.1"
92
92
  },
93
93
  "peerDependencies": {
@@ -95,13 +95,16 @@
95
95
  "react-dom": "19.0.0"
96
96
  },
97
97
  "devDependencies": {
98
+ "@netlify/functions": "^5.3.0",
98
99
  "@testing-library/jest-dom": "^6.6.0",
99
100
  "@testing-library/react": "^16.0.0",
101
+ "@types/aws-lambda": "^8.10.161",
100
102
  "@types/node": "22.0.0",
101
103
  "@types/picomatch": "^4.0.3",
102
104
  "@types/react": "19.0.0",
103
105
  "@types/react-dom": "19.0.0",
104
106
  "@types/semver": "7.7.1",
107
+ "@vercel/node": "^5.8.12",
105
108
  "jsdom": "^24.1.0",
106
109
  "tsdown": "0.21.7",
107
110
  "typescript": "5.9.3",
@@ -214,10 +214,44 @@ export interface BoltdocsAlgoliaConfig {
214
214
  indexName: string
215
215
  }
216
216
 
217
+ /**
218
+ * Configuration for Giscus comments.
219
+ */
220
+ export interface BoltdocsGiscusConfig {
221
+ repo: string
222
+ repoId: string
223
+ category?: string
224
+ categoryId?: string
225
+ mapping?: 'pathname' | 'url' | 'title' | 'og:title' | 'specific' | 'number'
226
+ strict?: '0' | '1' | boolean
227
+ reactionsEnabled?: '0' | '1' | boolean
228
+ emitMetadata?: '0' | '1' | boolean
229
+ inputPosition?: 'top' | 'bottom'
230
+ theme?: string
231
+ darkTheme?: string
232
+ lang?: string
233
+ loading?: 'lazy' | 'eager'
234
+ }
235
+
236
+ /**
237
+ * Configuration for custom feedback system using GitHub Discussions API.
238
+ */
239
+ export interface BoltdocsCustomFeedbackConfig {
240
+ enabled: boolean
241
+ owner: string
242
+ repo: string
243
+ categorySlug?: string
244
+ endpoint?: string
245
+ }
246
+
217
247
  export interface BoltdocsIntegrationsConfig {
218
248
  ga4?: BoltdocsGA4Config
219
249
  gtm?: BoltdocsGTMConfig
220
250
  algolia?: BoltdocsAlgoliaConfig
251
+ feedback?: {
252
+ giscus?: BoltdocsGiscusConfig
253
+ custom?: BoltdocsCustomFeedbackConfig
254
+ }
221
255
  }
222
256
 
223
257
  /**
@@ -236,9 +270,8 @@ export interface BoltdocsConfig {
236
270
  security?: BoltdocsSecurityConfig
237
271
  seo?: BoltdocsSeoConfig
238
272
  integrations?: BoltdocsIntegrationsConfig
239
- /** Aggregated metadata from local meta.json files */
240
- directoryMeta?: Record<string, any>
241
- vite?: any // Avoid pulling in entire Vite types here
273
+ directoryMeta?: Record<string, unknown>
274
+ vite?: unknown
242
275
  }
243
276
 
244
277
  /**
@@ -1,6 +0,0 @@
1
- /**
2
- * Boltdocs - https://boltdocs.vercel.app
3
- * Copyright (c) 2026 Jesus Alcala
4
- * Licensed under the MIT License.
5
- */
6
- import{o as e,s as t}from"./utils-BYITg7T5.mjs";import n from"node:path";import r from"node:fs";import i from"node:fs/promises";import a from"node:crypto";import o from"node:zlib";import{promisify as s}from"node:util";import{LRUCache as c}from"lru-cache";const l=i.writeFile,u=i.readFile,d=i.mkdir,f=i.rename,p=s(o.gzip),m=s(o.gunzip),h=new class{activeTasks=new Set;add(e){let t=Promise.resolve().then(e).catch(()=>{}).finally(()=>{this.activeTasks.delete(t)});this.activeTasks.add(t)}async flush(){await Promise.all(Array.from(this.activeTasks))}get pending(){return this.activeTasks.size}};var g=class{entries=new Map;cachePath=null;compress;constructor(t={}){let r=e();if(this.compress=t.compress===void 0?r.compress:t.compress,t.name){let e=t.root||process.cwd(),i=this.compress?`json.gz`:`json`;this.cachePath=n.resolve(e,r.dir,`${t.name}.${i}`)}}async load(){if(!e().noCache&&this.cachePath)try{let e=await u(this.cachePath);this.cachePath.endsWith(`.gz`)&&(e=await m(e));let t=JSON.parse(e.toString(`utf-8`));this.entries=new Map(Object.entries(t))}catch(e){if(e.code===`ENOENT`)return}}save(){if(e().noCache||!this.cachePath)return;let t=Object.fromEntries(this.entries),r=JSON.stringify(t),i=this.cachePath,o=this.compress;h.add(async()=>{try{await d(n.dirname(i),{recursive:!0});let e=Buffer.from(r);o&&(e=await p(e));let t=`${i}.${a.randomBytes(4).toString(`hex`)}.tmp`;await l(t,e),await f(t,i)}catch{}})}get(e){let n=this.entries.get(e);return!n||t(e)!==n.mtime?null:n.data}set(e,n){this.entries.set(e,{data:n,mtime:t(e)})}isValid(e){let n=this.entries.get(e);return n?t(e)===n.mtime:!1}invalidate(e){this.entries.delete(e)}invalidateAll(){this.entries.clear()}pruneStale(e){for(let t of this.entries.keys())e.has(t)||this.entries.delete(t)}get size(){return this.entries.size}async flush(){await h.flush()}},_=class{index=new Map;memoryCache;baseDir;shardsDir;indexPath;constructor(t,r=process.cwd()){let i=e();this.baseDir=n.resolve(r,i.dir,`transform-${t}`),this.shardsDir=n.resolve(this.baseDir,`shards`),this.indexPath=n.resolve(this.baseDir,`index.json`),this.memoryCache=new c({max:i.lruLimit,ttl:i.lruTTL,updateAgeOnGet:!0})}async load(){if(!e().noCache)try{let e=await u(this.indexPath,`utf-8`);this.index=new Map(Object.entries(JSON.parse(e)))}catch(e){if(e.code===`ENOENT`)return}}save(){if(e().noCache)return;let t=JSON.stringify(Object.fromEntries(this.index)),r=this.indexPath;h.add(async()=>{try{await d(n.dirname(r),{recursive:!0}),await l(r,t)}catch{}})}async getMany(e){let t=new Map,r=[];for(let n of e){let e=this.memoryCache.get(n);e?t.set(n,e):this.index.has(n)&&r.push(n)}if(r.length>0){let e=await Promise.all(r.map(async e=>{let t=this.index.get(e),r=n.resolve(this.shardsDir,`${t}.gz`);try{let t=(await m(await u(r))).toString(`utf-8`);return this.memoryCache.set(e,t),{key:e,val:t}}catch{return null}}));for(let n of e)n&&t.set(n.key,n.val)}return t}async getAsync(e){let t=this.memoryCache.get(e);if(t)return t;let r=this.index.get(e);if(!r)return null;let i=n.resolve(this.shardsDir,`${r}.gz`);try{let t=(await m(await u(i))).toString(`utf-8`);return this.memoryCache.set(e,t),t}catch(e){return e.code,null}}set(e,t){let r=a.createHash(`md5`).update(t).digest(`hex`);this.index.set(e,r),this.memoryCache.set(e,t);let o=n.resolve(this.shardsDir,`${r}.gz`);h.add(async()=>{try{try{await i.access(o);return}catch{}await d(this.shardsDir,{recursive:!0});let e=await p(Buffer.from(t)),n=`${o}.${a.randomBytes(4).toString(`hex`)}.tmp`;await l(n,e),await f(n,o)}catch{}})}get size(){return this.index.size}async flush(){await h.flush()}};const v=new Map,y=()=>{let t=e();return n.resolve(process.cwd(),t.dir,`cache/parser`)},b=`v2.3`;var x=class{static async get(t){if(e().noCache)return null;try{let e=v.get(t);if(e)return e.data;let i=await r.promises.stat(t),o=y(),s=a.createHash(`md5`).update(t).digest(`hex`),c=n.join(o,`${s}.json`);try{let e=await r.promises.readFile(c,`utf-8`),n=JSON.parse(e);return n._mtime!==i.mtimeMs||n._v!==b?null:(v.set(t,{data:n.data,mtime:n._mtime}),n.data)}catch{return null}}catch{return null}}static async set(t,i){if(!e().noCache)try{let e=await r.promises.stat(t);v.set(t,{data:i,mtime:e.mtimeMs});let o=y(),s=a.createHash(`md5`).update(t).digest(`hex`),c=n.join(o,`${s}.json`),l={_v:b,_mtime:e.mtimeMs,data:i};h.add(async()=>{try{await r.promises.mkdir(o,{recursive:!0}),await r.promises.writeFile(c,JSON.stringify(l))}catch{}})}catch{}}static invalidate(e){v.delete(e)}static clear(){v.clear();let e=y();if(r.existsSync(e))try{r.rmSync(e,{recursive:!0,force:!0})}catch{}}};export{g as n,_ as r,x as t};
@@ -1,6 +0,0 @@
1
- /**
2
- * Boltdocs - https://boltdocs.vercel.app
3
- * Copyright (c) 2026 Jesus Alcala
4
- * Licensed under the MIT License.
5
- */
6
- const e=require(`./chunk-CU-zTemE.cjs`),t=require(`./utils-Cjmx1hhk.cjs`);let n=require(`node:path`);n=e.t(n);let r=require(`node:fs`);r=e.t(r);let i=require(`node:fs/promises`);i=e.t(i);let a=require(`node:crypto`);a=e.t(a);let o=require(`node:zlib`);o=e.t(o);let s=require(`node:util`),c=require(`lru-cache`);const l=i.default.writeFile,u=i.default.readFile,d=i.default.mkdir,f=i.default.rename,p=(0,s.promisify)(o.default.gzip),m=(0,s.promisify)(o.default.gunzip),h=new class{activeTasks=new Set;add(e){let t=Promise.resolve().then(e).catch(()=>{}).finally(()=>{this.activeTasks.delete(t)});this.activeTasks.add(t)}async flush(){await Promise.all(Array.from(this.activeTasks))}get pending(){return this.activeTasks.size}};var g=class{entries=new Map;cachePath=null;compress;constructor(e={}){let r=t.o();if(this.compress=e.compress===void 0?r.compress:e.compress,e.name){let t=e.root||process.cwd(),i=this.compress?`json.gz`:`json`;this.cachePath=n.default.resolve(t,r.dir,`${e.name}.${i}`)}}async load(){if(!t.o().noCache&&this.cachePath)try{let e=await u(this.cachePath);this.cachePath.endsWith(`.gz`)&&(e=await m(e));let t=JSON.parse(e.toString(`utf-8`));this.entries=new Map(Object.entries(t))}catch(e){if(e.code===`ENOENT`)return}}save(){if(t.o().noCache||!this.cachePath)return;let e=Object.fromEntries(this.entries),r=JSON.stringify(e),i=this.cachePath,o=this.compress;h.add(async()=>{try{await d(n.default.dirname(i),{recursive:!0});let e=Buffer.from(r);o&&(e=await p(e));let t=`${i}.${a.default.randomBytes(4).toString(`hex`)}.tmp`;await l(t,e),await f(t,i)}catch{}})}get(e){let n=this.entries.get(e);return!n||t.s(e)!==n.mtime?null:n.data}set(e,n){this.entries.set(e,{data:n,mtime:t.s(e)})}isValid(e){let n=this.entries.get(e);return n?t.s(e)===n.mtime:!1}invalidate(e){this.entries.delete(e)}invalidateAll(){this.entries.clear()}pruneStale(e){for(let t of this.entries.keys())e.has(t)||this.entries.delete(t)}get size(){return this.entries.size}async flush(){await h.flush()}},_=class{index=new Map;memoryCache;baseDir;shardsDir;indexPath;constructor(e,r=process.cwd()){let i=t.o();this.baseDir=n.default.resolve(r,i.dir,`transform-${e}`),this.shardsDir=n.default.resolve(this.baseDir,`shards`),this.indexPath=n.default.resolve(this.baseDir,`index.json`),this.memoryCache=new c.LRUCache({max:i.lruLimit,ttl:i.lruTTL,updateAgeOnGet:!0})}async load(){if(!t.o().noCache)try{let e=await u(this.indexPath,`utf-8`);this.index=new Map(Object.entries(JSON.parse(e)))}catch(e){if(e.code===`ENOENT`)return}}save(){if(t.o().noCache)return;let e=JSON.stringify(Object.fromEntries(this.index)),r=this.indexPath;h.add(async()=>{try{await d(n.default.dirname(r),{recursive:!0}),await l(r,e)}catch{}})}async getMany(e){let t=new Map,r=[];for(let n of e){let e=this.memoryCache.get(n);e?t.set(n,e):this.index.has(n)&&r.push(n)}if(r.length>0){let e=await Promise.all(r.map(async e=>{let t=this.index.get(e),r=n.default.resolve(this.shardsDir,`${t}.gz`);try{let t=(await m(await u(r))).toString(`utf-8`);return this.memoryCache.set(e,t),{key:e,val:t}}catch{return null}}));for(let n of e)n&&t.set(n.key,n.val)}return t}async getAsync(e){let t=this.memoryCache.get(e);if(t)return t;let r=this.index.get(e);if(!r)return null;let i=n.default.resolve(this.shardsDir,`${r}.gz`);try{let t=(await m(await u(i))).toString(`utf-8`);return this.memoryCache.set(e,t),t}catch(e){return e.code,null}}set(e,t){let r=a.default.createHash(`md5`).update(t).digest(`hex`);this.index.set(e,r),this.memoryCache.set(e,t);let o=n.default.resolve(this.shardsDir,`${r}.gz`);h.add(async()=>{try{try{await i.default.access(o);return}catch{}await d(this.shardsDir,{recursive:!0});let e=await p(Buffer.from(t)),n=`${o}.${a.default.randomBytes(4).toString(`hex`)}.tmp`;await l(n,e),await f(n,o)}catch{}})}get size(){return this.index.size}async flush(){await h.flush()}};const v=new Map,y=()=>{let e=t.o();return n.default.resolve(process.cwd(),e.dir,`cache/parser`)},b=`v2.3`;var x=class{static async get(e){if(t.o().noCache)return null;try{let t=v.get(e);if(t)return t.data;let i=await r.default.promises.stat(e),o=y(),s=a.default.createHash(`md5`).update(e).digest(`hex`),c=n.default.join(o,`${s}.json`);try{let t=await r.default.promises.readFile(c,`utf-8`),n=JSON.parse(t);return n._mtime!==i.mtimeMs||n._v!==b?null:(v.set(e,{data:n.data,mtime:n._mtime}),n.data)}catch{return null}}catch{return null}}static async set(e,i){if(!t.o().noCache)try{let t=await r.default.promises.stat(e);v.set(e,{data:i,mtime:t.mtimeMs});let o=y(),s=a.default.createHash(`md5`).update(e).digest(`hex`),c=n.default.join(o,`${s}.json`),l={_v:b,_mtime:t.mtimeMs,data:i};h.add(async()=>{try{await r.default.promises.mkdir(o,{recursive:!0}),await r.default.promises.writeFile(c,JSON.stringify(l))}catch{}})}catch{}}static invalidate(e){v.delete(e)}static clear(){v.clear();let e=y();if(r.default.existsSync(e))try{r.default.rmSync(e,{recursive:!0,force:!0})}catch{}}};Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return x}});
@@ -1,6 +0,0 @@
1
- /**
2
- * Boltdocs - https://boltdocs.vercel.app
3
- * Copyright (c) 2026 Jesus Alcala
4
- * Licensed under the MIT License.
5
- */
6
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
@@ -1,28 +0,0 @@
1
- /**
2
- * Boltdocs - https://boltdocs.vercel.app
3
- * Copyright (c) 2026 Jesus Alcala
4
- * Licensed under the MIT License.
5
- */
6
- import{a as e,d as t,u as n,v as r,y as i}from"./utils-BYITg7T5.mjs";import{createRequire as a}from"node:module";import{loadConfigFromFile as o}from"vite";import s from"node:path";import{fdir as c}from"fdir";import l from"node:fs";import{z as u}from"zod";import*as d from"@bdocs/dui";import{bullet as f,colors as p,confirm as m,dividerLog as h,double as g,error as _,info as v,round as ee,single as te,success as y,tasks as ne,warn as b}from"@bdocs/dui";import{fileURLToPath as x}from"node:url";import re from"picomatch";import S from"node:os";import{distance as C}from"fastest-levenshtein";const w=u.object({icon:u.string().max(50),link:u.string().url()});u.object({text:u.string().max(2e3).optional()});const T=u.object({name:u.string(),enforce:u.enum([`pre`,`post`]).optional(),version:u.string().optional(),boltdocsVersion:u.string().optional(),remarkPlugins:u.array(u.unknown()).optional(),rehypePlugins:u.array(u.unknown()).optional(),vitePlugins:u.array(u.unknown()).optional(),components:u.record(u.string(),u.string()).optional(),hooks:u.record(u.string(),u.unknown()).optional()}),E=u.object({title:u.union([u.string(),u.record(u.string(),u.string())]).optional(),description:u.union([u.string(),u.record(u.string(),u.string())]).optional(),logo:u.union([u.string(),u.object({dark:u.string(),light:u.string(),alt:u.string().optional(),width:u.number().optional(),height:u.number().optional()})]).optional(),navbar:u.array(u.object({label:u.union([u.string(),u.record(u.string(),u.string())]),href:u.string(),items:u.array(u.object({label:u.union([u.string(),u.record(u.string(),u.string())]),href:u.string()})).optional()})).optional(),sidebar:u.record(u.string(),u.array(u.object({text:u.string(),link:u.string()}))).optional(),sidebarGroups:u.record(u.string(),u.object({title:u.union([u.string(),u.record(u.string(),u.string())]).optional(),icon:u.string().optional()})).optional(),socialLinks:u.array(w).optional(),editLink:u.string().refine(e=>!e||e.includes(`:path`),{message:`editLink must contain ':path' placeholder if specified`}).optional(),communityHelp:u.string().url().optional(),version:u.string().max(50).optional(),githubRepo:u.string().max(100).optional(),favicon:u.string().optional(),tabs:u.array(u.object({id:u.string(),text:u.union([u.string(),u.record(u.string(),u.string())]),icon:u.string().optional()})).optional(),codeTheme:u.union([u.string(),u.object({light:u.string(),dark:u.string()})]).optional()}),D=u.union([u.string(),u.object({rules:u.array(u.object({userAgent:u.string(),allow:u.union([u.string(),u.array(u.string())]).optional(),disallow:u.union([u.string(),u.array(u.string())]).optional()})).optional(),sitemaps:u.array(u.string().url()).optional()})]),O=u.object({defaultLocale:u.string(),locales:u.union([u.record(u.string(),u.string()),u.array(u.string())]).transform(e=>Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e),localeConfigs:u.record(u.string(),u.object({label:u.string().optional(),direction:u.enum([`ltr`,`rtl`]).optional(),htmlLang:u.string().optional(),calendar:u.string().optional()})).optional()}),k=u.object({defaultVersion:u.string(),prefix:u.string().optional(),versions:u.array(u.object({label:u.string(),path:u.string()}))}),A=u.object({headers:u.record(u.string(),u.string()).optional(),enableCSP:u.boolean().optional(),customHeaders:u.record(u.string(),u.string()).optional()}),j=u.object({metatags:u.record(u.string(),u.string()).optional(),indexing:u.enum([`all`,`public`]).optional(),thumbnails:u.object({background:u.string().optional()}).optional()}),M=u.object({measurementId:u.string().min(1,`Measurement ID is required for GA4`),debug:u.boolean().optional(),anonymizeIp:u.boolean().optional(),sendPageView:u.boolean().optional(),cookieFlags:u.string().optional(),autoTrack:u.object({pageViews:u.boolean().optional(),downloads:u.boolean().optional(),externalLinks:u.boolean().optional(),search:u.boolean().optional()}).optional()}),N=u.object({tagId:u.string().min(1,`Tag ID is required for GTM`),dataLayerName:u.string().optional(),preview:u.string().optional()}),P=u.object({appId:u.string().min(1,`Algolia App ID is required`),apiKey:u.string().min(1,`Algolia API Key is required`),indexName:u.string().min(1,`Algolia Index Name is required`)}),F=u.object({ga4:M.optional(),gtm:N.optional(),algolia:P.optional()}),I=u.object({siteUrl:u.string().url().optional(),docsDir:u.string().optional(),base:u.string().optional(),theme:E.optional(),i18n:O.optional(),versions:k.optional(),plugins:u.array(T).optional(),robots:D.optional(),security:A.optional(),seo:j.optional(),integrations:F.optional(),vite:u.record(u.string(),u.unknown()).optional()});function L(e,t,n=process.cwd(),r){let i=s.resolve(n,`.boltdocs`,`generated`);l.existsSync(i)||l.mkdirSync(i,{recursive:!0});let a=e.i18n?Object.keys(e.i18n.locales):[],o=e.versions?e.versions.versions.map(e=>e.path):[],c=a.length>0?a.map(e=>`'${e}'`).join(` | `):`string`,u=o.length>0?o.map(e=>`'${e}'`).join(` | `):`string`,d=[`tsx`,`ts`,`jsx`,`js`],f=``,p=``;for(let e of d){let r=s.resolve(n,t,`mdx-components.${e}`);if(l.existsSync(r)){let e=s.join(n,t,`mdx-components`),r=s.relative(i,e).replace(/\\/g,`/`);f=`import type * as MdxComponentsModule from '${r.startsWith(`.`)?r:`./${r}`}'\n`,p=` MdxComponents: typeof MdxComponentsModule`;break}}let m=r&&r.length>0?`\ndeclare global {
7
- namespace Boltdocs {
8
- interface RoutePaths {
9
- ${r.map(e=>` '${e}': void`).join(`
10
- `)}
11
- }
12
- }
13
- }`:``,h=`// This file is automatically generated by Boltdocs.
14
- // Do not edit this file manually.
15
-
16
- ${f}declare global {
17
- namespace Boltdocs {
18
- interface Types {
19
- Locale: ${c}
20
- Version: ${u}${p?`\n${p}`:``}
21
- }
22
- }
23
- }${m}
24
-
25
- export {}
26
- `;l.writeFileSync(s.resolve(i,`types.d.ts`),h)}function ie(e,t=process.cwd()){let n=s.resolve(t,`.boltdocs`,`generated`);l.existsSync(n)||l.mkdirSync(n,{recursive:!0});let r={routes:Array.from(new Set(e)).sort(),timestamp:Date.now()};l.writeFileSync(s.resolve(n,`link-tree.json`),JSON.stringify(r,null,2))}function ae(e){return e}const R=[`boltdocs.config.js`,`boltdocs.config.mjs`,`boltdocs.config.ts`];async function z(e,t=process.cwd()){let n=t,i={docsDir:s.resolve(e),theme:{title:`Boltdocs`,description:`A Vite documentation framework`,navbar:[{label:`Home`,href:`/`},{label:`Documentation`,href:`/docs`}],codeTheme:{light:`github-light`,dark:`github-dark`}}},a={};for(let e of R){let t=s.resolve(n,e);if(l.existsSync(t))try{let e=await o({command:`serve`,mode:`development`},t,n);if(e){a=e.config;break}}catch(t){b(`Failed to load config from ${e}:`,t)}}let c={title:a.title,description:a.description,logo:a.logo,favicon:a.favicon,navbar:a.navbar,sidebar:a.sidebar,sidebarGroups:a.theme?.sidebarGroups,socialLinks:a.socialLinks,githubRepo:a.githubRepo,tabs:a.tabs,codeTheme:a.codeTheme,communityHelp:a.communityHelp,version:a.version,editLink:a.editLink,...a.theme||{}},u=Object.fromEntries(Object.entries(c).filter(([e,t])=>t!==void 0));u.navbar&&=u.navbar.map(e=>({label:e.label||e.text||``,href:e.href||e.link||e.to||``,items:e.items}));let d={docsDir:s.resolve(e),theme:{...i.theme,...u},i18n:a.i18n?{...a.i18n,locales:Array.isArray(a.i18n.locales)?Object.fromEntries(a.i18n.locales.map(e=>[e,e])):a.i18n.locales}:void 0,versions:a.versions,siteUrl:a.siteUrl,base:a.base,seo:a.seo,plugins:a.plugins||[],robots:a.robots,security:a.security,integrations:a.integrations,vite:a.vite},f=I.safeParse(d);if(!f.success)throw new r(`Invalid Boltdocs configuration:\n${f.error.issues.map(e=>` - ${e.path.join(`.`)}: ${e.message}`).join(`
27
- `)}`);return f.data}const oe=a(import.meta.url);function se(e,t){let n=e.split(`-`)[0].split(`.`).map(Number),r=t.split(`-`)[0].split(`.`).map(Number);for(let e=0;e<Math.max(n.length,r.length);e++){let t=n[e]??0,i=r[e]??0;if(Number.isNaN(t)||Number.isNaN(i))return!1;if(t!==i)return t>i}return!1}async function ce(){try{let e=new AbortController,t=setTimeout(()=>e.abort(),2e3),n=await fetch(`https://registry.npmjs.org/boltdocs/latest`,{signal:e.signal,headers:{Accept:`application/vnd.npm.install-v1+json`}});return clearTimeout(t),n.ok?(await n.json()).version??null:null}catch{return null}}async function le(){try{let e=x(import.meta.url),t=s.dirname(e);for(let e=0;e<5;e++){let e=s.join(t,`package.json`);if(l.existsSync(e)){let t=JSON.parse(l.readFileSync(e,`utf-8`));if(t.name===`boltdocs`)return t.version}t=s.dirname(t)}}catch{}try{return oe(`boltdocs/package.json`).version}catch{return`0.0.0`}}async function B(){let e=``;try{e=s.join(S.homedir(),`.boltdocs`,`update-check.json`)}catch{return}let t=0;try{if(l.existsSync(e)){let n=JSON.parse(l.readFileSync(e,`utf-8`));t=Number(n.lastCheck)||0}}catch{}let n=Date.now();if(n-t<864e5)return;try{l.mkdirSync(s.dirname(e),{recursive:!0}),l.writeFileSync(e,JSON.stringify({lastCheck:n}),`utf-8`)}catch{}let r=await le();if(r===`0.0.0`)return;let i=await ce();i&&se(i,r)&&console.log(d.updateAvailable(r,i))}const V={$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 H(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 U(e,t,n){return e.doctorConfig.severity[t]||n}async function ue(e,t){l.existsSync(t)||l.mkdirSync(t,{recursive:!0});let n=s.basename(e),r=new Date().toISOString().replace(/[:.]/g,`-`),i=s.join(t,`${n}.${r}.bak`);l.copyFileSync(e,i)}const W=new Map;function G(e){let n=W.get(e);if(n)return n;let r=(async()=>{let n=await t(e,!1);return{raw:n.raw,data:n.data,content:n.content}})();return W.set(e,r),r}const K=new Map;function q(e){if(K.has(e))return K.get(e);let t=!1;try{t=l.existsSync(e)&&l.statSync(e).isFile()}catch{t=!1}return K.set(e,t),t}async function J(e){let t=s.resolve(e,`doctor.json`);if(l.existsSync(t))try{let e=JSON.parse(l.readFileSync(t,`utf-8`));return{...V,...e,checks:{...V.checks,...e.checks,metadata:{...V.checks.metadata,...e.checks?.metadata},links:{...V.checks.links,...e.checks?.links},i18n:{...V.checks.i18n,...e.checks?.i18n},performance:{...V.checks.performance,...e.checks?.performance,budgets:{...V.checks.performance?.budgets,...e.checks?.performance?.budgets}}},fix:{...V.fix,...e.fix},reporting:{...V.reporting,...e.reporting},severity:{...V.severity,...e.severity},exclude:[...V.exclude,...e.exclude||[]]}}catch(e){b(`Failed to parse doctor.json: ${e}`)}return V}async function Y(t,n=process.cwd(),r,i){let a=s.resolve(n,`.boltdocs`,`generated`);l.existsSync(a)||l.mkdirSync(a,{recursive:!0});let o=i;o||=await new c().withFullPaths().filter(e=>e.endsWith(`.md`)||e.endsWith(`.mdx`)).crawl(t).withPromise();let u=r?.base||`/docs`,d=[];for(let n=0;n<o.length;n+=100){let r=o.slice(n,n+100),i=await Promise.all(r.map(async n=>{let r=s.isAbsolute(n)?n:s.resolve(t,n),i=s.relative(t,r),{data:a}=await G(r),o;return o=a.permalink?a.permalink.startsWith(`/`)?a.permalink:`/${a.permalink}`:e(i),u===`/`?o:(u.endsWith(`/`)?u:u+`/`)+(o.startsWith(`/`)?o.substring(1):o)}));d.push(...i)}d.includes(u)||d.push(u);let f={routes:Array.from(new Set(d)).sort(),timestamp:Date.now()};return l.writeFileSync(s.resolve(a,`link-tree.json`),JSON.stringify(f,null,2)),f}function de(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-C(i,a)/Math.max(i.length,a.length);return o>.8?o*.95:1-C(e,t)/Math.max(e.length,t.length)}const X=new Map;function Z(e,t){if(X.has(e))return X.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=de(e,a);c>i&&(i=c,r=a)}let a={bestMatch:r,similarity:i};return X.set(e,a),a}async function Q(e){let t=[];if(!e.doctorConfig.checks.metadata.enabled)return t;let{titleMin:r,titleMax:a,descriptionMin:o}=e.doctorConfig.checks.metadata,c=new Map;for(let l of e.files){let u=n(s.relative(e.docsDir,l));try{let{raw:n,data:s}=await G(l);if(n.trim().startsWith(`---`)&&n.split(`---`).length>=3&&Object.keys(s).length===0){let n=U(e,`malformedFrontmatter`,`high`);n!==`off`&&t.push({file:u,level:n,message:`Malformed frontmatter (YAML parsing failed).`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}let d=i.safeParse(s);if(!d.success){let n=U(e,`invalidFrontmatter`,`high`);if(n!==`off`)for(let e of d.error.issues)t.push({file:u,level:n,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 n of f)if(s[n]===void 0){let r=U(e,`missingMetadata`,`warning`);r!==`off`&&t.push({file:u,level:r,message:`Missing required frontmatter field: "${n}".`,suggestion:`Add the "${n}" field to your frontmatter.`})}if(e.doctorConfig.checks.metadata.validateDates){let n=[`date`,`lastUpdated`,...e.doctorConfig.checks.metadata.optional.filter(e=>e.toLowerCase().includes(`date`))];for(let r of n)if(s[r]&&Number.isNaN(Date.parse(String(s[r])))){let n=U(e,`invalidFrontmatter`,`high`);n!==`off`&&t.push({file:u,level:n,message:`Invalid date format in field "${r}": "${s[r]}".`,suggestion:`Use a valid ISO date format (e.g., YYYY-MM-DD).`})}}if(s.title){let n=String(s.title);if(n.length<r){let i=U(e,`shortMetadata`,`low`);i!==`off`&&t.push({file:u,level:i,message:`Title is too short (${n.length} chars).`,suggestion:`Titles should be at least ${r} characters for better SEO.`})}else if(n.length>a){let r=U(e,`shortMetadata`,`low`);r!==`off`&&t.push({file:u,level:r,message:`Title is too long (${n.length} chars).`,suggestion:`Titles should be under ${a} characters.`})}let i=c.get(n)||[];i.push(u),c.set(n,i)}if(s.description&&String(s.description).length<o){let n=U(e,`shortMetadata`,`low`);n!==`off`&&t.push({file:u,level:n,message:`Description is very short.`,suggestion:`Descriptions should ideally be at least ${o} characters.`})}}catch(n){if(n instanceof Error){let r=U(e,`malformedFrontmatter`,`high`);r!==`off`&&t.push({file:u,level:r,message:`Malformed frontmatter (YAML error): ${n.message}`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}}}for(let[n,r]of c.entries())if(r.length>1){let i=U(e,`duplicateTitle`,`low`);if(i!==`off`)for(let e of r)t.push({file:e,level:i,message:`Duplicate title found: "${n}"`,suggestion:`Ensure each page has a unique title. Also used in: ${r.filter(t=>t!==e).join(`, `)}`})}return t}async function $(e){let t=[],{internal:r,external:i,ignore:a,timeout:o,concurrency:c}=e.doctorConfig.checks.links;if(!r&&!i&&!e.options.checkExternal)return t;let u=/(?:\[.*?\]\((.*?)\))|(?:href=["']([^"']+)["'])/g,d=new Set,f=5e5;for(let o of e.files){let c=n(s.relative(e.docsDir,o)),{content:p}=await G(o),m=[...(p.length>f?p.slice(0,f):p).replace(/```[\s\S]*?```/g,``).replace(/`[^`\n]*`/g,``).matchAll(u)];for(let n of m){let u=n[1]||n[2],f=!!n[1];if(!u||a.some(e=>u.includes(e)))continue;if(/^https?:\/\//i.test(u)){(i||e.options.checkExternal)&&d.add({url:u,file:o});continue}if(!r||/^(mailto|tel|#)/i.test(u))continue;let p;try{p=decodeURIComponent(u.split(`#`)[0].split(`?`)[0])}catch{p=u.split(`#`)[0].split(`?`)[0]}if(!p)continue;let m=!1,h=``;if(p.startsWith(`/`))if(e.routeIndex.has(p)||e.routeIndexWithSlash.has(p)||e.routeIndexWithoutSlash.has(p))m=!0;else{let t=e.basePrefix+(p.startsWith(`/`)?p:`/`+p);if(e.routeIndex.has(t)||e.routeIndexWithSlash.has(t))m=!1,h=t;else{let t=e.config.base!==`/`&&p.startsWith(e.config.base||`/`)?p.substring((e.config.base||`/`).length):p,n=t.startsWith(`/`)?t.substring(1):t;h=s.join(e.docsDir,n),m=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`].some(e=>q(h+e))}}else h=s.resolve(s.dirname(o),p),m=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`].some(e=>q(h+e));if(!m){let{bestMatch:n,similarity:r}=Z(p,e.linkTree.routes),i=!1,a=e.basePrefix+(p.startsWith(`/`)?p:`/`+p);(e.routeIndex.has(a)||e.routeIndexWithSlash.has(a))&&(n=a,r=1,i=!0);let s=r>.6||i,d=r>.75&&n!==p||i,m=U(e,`brokenLink`,`high`);m!==`off`&&t.push({file:c,level:m,message:`Broken internal link: "${u}"`,suggestion:s?`Did you mean "${n}"?`:`Ensure the target exists or check for typos.`,fix:d?async()=>{let e=u.includes(`#`)?`#`+u.split(`#`)[1]:``,t=f?`(${u})`:`href="${u}"`,r=f?`(${n}${e})`:`href="${n}${e}"`,i=l.readFileSync(o,`utf-8`).replace(t,r);l.writeFileSync(o,i),W.delete(o)}:void 0})}}}if(d.size>0){v(p.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(),o),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.message}}},a=Array.from(r.keys()),l=[];for(let e=0;e<a.length;e+=c){let t=a.slice(e,e+c),n=await Promise.allSettled(t.map(i));l.push(...n.map(e=>e.status===`fulfilled`?e.value:{url:`unknown`,ok:!1,error:e.reason}))}for(let i of l)if(!i.ok){let a=U(e,`brokenLink`,`warning`);if(a!==`off`){let o=r.get(i.url)||[];for(let r of o)t.push({file:n(s.relative(e.docsDir,r)),level:a,message:`Broken external link: "${i.url}"`,suggestion:`Verify the URL or update it if it's permanently down. Error: ${i.error||`Status >= 400`}`})}}}return t}async function fe(e){let t=[];if(!e.doctorConfig.checks.i18n.enabled||!e.config.i18n)return t;let{defaultLocale:r,locales:i}=e.config.i18n,a=Object.keys(i),o=a.filter(e=>e!==r);for(let i of e.files){let c=n(s.relative(e.docsDir,i)),u=c.split(`/`),d=u[0];if(d===r){let n=u.slice(1).join(`/`);for(let r of o){let a=s.join(e.docsDir,r,n);if(!q(a)){let o=U(e,`missingTranslation`,`warning`);o!==`off`&&t.push({file:c,level:o,message:`Missing translation for locale "${r}"`,suggestion:`Create a version at "${r}/${n}".`,fix:async()=>{let e=s.dirname(a);l.existsSync(e)||l.mkdirSync(e,{recursive:!0}),l.copyFileSync(i,a)}})}}}else if(a.includes(d)){let n=u.slice(1).join(`/`);if(!q(s.join(e.docsDir,r,n))){let a=U(e,`missingTranslation`,`low`);a!==`off`&&t.push({file:c,level:a,message:`Orphaned translation (source missing in "${r}")`,suggestion:`Remove this file or create the source at "${r}/${n}".`,fix:async()=>{l.unlinkSync(i)}})}}}return t}async function pe(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=U(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}=Z(r.link,e.linkTree.routes),a=i>.6,o=U(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=U(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 me(e){let t=[],n=e.doctorConfig.checks.performance;if(!n?.enabled)return t;let r=s.resolve(e.root,`.boltdocs`,`reports`,`performance.json`);if(!l.existsSync(r))return t.push({file:`(build)`,level:U(e,`budgetExceeded`,`warning`),message:"Performance metrics not found. Run `boltdocs build` first."}),t;let i;try{i=JSON.parse(l.readFileSync(r,`utf-8`))}catch{return t.push({file:`(build)`,level:U(e,`budgetExceeded`,`warning`),message:`Failed to parse performance metrics file.`}),t}let a=n.budgets,o=U(e,`budgetExceeded`,`warning`),c=H(a?.maxJSBundleSize,1/0),u=H(a?.maxCSSBundleSize,1/0),d=H(a?.maxPageHTMLSize,1/0),f=a?.maxImagesKB??1/0,p=a?.maxBuildTime??1/0,m=a?.maxFontCount??1/0;if(c!==1/0&&i.totalJSBundleSize>c){let e=(i.totalJSBundleSize/1024).toFixed(0),n=(c/1024).toFixed(0);t.push({file:`(build)`,level:o,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:o,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:o,message:`Page HTML size exceeds budget: ${n}kb > ${r}kb`,suggestion:`Reduce the amount of inline content or split into sub-pages.`})}}let h=f*1024;if(f!==1/0&&i.totalImagesSize>h){let e=(i.totalImagesSize/1024).toFixed(0);t.push({file:`(build)`,level:o,message:`Image assets exceed budget: ${e}kb > ${f}kb`,suggestion:`Optimize images with lossy compression or use next-gen formats (webp/avif).`})}if(p!==1/0&&i.buildTime>p){let e=(i.buildTime/1e3).toFixed(1),n=(p/1e3).toFixed(1);t.push({file:`(build)`,level:o,message:`Build time exceeds budget: ${e}s > ${n}s`,suggestion:"Check for large unoptimized assets or increase `concurrency` in SSG options."})}return m!==1/0&&i.fontCount>m&&t.push({file:`(build)`,level:o,message:`Font files exceed budget: ${i.fontCount} > ${m}`,suggestion:`Reduce the number of font families or use variable fonts.`}),t}async function he(e){let t=s.resolve(e,`doctor.json`);if(l.existsSync(t)){b(`"doctor.json" already exists at ${e}.`);return}try{l.writeFileSync(t,JSON.stringify(V,null,2)),y(`Created "doctor.json" with default configuration.`)}catch(e){_(`Failed to create "doctor.json": ${e}`)}}async function ge(e=process.cwd(),t={}){if(t.init){await he(e);return}B();try{let n=await J(e),{format:r}=n.reporting,i=performance.now(),a=await z(`docs`,e),o=s.resolve(e,`docs`);l.existsSync(o)||(r===`pretty`&&_(`Docs dir not found at ${o}`),process.exit(1)),r===`pretty`&&console.log(g(`✦ DOCTOR — Documentation Health Check`,[` ${p.dim(`Docs dir:`)} ${o}`,` ${p.dim(`Reports:`)} ${e}/.boltdocs/reports/`])),r===`pretty`&&v(p.dim(`🔍 Discovering files and routes...`));let u=re(n.exclude||[]),d=await new c().withFullPaths().filter(e=>{if(!(e.endsWith(`.md`)||e.endsWith(`.mdx`)))return!1;let t=s.relative(o,e).replace(/\\/g,`/`),n=t.split(`/`).some(e=>e.startsWith(`_`)&&e!==`_index.md`&&e!==`_index.mdx`);return!u(t)&&!n}).crawl(o).withPromise();for(let e of d)K.set(e,!0);let b=await Y(o,e,a,d),x=a.base||`/`,S=x===`/`?``:x.endsWith(`/`)?x.slice(0,-1):x,C={root:e,docsDir:o,config:a,doctorConfig:n,linkTree:b,files:d,options:t,routeIndex:new Set(b.routes),routeIndexWithSlash:new Set(b.routes.map(e=>e.endsWith(`/`)?e:e+`/`)),routeIndexWithoutSlash:new Set(b.routes.map(e=>e.endsWith(`/`)?e.slice(0,-1):e)),basePrefix:S};r===`pretty`&&v(p.dim(`🧪 Running diagnostic checks in parallel...`));let w=[Q(C),$(C),fe(C),pe(C)];t.budget&&w.push(me(C));let[T,E,D,O,...k]=await Promise.all(w),A=t.budget?k[0]:[],j=[...T,...E,...D,...O,...A];if(r===`pretty`){let e=[{label:`Metadata checks ${T.length>0?`— ${T.length} issue${T.length===1?``:`s`}`:`— OK`}`,done:T.length===0},{label:`Link checks ${E.length>0?`— ${E.length} issue${E.length===1?``:`s`}`:`— OK`}`,done:E.length===0},{label:`i18n checks ${D.length>0?`— ${D.length} issue${D.length===1?``:`s`}`:`— OK`}`,done:D.length===0},{label:`Sidebar checks ${O.length>0?`— ${O.length} issue${O.length===1?``:`s`}`:`— OK`}`,done:O.length===0}];t.budget&&e.push({label:`Performance budget ${A.length>0?`— ${A.length} issue${A.length===1?``:`s`}`:`— OK`}`,done:A.length===0}),console.log(`\n${ne(e)}`)}let M=0;if(t.fix){for(let e of j)if(e.fix){if(C.doctorConfig.fix.confirmChanges&&!await m(`Fix issue in "${e.file}": ${e.message}?`))continue;if(C.doctorConfig.fix.backupFiles){let t=s.resolve(C.docsDir,e.file);l.existsSync(t)&&await ue(t,s.resolve(C.root,C.doctorConfig.fix.backupPath))}await e.fix(),M++}}let N=((performance.now()-i)/1e3).toFixed(2),P=j.filter(e=>e.level===`high`).length,F=j.filter(e=>e.level===`warning`).length,I=j.filter(e=>e.level===`low`).length,L={summary:{total:j.length,high:P,warning:F,low:I,fixed:M,duration:N},issues:j.map(e=>({...e,fix:void 0}))};if(n.reporting.outputFile){let t=s.resolve(e,n.reporting.outputFile);l.existsSync(s.dirname(t))||l.mkdirSync(s.dirname(t),{recursive:!0}),l.writeFileSync(t,JSON.stringify(L,null,2))}if(r===`json`)console.log(JSON.stringify(L,null,2));else if(r===`pretty`){let e=j.reduce((e,t)=>(e[t.file]||(e[t.file]=[]),e[t.file].push(t),e),{});if(j.length>0){h();for(let[n,r]of Object.entries(e)){let e=[];for(let n of r){let r=n.level===`high`?`❌`:n.level===`warning`?`⚠️`:`ℹ️`,i=n.level===`high`?p.red:n.level===`warning`?p.yellow:p.blue;e.push(`${r} ${i(n.level.toUpperCase())}: ${n.message}`),n.suggestion&&e.push(` ${p.dim(`💡 ${n.suggestion}`)}`),t.fix&&n.fix&&e.push(` ${p.green(`✅ Fixed automatically`)}`)}console.log(`\n${te(`📄 ${n}`,e)}`)}h()}if(j.length===0)console.log(ee(`✨ Documentation Health Check`,[` Everything looks perfect!`,` Your documentation is in great shape.`,``,` ${p.dim(`Scanned ${d.length} file${d.length===1?``:`s`} in ${N}s`)}`]));else{let e=[];P>0&&e.push(p.red(`${P} Critical Error${P===1?``:`s`}`)),F>0&&e.push(p.yellow(`${F} Warning${F===1?``:`s`}`)),I>0&&e.push(p.blue(`${I} Improvement${I===1?``:`s`}`));let t=[...f(e).split(`
28
- `).map(e=>e.trimStart()),``,p.dim(`Scanned ${d.length} file${d.length===1?``:`s`} in ${N}s`)];console.log(`\n${g(`Diagnosis Results`,t)}\n`),M>0&&y(`Successfully fixed ${M} issues automatically!`),P>0?_(`Please fix the critical errors before building for production.`):y(`No critical issues found. You are ready to go!`)}}n.reporting.failOnError&&P>0&&process.exit(1),n.reporting.maxWarnings!==-1&&F>n.reporting.maxWarnings&&(r===`pretty`&&_(`Failed: Too many warnings (${F} > ${n.reporting.maxWarnings})`),process.exit(1))}catch(e){_(`Doctor failed: ${e}`),process.exit(1)}}export{T as _,Q as a,Y as c,B as d,R as f,ie as g,L as h,$ as i,J as l,ae as m,he as n,me as o,z as p,fe as r,pe as s,ge as t,V as u};