boltdocs 3.0.2 → 3.2.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 (123) hide show
  1. package/README.md +2 -18
  2. package/dist/{adapters-DEXNIv3x.mjs → adapters-ByYY44Zy.mjs} +1 -1
  3. package/dist/{adapters-C5AWWGfb.cjs → adapters-DvmtpdSF.cjs} +1 -1
  4. package/dist/{banner-CfdalYLL.d.ts → banner-BMop1KLF.d.ts} +2 -2
  5. package/dist/{banner-DNSkgUsO.d.cts → banner-CVD0GugR.d.cts} +2 -2
  6. package/dist/cache-CO4Dy2uQ.cjs +6 -0
  7. package/dist/cache-Dk53iOo6.mjs +6 -0
  8. package/dist/chunk-BFSpntXv.mjs +6 -0
  9. package/dist/{chunk-Ds5LZdWN.cjs → chunk-D1Md3oWO.cjs} +1 -1
  10. package/dist/client/index.cjs +433 -272
  11. package/dist/client/index.d.cts +129 -18
  12. package/dist/client/index.d.ts +129 -18
  13. package/dist/client/index.js +337 -178
  14. package/dist/client/mdx.cjs +1 -1
  15. package/dist/client/mdx.d.cts +1 -1
  16. package/dist/client/mdx.d.ts +1 -1
  17. package/dist/client/mdx.js +1 -1
  18. package/dist/client/primitives.cjs +7 -7
  19. package/dist/client/primitives.d.cts +5 -22
  20. package/dist/client/primitives.d.ts +5 -22
  21. package/dist/client/primitives.js +4 -4
  22. package/dist/client/theme/neutral.css +1 -3
  23. package/dist/client/theme/reset.css +31 -4
  24. package/dist/config-BpzaPsJj.d.cts +781 -0
  25. package/dist/config-CCXp3aXO.mjs +7 -0
  26. package/dist/{config-JGkMJoJQ.cjs → config-CMd4XoFq.cjs} +1 -1
  27. package/dist/config-DlGoEM9D.cjs +7 -0
  28. package/dist/config-xtS0ZkMm.d.mts +781 -0
  29. package/dist/{csp-CBysWlAf.cjs → csp-CRp_3U7a.cjs} +1 -1
  30. package/dist/csp-oTC2ygvF.mjs +6 -0
  31. package/dist/{docs-layout-6FQ8__ok.js → docs-layout-BdtZ9z6s.js} +9 -28
  32. package/dist/{docs-layout-3TpAt6MB.cjs → docs-layout-CFWI15Id.cjs} +69 -88
  33. package/dist/{doctor-BR1B2Mkz.cjs → doctor-BBtmNJE0.cjs} +1 -1
  34. package/dist/doctor-Bv16QSrI.cjs +7 -0
  35. package/dist/doctor-DOAbSaiL.mjs +7 -0
  36. package/dist/{generator-DtUU3Cfk.cjs → generator-COepVWGi.cjs} +1 -1
  37. package/dist/{handler-Btd4t_67.mjs → handler-DzQae4eA.mjs} +1 -1
  38. package/dist/{handler-Dzf4dSnV.cjs → handler-XX7cLTqe.cjs} +1 -1
  39. package/dist/headers-Ddwek8K7.mjs +6 -0
  40. package/dist/{headers-BXKxiPUv.cjs → headers-dg4SDrjY.cjs} +1 -1
  41. package/dist/{image-C9md50h2.js → image-Bz87fCla.js} +2 -2
  42. package/dist/{image-CR6UlaI5.cjs → image-C4TlpMHn.cjs} +18 -18
  43. package/dist/link-2PzgTnaP.js +673 -0
  44. package/dist/{icons-dev-BryEFkJu.cjs → link-D1Gjkb-2.cjs} +8 -353
  45. package/dist/{mdx-DhyMkc35.js → mdx-BuO6a1f7.js} +199 -40
  46. package/dist/{mdx-DJBg5DuL.cjs → mdx-CD-tSjRG.cjs} +237 -72
  47. package/dist/{meta-loader-C9MKjAs0.cjs → meta-loader-Dq1zcFnh.cjs} +1 -1
  48. package/dist/node/cache.cjs +6 -0
  49. package/dist/node/cache.d.cts +84 -0
  50. package/dist/node/cache.d.mts +84 -0
  51. package/dist/node/cache.mjs +6 -0
  52. package/dist/node/cli-entry.cjs +6 -6
  53. package/dist/node/cli-entry.mjs +9 -9
  54. package/dist/node/index.cjs +1 -1
  55. package/dist/node/index.d.cts +27 -638
  56. package/dist/node/index.d.mts +27 -640
  57. package/dist/node/index.mjs +1 -1
  58. package/dist/node/mdx/shiki-adapter.cjs +6 -0
  59. package/dist/node/mdx/shiki-adapter.d.cts +51 -0
  60. package/dist/node/mdx/shiki-adapter.d.mts +51 -0
  61. package/dist/node/mdx/shiki-adapter.mjs +6 -0
  62. package/dist/node-BXtqM1uH.mjs +6 -0
  63. package/dist/node-BlVk4EVg.cjs +104 -0
  64. package/dist/node-DOf4zhWc.mjs +104 -0
  65. package/dist/node-aD1eisrR.cjs +6 -0
  66. package/dist/{package-CEDhVAfO.cjs → package-BcISI5-P.cjs} +1 -1
  67. package/dist/{package-_dCCKVvG.mjs → package-CCYEAYeA.mjs} +1 -1
  68. package/dist/{pages-external-CX2uyW95.cjs → pages-external-XkYIs-d5.cjs} +1 -1
  69. package/dist/parser-DCiEWkSk.cjs +8 -0
  70. package/dist/parser-qk9FIHJ7.mjs +8 -0
  71. package/dist/plugin-C95kvu6h.mjs +73 -0
  72. package/dist/plugin-DM3u2bVj.cjs +73 -0
  73. package/dist/routes-BW6zsk7Z.mjs +6 -0
  74. package/dist/routes-BgoIB5wb.cjs +6 -0
  75. package/dist/{routes-BajCwrvX.cjs → routes-CORVxc02.cjs} +1 -1
  76. package/dist/{search-dialog-D4rplZMv.cjs → search-dialog-B1NERUNx.cjs} +101 -55
  77. package/dist/{search-dialog-Cx7aGW3U.cjs → search-dialog-BRFno7HD.cjs} +8 -8
  78. package/dist/{search-dialog-DDopgbKM.js → search-dialog-BmxHiKwt.js} +2 -2
  79. package/dist/{search-dialog-BNdRV60O.js → search-dialog-D6TvjcuV.js} +1 -1
  80. package/dist/{search-dialog-DaeSPvEo.js → search-dialog-DFnlx8LO.js} +44 -4
  81. package/dist/{search-dialog-CW1f6dn6.cjs → search-dialog-DHqwjJuG.cjs} +1 -1
  82. package/dist/server/index.cjs +1 -1
  83. package/dist/server/index.d.mts +1 -1
  84. package/dist/server/index.mjs +1 -1
  85. package/dist/shiki-adapter-CoQ6jyJ4.cjs +6 -0
  86. package/dist/shiki-adapter-D-aKw7PP.mjs +6 -0
  87. package/dist/sidebar-COTaMHR-.d.ts +1100 -0
  88. package/dist/sidebar-CrEdJuHX.d.cts +1100 -0
  89. package/dist/{types-generator-CYcHkDzZ.cjs → types-generator-BXhv7Ill.cjs} +1 -1
  90. package/dist/types-generator-bDPvUztF.mjs +26 -0
  91. package/dist/utils-Crm9oPcV.mjs +7 -0
  92. package/dist/utils-D6Xtj0FZ.cjs +7 -0
  93. package/package.json +26 -12
  94. package/src/shared/types.ts +532 -23
  95. package/dist/cache-DETwlACe.cjs +0 -6
  96. package/dist/cache-SF59enb3.mjs +0 -6
  97. package/dist/config-B5uVv5q4.cjs +0 -7
  98. package/dist/config-D3_zDkHh.mjs +0 -7
  99. package/dist/csp-gaZ51xzq.mjs +0 -6
  100. package/dist/doctor-3MheVMwd.mjs +0 -7
  101. package/dist/doctor-DQxLM202.cjs +0 -7
  102. package/dist/headers-CXyf0auY.mjs +0 -6
  103. package/dist/icons-dev-kJyGWNeg.js +0 -916
  104. package/dist/node-B9JSyEIU.mjs +0 -105
  105. package/dist/node-Cedquois.cjs +0 -105
  106. package/dist/parser-CNIPHx4s.cjs +0 -8
  107. package/dist/parser-D0QHIQsi.mjs +0 -8
  108. package/dist/plugin-WYNORxp1.cjs +0 -68
  109. package/dist/plugin-YWNVRpws.mjs +0 -68
  110. package/dist/rolldown-runtime-fkIsjY3S.mjs +0 -6
  111. package/dist/routes-CyrnmVuG.mjs +0 -6
  112. package/dist/routes-D6Tuu7Fs.cjs +0 -6
  113. package/dist/shiki-adapter-CGTmrR6S.cjs +0 -6
  114. package/dist/shiki-adapter-CXEGRnjr.mjs +0 -6
  115. package/dist/shiki-adapter-Mr8_oT_9.cjs +0 -6
  116. package/dist/sidebar-7gIifpBX.d.cts +0 -615
  117. package/dist/sidebar-BAKgJ-Er.d.ts +0 -615
  118. package/dist/types-generator-DVOnRVKU.mjs +0 -26
  119. package/dist/utils-B3xYMrpK.mjs +0 -7
  120. package/dist/utils-Bz1tG9Dg.cjs +0 -7
  121. /package/dist/{errors-C0Hx15Ag.mjs → errors-0zGHRLue.mjs} +0 -0
  122. /package/dist/{errors-Dx6JHoKE.cjs → errors-vKw8CkiX.cjs} +0 -0
  123. /package/dist/{index-CdJv4ocW.d.mts → index-1KsTDq4o.d.mts} +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-BryEFkJu.cjs');
