boltdocs 2.8.4 → 2.9.1

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 (105) 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-B19MLTpN.cjs +6 -0
  5. package/dist/cache-CfhOTR3Q.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/config-BqZUYono.cjs +7 -0
  20. package/dist/config-DBKBEj3j.mjs +7 -0
  21. package/dist/config-GPVEdeon.mjs +6 -0
  22. package/dist/config-kIQOJHXC.cjs +6 -0
  23. package/dist/csp-CBysWlAf.cjs +6 -0
  24. package/dist/csp-RJyh0nHV.mjs +6 -0
  25. package/dist/{docs-layout-CVCf3xkZ.cjs → docs-layout-3TpAt6MB.cjs} +302 -238
  26. package/dist/{docs-layout-BBv6wILp.js → docs-layout-6FQ8__ok.js} +303 -239
  27. package/dist/doctor-C19DsI1e.mjs +7 -0
  28. package/dist/{doctor-DT4jh07O.cjs → doctor-D8fl3Sbg.cjs} +1 -1
  29. package/dist/doctor-DzEgMMRo.cjs +7 -0
  30. package/dist/errors-C0Hx15Ag.mjs +6 -0
  31. package/dist/errors-Dx6JHoKE.cjs +6 -0
  32. package/dist/{generator-BHCrLU6h.mjs → generator-B6lrnDZ-.mjs} +1 -1
  33. package/dist/{generator-CC2yHzhZ.cjs → generator-DtUU3Cfk.cjs} +2 -2
  34. package/dist/handler-1LRMYeI4.cjs +28 -0
  35. package/dist/handler-CyIBbZdb.mjs +28 -0
  36. package/dist/{doctor-BGPdO1Ah.mjs → handler-eNNcucnf.mjs} +1 -1
  37. package/dist/headers-BJ4jJAhU.cjs +6 -0
  38. package/dist/headers-HD_qTVVW.mjs +6 -0
  39. package/dist/{icons-dev-C8sFxeBk.cjs → icons-dev-BryEFkJu.cjs} +90 -4
  40. package/dist/{icons-dev-CFcv5Nb8.js → icons-dev-kJyGWNeg.js} +73 -5
  41. package/dist/{image-DCMxxidi.cjs → image-B9YA_oQ_.cjs} +17 -9
  42. package/dist/{image-DufDOid8.js → image-CjYu9Eml.js} +17 -9
  43. package/dist/{mdx-Bto8CvGl.js → mdx-Cy_c2zio.js} +116 -33
  44. package/dist/{mdx-BH9kHiF9.cjs → mdx-WXjAMS8Y.cjs} +121 -32
  45. package/dist/{meta-loader-Cv9O0Pzl.cjs → meta-loader-C9MKjAs0.cjs} +1 -1
  46. package/dist/{meta-loader-DzwDFtdT.mjs → meta-loader-CxAoQthW.mjs} +1 -1
  47. package/dist/node/cli-entry.cjs +8 -2
  48. package/dist/node/cli-entry.mjs +8 -2
  49. package/dist/node/index.cjs +1 -1
  50. package/dist/node/index.d.cts +362 -18
  51. package/dist/node/index.d.mts +364 -19
  52. package/dist/node/index.mjs +1 -1
  53. package/dist/node/routes/worker.cjs +1 -1
  54. package/dist/node/routes/worker.mjs +1 -1
  55. package/dist/node-B7qbjtLl.mjs +105 -0
  56. package/dist/node-Dj3-2YYP.cjs +105 -0
  57. package/dist/{package-CwNjt3Sd.cjs → package-ByXh2JHp.cjs} +1 -1
  58. package/dist/{package-DlgexgpQ.mjs → package-DQBAV8uo.mjs} +1 -1
  59. package/dist/{parser-BzB-zCkF.cjs → parser-B8naUXl2.cjs} +1 -1
  60. package/dist/parser-D4oEyuP-.cjs +6 -0
  61. package/dist/parser-IR9tfyGE.mjs +6 -0
  62. package/dist/plugin-BkquLpOI.mjs +61 -0
  63. package/dist/plugin-CL1LsQXk.cjs +61 -0
  64. package/dist/routes-DR13Y1em.mjs +6 -0
  65. package/dist/routes-DX8ryKjs.cjs +6 -0
  66. package/dist/routes-DgTQxpZi.cjs +6 -0
  67. package/dist/routes-TUSK5wD7.mjs +6 -0
  68. package/dist/{search-dialog-Cvux-qSk.cjs → search-dialog-BhXg05Ri.cjs} +1 -1
  69. package/dist/{search-dialog-CmHYOt18.cjs → search-dialog-BsAiQgnx.cjs} +2 -2
  70. package/dist/{search-dialog-jHZ21G4i.js → search-dialog-CaOO1Q4i.js} +2 -2
  71. package/dist/{search-dialog-Cr7SC8Xt.cjs → search-dialog-CzwvKoLW.cjs} +1 -1
  72. package/dist/{search-dialog-DBNaG5At.js → search-dialog-DRNJsxOv.js} +1 -1
  73. package/dist/{search-dialog-e86WPpck.js → search-dialog-DaR66wl0.js} +1 -1
  74. package/dist/shiki-adapter-BB71nVsG.cjs +6 -0
  75. package/dist/shiki-adapter-CL-IQwKI.cjs +6 -0
  76. package/dist/shiki-adapter-CxTLkjew.mjs +6 -0
  77. package/dist/shiki-adapter-rQ087Lx3.mjs +6 -0
  78. package/dist/{sidebar-kQBonN82.d.ts → sidebar-BtJyWHy4.d.cts} +42 -5
  79. package/dist/{sidebar---RgTmZD.d.cts → sidebar-C4fuRYYS.d.ts} +42 -5
  80. package/dist/types-generator-BRyf4o9F.mjs +26 -0
  81. package/dist/types-generator-BqNKCbrx.cjs +26 -0
  82. package/dist/types-generator-Cu2jQP-V.mjs +6 -0
  83. package/dist/utils-BWy_8ASj.cjs +7 -0
  84. package/dist/utils-DexBrwiP.mjs +7 -0
  85. package/dist/worker-pool-C6r6V05j.mjs +6 -0
  86. package/dist/worker-pool-m81xuM5v.cjs +6 -0
  87. package/package.json +6 -3
  88. package/src/shared/types.ts +36 -3
  89. package/dist/cache-BMUyNiiA.mjs +0 -6
  90. package/dist/cache-CKm45d2w.cjs +0 -6
  91. package/dist/chunk-CU-zTemE.cjs +0 -6
  92. package/dist/doctor-Dnv77Lfx.mjs +0 -28
  93. package/dist/doctor-VBPlQf7d.cjs +0 -28
  94. package/dist/node-JM9bx0mO.cjs +0 -160
  95. package/dist/node-q-Y2mdLX.mjs +0 -160
  96. package/dist/parser-9LqyiEnB.mjs +0 -6
  97. package/dist/parser-B7-6PyQz.cjs +0 -6
  98. package/dist/routes-3sAccArX.cjs +0 -6
  99. package/dist/routes-DZpXqq1p.mjs +0 -6
  100. package/dist/routes-DjoxNeef.mjs +0 -6
  101. package/dist/routes-DpJnb2VS.cjs +0 -6
  102. package/dist/utils-BYITg7T5.mjs +0 -7
  103. package/dist/utils-Cjmx1hhk.cjs +0 -7
  104. package/dist/worker-pool-DXLyeHJg.cjs +0 -6
  105. package/dist/worker-pool-Kn4F9gDq.mjs +0 -6
@@ -3,8 +3,8 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import { D as Check, F as File, M as Copy, T as AlertTriangle, V as Lightbulb, _ as Link, a as Csv, c as JavaScript, d as React$1, f as Rust, g as Yaml, i as Css, l as Json, m as TypeScript, n as BracketsOrange, p as Shell, r as BracketsRed, u as Markdown, w as AlertCircle, y as cn, z as Info } from "./icons-dev-CFcv5Nb8.js";
7
- import { a as CodeBlockGroup, i as CodeBlockContent, l as useTheme, n as Tooltip, o as CodeBlockHeader, r as CodeBlock$1, s as Heading$1, t as Image$1 } from "./image-DufDOid8.js";
6
+ import { D as Check, H as Info, M as Copy, R as File, T as AlertTriangle, W as Lightbulb, _ as Link, a as Csv, c as JavaScript, d as React$1, f as Rust, g as Yaml, i as Css, l as Json, m as TypeScript, n as BracketsOrange, p as Shell, r as BracketsRed, rt as useConfig, u as Markdown, w as AlertCircle, y as cn } from "./icons-dev-kJyGWNeg.js";
7
+ import { a as CodeBlockGroup, i as CodeBlockContent, l as useTheme, n as Tooltip, o as CodeBlockHeader, r as CodeBlock$1, s as Heading$1, t as Image$1 } from "./image-CjYu9Eml.js";
8
8
  import { useCallback, useEffect, useRef, useState } from "react";
9
9
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
10
10
  import { Button } from "react-aria-components";
