boltdocs 2.7.11 → 2.8.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 -54
- package/dist/banner-3N4Jd_L9.d.ts +100 -0
- package/dist/banner-MynZD_Ox.d.cts +100 -0
- package/dist/cache-BMUyNiiA.mjs +6 -0
- package/dist/cache-CKm45d2w.cjs +6 -0
- package/dist/client/index.cjs +782 -443
- package/dist/client/index.d.cts +86 -110
- package/dist/client/index.d.ts +87 -111
- package/dist/client/index.js +773 -439
- package/dist/client/mdx.cjs +8 -3
- package/dist/client/mdx.d.cts +39 -93
- package/dist/client/mdx.d.ts +38 -93
- package/dist/client/mdx.js +3 -3
- package/dist/client/primitives.cjs +7 -7
- package/dist/client/primitives.d.cts +411 -347
- package/dist/client/primitives.d.ts +411 -347
- package/dist/client/primitives.js +4 -4
- package/dist/client/theme/neutral.css +1 -1
- package/dist/{docs-layout-BXHV0xw_.cjs → docs-layout-CwCq42Zt.cjs} +95 -178
- package/dist/{docs-layout-DwFndmj5.js → docs-layout-Dn6S5g59.js} +99 -163
- package/dist/doctor-BArviV8X.cjs +28 -0
- package/dist/doctor-CgLA7_Uv.mjs +28 -0
- package/dist/{doctor-CrytFkqW.cjs → doctor-DyNUVe96.cjs} +1 -1
- package/dist/{routes-DP1vmWRj.cjs → doctor-aN_leTbh.mjs} +1 -1
- package/dist/{generator-ClVanhvi.mjs → generator-BHCrLU6h.mjs} +2 -2
- package/dist/{generator-CHqxiQhF.cjs → generator-CC2yHzhZ.cjs} +2 -2
- package/dist/{icons-dev-3cZMyt8r.cjs → icons-dev-DvJ-hh9x.cjs} +116 -111
- package/dist/{icons-dev-Df8OQ481.js → icons-dev-Oju24Wjp.js} +120 -114
- package/dist/{image-DtrI2cw3.cjs → image-Ch4-GxdO.cjs} +13 -13
- package/dist/{image-jxPb-2iV.js → image-Do8V9PCW.js} +13 -13
- package/dist/{mdx-UTTLFWJq.js → mdx-5oeCOFhH.js} +111 -81
- package/dist/{mdx-BdWkJTeB.cjs → mdx-BGM7LjW5.cjs} +109 -97
- package/dist/node/cli-entry.cjs +3 -1
- package/dist/node/cli-entry.mjs +3 -1
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.d.cts +258 -152
- package/dist/node/index.d.mts +258 -150
- package/dist/node/index.mjs +1 -1
- package/dist/node/routes/worker.cjs +1 -1
- package/dist/node/routes/worker.mjs +1 -1
- package/dist/node-CefnjllX.cjs +159 -0
- package/dist/node-DruKROCt.mjs +159 -0
- package/dist/package-CmP_9rJ8.cjs +6 -0
- package/dist/{package-K0zsjGIz.mjs → package-DpbnBMR1.mjs} +1 -1
- package/dist/parser-B0YtJPDz.mjs +6 -0
- package/dist/parser-B7-6PyQz.cjs +6 -0
- package/dist/{parser-Aq8LoH-0.cjs → parser-BzB-zCkF.cjs} +1 -1
- package/dist/routes-ChS-zgzh.mjs +6 -0
- package/dist/routes-DJNJ-rTt.cjs +6 -0
- package/dist/routes-DiYC4nD2.cjs +6 -0
- package/dist/routes-rKlxFkqq.mjs +6 -0
- package/dist/{search-dialog-C7xuvyNk.cjs → search-dialog-BXVoecTx.cjs} +175 -78
- package/dist/{search-dialog-BwkDuI9R.cjs → search-dialog-BYhOov4S.cjs} +118 -7
- package/dist/{search-dialog-D-DDN7zJ.js → search-dialog-C09riYmx.js} +113 -8
- package/dist/{search-dialog-CIQg6k8c.cjs → search-dialog-CUeAfy-8.cjs} +1 -1
- package/dist/{search-dialog-BNF10tDl.js → search-dialog-D8gLkhUV.js} +158 -80
- package/dist/{search-dialog-BHuIiUC6.js → search-dialog-DHc_8FFX.js} +1 -1
- package/dist/{sidebar-CyZS9YOm.d.ts → sidebar-DNq4_ZAa.d.ts} +117 -51
- package/dist/{sidebar-CcBkrm06.d.cts → sidebar-Dlkgbxs6.d.cts} +117 -51
- package/dist/utils-BYITg7T5.mjs +7 -0
- package/dist/utils-Cjmx1hhk.cjs +7 -0
- package/dist/worker-pool-CtqklOXq.cjs +6 -0
- package/dist/worker-pool-k0DY6k8T.mjs +6 -0
- package/package.json +3 -3
- package/src/shared/config-utils.ts +4 -0
- package/src/shared/types.ts +52 -6
- package/dist/cache-Ba-DZQNH.cjs +0 -6
- package/dist/cache-BuMZ58L5.mjs +0 -6
- package/dist/cards-BakZPTz9.d.ts +0 -30
- package/dist/cards-CQn9mXZS.d.cts +0 -30
- package/dist/doctor-Be7Ly1oM.mjs +0 -21
- package/dist/doctor-jMxWZyLJ.cjs +0 -21
- package/dist/node-BSM4qcDK.cjs +0 -111
- package/dist/node-BspZN3R2.mjs +0 -111
- package/dist/package-DIIrjuWI.cjs +0 -6
- package/dist/parser-CdNbqN5y.cjs +0 -6
- package/dist/parser-nE792MLO.mjs +0 -6
- package/dist/rolldown-runtime-fkIsjY3S.mjs +0 -6
- package/dist/routes-2k3tbUmC.cjs +0 -6
- package/dist/routes-CpxZIsMM.mjs +0 -6
- package/dist/utils-CG65J0Sc.mjs +0 -7
- package/dist/utils-CKunkU96.cjs +0 -7
- package/dist/worker-pool-CGn7DrLb.mjs +0 -6
- package/dist/worker-pool-Crbqgw5R.cjs +0 -6
- /package/dist/{meta-loader-CWg2gnbY.mjs → meta-loader-DzwDFtdT.mjs} +0 -0
|
@@ -3,58 +3,82 @@
|
|
|
3
3
|
* Copyright (c) 2026 Jesus Alcala
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
import {
|
|
6
|
+
import { A as ChevronRight, D as Check, Q as icons_exports, S as normalizePath, _ as Link$1, b as useLocalizedTo, et as useConfig, k as ChevronLeft, y as cn } from "./icons-dev-Oju24Wjp.js";
|
|
7
|
+
import { Children, createContext, use, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
7
8
|
import { useLocation } from "react-router-dom";
|
|
8
|
-
import { Children, Component, createContext, use, useContext, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
9
9
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
10
10
|
import * as RAC from "react-aria-components";
|
|
11
11
|
import { Breadcrumb, Breadcrumbs, Popover } from "react-aria-components";
|
|
12
12
|
import virtualIcons from "virtual:boltdocs-icons";
|
|
13
13
|
import scrollIntoView from "scroll-into-view-if-needed";
|
|
14
14
|
|
|
15
|
+
//#region src/client/app/ui-context.tsx
|
|
16
|
+
const UIContext = createContext(void 0);
|
|
17
|
+
function UIProvider({ children }) {
|
|
18
|
+
const [isSidebarOpen, setIsSidebarOpen] = useState(false);
|
|
19
|
+
const location = useLocation();
|
|
20
|
+
const toggleSidebar = () => setIsSidebarOpen((prev) => !prev);
|
|
21
|
+
const closeSidebar = () => setIsSidebarOpen(false);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
setIsSidebarOpen(false);
|
|
24
|
+
}, [location.pathname]);
|
|
25
|
+
return /* @__PURE__ */ jsx(UIContext.Provider, {
|
|
26
|
+
value: {
|
|
27
|
+
isSidebarOpen,
|
|
28
|
+
toggleSidebar,
|
|
29
|
+
closeSidebar
|
|
30
|
+
},
|
|
31
|
+
children
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
function useUI() {
|
|
35
|
+
const context = useContext(UIContext);
|
|
36
|
+
if (context === void 0) return {
|
|
37
|
+
isSidebarOpen: false,
|
|
38
|
+
toggleSidebar: () => {},
|
|
39
|
+
closeSidebar: () => {}
|
|
40
|
+
};
|
|
41
|
+
return context;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
15
45
|
//#region src/client/components/primitives/breadcrumbs.tsx
|
|
16
|
-
|
|
46
|
+
function Breadcrumbs$1({ children, className, ...props }) {
|
|
17
47
|
return /* @__PURE__ */ jsx(Breadcrumbs, {
|
|
18
48
|
className: cn("flex flex-wrap items-center", className),
|
|
19
49
|
...props,
|
|
20
50
|
children
|
|
21
51
|
});
|
|
22
|
-
}
|
|
23
|
-
|
|
52
|
+
}
|
|
53
|
+
function BreadcrumbsItem({ children, className, ...props }) {
|
|
24
54
|
return /* @__PURE__ */ jsx(Breadcrumb, {
|
|
25
55
|
className: cn("flex items-center", className),
|
|
26
56
|
...props,
|
|
27
57
|
children
|
|
28
58
|
});
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return /* @__PURE__ */ jsx(Link, {
|
|
59
|
+
}
|
|
60
|
+
function BreadcrumbsLink({ children, href, className, ...props }) {
|
|
61
|
+
return /* @__PURE__ */ jsx(Link$1, {
|
|
32
62
|
href,
|
|
33
63
|
className: cn("cursor-pointer", className),
|
|
34
64
|
...props,
|
|
35
65
|
children
|
|
36
66
|
});
|
|
37
|
-
}
|
|
38
|
-
|
|
67
|
+
}
|
|
68
|
+
function BreadcrumbsSeparator({ className }) {
|
|
39
69
|
return /* @__PURE__ */ jsx(ChevronRight, {
|
|
40
70
|
size: 14,
|
|
41
71
|
className: cn("shrink-0", className)
|
|
42
72
|
});
|
|
43
|
-
}
|
|
73
|
+
}
|
|
44
74
|
Breadcrumbs$1.Root = Breadcrumbs$1;
|
|
45
75
|
Breadcrumbs$1.Item = BreadcrumbsItem;
|
|
46
76
|
Breadcrumbs$1.Link = BreadcrumbsLink;
|
|
47
77
|
Breadcrumbs$1.Separator = BreadcrumbsSeparator;
|
|
48
78
|
|
|
49
|
-
//#endregion
|
|
50
|
-
//#region src/client/components/primitives/button.tsx
|
|
51
|
-
const Button$1 = ({ ...props }) => {
|
|
52
|
-
return /* @__PURE__ */ jsx(RAC.Button, { ...props });
|
|
53
|
-
};
|
|
54
|
-
|
|
55
79
|
//#endregion
|
|
56
80
|
//#region src/client/components/primitives/button-group.tsx
|
|
57
|
-
|
|
81
|
+
function ButtonGroup({ children, className, vertical = false }) {
|
|
58
82
|
return /* @__PURE__ */ jsx("div", {
|
|
59
83
|
className: cn("inline-flex", vertical ? "flex-col" : "flex-row", !vertical && [
|
|
60
84
|
"[&>*:not(:first-child)]:-ml-px",
|
|
@@ -73,21 +97,21 @@ const ButtonGroup = ({ children, className, vertical = false }) => {
|
|
|
73
97
|
], className),
|
|
74
98
|
children
|
|
75
99
|
});
|
|
76
|
-
}
|
|
100
|
+
}
|
|
77
101
|
|
|
78
102
|
//#endregion
|
|
79
103
|
//#region src/client/components/primitives/popover.tsx
|
|
80
104
|
/**
|
|
81
105
|
* A reusable Popover primitive with premium glassmorphism styling and smooth animations.
|
|
82
106
|
*/
|
|
83
|
-
|
|
107
|
+
function Popover$1({ children, className, ...props }) {
|
|
84
108
|
return /* @__PURE__ */ jsx(Popover, {
|
|
85
109
|
offset: 8,
|
|
86
110
|
className: cn("z-50 overflow-auto outline-none transition-none", className),
|
|
87
111
|
...props,
|
|
88
112
|
children
|
|
89
113
|
});
|
|
90
|
-
}
|
|
114
|
+
}
|
|
91
115
|
|
|
92
116
|
//#endregion
|
|
93
117
|
//#region src/client/components/primitives/menu.tsx
|
|
@@ -174,85 +198,23 @@ Menu.SubTrigger = SubmenuTrigger;
|
|
|
174
198
|
Menu.Section = MenuSection;
|
|
175
199
|
Menu.Separator = MenuSeparator;
|
|
176
200
|
|
|
177
|
-
//#endregion
|
|
178
|
-
//#region src/client/components/primitives/error-boundary.tsx
|
|
179
|
-
var ErrorBoundary = class extends Component {
|
|
180
|
-
state = {
|
|
181
|
-
hasError: false,
|
|
182
|
-
error: null
|
|
183
|
-
};
|
|
184
|
-
static getDerivedStateFromError(error) {
|
|
185
|
-
return {
|
|
186
|
-
hasError: true,
|
|
187
|
-
error
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
componentDidCatch(error, errorInfo) {
|
|
191
|
-
if (this.props.onError) this.props.onError(error, errorInfo);
|
|
192
|
-
else console.error("ErrorBoundary caught an unhandled error:", error, errorInfo);
|
|
193
|
-
}
|
|
194
|
-
resetErrorBoundary = () => {
|
|
195
|
-
if (this.props.onReset) this.props.onReset();
|
|
196
|
-
this.setState({
|
|
197
|
-
hasError: false,
|
|
198
|
-
error: null
|
|
199
|
-
});
|
|
200
|
-
};
|
|
201
|
-
render() {
|
|
202
|
-
const { hasError, error } = this.state;
|
|
203
|
-
const { children, fallback, FallbackComponent } = this.props;
|
|
204
|
-
if (hasError && error) {
|
|
205
|
-
if (FallbackComponent) return /* @__PURE__ */ jsx(FallbackComponent, {
|
|
206
|
-
error,
|
|
207
|
-
resetErrorBoundary: this.resetErrorBoundary
|
|
208
|
-
});
|
|
209
|
-
if (fallback) return fallback;
|
|
210
|
-
return /* @__PURE__ */ jsx(ErrorBoundaryFallback, {
|
|
211
|
-
error,
|
|
212
|
-
resetErrorBoundary: this.resetErrorBoundary
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
return children;
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
function ErrorBoundaryFallback({ error, resetErrorBoundary }) {
|
|
219
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
220
|
-
className: "flex flex-col items-center justify-center min-h-[40vh] text-center gap-4 px-6 py-8 border border-subtle bg-surface rounded-2xl max-w-lg mx-auto shadow-xs",
|
|
221
|
-
children: [
|
|
222
|
-
/* @__PURE__ */ jsx("div", {
|
|
223
|
-
className: "text-lg font-bold text-rose-600 dark:text-rose-400",
|
|
224
|
-
children: "Something went wrong"
|
|
225
|
-
}),
|
|
226
|
-
/* @__PURE__ */ jsx("p", {
|
|
227
|
-
className: "text-sm text-muted max-w-sm leading-relaxed",
|
|
228
|
-
children: error?.message || "An unexpected error occurred while rendering this page."
|
|
229
|
-
}),
|
|
230
|
-
/* @__PURE__ */ jsx(Button$1, {
|
|
231
|
-
className: "rounded-xl border border-subtle bg-main px-6 py-2.5 text-xs font-semibold text-body hover:bg-primary-50/50 hover:border-primary-500/50 transition-all duration-300 cursor-pointer outline-none select-none",
|
|
232
|
-
onPress: resetErrorBoundary,
|
|
233
|
-
children: "Try again"
|
|
234
|
-
})
|
|
235
|
-
]
|
|
236
|
-
});
|
|
237
|
-
}
|
|
238
|
-
|
|
239
201
|
//#endregion
|
|
240
202
|
//#region src/client/components/primitives/tabs.tsx
|
|
241
|
-
|
|
203
|
+
function Tabs({ children, className = "", ...props }) {
|
|
242
204
|
return /* @__PURE__ */ jsx("div", {
|
|
243
205
|
className: cn("w-full", className),
|
|
244
206
|
...props,
|
|
245
207
|
children
|
|
246
208
|
});
|
|
247
|
-
}
|
|
248
|
-
|
|
209
|
+
}
|
|
210
|
+
function TabsList({ children, className = "" }) {
|
|
249
211
|
return /* @__PURE__ */ jsx("div", {
|
|
250
212
|
role: "tablist",
|
|
251
|
-
className: cn("relative flex flex-row items-center", className),
|
|
213
|
+
className: cn("relative flex flex-row items-center overflow-x-auto", className),
|
|
252
214
|
children
|
|
253
215
|
});
|
|
254
|
-
}
|
|
255
|
-
|
|
216
|
+
}
|
|
217
|
+
function TabsItem({ children, id, selected, className = "", ...props }) {
|
|
256
218
|
return /* @__PURE__ */ jsx("button", {
|
|
257
219
|
role: "tab",
|
|
258
220
|
"aria-selected": selected,
|
|
@@ -261,55 +223,25 @@ const TabsItem = ({ children, id, selected, className = "", ...props }) => {
|
|
|
261
223
|
...props,
|
|
262
224
|
children
|
|
263
225
|
});
|
|
264
|
-
}
|
|
265
|
-
|
|
226
|
+
}
|
|
227
|
+
function TabsContent({ children, className = "" }) {
|
|
266
228
|
return /* @__PURE__ */ jsx("div", {
|
|
267
229
|
className: cn("outline-none", className),
|
|
268
230
|
children
|
|
269
231
|
});
|
|
270
|
-
}
|
|
271
|
-
|
|
232
|
+
}
|
|
233
|
+
function TabsIndicator({ className = "", style }) {
|
|
272
234
|
return /* @__PURE__ */ jsx("div", {
|
|
273
235
|
className: cn("absolute bottom-0", className),
|
|
274
236
|
style
|
|
275
237
|
});
|
|
276
|
-
}
|
|
238
|
+
}
|
|
277
239
|
Tabs.Root = Tabs;
|
|
278
240
|
Tabs.List = TabsList;
|
|
279
241
|
Tabs.Item = TabsItem;
|
|
280
242
|
Tabs.Content = TabsContent;
|
|
281
243
|
Tabs.Indicator = TabsIndicator;
|
|
282
244
|
|
|
283
|
-
//#endregion
|
|
284
|
-
//#region src/client/app/ui-context.tsx
|
|
285
|
-
const UIContext = createContext(void 0);
|
|
286
|
-
function UIProvider({ children }) {
|
|
287
|
-
const [isSidebarOpen, setIsSidebarOpen] = useState(false);
|
|
288
|
-
const location = useLocation();
|
|
289
|
-
const toggleSidebar = () => setIsSidebarOpen((prev) => !prev);
|
|
290
|
-
const closeSidebar = () => setIsSidebarOpen(false);
|
|
291
|
-
useEffect(() => {
|
|
292
|
-
setIsSidebarOpen(false);
|
|
293
|
-
}, [location.pathname]);
|
|
294
|
-
return /* @__PURE__ */ jsx(UIContext.Provider, {
|
|
295
|
-
value: {
|
|
296
|
-
isSidebarOpen,
|
|
297
|
-
toggleSidebar,
|
|
298
|
-
closeSidebar
|
|
299
|
-
},
|
|
300
|
-
children
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
function useUI() {
|
|
304
|
-
const context = useContext(UIContext);
|
|
305
|
-
if (context === void 0) return {
|
|
306
|
-
isSidebarOpen: false,
|
|
307
|
-
toggleSidebar: () => {},
|
|
308
|
-
closeSidebar: () => {}
|
|
309
|
-
};
|
|
310
|
-
return context;
|
|
311
|
-
}
|
|
312
|
-
|
|
313
245
|
//#endregion
|
|
314
246
|
//#region src/client/components/primitives/helpers/observer.ts
|
|
315
247
|
function getItemId(url) {
|
|
@@ -320,6 +252,7 @@ var Observer = class {
|
|
|
320
252
|
items = [];
|
|
321
253
|
single = false;
|
|
322
254
|
observer = null;
|
|
255
|
+
timers = [];
|
|
323
256
|
onChange;
|
|
324
257
|
callback(_entries) {
|
|
325
258
|
for (const item of this.items) {
|
|
@@ -383,9 +316,9 @@ var Observer = class {
|
|
|
383
316
|
}
|
|
384
317
|
this.watchItems();
|
|
385
318
|
if (typeof window !== "undefined") {
|
|
386
|
-
setTimeout(() => this.watchItems(), 100);
|
|
387
|
-
setTimeout(() => this.watchItems(), 500);
|
|
388
|
-
setTimeout(() => this.watchItems(), 1e3);
|
|
319
|
+
this.timers.push(setTimeout(() => this.watchItems(), 100));
|
|
320
|
+
this.timers.push(setTimeout(() => this.watchItems(), 500));
|
|
321
|
+
this.timers.push(setTimeout(() => this.watchItems(), 1e3));
|
|
389
322
|
}
|
|
390
323
|
this.onChange?.();
|
|
391
324
|
}
|
|
@@ -403,6 +336,8 @@ var Observer = class {
|
|
|
403
336
|
}
|
|
404
337
|
}
|
|
405
338
|
unwatch() {
|
|
339
|
+
for (const timer of this.timers) clearTimeout(timer);
|
|
340
|
+
this.timers = [];
|
|
406
341
|
this.observer?.disconnect();
|
|
407
342
|
this.observer = null;
|
|
408
343
|
}
|
|
@@ -470,20 +405,20 @@ function AnchorProvider({ toc, single = false, observerOptions, children }) {
|
|
|
470
405
|
children
|
|
471
406
|
});
|
|
472
407
|
}
|
|
473
|
-
|
|
408
|
+
function OnThisPage({ children, className }) {
|
|
474
409
|
return /* @__PURE__ */ jsx("nav", {
|
|
475
410
|
className: cn("sticky top-navbar hidden xl:flex flex-col shrink-0", "w-toc", "py-4 pl-6 pr-4", className),
|
|
476
411
|
children
|
|
477
412
|
});
|
|
478
|
-
}
|
|
479
|
-
|
|
413
|
+
}
|
|
414
|
+
function OnThisPageHeader({ children, className, ...props }) {
|
|
480
415
|
return /* @__PURE__ */ jsx("div", {
|
|
481
416
|
className: cn("mb-4 text-xs font-bold text-body", className),
|
|
482
417
|
...props,
|
|
483
418
|
children
|
|
484
419
|
});
|
|
485
|
-
}
|
|
486
|
-
|
|
420
|
+
}
|
|
421
|
+
function OnThisPageContent({ children, className, ref, ...props }) {
|
|
487
422
|
const internalRef = useRef(null);
|
|
488
423
|
useImperativeHandle(ref, () => internalRef.current);
|
|
489
424
|
return /* @__PURE__ */ jsx("div", {
|
|
@@ -496,21 +431,21 @@ const OnThisPageContent = ({ children, className, ref, ...props }) => {
|
|
|
496
431
|
...props,
|
|
497
432
|
children
|
|
498
433
|
});
|
|
499
|
-
}
|
|
434
|
+
}
|
|
500
435
|
OnThisPageContent.displayName = "OnThisPageContent";
|
|
501
|
-
|
|
436
|
+
function OnThisPageList({ children, className }) {
|
|
502
437
|
return /* @__PURE__ */ jsx("ul", {
|
|
503
438
|
className: cn("relative space-y-0.5 text-sm border-l border-subtle", className),
|
|
504
439
|
children
|
|
505
440
|
});
|
|
506
|
-
}
|
|
507
|
-
|
|
441
|
+
}
|
|
442
|
+
function OnThisPageItem({ level, children, className }) {
|
|
508
443
|
return /* @__PURE__ */ jsx("li", {
|
|
509
444
|
className: cn(level === 3 && "pl-3", className),
|
|
510
445
|
children
|
|
511
446
|
});
|
|
512
|
-
}
|
|
513
|
-
|
|
447
|
+
}
|
|
448
|
+
function OnThisPageLink({ children, href, active, onClick, className }) {
|
|
514
449
|
const items = use(ItemsContext);
|
|
515
450
|
const containerRef = use(ScrollContext);
|
|
516
451
|
const id = href ? getItemId(href) : null;
|
|
@@ -545,8 +480,8 @@ const OnThisPageLink = ({ children, href, active, onClick, className }) => {
|
|
|
545
480
|
className: cn("block py-0.5 pl-4 text-[13px] outline-none transition-colors", computedActive ? "text-primary-500" : "text-muted hover:text-body", className),
|
|
546
481
|
children
|
|
547
482
|
});
|
|
548
|
-
}
|
|
549
|
-
|
|
483
|
+
}
|
|
484
|
+
function OnThisPageIndicator({ style, className }) {
|
|
550
485
|
const containerRef = useRef(null);
|
|
551
486
|
const [internalStyle, setInternalStyle] = useState({
|
|
552
487
|
opacity: 0,
|
|
@@ -583,7 +518,7 @@ const OnThisPageIndicator = ({ style, className }) => {
|
|
|
583
518
|
...internalStyle
|
|
584
519
|
}
|
|
585
520
|
});
|
|
586
|
-
}
|
|
521
|
+
}
|
|
587
522
|
/**
|
|
588
523
|
* High-level automated list of toc items
|
|
589
524
|
*/
|
|
@@ -640,15 +575,15 @@ OnThisPage.Tree = OnThisPageTree;
|
|
|
640
575
|
|
|
641
576
|
//#endregion
|
|
642
577
|
//#region src/client/components/primitives/page-nav.tsx
|
|
643
|
-
|
|
578
|
+
function PageNav({ children, className }) {
|
|
644
579
|
return /* @__PURE__ */ jsx("nav", {
|
|
645
580
|
className: cn("grid sm:grid-cols-2 gap-4", className),
|
|
646
581
|
children
|
|
647
582
|
});
|
|
648
|
-
}
|
|
649
|
-
|
|
583
|
+
}
|
|
584
|
+
function PageNavLink({ children, to, direction, className }) {
|
|
650
585
|
const isNext = direction === "next";
|
|
651
|
-
return /* @__PURE__ */ jsxs(Link, {
|
|
586
|
+
return /* @__PURE__ */ jsxs(Link$1, {
|
|
652
587
|
href: to,
|
|
653
588
|
className: cn("flex items-center outline-none no-underline", isNext ? "justify-end" : "justify-start", className),
|
|
654
589
|
children: [
|
|
@@ -660,22 +595,22 @@ const PageNavLink = ({ children, to, direction, className }) => {
|
|
|
660
595
|
isNext && /* @__PURE__ */ jsx(ChevronRight, { className: "shrink-0" })
|
|
661
596
|
]
|
|
662
597
|
});
|
|
663
|
-
}
|
|
664
|
-
|
|
598
|
+
}
|
|
599
|
+
function PageNavTitle({ children, className }) {
|
|
665
600
|
return /* @__PURE__ */ jsx("span", {
|
|
666
601
|
className: cn(className),
|
|
667
602
|
children
|
|
668
603
|
});
|
|
669
|
-
}
|
|
670
|
-
|
|
604
|
+
}
|
|
605
|
+
function PageNavDescription({ children, className }) {
|
|
671
606
|
return /* @__PURE__ */ jsx("span", {
|
|
672
607
|
className: cn("truncate", className),
|
|
673
608
|
children
|
|
674
609
|
});
|
|
675
|
-
}
|
|
676
|
-
|
|
610
|
+
}
|
|
611
|
+
function PageNavIcon({ children }) {
|
|
677
612
|
return /* @__PURE__ */ jsx(Fragment, { children });
|
|
678
|
-
}
|
|
613
|
+
}
|
|
679
614
|
PageNav.Root = PageNav;
|
|
680
615
|
PageNav.Link = PageNavLink;
|
|
681
616
|
PageNav.Title = PageNavTitle;
|
|
@@ -690,7 +625,8 @@ function useSidebar(routes) {
|
|
|
690
625
|
return useMemo(() => {
|
|
691
626
|
const activeRoute = routes.find((r) => normalizePath(r.path) === currentPath);
|
|
692
627
|
const activeTabId = activeRoute?.tab?.toLowerCase();
|
|
693
|
-
const
|
|
628
|
+
const noCollection = routes.filter((r) => !r.collection);
|
|
629
|
+
const filteredRoutes = activeTabId ? noCollection.filter((r) => !r.tab || r.tab.toLowerCase() === activeTabId) : noCollection;
|
|
694
630
|
const directoryMeta = {};
|
|
695
631
|
if (config.directoryMeta) for (const [key, value] of Object.entries(config.directoryMeta)) {
|
|
696
632
|
const cleanKey = key.split("/").filter((part) => !part.startsWith("(") || !part.endsWith(")")).map((part) => part.replace(/^\d+-/, "")).join("/");
|
|
@@ -815,7 +751,7 @@ function getIcon(iconName) {
|
|
|
815
751
|
/**
|
|
816
752
|
* Internal Badge component for links
|
|
817
753
|
*/
|
|
818
|
-
|
|
754
|
+
function Badge({ badge }) {
|
|
819
755
|
const colors = {
|
|
820
756
|
new: "bg-primary-500/10 text-primary-500 border border-primary-500/20",
|
|
821
757
|
updated: "bg-emerald-500/10 text-emerald-500 border border-emerald-500/20",
|
|
@@ -827,7 +763,7 @@ const Badge = ({ badge }) => {
|
|
|
827
763
|
className: cn("ml-auto flex h-5 items-center rounded-md text-[10px] font-bold px-1.5 py-0.5 uppercase tracking-wider", colors[text] || colors.new),
|
|
828
764
|
children: text
|
|
829
765
|
});
|
|
830
|
-
}
|
|
766
|
+
}
|
|
831
767
|
/**
|
|
832
768
|
* Desktop Sidebar Container
|
|
833
769
|
*/
|
|
@@ -894,7 +830,7 @@ function SidebarContent({ children, className }) {
|
|
|
894
830
|
/**
|
|
895
831
|
* Navigation Group
|
|
896
832
|
*/
|
|
897
|
-
|
|
833
|
+
function SidebarGroup({ title, icon: Icon, children, className }) {
|
|
898
834
|
return /* @__PURE__ */ jsxs("div", {
|
|
899
835
|
className,
|
|
900
836
|
children: [title && /* @__PURE__ */ jsxs("h4", {
|
|
@@ -905,9 +841,9 @@ const SidebarGroup = ({ title, icon: Icon, children, className }) => {
|
|
|
905
841
|
children
|
|
906
842
|
})]
|
|
907
843
|
});
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
return /* @__PURE__ */ jsxs(Link, {
|
|
844
|
+
}
|
|
845
|
+
function SidebarLink({ label, href, active, icon: Icon, badge, className }) {
|
|
846
|
+
return /* @__PURE__ */ jsxs(Link$1, {
|
|
911
847
|
href,
|
|
912
848
|
className: cn("group flex items-center gap-2.5 rounded-lg px-2.5 py-1.5 text-sm transition-all outline-none", active ? "bg-primary-500/10 text-primary-500 font-medium shadow-sm" : "text-muted hover:bg-surface hover:text-body", className),
|
|
913
849
|
children: [
|
|
@@ -922,11 +858,11 @@ const SidebarLink = ({ label, href, active, icon: Icon, badge, className }) => {
|
|
|
922
858
|
badge && /* @__PURE__ */ jsx(Badge, { badge })
|
|
923
859
|
]
|
|
924
860
|
});
|
|
925
|
-
}
|
|
861
|
+
}
|
|
926
862
|
/**
|
|
927
863
|
* Nested SubGroup
|
|
928
864
|
*/
|
|
929
|
-
|
|
865
|
+
function SidebarSubGroup({ label, href, active, icon: Icon, badge, isOpen, onToggle, children, className }) {
|
|
930
866
|
return /* @__PURE__ */ jsxs("div", {
|
|
931
867
|
className: "flex flex-col gap-0.5",
|
|
932
868
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
@@ -955,7 +891,7 @@ const SidebarSubGroup = ({ label, href, active, icon: Icon, badge, isOpen, onTog
|
|
|
955
891
|
children
|
|
956
892
|
})]
|
|
957
893
|
});
|
|
958
|
-
}
|
|
894
|
+
}
|
|
959
895
|
function SidebarItem({ route, activePath, activeRoute, className }) {
|
|
960
896
|
const localizedHref = useLocalizedTo(route.path);
|
|
961
897
|
const isCurrent = activePath === (localizedHref.endsWith("/") ? localizedHref.slice(0, -1) : localizedHref) || !!activeRoute?.filePath && !!route.filePath && activeRoute.filePath === route.filePath;
|
|
@@ -1228,4 +1164,4 @@ const DocsLayout = Object.assign(DocsLayoutRoot, {
|
|
|
1228
1164
|
});
|
|
1229
1165
|
|
|
1230
1166
|
//#endregion
|
|
1231
|
-
export {
|
|
1167
|
+
export { useUI as A, useItems as C, ButtonGroup as D, Popover$1 as E, Breadcrumbs$1 as O, useActiveAnchors as S, Menu as T, OnThisPage as _, SidebarContent as a, ScrollProvider as b, SidebarItem as c, SidebarMobile as d, SidebarRoot as f, AnchorProvider as g, PageNav as h, Sidebar as i, UIProvider as k, SidebarItems as l, useSidebar as m, useSearchHighlight as n, SidebarGroup as o, SidebarSubGroup as p, useLocation$1 as r, SidebarHeader as s, DocsLayout as t, SidebarLink as u, OnThisPageItems as v, Tabs as w, useActiveAnchor as x, OnThisPageTree as y };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boltdocs - https://boltdocs.vercel.app
|
|
3
|
+
* Copyright (c) 2026 Jesus Alcala
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
const e=require(`./chunk-CU-zTemE.cjs`),t=require(`./utils-Cjmx1hhk.cjs`);let n=require(`vite`),r=require(`node:path`);r=e.t(r);let i=require(`fdir`),a=require(`node:fs`);a=e.t(a);let o=require(`zod`),s=require(`@bdocs/dui`);s=e.t(s);let c=require(`node:module`),l=require(`picomatch`);l=e.t(l);let u=require(`fastest-levenshtein`);const d=o.z.object({icon:o.z.string().max(50),link:o.z.string().url()});o.z.object({text:o.z.string().max(2e3).optional()});const f=o.z.object({name:o.z.string(),enforce:o.z.enum([`pre`,`post`]).optional(),version:o.z.string().optional(),boltdocsVersion:o.z.string().optional(),remarkPlugins:o.z.array(o.z.unknown()).optional(),rehypePlugins:o.z.array(o.z.unknown()).optional(),vitePlugins:o.z.array(o.z.unknown()).optional(),components:o.z.record(o.z.string(),o.z.string()).optional(),hooks:o.z.record(o.z.string(),o.z.unknown()).optional()}),p=o.z.object({title:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]).optional(),description:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]).optional(),logo:o.z.union([o.z.string(),o.z.object({dark:o.z.string(),light:o.z.string(),alt:o.z.string().optional(),width:o.z.number().optional(),height:o.z.number().optional()})]).optional(),navbar:o.z.array(o.z.object({label:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]),href:o.z.string(),items:o.z.array(o.z.object({label:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]),href:o.z.string()})).optional()})).optional(),sidebar:o.z.record(o.z.string(),o.z.array(o.z.object({text:o.z.string(),link:o.z.string()}))).optional(),sidebarGroups:o.z.record(o.z.string(),o.z.object({title:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]).optional(),icon:o.z.string().optional()})).optional(),socialLinks:o.z.array(d).optional(),editLink:o.z.string().refine(e=>!e||e.includes(`:path`),{message:`editLink must contain ':path' placeholder if specified`}).optional(),communityHelp:o.z.string().url().optional(),version:o.z.string().max(50).optional(),githubRepo:o.z.string().max(100).optional(),favicon:o.z.string().optional(),tabs:o.z.array(o.z.object({id:o.z.string(),text:o.z.union([o.z.string(),o.z.record(o.z.string(),o.z.string())]),icon:o.z.string().optional()})).optional(),codeTheme:o.z.union([o.z.string(),o.z.object({light:o.z.string(),dark:o.z.string()})]).optional()}),m=o.z.union([o.z.string(),o.z.object({rules:o.z.array(o.z.object({userAgent:o.z.string(),allow:o.z.union([o.z.string(),o.z.array(o.z.string())]).optional(),disallow:o.z.union([o.z.string(),o.z.array(o.z.string())]).optional()})).optional(),sitemaps:o.z.array(o.z.string().url()).optional()})]),h=o.z.object({defaultLocale:o.z.string(),locales:o.z.union([o.z.record(o.z.string(),o.z.string()),o.z.array(o.z.string())]).transform(e=>Array.isArray(e)?Object.fromEntries(e.map(e=>[e,e])):e),localeConfigs:o.z.record(o.z.string(),o.z.object({label:o.z.string().optional(),direction:o.z.enum([`ltr`,`rtl`]).optional(),htmlLang:o.z.string().optional(),calendar:o.z.string().optional()})).optional()}),g=o.z.object({defaultVersion:o.z.string(),prefix:o.z.string().optional(),versions:o.z.array(o.z.object({label:o.z.string(),path:o.z.string()}))}),_=o.z.object({headers:o.z.record(o.z.string(),o.z.string()).optional(),enableCSP:o.z.boolean().optional(),customHeaders:o.z.record(o.z.string(),o.z.string()).optional()}),v=o.z.object({metatags:o.z.record(o.z.string(),o.z.string()).optional(),indexing:o.z.enum([`all`,`public`]).optional(),thumbnails:o.z.object({background:o.z.string().optional()}).optional()}),y=o.z.object({measurementId:o.z.string().min(1,`Measurement ID is required for GA4`),debug:o.z.boolean().optional(),anonymizeIp:o.z.boolean().optional(),sendPageView:o.z.boolean().optional(),cookieFlags:o.z.string().optional(),autoTrack:o.z.object({pageViews:o.z.boolean().optional(),downloads:o.z.boolean().optional(),externalLinks:o.z.boolean().optional(),search:o.z.boolean().optional()}).optional()}),b=o.z.object({tagId:o.z.string().min(1,`Tag ID is required for GTM`),dataLayerName:o.z.string().optional(),preview:o.z.string().optional()}),x=o.z.object({appId:o.z.string().min(1,`Algolia App ID is required`),apiKey:o.z.string().min(1,`Algolia API Key is required`),indexName:o.z.string().min(1,`Algolia Index Name is required`)}),S=o.z.object({ga4:y.optional(),gtm:b.optional(),algolia:x.optional()}),C=o.z.object({siteUrl:o.z.string().url().optional(),docsDir:o.z.string().optional(),base:o.z.string().optional(),theme:p.optional(),i18n:h.optional(),versions:g.optional(),plugins:o.z.array(f).optional(),robots:m.optional(),security:_.optional(),seo:v.optional(),integrations:S.optional(),vite:o.z.record(o.z.string(),o.z.unknown()).optional()});function w(e,t,n=process.cwd(),i){let o=r.default.resolve(n,`.boltdocs`,`generated`);a.default.existsSync(o)||a.default.mkdirSync(o,{recursive:!0});let s=e.i18n?Object.keys(e.i18n.locales):[],c=e.versions?e.versions.versions.map(e=>e.path):[],l=s.length>0?s.map(e=>`'${e}'`).join(` | `):`string`,u=c.length>0?c.map(e=>`'${e}'`).join(` | `):`string`,d=[`tsx`,`ts`,`jsx`,`js`],f=``,p=``;for(let e of d){let i=r.default.resolve(n,t,`mdx-components.${e}`);if(a.default.existsSync(i)){let e=r.default.join(n,t,`mdx-components`),i=r.default.relative(o,e).replace(/\\/g,`/`);f=`import type * as MdxComponentsModule from '${i.startsWith(`.`)?i:`./${i}`}'\n`,p=` MdxComponents: typeof MdxComponentsModule`;break}}let m=i&&i.length>0?`\ndeclare global {
|
|
7
|
+
namespace Boltdocs {
|
|
8
|
+
interface RoutePaths {
|
|
9
|
+
${i.map(e=>` '${e}': void`).join(`
|
|
10
|
+
`)}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}`:``,h=`// This file is automatically generated by Boltdocs.
|
|
14
|
+
// Do not edit this file manually.
|
|
15
|
+
|
|
16
|
+
${f}declare global {
|
|
17
|
+
namespace Boltdocs {
|
|
18
|
+
interface Types {
|
|
19
|
+
Locale: ${l}
|
|
20
|
+
Version: ${u}${p?`\n${p}`:``}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}${m}
|
|
24
|
+
|
|
25
|
+
export {}
|
|
26
|
+
`;a.default.writeFileSync(r.default.resolve(o,`types.d.ts`),h)}function T(e,t=process.cwd()){let n=r.default.resolve(t,`.boltdocs`,`generated`);a.default.existsSync(n)||a.default.mkdirSync(n,{recursive:!0});let i={routes:Array.from(new Set(e)).sort(),timestamp:Date.now()};a.default.writeFileSync(r.default.resolve(n,`link-tree.json`),JSON.stringify(i,null,2))}function E(e){return e}const D=[`boltdocs.config.js`,`boltdocs.config.mjs`,`boltdocs.config.ts`];async function O(e,i=process.cwd()){let o=i,c={docsDir:r.default.resolve(e),theme:{title:`Boltdocs`,description:`A Vite documentation framework`,navbar:[{label:`Home`,href:`/`},{label:`Documentation`,href:`/docs`}],codeTheme:{light:`github-light`,dark:`github-dark`}}},l={};for(let e of D){let t=r.default.resolve(o,e);if(a.default.existsSync(t))try{let e=await(0,n.loadConfigFromFile)({command:`serve`,mode:`development`},t,o);if(e){l=e.config;break}}catch(t){(0,s.warn)(`Failed to load config from ${e}:`,t)}}let u={title:l.title,description:l.description,logo:l.logo,favicon:l.favicon,navbar:l.navbar,sidebar:l.sidebar,sidebarGroups:l.theme?.sidebarGroups,socialLinks:l.socialLinks,githubRepo:l.githubRepo,tabs:l.tabs,codeTheme:l.codeTheme,communityHelp:l.communityHelp,version:l.version,editLink:l.editLink,...l.theme||{}},d=Object.fromEntries(Object.entries(u).filter(([e,t])=>t!==void 0));d.navbar&&=d.navbar.map(e=>({label:e.label||e.text||``,href:e.href||e.link||e.to||``,items:e.items}));let f={docsDir:r.default.resolve(e),theme:{...c.theme,...d},i18n:l.i18n?{...l.i18n,locales:Array.isArray(l.i18n.locales)?Object.fromEntries(l.i18n.locales.map(e=>[e,e])):l.i18n.locales}:void 0,versions:l.versions,siteUrl:l.siteUrl,base:l.base,seo:l.seo,plugins:l.plugins||[],robots:l.robots,security:l.security,integrations:l.integrations,vite:l.vite},p=C.safeParse(f);if(!p.success)throw new t.v(`Invalid Boltdocs configuration:\n${p.error.issues.map(e=>` - ${e.path.join(`.`)}: ${e.message}`).join(`
|
|
27
|
+
`)}`);return p.data}const k=(0,c.createRequire)(require(`url`).pathToFileURL(__filename).href);let A=0;function j(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 M(){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 N(){try{return k(`boltdocs/package.json`).version}catch{return`0.0.0`}}async function P(){let e=Date.now();if(e-A<864e5)return;A=e;let t=await N();if(t===`0.0.0`)return;let n=await M();n&&j(n,t)&&console.log(s.updateAvailable(t,n))}const F={$schema:`https://boltdocs.vercel.app/schemas/doctor-config.schema.json`,checks:{metadata:{enabled:!0,titleMin:10,titleMax:60,descriptionMin:50,required:[`title`,`description`],optional:[],validateDates:!1},links:{internal:!0,external:!1,timeout:1e4,concurrency:10,ignore:[]},i18n:{enabled:!0},performance:{enabled:!0,budgets:{maxJSBundleSize:`200kb`,maxCSSBundleSize:`30kb`,maxPageHTMLSize:`80kb`,maxImagesKB:500,maxBuildTime:3e4,maxFontCount:3}}},fix:{confirmChanges:!1,backupFiles:!1,backupPath:`.boltdocs/backups`},reporting:{format:`pretty`,outputFile:`.boltdocs/reports/doctor.json`,failOnError:!1,maxWarnings:-1},severity:{missingTranslation:`warning`,brokenLink:`high`,brokenAnchor:`warning`,largeFile:`warning`,orphanedPage:`low`,duplicateTitle:`low`,shortMetadata:`low`,missingMetadata:`warning`,malformedFrontmatter:`high`,invalidFrontmatter:`high`,budgetExceeded:`warning`},exclude:[]};function I(e,t){if(e==null)return t;if(typeof e==`number`)return e;let n=e.toLowerCase().match(/^(\d+(?:\.\d+)?)\s*(b|kb|mb|gb)?$/);if(!n)return t;let r=Number.parseFloat(n[1]),i=n[2]||`b`;return Math.round(r*({b:1,kb:1024,mb:1024*1024,gb:1024*1024*1024}[i]||1))}function L(e,t,n){return e.doctorConfig.severity[t]||n}async function R(e,t){a.default.existsSync(t)||a.default.mkdirSync(t,{recursive:!0});let n=r.default.basename(e),i=new Date().toISOString().replace(/[:.]/g,`-`),o=r.default.join(t,`${n}.${i}.bak`);a.default.copyFileSync(e,o)}const z=new Map;function B(e){let n=z.get(e);if(n)return n;let r=(async()=>{let n=await t.d(e,!1);return{raw:n.raw,data:n.data,content:n.content}})();return z.set(e,r),r}const V=new Map;function H(e){if(V.has(e))return V.get(e);let t=!1;try{t=a.default.existsSync(e)&&a.default.statSync(e).isFile()}catch{t=!1}return V.set(e,t),t}async function U(e){let t=r.default.resolve(e,`doctor.json`);if(a.default.existsSync(t))try{let e=JSON.parse(a.default.readFileSync(t,`utf-8`));return{...F,...e,checks:{...F.checks,...e.checks,metadata:{...F.checks.metadata,...e.checks?.metadata},links:{...F.checks.links,...e.checks?.links},i18n:{...F.checks.i18n,...e.checks?.i18n},performance:{...F.checks.performance,...e.checks?.performance,budgets:{...F.checks.performance?.budgets,...e.checks?.performance?.budgets}}},fix:{...F.fix,...e.fix},reporting:{...F.reporting,...e.reporting},severity:{...F.severity,...e.severity},exclude:[...F.exclude,...e.exclude||[]]}}catch(e){(0,s.warn)(`Failed to parse doctor.json: ${e}`)}return F}async function W(e,n=process.cwd(),o,s){let c=r.default.resolve(n,`.boltdocs`,`generated`);a.default.existsSync(c)||a.default.mkdirSync(c,{recursive:!0});let l=s;l||=await new i.fdir().withFullPaths().filter(e=>e.endsWith(`.md`)||e.endsWith(`.mdx`)).crawl(e).withPromise();let u=o?.base||`/docs`,d=[];for(let n=0;n<l.length;n+=100){let i=l.slice(n,n+100),a=await Promise.all(i.map(async n=>{let i=r.default.isAbsolute(n)?n:r.default.resolve(e,n),a=r.default.relative(e,i),{data:o}=await B(i),s;return s=o.permalink?o.permalink.startsWith(`/`)?o.permalink:`/${o.permalink}`:t.a(a),u===`/`?s:(u.endsWith(`/`)?u:u+`/`)+(s.startsWith(`/`)?s.substring(1):s)}));d.push(...a)}d.includes(u)||d.push(u);let f={routes:Array.from(new Set(d)).sort(),timestamp:Date.now()};return a.default.writeFileSync(r.default.resolve(c,`link-tree.json`),JSON.stringify(f,null,2)),f}function G(e,t){if(e===t)return 1;if(!e||!t)return 0;let n=e.split(`/`).filter(Boolean),r=t.split(`/`).filter(Boolean),i=n[n.length-1]||``,a=r[r.length-1]||``;if(i===a){let e=0;for(let t of n)r.includes(t)&&e++;return e>=2?.99:.9}if(i.length>3&&a.length>3&&(a.startsWith(i)||i.startsWith(a))&&Math.min(i.length,a.length)/Math.max(i.length,a.length)>.5)return .88;let o=1-(0,u.distance)(i,a)/Math.max(i.length,a.length);return o>.8?o*.95:1-(0,u.distance)(e,t)/Math.max(e.length,t.length)}const K=new Map;function q(e,t){if(K.has(e))return K.get(e);let n=e.length,r=``,i=0;for(let a of t){if(a===e)continue;let t=a.length,o=Math.max(n,t);if(o===0)continue;let s=1-Math.abs(n-t)/o;if(s<=.8&&s<=i)continue;let c=G(e,a);c>i&&(i=c,r=a)}let a={bestMatch:r,similarity:i};return K.set(e,a),a}async function J(e){let n=[];if(!e.doctorConfig.checks.metadata.enabled)return n;let{titleMin:i,titleMax:a,descriptionMin:o}=e.doctorConfig.checks.metadata,s=new Map;for(let c of e.files){let l=t.u(r.default.relative(e.docsDir,c));try{let{raw:r,data:u}=await B(c);if(r.trim().startsWith(`---`)&&r.split(`---`).length>=3&&Object.keys(u).length===0){let t=L(e,`malformedFrontmatter`,`high`);t!==`off`&&n.push({file:l,level:t,message:`Malformed frontmatter (YAML parsing failed).`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}let d=t.y.safeParse(u);if(!d.success){let t=L(e,`invalidFrontmatter`,`high`);if(t!==`off`)for(let e of d.error.issues)n.push({file:l,level:t,message:`Invalid frontmatter field "${e.path.join(`.`)}": ${e.message}`,suggestion:`Ensure the field follows the correct type.`})}let f=Array.from(new Set([`title`,...e.doctorConfig.checks.metadata.required]));for(let t of f)if(u[t]===void 0){let r=L(e,`missingMetadata`,`warning`);r!==`off`&&n.push({file:l,level:r,message:`Missing required frontmatter field: "${t}".`,suggestion:`Add the "${t}" field to your frontmatter.`})}if(e.doctorConfig.checks.metadata.validateDates){let t=[`date`,`lastUpdated`,...e.doctorConfig.checks.metadata.optional.filter(e=>e.toLowerCase().includes(`date`))];for(let r of t)if(u[r]&&Number.isNaN(Date.parse(String(u[r])))){let t=L(e,`invalidFrontmatter`,`high`);t!==`off`&&n.push({file:l,level:t,message:`Invalid date format in field "${r}": "${u[r]}".`,suggestion:`Use a valid ISO date format (e.g., YYYY-MM-DD).`})}}if(u.title){let t=String(u.title);if(t.length<i){let r=L(e,`shortMetadata`,`low`);r!==`off`&&n.push({file:l,level:r,message:`Title is too short (${t.length} chars).`,suggestion:`Titles should be at least ${i} characters for better SEO.`})}else if(t.length>a){let r=L(e,`shortMetadata`,`low`);r!==`off`&&n.push({file:l,level:r,message:`Title is too long (${t.length} chars).`,suggestion:`Titles should be under ${a} characters.`})}let r=s.get(t)||[];r.push(l),s.set(t,r)}if(u.description&&String(u.description).length<o){let t=L(e,`shortMetadata`,`low`);t!==`off`&&n.push({file:l,level:t,message:`Description is very short.`,suggestion:`Descriptions should ideally be at least ${o} characters.`})}}catch(t){if(t instanceof Error){let r=L(e,`malformedFrontmatter`,`high`);r!==`off`&&n.push({file:l,level:r,message:`Malformed frontmatter (YAML error): ${t.message}`,suggestion:`Check your YAML syntax for indentation or unquoted special characters.`})}}}for(let[t,r]of s.entries())if(r.length>1){let i=L(e,`duplicateTitle`,`low`);if(i!==`off`)for(let e of r)n.push({file:e,level:i,message:`Duplicate title found: "${t}"`,suggestion:`Ensure each page has a unique title. Also used in: ${r.filter(t=>t!==e).join(`, `)}`})}return n}async function Y(e){let n=[],{internal:i,external:o,ignore:c,timeout:l,concurrency:u}=e.doctorConfig.checks.links;if(!i&&!o&&!e.options.checkExternal)return n;let d=/(?:\[.*?\]\((.*?)\))|(?:href=["']([^"']+)["'])/g,f=new Set,p=5e5;for(let s of e.files){let l=t.u(r.default.relative(e.docsDir,s)),{content:u}=await B(s),m=[...(u.length>p?u.slice(0,p):u).replace(/```[\s\S]*?```/g,``).replace(/`[^`\n]*`/g,``).matchAll(d)];for(let t of m){let u=t[1]||t[2],d=!!t[1];if(!u||c.some(e=>u.includes(e)))continue;if(/^https?:\/\//i.test(u)){(o||e.options.checkExternal)&&f.add({url:u,file:s});continue}if(!i||/^(mailto|tel|#)/i.test(u))continue;let p;try{p=decodeURIComponent(u.split(`#`)[0].split(`?`)[0])}catch{p=u.split(`#`)[0].split(`?`)[0]}if(!p)continue;let m=!1,h=``;if(p.startsWith(`/`))if(e.routeIndex.has(p)||e.routeIndexWithSlash.has(p)||e.routeIndexWithoutSlash.has(p))m=!0;else{let t=e.basePrefix+(p.startsWith(`/`)?p:`/`+p);if(e.routeIndex.has(t)||e.routeIndexWithSlash.has(t))m=!1,h=t;else{let t=e.config.base!==`/`&&p.startsWith(e.config.base||`/`)?p.substring((e.config.base||`/`).length):p,n=t.startsWith(`/`)?t.substring(1):t;h=r.default.join(e.docsDir,n),m=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`].some(e=>H(h+e))}}else h=r.default.resolve(r.default.dirname(s),p),m=[``,`.md`,`.mdx`,`/index.md`,`/index.mdx`].some(e=>H(h+e));if(!m){let{bestMatch:t,similarity:r}=q(p,e.linkTree.routes),i=!1,o=e.basePrefix+(p.startsWith(`/`)?p:`/`+p);(e.routeIndex.has(o)||e.routeIndexWithSlash.has(o))&&(t=o,r=1,i=!0);let c=r>.6||i,f=r>.75&&t!==p||i,m=L(e,`brokenLink`,`high`);m!==`off`&&n.push({file:l,level:m,message:`Broken internal link: "${u}"`,suggestion:c?`Did you mean "${t}"?`:`Ensure the target exists or check for typos.`,fix:f?async()=>{let e=u.includes(`#`)?`#`+u.split(`#`)[1]:``,n=d?`(${u})`:`href="${u}"`,r=d?`(${t}${e})`:`href="${t}${e}"`,i=a.default.readFileSync(s,`utf-8`).replace(n,r);a.default.writeFileSync(s,i),z.delete(s)}:void 0})}}}if(f.size>0){(0,s.info)(s.colors.gray(`Verifying ${f.size} external links...`));let i=new Map;for(let e of f)i.has(e.url)||i.set(e.url,[]),i.get(e.url).push(e.file);let a=async e=>{try{let t=new AbortController,n=setTimeout(()=>t.abort(),l),r=await fetch(e,{method:`HEAD`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}});return clearTimeout(n),!r.ok&&r.status!==404?{url:e,ok:(await fetch(e,{method:`GET`,signal:t.signal,headers:{"User-Agent":`boltdocs-doctor/1.0`}})).ok}:{url:e,ok:r.ok}}catch(t){return{url:e,ok:!1,error:t.message}}},o=Array.from(i.keys()),c=[];for(let e=0;e<o.length;e+=u){let t=o.slice(e,e+u),n=await Promise.allSettled(t.map(a));c.push(...n.map(e=>e.status===`fulfilled`?e.value:{url:`unknown`,ok:!1,error:e.reason}))}for(let a of c)if(!a.ok){let o=L(e,`brokenLink`,`warning`);if(o!==`off`){let s=i.get(a.url)||[];for(let i of s)n.push({file:t.u(r.default.relative(e.docsDir,i)),level:o,message:`Broken external link: "${a.url}"`,suggestion:`Verify the URL or update it if it's permanently down. Error: ${a.error||`Status >= 400`}`})}}}return n}async function X(e){let n=[];if(!e.doctorConfig.checks.i18n.enabled||!e.config.i18n)return n;let{defaultLocale:i,locales:o}=e.config.i18n,s=Object.keys(o),c=s.filter(e=>e!==i);for(let o of e.files){let l=t.u(r.default.relative(e.docsDir,o)),u=l.split(`/`),d=u[0];if(d===i){let t=u.slice(1).join(`/`);for(let i of c){let s=r.default.join(e.docsDir,i,t);if(!H(s)){let c=L(e,`missingTranslation`,`warning`);c!==`off`&&n.push({file:l,level:c,message:`Missing translation for locale "${i}"`,suggestion:`Create a version at "${i}/${t}".`,fix:async()=>{let e=r.default.dirname(s);a.default.existsSync(e)||a.default.mkdirSync(e,{recursive:!0}),a.default.copyFileSync(o,s)}})}}}else if(s.includes(d)){let t=u.slice(1).join(`/`);if(!H(r.default.join(e.docsDir,i,t))){let r=L(e,`missingTranslation`,`low`);r!==`off`&&n.push({file:l,level:r,message:`Orphaned translation (source missing in "${i}")`,suggestion:`Remove this file or create the source at "${i}/${t}".`,fix:async()=>{a.default.unlinkSync(o)}})}}}return n}async function Z(e){let t=[];if(!e.config.theme.sidebar)return t;let n=new Set,r=e.config.theme.sidebar;for(let[i,a]of Object.entries(r))for(let r of a){if(!r.text){let n=L(e,`invalidFrontmatter`,`warning`);n!==`off`&&t.push({file:`boltdocs.config.ts`,level:n,message:`Sidebar item in group "${i}" is missing a label.`,suggestion:`Add a "text" property to the sidebar item.`})}if(r.link&&(n.add(r.link),!e.routeIndex.has(r.link))){let{bestMatch:n,similarity:i}=q(r.link,e.linkTree.routes),a=i>.6,o=L(e,`brokenLink`,`high`);o!==`off`&&t.push({file:`boltdocs.config.ts`,level:o,message:`Broken sidebar link: "${r.link}"`,suggestion:a?`Did you mean "${n}"?`:`Ensure the route exists and is correctly formatted.`})}}for(let r of e.linkTree.routes)if(!(r===`/`||r===``)&&!n.has(r)){let n=L(e,`orphanedPage`,`low`);n!==`off`&&t.push({file:`Sidebar`,level:n,message:`Orphaned page found: "${r}" is not linked in the sidebar.`,suggestion:`Consider adding it to the sidebar for better discoverability.`})}return t}async function Q(e){let t=[],n=e.doctorConfig.checks.performance;if(!n?.enabled)return t;let i=r.default.resolve(e.root,`.boltdocs`,`reports`,`performance.json`);if(!a.default.existsSync(i))return t.push({file:`(build)`,level:L(e,`budgetExceeded`,`warning`),message:"Performance metrics not found. Run `boltdocs build` first."}),t;let o;try{o=JSON.parse(a.default.readFileSync(i,`utf-8`))}catch{return t.push({file:`(build)`,level:L(e,`budgetExceeded`,`warning`),message:`Failed to parse performance metrics file.`}),t}let s=n.budgets,c=L(e,`budgetExceeded`,`warning`),l=I(s?.maxJSBundleSize,1/0),u=I(s?.maxCSSBundleSize,1/0),d=I(s?.maxPageHTMLSize,1/0),f=s?.maxImagesKB??1/0,p=s?.maxBuildTime??1/0,m=s?.maxFontCount??1/0;if(l!==1/0&&o.totalJSBundleSize>l){let e=(o.totalJSBundleSize/1024).toFixed(0),n=(l/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`JS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Code-split large dependencies or lazy-load route components.`})}if(u!==1/0&&o.totalCSSBundleSize>u){let e=(o.totalCSSBundleSize/1024).toFixed(0),n=(u/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`CSS bundle size exceeds budget: ${e}kb > ${n}kb`,suggestion:`Remove unused styles or split CSS by route.`})}if(d!==1/0){for(let e of o.pages)if(e.htmlSize>d){let n=(e.htmlSize/1024).toFixed(0),r=(d/1024).toFixed(0);t.push({file:e.route,level:c,message:`Page HTML size exceeds budget: ${n}kb > ${r}kb`,suggestion:`Reduce the amount of inline content or split into sub-pages.`})}}let h=f*1024;if(f!==1/0&&o.totalImagesSize>h){let e=(o.totalImagesSize/1024).toFixed(0);t.push({file:`(build)`,level:c,message:`Image assets exceed budget: ${e}kb > ${f}kb`,suggestion:`Optimize images with lossy compression or use next-gen formats (webp/avif).`})}if(p!==1/0&&o.buildTime>p){let e=(o.buildTime/1e3).toFixed(1),n=(p/1e3).toFixed(1);t.push({file:`(build)`,level:c,message:`Build time exceeds budget: ${e}s > ${n}s`,suggestion:"Check for large unoptimized assets or increase `concurrency` in SSG options."})}return m!==1/0&&o.fontCount>m&&t.push({file:`(build)`,level:c,message:`Font files exceed budget: ${o.fontCount} > ${m}`,suggestion:`Reduce the number of font families or use variable fonts.`}),t}async function $(e){let t=r.default.resolve(e,`doctor.json`);if(a.default.existsSync(t)){(0,s.warn)(`"doctor.json" already exists at ${e}.`);return}try{a.default.writeFileSync(t,JSON.stringify(F,null,2)),(0,s.success)(`Created "doctor.json" with default configuration.`)}catch(e){(0,s.error)(`Failed to create "doctor.json": ${e}`)}}async function ee(e=process.cwd(),t={}){if(t.init){await $(e);return}P();try{let n=await U(e),{format:o}=n.reporting,c=performance.now(),u=await O(`docs`,e),d=r.default.resolve(e,`docs`);a.default.existsSync(d)||(o===`pretty`&&(0,s.error)(`Docs dir not found at ${d}`),process.exit(1)),o===`pretty`&&console.log((0,s.double)(`✦ DOCTOR — Documentation Health Check`,[` ${s.colors.dim(`Docs dir:`)} ${d}`,` ${s.colors.dim(`Reports:`)} ${e}/.boltdocs/reports/`])),o===`pretty`&&(0,s.info)(s.colors.dim(`🔍 Discovering files and routes...`));let f=(0,l.default)(n.exclude||[]),p=await new i.fdir().withFullPaths().filter(e=>{if(!(e.endsWith(`.md`)||e.endsWith(`.mdx`)))return!1;let t=r.default.relative(d,e).replace(/\\/g,`/`),n=t.split(`/`).some(e=>e.startsWith(`_`)&&e!==`_index.md`&&e!==`_index.mdx`);return!f(t)&&!n}).crawl(d).withPromise();for(let e of p)V.set(e,!0);let m=await W(d,e,u,p),h=u.base||`/`,g=h===`/`?``:h.endsWith(`/`)?h.slice(0,-1):h,_={root:e,docsDir:d,config:u,doctorConfig:n,linkTree:m,files:p,options:t,routeIndex:new Set(m.routes),routeIndexWithSlash:new Set(m.routes.map(e=>e.endsWith(`/`)?e:e+`/`)),routeIndexWithoutSlash:new Set(m.routes.map(e=>e.endsWith(`/`)?e.slice(0,-1):e)),basePrefix:g};o===`pretty`&&(0,s.info)(s.colors.dim(`🧪 Running diagnostic checks in parallel...`));let v=[J(_),Y(_),X(_),Z(_)];t.budget&&v.push(Q(_));let[y,b,x,S,...C]=await Promise.all(v),w=t.budget?C[0]:[],T=[...y,...b,...x,...S,...w];if(o===`pretty`){let e=[{label:`Metadata checks ${y.length>0?`— ${y.length} issue${y.length===1?``:`s`}`:`— OK`}`,done:y.length===0},{label:`Link checks ${b.length>0?`— ${b.length} issue${b.length===1?``:`s`}`:`— OK`}`,done:b.length===0},{label:`i18n checks ${x.length>0?`— ${x.length} issue${x.length===1?``:`s`}`:`— OK`}`,done:x.length===0},{label:`Sidebar checks ${S.length>0?`— ${S.length} issue${S.length===1?``:`s`}`:`— OK`}`,done:S.length===0}];t.budget&&e.push({label:`Performance budget ${w.length>0?`— ${w.length} issue${w.length===1?``:`s`}`:`— OK`}`,done:w.length===0}),console.log(`\n${(0,s.tasks)(e)}`)}let E=0;if(t.fix){for(let e of T)if(e.fix){if(_.doctorConfig.fix.confirmChanges&&!await(0,s.confirm)(`Fix issue in "${e.file}": ${e.message}?`))continue;if(_.doctorConfig.fix.backupFiles){let t=r.default.resolve(_.docsDir,e.file);a.default.existsSync(t)&&await R(t,r.default.resolve(_.root,_.doctorConfig.fix.backupPath))}await e.fix(),E++}}let D=((performance.now()-c)/1e3).toFixed(2),k=T.filter(e=>e.level===`high`).length,A=T.filter(e=>e.level===`warning`).length,j=T.filter(e=>e.level===`low`).length,M={summary:{total:T.length,high:k,warning:A,low:j,fixed:E,duration:D},issues:T.map(e=>({...e,fix:void 0}))};if(n.reporting.outputFile){let t=r.default.resolve(e,n.reporting.outputFile);a.default.existsSync(r.default.dirname(t))||a.default.mkdirSync(r.default.dirname(t),{recursive:!0}),a.default.writeFileSync(t,JSON.stringify(M,null,2))}if(o===`json`)console.log(JSON.stringify(M,null,2));else if(o===`pretty`){let e=T.reduce((e,t)=>(e[t.file]||(e[t.file]=[]),e[t.file].push(t),e),{});if(T.length>0){(0,s.dividerLog)();for(let[n,r]of Object.entries(e)){let e=[];for(let n of r){let r=n.level===`high`?`❌`:n.level===`warning`?`⚠️`:`ℹ️`,i=n.level===`high`?s.colors.red:n.level===`warning`?s.colors.yellow:s.colors.blue;e.push(`${r} ${i(n.level.toUpperCase())}: ${n.message}`),n.suggestion&&e.push(` ${s.colors.dim(`💡 ${n.suggestion}`)}`),t.fix&&n.fix&&e.push(` ${s.colors.green(`✅ Fixed automatically`)}`)}console.log(`\n${(0,s.single)(`📄 ${n}`,e)}`)}(0,s.dividerLog)()}if(T.length===0)console.log((0,s.round)(`✨ Documentation Health Check`,[` Everything looks perfect!`,` Your documentation is in great shape.`,``,` ${s.colors.dim(`Scanned ${p.length} file${p.length===1?``:`s`} in ${D}s`)}`]));else{let e=[];k>0&&e.push(s.colors.red(`${k} Critical Error${k===1?``:`s`}`)),A>0&&e.push(s.colors.yellow(`${A} Warning${A===1?``:`s`}`)),j>0&&e.push(s.colors.blue(`${j} Improvement${j===1?``:`s`}`));let t=[...(0,s.bullet)(e).split(`
|
|
28
|
+
`).map(e=>e.trimStart()),``,s.colors.dim(`Scanned ${p.length} file${p.length===1?``:`s`} in ${D}s`)];console.log(`\n${(0,s.double)(`Diagnosis Results`,t)}\n`),E>0&&(0,s.success)(`Successfully fixed ${E} issues automatically!`),k>0?(0,s.error)(`Please fix the critical errors before building for production.`):(0,s.success)(`No critical issues found. You are ready to go!`)}}n.reporting.failOnError&&k>0&&process.exit(1),n.reporting.maxWarnings!==-1&&A>n.reporting.maxWarnings&&(o===`pretty`&&(0,s.error)(`Failed: Too many warnings (${A} > ${n.reporting.maxWarnings})`),process.exit(1))}catch(e){(0,s.error)(`Doctor failed: ${e}`),process.exit(1)}}Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return E}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return ee}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return F}});
|