7
- const require_image = require('./image-CR6UlaI5.cjs');
6
+ const require_link = require('./link-D1Gjkb-2.cjs');
7
+ const require_image = require('./image-C4TlpMHn.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");
@@ -44,9 +44,9 @@ const Field = ({ children, name, type, description, required }) => /* @__PURE__
44
44
  //#endregion
45
45
  //#region src/client/components/mdx/typographics.tsx
46
46
  const Anchor = ({ href, children, className, ...props }) => {
47
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons_dev.Link, {
47
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_link.Link, {
48
48
  href: href || "",
49
- className: require_icons_dev.cn("text-primary-500 hover:text-primary-400 dark:text-primary-500 hover:underline font-medium transition-colors duration-200", className),
49
+ className: require_link.cn("text-primary-500 hover:text-primary-400 dark:text-primary-500 hover:underline font-medium transition-colors duration-200", className),
50
50
  ...props,
51
51
  children
52
52
  });
@@ -62,7 +62,7 @@ const HEADING_CLASSES = {
62
62
  const Heading = ({ level, className, ...props }) => {
63
63
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_image.Heading, {
64
64
  level,
65
- className: require_icons_dev.cn(HEADING_CLASSES[level] || "", className),
65
+ className: require_link.cn(HEADING_CLASSES[level] || "", className),
66
66
  ...props
67
67
  });
68
68
  };
@@ -93,35 +93,39 @@ const Typographics = {
93
93
  ...props
94
94
  }),
95
95
  p: ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
96
- className: require_icons_dev.cn("text-paragraph leading-relaxed my-5", className),
96
+ className: require_link.cn("text-paragraph leading-relaxed my-5", className),
97
97
  ...props
98
98
  }),
99
99
  strong: ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", {
100
- className: require_icons_dev.cn("font-semibold text-body", className),
100
+ className: require_link.cn("font-semibold text-body", className),
101
101
  ...props
102
102
  }),
103
103
  mark: ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("mark", {
104
- className: require_icons_dev.cn("bg-primary-500/10 text-primary-500 font-semibold px-1.5 py-0.5 rounded-md", className),
104
+ className: require_link.cn("bg-primary-500/10 text-primary-500 font-semibold px-1.5 py-0.5 rounded-md", className),
105
+ ...props
106
+ }),
107
+ code: ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
108
+ className: require_link.cn("bg-code-bg text-code-text rounded-md px-1.5 py-0.5 text-[0.875em] font-mono font-medium", className),
105
109
  ...props
106
110
  }),
107
111
  blockquote: ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("blockquote", {
108
- className: require_icons_dev.cn("border-l-4 border-primary-500 bg-soft/30 pl-4 py-2 my-6 italic text-muted rounded-r-lg", className),
112
+ className: require_link.cn("border-l-4 border-primary-500 bg-soft/30 pl-4 py-2 my-6 italic text-muted rounded-r-lg", className),
109
113
  ...props
110
114
  }),
111
115
  hr: ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("hr", {
112
- className: require_icons_dev.cn("my-8 border-t border-subtle", className),
116
+ className: require_link.cn("my-8 border-t border-subtle", className),
113
117
  ...props
114
118
  }),
115
119
  ul: ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ul", {
116
- className: require_icons_dev.cn("list-disc pl-6 my-5 space-y-2 text-paragraph", className),
120
+ className: require_link.cn("list-disc pl-6 my-5 space-y-2 text-paragraph", className),
117
121
  ...props
118
122
  }),
119
123
  ol: ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("ol", {
120
- className: require_icons_dev.cn("list-decimal pl-6 my-5 space-y-2 text-paragraph", className),
124
+ className: require_link.cn("list-decimal pl-6 my-5 space-y-2 text-paragraph", className),
121
125
  ...props
122
126
  }),
123
127
  li: ({ className, ...props }) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("li", {
124
- className: require_icons_dev.cn("pl-1", className),
128
+ className: require_link.cn("pl-1", className),
125
129
  ...props
126
130
  })
127
131
  };
@@ -136,20 +140,20 @@ const Table = (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
136
140
  })
137
141
  });
138
142
  const TableHead = (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("thead", {
139
- className: require_icons_dev.cn("border-b border-subtle bg-soft/50", props.className),
143
+ className: require_link.cn("border-b border-subtle bg-soft/50", props.className),
140
144
  ...props
141
145
  });
142
146
  const TableBody = (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tbody", { ...props });
143
147
  const TableRow = (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("tr", {
144
- className: require_icons_dev.cn("border-b border-subtle last:border-0 even:bg-soft/10 hover:bg-soft/20 transition-colors", props.className),
148
+ className: require_link.cn("border-b border-subtle last:border-0 even:bg-soft/10 hover:bg-soft/20 transition-colors", props.className),
145
149
  ...props
146
150
  });
147
151
  const TableHeader = (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("th", {
148
- className: require_icons_dev.cn("px-4 py-3 font-semibold text-body text-xs font-mono", props.className),
152
+ className: require_link.cn("px-4 py-3 font-semibold text-body text-xs font-mono", props.className),
149
153
  ...props
150
154
  });
151
155
  const TableCell = (props) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("td", {
152
- className: require_icons_dev.cn("px-4 py-3 text-paragraph leading-relaxed", props.className),
156
+ className: require_link.cn("px-4 py-3 text-paragraph leading-relaxed", props.className),
153
157
  ...props
154
158
  });
155
159
  const TableComponents = {
@@ -168,35 +172,35 @@ const variantStyles = {
168
172
  container: "bg-slate-500/5 dark:bg-slate-500/10 border-slate-500/40 text-slate-800 dark:text-slate-200",
169
173
  titleText: "text-slate-900 dark:text-slate-100",
170
174
  iconColor: "text-slate-500",
171
- icon: require_icons_dev.Info,
175
+ icon: require_link.Info,
172
176
  defaultTitle: "Note"
173
177
  },
174
178
  info: {
175
179
  container: "bg-indigo-500/5 dark:bg-indigo-500/10 border-indigo-500/40 text-indigo-800 dark:text-indigo-200",
176
180
  titleText: "text-indigo-900 dark:text-indigo-100",
177
181
  iconColor: "text-indigo-500",
178
- icon: require_icons_dev.Info,
182
+ icon: require_link.Info,
179
183
  defaultTitle: "Info"
180
184
  },
181
185
  tip: {
182
186
  container: "bg-green-500/5 dark:bg-green-500/10 border-green-500/40 text-green-800 dark:text-green-200",
183
187
  titleText: "text-green-900 dark:text-green-100",
184
188
  iconColor: "text-green-500",
185
- icon: require_icons_dev.Lightbulb,
189
+ icon: require_link.Lightbulb,
186
190
  defaultTitle: "Tip"
187
191
  },
188
192
  warning: {
189
193
  container: "bg-amber-500/5 dark:bg-amber-500/10 border-amber-500/40 text-amber-800 dark:text-amber-200",
190
194
  titleText: "text-amber-900 dark:text-amber-100",
191
195
  iconColor: "text-amber-500",
192
- icon: require_icons_dev.AlertTriangle,
196
+ icon: require_link.AlertTriangle,
193
197
  defaultTitle: "Warning"
194
198
  },
195
199
  danger: {
196
200
  container: "bg-rose-500/5 dark:bg-rose-500/10 border-rose-500/40 text-rose-800 dark:text-rose-200",
197
201
  titleText: "text-rose-900 dark:text-rose-100",
198
202
  iconColor: "text-rose-500",
199
- icon: require_icons_dev.AlertCircle,
203
+ icon: require_link.AlertCircle,
200
204
  defaultTitle: "Danger"
201
205
  }
202
206
  };
@@ -204,15 +208,15 @@ function Callout({ children, className = "", variant = "note", title, ...props }
204
208
  const styles = variantStyles[variant] || variantStyles.note;
205
209
  const Icon = styles.icon;
206
210
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
207
- className: require_icons_dev.cn("my-6 flex gap-4 p-4 rounded-xl border-2", styles.container, className),
211
+ className: require_link.cn("my-6 flex gap-4 p-4 rounded-xl border-2", styles.container, className),
208
212
  ...props,
209
213
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
210
- className: require_icons_dev.cn("shrink-0 pt-0.5", styles.iconColor),
211
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, { className: "w-5 h-5 stroke-[2]" })
214
+ className: require_link.cn("shrink-0 pt-0.5", styles.iconColor),
215
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, { className: "w-5 h-5 stroke-2" })
212
216
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
213
217
  className: "flex-1 text-[0.875rem] leading-[1.6]",
214
218
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
215
- className: require_icons_dev.cn("font-bold text-sm mb-1", styles.titleText),
219
+ className: require_link.cn("font-bold text-sm mb-1", styles.titleText),
216
220
  children: title || styles.defaultTitle
217
221
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
218
222
  className: "prose prose-neutral dark:prose-invert max-w-none [&>p]:m-0 [&>p+p]:mt-2",
@@ -248,33 +252,14 @@ const copyToClipboard = async (text) => {
248
252
 
249
253
  //#endregion
250
254
  //#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
- };
270
255
  function useCodeBlock(props) {
271
256
  const [copied, setCopied] = (0, react.useState)(false);
272
257
  const [isExpanded, setIsExpanded] = (0, react.useState)(false);
273
258
  const [isExpandable, setIsExpandable] = (0, react.useState)(false);
259
+ const [rated, setRated] = (0, react.useState)(null);
274
260
  const preRef = (0, react.useRef)(null);
275
261
  const timerRef = (0, react.useRef)(null);
276
- const [rated, setRated] = (0, react.useState)(null);
277
- const customConfig = require_icons_dev.useConfig().integrations?.feedback?.custom;
262
+ const customConfig = require_link.useConfig().integrations?.feedback?.custom;
278
263
  const showCodeBlockFeedback = !!(customConfig?.enabled && !props.plain);
279
264
  const lang = props.lang || props["data-lang"] || "";
280
265
  const isHighlighted = props["data-highlighted"] === "true" || typeof props.className === "string" && props.className.includes("shiki");
@@ -326,7 +311,6 @@ function useCodeBlock(props) {
326
311
  const lines = (preRef.current?.textContent ?? "").trim().split("\n").length;
327
312
  setIsExpandable(lines > 6);
328
313
  }, [props.children, props.highlightedHtml]);
329
- const LangIcon = langIconMap[lang] || require_icons_dev.File;
330
314
  return {
331
315
  copied,
332
316
  isExpanded,
@@ -341,8 +325,7 @@ function useCodeBlock(props) {
341
325
  lang,
342
326
  showCodeBlockFeedback,
343
327
  rated,
344
- handleRate,
345
- LangIcon
328
+ handleRate
346
329
  };
347
330
  }
348
331
 
@@ -353,9 +336,9 @@ const CopyButton = ({ copied, handleCopy }) => {
353
336
  content: copied ? "Copied!" : "Copy code",
354
337
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_aria_components.Button, {
355
338
  onPress: handleCopy,
356
- 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", copied ? "text-emerald-400" : "text-muted hover:text-body"),
339
+ className: require_link.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", copied ? "text-emerald-400" : "text-muted hover:text-body"),
357
340
  "aria-label": "Copy code",
358
- children: copied ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons_dev.Check, { size: 20 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons_dev.Copy, { size: 20 })
341
+ children: copied ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_link.Check, { size: 20 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_link.Copy, { size: 20 })
359
342
  })
360
343
  });
361
344
  };
@@ -365,9 +348,9 @@ const CodeBlockFeedback = ({ rated, onRate }) => {
365
348
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_image.Tooltip, {
366
349
  content: rated === "up" ? "Helpful!" : "This code is helpful",
367
350
  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"),
351
+ onPress: (() => onRate("up")),
352
+ isDisabled: rated !== null,
353
+ className: require_link.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
354
  "aria-label": "Mark as helpful",
372
355
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
373
356
  xmlns: "http://www.w3.org/2000/svg",
@@ -383,9 +366,9 @@ const CodeBlockFeedback = ({ rated, onRate }) => {
383
366
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_image.Tooltip, {
384
367
  content: rated === "down" ? "Unhelpful" : "This code is unhelpful",
385
368
  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"),
369
+ onPress: (() => onRate("down")),
370
+ isDisabled: rated !== null,
371
+ className: require_link.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
372
  "aria-label": "Mark as unhelpful",
390
373
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
391
374
  xmlns: "http://www.w3.org/2000/svg",
@@ -404,17 +387,14 @@ const CodeBlockFeedback = ({ rated, onRate }) => {
404
387
  function CodeBlock(props) {
405
388
  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;
406
389
  const { className: shikiClassName, ...cleanRest } = rest;
407
- const { copied, isExpanded, setIsExpanded, isExpandable, preRef, handleCopy, shouldTruncate, isHighlighted, effectiveHighlightedHtml, effectiveTitle, showCodeBlockFeedback, rated, handleRate, LangIcon } = useCodeBlock(props);
390
+ const { copied, isExpanded, setIsExpanded, isExpandable, preRef, handleCopy, shouldTruncate, isHighlighted, effectiveHighlightedHtml, effectiveTitle, showCodeBlockFeedback, rated, handleRate } = useCodeBlock(props);
408
391
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_image.CodeBlock, {
409
392
  plain,
410
393
  className: props.className,
411
394
  children: [(effectiveTitle || !hideCopy) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_image.CodeBlockHeader, {
412
- className: require_icons_dev.cn({ "absolute top-2 left-0 w-full": !effectiveTitle }),
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, {
414
- size: 14,
415
- className: "opacity-60"
416
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: effectiveTitle })] }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
417
- className: "flex items-center gap-1",
395
+ className: require_link.cn({ "absolute top-2 left-0 w-full": !effectiveTitle }),
396
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_image.CodeBlockGroup, { children: effectiveTitle && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: effectiveTitle }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
397
+ className: "flex items-center gap-1 bg-(--color-code-bg) pl-2 z-10",
418
398
  children: [showCodeBlockFeedback && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CodeBlockFeedback, {
419
399
  rated,
420
400
  onRate: handleRate
@@ -431,14 +411,14 @@ function CodeBlock(props) {
431
411
  dangerouslySetInnerHTML: { __html: effectiveHighlightedHtml }
432
412
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("pre", {
433
413
  ref: preRef,
434
- className: require_icons_dev.cn("m-0! rounded-none! border-none! bg-transparent!", "text-[0.875rem] leading-[1.6] overflow-x-auto", shikiClassName, {
414
+ className: require_link.cn("m-0! rounded-none! border-none! bg-transparent!", "text-[0.875rem] leading-[1.6] overflow-x-auto", shikiClassName, {
435
415
  "p-0! [&>code]:grid! [&>code]:p-5! [&>code]:bg-transparent!": isHighlighted,
436
416
  "p-5!": !isHighlighted
437
417
  }),
438
418
  ...cleanRest,
439
419
  children
440
420
  }), isExpandable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
441
- className: require_icons_dev.cn({
421
+ className: require_link.cn({
442
422
  "absolute bottom-0 inset-x-0 h-32 flex items-end justify-center pb-4 z-10": shouldTruncate,
443
423
  "relative flex justify-center pb-4 pt-1 -mt-4": !shouldTruncate
444
424
  }),
@@ -470,7 +450,7 @@ const Image = ({ src, alt, title, theme, className, ...props }) => {
470
450
  theme,
471
451
  loading: "lazy",
472
452
  decoding: "async",
473
- className: require_icons_dev.cn("w-full h-auto object-contain transition-transform duration-500 group-hover:scale-[1.01] my-0 rounded-md sm:rounded-xl block", className),
453
+ className: require_link.cn("w-full h-auto object-contain transition-transform duration-500 group-hover:scale-[1.01] my-0 rounded-md sm:rounded-xl block", className),
474
454
  ...props
475
455
  })
476
456
  }), caption && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("figcaption", {
@@ -502,7 +482,7 @@ function Card({ className, title, icon, href, children, ...props }) {
502
482
  ref: cardRef,
503
483
  href,
504
484
  onMouseMove: handleMouseMove,
505
- className: require_icons_dev.cn("group relative flex flex-col gap-3 rounded-2xl border p-6 overflow-hidden", "transition-[box-shadow,transform] duration-300", "hover:shadow-lg dark:hover:shadow-none hover:-translate-y-0.5", "bg-surface border-subtle text-paragraph", href && "cursor-pointer", className),
485
+ className: require_link.cn("group relative flex flex-col gap-3 rounded-2xl border p-6 overflow-hidden", "transition-[box-shadow,transform] duration-300", "hover:shadow-lg dark:hover:shadow-none hover:-translate-y-0.5", "bg-surface border-subtle text-paragraph", href && "cursor-pointer", className),
506
486
  ...props,
507
487
  children: [
508
488
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -522,7 +502,7 @@ function Card({ className, title, icon, href, children, ...props }) {
522
502
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
523
503
  className: "relative z-10 flex items-center gap-3",
524
504
  children: [icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
525
- className: require_icons_dev.cn("shrink-0 transition-transform duration-500 group-hover:rotate-[15deg] group-hover:scale-110 flex items-center justify-center text-muted group-hover:text-primary-500", "[&>svg]:w-6 [&>svg]:h-6 [&>svg]:stroke-[1.5]"),
505
+ className: require_link.cn("shrink-0 transition-transform duration-500 group-hover:rotate-15 group-hover:scale-110 flex items-center justify-center text-muted group-hover:text-primary-500", "[&>svg]:w-6 [&>svg]:h-6 [&>svg]:stroke-[1.5]"),
526
506
  children: icon
527
507
  }), title && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
528
508
  className: "font-semibold text-base m-0 leading-none text-body",
@@ -541,7 +521,7 @@ function Card({ className, title, icon, href, children, ...props }) {
541
521
  //#region src/client/components/mdx/cards.tsx
542
522
  function Cards({ children, className, cols = 2, ...props }) {
543
523
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
544
- className: require_icons_dev.cn("grid gap-4 my-6", {
524
+ className: require_link.cn("grid gap-4 my-6", {
545
525
  "grid-cols-1": cols === 1,
546
526
  "grid-cols-1 sm:grid-cols-2": cols === 2,
547
527
  "grid-cols-1 sm:grid-cols-2 md:grid-cols-3": cols === 3,
@@ -576,6 +556,184 @@ function LastUpdated({ date }) {
576
556
  });
577
557
  }
578
558
 
559
+ //#endregion
560
+ //#region src/client/components/mdx/timeline.tsx
561
+ const VARIANT_PALETTE = {
562
+ primary: {
563
+ ring: "border-primary-500/70",
564
+ fill: "bg-primary-500",
565
+ badgeBg: "bg-primary-500/10",
566
+ badgeText: "text-primary-600 dark:text-primary-400",
567
+ badgeBorder: "border-primary-500/30"
568
+ },
569
+ success: {
570
+ ring: "border-success-500/70",
571
+ fill: "bg-success-500",
572
+ badgeBg: "bg-success-500/10",
573
+ badgeText: "text-success-500",
574
+ badgeBorder: "border-success-500/30"
575
+ },
576
+ info: {
577
+ ring: "border-info-500/70",
578
+ fill: "bg-info-500",
579
+ badgeBg: "bg-info-500/10",
580
+ badgeText: "text-info-500",
581
+ badgeBorder: "border-info-500/30"
582
+ },
583
+ warning: {
584
+ ring: "border-warning-500/70",
585
+ fill: "bg-warning-500",
586
+ badgeBg: "bg-warning-500/10",
587
+ badgeText: "text-warning-500",
588
+ badgeBorder: "border-warning-500/30"
589
+ },
590
+ danger: {
591
+ ring: "border-danger-500/70",
592
+ fill: "bg-danger-500",
593
+ badgeBg: "bg-danger-500/10",
594
+ badgeText: "text-danger-500",
595
+ badgeBorder: "border-danger-500/30"
596
+ },
597
+ major: {
598
+ ring: "",
599
+ fill: "",
600
+ badgeBg: "",
601
+ badgeText: "",
602
+ badgeBorder: ""
603
+ },
604
+ minor: {
605
+ ring: "",
606
+ fill: "",
607
+ badgeBg: "",
608
+ badgeText: "",
609
+ badgeBorder: ""
610
+ },
611
+ patch: {
612
+ ring: "",
613
+ fill: "",
614
+ badgeBg: "",
615
+ badgeText: "",
616
+ badgeBorder: ""
617
+ },
618
+ new: {
619
+ ring: "",
620
+ fill: "",
621
+ badgeBg: "",
622
+ badgeText: "",
623
+ badgeBorder: ""
624
+ },
625
+ deprecated: {
626
+ ring: "",
627
+ fill: "",
628
+ badgeBg: "",
629
+ badgeText: "",
630
+ badgeBorder: ""
631
+ },
632
+ breaking: {
633
+ ring: "",
634
+ fill: "",
635
+ badgeBg: "",
636
+ badgeText: "",
637
+ badgeBorder: ""
638
+ }
639
+ };
640
+ Object.assign(VARIANT_PALETTE, {
641
+ major: VARIANT_PALETTE.primary,
642
+ minor: VARIANT_PALETTE.success,
643
+ patch: VARIANT_PALETTE.info,
644
+ new: VARIANT_PALETTE.primary,
645
+ deprecated: VARIANT_PALETTE.warning,
646
+ breaking: VARIANT_PALETTE.danger
647
+ });
648
+ function normalizeBadge(badge) {
649
+ if (!badge) return null;
650
+ if (typeof badge === "string") return {
651
+ text: badge,
652
+ variant: "primary"
653
+ };
654
+ return {
655
+ text: badge.text,
656
+ variant: badge.variant ?? "primary"
657
+ };
658
+ }
659
+ function formatDate(date, locale) {
660
+ if (date === void 0 || date === null || date === "") return null;
661
+ const d = date instanceof Date ? date : new Date(date);
662
+ if (Number.isNaN(d.getTime())) return null;
663
+ return d.toLocaleDateString(locale ?? "en-US", {
664
+ year: "numeric",
665
+ month: "short",
666
+ day: "numeric"
667
+ });
668
+ }
669
+ const VARIANT_DEFAULT_ICON = {
670
+ success: require_link.Check,
671
+ info: require_link.Info,
672
+ warning: require_link.AlertTriangle,
673
+ danger: require_link.AlertCircle
674
+ };
675
+ function TimelineRoot({ children, className, compact = false, ...props }) {
676
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("ol", {
677
+ role: "list",
678
+ className: require_link.cn("relative my-8 ms-3", compact ? "space-y-3" : "space-y-7", className),
679
+ ...props,
680
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
681
+ "aria-hidden": "true",
682
+ className: "pointer-events-none absolute top-3 bottom-3 start-[5.5px] w-px bg-subtle"
683
+ }), children]
684
+ });
685
+ }
686
+ function TimelineItem({ date, title, badge, icon, variant = "primary", locale, className, children, ...props }) {
687
+ const palette = VARIANT_PALETTE[variant] ?? VARIANT_PALETTE.primary;
688
+ const formatted = formatDate(date, locale);
689
+ const badgeCfg = normalizeBadge(badge);
690
+ const FallbackIcon = VARIANT_DEFAULT_ICON[variant];
691
+ const dot = icon ?? (FallbackIcon ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(FallbackIcon, {
692
+ size: 12,
693
+ className: "text-white",
694
+ "aria-hidden": "true"
695
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
696
+ "aria-hidden": "true",
697
+ className: require_link.cn("w-2 h-2 rounded-full", palette.fill)
698
+ }));
699
+ const ariaLabel = [formatted, typeof title === "string" ? title : null].filter(Boolean).join(" - ") || void 0;
700
+ const a11yProps = ariaLabel ? {
701
+ role: "img",
702
+ "aria-label": ariaLabel
703
+ } : { "aria-hidden": "true" };
704
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("li", {
705
+ className: require_link.cn("relative ps-8", className),
706
+ ...props,
707
+ children: [
708
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
709
+ ...a11yProps,
710
+ className: require_link.cn("absolute start-0 top-1 flex items-center justify-center w-3 h-3 rounded-full", "bg-surface border-2 shadow-sm", palette.ring),
711
+ children: dot
712
+ }),
713
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
714
+ className: "flex items-center gap-2 flex-wrap mb-1",
715
+ children: [formatted && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("time", {
716
+ dateTime: date instanceof Date ? date.toISOString() : new Date(date).toISOString(),
717
+ className: "text-[11px] uppercase tracking-wider font-mono tabular-nums text-muted select-none",
718
+ children: formatted
719
+ }), badgeCfg && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
720
+ className: require_link.cn("inline-flex items-center px-2 py-0.5 rounded-full text-[10px] font-bold uppercase tracking-wide border", palette.badgeBg, palette.badgeText, palette.badgeBorder),
721
+ children: badgeCfg.text
722
+ })]
723
+ }),
724
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
725
+ className: "text-base font-semibold text-body m-0 leading-snug",
726
+ children: title
727
+ }),
728
+ children && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
729
+ className: "mt-2 text-[0.9rem] leading-[1.6] text-paragraph prose prose-neutral dark:prose-invert max-w-none [&>p]:m-0 [&>p+p]:mt-2 [&_a]:text-primary-500 [&_a]:no-underline hover:[&_a]:underline",
730
+ children
731
+ })
732
+ ]
733
+ });
734
+ }
735
+ const Timeline = Object.assign(TimelineRoot, { Item: TimelineItem });
736
+
579
737
  //#endregion
580
738
  //#region src/client/components/mdx/index.ts
581
739
  const mdx_components_default = {
@@ -587,10 +745,17 @@ const mdx_components_default = {
587
745
  Field,
588
746
  Callout,
589
747
  Card,
590
- Cards
748
+ Cards,
749
+ Timeline
591
750
  };
592
751
 
593
752
  //#endregion
753
+ Object.defineProperty(exports, 'Timeline', {
754
+ enumerable: true,
755
+ get: function () {
756
+ return Timeline;
757
+ }
758
+ });
594
759
  Object.defineProperty(exports, 'copyToClipboard', {
595
760
  enumerable: true,
596
761
  get: function () {
@@ -3,4 +3,4 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- const e=require(`./chunk-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;
6
+ const e=require(`./chunk-D1Md3oWO.cjs`);let t=require(`node:path`);t=e.r(t);let n=require(`@bdocs/dui`),r=require(`fdir`),i=require(`node:fs/promises`);i=e.r(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;
@@ -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
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../chunk-D1Md3oWO.cjs`),t=require(`../utils-D6Xtj0FZ.cjs`);let n=require(`node:path`);n=e.r(n);let r=require(`node:fs/promises`);r=e.r(r);let i=require(`node:crypto`);i=e.r(i);let a=require(`node:zlib`);a=e.r(a);let o=require(`node:util`),s=require(`lru-cache`);const c=r.default.writeFile,l=r.default.readFile,u=r.default.mkdir,d=r.default.rename,f=(0,o.promisify)(a.default.gzip),p=(0,o.promisify)(a.default.gunzip),m=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 h=class{entries=new Map;cachePath=null;compress;loaded=!1;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(!this.loaded&&!t.o().noCache&&this.cachePath)try{let e=await l(this.cachePath);this.cachePath.endsWith(`.gz`)&&(e=await p(new Uint8Array(e)));let t=JSON.parse(e.toString(`utf-8`));this.entries=new Map(Object.entries(t)),this.loaded=!0}catch(e){if(e instanceof Error&&e.code===`ENOENT`)return}}save(){if(t.o().noCache||!this.cachePath)return;let e=Object.fromEntries(this.entries),r=JSON.stringify(e),a=this.cachePath,o=this.compress;m.add(async()=>{try{await u(n.default.dirname(a),{recursive:!0});let e=Buffer.from(r);o&&(e=await f(e));let t=`${a}.${i.default.randomBytes(4).toString(`hex`)}.tmp`;await c(t,e),await d(t,a)}catch{}})}get(e){let n=this.entries.get(e);return!n||t.s(e)!==n.mtime?null:n.data}getStale(e){let t=this.entries.get(e);return t?t.data:null}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(),this.loaded=!1}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 m.flush()}},g=class{index=new Map;memoryCache;baseDir;shardsDir;indexPath;saveTimeout=null;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 s.LRUCache({max:i.lruLimit,ttl:i.lruTTL,updateAgeOnGet:!0})}async load(){if(!t.o().noCache)try{let e=await l(this.indexPath,`utf-8`);this.index=new Map(Object.entries(JSON.parse(e)))}catch(e){if(e instanceof Error&&e.code===`ENOENT`)return}}save(){if(t.o().noCache)return;let e=JSON.stringify(Object.fromEntries(this.index)),r=this.indexPath;m.add(async()=>{try{await u(n.default.dirname(r),{recursive:!0}),await c(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 l(r),n=(await p(new Uint8Array(t))).toString(`utf-8`);return this.memoryCache.set(e,n),{key:e,val:n}}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 p(await l(i))).toString(`utf-8`);return this.memoryCache.set(e,t),t}catch(e){return e instanceof Error&&e.code,null}}set(e,t){let a=i.default.createHash(`md5`).update(t).digest(`hex`);this.index.set(e,a),this.memoryCache.set(e,t);let o=n.default.resolve(this.shardsDir,`${a}.gz`);m.add(async()=>{try{try{await r.default.access(o);return}catch{}await u(this.shardsDir,{recursive:!0});let e=await f(new Uint8Array(Buffer.from(t))),n=`${o}.${i.default.randomBytes(4).toString(`hex`)}.tmp`;await c(n,new Uint8Array(e)),await d(n,o)}catch{}}),this.saveTimeout&&clearTimeout(this.saveTimeout),this.saveTimeout=setTimeout(()=>{this.save()},500),typeof this.saveTimeout.unref==`function`&&this.saveTimeout.unref()}get size(){return this.index.size}async flush(){await m.flush()}};async function _(){await m.flush()}exports.FileCache=h,exports.TransformCache=g,exports.flushCache=_,exports.globalBackgroundQueue=m;
@@ -0,0 +1,84 @@
1
+
2
+ //#region src/node/cache.d.ts
3
+ /**
4
+ * Simple background task queue to prevent blocking the main thread during IO.
5
+ */
6
+ declare class BackgroundQueue {
7
+ private activeTasks;
8
+ add(task: () => Promise<void>): void;
9
+ flush(): Promise<void>;
10
+ get pending(): number;
11
+ }
12
+ declare const globalBackgroundQueue: BackgroundQueue;
13
+ /**
14
+ * Generic file-based cache with per-file granularity and asynchronous persistence.
15
+ */
16
+ declare class FileCache<T> {
17
+ private entries;
18
+ private readonly cachePath;
19
+ private readonly compress;
20
+ private loaded;
21
+ constructor(options?: {
22
+ name?: string;
23
+ root?: string;
24
+ compress?: boolean;
25
+ });
26
+ /**
27
+ * Loads the cache.
28
+ */
29
+ load(): Promise<void>;
30
+ /**
31
+ * Saves the cache in the background.
32
+ */
33
+ save(): void;
34
+ get(filePath: string): T | null;
35
+ getStale(filePath: string): T | null;
36
+ set(filePath: string, data: T): void;
37
+ isValid(filePath: string): boolean;
38
+ invalidate(filePath: string): void;
39
+ invalidateAll(): void;
40
+ pruneStale(currentFiles: Set<string>): void;
41
+ get size(): number;
42
+ flush(): Promise<void>;
43
+ }
44
+ /**
45
+ * Sharded Cache: Optimized for large-scale data (like MDX transformations).
46
+ * Uses a memory index and individual files for each entry to avoid massive JSON parsing.
47
+ */
48
+ declare class TransformCache {
49
+ private index;
50
+ private memoryCache;
51
+ private readonly baseDir;
52
+ private readonly shardsDir;
53
+ private readonly indexPath;
54
+ private saveTimeout;
55
+ constructor(name: string, root?: string);
56
+ /**
57
+ * Loads the index into memory.
58
+ */
59
+ load(): Promise<void>;
60
+ /**
61
+ * Persists the index in background.
62
+ */
63
+ save(): void;
64
+ /**
65
+ * Batch Read: Retrieves multiple transformation results concurrently.
66
+ */
67
+ getMany(keys: string[]): Promise<Map<string, string>>;
68
+ /**
69
+ * Retrieves a cached transformation asynchronously. Fast lookup via index, lazy loading from disk.
70
+ */
71
+ getAsync(key: string): Promise<string | null>;
72
+ /**
73
+ * Stores a transformation result.
74
+ */
75
+ set(key: string, result: string): void;
76
+ get size(): number;
77
+ flush(): Promise<void>;
78
+ }
79
+ /**
80
+ * Flushes all pending background cache operations.
81
+ */
82
+ declare function flushCache(): Promise<void>;
83
+ //#endregion
84
+ export { FileCache, TransformCache, flushCache, globalBackgroundQueue };