@@ -248,12 +248,66 @@ const copyToClipboard = async (text) => {
248
248
 
249
249
  //#endregion
250
250
  //#region src/client/components/mdx/use-code-block.ts
251
+ const langIconMap = {
252
+ ts: TypeScript,
253
+ tsx: React$1,
254
+ js: JavaScript,
255
+ jsx: React$1,
256
+ json: Json,
257
+ css: Css,
258
+ html: BracketsOrange,
259
+ md: Markdown,
260
+ mdx: Markdown,
261
+ bash: Shell,
262
+ sh: Shell,
263
+ yaml: Yaml,
264
+ yml: Yaml,
265
+ rs: Rust,
266
+ rust: Rust,
267
+ toml: BracketsRed,
268
+ csv: Csv
269
+ };
251
270
  function useCodeBlock(props) {
252
271
  const [copied, setCopied] = useState(false);
253
272
  const [isExpanded, setIsExpanded] = useState(false);
254
273
  const [isExpandable, setIsExpandable] = useState(false);
255
274
  const preRef = useRef(null);
256
275
  const timerRef = useRef(null);
276
+ const [rated, setRated] = useState(null);
277
+ const customConfig = useConfig().integrations?.feedback?.custom;
278
+ const showCodeBlockFeedback = !!(customConfig?.enabled && !props.plain);
279
+ const lang = props.lang || props["data-lang"] || "";
280
+ const isHighlighted = props["data-highlighted"] === "true" || typeof props.className === "string" && props.className.includes("shiki");
281
+ const rawHighlightedHtml = props.highlightedHtml || props["data-highlighted-html"];
282
+ const effectiveHighlightedHtml = typeof rawHighlightedHtml === "string" ? rawHighlightedHtml.replace(/<span class="line">\s*(?:<span[^>]*>\s*<\/span>)?\s*<\/span>\s*(<\/code>\s*<\/pre>)/g, "$1") : rawHighlightedHtml;
283
+ const effectiveTitle = props.title || props["data-title"];
284
+ const handleRate = useCallback(async (type) => {
285
+ if (rated) return;
286
+ setRated(type);
287
+ try {
288
+ const code = preRef.current?.textContent ?? "";
289
+ const snippet = code.trim().slice(0, 100) + (code.length > 100 ? "..." : "");
290
+ const blockId = `Code Block (${lang || "plain"}): \`${snippet}\``;
291
+ const endpoint = customConfig?.endpoint || "/api/feedback";
292
+ await fetch(endpoint, {
293
+ method: "POST",
294
+ headers: { "Content-Type": "application/json" },
295
+ body: JSON.stringify({
296
+ rating: type === "up" ? "good" : "bad",
297
+ comment: `Rated code block: ${type === "up" ? "Helpful" : "Unhelpful"}`,
298
+ path: window.location.pathname,
299
+ title: document.title,
300
+ blockId
301
+ })
302
+ });
303
+ } catch (err) {
304
+ console.error("Failed to submit code block feedback:", err);
305
+ }
306
+ }, [
307
+ rated,
308
+ lang,
309
+ customConfig?.endpoint
310
+ ]);
257
311
  useEffect(() => {
258
312
  return () => {
259
313
  if (timerRef.current) clearTimeout(timerRef.current);
@@ -272,6 +326,7 @@ function useCodeBlock(props) {
272
326
  const lines = (preRef.current?.textContent ?? "").trim().split("\n").length;
273
327
  setIsExpandable(lines > 6);
274
328
  }, [props.children, props.highlightedHtml]);
329
+ const LangIcon = langIconMap[lang] || File;
275
330
  return {
276
331
  copied,
277
332
  isExpanded,
@@ -279,31 +334,20 @@ function useCodeBlock(props) {
279
334
  isExpandable,
280
335
  preRef,
281
336
  handleCopy,
282
- shouldTruncate: isExpandable && !isExpanded
337
+ shouldTruncate: isExpandable && !isExpanded,
338
+ isHighlighted,
339
+ effectiveHighlightedHtml,
340
+ effectiveTitle,
341
+ lang,
342
+ showCodeBlockFeedback,
343
+ rated,
344
+ handleRate,
345
+ LangIcon
283
346
  };
284
347
  }
285
348
 
286
349
  //#endregion
287
350
  //#region src/client/components/mdx/code-block.tsx
288
- const langIconMap = {
289
- ts: TypeScript,
290
- tsx: React$1,
291
- js: JavaScript,
292
- jsx: React$1,
293
- json: Json,
294
- css: Css,
295
- html: BracketsOrange,
296
- md: Markdown,
297
- mdx: Markdown,
298
- bash: Shell,
299
- sh: Shell,
300
- yaml: Yaml,
301
- yml: Yaml,
302
- rs: Rust,
303
- rust: Rust,
304
- toml: BracketsRed,
305
- csv: Csv
306
- };
307
351
  const CopyButton = ({ copied, handleCopy }) => {
308
352
  return /* @__PURE__ */ jsx(Tooltip, {
309
353
  content: copied ? "Copied!" : "Copy code",
@@ -315,16 +359,52 @@ const CopyButton = ({ copied, handleCopy }) => {
315
359
  })
316
360
  });
317
361
  };
362
+ const CodeBlockFeedback = ({ rated, onRate }) => {
363
+ return /* @__PURE__ */ jsxs("div", {
364
+ className: "flex items-center gap-0.5 border-r border-subtle pr-1.5 mr-1",
365
+ children: [/* @__PURE__ */ jsx(Tooltip, {
366
+ content: rated === "up" ? "Helpful!" : "This code is helpful",
367
+ children: /* @__PURE__ */ jsx(Button, {
368
+ onPress: () => onRate("up"),
369
+ disabled: rated !== null,
370
+ className: cn("grid place-items-center size-8 bg-transparent outline-none cursor-pointer transition-all duration-200 hover:scale-110 active:scale-95 [&>svg]:size-4 [&>svg]:stroke-2 z-10", rated === "up" ? "text-emerald-500 dark:text-emerald-400" : rated === "down" ? "opacity-30 cursor-not-allowed text-muted" : "text-muted hover:text-body"),
371
+ "aria-label": "Mark as helpful",
372
+ children: /* @__PURE__ */ jsx("svg", {
373
+ xmlns: "http://www.w3.org/2000/svg",
374
+ viewBox: "0 0 24 24",
375
+ fill: "none",
376
+ stroke: "currentColor",
377
+ strokeWidth: "2",
378
+ strokeLinecap: "round",
379
+ strokeLinejoin: "round",
380
+ children: /* @__PURE__ */ jsx("path", { d: "M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3" })
381
+ })
382
+ })
383
+ }), /* @__PURE__ */ jsx(Tooltip, {
384
+ content: rated === "down" ? "Unhelpful" : "This code is unhelpful",
385
+ children: /* @__PURE__ */ jsx(Button, {
386
+ onPress: () => onRate("down"),
387
+ disabled: rated !== null,
388
+ className: cn("grid place-items-center size-8 bg-transparent outline-none cursor-pointer transition-all duration-200 hover:scale-110 active:scale-95 [&>svg]:size-4 [&>svg]:stroke-2 z-10", rated === "down" ? "text-rose-500 dark:text-rose-400" : rated === "up" ? "opacity-30 cursor-not-allowed text-muted" : "text-muted hover:text-body"),
389
+ "aria-label": "Mark as unhelpful",
390
+ children: /* @__PURE__ */ jsx("svg", {
391
+ xmlns: "http://www.w3.org/2000/svg",
392
+ viewBox: "0 0 24 24",
393
+ fill: "none",
394
+ stroke: "currentColor",
395
+ strokeWidth: "2",
396
+ strokeLinecap: "round",
397
+ strokeLinejoin: "round",
398
+ children: /* @__PURE__ */ jsx("path", { d: "M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3" })
399
+ })
400
+ })
401
+ })]
402
+ });
403
+ };
318
404
  function CodeBlock(props) {
319
405
  const { children, hideCopy = false, highlightedHtml, "data-highlighted-html": dataHighlightedHtml, title, "data-title": dataTitle, "data-lang": dataLang, plain = false, lineNumbers, showLineNumbers, wordWrap, "word-wrap": wordWrapHyphen, metastring, ...rest } = props;
320
406
  const { className: shikiClassName, ...cleanRest } = rest;
321
- const isHighlighted = props["data-highlighted"] === "true" || typeof shikiClassName === "string" && shikiClassName.includes("shiki");
322
- const rawHighlightedHtml = highlightedHtml || dataHighlightedHtml;
323
- const effectiveHighlightedHtml = typeof rawHighlightedHtml === "string" ? rawHighlightedHtml.replace(/<span class="line">\s*(?:<span[^>]*>\s*<\/span>)?\s*<\/span>\s*(<\/code>\s*<\/pre>)/g, "$1") : rawHighlightedHtml;
324
- const effectiveTitle = title || dataTitle;
325
- const lang = props.lang || dataLang || "";
326
- const { copied, isExpanded, setIsExpanded, isExpandable, preRef, handleCopy, shouldTruncate } = useCodeBlock(props);
327
- const LangIcon = langIconMap[lang];
407
+ const { copied, isExpanded, setIsExpanded, isExpandable, preRef, handleCopy, shouldTruncate, isHighlighted, effectiveHighlightedHtml, effectiveTitle, showCodeBlockFeedback, rated, handleRate, LangIcon } = useCodeBlock(props);
328
408
  return /* @__PURE__ */ jsxs(CodeBlock$1, {
329
409
  plain,
330
410
  className: props.className,
@@ -333,12 +413,15 @@ function CodeBlock(props) {
333
413
  children: [/* @__PURE__ */ jsx(CodeBlockGroup, { children: effectiveTitle && /* @__PURE__ */ jsxs(Fragment, { children: [LangIcon ? /* @__PURE__ */ jsx(LangIcon, { size: 14 }) : /* @__PURE__ */ jsx(File, {
334
414
  size: 14,
335
415
  className: "opacity-60"
336
- }), /* @__PURE__ */ jsx("span", { children: effectiveTitle })] }) }), /* @__PURE__ */ jsx("div", {
416
+ }), /* @__PURE__ */ jsx("span", { children: effectiveTitle })] }) }), /* @__PURE__ */ jsxs("div", {
337
417
  className: "flex items-center gap-1",
338
- children: !hideCopy && /* @__PURE__ */ jsx(CopyButton, {
418
+ children: [showCodeBlockFeedback && /* @__PURE__ */ jsx(CodeBlockFeedback, {
419
+ rated,
420
+ onRate: handleRate
421
+ }), !hideCopy && /* @__PURE__ */ jsx(CopyButton, {
339
422
  copied,
340
423
  handleCopy
341
- })
424
+ })]
342
425
  })]
343
426
  }), /* @__PURE__ */ jsxs(CodeBlockContent, {
344
427
  shouldTruncate,
@@ -521,4 +604,4 @@ const mdx_components_default = {
521
604
  };
522
605
 
523
606
  //#endregion
524
- export { copyToClipboard as n, mdx_components_default as t };
607
+ export { useCodeBlock as n, copyToClipboard as r, mdx_components_default as t };
@@ -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_image = require('./image-DCMxxidi.cjs');
6
+ const require_icons_dev = require('./icons-dev-BryEFkJu.cjs');
7
+ const require_image = require('./image-B9YA_oQ_.cjs');
8
8
  let react = require("react");
9
9
  let react_jsx_runtime = require("react/jsx-runtime");
10
10
  let react_aria_components = require("react-aria-components");
@@ -248,12 +248,66 @@ const copyToClipboard = async (text) => {
248
248
 
249
249
  //#endregion
250
250
  //#region src/client/components/mdx/use-code-block.ts
251
+ const langIconMap = {
252
+ ts: require_icons_dev.TypeScript,
253
+ tsx: require_icons_dev.React,
254
+ js: require_icons_dev.JavaScript,
255
+ jsx: require_icons_dev.React,
256
+ json: require_icons_dev.Json,
257
+ css: require_icons_dev.Css,
258
+ html: require_icons_dev.BracketsOrange,
259
+ md: require_icons_dev.Markdown,
260
+ mdx: require_icons_dev.Markdown,
261
+ bash: require_icons_dev.Shell,
262
+ sh: require_icons_dev.Shell,
263
+ yaml: require_icons_dev.Yaml,
264
+ yml: require_icons_dev.Yaml,
265
+ rs: require_icons_dev.Rust,
266
+ rust: require_icons_dev.Rust,
267
+ toml: require_icons_dev.BracketsRed,
268
+ csv: require_icons_dev.Csv
269
+ };
251
270
  function useCodeBlock(props) {
252
271
  const [copied, setCopied] = (0, react.useState)(false);
253
272
  const [isExpanded, setIsExpanded] = (0, react.useState)(false);
254
273
  const [isExpandable, setIsExpandable] = (0, react.useState)(false);
255
274
  const preRef = (0, react.useRef)(null);
256
275
  const timerRef = (0, react.useRef)(null);
276
+ const [rated, setRated] = (0, react.useState)(null);
277
+ const customConfig = require_icons_dev.useConfig().integrations?.feedback?.custom;
278
+ const showCodeBlockFeedback = !!(customConfig?.enabled && !props.plain);
279
+ const lang = props.lang || props["data-lang"] || "";
280
+ const isHighlighted = props["data-highlighted"] === "true" || typeof props.className === "string" && props.className.includes("shiki");
281
+ const rawHighlightedHtml = props.highlightedHtml || props["data-highlighted-html"];
282
+ const effectiveHighlightedHtml = typeof rawHighlightedHtml === "string" ? rawHighlightedHtml.replace(/<span class="line">\s*(?:<span[^>]*>\s*<\/span>)?\s*<\/span>\s*(<\/code>\s*<\/pre>)/g, "$1") : rawHighlightedHtml;
283
+ const effectiveTitle = props.title || props["data-title"];
284
+ const handleRate = (0, react.useCallback)(async (type) => {
285
+ if (rated) return;
286
+ setRated(type);
287
+ try {
288
+ const code = preRef.current?.textContent ?? "";
289
+ const snippet = code.trim().slice(0, 100) + (code.length > 100 ? "..." : "");
290
+ const blockId = `Code Block (${lang || "plain"}): \`${snippet}\``;
291
+ const endpoint = customConfig?.endpoint || "/api/feedback";
292
+ await fetch(endpoint, {
293
+ method: "POST",
294
+ headers: { "Content-Type": "application/json" },
295
+ body: JSON.stringify({
296
+ rating: type === "up" ? "good" : "bad",
297
+ comment: `Rated code block: ${type === "up" ? "Helpful" : "Unhelpful"}`,
298
+ path: window.location.pathname,
299
+ title: document.title,
300
+ blockId
301
+ })
302
+ });
303
+ } catch (err) {
304
+ console.error("Failed to submit code block feedback:", err);
305
+ }
306
+ }, [
307
+ rated,
308
+ lang,
309
+ customConfig?.endpoint
310
+ ]);
257
311
  (0, react.useEffect)(() => {
258
312
  return () => {
259
313
  if (timerRef.current) clearTimeout(timerRef.current);
@@ -272,6 +326,7 @@ function useCodeBlock(props) {
272
326
  const lines = (preRef.current?.textContent ?? "").trim().split("\n").length;
273
327
  setIsExpandable(lines > 6);
274
328
  }, [props.children, props.highlightedHtml]);
329
+ const LangIcon = langIconMap[lang] || require_icons_dev.File;
275
330
  return {
276
331
  copied,
277
332
  isExpanded,
@@ -279,31 +334,20 @@ function useCodeBlock(props) {
279
334
  isExpandable,
280
335
  preRef,
281
336
  handleCopy,
282
- shouldTruncate: isExpandable && !isExpanded
337
+ shouldTruncate: isExpandable && !isExpanded,
338
+ isHighlighted,
339
+ effectiveHighlightedHtml,
340
+ effectiveTitle,
341
+ lang,
342
+ showCodeBlockFeedback,
343
+ rated,
344
+ handleRate,
345
+ LangIcon
283
346
  };
284
347
  }
285
348
 
286
349
  //#endregion
287
350
  //#region src/client/components/mdx/code-block.tsx
288
- const langIconMap = {
289
- ts: require_icons_dev.TypeScript,
290
- tsx: require_icons_dev.React,
291
- js: require_icons_dev.JavaScript,
292
- jsx: require_icons_dev.React,
293
- json: require_icons_dev.Json,
294
- css: require_icons_dev.Css,
295
- html: require_icons_dev.BracketsOrange,
296
- md: require_icons_dev.Markdown,
297
- mdx: require_icons_dev.Markdown,
298
- bash: require_icons_dev.Shell,
299
- sh: require_icons_dev.Shell,
300
- yaml: require_icons_dev.Yaml,
301
- yml: require_icons_dev.Yaml,
302
- rs: require_icons_dev.Rust,
303
- rust: require_icons_dev.Rust,
304
- toml: require_icons_dev.BracketsRed,
305
- csv: require_icons_dev.Csv
306
- };
307
351
  const CopyButton = ({ copied, handleCopy }) => {
308
352
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_image.Tooltip, {
309
353
  content: copied ? "Copied!" : "Copy code",
@@ -315,16 +359,52 @@ const CopyButton = ({ copied, handleCopy }) => {
315
359
  })
316
360
  });
317
361
  };
362
+ const CodeBlockFeedback = ({ rated, onRate }) => {
363
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
364
+ className: "flex items-center gap-0.5 border-r border-subtle pr-1.5 mr-1",
365
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_image.Tooltip, {
366
+ content: rated === "up" ? "Helpful!" : "This code is helpful",
367
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_aria_components.Button, {
368
+ onPress: () => onRate("up"),
369
+ disabled: rated !== null,
370
+ className: require_icons_dev.cn("grid place-items-center size-8 bg-transparent outline-none cursor-pointer transition-all duration-200 hover:scale-110 active:scale-95 [&>svg]:size-4 [&>svg]:stroke-2 z-10", rated === "up" ? "text-emerald-500 dark:text-emerald-400" : rated === "down" ? "opacity-30 cursor-not-allowed text-muted" : "text-muted hover:text-body"),
371
+ "aria-label": "Mark as helpful",
372
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
373
+ xmlns: "http://www.w3.org/2000/svg",
374
+ viewBox: "0 0 24 24",
375
+ fill: "none",
376
+ stroke: "currentColor",
377
+ strokeWidth: "2",
378
+ strokeLinecap: "round",
379
+ strokeLinejoin: "round",
380
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3" })
381
+ })
382
+ })
383
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_image.Tooltip, {
384
+ content: rated === "down" ? "Unhelpful" : "This code is unhelpful",
385
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_aria_components.Button, {
386
+ onPress: () => onRate("down"),
387
+ disabled: rated !== null,
388
+ className: require_icons_dev.cn("grid place-items-center size-8 bg-transparent outline-none cursor-pointer transition-all duration-200 hover:scale-110 active:scale-95 [&>svg]:size-4 [&>svg]:stroke-2 z-10", rated === "down" ? "text-rose-500 dark:text-rose-400" : rated === "up" ? "opacity-30 cursor-not-allowed text-muted" : "text-muted hover:text-body"),
389
+ "aria-label": "Mark as unhelpful",
390
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
391
+ xmlns: "http://www.w3.org/2000/svg",
392
+ viewBox: "0 0 24 24",
393
+ fill: "none",
394
+ stroke: "currentColor",
395
+ strokeWidth: "2",
396
+ strokeLinecap: "round",
397
+ strokeLinejoin: "round",
398
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h3a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2h-3" })
399
+ })
400
+ })
401
+ })]
402
+ });
403
+ };
318
404
  function CodeBlock(props) {
319
405
  const { children, hideCopy = false, highlightedHtml, "data-highlighted-html": dataHighlightedHtml, title, "data-title": dataTitle, "data-lang": dataLang, plain = false, lineNumbers, showLineNumbers, wordWrap, "word-wrap": wordWrapHyphen, metastring, ...rest } = props;
320
406
  const { className: shikiClassName, ...cleanRest } = rest;
321
- const isHighlighted = props["data-highlighted"] === "true" || typeof shikiClassName === "string" && shikiClassName.includes("shiki");
322
- const rawHighlightedHtml = highlightedHtml || dataHighlightedHtml;
323
- const effectiveHighlightedHtml = typeof rawHighlightedHtml === "string" ? rawHighlightedHtml.replace(/<span class="line">\s*(?:<span[^>]*>\s*<\/span>)?\s*<\/span>\s*(<\/code>\s*<\/pre>)/g, "$1") : rawHighlightedHtml;
324
- const effectiveTitle = title || dataTitle;
325
- const lang = props.lang || dataLang || "";
326
- const { copied, isExpanded, setIsExpanded, isExpandable, preRef, handleCopy, shouldTruncate } = useCodeBlock(props);
327
- const LangIcon = langIconMap[lang];
407
+ const { copied, isExpanded, setIsExpanded, isExpandable, preRef, handleCopy, shouldTruncate, isHighlighted, effectiveHighlightedHtml, effectiveTitle, showCodeBlockFeedback, rated, handleRate, LangIcon } = useCodeBlock(props);
328
408
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_image.CodeBlock, {
329
409
  plain,
330
410
  className: props.className,
@@ -333,12 +413,15 @@ function CodeBlock(props) {
333
413
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_image.CodeBlockGroup, { children: effectiveTitle && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [LangIcon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LangIcon, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons_dev.File, {
334
414
  size: 14,
335
415
  className: "opacity-60"
336
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: effectiveTitle })] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
416
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: effectiveTitle })] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
337
417
  className: "flex items-center gap-1",
