boltdocs 3.2.1 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/boltdocs.js +20 -1
- package/bin/preloader.mjs +28 -0
- package/dist/{adapters-ByYY44Zy.mjs → adapters-BmB4TKCc.mjs} +1 -1
- package/dist/{adapters-DvmtpdSF.cjs → adapters-Cp1Maurn.cjs} +1 -1
- package/dist/audit-CLXjMzwQ.mjs +11 -0
- package/dist/audit-COgjnQ5n.cjs +11 -0
- package/dist/build-BS2hefiL.cjs +6 -0
- package/dist/build-C5mNh9D-.mjs +6 -0
- package/dist/cache-CJE9nWLE.cjs +6 -0
- package/dist/cache-OY4HzIXl.mjs +6 -0
- package/dist/callout-oI_LCbxS.d.ts +71 -0
- package/dist/callout-plqx9Dw-.d.cts +71 -0
- package/dist/client/index.cjs +1265 -569
- package/dist/client/index.d.cts +3 -542
- package/dist/client/index.d.ts +3 -542
- package/dist/client/index.js +1167 -521
- package/dist/client/mdx.cjs +1 -1
- package/dist/client/mdx.d.cts +24 -2
- package/dist/client/mdx.d.ts +24 -2
- package/dist/client/mdx.js +1 -1
- package/dist/client/primitives.cjs +14 -4
- package/dist/client/primitives.d.cts +281 -38
- package/dist/client/primitives.d.ts +281 -38
- package/dist/client/primitives.js +5 -5
- package/dist/client/router.cjs +49 -0
- package/dist/client/router.d.cts +3 -0
- package/dist/client/router.d.ts +3 -0
- package/dist/client/router.js +8 -0
- package/dist/client/theme/reset.css +40 -4
- package/dist/{config-BpzaPsJj.d.cts → config-BoRlz0Ca.d.mts} +157 -14
- package/dist/{config-xtS0ZkMm.d.mts → config-CTsX_tGM.d.cts} +157 -14
- package/dist/config-Ceib-AOH.cjs +7 -0
- package/dist/config-DGLQsy7y.mjs +7 -0
- package/dist/{package-BcISI5-P.cjs → config-files-BYHDOrKn.mjs} +1 -1
- package/dist/config-files-D9cdBMl2.cjs +6 -0
- package/dist/config-jJh8WYJI.cjs +6 -0
- package/dist/csp-C4LmN1ko.cjs +6 -0
- package/dist/csp-D6JEOqKh.mjs +6 -0
- package/dist/dev-Ch3hEe5Y.cjs +6 -0
- package/dist/dev-QPNxysrd.mjs +6 -0
- package/dist/{docs-layout-BdtZ9z6s.js → docs-layout-CbZ7LDRe.js} +504 -249
- package/dist/{docs-layout-CFWI15Id.cjs → docs-layout-vzfXed1Q.cjs} +516 -254
- package/dist/{doctor-BBtmNJE0.cjs → doctor-B1_YL0Wt.cjs} +1 -1
- package/dist/doctor-C7whl4ED.cjs +6 -0
- package/dist/doctor-DmQnml2k.mjs +6 -0
- package/dist/{generator-COepVWGi.cjs → generator-BlW45ST7.cjs} +5 -3
- package/dist/{generator-CcOBN5vI.mjs → generator-BwknNejd.mjs} +5 -3
- package/dist/{handler-XX7cLTqe.cjs → handler-CDEoKARD.cjs} +2 -2
- package/dist/{handler-DzQae4eA.mjs → handler-D7UyZlPm.mjs} +2 -2
- package/dist/{image-Bz87fCla.js → image-B-NDSDuY.js} +129 -11
- package/dist/{image-C4TlpMHn.cjs → image-Hnaa2bJd.cjs} +175 -9
- package/dist/index-C56bL-A-.d.cts +1344 -0
- package/dist/{sidebar-COTaMHR-.d.ts → index-CPUUKzxD.d.cts} +344 -327
- package/dist/{sidebar-CrEdJuHX.d.cts → index-Ci4kfOHF.d.ts} +344 -327
- package/dist/index-Cu9H6CRa.d.ts +1344 -0
- package/dist/link-CgdI6O2o.js +872 -0
- package/dist/{link-D1Gjkb-2.cjs → link-vZjmD-es.cjs} +406 -223
- package/dist/{mdx-BuO6a1f7.js → mdx-BRT71V5Q.js} +211 -168
- package/dist/{mdx-CD-tSjRG.cjs → mdx-D0Absdq5.cjs} +225 -169
- package/dist/native-BNCY7PRF.cjs +6 -0
- package/dist/native-Di9Fnfrv.mjs +6 -0
- package/dist/native-Kre2T5eS.cjs +6 -0
- package/dist/node/cache.cjs +1 -1
- package/dist/node/cache.d.cts +19 -3
- package/dist/node/cache.d.mts +19 -3
- package/dist/node/cache.mjs +1 -1
- package/dist/node/cli-entry.cjs +1 -9
- package/dist/node/cli-entry.mjs +1 -9
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.d.cts +245 -17
- package/dist/node/index.d.mts +246 -18
- package/dist/node/index.mjs +1 -1
- package/dist/node/mdx/shiki-adapter.cjs +1 -1
- package/dist/node/mdx/shiki-adapter.d.cts +24 -3
- package/dist/node/mdx/shiki-adapter.d.mts +24 -2
- package/dist/node/mdx/shiki-adapter.mjs +1 -1
- package/dist/node-Du5UL5wo.mjs +23 -0
- package/dist/node-DunuGqyp.cjs +23 -0
- package/dist/{package-CCYEAYeA.mjs → package-DA848keM.mjs} +1 -1
- package/dist/package-wplzySjz.cjs +6 -0
- package/dist/pages-external-BBw8ObVK.mjs +6 -0
- package/dist/pages-external-DPiPFxxP.cjs +6 -0
- package/dist/parser-BqTOsEUa.cjs +6 -0
- package/dist/parser-CGMY2lJ7.mjs +6 -0
- package/dist/plugin-BcTzvHAJ.mjs +69 -0
- package/dist/plugin-TulVMt1z.cjs +69 -0
- package/dist/plugin-context-C-l90hFt.cjs +15 -0
- package/dist/plugin-context-wqHNSZum.mjs +15 -0
- package/dist/plugin-lifecycle-B1BzSHdn.cjs +6 -0
- package/dist/resolve-B7vWOd8R.cjs +6 -0
- package/dist/resolve-C2kKnk_5.mjs +6 -0
- package/dist/resolve-It1Iug83.cjs +6 -0
- package/dist/resolve-YdTrt_FG.mjs +6 -0
- package/dist/router-C3kygdRK.cjs +1285 -0
- package/dist/router-CZBxMRAH.js +987 -0
- package/dist/routes-BL4y79tb.mjs +6 -0
- package/dist/routes-C2nPecwu.cjs +6 -0
- package/dist/routes-U9L8psZ9.cjs +6 -0
- package/dist/{search-dialog-DHqwjJuG.cjs → search-dialog-BCOHQGSt.cjs} +1 -1
- package/dist/search-dialog-Bp_P1MPP.js +481 -0
- package/dist/{search-dialog-DFnlx8LO.js → search-dialog-BqkzDTq2.js} +107 -57
- package/dist/{search-dialog-BRFno7HD.cjs → search-dialog-CIeIUhAn.cjs} +218 -43
- package/dist/{search-dialog-D6TvjcuV.js → search-dialog-DtmxmfEu.js} +1 -1
- package/dist/{search-dialog-B1NERUNx.cjs → search-dialog-x_qHU8ty.cjs} +107 -58
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.d.mts +1 -1
- package/dist/server/index.mjs +1 -1
- package/dist/update-check-BKqmYfwT.cjs +11 -0
- package/dist/update-check-QnrVR3q1.mjs +11 -0
- package/dist/utils-8lzafE49.mjs +7 -0
- package/dist/utils-ej6_SjIZ.cjs +7 -0
- package/dist/virtual-modules-Ca5tHk1X.cjs +30 -0
- package/dist/virtual-modules-Dlgt1fP0.mjs +30 -0
- package/package.json +18 -16
- package/src/shared/mdx-path.ts +12 -0
- package/src/shared/structured-data.ts +145 -0
- package/src/shared/types.ts +220 -16
- package/dist/banner-BMop1KLF.d.ts +0 -100
- package/dist/banner-CVD0GugR.d.cts +0 -100
- package/dist/cache-CO4Dy2uQ.cjs +0 -6
- package/dist/cache-Dk53iOo6.mjs +0 -6
- package/dist/config-CCXp3aXO.mjs +0 -7
- package/dist/config-CMd4XoFq.cjs +0 -6
- package/dist/config-DlGoEM9D.cjs +0 -7
- package/dist/csp-CRp_3U7a.cjs +0 -6
- package/dist/csp-oTC2ygvF.mjs +0 -6
- package/dist/doctor-Bv16QSrI.cjs +0 -7
- package/dist/doctor-DOAbSaiL.mjs +0 -7
- package/dist/headers-Ddwek8K7.mjs +0 -6
- package/dist/headers-dg4SDrjY.cjs +0 -6
- package/dist/link-2PzgTnaP.js +0 -673
- package/dist/meta-loader-C4Hu9RN9.mjs +0 -6
- package/dist/meta-loader-Dq1zcFnh.cjs +0 -6
- package/dist/node-BXtqM1uH.mjs +0 -6
- package/dist/node-BlVk4EVg.cjs +0 -104
- package/dist/node-DOf4zhWc.mjs +0 -104
- package/dist/node-aD1eisrR.cjs +0 -6
- package/dist/pages-external-BYa4JSda.mjs +0 -6
- package/dist/pages-external-XkYIs-d5.cjs +0 -6
- package/dist/parser-DCiEWkSk.cjs +0 -8
- package/dist/parser-qk9FIHJ7.mjs +0 -8
- package/dist/plugin-C95kvu6h.mjs +0 -73
- package/dist/plugin-DM3u2bVj.cjs +0 -73
- package/dist/routes-BW6zsk7Z.mjs +0 -6
- package/dist/routes-BgoIB5wb.cjs +0 -6
- package/dist/routes-CORVxc02.cjs +0 -6
- package/dist/search-dialog-BmxHiKwt.js +0 -312
- package/dist/shiki-adapter-CoQ6jyJ4.cjs +0 -6
- package/dist/shiki-adapter-D-aKw7PP.mjs +0 -6
- package/dist/utils-Crm9oPcV.mjs +0 -7
- package/dist/utils-D6Xtj0FZ.cjs +0 -7
- /package/dist/{errors-0zGHRLue.mjs → errors-N-b6Sn2G.mjs} +0 -0
- /package/dist/{index-1KsTDq4o.d.mts → index-lFoyzCXy.d.mts} +0 -0
- /package/dist/{types-generator-BXhv7Ill.cjs → types-generator-DDSA93P3.cjs} +0 -0
- /package/dist/{types-generator-bDPvUztF.mjs → types-generator-DG1GX1EZ.mjs} +0 -0
package/dist/node/index.d.mts
CHANGED
|
@@ -1,11 +1,45 @@
|
|
|
1
1
|
|
|
2
|
-
import { flushCache } from "./cache.mjs";
|
|
3
|
-
import { i as handleVercelFeedback, n as handleWebFeedback, r as handleNetlifyFeedback, t as handleAwsFeedback } from "../index-
|
|
4
|
-
import { a as BoltdocsThemeConfig, c as
|
|
2
|
+
import { FileCache, flushCache } from "./cache.mjs";
|
|
3
|
+
import { i as handleVercelFeedback, n as handleWebFeedback, r as handleNetlifyFeedback, t as handleAwsFeedback } from "../index-lFoyzCXy.mjs";
|
|
4
|
+
import { C as StructuredData, _ as PluginServerMiddleware, a as BoltdocsThemeConfig, b as RegisteredVirtualModule, c as ExternalFileRoute, d as JsonLdValue, f as PluginContext, g as PluginMeta, h as PluginLogger, i as BoltdocsExperimentalConfig, l as IPluginLifecycleManager, m as PluginLifecycleHooks, n as defineConfig, o as BoltdocsViewTransitionsConfig, p as PluginHmrEvent, r as BoltdocsConfig, s as DiagnosticRecord, t as resolveConfig, u as JsonLdObject, v as PluginStore, x as RouteMeta, y as PluginTransformMiddleware } from "../config-BoRlz0Ca.mjs";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { InlineConfig, Plugin } from "vite";
|
|
7
7
|
export * from "@bdocs/unist-utils";
|
|
8
8
|
|
|
9
|
+
//#region src/node/routes/types.d.ts
|
|
10
|
+
interface DirectoryMeta {
|
|
11
|
+
title?: string;
|
|
12
|
+
order?: string[] | number;
|
|
13
|
+
icon?: string;
|
|
14
|
+
collapsible?: boolean;
|
|
15
|
+
collapsed?: boolean;
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Internal representation of a parsed documentation file before finalizing groups.
|
|
20
|
+
* Stored in the file cache to avoid re-parsing unchanged files.
|
|
21
|
+
*/
|
|
22
|
+
interface ParsedDocFile {
|
|
23
|
+
/** The core route metadata without group-level details (inferred later) */
|
|
24
|
+
route: Omit<RouteMeta, 'group' | 'groupTitle' | 'groupPosition'>;
|
|
25
|
+
/** The base directory of the file (used to group files together) */
|
|
26
|
+
relativeDir?: string;
|
|
27
|
+
/** Whether this file is the index file for its directory group */
|
|
28
|
+
isGroupIndex: boolean;
|
|
29
|
+
/** If this is a group index, any specific frontmatter metadata dictating the group's title and position */
|
|
30
|
+
groupMeta?: {
|
|
31
|
+
title: string;
|
|
32
|
+
position?: number;
|
|
33
|
+
icon?: string;
|
|
34
|
+
};
|
|
35
|
+
/** Extracted group position from the directory name if it has a numeric prefix */
|
|
36
|
+
inferredGroupPosition?: number;
|
|
37
|
+
/** Extracted tab name from the directory name if it follows the (tab-name) syntax */
|
|
38
|
+
inferredTab?: string;
|
|
39
|
+
/** Extracted collection name from the [name] directory syntax */
|
|
40
|
+
inferredCollection?: string;
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
9
43
|
//#region src/node/plugin/types.d.ts
|
|
10
44
|
/**
|
|
11
45
|
* Configuration options specifically for the Boltdocs Vite plugin.
|
|
@@ -13,8 +47,14 @@ export * from "@bdocs/unist-utils";
|
|
|
13
47
|
interface BoltdocsPluginOptions {
|
|
14
48
|
/** The root directory containing markdown files (default: 'docs') */
|
|
15
49
|
docsDir?: string;
|
|
16
|
-
/**
|
|
17
|
-
|
|
50
|
+
/** Project root directory (defaults to cwd) */
|
|
51
|
+
root?: string;
|
|
52
|
+
/** Pre-computed routes. When provided, the plugin skips route generation in its config hook. */
|
|
53
|
+
routes?: RouteMeta[];
|
|
54
|
+
/** Internal build target flag used to keep client and SSR entry generation isolated. */
|
|
55
|
+
ssr?: boolean;
|
|
56
|
+
/** Use Sätteri's disk artifacts. Disabled for Vite serve/dev so HMR uses source MDX. */
|
|
57
|
+
useCompiledPages?: boolean;
|
|
18
58
|
}
|
|
19
59
|
//#endregion
|
|
20
60
|
//#region src/node/plugin/entry.d.ts
|
|
@@ -28,11 +68,89 @@ interface BoltdocsPluginOptions {
|
|
|
28
68
|
*/
|
|
29
69
|
declare function generateEntryCode(options: BoltdocsPluginOptions, config?: BoltdocsConfig): string;
|
|
30
70
|
//#endregion
|
|
31
|
-
//#region src/node/routes/
|
|
71
|
+
//#region src/node/routes/parser/cache.d.ts
|
|
32
72
|
/**
|
|
33
|
-
*
|
|
73
|
+
* Parsed-document cache scoped to one Boltdocs project.
|
|
74
|
+
*
|
|
75
|
+
* The old implementation kept one process-wide Map. That was fast, but a
|
|
76
|
+
* second project in the same process could observe the first project's
|
|
77
|
+
* parsed documents. Instances are intentionally cheap and are owned by a
|
|
78
|
+
* RouteCacheContext.
|
|
34
79
|
*/
|
|
35
|
-
declare
|
|
80
|
+
declare class ParserCache {
|
|
81
|
+
private readonly memoryCache;
|
|
82
|
+
private readonly cacheDir;
|
|
83
|
+
constructor(root?: string, namespace?: string);
|
|
84
|
+
get(file: string): Promise<ParsedDocFile | null>;
|
|
85
|
+
set(file: string, data: ParsedDocFile): Promise<void>;
|
|
86
|
+
invalidate(file: string): void;
|
|
87
|
+
/**
|
|
88
|
+
* Clear only the process-local entries.
|
|
89
|
+
*
|
|
90
|
+
* Disk shards are versioned and validated by `get()` using the source mtime,
|
|
91
|
+
* so deleting the whole directory on every route invalidation only creates
|
|
92
|
+
* unnecessary I/O and forces unchanged files to be parsed again. Stale
|
|
93
|
+
* shards are harmless and are naturally replaced when their files change.
|
|
94
|
+
*/
|
|
95
|
+
clear(): void;
|
|
96
|
+
get size(): number;
|
|
97
|
+
}
|
|
98
|
+
declare namespace ParserCache {
|
|
99
|
+
const get: (file: string) => Promise<ParsedDocFile | null>;
|
|
100
|
+
const set: (file: string, data: ParsedDocFile) => Promise<void>;
|
|
101
|
+
const invalidate: (file: string) => void;
|
|
102
|
+
const clear: () => void;
|
|
103
|
+
}
|
|
104
|
+
//#endregion
|
|
105
|
+
//#region src/node/routes/cache.d.ts
|
|
106
|
+
interface DirectoryMetaCacheEntry {
|
|
107
|
+
mtimeMs: number;
|
|
108
|
+
size: number;
|
|
109
|
+
content: DirectoryMeta;
|
|
110
|
+
}
|
|
111
|
+
interface RouteDiscoverySnapshot {
|
|
112
|
+
version: 1;
|
|
113
|
+
files: string[];
|
|
114
|
+
directoryMetaFiles: string[];
|
|
115
|
+
directories: Record<string, number>;
|
|
116
|
+
}
|
|
117
|
+
interface RouteCacheVariant {
|
|
118
|
+
readonly fingerprint: string;
|
|
119
|
+
readonly docCache: FileCache<ParsedDocFile>;
|
|
120
|
+
readonly parserCache: ParserCache;
|
|
121
|
+
cachedFileList: string[] | null;
|
|
122
|
+
localizedPathCache: Map<string, string>;
|
|
123
|
+
cachedNativeDocs: Record<string, any> | null;
|
|
124
|
+
frontmatterHashes: Map<string, string>;
|
|
125
|
+
directoryMeta: Record<string, DirectoryMeta> | null;
|
|
126
|
+
cachedDirectoryMetaFiles: string[] | null;
|
|
127
|
+
directoryMetaEntries: Map<string, DirectoryMetaCacheEntry>;
|
|
128
|
+
discoverySnapshot: RouteDiscoverySnapshot | null;
|
|
129
|
+
discoverySnapshotLoaded: boolean;
|
|
130
|
+
readonly discoverySnapshotPath: string;
|
|
131
|
+
}
|
|
132
|
+
interface RouteCacheContext {
|
|
133
|
+
readonly docsDir: string;
|
|
134
|
+
readonly cacheRoot: string;
|
|
135
|
+
/** Legacy active cache facade used by HMR/plugin consumers. */
|
|
136
|
+
docCache: FileCache<ParsedDocFile>;
|
|
137
|
+
parserCache: ParserCache;
|
|
138
|
+
cachedFileList: string[] | null;
|
|
139
|
+
localizedPathCache: Map<string, string>;
|
|
140
|
+
cachedNativeDocs: Record<string, any> | null;
|
|
141
|
+
frontmatterHashes: Map<string, string>;
|
|
142
|
+
directoryMeta: Record<string, DirectoryMeta> | null;
|
|
143
|
+
cachedDirectoryMetaFiles: string[] | null;
|
|
144
|
+
readonly variants: Map<string, RouteCacheVariant>;
|
|
145
|
+
activeVariant: RouteCacheVariant | null;
|
|
146
|
+
activeGenerations: Map<string, Promise<RouteMeta[]>>;
|
|
147
|
+
generationEpoch: number;
|
|
148
|
+
disposed: boolean;
|
|
149
|
+
}
|
|
150
|
+
//#endregion
|
|
151
|
+
//#region src/node/routes/index.d.ts
|
|
152
|
+
/** Invalidates one project's route metadata and parser state. */
|
|
153
|
+
declare function invalidateRouteCache(contextOrDocsDir?: RouteCacheContext | string): void;
|
|
36
154
|
/**
|
|
37
155
|
* Generates the entire route map for the documentation site.
|
|
38
156
|
*
|
|
@@ -44,10 +162,64 @@ declare function invalidateRouteCache(): void;
|
|
|
44
162
|
* @param basePath - The base URL path for the routes (default: '/docs')
|
|
45
163
|
* @returns A promise resolving to an array of RouteMeta objects
|
|
46
164
|
*/
|
|
47
|
-
declare function generateRoutes(docsDir: string, config?: BoltdocsConfig, basePath?: string, forceScan?: boolean,
|
|
165
|
+
declare function generateRoutes(docsDir: string, config?: BoltdocsConfig, basePath?: string, forceScan?: boolean, cacheContext?: RouteCacheContext, cacheVariant?: RouteCacheVariant): Promise<RouteMeta[]>;
|
|
166
|
+
//#endregion
|
|
167
|
+
//#region src/shared/structured-data.d.ts
|
|
168
|
+
interface WebSiteStructuredDataOptions {
|
|
169
|
+
name: string;
|
|
170
|
+
url: string;
|
|
171
|
+
description?: string;
|
|
172
|
+
searchUrl?: string;
|
|
173
|
+
}
|
|
174
|
+
interface ArticleStructuredDataOptions {
|
|
175
|
+
headline: string;
|
|
176
|
+
url: string;
|
|
177
|
+
description?: string;
|
|
178
|
+
datePublished?: string | Date;
|
|
179
|
+
dateModified?: string | Date;
|
|
180
|
+
image?: string;
|
|
181
|
+
author?: string | {
|
|
182
|
+
name: string;
|
|
183
|
+
url?: string;
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
interface BreadcrumbStructuredDataItem {
|
|
187
|
+
name: string;
|
|
188
|
+
url: string;
|
|
189
|
+
}
|
|
190
|
+
interface StructuredDataFactoryOptions {
|
|
191
|
+
/** A WebSite graph for the global site identity. */
|
|
192
|
+
website?: WebSiteStructuredDataOptions;
|
|
193
|
+
/** An Article graph for the current page or release post. */
|
|
194
|
+
article?: ArticleStructuredDataOptions;
|
|
195
|
+
/** A BreadcrumbList graph for the current page hierarchy. */
|
|
196
|
+
breadcrumbs?: BreadcrumbStructuredDataItem[];
|
|
197
|
+
/** Additional graph nodes for schema types not covered by the presets. */
|
|
198
|
+
additional?: JsonLdObject | JsonLdObject[];
|
|
199
|
+
}
|
|
200
|
+
/** Preserve literal JSON-LD types in config files and frontmatter helpers. */
|
|
201
|
+
declare function defineStructuredData<T extends StructuredData>(data: T): T;
|
|
202
|
+
/**
|
|
203
|
+
* Creates one JSON-LD value from the common website/article/breadcrumb presets.
|
|
204
|
+
* Single-node input returns an object; multiple nodes return a graph array.
|
|
205
|
+
*/
|
|
206
|
+
declare function createStructuredData(options: StructuredDataFactoryOptions): StructuredData;
|
|
207
|
+
declare function createWebSiteStructuredData(options: WebSiteStructuredDataOptions): JsonLdObject;
|
|
208
|
+
declare function createArticleStructuredData(options: ArticleStructuredDataOptions): JsonLdObject;
|
|
209
|
+
declare function createBreadcrumbStructuredData(items: BreadcrumbStructuredDataItem[]): JsonLdObject;
|
|
48
210
|
//#endregion
|
|
49
211
|
//#region src/node/plugins/plugin-types.d.ts
|
|
50
|
-
interface
|
|
212
|
+
interface PluginCssConfig {
|
|
213
|
+
/** CSS files to inject automatically into entry bundle */
|
|
214
|
+
cssFiles?: string[];
|
|
215
|
+
/** Inline CSS strings to inject into HTML <head> */
|
|
216
|
+
headStyles?: string[];
|
|
217
|
+
/** PostCSS plugins to append to Vite CSS pipeline */
|
|
218
|
+
postcssPlugins?: unknown[];
|
|
219
|
+
/** Vite CSS preprocessor options (e.g. scss, less, stylus) */
|
|
220
|
+
preprocessorOptions?: Record<string, unknown>;
|
|
221
|
+
}
|
|
222
|
+
interface BoltdocsPlugin {
|
|
51
223
|
name: string;
|
|
52
224
|
enforce?: 'pre' | 'post';
|
|
53
225
|
version?: string;
|
|
@@ -57,6 +229,7 @@ interface SecureBoltdocsPlugin {
|
|
|
57
229
|
vitePlugins?: Plugin[];
|
|
58
230
|
components?: Record<string, string>;
|
|
59
231
|
metadata?: Record<string, unknown>;
|
|
232
|
+
css?: PluginCssConfig;
|
|
60
233
|
middleware?: PluginTransformMiddleware[];
|
|
61
234
|
hooks?: PluginLifecycleHooks;
|
|
62
235
|
}
|
|
@@ -104,10 +277,24 @@ declare class BoltdocsPluginStore implements PluginStore {
|
|
|
104
277
|
}
|
|
105
278
|
//#endregion
|
|
106
279
|
//#region src/node/plugins/plugin-validator.d.ts
|
|
107
|
-
declare function validatePlugins(plugins: any[], boltdocsVersion: string):
|
|
280
|
+
declare function validatePlugins(plugins: any[], boltdocsVersion: string): BoltdocsPlugin[];
|
|
281
|
+
//#endregion
|
|
282
|
+
//#region src/node/plugins/plugin-context.d.ts
|
|
283
|
+
interface PluginRuntimeState {
|
|
284
|
+
virtualModuleRegistry: Map<string, RegisteredVirtualModule>;
|
|
285
|
+
middlewareRegistry: Map<string, PluginTransformMiddleware>;
|
|
286
|
+
diagnosticRecords: DiagnosticRecord[];
|
|
287
|
+
diagnosticIdCounter: number;
|
|
288
|
+
hmrFileHandlers: Map<PluginHmrEvent, Set<(filePath: string) => void | Promise<void>>>;
|
|
289
|
+
hmrSender: ((event: string, data?: unknown) => void) | null;
|
|
290
|
+
pluginServerMiddleware: PluginServerMiddleware[];
|
|
291
|
+
serverStartCallbacks: Array<() => void | Promise<void>>;
|
|
292
|
+
serverEndCallbacks: Array<() => void | Promise<void>>;
|
|
293
|
+
}
|
|
108
294
|
//#endregion
|
|
109
295
|
//#region src/node/plugins/plugin-lifecycle.d.ts
|
|
110
|
-
declare
|
|
296
|
+
declare function resolvePluginHook(plugin: BoltdocsPlugin, hookName: keyof PluginLifecycleHooks | string): Function | undefined;
|
|
297
|
+
declare class PluginLifecycleManager implements IPluginLifecycleManager {
|
|
111
298
|
private plugins;
|
|
112
299
|
private config;
|
|
113
300
|
private store;
|
|
@@ -115,7 +302,10 @@ declare class PluginLifecycleManager {
|
|
|
115
302
|
private rootDir;
|
|
116
303
|
private routes;
|
|
117
304
|
private outDir;
|
|
118
|
-
|
|
305
|
+
private runtime;
|
|
306
|
+
private routeCacheContext;
|
|
307
|
+
private routeCacheVariant;
|
|
308
|
+
constructor(plugins: BoltdocsPlugin[], config: BoltdocsConfig, docsDir?: string, rootDir?: string, routes?: RouteMeta[], outDir?: string, runtime?: PluginRuntimeState, routeCacheContext?: RouteCacheContext, routeCacheVariant?: RouteCacheVariant);
|
|
119
309
|
runHook(hookName: keyof PluginLifecycleHooks, ...args: unknown[]): Promise<void>;
|
|
120
310
|
runChain<TParams extends Record<string, unknown>>(hookName: keyof PluginLifecycleHooks, initialParams: TParams): Promise<TParams>;
|
|
121
311
|
/**
|
|
@@ -124,6 +314,7 @@ declare class PluginLifecycleManager {
|
|
|
124
314
|
* hooks or declared statically via `BoltdocsPlugin.middleware` are all
|
|
125
315
|
* collected. Execution respects `__signal: 'skip'` and `__signal: 'break'`.
|
|
126
316
|
*/
|
|
317
|
+
hasHook(hookName: keyof PluginLifecycleHooks | 'transformSource' | 'transformMdx' | 'transformHtml'): boolean;
|
|
127
318
|
runMiddlewareChain<TParams extends Record<string, unknown>>(hookName: 'transformSource' | 'transformMdx' | 'transformHtml', initialParams: TParams): Promise<TParams>;
|
|
128
319
|
private getSortedPlugins;
|
|
129
320
|
private createStep;
|
|
@@ -132,8 +323,33 @@ declare class PluginLifecycleManager {
|
|
|
132
323
|
private createLogger;
|
|
133
324
|
}
|
|
134
325
|
//#endregion
|
|
135
|
-
//#region src/node/plugins/
|
|
136
|
-
|
|
326
|
+
//#region src/node/plugins/define-plugin.d.ts
|
|
327
|
+
type PluginFactory<TOptions = Record<string, unknown>> = (options?: TOptions) => BoltdocsPlugin;
|
|
328
|
+
/**
|
|
329
|
+
* Creates and defines a Boltdocs plugin with strong TypeScript inference.
|
|
330
|
+
* Supports both a static plugin object or an options-factory function.
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* ```ts
|
|
334
|
+
* export default definePlugin<MyOptions>((options) => ({
|
|
335
|
+
* name: 'my-plugin',
|
|
336
|
+
* version: '1.0.0',
|
|
337
|
+
* client: {
|
|
338
|
+
* slots: { 'header:right': './components/HeaderActions.tsx' },
|
|
339
|
+
* },
|
|
340
|
+
* hooks: {
|
|
341
|
+
* 'frontmatter:transform'(ctx, { frontmatter }) {
|
|
342
|
+
* return { ...frontmatter, readingTime: 5 }
|
|
343
|
+
* },
|
|
344
|
+
* },
|
|
345
|
+
* }))
|
|
346
|
+
* ```
|
|
347
|
+
*/
|
|
348
|
+
declare function definePlugin<TOptions = Record<string, unknown>>(pluginOrFactory: BoltdocsPlugin | PluginFactory<TOptions>): PluginFactory<TOptions> & ((options?: TOptions) => BoltdocsPlugin);
|
|
349
|
+
/**
|
|
350
|
+
* Alias for `definePlugin` for backwards compatibility.
|
|
351
|
+
*/
|
|
352
|
+
declare function createPlugin<TOptions = Record<string, unknown>>(pluginOrFactory: BoltdocsPlugin | PluginFactory<TOptions>): BoltdocsPlugin | (PluginFactory<TOptions> & ((options?: TOptions) => BoltdocsPlugin));
|
|
137
353
|
//#endregion
|
|
138
354
|
//#region src/node/feedback/handler.d.ts
|
|
139
355
|
interface FeedbackHandlerOptions {
|
|
@@ -167,13 +383,25 @@ declare function normalizePath(p: string): string;
|
|
|
167
383
|
*/
|
|
168
384
|
declare function sanitizeFilename(name: string): string;
|
|
169
385
|
declare namespace index_d_exports {
|
|
170
|
-
export { BoltdocsConfig, BoltdocsPlugin, BoltdocsPluginOptions, BoltdocsPluginStore, BoltdocsThemeConfig, PluginCompatibilityError, PluginContext, PluginError, PluginHookError, PluginLifecycleHooks, PluginLifecycleManager, PluginLogger, PluginMeta, PluginStore, PluginValidationError, RouteMeta,
|
|
386
|
+
export { ArticleStructuredDataOptions, BoltdocsConfig, BoltdocsExperimentalConfig, BoltdocsPlugin, BoltdocsPluginOptions, BoltdocsPluginStore, BoltdocsThemeConfig, BoltdocsViewTransitionsConfig, BreadcrumbStructuredDataItem, CreateViteConfigOptions, ExternalFileRoute, IPluginLifecycleManager, JsonLdObject, JsonLdValue, PluginCompatibilityError, PluginContext, PluginCssConfig, PluginError, PluginFactory, PluginHookError, PluginLifecycleHooks, PluginLifecycleManager, PluginLogger, PluginMeta, PluginStore, PluginValidationError, RouteMeta, StructuredData, StructuredDataFactoryOptions, WebSiteStructuredDataOptions, createArticleStructuredData, createBreadcrumbStructuredData, createPlugin, createStructuredData, createViteConfig, createWebSiteStructuredData, boltdocs as default, defineConfig, definePlugin, defineStructuredData, flushCache, generateEntryCode, generateRoutes, handleAwsFeedback, handleFeedback, handleNetlifyFeedback, handleVercelFeedback, handleWebFeedback, invalidateRouteCache, normalizePath, resolveConfig, resolvePluginHook, sanitizeFilename, validatePlugins };
|
|
387
|
+
}
|
|
388
|
+
interface CreateViteConfigOptions {
|
|
389
|
+
/** Pre-computed routes. When provided, route generation is skipped. */
|
|
390
|
+
routes?: RouteMeta[];
|
|
391
|
+
/** Skip generating project types (they were already generated elsewhere). */
|
|
392
|
+
skipTypes?: boolean;
|
|
393
|
+
/** Skip writing the link tree (it was already written elsewhere). */
|
|
394
|
+
skipLinkTree?: boolean;
|
|
395
|
+
/** Skip route generation entirely. Routes will be generated lazily by virtual modules. */
|
|
396
|
+
skipRoutes?: boolean;
|
|
397
|
+
/** Static asset directory relative to the project root (default: docs/public). */
|
|
398
|
+
publicDir?: string | false;
|
|
171
399
|
}
|
|
172
400
|
declare function boltdocs(options?: BoltdocsPluginOptions): Promise<Plugin[]>;
|
|
173
401
|
/**
|
|
174
402
|
* Generates the complete Vite configuration for a Boltdocs project.
|
|
175
403
|
* This is used by the Boltdocs CLI to run Vite without a user-defined vite.config.ts.
|
|
176
404
|
*/
|
|
177
|
-
declare function createViteConfig(root: string, mode?: 'development' | 'production', preResolvedConfig?: BoltdocsConfig,
|
|
405
|
+
declare function createViteConfig(root: string, mode?: 'development' | 'production', preResolvedConfig?: BoltdocsConfig, options?: CreateViteConfigOptions): Promise<InlineConfig>;
|
|
178
406
|
//#endregion
|
|
179
|
-
export { type BoltdocsConfig, type BoltdocsPlugin, type BoltdocsPluginOptions, BoltdocsPluginStore, type BoltdocsThemeConfig, PluginCompatibilityError, type PluginContext, PluginError, PluginHookError, type PluginLifecycleHooks, PluginLifecycleManager, type PluginLogger, type PluginMeta, type PluginStore, PluginValidationError, type RouteMeta,
|
|
407
|
+
export { type ArticleStructuredDataOptions, type BoltdocsConfig, type BoltdocsExperimentalConfig, BoltdocsPlugin, type BoltdocsPluginOptions, BoltdocsPluginStore, type BoltdocsThemeConfig, type BoltdocsViewTransitionsConfig, type BreadcrumbStructuredDataItem, CreateViteConfigOptions, type ExternalFileRoute, type IPluginLifecycleManager, type JsonLdObject, type JsonLdValue, PluginCompatibilityError, type PluginContext, PluginCssConfig, PluginError, PluginFactory, PluginHookError, type PluginLifecycleHooks, PluginLifecycleManager, type PluginLogger, type PluginMeta, type PluginStore, PluginValidationError, type RouteMeta, type StructuredData, type StructuredDataFactoryOptions, type WebSiteStructuredDataOptions, createArticleStructuredData, createBreadcrumbStructuredData, createPlugin, createStructuredData, createViteConfig, createWebSiteStructuredData, boltdocs as default, defineConfig, definePlugin, defineStructuredData, flushCache, generateEntryCode, generateRoutes, handleAwsFeedback, handleFeedback, handleNetlifyFeedback, handleVercelFeedback, handleWebFeedback, invalidateRouteCache, normalizePath, resolveConfig, resolvePluginHook, sanitizeFilename, validatePlugins };
|
package/dist/node/index.mjs
CHANGED
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Copyright (c) 2026 Jesus Alcala
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
import{_ as
|
|
6
|
+
import{g as e}from"../plugin-context-wqHNSZum.mjs";import{_ as t,a as n,b as r,d as i,f as a,g as o,h as s,i as c,m as l,n as u,p as d,r as f,s as p,t as m,u as h,v as g,y as _}from"../node-Du5UL5wo.mjs";import{f as v,u as y}from"../utils-8lzafE49.mjs";import{flushCache as b}from"./cache.mjs";import{r as x,t as S}from"../routes-BL4y79tb.mjs";import{i as C,n as w}from"../config-DGLQsy7y.mjs";import{t as T}from"../handler-D7UyZlPm.mjs";import{i as E,n as D,r as O,t as k}from"../adapters-BmB4TKCc.mjs";export*from"@bdocs/unist-utils";export{i as BoltdocsPluginStore,a as PluginCompatibilityError,d as PluginError,l as PluginHookError,n as PluginLifecycleManager,s as PluginValidationError,o as createArticleStructuredData,t as createBreadcrumbStructuredData,f as createPlugin,g as createStructuredData,u as createViteConfig,_ as createWebSiteStructuredData,m as default,C as defineConfig,c as definePlugin,r as defineStructuredData,b as flushCache,e as generateEntryCode,S as generateRoutes,k as handleAwsFeedback,T as handleFeedback,O as handleNetlifyFeedback,E as handleVercelFeedback,D as handleWebFeedback,x as invalidateRouteCache,y as normalizePath,w as resolveConfig,p as resolvePluginHook,v as sanitizeFilename,h as validatePlugins};
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Copyright (c) 2026 Jesus Alcala
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../
|
|
6
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../../chunk-D1Md3oWO.cjs`),t=require(`../../utils-ej6_SjIZ.cjs`);let n=require(`@bdocs/dui`),r=require(`@shikijs/engine-oniguruma`),i=require(`shiki/core`),a=require(`@shikijs/themes/github-light`);a=e.r(a);let o=require(`@shikijs/themes/github-dark`);o=e.r(o);let s=require(`@shikijs/langs/html`);s=e.r(s);let c=require(`@shikijs/langs/js`);c=e.r(c);let l=require(`@shikijs/langs/ts`);l=e.r(l);let u=require(`@shikijs/langs/tsx`);u=e.r(u);let d=require(`@shikijs/langs/css`);d=e.r(d);let f=require(`@shikijs/langs/bash`);f=e.r(f);let p=require(`@shikijs/langs/json`);p=e.r(p);let m=require(`@shikijs/langs/markdown`);m=e.r(m);let h=require(`@shikijs/langs/python`);h=e.r(h);let g=require(`@shikijs/langs/go`);g=e.r(g);const _=[a.default.default||a.default,o.default.default||o.default],v=[s.default,c.default,l.default,u.default,d.default,f.default,p.default,m.default,h.default,g.default],y={scss:()=>import(`@shikijs/langs/scss`),less:()=>import(`@shikijs/langs/less`),jsonc:()=>import(`@shikijs/langs/jsonc`),json5:()=>import(`@shikijs/langs/json5`),ini:()=>import(`@shikijs/langs/ini`),mdx:()=>import(`@shikijs/langs/mdx`),yaml:()=>import(`@shikijs/langs/yaml`),rust:()=>import(`@shikijs/langs/rust`),toml:()=>import(`@shikijs/langs/toml`),csv:()=>import(`@shikijs/langs/csv`),nginx:()=>import(`@shikijs/langs/nginx`),apache:()=>import(`@shikijs/langs/apache`),dockerfile:()=>import(`@shikijs/langs/dockerfile`),docker:()=>import(`@shikijs/langs/docker`),java:()=>import(`@shikijs/langs/java`),php:()=>import(`@shikijs/langs/php`),sql:()=>import(`@shikijs/langs/sql`),graphql:()=>import(`@shikijs/langs/graphql`),http:()=>import(`@shikijs/langs/http`),xml:()=>import(`@shikijs/langs/xml`),vue:()=>import(`@shikijs/langs/vue`),svelte:()=>import(`@shikijs/langs/svelte`),ruby:()=>import(`@shikijs/langs/ruby`),kotlin:()=>import(`@shikijs/langs/kotlin`),swift:()=>import(`@shikijs/langs/swift`),powershell:()=>import(`@shikijs/langs/powershell`),c:()=>import(`@shikijs/langs/c`),cpp:()=>import(`@shikijs/langs/cpp`),elixir:()=>import(`@shikijs/langs/elixir`)},b={javascript:`js`,typescript:`ts`,shell:`bash`,sh:`bash`,zsh:`bash`,console:`bash`,terminal:`bash`,shellsession:`bash`,yml:`yaml`,py:`python`,golang:`go`,rs:`rust`,rb:`ruby`,kt:`kotlin`},x=new Set([`text`,`plaintext`,`txt`,`plain`,`ansi`,`none`]);function S(e){if(!e)return null;let t=e.trim().toLowerCase();return!t||x.has(t)?null:b[t]??t}let C=null;async function w(){return(0,r.createOnigurumaEngine)(await import(`shiki/wasm`))}const T=async e=>C||(C=(async()=>{let e=performance.now(),t=await(0,i.createHighlighterCore)({themes:_,langs:v,engine:await w()});return process.env.BOLTDOCS_DEBUG===`true`&&console.log(`[boltdocs] shiki-ready in ${Math.round(performance.now()-e)}ms (${v.length} langs)`),t})(),C),E=new Map;async function D(e){let t=S(e);if(!t)return!0;let n;try{n=await T()}catch{return!1}let r=[];try{r=n.getLoadedLanguages()}catch{r=[]}if(r.includes(t))return!0;let i=E.get(t);if(i)return i;let a=y[t];if(!a)return!1;let o=(async()=>{try{let e=await a(),t=e?.default??e;return await n.loadLanguage(t),!0}catch{return!1}finally{E.delete(t)}})();return E.set(t,o),o}const O={TITLE:`data-title`,LANG:`data-lang`,HIGHLIGHTED:`data-highlighted`,HIGHLIGHTED_HTML:`data-highlighted-html`},k={LINE_NUMBERS:`shiki-line-numbers`,WORD_WRAP:`shiki-word-wrap`,FALLBACK:`shiki-fallback`},A={LIGHT:`github-light`,DARK:`github-dark`},j={LANG:`plaintext`,MDX_DEFAULT_LANG:`text`},M=(e={})=>{let{activateByDefault:t=!1}=e;return{name:`boltdocs:line-numbers`,pre(e){let n=this.options.meta?.lineNumbers===!0;(t||n)&&this.addClassToHast(e,k.LINE_NUMBERS)}}},N=(e={})=>{let{activateByDefault:t=!1}=e;return{name:`boltdocs:word-wrap`,pre(e){let n=this.options.meta?.wordWrap===!0;(t||n)&&this.addClassToHast(e,k.WORD_WRAP)}}},P=()=>({name:`AddTitleProperty`,pre(e){let t=this.options.meta?.title;t&&(e.properties[O.TITLE]=t)}}),F=()=>({name:`AddLanguageProperty`,pre(e){e.properties[O.LANG]=this.options.lang||j.LANG}});function I(e){let t={};if(!e)return t;let n=(e,n)=>{if(n===`false`){t[e]=!1;return}(n===`true`||n===void 0)&&(t[e]=!0)},r=Array.from(e.matchAll(/(?:^|\s)(?:lineNumbers|showLineNumbers|show-line-numbers|show_line_numbers|line_numbers)(?:\s*=\s*(true|false))?(?=\s|$)/gi)),i=r[r.length-1];i&&n(`lineNumbers`,i[1]);let a=Array.from(e.matchAll(/(?:^|\s)(?:wordWrap|word-wrap|word_wrap)(?:\s*=\s*(true|false))?(?=\s|$)/gi)),o=a[a.length-1];o&&n(`wordWrap`,o[1]);let s=e.match(/title=(['"])(.*?)\1/);return s&&(t.title=s[2]),t}var L=class{config;constructor(e){this.config=e}getTheme(){return this.config?.theme?.codeTheme||{light:A.LIGHT,dark:A.DARK}}async getHighlighter(){return await T(this.getTheme())}getOptions(e,t){let n=this.getTheme(),r={},i=``;typeof t==`string`?(i=t,r=I(t)):t&&(r=t,i=t.__raw||``);let a={__raw:i};for(let[e,t]of Object.entries(r))e!==`__raw`&&Object.defineProperty(a,e,{value:t,enumerable:!1,configurable:!0,writable:!0});let o={lang:e||j.LANG,meta:a,transformers:[M(),N(),P(),F()]};return typeof n==`object`?o.themes={light:n.light,dark:n.dark}:o.theme=n,o}async render(e,r,i){try{await D(r||j.LANG);let t=await this.getHighlighter(),n=this.getOptions(r,i);return t.codeToHtml(e,n)}catch(r){return(0,n.error)(`[ShikiAdapter] Failed to render code:`,r),`<pre class="${k.FALLBACK}"><code>${t.n(e)}</code></pre>`}}};let R=null,z;function B(e){let t=JSON.stringify(e?.theme?.codeTheme||null);return(R===null||z!==t)&&(R=new L(e),z=t),R}function V(e){B(e).getHighlighter().catch(()=>{})}exports.ShikiAdapter=L,exports.ensureLanguage=D,exports.getShikiAdapter=B,exports.parseMetaString=I,exports.prewarmShiki=V;
|
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
|
|
2
|
-
import {
|
|
2
|
+
import { S as ShikiTheme, r as BoltdocsConfig } from "../../config-CTsX_tGM.cjs";
|
|
3
3
|
import * as _$shiki from "shiki";
|
|
4
4
|
import { CodeToHastOptions } from "shiki";
|
|
5
|
-
|
|
5
|
+
//#region src/node/mdx/highlighter.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Ensure a Shiki language grammar is loaded before rendering.
|
|
8
|
+
*
|
|
9
|
+
* Resolves fence-info aliases (e.g. `yml` → `yaml`, `shell` → `bash`),
|
|
10
|
+
* dynamically imports the grammar if it is not already registered, and
|
|
11
|
+
* caches concurrent loads so a page with many blocks of the same language
|
|
12
|
+
* only loads it once.
|
|
13
|
+
*
|
|
14
|
+
* @returns true when the language is available (or needs no grammar),
|
|
15
|
+
* false when it is unknown to this bundle or failed to load.
|
|
16
|
+
*/
|
|
17
|
+
declare function ensureLanguage(rawLang: string | undefined): Promise<boolean>;
|
|
18
|
+
//#endregion
|
|
6
19
|
//#region src/node/mdx/shiki-adapter.d.ts
|
|
7
20
|
interface ParsedMeta {
|
|
8
21
|
title?: string;
|
|
@@ -47,5 +60,13 @@ declare class ShikiAdapter {
|
|
|
47
60
|
* Recreates only if the relevant codeTheme configuration values change deeply.
|
|
48
61
|
*/
|
|
49
62
|
declare function getShikiAdapter(config?: BoltdocsConfig): ShikiAdapter;
|
|
63
|
+
/**
|
|
64
|
+
* Starts building the highlighter in the background. The highlighter build
|
|
65
|
+
* is ~2.5s of synchronous CPU (TextMate grammar parsing for every theme and
|
|
66
|
+
* language), so it must never run on the critical path of Vite's server
|
|
67
|
+
* setup. The underlying `highlight()` promise is module-level, so callers
|
|
68
|
+
* that need the highlighter later share the same in-flight build.
|
|
69
|
+
*/
|
|
70
|
+
declare function prewarmShiki(config?: BoltdocsConfig): void;
|
|
50
71
|
//#endregion
|
|
51
|
-
export { ParsedMeta, ShikiAdapter, getShikiAdapter, parseMetaString };
|
|
72
|
+
export { ParsedMeta, ShikiAdapter, ensureLanguage, getShikiAdapter, parseMetaString, prewarmShiki };
|
|
@@ -1,8 +1,22 @@
|
|
|
1
1
|
|
|
2
|
-
import {
|
|
2
|
+
import { S as ShikiTheme, r as BoltdocsConfig } from "../../config-BoRlz0Ca.mjs";
|
|
3
3
|
import * as _$shiki from "shiki";
|
|
4
4
|
import { CodeToHastOptions } from "shiki";
|
|
5
5
|
|
|
6
|
+
//#region src/node/mdx/highlighter.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* Ensure a Shiki language grammar is loaded before rendering.
|
|
9
|
+
*
|
|
10
|
+
* Resolves fence-info aliases (e.g. `yml` → `yaml`, `shell` → `bash`),
|
|
11
|
+
* dynamically imports the grammar if it is not already registered, and
|
|
12
|
+
* caches concurrent loads so a page with many blocks of the same language
|
|
13
|
+
* only loads it once.
|
|
14
|
+
*
|
|
15
|
+
* @returns true when the language is available (or needs no grammar),
|
|
16
|
+
* false when it is unknown to this bundle or failed to load.
|
|
17
|
+
*/
|
|
18
|
+
declare function ensureLanguage(rawLang: string | undefined): Promise<boolean>;
|
|
19
|
+
//#endregion
|
|
6
20
|
//#region src/node/mdx/shiki-adapter.d.ts
|
|
7
21
|
interface ParsedMeta {
|
|
8
22
|
title?: string;
|
|
@@ -47,5 +61,13 @@ declare class ShikiAdapter {
|
|
|
47
61
|
* Recreates only if the relevant codeTheme configuration values change deeply.
|
|
48
62
|
*/
|
|
49
63
|
declare function getShikiAdapter(config?: BoltdocsConfig): ShikiAdapter;
|
|
64
|
+
/**
|
|
65
|
+
* Starts building the highlighter in the background. The highlighter build
|
|
66
|
+
* is ~2.5s of synchronous CPU (TextMate grammar parsing for every theme and
|
|
67
|
+
* language), so it must never run on the critical path of Vite's server
|
|
68
|
+
* setup. The underlying `highlight()` promise is module-level, so callers
|
|
69
|
+
* that need the highlighter later share the same in-flight build.
|
|
70
|
+
*/
|
|
71
|
+
declare function prewarmShiki(config?: BoltdocsConfig): void;
|
|
50
72
|
//#endregion
|
|
51
|
-
export { ParsedMeta, ShikiAdapter, getShikiAdapter, parseMetaString };
|
|
73
|
+
export { ParsedMeta, ShikiAdapter, ensureLanguage, getShikiAdapter, parseMetaString, prewarmShiki };
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Copyright (c) 2026 Jesus Alcala
|
|
4
4
|
* Licensed under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
import{n as e
|
|
6
|
+
import{n as e}from"../../utils-8lzafE49.mjs";import{error as t}from"@bdocs/dui";import{createOnigurumaEngine as n}from"@shikijs/engine-oniguruma";import{createHighlighterCore as r}from"shiki/core";import i from"@shikijs/themes/github-light";import a from"@shikijs/themes/github-dark";import o from"@shikijs/langs/html";import s from"@shikijs/langs/js";import c from"@shikijs/langs/ts";import l from"@shikijs/langs/tsx";import u from"@shikijs/langs/css";import d from"@shikijs/langs/bash";import f from"@shikijs/langs/json";import p from"@shikijs/langs/markdown";import m from"@shikijs/langs/python";import h from"@shikijs/langs/go";const g=[i.default||i,a.default||a],_=[o,s,c,l,u,d,f,p,m,h],v={scss:()=>import(`@shikijs/langs/scss`),less:()=>import(`@shikijs/langs/less`),jsonc:()=>import(`@shikijs/langs/jsonc`),json5:()=>import(`@shikijs/langs/json5`),ini:()=>import(`@shikijs/langs/ini`),mdx:()=>import(`@shikijs/langs/mdx`),yaml:()=>import(`@shikijs/langs/yaml`),rust:()=>import(`@shikijs/langs/rust`),toml:()=>import(`@shikijs/langs/toml`),csv:()=>import(`@shikijs/langs/csv`),nginx:()=>import(`@shikijs/langs/nginx`),apache:()=>import(`@shikijs/langs/apache`),dockerfile:()=>import(`@shikijs/langs/dockerfile`),docker:()=>import(`@shikijs/langs/docker`),java:()=>import(`@shikijs/langs/java`),php:()=>import(`@shikijs/langs/php`),sql:()=>import(`@shikijs/langs/sql`),graphql:()=>import(`@shikijs/langs/graphql`),http:()=>import(`@shikijs/langs/http`),xml:()=>import(`@shikijs/langs/xml`),vue:()=>import(`@shikijs/langs/vue`),svelte:()=>import(`@shikijs/langs/svelte`),ruby:()=>import(`@shikijs/langs/ruby`),kotlin:()=>import(`@shikijs/langs/kotlin`),swift:()=>import(`@shikijs/langs/swift`),powershell:()=>import(`@shikijs/langs/powershell`),c:()=>import(`@shikijs/langs/c`),cpp:()=>import(`@shikijs/langs/cpp`),elixir:()=>import(`@shikijs/langs/elixir`)},y={javascript:`js`,typescript:`ts`,shell:`bash`,sh:`bash`,zsh:`bash`,console:`bash`,terminal:`bash`,shellsession:`bash`,yml:`yaml`,py:`python`,golang:`go`,rs:`rust`,rb:`ruby`,kt:`kotlin`},b=new Set([`text`,`plaintext`,`txt`,`plain`,`ansi`,`none`]);function x(e){if(!e)return null;let t=e.trim().toLowerCase();return!t||b.has(t)?null:y[t]??t}let S=null;async function C(){return n(await import(`shiki/wasm`))}const w=async e=>S||(S=(async()=>{let e=performance.now(),t=await r({themes:g,langs:_,engine:await C()});return process.env.BOLTDOCS_DEBUG===`true`&&console.log(`[boltdocs] shiki-ready in ${Math.round(performance.now()-e)}ms (${_.length} langs)`),t})(),S),T=new Map;async function E(e){let t=x(e);if(!t)return!0;let n;try{n=await w()}catch{return!1}let r=[];try{r=n.getLoadedLanguages()}catch{r=[]}if(r.includes(t))return!0;let i=T.get(t);if(i)return i;let a=v[t];if(!a)return!1;let o=(async()=>{try{let e=await a(),t=e?.default??e;return await n.loadLanguage(t),!0}catch{return!1}finally{T.delete(t)}})();return T.set(t,o),o}const D={TITLE:`data-title`,LANG:`data-lang`,HIGHLIGHTED:`data-highlighted`,HIGHLIGHTED_HTML:`data-highlighted-html`},O={LINE_NUMBERS:`shiki-line-numbers`,WORD_WRAP:`shiki-word-wrap`,FALLBACK:`shiki-fallback`},k={LIGHT:`github-light`,DARK:`github-dark`},A={LANG:`plaintext`,MDX_DEFAULT_LANG:`text`},j=(e={})=>{let{activateByDefault:t=!1}=e;return{name:`boltdocs:line-numbers`,pre(e){let n=this.options.meta?.lineNumbers===!0;(t||n)&&this.addClassToHast(e,O.LINE_NUMBERS)}}},M=(e={})=>{let{activateByDefault:t=!1}=e;return{name:`boltdocs:word-wrap`,pre(e){let n=this.options.meta?.wordWrap===!0;(t||n)&&this.addClassToHast(e,O.WORD_WRAP)}}},N=()=>({name:`AddTitleProperty`,pre(e){let t=this.options.meta?.title;t&&(e.properties[D.TITLE]=t)}}),P=()=>({name:`AddLanguageProperty`,pre(e){e.properties[D.LANG]=this.options.lang||A.LANG}});function F(e){let t={};if(!e)return t;let n=(e,n)=>{if(n===`false`){t[e]=!1;return}(n===`true`||n===void 0)&&(t[e]=!0)},r=Array.from(e.matchAll(/(?:^|\s)(?:lineNumbers|showLineNumbers|show-line-numbers|show_line_numbers|line_numbers)(?:\s*=\s*(true|false))?(?=\s|$)/gi)),i=r[r.length-1];i&&n(`lineNumbers`,i[1]);let a=Array.from(e.matchAll(/(?:^|\s)(?:wordWrap|word-wrap|word_wrap)(?:\s*=\s*(true|false))?(?=\s|$)/gi)),o=a[a.length-1];o&&n(`wordWrap`,o[1]);let s=e.match(/title=(['"])(.*?)\1/);return s&&(t.title=s[2]),t}var I=class{config;constructor(e){this.config=e}getTheme(){return this.config?.theme?.codeTheme||{light:k.LIGHT,dark:k.DARK}}async getHighlighter(){return await w(this.getTheme())}getOptions(e,t){let n=this.getTheme(),r={},i=``;typeof t==`string`?(i=t,r=F(t)):t&&(r=t,i=t.__raw||``);let a={__raw:i};for(let[e,t]of Object.entries(r))e!==`__raw`&&Object.defineProperty(a,e,{value:t,enumerable:!1,configurable:!0,writable:!0});let o={lang:e||A.LANG,meta:a,transformers:[j(),M(),N(),P()]};return typeof n==`object`?o.themes={light:n.light,dark:n.dark}:o.theme=n,o}async render(n,r,i){try{await E(r||A.LANG);let e=await this.getHighlighter(),t=this.getOptions(r,i);return e.codeToHtml(n,t)}catch(r){return t(`[ShikiAdapter] Failed to render code:`,r),`<pre class="${O.FALLBACK}"><code>${e(n)}</code></pre>`}}};let L=null,R;function z(e){let t=JSON.stringify(e?.theme?.codeTheme||null);return(L===null||R!==t)&&(L=new I(e),R=t),L}function B(e){z(e).getHighlighter().catch(()=>{})}export{I as ShikiAdapter,E as ensureLanguage,z as getShikiAdapter,F as parseMetaString,B as prewarmShiki};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boltdocs - https://boltdocs.vercel.app
|
|
3
|
+
* Copyright (c) 2026 Jesus Alcala
|
|
4
|
+
* Licensed under the MIT License.
|
|
5
|
+
*/
|
|
6
|
+
import{t as e}from"./chunk-BFSpntXv.mjs";import{_ as t,a as n,c as r,i,l as a,n as o,o as s,r as c,u as l}from"./plugin-context-wqHNSZum.mjs";import{r as u}from"./utils-8lzafE49.mjs";import{n as d}from"./pages-external-BBw8ObVK.mjs";import"./node/cache.mjs";import{c as f,l as p,s as m,t as h}from"./routes-BL4y79tb.mjs";import{n as g,r as _}from"./config-DGLQsy7y.mjs";import{r as v,t as y}from"./types-generator-DG1GX1EZ.mjs";import{t as b}from"./resolve-YdTrt_FG.mjs";import"./handler-D7UyZlPm.mjs";import"./adapters-BmB4TKCc.mjs";import x from"node:path";import S from"node:fs";import C from"node:crypto";import{z as w}from"zod";import*as T from"@bdocs/dui";import{colors as E,warn as D}from"@bdocs/dui";import ee from"semver";import{build as te}from"@bdocs/ssg/node";function ne(){return{name:`boltdocs-ssr-dirname-polyfill`,config:(e,{isSsrBuild:t})=>t?{define:{__dirname:`import.meta.dirname`}}:{}}}const re=new Set([`boltdocs/entry`,`boltdocs/client`,`boltdocs/primitives`,`boltdocs/mdx`,`boltdocs/client/router`,`use-sync-external-store/shim/index.js`,`use-sync-external-store/shim`,`use-sync-external-store`]);function O(e){return e?Array.isArray(e)?[...e]:Object.entries(e).map(([e,t])=>({find:e,replacement:t})):[]}function ie(e,t){typeof t.find==`string`&&re.has(t.find)&&e.some(e=>e.find===t.find)||e.push({...t,...typeof t.replacement==`string`?{replacement:t.replacement}:{}})}function ae({root:e,clientSourceRoot:t,aliases:n}){let r=[{find:`boltdocs/entry`,replacement:x.resolve(e,`boltdocs-entry.tsx`)},{find:`boltdocs/client`,replacement:x.resolve(e,`boltdocs-client.mjs`)},...t?[{find:`boltdocs/primitives`,replacement:x.join(t,`primitives.ts`)},{find:`boltdocs/mdx`,replacement:x.join(t,`mdx.ts`)},{find:`boltdocs/client/router`,replacement:x.join(t,`router/index.ts`)}]:[],{find:`use-sync-external-store/shim/index.js`,replacement:`react`},{find:`use-sync-external-store/shim`,replacement:`react`},{find:`use-sync-external-store`,replacement:`react`}].map(e=>({...e,replacement:e.replacement}));for(let t of O(n))ie(r,{...t,replacement:typeof t.replacement==`string`&&t.replacement.startsWith(`.`)?x.resolve(e,t.replacement):t.replacement});return r}function k(e){return e}function oe(e){let t=[];if(e.website&&t.push(A(e.website)),e.article&&t.push(M(e.article)),e.breadcrumbs?.length&&t.push(N(e.breadcrumbs)),e.additional&&t.push(...Array.isArray(e.additional)?e.additional:[e.additional]),t.length===0)throw Error(`createStructuredData() requires at least one of website, article, breadcrumbs, or additional`);return t.length===1?t[0]:t}function A(e){let t={"@context":`https://schema.org`,"@type":`WebSite`,name:e.name,url:e.url};return e.description&&(t.description=e.description),e.searchUrl&&(t.potentialAction={"@type":`SearchAction`,target:`${e.searchUrl}{search_term_string}`,"query-input":`required name=search_term_string`}),t}function j(e,t){let n=new Date(e);if(Number.isNaN(n.getTime()))throw TypeError(`Invalid ${t} value: ${String(e)}`);return n.toISOString()}function M(e){let t={"@context":`https://schema.org`,"@type":`Article`,headline:e.headline,url:e.url};return e.description&&(t.description=e.description),e.datePublished&&(t.datePublished=j(e.datePublished,`datePublished`)),e.dateModified&&(t.dateModified=j(e.dateModified,`dateModified`)),e.image&&(t.image=e.image),e.author&&(t.author=typeof e.author==`string`?{"@type":`Person`,name:e.author}:{"@type":`Person`,...e.author}),t}function N(e){return{"@context":`https://schema.org`,"@type":`BreadcrumbList`,itemListElement:e.map((e,t)=>({"@type":`ListItem`,position:t+1,name:e.name,item:e.url}))}}var P=class extends Error{name=this.constructor.name;constructor(e,t,n){super(`[plugin:${e}] ${t}`,n),this.pluginName=e}},F=class extends P{constructor(e,t){super(e,`Validation failed: ${t}`)}},I=class extends P{constructor(e,t){super(e,`Compatibility error: ${t}`)}},L=class extends P{constructor(e,t,n){super(e,`Error in hook '${t}': ${n.message}`,{cause:n}),this.hookName=t}},R=class{data=new Map;getNamespaceKey(e,t){return`${e}:${t}`}get(e,t){let n=this.getNamespaceKey(e,t),r=this.data.get(n);if(r!==void 0)return typeof r==`object`&&r?JSON.parse(JSON.stringify(r)):r}set(e,t,n){let r=this.getNamespaceKey(e,t),i=typeof n==`object`&&n?JSON.parse(JSON.stringify(n)):n;this.data.set(r,i)}has(e,t){let n=this.getNamespaceKey(e,t);return this.data.has(n)}};const se=_.extend({version:w.string().optional(),boltdocsVersion:w.string().optional(),css:w.object({cssFiles:w.array(w.string()).optional(),headStyles:w.array(w.string()).optional(),postcssPlugins:w.array(w.any()).optional(),preprocessorOptions:w.record(w.string(),w.any()).optional()}).optional(),hooks:w.object({beforeBuild:w.custom(e=>typeof e==`function`).optional(),afterBuild:w.custom(e=>typeof e==`function`).optional(),beforeDev:w.custom(e=>typeof e==`function`).optional(),afterDev:w.custom(e=>typeof e==`function`).optional(),buildEnd:w.custom(e=>typeof e==`function`).optional(),transformSource:w.custom(e=>typeof e==`function`).optional(),transformMdx:w.custom(e=>typeof e==`function`).optional(),transformHtml:w.custom(e=>typeof e==`function`).optional()}).passthrough().optional()});function ce(e,t){let n=[],r=new Set;for(let i of e){let e=se.safeParse(i);if(!e.success)throw new F(i.name||`unknown`,e.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `));let a=e.data;if(r.has(a.name))throw new F(a.name,`Duplicate plugin name detected`);if(r.add(a.name),a.boltdocsVersion&&!ee.satisfies(t,a.boltdocsVersion))throw new I(a.name,`Plugin expects Boltdocs version ${a.boltdocsVersion}, but current is ${t}`);if(a.components)for(let[e,t]of Object.entries(a.components)){if(t.includes(`..`))throw new F(a.name,`Component '${e}' has an invalid path: traversal sequences are not allowed.`);if(x.isAbsolute(t))throw new F(a.name,`Component '${e}' has an invalid path: absolute paths are not allowed.`)}n.push(a)}return n}const z=new Map;function B(e,t=process.cwd()){let n=e.plugins||[];for(let e of n)if(e.name&&!z.has(e.name))try{let n=b(e.name,t)?.pkg,r=n&&typeof n.scripts==`object`?n.scripts:{},i=!!(r.preinstall||r.postinstall||r.install);i&&D(`💡 ${E.yellow(E.bold(`Nota de seguridad:`))} El plugin ${E.cyan(e.name)} ejecuta scripts nativos al instalarse. Corre ${E.bold(`boltdocs audit`)} para un análisis detallado.`),z.set(e.name,i)}catch{z.set(e.name,!1)}}var V=class{name=`ConfigResolve`;async execute(e){e.config=await g(`docs`,e.root,`build`,`production`),e.allCached||B(e.config,e.root);let t=x.resolve(e.root,e.config.docsDir||`docs`);e.docsDir=t;let n=await h(t,e.config,void 0,!1);e.routes=n;let r=n.map(e=>e.path),i=(e.config.base||`/docs`).replace(/\/$/,``);r.includes(i)||r.push(i);let a=d(t,e.config);for(let e of a)r.includes(e)||r.push(e);e.routePaths=r,e.viteConfig=await $(e.root,`production`,e.config,{routes:n,skipTypes:!0,skipLinkTree:!0})}},H=class{name=`RouteGenerate`;async execute(e){if(!e.routes)throw Error(`Routes not generated by ConfigResolveStep. Verify pipeline order.`)}};const U=w.object({title:w.string().optional(),description:w.string().optional(),canonical:w.string().url().optional(),robots:w.string().optional(),noindex:w.boolean().optional(),"og:title":w.string().optional(),"og:description":w.string().optional(),"og:image":w.string().optional(),"og:type":w.string().optional(),"og:url":w.string().url().optional()});var W=class{name=`SEOValidate`;async execute(e){if(!e.routes||!e.config)throw Error(`Routes or Config not initialized.`);let t=e.config?.siteUrl,n=e.routes;for(let r of n){let n=r.seo||{},i=n.canonical||(t?`${t.replace(/\/$/,``)}${r.path}`:void 0),a=n[`og:url`]||i||void 0,o=e.config?.seo?.thumbnails?.background??void 0,s=n[`og:image`]||r.coverImage||o;s&&t&&!/^https?:\/\/|^\/\//.test(s)&&(s=`${t.endsWith(`/`)?t.slice(0,-1):t}${s.startsWith(`/`)?s:`/${s}`}`);let c={...n};i&&(c.canonical=i),a&&(c[`og:url`]=a),s&&(c[`og:image`]=s),!c[`og:title`]&&r.title&&(c[`og:title`]=String(r.title)),!c[`og:description`]&&r.description&&(c[`og:description`]=String(r.description));let l=U.safeParse(c);l.success||D(`[SEOValidate] Validation issues on route "${r.path}": ${l.error.message}`),r.title||D(`[SEOValidate] Route "${r.path}" is missing a title.`),r.seo=c}e.ssgRoutes=n}},G=class{name=`TypeGenerate`;async execute(e){if(!e.config||!e.docsDir||!e.routePaths)throw Error(`Config, docs directory, or route paths not initialized. Verify pipeline order.`);y(e.config,`docs`,e.root,e.routePaths),v(e.routePaths,e.root),e.typesGenerated=!0}},le=class{name=`SSGBuild`;async execute(e){if(!e.routes||!e.viteConfig)throw Error(`Routes or ViteConfig not initialized.`);let t={};for(let n of e.routes)if(n.path&&n.componentPath){t[n.path]=n.componentPath;let e=n.path.replace(/\/$/,``);t[e]=n.componentPath}let n=[];await te({entry:`boltdocs/entry`,routeToSourceFileMap:t,cacheDir:x.resolve(e.root,`.boltdocs/build`),onStep:e=>{n.push(e)}},e.viteConfig),e.ssgSubSteps=n,e.outDir=e.viteConfig.build?.outDir||`dist`}};function ue(e,t){let n=(t.siteUrl||``).replace(/\/$/,``);if(!n)return``;let r=t.seo?.indexing!==`all`&&t.seo?.indexing!==`public`;return`<?xml version="1.0" encoding="UTF-8"?>
|
|
7
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
8
|
+
${e.filter(e=>e.seo?.noindex||typeof e.seo?.robots==`string`&&e.seo.robots.includes(`noindex`)?!1:(r&&e.seo?.index,!0)).map(e=>`${n}${e.path.startsWith(`/`)?e.path:`/${e.path}`}`).sort((e,t)=>e<t?-1:e>t?1:0).map(e=>` <url>
|
|
9
|
+
<loc>${u(e)}</loc>
|
|
10
|
+
<changefreq>weekly</changefreq>
|
|
11
|
+
<priority>0.7</priority>
|
|
12
|
+
</url>`).join(`
|
|
13
|
+
`)}
|
|
14
|
+
</urlset>`}function de(e){let t=e.siteUrl||``,n=t?`${t.replace(/\/$/,``)}/sitemap.xml`:``;if(e.seo?.indexing!==`all`&&e.seo?.indexing!==`public`&&e.seo?.indexing)return[`User-agent: *`,`Disallow: /`].filter(Boolean).join(`
|
|
15
|
+
`);if(typeof e.robots==`string`)return e.robots;if(e.robots&&typeof e.robots==`object`){let t=e.robots.rules||[],r=e.robots.sitemaps||[],i=t.map(e=>{let t=`User-agent: ${e.userAgent}\n`;return e.allow&&(Array.isArray(e.allow)?t+=e.allow.map(e=>`Allow: ${e}`).join(`
|
|
16
|
+
`)+`
|
|
17
|
+
`:t+=`Allow: ${e.allow}\n`),e.disallow&&(Array.isArray(e.disallow)?t+=e.disallow.map(e=>`Disallow: ${e}`).join(`
|
|
18
|
+
`)+`
|
|
19
|
+
`:t+=`Disallow: ${e.disallow}\n`),t.trim()}).join(`
|
|
20
|
+
|
|
21
|
+
`),a=[...n?[n]:[],...r].map(e=>`Sitemap: ${e}`).join(`
|
|
22
|
+
`);return`${i}${a?`\n\n${a}`:``}`}return[`User-agent: *`,`Allow: /`,``,n?`Sitemap: ${n}`:``].filter(Boolean).join(`
|
|
23
|
+
`)}var fe=class{name=`SEOWrite`;async execute(e){if(!e.ssgRoutes||!e.config||!e.outDir)throw Error(`SSG Routes, Config, or OutDir not initialized.`);let t=ue(e.ssgRoutes,e.config),n=e.docsDir||x.resolve(e.root,`docs`),r=x.resolve(e.root,e.outDir);t&&S.writeFileSync(x.join(r,`sitemap.xml`),t,`utf-8`);let i=de(e.config);if(S.writeFileSync(x.join(r,`robots.txt`),i,`utf-8`),e.config.plugins&&e.config.plugins.length>0){let{PluginLifecycleManager:t}=await Promise.resolve().then(()=>q);await new t(e.config.plugins,e.config,n,e.root,e.routes??[],r).runHook(`build:generate`,{routes:e.routes??[],outDir:r,siteUrl:e.config.siteUrl})}}};function pe(){return new K().addStep(new V).addStep(new H).addParallelSteps([new W,new G]).addStep(new le).addStep(new fe)}var K=class{steps=[];addStep(e){return this.steps.push(e),this}addParallelSteps(e){return this.steps.push(e),this}async run(e){let t=[],n=performance.now(),r={...e,timing:{}};for(let e of this.steps){let i=Array.isArray(e),a=i?e:[e],o=performance.now();try{i?await Promise.all(a.map(e=>e.execute(r))):await a[0].execute(r);let e=performance.now()-o;for(let n of a){let i=r.stepDetails?.[n.name];t.push({name:n.name,duration:e,success:!0,details:i}),r.timing[n.name]=e}if(r.ssgSubSteps){for(let e of r.ssgSubSteps)t.push(e);delete r.ssgSubSteps}}catch(e){let i=performance.now()-o,s=a.find(e=>!t.some(t=>t.name===e.name&&t.success))?.name||a.map(e=>e.name).join(` | `);t.push({name:s,duration:i,success:!1,error:e instanceof Error?e:Error(String(e))});for(let e of t.filter(e=>e.success).reverse()){let t=this.steps.flat().find(t=>t.name===e.name);if(t?.rollback)try{await t.rollback(r)}catch(t){console.error(`[pipeline] rollback failed for step "${e.name}":`,t)}}let c=performance.now()-n;return{success:!1,failedStep:s,error:e instanceof Error?e:Error(String(e)),timing:{total:c,steps:r.timing},stepResults:t}}}return{success:!0,timing:{total:performance.now()-n,steps:r.timing},stepResults:t}}},q=e({PluginLifecycleManager:()=>Y,resolvePluginHook:()=>J});const me={"build:before":`beforeBuild`,"build:after":`afterBuild`,"build:end":`buildEnd`,"dev:before":`beforeDev`,"dev:after":`afterDev`,"transform:source":`transformSource`,"transform:mdx":`transformMdx`,"transform:html":`transformHtml`,beforeBuild:`build:before`,afterBuild:`build:after`,buildEnd:`build:end`,beforeDev:`dev:before`,afterDev:`dev:after`,transformSource:`transform:source`,transformMdx:`transform:mdx`,transformHtml:`transform:html`};function J(e,t){if(!e.hooks)return;let n=e.hooks[t];if(typeof n==`function`)return n;let r=me[t];if(r){let t=e.hooks[r];if(typeof t==`function`)return t}}var Y=class{plugins;config;store;docsDir;rootDir;routes;outDir;runtime;routeCacheContext;routeCacheVariant;constructor(e,t,n,r,i,a,o,s,c){this.plugins=e,this.config=t,this.store=new R,this.docsDir=n||process.cwd(),this.rootDir=r||process.cwd(),this.routes=i||[],this.outDir=a||`dist`,this.runtime=o??l(),this.routeCacheContext=s??m(this.docsDir),this.routeCacheVariant=c??f(this.routeCacheContext,p(t,t.base))}async runHook(e,...t){let n=this.getSortedPlugins(),r=new K;for(let i of n)J(i,e)&&r.addStep(this.createStep(i,e,t));await r.run({})}async runChain(e,t){let n=this.getSortedPlugins(),r=t;for(let t of n){let n=J(t,e);if(!n)continue;let i=this.createContext(t);try{let e=await n(i,r);if(e!==void 0){let t=e.__signal;if(t===`break`)break;if(t===`skip`){r=e;break}r=e}}catch(n){let r=new L(t.name,e,n instanceof Error?n:Error(String(n)));i.logger.error(r),i.diagnostics.report(`error`,`PLUGIN_HOOK_ERROR`,r.message)}}return r}hasHook(e){return!!(this.plugins.some(t=>J(t,e))||this.plugins.flatMap(e=>e.middleware??[]).some(t=>t[e])||(e===`transformSource`||e===`transformMdx`||e===`transformHtml`)&&[...this.runtime.middlewareRegistry.values()].some(t=>t[e]))}async runMiddlewareChain(e,t){let n=this.plugins.flatMap(e=>e.middleware??[]),r=[...this.runtime.middlewareRegistry.values()],i=[...n,...r],a=[...i.filter(e=>e.enforce===`pre`),...i.filter(e=>!e.enforce),...i.filter(e=>e.enforce===`post`)],o=t;for(let t of a){let n=t[e];if(!n)continue;let r=this.createGenericContext();try{let e=await n(r,o);if(e!==void 0){let t=e.__signal;if(t===`break`)break;if(t===`skip`){o=e;break}o=e}}catch(e){let n=`Middleware '${t.name??`<unnamed>`}' threw: ${e instanceof Error?e.message:String(e)}`;r.logger.error(n),r.diagnostics.report(`error`,`MIDDLEWARE_ERROR`,n)}}return o}getSortedPlugins(){let e=this.plugins.filter(e=>e.enforce===`pre`),t=this.plugins.filter(e=>!e.enforce),n=this.plugins.filter(e=>e.enforce===`post`);return[...e,...t,...n]}createStep(e,t,n){return{name:`${e.name}:${String(t)}`,execute:async()=>{let r=this.createContext(e);try{let i=J(e,t);i&&await i(r,...n)}catch(n){let i=new L(e.name,t,n instanceof Error?n:Error(String(n)));r.logger.error(i)}},rollback:async()=>{let t=J(e,`build:end`);if(t){let n=this.createContext(e);try{await t(n)}catch{}}}}}createContext(e){return{config:Object.freeze({...this.config}),docsDir:this.docsDir,rootDir:this.rootDir,outDir:this.outDir,routes:this.routes,meta:{name:e.name,version:e.version,boltdocsVersion:e.boltdocsVersion},store:{get:(e,t)=>this.store.get(e,t),set:(e,t,n)=>this.store.set(e,t,n),has:(e,t)=>this.store.has(e,t)},logger:this.createLogger(e.name),caches:o(this.routeCacheContext,this.rootDir,this.routeCacheVariant),diagnostics:c(e.name,this.runtime),paths:s(this.docsDir,this.rootDir),virtualModules:a(this.runtime),middleware:n(this.runtime),hmr:i(this.runtime),server:r(this.runtime)}}createGenericContext(){let e=`<middleware>`;return{config:Object.freeze({...this.config}),docsDir:this.docsDir,rootDir:this.rootDir,outDir:this.outDir,routes:this.routes,meta:{name:e},store:{get:(e,t)=>this.store.get(e,t),set:(e,t,n)=>this.store.set(e,t,n),has:(e,t)=>this.store.has(e,t)},logger:this.createLogger(e),caches:o(this.routeCacheContext,this.rootDir,this.routeCacheVariant),diagnostics:c(e,this.runtime),paths:s(this.docsDir,this.rootDir),virtualModules:a(this.runtime),middleware:n(this.runtime),hmr:i(this.runtime),server:r(this.runtime)}}createLogger(e){let t=`[plugin:${e}]`;return{info:e=>T.info(`${t} ${e}`),warn:e=>T.warn(`${t} ${e}`),error:e=>{T.error(`${t} ${e instanceof Error?e.message:e}`)},debug:e=>T.debug(`${t} ${e}`)}}};function X(e){return t=>typeof e==`function`?e(t):e}function he(e){return typeof e==`function`?X(e):e}const Z=new Map;function ge(){let e=t;for(;e&&e!==x.parse(e).root;){let t=x.join(e,`package.json`);if(S.existsSync(t)){let n=``;try{n=JSON.parse(S.readFileSync(t,`utf-8`)).name||``}catch{n=``}if(n===`boltdocs`){let t=x.join(e,`src/client`);return S.existsSync(t)?t:void 0}}e=x.dirname(e)}}const _e=ge();function Q(e,t,n){if(n===!1)return!1;if(typeof n==`string`)return x.resolve(e,n);let r=t?.vite?.publicDir;if(r===!1)return!1;if(typeof r==`string`)return x.resolve(e,r);let i=x.resolve(e,`public`),a=x.resolve(e,t?.docsDir||`docs`,`public`);return S.existsSync(i)||!S.existsSync(a)?i:a}function ve(e,t,n,r){return`${e}::${t}::${C.createHash(`md5`).update(JSON.stringify({root:e,mode:t,routeCount:n.routes?.length??0,skipTypes:n.skipTypes??!1,skipLinkTree:n.skipLinkTree??!1,skipRoutes:n.skipRoutes??!1,hasPreResolved:!!r,docsDir:r?.docsDir||`docs`,aliases:r?.aliases,viteAliases:r?.vite?.resolve?.alias,publicDir:Q(e,r,n.publicDir)})).digest(`hex`)}`}async function ye(e){let{resolveConfig:t}=await import(`./config-DGLQsy7y.mjs`).then(e=>e.t),{generateRoutes:n,getExternalRoutePaths:r}=await import(`./routes-BL4y79tb.mjs`).then(e=>e.i),{generateProjectTypes:i,writeLinkTree:a}=await import(`./types-generator-DG1GX1EZ.mjs`).then(e=>e.n),{boltdocsPlugin:o}=await import(`./plugin-BcTzvHAJ.mjs`),s=e?.docsDir||`docs`,c=await t(s),l=await n(s,c),u=l.map(e=>e.path),d=(c.base||`/docs`).replace(/\/$/,``);u.includes(d)||u.push(d);let f=r(s,c);for(let e of f)u.includes(e)||u.push(e);return i(c,s,void 0,u),a(u),o({...e,routes:e?.routes??l},c)}async function $(e,t=`development`,n,r={}){let i=ve(e,t,r,n),a=Z.get(i);if(a)return a.config;let o=null,s=null,c=null,l=null,u=null;async function d(){if(u)return;let e=[import(`@vitejs/plugin-react`),import(`./plugin-BcTzvHAJ.mjs`),import(`./resolve-C2kKnk_5.mjs`),import(`vite`).then(e=>({normalizePath:e.normalizePath}))],t=await Promise.all(e);o=t[0].default,s=t[1].boltdocsPlugin,c=t[1].getExternalAbsolutePaths,l=t[2].resolveSecurityHeaders,u=t[3].normalizePath}d();let f=n||await(async()=>{let{resolveConfig:t}=await import(`./config-DGLQsy7y.mjs`).then(e=>e.t);return t(`docs`,e)})(),p=x.resolve(e,f.docsDir||`docs`),m=r.routes??(r.skipRoutes?[]:await(async()=>{let{generateRoutes:e}=await import(`./routes-BL4y79tb.mjs`).then(e=>e.i);return e(p,f,void 0,!1)})()),h=t===`production`,g=(async()=>(await d(),l(f,h)))(),_=!r.skipTypes,v=!r.skipLinkTree;if(_||v){let[{generateRoutes:t,getExternalRoutePaths:n},{generateProjectTypes:r,writeLinkTree:i}]=await Promise.all([import(`./routes-BL4y79tb.mjs`).then(e=>e.i),import(`./types-generator-DG1GX1EZ.mjs`).then(e=>e.n)]),a=m.map(e=>e.path),o=(f.base||`/docs`).replace(/\/$/,``);a.includes(o)||a.push(o);let s=n(p,f);for(let e of s)a.includes(e)||a.push(e);_&&r(f,p,e,a),v&&i(a)}let y=await g;await d();let b=[],S={};if(f.plugins)for(let e of f.plugins)e.css?.postcssPlugins&&b.push(...e.css.postcssPlugins),e.css?.preprocessorOptions&&Object.assign(S,e.css.preprocessorOptions);let C={root:e,mode:t,experimental:{bundledDev:!h&&process.env.BOLTDOCS_BUNDLED_DEV===`true`},oxc:{jsx:{development:!h,runtime:`automatic`,importSource:`react`}},optimizeDeps:{entries:[`index.html`],include:[`react`,`react-dom`,`react-dom/client`,`react-helmet-async`,`react-router-dom`,`react-fast-compare`,`invariant`,`use-sync-external-store/shim`]},css:b.length>0||Object.keys(S).length>0?{postcss:b.length>0?{plugins:b}:void 0,preprocessorOptions:Object.keys(S).length>0?S:void 0}:void 0,build:{},plugins:[ne(),o(),...s({docsDir:p,root:e,routes:m},f)],ssr:{external:[`react`,`react-dom`,`react-helmet-async`,`react-router-dom`,`@bdocs/ssg`,`jsdom`,...c()],optimizeDeps:{include:[`react`,`react-dom`,`react-fast-compare`,...f.vite?.ssr?.optimizeDeps?.include??[]]},noExternal:[]},server:{watch:{ignored:[`**/.boltdocs/**`,...f.vite?.server?.watch?.ignored??[]]},headers:{...y,...f.vite?.server?.headers},...f.vite?.server},preview:{headers:{...y,...f.vite?.preview?.headers},...f.vite?.preview},...f.vite??{},resolve:{...f.vite?.resolve??{},alias:ae({root:e,clientSourceRoot:_e,aliases:[...O(f.aliases),...O(f.vite?.resolve?.alias)]}).map(e=>({...e,...typeof e.replacement==`string`?{replacement:u(e.replacement)}:{}})),dedupe:[`react`,`react-dom`,`react-router-dom`,...f.vite?.resolve?.dedupe??[]]},base:f.base||`/`,publicDir:Q(e,f,r.publicDir)};return Z.set(i,{config:C}),C.__boltdocsConfig=f,C}export{N as _,Y as a,k as b,pe as c,R as d,I as f,M as g,F as h,X as i,B as l,L as m,$ as n,q as o,P as p,he as r,J as s,ye as t,ce as u,oe as v,A as y};
|
|
@@ -0,0 +1,23 @@
|
|
|
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-D1Md3oWO.cjs`),t=require(`./utils-ej6_SjIZ.cjs`),n=require(`./pages-external-DPiPFxxP.cjs`),r=require(`./plugin-context-C-l90hFt.cjs`),i=require(`./node/cache.cjs`),a=require(`./routes-U9L8psZ9.cjs`),o=require(`./config-Ceib-AOH.cjs`),s=require(`./types-generator-DDSA93P3.cjs`),c=require(`./resolve-It1Iug83.cjs`),l=require(`./handler-CDEoKARD.cjs`),u=require(`./adapters-Cp1Maurn.cjs`);let d=require(`node:path`);d=e.r(d);let f=require(`node:fs`);f=e.r(f);let p=require(`node:crypto`);p=e.r(p);let m=require(`zod`),h=require(`@bdocs/dui`);h=e.r(h);let g=require(`semver`);g=e.r(g);let _=require(`@bdocs/ssg/node`);function v(){return{name:`boltdocs-ssr-dirname-polyfill`,config:(e,{isSsrBuild:t})=>t?{define:{__dirname:`import.meta.dirname`}}:{}}}const y=new Set([`boltdocs/entry`,`boltdocs/client`,`boltdocs/primitives`,`boltdocs/mdx`,`boltdocs/client/router`,`use-sync-external-store/shim/index.js`,`use-sync-external-store/shim`,`use-sync-external-store`]);function b(e){return e?Array.isArray(e)?[...e]:Object.entries(e).map(([e,t])=>({find:e,replacement:t})):[]}function x(e,t){typeof t.find==`string`&&y.has(t.find)&&e.some(e=>e.find===t.find)||e.push({...t,...typeof t.replacement==`string`?{replacement:t.replacement}:{}})}function S({root:e,clientSourceRoot:t,aliases:n}){let r=[{find:`boltdocs/entry`,replacement:d.default.resolve(e,`boltdocs-entry.tsx`)},{find:`boltdocs/client`,replacement:d.default.resolve(e,`boltdocs-client.mjs`)},...t?[{find:`boltdocs/primitives`,replacement:d.default.join(t,`primitives.ts`)},{find:`boltdocs/mdx`,replacement:d.default.join(t,`mdx.ts`)},{find:`boltdocs/client/router`,replacement:d.default.join(t,`router/index.ts`)}]:[],{find:`use-sync-external-store/shim/index.js`,replacement:`react`},{find:`use-sync-external-store/shim`,replacement:`react`},{find:`use-sync-external-store`,replacement:`react`}].map(e=>({...e,replacement:e.replacement}));for(let t of b(n))x(r,{...t,replacement:typeof t.replacement==`string`&&t.replacement.startsWith(`.`)?d.default.resolve(e,t.replacement):t.replacement});return r}function C(e){return e}function w(e){let t=[];if(e.website&&t.push(T(e.website)),e.article&&t.push(D(e.article)),e.breadcrumbs?.length&&t.push(O(e.breadcrumbs)),e.additional&&t.push(...Array.isArray(e.additional)?e.additional:[e.additional]),t.length===0)throw Error(`createStructuredData() requires at least one of website, article, breadcrumbs, or additional`);return t.length===1?t[0]:t}function T(e){let t={"@context":`https://schema.org`,"@type":`WebSite`,name:e.name,url:e.url};return e.description&&(t.description=e.description),e.searchUrl&&(t.potentialAction={"@type":`SearchAction`,target:`${e.searchUrl}{search_term_string}`,"query-input":`required name=search_term_string`}),t}function E(e,t){let n=new Date(e);if(Number.isNaN(n.getTime()))throw TypeError(`Invalid ${t} value: ${String(e)}`);return n.toISOString()}function D(e){let t={"@context":`https://schema.org`,"@type":`Article`,headline:e.headline,url:e.url};return e.description&&(t.description=e.description),e.datePublished&&(t.datePublished=E(e.datePublished,`datePublished`)),e.dateModified&&(t.dateModified=E(e.dateModified,`dateModified`)),e.image&&(t.image=e.image),e.author&&(t.author=typeof e.author==`string`?{"@type":`Person`,name:e.author}:{"@type":`Person`,...e.author}),t}function O(e){return{"@context":`https://schema.org`,"@type":`BreadcrumbList`,itemListElement:e.map((e,t)=>({"@type":`ListItem`,position:t+1,name:e.name,item:e.url}))}}var k=class extends Error{name=this.constructor.name;constructor(e,t,n){super(`[plugin:${e}] ${t}`,n),this.pluginName=e}},A=class extends k{constructor(e,t){super(e,`Validation failed: ${t}`)}},j=class extends k{constructor(e,t){super(e,`Compatibility error: ${t}`)}},M=class extends k{constructor(e,t,n){super(e,`Error in hook '${t}': ${n.message}`,{cause:n}),this.hookName=t}},N=class{data=new Map;getNamespaceKey(e,t){return`${e}:${t}`}get(e,t){let n=this.getNamespaceKey(e,t),r=this.data.get(n);if(r!==void 0)return typeof r==`object`&&r?JSON.parse(JSON.stringify(r)):r}set(e,t,n){let r=this.getNamespaceKey(e,t),i=typeof n==`object`&&n?JSON.parse(JSON.stringify(n)):n;this.data.set(r,i)}has(e,t){let n=this.getNamespaceKey(e,t);return this.data.has(n)}};const P=o.n.extend({version:m.z.string().optional(),boltdocsVersion:m.z.string().optional(),css:m.z.object({cssFiles:m.z.array(m.z.string()).optional(),headStyles:m.z.array(m.z.string()).optional(),postcssPlugins:m.z.array(m.z.any()).optional(),preprocessorOptions:m.z.record(m.z.string(),m.z.any()).optional()}).optional(),hooks:m.z.object({beforeBuild:m.z.custom(e=>typeof e==`function`).optional(),afterBuild:m.z.custom(e=>typeof e==`function`).optional(),beforeDev:m.z.custom(e=>typeof e==`function`).optional(),afterDev:m.z.custom(e=>typeof e==`function`).optional(),buildEnd:m.z.custom(e=>typeof e==`function`).optional(),transformSource:m.z.custom(e=>typeof e==`function`).optional(),transformMdx:m.z.custom(e=>typeof e==`function`).optional(),transformHtml:m.z.custom(e=>typeof e==`function`).optional()}).passthrough().optional()});function F(e,t){let n=[],r=new Set;for(let i of e){let e=P.safeParse(i);if(!e.success)throw new A(i.name||`unknown`,e.error.issues.map(e=>`${e.path.join(`.`)}: ${e.message}`).join(`, `));let a=e.data;if(r.has(a.name))throw new A(a.name,`Duplicate plugin name detected`);if(r.add(a.name),a.boltdocsVersion&&!g.default.satisfies(t,a.boltdocsVersion))throw new j(a.name,`Plugin expects Boltdocs version ${a.boltdocsVersion}, but current is ${t}`);if(a.components)for(let[e,t]of Object.entries(a.components)){if(t.includes(`..`))throw new A(a.name,`Component '${e}' has an invalid path: traversal sequences are not allowed.`);if(d.default.isAbsolute(t))throw new A(a.name,`Component '${e}' has an invalid path: absolute paths are not allowed.`)}n.push(a)}return n}const I=new Map;function L(e,t=process.cwd()){let n=e.plugins||[];for(let e of n)if(e.name&&!I.has(e.name))try{let n=c.t(e.name,t)?.pkg,r=n&&typeof n.scripts==`object`?n.scripts:{},i=!!(r.preinstall||r.postinstall||r.install);i&&(0,h.warn)(`💡 ${h.colors.yellow(h.colors.bold(`Nota de seguridad:`))} El plugin ${h.colors.cyan(e.name)} ejecuta scripts nativos al instalarse. Corre ${h.colors.bold(`boltdocs audit`)} para un análisis detallado.`),I.set(e.name,i)}catch{I.set(e.name,!1)}}var R=class{name=`ConfigResolve`;async execute(e){e.config=await o.t(`docs`,e.root,`build`,`production`),e.allCached||L(e.config,e.root);let t=d.default.resolve(e.root,e.config.docsDir||`docs`);e.docsDir=t;let r=await a.t(t,e.config,void 0,!1);e.routes=r;let i=r.map(e=>e.path),s=(e.config.base||`/docs`).replace(/\/$/,``);i.includes(s)||i.push(s);let c=n.n(t,e.config);for(let e of c)i.includes(e)||i.push(e);e.routePaths=i,e.viteConfig=await $(e.root,`production`,e.config,{routes:r,skipTypes:!0,skipLinkTree:!0})}},z=class{name=`RouteGenerate`;async execute(e){if(!e.routes)throw Error(`Routes not generated by ConfigResolveStep. Verify pipeline order.`)}};const ee=m.z.object({title:m.z.string().optional(),description:m.z.string().optional(),canonical:m.z.string().url().optional(),robots:m.z.string().optional(),noindex:m.z.boolean().optional(),"og:title":m.z.string().optional(),"og:description":m.z.string().optional(),"og:image":m.z.string().optional(),"og:type":m.z.string().optional(),"og:url":m.z.string().url().optional()});var te=class{name=`SEOValidate`;async execute(e){if(!e.routes||!e.config)throw Error(`Routes or Config not initialized.`);let t=e.config?.siteUrl,n=e.routes;for(let r of n){let n=r.seo||{},i=n.canonical||(t?`${t.replace(/\/$/,``)}${r.path}`:void 0),a=n[`og:url`]||i||void 0,o=e.config?.seo?.thumbnails?.background??void 0,s=n[`og:image`]||r.coverImage||o;s&&t&&!/^https?:\/\/|^\/\//.test(s)&&(s=`${t.endsWith(`/`)?t.slice(0,-1):t}${s.startsWith(`/`)?s:`/${s}`}`);let c={...n};i&&(c.canonical=i),a&&(c[`og:url`]=a),s&&(c[`og:image`]=s),!c[`og:title`]&&r.title&&(c[`og:title`]=String(r.title)),!c[`og:description`]&&r.description&&(c[`og:description`]=String(r.description));let l=ee.safeParse(c);l.success||(0,h.warn)(`[SEOValidate] Validation issues on route "${r.path}": ${l.error.message}`),r.title||(0,h.warn)(`[SEOValidate] Route "${r.path}" is missing a title.`),r.seo=c}e.ssgRoutes=n}},ne=class{name=`TypeGenerate`;async execute(e){if(!e.config||!e.docsDir||!e.routePaths)throw Error(`Config, docs directory, or route paths not initialized. Verify pipeline order.`);s.t(e.config,`docs`,e.root,e.routePaths),s.r(e.routePaths,e.root),e.typesGenerated=!0}},re=class{name=`SSGBuild`;async execute(e){if(!e.routes||!e.viteConfig)throw Error(`Routes or ViteConfig not initialized.`);let t={};for(let n of e.routes)if(n.path&&n.componentPath){t[n.path]=n.componentPath;let e=n.path.replace(/\/$/,``);t[e]=n.componentPath}let n=[];await(0,_.build)({entry:`boltdocs/entry`,routeToSourceFileMap:t,cacheDir:d.default.resolve(e.root,`.boltdocs/build`),onStep:e=>{n.push(e)}},e.viteConfig),e.ssgSubSteps=n,e.outDir=e.viteConfig.build?.outDir||`dist`}};function ie(e,n){let r=(n.siteUrl||``).replace(/\/$/,``);if(!r)return``;let i=n.seo?.indexing!==`all`&&n.seo?.indexing!==`public`;return`<?xml version="1.0" encoding="UTF-8"?>
|
|
7
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
8
|
+
${e.filter(e=>e.seo?.noindex||typeof e.seo?.robots==`string`&&e.seo.robots.includes(`noindex`)?!1:(i&&e.seo?.index,!0)).map(e=>`${r}${e.path.startsWith(`/`)?e.path:`/${e.path}`}`).sort((e,t)=>e<t?-1:e>t?1:0).map(e=>` <url>
|
|
9
|
+
<loc>${t.r(e)}</loc>
|
|
10
|
+
<changefreq>weekly</changefreq>
|
|
11
|
+
<priority>0.7</priority>
|
|
12
|
+
</url>`).join(`
|
|
13
|
+
`)}
|
|
14
|
+
</urlset>`}function B(e){let t=e.siteUrl||``,n=t?`${t.replace(/\/$/,``)}/sitemap.xml`:``;if(e.seo?.indexing!==`all`&&e.seo?.indexing!==`public`&&e.seo?.indexing)return[`User-agent: *`,`Disallow: /`].filter(Boolean).join(`
|
|
15
|
+
`);if(typeof e.robots==`string`)return e.robots;if(e.robots&&typeof e.robots==`object`){let t=e.robots.rules||[],r=e.robots.sitemaps||[],i=t.map(e=>{let t=`User-agent: ${e.userAgent}\n`;return e.allow&&(Array.isArray(e.allow)?t+=e.allow.map(e=>`Allow: ${e}`).join(`
|
|
16
|
+
`)+`
|
|
17
|
+
`:t+=`Allow: ${e.allow}\n`),e.disallow&&(Array.isArray(e.disallow)?t+=e.disallow.map(e=>`Disallow: ${e}`).join(`
|
|
18
|
+
`)+`
|
|
19
|
+
`:t+=`Disallow: ${e.disallow}\n`),t.trim()}).join(`
|
|
20
|
+
|
|
21
|
+
`),a=[...n?[n]:[],...r].map(e=>`Sitemap: ${e}`).join(`
|
|
22
|
+
`);return`${i}${a?`\n\n${a}`:``}`}return[`User-agent: *`,`Allow: /`,``,n?`Sitemap: ${n}`:``].filter(Boolean).join(`
|
|
23
|
+
`)}var V=class{name=`SEOWrite`;async execute(e){if(!e.ssgRoutes||!e.config||!e.outDir)throw Error(`SSG Routes, Config, or OutDir not initialized.`);let t=ie(e.ssgRoutes,e.config),n=e.docsDir||d.default.resolve(e.root,`docs`),r=d.default.resolve(e.root,e.outDir);t&&f.default.writeFileSync(d.default.join(r,`sitemap.xml`),t,`utf-8`);let i=B(e.config);if(f.default.writeFileSync(d.default.join(r,`robots.txt`),i,`utf-8`),e.config.plugins&&e.config.plugins.length>0){let{PluginLifecycleManager:t}=await Promise.resolve().then(()=>require(`./plugin-lifecycle-B1BzSHdn.cjs`));await new t(e.config.plugins,e.config,n,e.root,e.routes??[],r).runHook(`build:generate`,{routes:e.routes??[],outDir:r,siteUrl:e.config.siteUrl})}}};function H(){return new U().addStep(new R).addStep(new z).addParallelSteps([new te,new ne]).addStep(new re).addStep(new V)}var U=class{steps=[];addStep(e){return this.steps.push(e),this}addParallelSteps(e){return this.steps.push(e),this}async run(e){let t=[],n=performance.now(),r={...e,timing:{}};for(let e of this.steps){let i=Array.isArray(e),a=i?e:[e],o=performance.now();try{i?await Promise.all(a.map(e=>e.execute(r))):await a[0].execute(r);let e=performance.now()-o;for(let n of a){let i=r.stepDetails?.[n.name];t.push({name:n.name,duration:e,success:!0,details:i}),r.timing[n.name]=e}if(r.ssgSubSteps){for(let e of r.ssgSubSteps)t.push(e);delete r.ssgSubSteps}}catch(e){let i=performance.now()-o,s=a.find(e=>!t.some(t=>t.name===e.name&&t.success))?.name||a.map(e=>e.name).join(` | `);t.push({name:s,duration:i,success:!1,error:e instanceof Error?e:Error(String(e))});for(let e of t.filter(e=>e.success).reverse()){let t=this.steps.flat().find(t=>t.name===e.name);if(t?.rollback)try{await t.rollback(r)}catch(t){console.error(`[pipeline] rollback failed for step "${e.name}":`,t)}}let c=performance.now()-n;return{success:!1,failedStep:s,error:e instanceof Error?e:Error(String(e)),timing:{total:c,steps:r.timing},stepResults:t}}}return{success:!0,timing:{total:performance.now()-n,steps:r.timing},stepResults:t}}};const W={"build:before":`beforeBuild`,"build:after":`afterBuild`,"build:end":`buildEnd`,"dev:before":`beforeDev`,"dev:after":`afterDev`,"transform:source":`transformSource`,"transform:mdx":`transformMdx`,"transform:html":`transformHtml`,beforeBuild:`build:before`,afterBuild:`build:after`,buildEnd:`build:end`,beforeDev:`dev:before`,afterDev:`dev:after`,transformSource:`transform:source`,transformMdx:`transform:mdx`,transformHtml:`transform:html`};function G(e,t){if(!e.hooks)return;let n=e.hooks[t];if(typeof n==`function`)return n;let r=W[t];if(r){let t=e.hooks[r];if(typeof t==`function`)return t}}var K=class{plugins;config;store;docsDir;rootDir;routes;outDir;runtime;routeCacheContext;routeCacheVariant;constructor(e,t,n,i,o,s,c,l,u){this.plugins=e,this.config=t,this.store=new N,this.docsDir=n||process.cwd(),this.rootDir=i||process.cwd(),this.routes=o||[],this.outDir=s||`dist`,this.runtime=c??r.u(),this.routeCacheContext=l??a.s(this.docsDir),this.routeCacheVariant=u??a.c(this.routeCacheContext,a.l(t,t.base))}async runHook(e,...t){let n=this.getSortedPlugins(),r=new U;for(let i of n)G(i,e)&&r.addStep(this.createStep(i,e,t));await r.run({})}async runChain(e,t){let n=this.getSortedPlugins(),r=t;for(let t of n){let n=G(t,e);if(!n)continue;let i=this.createContext(t);try{let e=await n(i,r);if(e!==void 0){let t=e.__signal;if(t===`break`)break;if(t===`skip`){r=e;break}r=e}}catch(n){let r=new M(t.name,e,n instanceof Error?n:Error(String(n)));i.logger.error(r),i.diagnostics.report(`error`,`PLUGIN_HOOK_ERROR`,r.message)}}return r}hasHook(e){return!!(this.plugins.some(t=>G(t,e))||this.plugins.flatMap(e=>e.middleware??[]).some(t=>t[e])||(e===`transformSource`||e===`transformMdx`||e===`transformHtml`)&&[...this.runtime.middlewareRegistry.values()].some(t=>t[e]))}async runMiddlewareChain(e,t){let n=this.plugins.flatMap(e=>e.middleware??[]),r=[...this.runtime.middlewareRegistry.values()],i=[...n,...r],a=[...i.filter(e=>e.enforce===`pre`),...i.filter(e=>!e.enforce),...i.filter(e=>e.enforce===`post`)],o=t;for(let t of a){let n=t[e];if(!n)continue;let r=this.createGenericContext();try{let e=await n(r,o);if(e!==void 0){let t=e.__signal;if(t===`break`)break;if(t===`skip`){o=e;break}o=e}}catch(e){let n=`Middleware '${t.name??`<unnamed>`}' threw: ${e instanceof Error?e.message:String(e)}`;r.logger.error(n),r.diagnostics.report(`error`,`MIDDLEWARE_ERROR`,n)}}return o}getSortedPlugins(){let e=this.plugins.filter(e=>e.enforce===`pre`),t=this.plugins.filter(e=>!e.enforce),n=this.plugins.filter(e=>e.enforce===`post`);return[...e,...t,...n]}createStep(e,t,n){return{name:`${e.name}:${String(t)}`,execute:async()=>{let r=this.createContext(e);try{let i=G(e,t);i&&await i(r,...n)}catch(n){let i=new M(e.name,t,n instanceof Error?n:Error(String(n)));r.logger.error(i)}},rollback:async()=>{let t=G(e,`build:end`);if(t){let n=this.createContext(e);try{await t(n)}catch{}}}}}createContext(e){return{config:Object.freeze({...this.config}),docsDir:this.docsDir,rootDir:this.rootDir,outDir:this.outDir,routes:this.routes,meta:{name:e.name,version:e.version,boltdocsVersion:e.boltdocsVersion},store:{get:(e,t)=>this.store.get(e,t),set:(e,t,n)=>this.store.set(e,t,n),has:(e,t)=>this.store.has(e,t)},logger:this.createLogger(e.name),caches:r.n(this.routeCacheContext,this.rootDir,this.routeCacheVariant),diagnostics:r.r(e.name,this.runtime),paths:r.o(this.docsDir,this.rootDir),virtualModules:r.l(this.runtime),middleware:r.a(this.runtime),hmr:r.i(this.runtime),server:r.c(this.runtime)}}createGenericContext(){let e=`<middleware>`;return{config:Object.freeze({...this.config}),docsDir:this.docsDir,rootDir:this.rootDir,outDir:this.outDir,routes:this.routes,meta:{name:e},store:{get:(e,t)=>this.store.get(e,t),set:(e,t,n)=>this.store.set(e,t,n),has:(e,t)=>this.store.has(e,t)},logger:this.createLogger(e),caches:r.n(this.routeCacheContext,this.rootDir,this.routeCacheVariant),diagnostics:r.r(e,this.runtime),paths:r.o(this.docsDir,this.rootDir),virtualModules:r.l(this.runtime),middleware:r.a(this.runtime),hmr:r.i(this.runtime),server:r.c(this.runtime)}}createLogger(e){let t=`[plugin:${e}]`;return{info:e=>h.info(`${t} ${e}`),warn:e=>h.warn(`${t} ${e}`),error:e=>{h.error(`${t} ${e instanceof Error?e.message:e}`)},debug:e=>h.debug(`${t} ${e}`)}}};function q(e){return t=>typeof e==`function`?e(t):e}function J(e){return typeof e==`function`?q(e):e}var Y=e.t({BoltdocsPluginStore:()=>N,PluginCompatibilityError:()=>j,PluginError:()=>k,PluginHookError:()=>M,PluginLifecycleManager:()=>K,PluginValidationError:()=>A,createArticleStructuredData:()=>D,createBreadcrumbStructuredData:()=>O,createPlugin:()=>J,createStructuredData:()=>w,createViteConfig:()=>$,createWebSiteStructuredData:()=>T,default:()=>Q,defineConfig:()=>o.r,definePlugin:()=>q,defineStructuredData:()=>C,flushCache:()=>i.flushCache,generateEntryCode:()=>r.g,generateRoutes:()=>a.t,handleAwsFeedback:()=>u.t,handleFeedback:()=>l.t,handleNetlifyFeedback:()=>u.r,handleVercelFeedback:()=>u.i,handleWebFeedback:()=>u.n,invalidateRouteCache:()=>a.i,normalizePath:()=>t.u,resolveConfig:()=>o.t,resolvePluginHook:()=>G,sanitizeFilename:()=>t.f,validatePlugins:()=>F});const X=new Map;function ae(){let e=__dirname;for(;e&&e!==d.default.parse(e).root;){let t=d.default.join(e,`package.json`);if(f.default.existsSync(t)){let n=``;try{n=JSON.parse(f.default.readFileSync(t,`utf-8`)).name||``}catch{n=``}if(n===`boltdocs`){let t=d.default.join(e,`src/client`);return f.default.existsSync(t)?t:void 0}}e=d.default.dirname(e)}}const oe=ae();function Z(e,t,n){if(n===!1)return!1;if(typeof n==`string`)return d.default.resolve(e,n);let r=t?.vite?.publicDir;if(r===!1)return!1;if(typeof r==`string`)return d.default.resolve(e,r);let i=d.default.resolve(e,`public`),a=d.default.resolve(e,t?.docsDir||`docs`,`public`);return f.default.existsSync(i)||!f.default.existsSync(a)?i:a}function se(e,t,n,r){return`${e}::${t}::${p.default.createHash(`md5`).update(JSON.stringify({root:e,mode:t,routeCount:n.routes?.length??0,skipTypes:n.skipTypes??!1,skipLinkTree:n.skipLinkTree??!1,skipRoutes:n.skipRoutes??!1,hasPreResolved:!!r,docsDir:r?.docsDir||`docs`,aliases:r?.aliases,viteAliases:r?.vite?.resolve?.alias,publicDir:Z(e,r,n.publicDir)})).digest(`hex`)}`}async function Q(e){let{resolveConfig:t}=await Promise.resolve().then(()=>require(`./config-jJh8WYJI.cjs`)),{generateRoutes:n,getExternalRoutePaths:r}=await Promise.resolve().then(()=>require(`./routes-C2nPecwu.cjs`)),{generateProjectTypes:i,writeLinkTree:a}=await Promise.resolve().then(()=>require(`./types-generator-DDSA93P3.cjs`)).then(e=>e.n),{boltdocsPlugin:o}=await Promise.resolve().then(()=>require(`./plugin-TulVMt1z.cjs`)),s=e?.docsDir||`docs`,c=await t(s),l=await n(s,c),u=l.map(e=>e.path),d=(c.base||`/docs`).replace(/\/$/,``);u.includes(d)||u.push(d);let f=r(s,c);for(let e of f)u.includes(e)||u.push(e);return i(c,s,void 0,u),a(u),o({...e,routes:e?.routes??l},c)}async function $(e,t=`development`,n,r={}){let i=se(e,t,r,n),a=X.get(i);if(a)return a.config;let o=null,s=null,c=null,l=null,u=null;async function f(){if(u)return;let e=[import(`@vitejs/plugin-react`),Promise.resolve().then(()=>require(`./plugin-TulVMt1z.cjs`)),Promise.resolve().then(()=>require(`./resolve-B7vWOd8R.cjs`)),import(`vite`).then(e=>({normalizePath:e.normalizePath}))],t=await Promise.all(e);o=t[0].default,s=t[1].boltdocsPlugin,c=t[1].getExternalAbsolutePaths,l=t[2].resolveSecurityHeaders,u=t[3].normalizePath}f();let p=n||await(async()=>{let{resolveConfig:t}=await Promise.resolve().then(()=>require(`./config-jJh8WYJI.cjs`));return t(`docs`,e)})(),m=d.default.resolve(e,p.docsDir||`docs`),h=r.routes??(r.skipRoutes?[]:await(async()=>{let{generateRoutes:e}=await Promise.resolve().then(()=>require(`./routes-C2nPecwu.cjs`));return e(m,p,void 0,!1)})()),g=t===`production`,_=(async()=>(await f(),l(p,g)))(),y=!r.skipTypes,x=!r.skipLinkTree;if(y||x){let[{generateRoutes:t,getExternalRoutePaths:n},{generateProjectTypes:r,writeLinkTree:i}]=await Promise.all([Promise.resolve().then(()=>require(`./routes-C2nPecwu.cjs`)),Promise.resolve().then(()=>require(`./types-generator-DDSA93P3.cjs`)).then(e=>e.n)]),a=h.map(e=>e.path),o=(p.base||`/docs`).replace(/\/$/,``);a.includes(o)||a.push(o);let s=n(m,p);for(let e of s)a.includes(e)||a.push(e);y&&r(p,m,e,a),x&&i(a)}let C=await _;await f();let w=[],T={};if(p.plugins)for(let e of p.plugins)e.css?.postcssPlugins&&w.push(...e.css.postcssPlugins),e.css?.preprocessorOptions&&Object.assign(T,e.css.preprocessorOptions);let E={root:e,mode:t,experimental:{bundledDev:!g&&process.env.BOLTDOCS_BUNDLED_DEV===`true`},oxc:{jsx:{development:!g,runtime:`automatic`,importSource:`react`}},optimizeDeps:{entries:[`index.html`],include:[`react`,`react-dom`,`react-dom/client`,`react-helmet-async`,`react-router-dom`,`react-fast-compare`,`invariant`,`use-sync-external-store/shim`]},css:w.length>0||Object.keys(T).length>0?{postcss:w.length>0?{plugins:w}:void 0,preprocessorOptions:Object.keys(T).length>0?T:void 0}:void 0,build:{},plugins:[v(),o(),...s({docsDir:m,root:e,routes:h},p)],ssr:{external:[`react`,`react-dom`,`react-helmet-async`,`react-router-dom`,`@bdocs/ssg`,`jsdom`,...c()],optimizeDeps:{include:[`react`,`react-dom`,`react-fast-compare`,...p.vite?.ssr?.optimizeDeps?.include??[]]},noExternal:[]},server:{watch:{ignored:[`**/.boltdocs/**`,...p.vite?.server?.watch?.ignored??[]]},headers:{...C,...p.vite?.server?.headers},...p.vite?.server},preview:{headers:{...C,...p.vite?.preview?.headers},...p.vite?.preview},...p.vite??{},resolve:{...p.vite?.resolve??{},alias:S({root:e,clientSourceRoot:oe,aliases:[...b(p.aliases),...b(p.vite?.resolve?.alias)]}).map(e=>({...e,...typeof e.replacement==`string`?{replacement:u(e.replacement)}:{}})),dedupe:[`react`,`react-dom`,`react-router-dom`,...p.vite?.resolve?.dedupe??[]]},base:p.base||`/`,publicDir:Z(e,p,r.publicDir)};return X.set(i,{config:E}),E.__boltdocsConfig=p,E}Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return O}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,`b`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return H}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return L}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,`y`,{enumerable:!0,get:function(){return T}});
|