boltdocs 3.2.2 → 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.
Files changed (155) hide show
  1. package/bin/boltdocs.js +20 -1
  2. package/bin/preloader.mjs +28 -0
  3. package/dist/{adapters-ByYY44Zy.mjs → adapters-BmB4TKCc.mjs} +1 -1
  4. package/dist/{adapters-DvmtpdSF.cjs → adapters-Cp1Maurn.cjs} +1 -1
  5. package/dist/audit-CLXjMzwQ.mjs +11 -0
  6. package/dist/audit-COgjnQ5n.cjs +11 -0
  7. package/dist/build-BS2hefiL.cjs +6 -0
  8. package/dist/build-C5mNh9D-.mjs +6 -0
  9. package/dist/cache-CJE9nWLE.cjs +6 -0
  10. package/dist/cache-OY4HzIXl.mjs +6 -0
  11. package/dist/callout-oI_LCbxS.d.ts +71 -0
  12. package/dist/callout-plqx9Dw-.d.cts +71 -0
  13. package/dist/client/index.cjs +1265 -569
  14. package/dist/client/index.d.cts +3 -542
  15. package/dist/client/index.d.ts +3 -542
  16. package/dist/client/index.js +1167 -521
  17. package/dist/client/mdx.cjs +1 -1
  18. package/dist/client/mdx.d.cts +24 -2
  19. package/dist/client/mdx.d.ts +24 -2
  20. package/dist/client/mdx.js +1 -1
  21. package/dist/client/primitives.cjs +14 -4
  22. package/dist/client/primitives.d.cts +281 -38
  23. package/dist/client/primitives.d.ts +281 -38
  24. package/dist/client/primitives.js +5 -5
  25. package/dist/client/router.cjs +49 -0
  26. package/dist/client/router.d.cts +3 -0
  27. package/dist/client/router.d.ts +3 -0
  28. package/dist/client/router.js +8 -0
  29. package/dist/client/theme/reset.css +40 -4
  30. package/dist/{config-BpzaPsJj.d.cts → config-BoRlz0Ca.d.mts} +157 -14
  31. package/dist/{config-xtS0ZkMm.d.mts → config-CTsX_tGM.d.cts} +157 -14
  32. package/dist/config-Ceib-AOH.cjs +7 -0
  33. package/dist/config-DGLQsy7y.mjs +7 -0
  34. package/dist/{package-CH2ChQqw.cjs → config-files-BYHDOrKn.mjs} +1 -1
  35. package/dist/config-files-D9cdBMl2.cjs +6 -0
  36. package/dist/config-jJh8WYJI.cjs +6 -0
  37. package/dist/csp-C4LmN1ko.cjs +6 -0
  38. package/dist/csp-D6JEOqKh.mjs +6 -0
  39. package/dist/dev-Ch3hEe5Y.cjs +6 -0
  40. package/dist/dev-QPNxysrd.mjs +6 -0
  41. package/dist/{docs-layout-BdtZ9z6s.js → docs-layout-CbZ7LDRe.js} +504 -249
  42. package/dist/{docs-layout-CFWI15Id.cjs → docs-layout-vzfXed1Q.cjs} +516 -254
  43. package/dist/{doctor-BBtmNJE0.cjs → doctor-B1_YL0Wt.cjs} +1 -1
  44. package/dist/doctor-C7whl4ED.cjs +6 -0
  45. package/dist/doctor-DmQnml2k.mjs +6 -0
  46. package/dist/{generator-COepVWGi.cjs → generator-BlW45ST7.cjs} +5 -3
  47. package/dist/{generator-CcOBN5vI.mjs → generator-BwknNejd.mjs} +5 -3
  48. package/dist/{handler-XX7cLTqe.cjs → handler-CDEoKARD.cjs} +2 -2
  49. package/dist/{handler-DzQae4eA.mjs → handler-D7UyZlPm.mjs} +2 -2
  50. package/dist/{image-Bz87fCla.js → image-B-NDSDuY.js} +129 -11
  51. package/dist/{image-C4TlpMHn.cjs → image-Hnaa2bJd.cjs} +175 -9
  52. package/dist/index-C56bL-A-.d.cts +1344 -0
  53. package/dist/{sidebar-COTaMHR-.d.ts → index-CPUUKzxD.d.cts} +344 -327
  54. package/dist/{sidebar-CrEdJuHX.d.cts → index-Ci4kfOHF.d.ts} +344 -327
  55. package/dist/index-Cu9H6CRa.d.ts +1344 -0
  56. package/dist/link-CgdI6O2o.js +872 -0
  57. package/dist/{link-D1Gjkb-2.cjs → link-vZjmD-es.cjs} +406 -223
  58. package/dist/{mdx-BuO6a1f7.js → mdx-BRT71V5Q.js} +211 -168
  59. package/dist/{mdx-CD-tSjRG.cjs → mdx-D0Absdq5.cjs} +225 -169
  60. package/dist/native-BNCY7PRF.cjs +6 -0
  61. package/dist/native-Di9Fnfrv.mjs +6 -0
  62. package/dist/native-Kre2T5eS.cjs +6 -0
  63. package/dist/node/cache.cjs +1 -1
  64. package/dist/node/cache.d.cts +19 -3
  65. package/dist/node/cache.d.mts +19 -3
  66. package/dist/node/cache.mjs +1 -1
  67. package/dist/node/cli-entry.cjs +1 -9
  68. package/dist/node/cli-entry.mjs +1 -9
  69. package/dist/node/index.cjs +1 -1
  70. package/dist/node/index.d.cts +245 -17
  71. package/dist/node/index.d.mts +246 -18
  72. package/dist/node/index.mjs +1 -1
  73. package/dist/node/mdx/shiki-adapter.cjs +1 -1
  74. package/dist/node/mdx/shiki-adapter.d.cts +24 -3
  75. package/dist/node/mdx/shiki-adapter.d.mts +24 -2
  76. package/dist/node/mdx/shiki-adapter.mjs +1 -1
  77. package/dist/node-Du5UL5wo.mjs +23 -0
  78. package/dist/node-DunuGqyp.cjs +23 -0
  79. package/dist/{package-DSSB8B5L.mjs → package-DA848keM.mjs} +1 -1
  80. package/dist/package-wplzySjz.cjs +6 -0
  81. package/dist/pages-external-BBw8ObVK.mjs +6 -0
  82. package/dist/pages-external-DPiPFxxP.cjs +6 -0
  83. package/dist/parser-BqTOsEUa.cjs +6 -0
  84. package/dist/parser-CGMY2lJ7.mjs +6 -0
  85. package/dist/plugin-BcTzvHAJ.mjs +69 -0
  86. package/dist/plugin-TulVMt1z.cjs +69 -0
  87. package/dist/plugin-context-C-l90hFt.cjs +15 -0
  88. package/dist/plugin-context-wqHNSZum.mjs +15 -0
  89. package/dist/plugin-lifecycle-B1BzSHdn.cjs +6 -0
  90. package/dist/resolve-B7vWOd8R.cjs +6 -0
  91. package/dist/resolve-C2kKnk_5.mjs +6 -0
  92. package/dist/resolve-It1Iug83.cjs +6 -0
  93. package/dist/resolve-YdTrt_FG.mjs +6 -0
  94. package/dist/router-C3kygdRK.cjs +1285 -0
  95. package/dist/router-CZBxMRAH.js +987 -0
  96. package/dist/routes-BL4y79tb.mjs +6 -0
  97. package/dist/routes-C2nPecwu.cjs +6 -0
  98. package/dist/routes-U9L8psZ9.cjs +6 -0
  99. package/dist/{search-dialog-DHqwjJuG.cjs → search-dialog-BCOHQGSt.cjs} +1 -1
  100. package/dist/search-dialog-Bp_P1MPP.js +481 -0
  101. package/dist/{search-dialog-DFnlx8LO.js → search-dialog-BqkzDTq2.js} +107 -57
  102. package/dist/{search-dialog-BRFno7HD.cjs → search-dialog-CIeIUhAn.cjs} +218 -43
  103. package/dist/{search-dialog-D6TvjcuV.js → search-dialog-DtmxmfEu.js} +1 -1
  104. package/dist/{search-dialog-B1NERUNx.cjs → search-dialog-x_qHU8ty.cjs} +107 -58
  105. package/dist/server/index.cjs +1 -1
  106. package/dist/server/index.d.mts +1 -1
  107. package/dist/server/index.mjs +1 -1
  108. package/dist/update-check-BKqmYfwT.cjs +11 -0
  109. package/dist/update-check-QnrVR3q1.mjs +11 -0
  110. package/dist/utils-8lzafE49.mjs +7 -0
  111. package/dist/utils-ej6_SjIZ.cjs +7 -0
  112. package/dist/virtual-modules-Ca5tHk1X.cjs +30 -0
  113. package/dist/virtual-modules-Dlgt1fP0.mjs +30 -0
  114. package/package.json +18 -16
  115. package/src/shared/mdx-path.ts +12 -0
  116. package/src/shared/structured-data.ts +145 -0
  117. package/src/shared/types.ts +220 -16
  118. package/dist/banner-BMop1KLF.d.ts +0 -100
  119. package/dist/banner-CVD0GugR.d.cts +0 -100
  120. package/dist/cache-CO4Dy2uQ.cjs +0 -6
  121. package/dist/cache-Dk53iOo6.mjs +0 -6
  122. package/dist/config-CCXp3aXO.mjs +0 -7
  123. package/dist/config-CMd4XoFq.cjs +0 -6
  124. package/dist/config-DlGoEM9D.cjs +0 -7
  125. package/dist/csp-CRp_3U7a.cjs +0 -6
  126. package/dist/csp-oTC2ygvF.mjs +0 -6
  127. package/dist/doctor-Bv16QSrI.cjs +0 -7
  128. package/dist/doctor-DOAbSaiL.mjs +0 -7
  129. package/dist/headers-Ddwek8K7.mjs +0 -6
  130. package/dist/headers-dg4SDrjY.cjs +0 -6
  131. package/dist/link-2PzgTnaP.js +0 -673
  132. package/dist/meta-loader-C4Hu9RN9.mjs +0 -6
  133. package/dist/meta-loader-Dq1zcFnh.cjs +0 -6
  134. package/dist/node-B5hu_6qj.cjs +0 -104
  135. package/dist/node-BXtqM1uH.mjs +0 -6
  136. package/dist/node-C8725aw7.mjs +0 -104
  137. package/dist/node-aD1eisrR.cjs +0 -6
  138. package/dist/pages-external-BYa4JSda.mjs +0 -6
  139. package/dist/pages-external-XkYIs-d5.cjs +0 -6
  140. package/dist/parser-DCiEWkSk.cjs +0 -8
  141. package/dist/parser-qk9FIHJ7.mjs +0 -8
  142. package/dist/plugin-CX1OZ6jB.cjs +0 -73
  143. package/dist/plugin-CgfiWaFZ.mjs +0 -73
  144. package/dist/routes-BW6zsk7Z.mjs +0 -6
  145. package/dist/routes-BgoIB5wb.cjs +0 -6
  146. package/dist/routes-CORVxc02.cjs +0 -6
  147. package/dist/search-dialog-BmxHiKwt.js +0 -312
  148. package/dist/shiki-adapter-CoQ6jyJ4.cjs +0 -6
  149. package/dist/shiki-adapter-D-aKw7PP.mjs +0 -6
  150. package/dist/utils-Crm9oPcV.mjs +0 -7
  151. package/dist/utils-D6Xtj0FZ.cjs +0 -7
  152. /package/dist/{errors-0zGHRLue.mjs → errors-N-b6Sn2G.mjs} +0 -0
  153. /package/dist/{index-1KsTDq4o.d.mts → index-lFoyzCXy.d.mts} +0 -0
  154. /package/dist/{types-generator-BXhv7Ill.cjs → types-generator-DDSA93P3.cjs} +0 -0
  155. /package/dist/{types-generator-bDPvUztF.mjs → types-generator-DG1GX1EZ.mjs} +0 -0