338
- children: !hideCopy && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CopyButton, {
418
+ children: [showCodeBlockFeedback && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CodeBlockFeedback, {
419
+ rated,
420
+ onRate: handleRate
421
+ }), !hideCopy && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CopyButton, {
339
422
  copied,
340
423
  handleCopy
341
- })
424
+ })]
342
425
  })]
343
426
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_image.CodeBlockContent, {
344
427
  shouldTruncate,
@@ -532,4 +615,10 @@ Object.defineProperty(exports, 'mdx_components_default', {
532
615
  get: function () {
533
616
  return mdx_components_default;
534
617
  }
618
+ });
619
+ Object.defineProperty(exports, 'useCodeBlock', {
620
+ enumerable: true,
621
+ get: function () {
622
+ return useCodeBlock;
623
+ }
535
624
  });
@@ -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-CU-zTemE.cjs`);let t=require(`node:path`);t=e.t(t);let n=require(`fdir`),r=require(`@bdocs/dui`),i=require(`node:fs/promises`);i=e.t(i);async function a(e){let a={};try{let o=(await new n.fdir().withFullPaths().filter(e=>e.endsWith(`meta.json`)).crawl(e).withPromise()).filter(e=>{let n=t.default.basename(e);return n===`meta.json`||n===`_meta.json`}),s=await Promise.allSettled(o.map(async n=>{let r=await i.default.readFile(n,`utf-8`),a=t.default.relative(e,t.default.dirname(n)).replace(/\\/g,`/`);return{key:a===``?`.`:a,content:JSON.parse(r)}}));for(let e of s)e.status===`fulfilled`?a[e.value.key]=e.value.content:(0,r.warn)(`Failed to read meta.json:`,e.reason)}catch(e){(0,r.error)(`Error loading directory metadata:`,e)}return a}exports.loadDirectoryMeta=a;
6
+ const e=require(`./chunk-Ds5LZdWN.cjs`);let t=require(`node:path`);t=e.n(t);let n=require(`@bdocs/dui`),r=require(`fdir`),i=require(`node:fs/promises`);i=e.n(i);async function a(e){let a={};try{let o=(await new r.fdir().withFullPaths().filter(e=>e.endsWith(`meta.json`)).crawl(e).withPromise()).filter(e=>{let n=t.default.basename(e);return n===`meta.json`||n===`_meta.json`}),s=await Promise.allSettled(o.map(async n=>{let r=await i.default.readFile(n,`utf-8`),a=t.default.relative(e,t.default.dirname(n)).replace(/\\/g,`/`);return{key:a===``?`.`:a,content:JSON.parse(r)}}));for(let e of s)e.status===`fulfilled`?a[e.value.key]=e.value.content:(0,n.warn)(`Failed to read meta.json:`,e.reason)}catch(e){(0,n.error)(`Error loading directory metadata:`,e)}return a}exports.loadDirectoryMeta=a;
@@ -3,4 +3,4 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import e from"node:path";import{fdir as t}from"fdir";import{error as n,warn as r}from"@bdocs/dui";import i from"node:fs/promises";async function a(a){let o={};try{let n=(await new t().withFullPaths().filter(e=>e.endsWith(`meta.json`)).crawl(a).withPromise()).filter(t=>{let n=e.basename(t);return n===`meta.json`||n===`_meta.json`}),s=await Promise.allSettled(n.map(async t=>{let n=await i.readFile(t,`utf-8`),r=e.relative(a,e.dirname(t)).replace(/\\/g,`/`);return{key:r===``?`.`:r,content:JSON.parse(n)}}));for(let e of s)e.status===`fulfilled`?o[e.value.key]=e.value.content:r(`Failed to read meta.json:`,e.reason)}catch(e){n(`Error loading directory metadata:`,e)}return o}export{a as loadDirectoryMeta};
6
+ import e from"node:path";import{error as t,warn as n}from"@bdocs/dui";import{fdir as r}from"fdir";import i from"node:fs/promises";async function a(a){let o={};try{let t=(await new r().withFullPaths().filter(e=>e.endsWith(`meta.json`)).crawl(a).withPromise()).filter(t=>{let n=e.basename(t);return n===`meta.json`||n===`_meta.json`}),s=await Promise.allSettled(t.map(async t=>{let n=await i.readFile(t,`utf-8`),r=e.relative(a,e.dirname(t)).replace(/\\/g,`/`);return{key:r===``?`.`:r,content:JSON.parse(n)}}));for(let e of s)e.status===`fulfilled`?o[e.value.key]=e.value.content:n(`Failed to read meta.json:`,e.reason)}catch(e){t(`Error loading directory metadata:`,e)}return o}export{a as loadDirectoryMeta};
@@ -4,6 +4,12 @@
4
4
  * Copyright (c) 2026 Jesus Alcala
5
5
  * Licensed under the MIT License.
6
6
  */
7
- const e=require(`../chunk-CU-zTemE.cjs`),t=require(`../doctor-VBPlQf7d.cjs`),n=require(`../node-JM9bx0mO.cjs`);let r=require(`vite`),i=require(`node:path`);i=e.t(i);let a=require(`node:fs`);a=e.t(a);let o=require(`@bdocs/dui`),s=require(`node:fs/promises`);s=e.t(s);let c=require(`@bdocs/ssg/node`),l=require(`cac`);l=e.t(l);function u(e){let t=e;for(;t&&t!==i.default.dirname(t);){if(a.default.existsSync(i.default.join(t,`.git`))||a.default.existsSync(i.default.join(t,`pnpm-workspace.yaml`)))return t;t=i.default.dirname(t)}t=e;let n=e;for(;t&&t!==i.default.dirname(t);)a.default.existsSync(i.default.join(t,`package.json`))&&(n=t),t=i.default.dirname(t);return n}let d=u(process.cwd());function f(e){if(!e)return;let t;if(typeof e==`string`)t=e;else if(e instanceof URL){if(e.protocol!==`file:`)return;t=e.pathname}else if(Buffer.isBuffer(e))t=e.toString();else return;let n=i.default.resolve(d,t),r=i.default.relative(d,n),a=r.startsWith(`..`)||i.default.isAbsolute(r),o=n.split(i.default.sep),s=o.some(e=>e.startsWith(`.env`)),c=o.some((e,t)=>{if(e===`node_modules`){let e=o[t+1];return!e||!e.startsWith(`.`)}return!1});if(a||s||c)throw Error(`[Boltdocs Security] Write/delete operation blocked on path: "${n}". Modifications are restricted to the project root, and cannot access .env or non-cache node_modules folders.`)}function p(e){return e==null?!1:typeof e==`number`?e!==0:typeof e==`string`?e.includes(`w`)||e.includes(`a`)||e.includes(`+`):!0}function m(){let e=a.default.writeFile;a.default.writeFile=function(t,...n){try{f(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return e.call(a.default,t,...n)};let t=a.default.writeFileSync;a.default.writeFileSync=function(e,...n){return f(e),t.call(a.default,e,...n)};let n=a.default.rm;a.default.rm=function(e,...t){try{f(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return n.call(a.default,e,...t)};let r=a.default.rmSync;a.default.rmSync=function(e,...t){return f(e),r.call(a.default,e,...t)};let i=a.default.unlink;a.default.unlink=function(e,...t){try{f(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return i.call(a.default,e,...t)};let o=a.default.unlinkSync;a.default.unlinkSync=function(e,...t){return f(e),o.call(a.default,e,...t)};let c=a.default.mkdir;a.default.mkdir=function(e,...t){try{f(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return c.call(a.default,e,...t)};let l=a.default.mkdirSync;a.default.mkdirSync=function(e,...t){return f(e),l.call(a.default,e,...t)};let u=a.default.rmdir;a.default.rmdir=function(e,...t){try{f(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return u.call(a.default,e,...t)};let d=a.default.rmdirSync;a.default.rmdirSync=function(e,...t){return f(e),d.call(a.default,e,...t)};let m=a.default.appendFile;a.default.appendFile=function(e,...t){try{f(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return m.call(a.default,e,...t)};let h=a.default.appendFileSync;a.default.appendFileSync=function(e,...t){return f(e),h.call(a.default,e,...t)};let g=a.default.copyFile;a.default.copyFile=function(e,t,...n){try{f(e),f(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return g.call(a.default,e,t,...n)};let _=a.default.copyFileSync;a.default.copyFileSync=function(e,t,...n){return f(e),f(t),_.call(a.default,e,t,...n)};let v=a.default.rename;a.default.rename=function(e,t,...n){try{f(e),f(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return v.call(a.default,e,t,...n)};let y=a.default.renameSync;a.default.renameSync=function(e,t,...n){return f(e),f(t),y.call(a.default,e,t,...n)};let b=a.default.createWriteStream;a.default.createWriteStream=function(e,...t){return f(e),b.call(a.default,e,...t)};let x=a.default.open;a.default.open=function(e,t,...n){if(p(typeof t==`function`?void 0:t))try{f(e)}catch(e){let r=n[n.length-1],i=typeof t==`function`?t:typeof r==`function`?r:void 0;if(i){process.nextTick(()=>i(e));return}throw e}return x.call(a.default,e,t,...n)};let S=a.default.openSync;a.default.openSync=function(e,t,...n){return p(t)&&f(e),S.call(a.default,e,t,...n)};let C=e=>{if(!e)return;let t=e.writeFile;t&&(e.writeFile=async function(n,...r){return f(n),t.call(e,n,...r)});let n=e.rm;n&&(e.rm=async function(t,...r){return f(t),n.call(e,t,...r)});let r=e.mkdir;r&&(e.mkdir=async function(t,...n){return f(t),r.call(e,t,...n)});let i=e.rmdir;i&&(e.rmdir=async function(t,...n){return f(t),i.call(e,t,...n)});let a=e.unlink;a&&(e.unlink=async function(t,...n){return f(t),a.call(e,t,...n)});let o=e.appendFile;o&&(e.appendFile=async function(t,...n){return f(t),o.call(e,t,...n)});let s=e.copyFile;s&&(e.copyFile=async function(t,n,...r){return f(t),f(n),s.call(e,t,n,...r)});let c=e.rename;c&&(e.rename=async function(t,n,...r){return f(t),f(n),c.call(e,t,n,...r)});let l=e.open;l&&(e.open=async function(t,n,...r){return p(n)&&f(t),l.call(e,t,n,...r)})};C(a.default.promises),C(s.default)}let h=!1;async function g(e=process.cwd(),r={}){if(!h){h=!0,t.d();try{n.S(await t.p(i.default.resolve(e,`docs`),e),e)}catch{}try{let t=await n.n(e,`development`);t.logLevel=`warn`,t.clearScreen=!1,r.port!==void 0&&(t.server=t.server||{},t.server.port=Number(r.port)),r.host!==void 0&&(t.server=t.server||{},t.server.host=r.host);let i=await(0,c.createServer)(t);await i.listen();let a=i.resolvedUrls;console.log((0,o.devServer)(a?.local?.[0]??`http://localhost:${r.port??5173}`,a?.network?.[0]??null)),i.bindCLIShortcuts({print:!1})}catch(e){(0,o.error)(`Failed to start dev server:`,e),process.exit(1)}}}async function _(e=process.cwd()){t.d();try{let t=await n.x().run({root:e,timing:{}});t.success||((0,o.error)(`Build failed at step "${t.failedStep}":`,t.error),process.exit(1)),(0,o.success)(`SSG build completed successfully in ${Math.round(t.timing.total)}ms!`),process.exit(0)}catch(e){(0,o.error)(`Build failed:`,e),process.exit(1)}}async function v(e=process.cwd(),t={}){try{let i=await n.n(e,`production`);i.logLevel=`warn`,i.clearScreen=!1,t.port!==void 0&&(i.preview=i.preview||{},i.preview.port=Number(t.port)),t.host!==void 0&&(i.preview=i.preview||{},i.preview.host=t.host);let a=(await(0,r.preview)(i)).resolvedUrls;console.log((0,o.previewServer)(a?.local?.[0]??`http://localhost:${t.port??4173}`,a?.network?.[0]??null))}catch(e){(0,o.error)(`Failed to start preview server:`,e),process.exit(1)}}function y(e){let t=[];if(!a.default.existsSync(e))return t;try{let n=a.default.readdirSync(e);for(let r of n){let n=i.default.join(e,r);a.default.statSync(n).isDirectory()?r!==`node_modules`&&r!==`.git`&&r!==`dist`&&r!==`coverage`&&t.push(...y(n)):/\.(js|mjs|cjs|ts|tsx|jsx)$/.test(r)&&t.push(n)}}catch{}return t}async function b(e=process.cwd()){(0,o.info)(`Starting static security audit of Boltdocs plugins...`);let n;try{n=await t.p(i.default.resolve(e,`docs`),e)}catch(e){(0,o.error)(`Failed to load Boltdocs configuration for audit:`,e),process.exit(1)}let r=n.plugins||[];if(r.length===0){(0,o.success)(`No plugins configured. Nothing to audit.`);return}let s=[];for(let t of r){if(!t.name)continue;let n=null;try{let{createRequire:r}=await import(`node:module`),a=r(i.default.resolve(e,`package.json`)).resolve(`${t.name}/package.json`);n=i.default.dirname(a)}catch{let r=i.default.resolve(e,`node_modules`,t.name);a.default.existsSync(r)&&(n=r)}if(!n){s.push({name:o.colors.cyan(t.name),status:o.colors.red(`❓ Unresolved`),details:`Could not locate plugin files in node_modules.`});continue}let r=y(n),c=[];for(let e of r)try{let t=a.default.readFileSync(e,`utf-8`);t.includes(`fetch(`)&&c.push(`fetch`),t.includes(`axios`)&&c.push(`axios`),t.includes(`http.request`)&&c.push(`http.request`),t.includes(`https.request`)&&c.push(`https.request`),t.includes(`process.env`)&&c.push(`process.env`)}catch{}let l=Array.from(new Set(c));l.length>0?s.push({name:o.colors.cyan(t.name),status:o.colors.yellow(`⚠️ Warning`),details:`Contains network/env accesses: ${o.colors.bold(l.join(`, `))}. Ensure you trust the author.`}):s.push({name:o.colors.cyan(t.name),status:o.colors.green(`✅ Clean`),details:`No external network calls or env accesses detected.`})}let c=[`Plugin`,`Status`,`Audit Notes`],l=s.map(e=>[e.name,e.status,e.details]);console.log(`
7
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../chunk-Ds5LZdWN.cjs`),t=require(`../node-Dj3-2YYP.cjs`),n=require(`../config-BqZUYono.cjs`),r=require(`../cache-B19MLTpN.cjs`);let i=require(`node:path`);i=e.n(i);let a=require(`node:fs`);a=e.n(a);let o=require(`@bdocs/dui`),s=require(`vite`),c=require(`node:module`),l=require(`node:fs/promises`);l=e.n(l);let u=require(`@bdocs/ssg/node`),d=require(`cac`);d=e.n(d);let f=require(`node:os`);f=e.n(f);let p=require(`node:url`);function m(e){let t=e;for(;t&&t!==i.default.dirname(t);){if(a.default.existsSync(i.default.join(t,`.git`))||a.default.existsSync(i.default.join(t,`pnpm-workspace.yaml`)))return t;t=i.default.dirname(t)}t=e;let n=e;for(;t&&t!==i.default.dirname(t);)a.default.existsSync(i.default.join(t,`package.json`))&&(n=t),t=i.default.dirname(t);return n}let h=m(process.cwd());function g(e){if(!e)return;let t;if(typeof e==`string`)t=e;else if(e instanceof URL){if(e.protocol!==`file:`)return;t=e.pathname}else if(Buffer.isBuffer(e))t=e.toString();else return;let n=i.default.resolve(h,t),r=i.default.relative(h,n),a=r.startsWith(`..`)||i.default.isAbsolute(r),o=n.split(i.default.sep),s=o.some(e=>e.startsWith(`.env`)),c=o.some((e,t)=>{if(e===`node_modules`){let e=o[t+1];return!e||!e.startsWith(`.`)}return!1});if(a||s||c)throw Error(`[Boltdocs Security] Write/delete operation blocked on path: "${n}". Modifications are restricted to the project root, and cannot access .env or non-cache node_modules folders.`)}function _(e){return e==null?!1:typeof e==`number`?e!==0:typeof e==`string`?e.includes(`w`)||e.includes(`a`)||e.includes(`+`):!0}function v(){let e=a.default.writeFile;a.default.writeFile=((t,...n)=>{try{g(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return e.call(a.default,t,...n)});let t=a.default.writeFileSync;a.default.writeFileSync=(e,...n)=>(g(e),t.call(a.default,e,...n));let n=a.default.rm;a.default.rm=((e,...t)=>{try{g(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return n.call(a.default,e,...t)});let r=a.default.rmSync;a.default.rmSync=(e,...t)=>(g(e),r.call(a.default,e,...t));let i=a.default.unlink;a.default.unlink=((e,...t)=>{try{g(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return i.call(a.default,e,...t)});let o=a.default.unlinkSync;a.default.unlinkSync=(e,...t)=>(g(e),o.call(a.default,e,...t));let s=a.default.mkdir;a.default.mkdir=((e,...t)=>{try{g(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return s.call(a.default,e,...t)});let c=a.default.mkdirSync;a.default.mkdirSync=(e,...t)=>(g(e),c.call(a.default,e,...t));let u=a.default.rmdir;a.default.rmdir=((e,...t)=>{try{g(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return u.call(a.default,e,...t)});let d=a.default.rmdirSync;a.default.rmdirSync=(e,...t)=>(g(e),d.call(a.default,e,...t));let f=a.default.appendFile;a.default.appendFile=((e,...t)=>{try{g(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return f.call(a.default,e,...t)});let p=a.default.appendFileSync;a.default.appendFileSync=(e,...t)=>(g(e),p.call(a.default,e,...t));let m=a.default.copyFile;a.default.copyFile=((e,t,...n)=>{try{g(e),g(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return m.call(a.default,e,t,...n)});let h=a.default.copyFileSync;a.default.copyFileSync=(e,t,...n)=>(g(e),g(t),h.call(a.default,e,t,...n));let v=a.default.rename;a.default.rename=((e,t,...n)=>{try{g(e),g(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return v.call(a.default,e,t,...n)});let y=a.default.renameSync;a.default.renameSync=(e,t,...n)=>(g(e),g(t),y.call(a.default,e,t,...n));let b=a.default.createWriteStream;a.default.createWriteStream=(e,...t)=>(g(e),b.call(a.default,e,...t));let x=a.default.open;a.default.open=((e,t,...n)=>{if(_(typeof t==`function`?void 0:t))try{g(e)}catch(e){let r=n[n.length-1],i=typeof t==`function`?t:typeof r==`function`?r:void 0;if(i){process.nextTick(()=>i(e));return}throw e}return x.call(a.default,e,t,...n)});let S=a.default.openSync;a.default.openSync=(e,t,...n)=>(_(t)&&g(e),S.call(a.default,e,t,...n));let C=e=>{if(!e)return;let t=e.writeFile;t&&(e.writeFile=async(n,...r)=>(g(n),t.call(e,n,...r)));let n=e.rm;n&&(e.rm=async(t,...r)=>(g(t),n.call(e,t,...r)));let r=e.mkdir;r&&(e.mkdir=async(t,...n)=>(g(t),r.call(e,t,...n)));let i=e.rmdir;i&&(e.rmdir=async(t,...n)=>(g(t),i.call(e,t,...n)));let a=e.unlink;a&&(e.unlink=async(t,...n)=>(g(t),a.call(e,t,...n)));let o=e.appendFile;o&&(e.appendFile=async(t,...n)=>(g(t),o.call(e,t,...n)));let s=e.copyFile;s&&(e.copyFile=async(t,n,...r)=>(g(t),g(n),s.call(e,t,n,...r)));let c=e.rename;c&&(e.rename=async(t,n,...r)=>(g(t),g(n),c.call(e,t,n,...r)));let l=e.open;l&&(e.open=async(t,n,...r)=>(_(n)&&g(t),l.call(e,t,n,...r)))};C(a.default.promises),C(l.default)}function y(e,t){let n=t?` ${o.colors.green(`➜`)} ${o.colors.green(`Network:`)} ${o.colors.cyan(t)}`:` ${o.colors.green(`➜`)} ${o.colors.green(`Network:`)} ${o.colors.gray(`use --host to expose`)}`;return`
8
+ `+(0,o.double)([` ${o.colors.green(`➜`)} ${o.colors.green(`Local:`)} ${o.colors.cyan(e)}`,n,``,` ${o.colors.dim(`press h + enter for help`)}`],{title:`boltdocs dev server`})+`
9
+ `}function b(e,t){let n=t?` ${o.colors.green(`➜`)} ${o.colors.green(`Network:`)} ${o.colors.cyan(t)}`:` ${o.colors.green(`➜`)} ${o.colors.green(`Network:`)} ${o.colors.gray(`use --host to expose`)}`;return`
10
+ `+(0,o.double)([` ${o.colors.green(`➜`)} ${o.colors.green(`Local:`)} ${o.colors.cyan(e)}`,n],{title:`boltdocs preview server`})+`
11
+ `}function x(e,t){return`
12
+ `+(0,o.double)([(0,o.padCenter)(`🚀 Update available!`,50),``,` ${o.colors.dim(`Current:`)} ${o.colors.red(e)} ${o.colors.gray(`→`)} ${o.colors.green(t)}`,``,` ${o.colors.dim(`Run:`)} ${o.colors.bold(`npm install boltdocs@latest`)}`])+`
13
+ `}const S=(0,c.createRequire)(require(`url`).pathToFileURL(__filename).href);function C(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 w(){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 T(){try{let e=(0,p.fileURLToPath)(require(`url`).pathToFileURL(__filename).href),t=i.default.dirname(e);for(let e=0;e<5;e++){let e=i.default.join(t,`package.json`);if(a.default.existsSync(e)){let t=JSON.parse(a.default.readFileSync(e,`utf-8`));if(t.name===`boltdocs`)return t.version}t=i.default.dirname(t)}}catch{}try{return S(`boltdocs/package.json`).version}catch{return`0.0.0`}}async function E(){let e=``;try{e=i.default.join(f.default.homedir(),`.boltdocs`,`update-check.json`)}catch{return}let t=0;try{if(a.default.existsSync(e)){let n=JSON.parse(a.default.readFileSync(e,`utf-8`));t=Number(n.lastCheck)||0}}catch{}let n=Date.now();if(n-t<864e5)return;try{a.default.mkdirSync(i.default.dirname(e),{recursive:!0}),a.default.writeFileSync(e,JSON.stringify({lastCheck:n}),`utf-8`)}catch{}let r=await T();if(r===`0.0.0`)return;let o=await w();o&&C(o,r)&&console.log(x(r,o))}let D=!1;async function O(e=process.cwd(),r={}){if(D)return;D=!0,E();let a;try{a=await n.n(i.default.resolve(e,`docs`),e),t.w(a,e)}catch{}try{let n=await t.n(e,`development`,a);n.logLevel=`warn`,n.clearScreen=!1,r.port!==void 0&&(n.server=n.server||{},n.server.port=Number(r.port)),r.host!==void 0&&(n.server=n.server||{},n.server.host=r.host),r.force&&(n.optimizeDeps=n.optimizeDeps||{},n.optimizeDeps.force=!0);let i=await(0,u.createServer)(n);await i.listen();let o=i.resolvedUrls;console.log(y(o?.local?.[0]??`http://localhost:${r.port??5173}`,o?.network?.[0]??null)),i.bindCLIShortcuts({print:!1})}catch(e){(0,o.error)(`Failed to start dev server:`,e),process.exit(1)}}async function k(e=process.cwd()){E();try{let n=await t.S().run({root:e,timing:{}});n.success||((0,o.error)(`Build failed at step "${n.failedStep}":`,n.error),await r.a(),process.exit(1)),console.log((0,o.double)([`SSG build completed in ${(Math.round(n.timing.total)/1e3).toFixed(1)}s`,``,`${o.colors.cyan(`boltdocs`)} documentation is ready at ${o.colors.green(`dist/`)}`])),await r.a(),process.exit(0)}catch(e){(0,o.error)(`Build failed:`,e),await r.a(),process.exit(1)}}async function A(e=process.cwd(),n={}){try{let r=await t.n(e,`production`);r.logLevel=`warn`,r.clearScreen=!1,n.port!==void 0&&(r.preview=r.preview||{},r.preview.port=Number(n.port)),n.host!==void 0&&(r.preview=r.preview||{},r.preview.host=n.host);let i=(await(0,s.preview)(r)).resolvedUrls;console.log(b(i?.local?.[0]??`http://localhost:${n.port??4173}`,i?.network?.[0]??null))}catch(e){(0,o.error)(`Failed to start preview server:`,e),process.exit(1)}}function j(e){let t=[];if(!a.default.existsSync(e))return t;try{let n=a.default.readdirSync(e);for(let r of n){let n=i.default.join(e,r);a.default.statSync(n).isDirectory()?r!==`node_modules`&&r!==`.git`&&r!==`dist`&&r!==`coverage`&&t.push(...j(n)):/\.(js|mjs|cjs|ts|tsx|jsx)$/.test(r)&&t.push(n)}}catch{}return t}async function M(e=process.cwd()){(0,o.info)(`Starting static security audit of Boltdocs plugins...`);let t;try{t=await n.n(i.default.resolve(e,`docs`),e)}catch(e){(0,o.error)(`Failed to load Boltdocs configuration for audit:`,e),process.exit(1)}let r=t.plugins||[];if(r.length===0){(0,o.success)(`No plugins configured. Nothing to audit.`);return}let s=[];for(let t of r){if(!t.name)continue;let n=null;try{let{createRequire:r}=await import(`node:module`),a=r(i.default.resolve(e,`package.json`)).resolve(`${t.name}/package.json`);n=i.default.dirname(a)}catch{let r=i.default.resolve(e,`node_modules`,t.name);a.default.existsSync(r)&&(n=r)}if(!n){s.push({name:o.colors.cyan(t.name),status:o.colors.red(`❓ Unresolved`),details:`Could not locate plugin files in node_modules.`});continue}let r=j(n),c=[];for(let e of r)try{let t=a.default.readFileSync(e,`utf-8`);t.includes(`fetch(`)&&c.push(`fetch`),t.includes(`axios`)&&c.push(`axios`),t.includes(`http.request`)&&c.push(`http.request`),t.includes(`https.request`)&&c.push(`https.request`),t.includes(`process.env`)&&c.push(`process.env`)}catch{}let l=Array.from(new Set(c));l.length>0?s.push({name:o.colors.cyan(t.name),status:o.colors.yellow(`⚠️ Warning`),details:`Contains network/env accesses: ${o.colors.bold(l.join(`, `))}. Ensure you trust the author.`}):s.push({name:o.colors.cyan(t.name),status:o.colors.green(`✅ Clean`),details:`No external network calls or env accesses detected.`})}let c=[`Plugin`,`Status`,`Audit Notes`],l=s.map(e=>[e.name,e.status,e.details]);console.log(`
8
14
  `+(0,o.table)(c,l)+`
9
- `),s.some(e=>e.status.includes(`Warning`))?(0,o.warn)(`⚠️ One or more plugins have security warnings. Review the flags above.`):(0,o.success)(`✓ All plugins passed the static security check!`)}process.noDeprecation=!0,m(),(0,o.configure)({prefix:`boltdocs`,devServerTitle:`boltdocs dev server`,previewServerTitle:`boltdocs preview server`,updateCommand:`pnpm add boltdocs@latest`});const x=(0,l.default)(`boltdocs`);x.command(`dev [root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).action(g),x.command(`[root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).action(g),x.command(`build [root]`,`Build for production`).action(_),x.command(`preview [root]`,`Preview production build`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).action(v),x.command(`audit [root]`,`Audit configured plugins for security warnings`).action(b),x.command(`doctor [root]`,`Check the health of your documentation`).option(`--fix`,`Automatically fix broken internal links and sync translations`).option(`--check-external`,`Verify external links (slower)`).option(`--init`,`Initialize doctor.json with default configuration`).option(`--budget`,`Check build performance against configured budgets`).action(async(e,t)=>{let{doctorAction:n}=await Promise.resolve().then(()=>require(`../doctor-DT4jh07O.cjs`));await n(e,t)}),x.command(`generate-changelog <file>`,`Generate changelog documentation from CHANGELOG.md`).option(`-o, --output <path>`,`Output folder (default: docs/changelog)`,{default:`docs/changelog`}).option(`-t, --title <text>`,`Title for changelog pages`,{default:`Changelog`}).option(`--infer-tab`,`Infer tab from folder name (default: true)`,{default:!0}).option(`-l, --limit <number>`,`Limit number of versions to generate`).action(async(e,t)=>{let{generateChangelog:n}=await Promise.resolve().then(()=>require(`../generator-CC2yHzhZ.cjs`));await n(e,{output:t.output,title:t.title,inferTab:t.inferTab,limit:t.limit?parseInt(String(t.limit),10):void 0})}),x.help(),x.version(`2.0.0`),x.parse();
15
+ `),s.some(e=>e.status.includes(`Warning`))?(0,o.warn)(`⚠️ One or more plugins have security warnings. Review the flags above.`):(0,o.success)(`✓ All plugins passed the static security check!`)}const{emitWarning:N}=process;process.emitWarning=function(e,...t){if(!(e&&typeof e==`object`&&e.code===`DEP0205`)&&!(typeof e==`string`&&t.includes(`DEP0205`)))return Reflect.apply(N,process,[e,...t])},v(),(0,o.configure)({prefix:`boltdocs`});const P=(0,d.default)(`boltdocs`);P.command(`dev [root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).option(`--force`,`Force Vite to re-optimize dependencies`).action(O),P.command(`[root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).option(`--force`,`Force Vite to re-optimize dependencies`).action(O),P.command(`build [root]`,`Build for production`).action(k),P.command(`preview [root]`,`Preview production build`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).action(A),P.command(`audit [root]`,`Audit configured plugins for security warnings`).action(M),P.command(`doctor [root]`,`Check the health of your documentation`).option(`--fix`,`Automatically fix broken internal links and sync translations`).option(`--check-external`,`Verify external links (slower)`).option(`--init`,`Initialize doctor.json with default configuration`).option(`--budget`,`Check build performance against configured budgets`).action(async(e,t)=>{let{doctorAction:n}=await Promise.resolve().then(()=>require(`../doctor-D8fl3Sbg.cjs`));await n(e,t)}),P.command(`generate-changelog <file>`,`Generate changelog documentation from CHANGELOG.md`).option(`-o, --output <path>`,`Output folder (default: docs/changelog)`,{default:`docs/changelog`}).option(`-t, --title <text>`,`Title for changelog pages`,{default:`Changelog`}).option(`--infer-tab`,`Infer tab from folder name (default: true)`,{default:!0}).option(`-l, --limit <number>`,`Limit number of versions to generate`).action(async(e,t)=>{let{generateChangelog:n}=await Promise.resolve().then(()=>require(`../generator-DtUU3Cfk.cjs`));await n(e,{output:t.output,title:t.title,inferTab:t.inferTab,limit:t.limit?parseInt(String(t.limit),10):void 0})}),P.help(),P.version(`2.0.0`),P.parse(),exports.t=E;
@@ -4,6 +4,12 @@
4
4
  * Copyright (c) 2026 Jesus Alcala
5
5
  * Licensed under the MIT License.
6
6
  */
7
- import{C as e,n as t,w as n}from"../node-q-Y2mdLX.mjs";import{d as r,p as i}from"../doctor-Dnv77Lfx.mjs";import{preview as a}from"vite";import o from"node:path";import s from"node:fs";import{colors as c,configure as l,devServer as u,error as d,info as f,previewServer as p,success as m,table as h,warn as g}from"@bdocs/dui";import _ from"node:fs/promises";import{createServer as v}from"@bdocs/ssg/node";import y from"cac";function b(e){let t=e;for(;t&&t!==o.dirname(t);){if(s.existsSync(o.join(t,`.git`))||s.existsSync(o.join(t,`pnpm-workspace.yaml`)))return t;t=o.dirname(t)}t=e;let n=e;for(;t&&t!==o.dirname(t);)s.existsSync(o.join(t,`package.json`))&&(n=t),t=o.dirname(t);return n}let x=b(process.cwd());function S(e){if(!e)return;let t;if(typeof e==`string`)t=e;else if(e instanceof URL){if(e.protocol!==`file:`)return;t=e.pathname}else if(Buffer.isBuffer(e))t=e.toString();else return;let n=o.resolve(x,t),r=o.relative(x,n),i=r.startsWith(`..`)||o.isAbsolute(r),a=n.split(o.sep),s=a.some(e=>e.startsWith(`.env`)),c=a.some((e,t)=>{if(e===`node_modules`){let e=a[t+1];return!e||!e.startsWith(`.`)}return!1});if(i||s||c)throw Error(`[Boltdocs Security] Write/delete operation blocked on path: "${n}". Modifications are restricted to the project root, and cannot access .env or non-cache node_modules folders.`)}function C(e){return e==null?!1:typeof e==`number`?e!==0:typeof e==`string`?e.includes(`w`)||e.includes(`a`)||e.includes(`+`):!0}function w(){let e=s.writeFile;s.writeFile=function(t,...n){try{S(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return e.call(s,t,...n)};let t=s.writeFileSync;s.writeFileSync=function(e,...n){return S(e),t.call(s,e,...n)};let n=s.rm;s.rm=function(e,...t){try{S(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return n.call(s,e,...t)};let r=s.rmSync;s.rmSync=function(e,...t){return S(e),r.call(s,e,...t)};let i=s.unlink;s.unlink=function(e,...t){try{S(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return i.call(s,e,...t)};let a=s.unlinkSync;s.unlinkSync=function(e,...t){return S(e),a.call(s,e,...t)};let o=s.mkdir;s.mkdir=function(e,...t){try{S(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return o.call(s,e,...t)};let c=s.mkdirSync;s.mkdirSync=function(e,...t){return S(e),c.call(s,e,...t)};let l=s.rmdir;s.rmdir=function(e,...t){try{S(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return l.call(s,e,...t)};let u=s.rmdirSync;s.rmdirSync=function(e,...t){return S(e),u.call(s,e,...t)};let d=s.appendFile;s.appendFile=function(e,...t){try{S(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return d.call(s,e,...t)};let f=s.appendFileSync;s.appendFileSync=function(e,...t){return S(e),f.call(s,e,...t)};let p=s.copyFile;s.copyFile=function(e,t,...n){try{S(e),S(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return p.call(s,e,t,...n)};let m=s.copyFileSync;s.copyFileSync=function(e,t,...n){return S(e),S(t),m.call(s,e,t,...n)};let h=s.rename;s.rename=function(e,t,...n){try{S(e),S(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return h.call(s,e,t,...n)};let g=s.renameSync;s.renameSync=function(e,t,...n){return S(e),S(t),g.call(s,e,t,...n)};let v=s.createWriteStream;s.createWriteStream=function(e,...t){return S(e),v.call(s,e,...t)};let y=s.open;s.open=function(e,t,...n){if(C(typeof t==`function`?void 0:t))try{S(e)}catch(e){let r=n[n.length-1],i=typeof t==`function`?t:typeof r==`function`?r:void 0;if(i){process.nextTick(()=>i(e));return}throw e}return y.call(s,e,t,...n)};let b=s.openSync;s.openSync=function(e,t,...n){return C(t)&&S(e),b.call(s,e,t,...n)};let x=e=>{if(!e)return;let t=e.writeFile;t&&(e.writeFile=async function(n,...r){return S(n),t.call(e,n,...r)});let n=e.rm;n&&(e.rm=async function(t,...r){return S(t),n.call(e,t,...r)});let r=e.mkdir;r&&(e.mkdir=async function(t,...n){return S(t),r.call(e,t,...n)});let i=e.rmdir;i&&(e.rmdir=async function(t,...n){return S(t),i.call(e,t,...n)});let a=e.unlink;a&&(e.unlink=async function(t,...n){return S(t),a.call(e,t,...n)});let o=e.appendFile;o&&(e.appendFile=async function(t,...n){return S(t),o.call(e,t,...n)});let s=e.copyFile;s&&(e.copyFile=async function(t,n,...r){return S(t),S(n),s.call(e,t,n,...r)});let c=e.rename;c&&(e.rename=async function(t,n,...r){return S(t),S(n),c.call(e,t,n,...r)});let l=e.open;l&&(e.open=async function(t,n,...r){return C(n)&&S(t),l.call(e,t,n,...r)})};x(s.promises),x(_)}let T=!1;async function E(e=process.cwd(),a={}){if(!T){T=!0,r();try{n(await i(o.resolve(e,`docs`),e),e)}catch{}try{let n=await t(e,`development`);n.logLevel=`warn`,n.clearScreen=!1,a.port!==void 0&&(n.server=n.server||{},n.server.port=Number(a.port)),a.host!==void 0&&(n.server=n.server||{},n.server.host=a.host);let r=await v(n);await r.listen();let i=r.resolvedUrls;console.log(u(i?.local?.[0]??`http://localhost:${a.port??5173}`,i?.network?.[0]??null)),r.bindCLIShortcuts({print:!1})}catch(e){d(`Failed to start dev server:`,e),process.exit(1)}}}async function D(t=process.cwd()){r();try{let n=await e().run({root:t,timing:{}});n.success||(d(`Build failed at step "${n.failedStep}":`,n.error),process.exit(1)),m(`SSG build completed successfully in ${Math.round(n.timing.total)}ms!`),process.exit(0)}catch(e){d(`Build failed:`,e),process.exit(1)}}async function O(e=process.cwd(),n={}){try{let r=await t(e,`production`);r.logLevel=`warn`,r.clearScreen=!1,n.port!==void 0&&(r.preview=r.preview||{},r.preview.port=Number(n.port)),n.host!==void 0&&(r.preview=r.preview||{},r.preview.host=n.host);let i=(await a(r)).resolvedUrls;console.log(p(i?.local?.[0]??`http://localhost:${n.port??4173}`,i?.network?.[0]??null))}catch(e){d(`Failed to start preview server:`,e),process.exit(1)}}function k(e){let t=[];if(!s.existsSync(e))return t;try{let n=s.readdirSync(e);for(let r of n){let n=o.join(e,r);s.statSync(n).isDirectory()?r!==`node_modules`&&r!==`.git`&&r!==`dist`&&r!==`coverage`&&t.push(...k(n)):/\.(js|mjs|cjs|ts|tsx|jsx)$/.test(r)&&t.push(n)}}catch{}return t}async function A(e=process.cwd()){f(`Starting static security audit of Boltdocs plugins...`);let t;try{t=await i(o.resolve(e,`docs`),e)}catch(e){d(`Failed to load Boltdocs configuration for audit:`,e),process.exit(1)}let n=t.plugins||[];if(n.length===0){m(`No plugins configured. Nothing to audit.`);return}let r=[];for(let t of n){if(!t.name)continue;let n=null;try{let{createRequire:r}=await import(`node:module`),i=r(o.resolve(e,`package.json`)).resolve(`${t.name}/package.json`);n=o.dirname(i)}catch{let r=o.resolve(e,`node_modules`,t.name);s.existsSync(r)&&(n=r)}if(!n){r.push({name:c.cyan(t.name),status:c.red(`❓ Unresolved`),details:`Could not locate plugin files in node_modules.`});continue}let i=k(n),a=[];for(let e of i)try{let t=s.readFileSync(e,`utf-8`);t.includes(`fetch(`)&&a.push(`fetch`),t.includes(`axios`)&&a.push(`axios`),t.includes(`http.request`)&&a.push(`http.request`),t.includes(`https.request`)&&a.push(`https.request`),t.includes(`process.env`)&&a.push(`process.env`)}catch{}let l=Array.from(new Set(a));l.length>0?r.push({name:c.cyan(t.name),status:c.yellow(`⚠️ Warning`),details:`Contains network/env accesses: ${c.bold(l.join(`, `))}. Ensure you trust the author.`}):r.push({name:c.cyan(t.name),status:c.green(`✅ Clean`),details:`No external network calls or env accesses detected.`})}let a=[`Plugin`,`Status`,`Audit Notes`],l=r.map(e=>[e.name,e.status,e.details]);console.log(`
7
+ import{E as e,n as t,w as n}from"../node-B7qbjtLl.mjs";import{n as r}from"../config-DBKBEj3j.mjs";import{a as i}from"../cache-CfhOTR3Q.mjs";import{createRequire as a}from"node:module";import o from"node:path";import s from"node:fs";import{colors as c,configure as l,double as u,error as d,info as f,padCenter as p,success as m,table as h,warn as g}from"@bdocs/dui";import{preview as _}from"vite";import v from"node:fs/promises";import{createServer as y}from"@bdocs/ssg/node";import b from"cac";import x from"node:os";import{fileURLToPath as S}from"node:url";function C(e){let t=e;for(;t&&t!==o.dirname(t);){if(s.existsSync(o.join(t,`.git`))||s.existsSync(o.join(t,`pnpm-workspace.yaml`)))return t;t=o.dirname(t)}t=e;let n=e;for(;t&&t!==o.dirname(t);)s.existsSync(o.join(t,`package.json`))&&(n=t),t=o.dirname(t);return n}let w=C(process.cwd());function T(e){if(!e)return;let t;if(typeof e==`string`)t=e;else if(e instanceof URL){if(e.protocol!==`file:`)return;t=e.pathname}else if(Buffer.isBuffer(e))t=e.toString();else return;let n=o.resolve(w,t),r=o.relative(w,n),i=r.startsWith(`..`)||o.isAbsolute(r),a=n.split(o.sep),s=a.some(e=>e.startsWith(`.env`)),c=a.some((e,t)=>{if(e===`node_modules`){let e=a[t+1];return!e||!e.startsWith(`.`)}return!1});if(i||s||c)throw Error(`[Boltdocs Security] Write/delete operation blocked on path: "${n}". Modifications are restricted to the project root, and cannot access .env or non-cache node_modules folders.`)}function E(e){return e==null?!1:typeof e==`number`?e!==0:typeof e==`string`?e.includes(`w`)||e.includes(`a`)||e.includes(`+`):!0}function D(){let e=s.writeFile;s.writeFile=((t,...n)=>{try{T(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return e.call(s,t,...n)});let t=s.writeFileSync;s.writeFileSync=(e,...n)=>(T(e),t.call(s,e,...n));let n=s.rm;s.rm=((e,...t)=>{try{T(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return n.call(s,e,...t)});let r=s.rmSync;s.rmSync=(e,...t)=>(T(e),r.call(s,e,...t));let i=s.unlink;s.unlink=((e,...t)=>{try{T(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return i.call(s,e,...t)});let a=s.unlinkSync;s.unlinkSync=(e,...t)=>(T(e),a.call(s,e,...t));let o=s.mkdir;s.mkdir=((e,...t)=>{try{T(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return o.call(s,e,...t)});let c=s.mkdirSync;s.mkdirSync=(e,...t)=>(T(e),c.call(s,e,...t));let l=s.rmdir;s.rmdir=((e,...t)=>{try{T(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return l.call(s,e,...t)});let u=s.rmdirSync;s.rmdirSync=(e,...t)=>(T(e),u.call(s,e,...t));let d=s.appendFile;s.appendFile=((e,...t)=>{try{T(e)}catch(e){let n=t[t.length-1];if(typeof n==`function`){process.nextTick(()=>n(e));return}throw e}return d.call(s,e,...t)});let f=s.appendFileSync;s.appendFileSync=(e,...t)=>(T(e),f.call(s,e,...t));let p=s.copyFile;s.copyFile=((e,t,...n)=>{try{T(e),T(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return p.call(s,e,t,...n)});let m=s.copyFileSync;s.copyFileSync=(e,t,...n)=>(T(e),T(t),m.call(s,e,t,...n));let h=s.rename;s.rename=((e,t,...n)=>{try{T(e),T(t)}catch(e){let t=n[n.length-1];if(typeof t==`function`){process.nextTick(()=>t(e));return}throw e}return h.call(s,e,t,...n)});let g=s.renameSync;s.renameSync=(e,t,...n)=>(T(e),T(t),g.call(s,e,t,...n));let _=s.createWriteStream;s.createWriteStream=(e,...t)=>(T(e),_.call(s,e,...t));let y=s.open;s.open=((e,t,...n)=>{if(E(typeof t==`function`?void 0:t))try{T(e)}catch(e){let r=n[n.length-1],i=typeof t==`function`?t:typeof r==`function`?r:void 0;if(i){process.nextTick(()=>i(e));return}throw e}return y.call(s,e,t,...n)});let b=s.openSync;s.openSync=(e,t,...n)=>(E(t)&&T(e),b.call(s,e,t,...n));let x=e=>{if(!e)return;let t=e.writeFile;t&&(e.writeFile=async(n,...r)=>(T(n),t.call(e,n,...r)));let n=e.rm;n&&(e.rm=async(t,...r)=>(T(t),n.call(e,t,...r)));let r=e.mkdir;r&&(e.mkdir=async(t,...n)=>(T(t),r.call(e,t,...n)));let i=e.rmdir;i&&(e.rmdir=async(t,...n)=>(T(t),i.call(e,t,...n)));let a=e.unlink;a&&(e.unlink=async(t,...n)=>(T(t),a.call(e,t,...n)));let o=e.appendFile;o&&(e.appendFile=async(t,...n)=>(T(t),o.call(e,t,...n)));let s=e.copyFile;s&&(e.copyFile=async(t,n,...r)=>(T(t),T(n),s.call(e,t,n,...r)));let c=e.rename;c&&(e.rename=async(t,n,...r)=>(T(t),T(n),c.call(e,t,n,...r)));let l=e.open;l&&(e.open=async(t,n,...r)=>(E(n)&&T(t),l.call(e,t,n,...r)))};x(s.promises),x(v)}function O(e,t){let n=t?` ${c.green(`➜`)} ${c.green(`Network:`)} ${c.cyan(t)}`:` ${c.green(`➜`)} ${c.green(`Network:`)} ${c.gray(`use --host to expose`)}`;return`
8
+ `+u([` ${c.green(`➜`)} ${c.green(`Local:`)} ${c.cyan(e)}`,n,``,` ${c.dim(`press h + enter for help`)}`],{title:`boltdocs dev server`})+`
9
+ `}function k(e,t){let n=t?` ${c.green(`➜`)} ${c.green(`Network:`)} ${c.cyan(t)}`:` ${c.green(`➜`)} ${c.green(`Network:`)} ${c.gray(`use --host to expose`)}`;return`
10
+ `+u([` ${c.green(`➜`)} ${c.green(`Local:`)} ${c.cyan(e)}`,n],{title:`boltdocs preview server`})+`
11
+ `}function A(e,t){return`
12
+ `+u([p(`🚀 Update available!`,50),``,` ${c.dim(`Current:`)} ${c.red(e)} ${c.gray(`→`)} ${c.green(t)}`,``,` ${c.dim(`Run:`)} ${c.bold(`npm install boltdocs@latest`)}`])+`
13
+ `}const j=a(import.meta.url);function M(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 N(){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 P(){try{let e=S(import.meta.url),t=o.dirname(e);for(let e=0;e<5;e++){let e=o.join(t,`package.json`);if(s.existsSync(e)){let t=JSON.parse(s.readFileSync(e,`utf-8`));if(t.name===`boltdocs`)return t.version}t=o.dirname(t)}}catch{}try{return j(`boltdocs/package.json`).version}catch{return`0.0.0`}}async function F(){let e=``;try{e=o.join(x.homedir(),`.boltdocs`,`update-check.json`)}catch{return}let t=0;try{if(s.existsSync(e)){let n=JSON.parse(s.readFileSync(e,`utf-8`));t=Number(n.lastCheck)||0}}catch{}let n=Date.now();if(n-t<864e5)return;try{s.mkdirSync(o.dirname(e),{recursive:!0}),s.writeFileSync(e,JSON.stringify({lastCheck:n}),`utf-8`)}catch{}let r=await P();if(r===`0.0.0`)return;let i=await N();i&&M(i,r)&&console.log(A(r,i))}let I=!1;async function L(n=process.cwd(),i={}){if(I)return;I=!0,F();let a;try{a=await r(o.resolve(n,`docs`),n),e(a,n)}catch{}try{let e=await t(n,`development`,a);e.logLevel=`warn`,e.clearScreen=!1,i.port!==void 0&&(e.server=e.server||{},e.server.port=Number(i.port)),i.host!==void 0&&(e.server=e.server||{},e.server.host=i.host),i.force&&(e.optimizeDeps=e.optimizeDeps||{},e.optimizeDeps.force=!0);let r=await y(e);await r.listen();let o=r.resolvedUrls;console.log(O(o?.local?.[0]??`http://localhost:${i.port??5173}`,o?.network?.[0]??null)),r.bindCLIShortcuts({print:!1})}catch(e){d(`Failed to start dev server:`,e),process.exit(1)}}async function R(e=process.cwd()){F();try{let t=await n().run({root:e,timing:{}});t.success||(d(`Build failed at step "${t.failedStep}":`,t.error),await i(),process.exit(1)),console.log(u([`SSG build completed in ${(Math.round(t.timing.total)/1e3).toFixed(1)}s`,``,`${c.cyan(`boltdocs`)} documentation is ready at ${c.green(`dist/`)}`])),await i(),process.exit(0)}catch(e){d(`Build failed:`,e),await i(),process.exit(1)}}async function z(e=process.cwd(),n={}){try{let r=await t(e,`production`);r.logLevel=`warn`,r.clearScreen=!1,n.port!==void 0&&(r.preview=r.preview||{},r.preview.port=Number(n.port)),n.host!==void 0&&(r.preview=r.preview||{},r.preview.host=n.host);let i=(await _(r)).resolvedUrls;console.log(k(i?.local?.[0]??`http://localhost:${n.port??4173}`,i?.network?.[0]??null))}catch(e){d(`Failed to start preview server:`,e),process.exit(1)}}function B(e){let t=[];if(!s.existsSync(e))return t;try{let n=s.readdirSync(e);for(let r of n){let n=o.join(e,r);s.statSync(n).isDirectory()?r!==`node_modules`&&r!==`.git`&&r!==`dist`&&r!==`coverage`&&t.push(...B(n)):/\.(js|mjs|cjs|ts|tsx|jsx)$/.test(r)&&t.push(n)}}catch{}return t}async function V(e=process.cwd()){f(`Starting static security audit of Boltdocs plugins...`);let t;try{t=await r(o.resolve(e,`docs`),e)}catch(e){d(`Failed to load Boltdocs configuration for audit:`,e),process.exit(1)}let n=t.plugins||[];if(n.length===0){m(`No plugins configured. Nothing to audit.`);return}let i=[];for(let t of n){if(!t.name)continue;let n=null;try{let{createRequire:r}=await import(`node:module`),i=r(o.resolve(e,`package.json`)).resolve(`${t.name}/package.json`);n=o.dirname(i)}catch{let r=o.resolve(e,`node_modules`,t.name);s.existsSync(r)&&(n=r)}if(!n){i.push({name:c.cyan(t.name),status:c.red(`❓ Unresolved`),details:`Could not locate plugin files in node_modules.`});continue}let r=B(n),a=[];for(let e of r)try{let t=s.readFileSync(e,`utf-8`);t.includes(`fetch(`)&&a.push(`fetch`),t.includes(`axios`)&&a.push(`axios`),t.includes(`http.request`)&&a.push(`http.request`),t.includes(`https.request`)&&a.push(`https.request`),t.includes(`process.env`)&&a.push(`process.env`)}catch{}let l=Array.from(new Set(a));l.length>0?i.push({name:c.cyan(t.name),status:c.yellow(`⚠️ Warning`),details:`Contains network/env accesses: ${c.bold(l.join(`, `))}. Ensure you trust the author.`}):i.push({name:c.cyan(t.name),status:c.green(`✅ Clean`),details:`No external network calls or env accesses detected.`})}let a=[`Plugin`,`Status`,`Audit Notes`],l=i.map(e=>[e.name,e.status,e.details]);console.log(`
8
14
  `+h(a,l)+`
9
- `),r.some(e=>e.status.includes(`Warning`))?g(`⚠️ One or more plugins have security warnings. Review the flags above.`):m(`✓ All plugins passed the static security check!`)}process.noDeprecation=!0,w(),l({prefix:`boltdocs`,devServerTitle:`boltdocs dev server`,previewServerTitle:`boltdocs preview server`,updateCommand:`pnpm add boltdocs@latest`});const j=y(`boltdocs`);j.command(`dev [root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).action(E),j.command(`[root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).action(E),j.command(`build [root]`,`Build for production`).action(D),j.command(`preview [root]`,`Preview production build`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).action(O),j.command(`audit [root]`,`Audit configured plugins for security warnings`).action(A),j.command(`doctor [root]`,`Check the health of your documentation`).option(`--fix`,`Automatically fix broken internal links and sync translations`).option(`--check-external`,`Verify external links (slower)`).option(`--init`,`Initialize doctor.json with default configuration`).option(`--budget`,`Check build performance against configured budgets`).action(async(e,t)=>{let{doctorAction:n}=await import(`../doctor-BGPdO1Ah.mjs`);await n(e,t)}),j.command(`generate-changelog <file>`,`Generate changelog documentation from CHANGELOG.md`).option(`-o, --output <path>`,`Output folder (default: docs/changelog)`,{default:`docs/changelog`}).option(`-t, --title <text>`,`Title for changelog pages`,{default:`Changelog`}).option(`--infer-tab`,`Infer tab from folder name (default: true)`,{default:!0}).option(`-l, --limit <number>`,`Limit number of versions to generate`).action(async(e,t)=>{let{generateChangelog:n}=await import(`../generator-BHCrLU6h.mjs`);await n(e,{output:t.output,title:t.title,inferTab:t.inferTab,limit:t.limit?parseInt(String(t.limit),10):void 0})}),j.help(),j.version(`2.0.0`),j.parse();export{};
15
+ `),i.some(e=>e.status.includes(`Warning`))?g(`⚠️ One or more plugins have security warnings. Review the flags above.`):m(`✓ All plugins passed the static security check!`)}const{emitWarning:H}=process;process.emitWarning=function(e,...t){if(!(e&&typeof e==`object`&&e.code===`DEP0205`)&&!(typeof e==`string`&&t.includes(`DEP0205`)))return Reflect.apply(H,process,[e,...t])},D(),l({prefix:`boltdocs`});const U=b(`boltdocs`);U.command(`dev [root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).option(`--force`,`Force Vite to re-optimize dependencies`).action(L),U.command(`[root]`,`Start development server`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).option(`--force`,`Force Vite to re-optimize dependencies`).action(L),U.command(`build [root]`,`Build for production`).action(R),U.command(`preview [root]`,`Preview production build`).option(`--port <port>`,`Port to listen on`).option(`--host [host]`,`Host to bind to`).action(z),U.command(`audit [root]`,`Audit configured plugins for security warnings`).action(V),U.command(`doctor [root]`,`Check the health of your documentation`).option(`--fix`,`Automatically fix broken internal links and sync translations`).option(`--check-external`,`Verify external links (slower)`).option(`--init`,`Initialize doctor.json with default configuration`).option(`--budget`,`Check build performance against configured budgets`).action(async(e,t)=>{let{doctorAction:n}=await import(`../doctor-C19DsI1e.mjs`).then(e=>e.t);await n(e,t)}),U.command(`generate-changelog <file>`,`Generate changelog documentation from CHANGELOG.md`).option(`-o, --output <path>`,`Output folder (default: docs/changelog)`,{default:`docs/changelog`}).option(`-t, --title <text>`,`Title for changelog pages`,{default:`Changelog`}).option(`--infer-tab`,`Infer tab from folder name (default: true)`,{default:!0}).option(`-l, --limit <number>`,`Limit number of versions to generate`).action(async(e,t)=>{let{generateChangelog:n}=await import(`../generator-B6lrnDZ-.mjs`);await n(e,{output:t.output,title:t.title,inferTab:t.inferTab,limit:t.limit?parseInt(String(t.limit),10):void 0})}),U.help(),U.version(`2.0.0`),U.parse();export{F as t};
@@ -3,4 +3,4 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}}),require(`../chunk-CU-zTemE.cjs`);const e=require(`../utils-Cjmx1hhk.cjs`),t=require(`../doctor-VBPlQf7d.cjs`),n=require(`../node-JM9bx0mO.cjs`);let r=require(`unist-util-visit`);exports.BoltdocsPluginStore=n.w,exports.EXIT=r.EXIT,exports.MDX_NODES=n.y,exports.PluginCompatibilityError=n.T,exports.PluginError=n.E,exports.PluginHookError=n.D,exports.PluginLifecycleManager=n.b,exports.PluginValidationError=n.O,exports.SKIP=r.SKIP,exports.addNodeClass=n.a,exports.createMdxAttribute=n.o,exports.createMdxElement=n.s,exports.createPlugin=n.i,exports.createRehypeElement=n.c,exports.createViteConfig=n.n,exports.default=n.t,exports.defineConfig=t.m,exports.generateEntryCode=n.r,exports.getNodeProperty=n.l,exports.hasNodeClass=n.u,exports.normalizePath=e.u,exports.parseMetaString=n.v,exports.removeNodeClass=n.d,exports.resolveConfig=t.p,exports.sanitizeFilename=e.f,exports.setNodeProperty=n.f,exports.validatePlugins=n.C,exports.visitMdxElements=n.p,exports.visitNodes=n.m,exports.visitRehypeElements=n.h,exports.visitRemarkHeadings=n.g,exports.visitRemarkLinks=n._;
6
+ Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:`Module`}}),require(`../chunk-Ds5LZdWN.cjs`);const e=require(`../utils-BWy_8ASj.cjs`),t=require(`../node-Dj3-2YYP.cjs`),n=require(`../config-BqZUYono.cjs`),r=require(`../cache-B19MLTpN.cjs`),i=require(`../shiki-adapter-BB71nVsG.cjs`),a=require(`../handler-1LRMYeI4.cjs`);let o=require(`unist-util-visit`);exports.AssetCache=r.n,exports.BoltdocsPluginStore=t.E,exports.EXIT=o.EXIT,exports.MDX_NODES=i.o,exports.PluginCompatibilityError=t.D,exports.PluginError=t.O,exports.PluginHookError=t.k,exports.PluginLifecycleManager=t.x,exports.PluginValidationError=t.A,exports.SKIP=o.SKIP,exports.addNodeClass=t.c,exports.createMdxAttribute=t.l,exports.createMdxElement=t.u,exports.createPlugin=t.s,exports.createRehypeElement=t.d,exports.createViteConfig=t.n,exports.default=t.t,exports.defineConfig=n.a,exports.flushCache=r.a,exports.generateEntryCode=t.j,exports.getNodeProperty=t.f,exports.handleAwsFeedback=t.r,exports.handleFeedback=a.t,exports.handleNetlifyFeedback=t.a,exports.handleVercelFeedback=t.o,exports.handleWebFeedback=t.i,exports.hasNodeClass=t.p,exports.normalizePath=e.u,exports.parseMetaString=i.r,exports.removeNodeClass=t.m,exports.resolveConfig=n.n,exports.sanitizeFilename=e.f,exports.setNodeProperty=t.h,exports.validatePlugins=t.T,exports.visitMdxElements=t.g,exports.visitNodes=t._,exports.visitRehypeElements=t.v,exports.visitRemarkHeadings=t.y,exports.visitRemarkLinks=t.b;