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.
- package/README.md +2 -18
- package/dist/{adapters-DEXNIv3x.mjs → adapters-ByYY44Zy.mjs} +1 -1
- package/dist/{adapters-C5AWWGfb.cjs → adapters-DvmtpdSF.cjs} +1 -1
- package/dist/{banner-CfdalYLL.d.ts → banner-BMop1KLF.d.ts} +2 -2
- package/dist/{banner-DNSkgUsO.d.cts → banner-CVD0GugR.d.cts} +2 -2
- package/dist/cache-CO4Dy2uQ.cjs +6 -0
- package/dist/cache-Dk53iOo6.mjs +6 -0
- package/dist/chunk-BFSpntXv.mjs +6 -0
- package/dist/{chunk-Ds5LZdWN.cjs → chunk-D1Md3oWO.cjs} +1 -1
- package/dist/client/index.cjs +433 -272
- package/dist/client/index.d.cts +129 -18
- package/dist/client/index.d.ts +129 -18
- package/dist/client/index.js +337 -178
- package/dist/client/mdx.cjs +1 -1
- package/dist/client/mdx.d.cts +1 -1
- package/dist/client/mdx.d.ts +1 -1
- package/dist/client/mdx.js +1 -1
- package/dist/client/primitives.cjs +7 -7
- package/dist/client/primitives.d.cts +5 -22
- package/dist/client/primitives.d.ts +5 -22
- package/dist/client/primitives.js +4 -4
- package/dist/client/theme/neutral.css +1 -3
- package/dist/client/theme/reset.css +31 -4
- package/dist/config-BpzaPsJj.d.cts +781 -0
- package/dist/config-CCXp3aXO.mjs +7 -0
- package/dist/{config-JGkMJoJQ.cjs → config-CMd4XoFq.cjs} +1 -1
- package/dist/config-DlGoEM9D.cjs +7 -0
- package/dist/config-xtS0ZkMm.d.mts +781 -0
- package/dist/{csp-CBysWlAf.cjs → csp-CRp_3U7a.cjs} +1 -1
- package/dist/csp-oTC2ygvF.mjs +6 -0
- package/dist/{docs-layout-6FQ8__ok.js → docs-layout-BdtZ9z6s.js} +9 -28
- package/dist/{docs-layout-3TpAt6MB.cjs → docs-layout-CFWI15Id.cjs} +69 -88
- package/dist/{doctor-BR1B2Mkz.cjs → doctor-BBtmNJE0.cjs} +1 -1
- package/dist/doctor-Bv16QSrI.cjs +7 -0
- package/dist/doctor-DOAbSaiL.mjs +7 -0
- package/dist/{generator-DtUU3Cfk.cjs → generator-COepVWGi.cjs} +1 -1
- package/dist/{handler-Btd4t_67.mjs → handler-DzQae4eA.mjs} +1 -1
- package/dist/{handler-Dzf4dSnV.cjs → handler-XX7cLTqe.cjs} +1 -1
- package/dist/headers-Ddwek8K7.mjs +6 -0
- package/dist/{headers-BXKxiPUv.cjs → headers-dg4SDrjY.cjs} +1 -1
- package/dist/{image-C9md50h2.js → image-Bz87fCla.js} +2 -2
- package/dist/{image-CR6UlaI5.cjs → image-C4TlpMHn.cjs} +18 -18
- package/dist/link-2PzgTnaP.js +673 -0
- package/dist/{icons-dev-BryEFkJu.cjs → link-D1Gjkb-2.cjs} +8 -353
- package/dist/{mdx-DhyMkc35.js → mdx-BuO6a1f7.js} +199 -40
- package/dist/{mdx-DJBg5DuL.cjs → mdx-CD-tSjRG.cjs} +237 -72
- package/dist/{meta-loader-C9MKjAs0.cjs → meta-loader-Dq1zcFnh.cjs} +1 -1
- package/dist/node/cache.cjs +6 -0
- package/dist/node/cache.d.cts +84 -0
- package/dist/node/cache.d.mts +84 -0
- package/dist/node/cache.mjs +6 -0
- package/dist/node/cli-entry.cjs +6 -6
- package/dist/node/cli-entry.mjs +9 -9
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.d.cts +27 -638
- package/dist/node/index.d.mts +27 -640
- package/dist/node/index.mjs +1 -1
- package/dist/node/mdx/shiki-adapter.cjs +6 -0
- package/dist/node/mdx/shiki-adapter.d.cts +51 -0
- package/dist/node/mdx/shiki-adapter.d.mts +51 -0
- package/dist/node/mdx/shiki-adapter.mjs +6 -0
- package/dist/node-BXtqM1uH.mjs +6 -0
- package/dist/node-BlVk4EVg.cjs +104 -0
- package/dist/node-DOf4zhWc.mjs +104 -0
- package/dist/node-aD1eisrR.cjs +6 -0
- package/dist/{package-CEDhVAfO.cjs → package-BcISI5-P.cjs} +1 -1
- package/dist/{package-_dCCKVvG.mjs → package-CCYEAYeA.mjs} +1 -1
- package/dist/{pages-external-CX2uyW95.cjs → pages-external-XkYIs-d5.cjs} +1 -1
- package/dist/parser-DCiEWkSk.cjs +8 -0
- package/dist/parser-qk9FIHJ7.mjs +8 -0
- package/dist/plugin-C95kvu6h.mjs +73 -0
- package/dist/plugin-DM3u2bVj.cjs +73 -0
- package/dist/routes-BW6zsk7Z.mjs +6 -0
- package/dist/routes-BgoIB5wb.cjs +6 -0
- package/dist/{routes-BajCwrvX.cjs → routes-CORVxc02.cjs} +1 -1
- package/dist/{search-dialog-D4rplZMv.cjs → search-dialog-B1NERUNx.cjs} +101 -55
- package/dist/{search-dialog-Cx7aGW3U.cjs → search-dialog-BRFno7HD.cjs} +8 -8
- package/dist/{search-dialog-DDopgbKM.js → search-dialog-BmxHiKwt.js} +2 -2
- package/dist/{search-dialog-BNdRV60O.js → search-dialog-D6TvjcuV.js} +1 -1
- package/dist/{search-dialog-DaeSPvEo.js → search-dialog-DFnlx8LO.js} +44 -4
- package/dist/{search-dialog-CW1f6dn6.cjs → search-dialog-DHqwjJuG.cjs} +1 -1
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.d.mts +1 -1
- package/dist/server/index.mjs +1 -1
- package/dist/shiki-adapter-CoQ6jyJ4.cjs +6 -0
- package/dist/shiki-adapter-D-aKw7PP.mjs +6 -0
- package/dist/sidebar-COTaMHR-.d.ts +1100 -0
- package/dist/sidebar-CrEdJuHX.d.cts +1100 -0
- package/dist/{types-generator-CYcHkDzZ.cjs → types-generator-BXhv7Ill.cjs} +1 -1
- package/dist/types-generator-bDPvUztF.mjs +26 -0
- package/dist/utils-Crm9oPcV.mjs +7 -0
- package/dist/utils-D6Xtj0FZ.cjs +7 -0
- package/package.json +26 -12
- package/src/shared/types.ts +532 -23
- package/dist/cache-DETwlACe.cjs +0 -6
- package/dist/cache-SF59enb3.mjs +0 -6
- package/dist/config-B5uVv5q4.cjs +0 -7
- package/dist/config-D3_zDkHh.mjs +0 -7
- package/dist/csp-gaZ51xzq.mjs +0 -6
- package/dist/doctor-3MheVMwd.mjs +0 -7
- package/dist/doctor-DQxLM202.cjs +0 -7
- package/dist/headers-CXyf0auY.mjs +0 -6
- package/dist/icons-dev-kJyGWNeg.js +0 -916
- package/dist/node-B9JSyEIU.mjs +0 -105
- package/dist/node-Cedquois.cjs +0 -105
- package/dist/parser-CNIPHx4s.cjs +0 -8
- package/dist/parser-D0QHIQsi.mjs +0 -8
- package/dist/plugin-WYNORxp1.cjs +0 -68
- package/dist/plugin-YWNVRpws.mjs +0 -68
- package/dist/rolldown-runtime-fkIsjY3S.mjs +0 -6
- package/dist/routes-CyrnmVuG.mjs +0 -6
- package/dist/routes-D6Tuu7Fs.cjs +0 -6
- package/dist/shiki-adapter-CGTmrR6S.cjs +0 -6
- package/dist/shiki-adapter-CXEGRnjr.mjs +0 -6
- package/dist/shiki-adapter-Mr8_oT_9.cjs +0 -6
- package/dist/sidebar-7gIifpBX.d.cts +0 -615
- package/dist/sidebar-BAKgJ-Er.d.ts +0 -615
- package/dist/types-generator-DVOnRVKU.mjs +0 -26
- package/dist/utils-B3xYMrpK.mjs +0 -7
- package/dist/utils-Bz1tG9Dg.cjs +0 -7
- /package/dist/{errors-C0Hx15Ag.mjs → errors-0zGHRLue.mjs} +0 -0
- /package/dist/{errors-Dx6JHoKE.cjs → errors-vKw8CkiX.cjs} +0 -0
- /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
|
|
7
|
-
const require_image = require('./image-
|
|
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)(
|
|
47
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_link.Link, {
|
|
48
48
|
href: href || "",
|
|
49
|
-
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
211
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Icon, { className: "w-5 h-5 stroke-
|
|
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:
|
|
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
|
|
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:
|
|
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)(
|
|
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
|
-
|
|
370
|
-
className:
|
|
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
|
-
|
|
388
|
-
className:
|
|
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
|
|
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:
|
|
413
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_image.CodeBlockGroup, { children: effectiveTitle && /* @__PURE__ */ (0, react_jsx_runtime.
|
|
414
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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-
|
|
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 };
|