@@ -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-1KsTDq4o.mjs";
4
- import { a as BoltdocsThemeConfig, c as PluginLogger, d as PluginTransformMiddleware, f as RouteMeta, i as BoltdocsPlugin, l as PluginMeta, n as defineConfig, o as PluginContext, r as BoltdocsConfig, s as PluginLifecycleHooks, t as resolveConfig, u as PluginStore } from "../config-xtS0ZkMm.mjs";
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
- /** Enable turbo mode (Sätteri MDX compiler) */
17
- turbo?: boolean;
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/index.d.ts
71
+ //#region src/node/routes/parser/cache.d.ts
32
72
  /**
33
- * Invalidates the global route metadata and clears local state.
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 function invalidateRouteCache(): void;
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, turbo?: boolean): Promise<RouteMeta[]>;
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 SecureBoltdocsPlugin {
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): SecureBoltdocsPlugin[];
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 class PluginLifecycleManager {
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
- constructor(plugins: SecureBoltdocsPlugin[], config: BoltdocsConfig, docsDir?: string, rootDir?: string, routes?: RouteMeta[], outDir?: string);
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/index.d.ts
136
- declare function createPlugin(plugin: SecureBoltdocsPlugin): SecureBoltdocsPlugin;
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, SecureBoltdocsPlugin, createPlugin, createViteConfig, boltdocs as default, defineConfig, flushCache, generateEntryCode, generateRoutes, handleAwsFeedback, handleFeedback, handleNetlifyFeedback, handleVercelFeedback, handleWebFeedback, invalidateRouteCache, normalizePath, resolveConfig, sanitizeFilename, validatePlugins };
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, turbo?: boolean): Promise<InlineConfig>;
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, SecureBoltdocsPlugin, createPlugin, createViteConfig, boltdocs as default, defineConfig, flushCache, generateEntryCode, generateRoutes, handleAwsFeedback, handleFeedback, handleNetlifyFeedback, handleVercelFeedback, handleWebFeedback, invalidateRouteCache, normalizePath, resolveConfig, sanitizeFilename, validatePlugins };
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 };
@@ -3,4 +3,4 @@
3
3
  * Copyright (c) 2026 Jesus Alcala
4
4
  * Licensed under the MIT License.
5
5
  */
6
- import{_ as e,b as t,g as n,h as r,i,m as a,n as o,r as s,t as c,v as l,y as u}from"../node-C8725aw7.mjs";import{f as d,u as f}from"../utils-Crm9oPcV.mjs";import{flushCache as p}from"./cache.mjs";import{r as m,t as h}from"../routes-BW6zsk7Z.mjs";import{a as g,r as _}from"../config-CCXp3aXO.mjs";import{t as v}from"../handler-DzQae4eA.mjs";import{i as y,n as b,r as x,t as S}from"../adapters-ByYY44Zy.mjs";export*from"@bdocs/unist-utils";export{r as BoltdocsPluginStore,n as PluginCompatibilityError,e as PluginError,l as PluginHookError,i as PluginLifecycleManager,u as PluginValidationError,s as createPlugin,o as createViteConfig,c as default,g as defineConfig,p as flushCache,t as generateEntryCode,h as generateRoutes,S as handleAwsFeedback,v as handleFeedback,x as handleNetlifyFeedback,y as handleVercelFeedback,b as handleWebFeedback,m as invalidateRouteCache,f as normalizePath,_ as resolveConfig,d as sanitizeFilename,a as validatePlugins};
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(`../../shiki-adapter-CoQ6jyJ4.cjs`);exports.ShikiAdapter=e.t,exports.getShikiAdapter=e.n,exports.parseMetaString=e.r;
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 { p as ShikiTheme, r as BoltdocsConfig } from "../../config-BpzaPsJj.cjs";
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 { p as ShikiTheme, r as BoltdocsConfig } from "../../config-xtS0ZkMm.mjs";
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,r as t,t as n}from"../../shiki-adapter-D-aKw7PP.mjs";export{n as ShikiAdapter,e as getShikiAdapter,t as parseMetaString};
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}});