svedocs 0.1.0-beta.2

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 (192) hide show
  1. package/LICENSE +5 -0
  2. package/README.md +38 -0
  3. package/dist/ai/openai-compatible.d.ts +13 -0
  4. package/dist/ai/openai-compatible.d.ts.map +1 -0
  5. package/dist/ai/openai-compatible.js +92 -0
  6. package/dist/ai/providers.d.ts +19 -0
  7. package/dist/ai/providers.d.ts.map +1 -0
  8. package/dist/ai/providers.js +185 -0
  9. package/dist/ai/rate-limit.d.ts +18 -0
  10. package/dist/ai/rate-limit.d.ts.map +1 -0
  11. package/dist/ai/rate-limit.js +52 -0
  12. package/dist/ai/response.d.ts +4 -0
  13. package/dist/ai/response.d.ts.map +1 -0
  14. package/dist/ai/response.js +151 -0
  15. package/dist/ai/runtime.d.ts +30 -0
  16. package/dist/ai/runtime.d.ts.map +1 -0
  17. package/dist/ai/runtime.js +105 -0
  18. package/dist/ai/types.d.ts +93 -0
  19. package/dist/ai/types.d.ts.map +1 -0
  20. package/dist/ai/types.js +1 -0
  21. package/dist/ai.d.ts +7 -0
  22. package/dist/ai.d.ts.map +1 -0
  23. package/dist/ai.js +6 -0
  24. package/dist/ambient.d.ts +5 -0
  25. package/dist/cloudflare.d.ts +27 -0
  26. package/dist/cloudflare.d.ts.map +1 -0
  27. package/dist/cloudflare.js +146 -0
  28. package/dist/config.d.ts +311 -0
  29. package/dist/config.d.ts.map +1 -0
  30. package/dist/config.js +243 -0
  31. package/dist/core/checks.d.ts +4 -0
  32. package/dist/core/checks.d.ts.map +1 -0
  33. package/dist/core/checks.js +252 -0
  34. package/dist/core/config.d.ts +5 -0
  35. package/dist/core/config.d.ts.map +1 -0
  36. package/dist/core/config.js +182 -0
  37. package/dist/core/content.d.ts +7 -0
  38. package/dist/core/content.d.ts.map +1 -0
  39. package/dist/core/content.js +211 -0
  40. package/dist/core/links.d.ts +8 -0
  41. package/dist/core/links.d.ts.map +1 -0
  42. package/dist/core/links.js +94 -0
  43. package/dist/core/navigation.d.ts +5 -0
  44. package/dist/core/navigation.d.ts.map +1 -0
  45. package/dist/core/navigation.js +144 -0
  46. package/dist/core/search.d.ts +5 -0
  47. package/dist/core/search.d.ts.map +1 -0
  48. package/dist/core/search.js +41 -0
  49. package/dist/core/types.d.ts +269 -0
  50. package/dist/core/types.d.ts.map +1 -0
  51. package/dist/core/types.js +4 -0
  52. package/dist/core/utils.d.ts +12 -0
  53. package/dist/core/utils.d.ts.map +1 -0
  54. package/dist/core/utils.js +52 -0
  55. package/dist/core.d.ts +8 -0
  56. package/dist/core.d.ts.map +1 -0
  57. package/dist/core.js +7 -0
  58. package/dist/index.d.ts +6 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +3 -0
  61. package/dist/mdx/ast.d.ts +32 -0
  62. package/dist/mdx/ast.d.ts.map +1 -0
  63. package/dist/mdx/ast.js +148 -0
  64. package/dist/mdx/code.d.ts +14 -0
  65. package/dist/mdx/code.d.ts.map +1 -0
  66. package/dist/mdx/code.js +315 -0
  67. package/dist/mdx/compile.d.ts +26 -0
  68. package/dist/mdx/compile.d.ts.map +1 -0
  69. package/dist/mdx/compile.js +63 -0
  70. package/dist/mdx/diff.d.ts +5 -0
  71. package/dist/mdx/diff.d.ts.map +1 -0
  72. package/dist/mdx/diff.js +160 -0
  73. package/dist/mdx/utils.d.ts +10 -0
  74. package/dist/mdx/utils.d.ts.map +1 -0
  75. package/dist/mdx/utils.js +64 -0
  76. package/dist/og/image.d.ts +21 -0
  77. package/dist/og/image.d.ts.map +1 -0
  78. package/dist/og/image.js +216 -0
  79. package/dist/og/metadata.d.ts +7 -0
  80. package/dist/og/metadata.d.ts.map +1 -0
  81. package/dist/og/metadata.js +160 -0
  82. package/dist/og/types.d.ts +59 -0
  83. package/dist/og/types.d.ts.map +1 -0
  84. package/dist/og/types.js +1 -0
  85. package/dist/og.d.ts +4 -0
  86. package/dist/og.d.ts.map +1 -0
  87. package/dist/og.js +3 -0
  88. package/dist/search/algolia.d.ts +10 -0
  89. package/dist/search/algolia.d.ts.map +1 -0
  90. package/dist/search/algolia.js +82 -0
  91. package/dist/search/cloudflare-sync.d.ts +5 -0
  92. package/dist/search/cloudflare-sync.d.ts.map +1 -0
  93. package/dist/search/cloudflare-sync.js +169 -0
  94. package/dist/search/cloudflare.d.ts +9 -0
  95. package/dist/search/cloudflare.d.ts.map +1 -0
  96. package/dist/search/cloudflare.js +115 -0
  97. package/dist/search/local.d.ts +9 -0
  98. package/dist/search/local.d.ts.map +1 -0
  99. package/dist/search/local.js +122 -0
  100. package/dist/search/runtime.d.ts +41 -0
  101. package/dist/search/runtime.d.ts.map +1 -0
  102. package/dist/search/runtime.js +151 -0
  103. package/dist/search/types.d.ts +172 -0
  104. package/dist/search/types.d.ts.map +1 -0
  105. package/dist/search/types.js +1 -0
  106. package/dist/search/typesense.d.ts +11 -0
  107. package/dist/search/typesense.d.ts.map +1 -0
  108. package/dist/search/typesense.js +91 -0
  109. package/dist/search/utils.d.ts +10 -0
  110. package/dist/search/utils.d.ts.map +1 -0
  111. package/dist/search/utils.js +55 -0
  112. package/dist/search.d.ts +8 -0
  113. package/dist/search.d.ts.map +1 -0
  114. package/dist/search.js +7 -0
  115. package/dist/svelte.d.ts +24 -0
  116. package/dist/svelte.d.ts.map +1 -0
  117. package/dist/svelte.js +51 -0
  118. package/dist/testing.d.ts +3 -0
  119. package/dist/testing.d.ts.map +1 -0
  120. package/dist/testing.js +23 -0
  121. package/dist/theme/AskAiPanel.svelte +433 -0
  122. package/dist/theme/AskAiPanel.svelte.d.ts +27 -0
  123. package/dist/theme/AskAiPanel.svelte.d.ts.map +1 -0
  124. package/dist/theme/Button.svelte +34 -0
  125. package/dist/theme/Button.svelte.d.ts +41 -0
  126. package/dist/theme/Button.svelte.d.ts.map +1 -0
  127. package/dist/theme/Checkbox.svelte +63 -0
  128. package/dist/theme/Checkbox.svelte.d.ts +45 -0
  129. package/dist/theme/Checkbox.svelte.d.ts.map +1 -0
  130. package/dist/theme/CodeBlock.svelte +6 -0
  131. package/dist/theme/CodeBlock.svelte.d.ts +22 -0
  132. package/dist/theme/CodeBlock.svelte.d.ts.map +1 -0
  133. package/dist/theme/DocPage.svelte +121 -0
  134. package/dist/theme/DocPage.svelte.d.ts +33 -0
  135. package/dist/theme/DocPage.svelte.d.ts.map +1 -0
  136. package/dist/theme/DocsApp.svelte +78 -0
  137. package/dist/theme/DocsApp.svelte.d.ts +63 -0
  138. package/dist/theme/DocsApp.svelte.d.ts.map +1 -0
  139. package/dist/theme/DocsLayout.svelte +167 -0
  140. package/dist/theme/DocsLayout.svelte.d.ts +40 -0
  141. package/dist/theme/DocsLayout.svelte.d.ts.map +1 -0
  142. package/dist/theme/FloatingToolbar.svelte +73 -0
  143. package/dist/theme/FloatingToolbar.svelte.d.ts +22 -0
  144. package/dist/theme/FloatingToolbar.svelte.d.ts.map +1 -0
  145. package/dist/theme/FormField.svelte +41 -0
  146. package/dist/theme/FormField.svelte.d.ts +35 -0
  147. package/dist/theme/FormField.svelte.d.ts.map +1 -0
  148. package/dist/theme/HomePage.svelte +228 -0
  149. package/dist/theme/HomePage.svelte.d.ts +58 -0
  150. package/dist/theme/HomePage.svelte.d.ts.map +1 -0
  151. package/dist/theme/Input.svelte +36 -0
  152. package/dist/theme/Input.svelte.d.ts +34 -0
  153. package/dist/theme/Input.svelte.d.ts.map +1 -0
  154. package/dist/theme/PageLayout.svelte +36 -0
  155. package/dist/theme/PageLayout.svelte.d.ts +31 -0
  156. package/dist/theme/PageLayout.svelte.d.ts.map +1 -0
  157. package/dist/theme/RootLayout.svelte +330 -0
  158. package/dist/theme/RootLayout.svelte.d.ts +40 -0
  159. package/dist/theme/RootLayout.svelte.d.ts.map +1 -0
  160. package/dist/theme/ScopeSwitcher.svelte +103 -0
  161. package/dist/theme/ScopeSwitcher.svelte.d.ts +24 -0
  162. package/dist/theme/ScopeSwitcher.svelte.d.ts.map +1 -0
  163. package/dist/theme/SearchDialog.svelte +253 -0
  164. package/dist/theme/SearchDialog.svelte.d.ts +28 -0
  165. package/dist/theme/SearchDialog.svelte.d.ts.map +1 -0
  166. package/dist/theme/Select.svelte +37 -0
  167. package/dist/theme/Select.svelte.d.ts +42 -0
  168. package/dist/theme/Select.svelte.d.ts.map +1 -0
  169. package/dist/theme/SidebarTree.svelte +136 -0
  170. package/dist/theme/SidebarTree.svelte.d.ts +24 -0
  171. package/dist/theme/SidebarTree.svelte.d.ts.map +1 -0
  172. package/dist/theme/Textarea.svelte +33 -0
  173. package/dist/theme/Textarea.svelte.d.ts +33 -0
  174. package/dist/theme/Textarea.svelte.d.ts.map +1 -0
  175. package/dist/theme/ThemeToggle.svelte +39 -0
  176. package/dist/theme/ThemeToggle.svelte.d.ts +21 -0
  177. package/dist/theme/ThemeToggle.svelte.d.ts.map +1 -0
  178. package/dist/theme/forms.d.ts +4 -0
  179. package/dist/theme/forms.d.ts.map +1 -0
  180. package/dist/theme/forms.js +3 -0
  181. package/dist/theme/index.d.ts +21 -0
  182. package/dist/theme/index.d.ts.map +1 -0
  183. package/dist/theme/index.js +19 -0
  184. package/dist/theme/portal.d.ts +5 -0
  185. package/dist/theme/portal.d.ts.map +1 -0
  186. package/dist/theme/portal.js +19 -0
  187. package/dist/theme/styles.css +3697 -0
  188. package/dist/virtual.d.ts +59 -0
  189. package/dist/vite.d.ts +10 -0
  190. package/dist/vite.d.ts.map +1 -0
  191. package/dist/vite.js +304 -0
  192. package/package.json +118 -0
@@ -0,0 +1,59 @@
1
+ declare module 'virtual:svedocs/config' {
2
+ import type { SvedocsResolvedConfig } from 'svedocs/core';
3
+ const config: SvedocsResolvedConfig;
4
+ export default config;
5
+ }
6
+
7
+ declare module 'virtual:svedocs/pages' {
8
+ import type { SvedocsPage } from 'svedocs/core';
9
+ const pages: SvedocsPage[];
10
+ export default pages;
11
+ }
12
+
13
+ declare module 'virtual:svedocs/page-index' {
14
+ import type { SvedocsPage } from 'svedocs/core';
15
+ const pages: SvedocsPage[];
16
+ export default pages;
17
+ }
18
+
19
+ declare module 'virtual:svedocs/page-loaders' {
20
+ import type { SvedocsPage } from 'svedocs/core';
21
+ const loaders: Record<string, () => Promise<{ default: SvedocsPage | undefined }>>;
22
+ export default loaders;
23
+ }
24
+
25
+ declare module 'virtual:svedocs/tree' {
26
+ import type { SvedocsTreeItem } from 'svedocs/core';
27
+ const tree: SvedocsTreeItem[];
28
+ export default tree;
29
+ }
30
+
31
+ declare module 'virtual:svedocs/search' {
32
+ import type { SvedocsSearchRecord } from 'svedocs/core';
33
+ const records: SvedocsSearchRecord[];
34
+ export default records;
35
+ }
36
+
37
+ declare module 'virtual:svedocs/search-loader' {
38
+ import type { SvedocsSearchRecord } from 'svedocs/core';
39
+ const loadSearch: () => Promise<SvedocsSearchRecord[]>;
40
+ export default loadSearch;
41
+ }
42
+
43
+ declare module 'virtual:svedocs/manifest' {
44
+ import type { SvedocsContentManifest } from 'svedocs/core';
45
+ const manifest: SvedocsContentManifest;
46
+ export default manifest;
47
+ }
48
+
49
+ declare module 'virtual:svedocs/components' {
50
+ import type { Component } from 'svelte';
51
+ const components: Record<string, Component>;
52
+ export default components;
53
+ }
54
+
55
+ declare module 'virtual:svedocs/layouts' {
56
+ import type { Component } from 'svelte';
57
+ const layouts: Record<string, Component>;
58
+ export default layouts;
59
+ }
package/dist/vite.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { type Plugin } from 'vite';
2
+ import type { SvedocsConfig } from './config.js';
3
+ export interface SvedocsVitePluginOptions {
4
+ configFile?: string;
5
+ config?: SvedocsConfig;
6
+ components?: Record<string, string>;
7
+ layouts?: Record<string, string>;
8
+ }
9
+ export declare function svedocs(options?: SvedocsVitePluginOptions): Plugin;
10
+ //# sourceMappingURL=vite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAMA,OAAO,EAAsB,KAAK,MAAM,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAwBD,wBAAgB,OAAO,CAAC,OAAO,GAAE,wBAA6B,GAAG,MAAM,CAiGtE"}
package/dist/vite.js ADDED
@@ -0,0 +1,304 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
+ import matter from 'gray-matter';
5
+ import { compile as compileMdsvex } from 'mdsvex';
6
+ import { loadConfigFromFile } from 'vite';
7
+ import { loadSvedocsContent } from './core.js';
8
+ import { createSvedocsMdsvexOptions } from './svelte.js';
9
+ const virtualModules = new Set([
10
+ 'virtual:svedocs/config',
11
+ 'virtual:svedocs/pages',
12
+ 'virtual:svedocs/page-index',
13
+ 'virtual:svedocs/page-loaders',
14
+ 'virtual:svedocs/tree',
15
+ 'virtual:svedocs/search',
16
+ 'virtual:svedocs/search-loader',
17
+ 'virtual:svedocs/components',
18
+ 'virtual:svedocs/layouts',
19
+ 'virtual:svedocs/manifest'
20
+ ]);
21
+ const componentVirtualPrefix = 'virtual:svedocs/component/';
22
+ const pageVirtualPrefix = 'virtual:svedocs/page/';
23
+ const defaultConfigFiles = [
24
+ 'svedocs.config.ts',
25
+ 'svedocs.config.mts',
26
+ 'svedocs.config.js',
27
+ 'svedocs.config.mjs'
28
+ ];
29
+ export function svedocs(options = {}) {
30
+ let root = process.cwd();
31
+ let manifest;
32
+ let resolvedConfig;
33
+ let resolvedConfigFile;
34
+ async function refresh() {
35
+ const loaded = await loadPluginConfig(root, options);
36
+ resolvedConfig = loaded.config;
37
+ resolvedConfigFile = loaded.configFile;
38
+ manifest = await loadSvedocsContent(createContentOptions(root, resolvedConfig));
39
+ }
40
+ return {
41
+ name: 'svedocs',
42
+ async configResolved(config) {
43
+ root = config.root;
44
+ await refresh();
45
+ },
46
+ async buildStart() {
47
+ await refresh();
48
+ if (resolvedConfigFile)
49
+ this.addWatchFile(resolvedConfigFile);
50
+ for (const page of manifest?.pages ?? []) {
51
+ this.addWatchFile(page.sourcePath);
52
+ }
53
+ },
54
+ config() {
55
+ return {
56
+ define: {
57
+ __SVEDOCS_CONFIG_FILE__: JSON.stringify(options.configFile ?? process.env.SVEDOCS_CONFIG_FILE ?? 'svedocs.config.ts')
58
+ }
59
+ };
60
+ },
61
+ resolveId(id) {
62
+ if (id.startsWith(componentVirtualPrefix))
63
+ return `\0${id}`;
64
+ if (id.startsWith(pageVirtualPrefix))
65
+ return `\0${id}`;
66
+ if (virtualModules.has(id))
67
+ return `\0${id}`;
68
+ return undefined;
69
+ },
70
+ async load(id) {
71
+ if (id.startsWith(`\0${pageVirtualPrefix}`)) {
72
+ if (!manifest)
73
+ await refresh();
74
+ const data = manifest ?? (await loadSvedocsContent(createContentOptions(root, options.config)));
75
+ const code = loadPageDataModule(id, data.pages);
76
+ return {
77
+ code,
78
+ map: {
79
+ version: 3,
80
+ sources: [id],
81
+ sourcesContent: [code],
82
+ names: [],
83
+ mappings: ''
84
+ }
85
+ };
86
+ }
87
+ if (id.startsWith(`\0${componentVirtualPrefix}`)) {
88
+ if (!manifest)
89
+ await refresh();
90
+ const data = manifest ?? (await loadSvedocsContent(createContentOptions(root, options.config)));
91
+ const code = await loadPageComponent(root, id, data.pages, options.components ?? {}, resolvedConfig, data.config);
92
+ return {
93
+ code,
94
+ map: {
95
+ version: 3,
96
+ sources: [id],
97
+ sourcesContent: [code],
98
+ names: [],
99
+ mappings: ''
100
+ }
101
+ };
102
+ }
103
+ if (!id.startsWith('\0virtual:svedocs/'))
104
+ return undefined;
105
+ if (!manifest)
106
+ await refresh();
107
+ const data = manifest ?? (await loadSvedocsContent(createContentOptions(root, options.config)));
108
+ const key = id.replace('\0virtual:svedocs/', '');
109
+ if (key === 'config')
110
+ return `export default ${JSON.stringify(data.config)};`;
111
+ if (key === 'pages')
112
+ return `export default ${JSON.stringify(data.pages)};`;
113
+ if (key === 'page-index')
114
+ return `export default ${JSON.stringify(createPageIndex(data.pages))};`;
115
+ if (key === 'page-loaders')
116
+ return createPageLoadersModule(data.pages);
117
+ if (key === 'tree')
118
+ return `export default ${JSON.stringify(data.tree)};`;
119
+ if (key === 'search')
120
+ return `export default ${JSON.stringify(data.search)};`;
121
+ if (key === 'search-loader')
122
+ return `export default () => import('virtual:svedocs/search').then((module) => module.default);`;
123
+ if (key === 'components')
124
+ return createComponentsModule(data.pages);
125
+ if (key === 'layouts')
126
+ return createNamedImportModule(options.layouts ?? {});
127
+ if (key === 'manifest')
128
+ return `export default ${JSON.stringify(data)};`;
129
+ return undefined;
130
+ },
131
+ async handleHotUpdate(ctx) {
132
+ if (/\.(md|mdx|svx)$/.test(ctx.file) || ctx.file === resolvedConfigFile || /svedocs\.config\.[cm]?[jt]s$/.test(ctx.file)) {
133
+ await refresh();
134
+ const modules = Array.from(virtualModules)
135
+ .map((id) => ctx.server.moduleGraph.getModuleById(`\0${id}`))
136
+ .filter((module) => module !== undefined);
137
+ return modules;
138
+ }
139
+ return undefined;
140
+ }
141
+ };
142
+ }
143
+ function createContentOptions(root, config) {
144
+ const buildConfig = applyBuildModeOverride(config);
145
+ return buildConfig ? { projectRoot: root, config: buildConfig } : { projectRoot: root };
146
+ }
147
+ function applyBuildModeOverride(config) {
148
+ const mode = process.env.SVEDOCS_BUILD_MODE;
149
+ if (mode !== 'edge' && mode !== 'static' && mode !== 'spa')
150
+ return config;
151
+ return {
152
+ ...(config ?? {}),
153
+ build: {
154
+ ...(config?.build ?? {}),
155
+ mode
156
+ }
157
+ };
158
+ }
159
+ async function loadPluginConfig(root, options) {
160
+ if (options.config)
161
+ return { config: options.config };
162
+ const configFile = options.configFile
163
+ ? path.resolve(root, options.configFile)
164
+ : process.env.SVEDOCS_CONFIG_FILE
165
+ ? path.resolve(root, process.env.SVEDOCS_CONFIG_FILE)
166
+ : await findConfigFile(root);
167
+ if (!configFile)
168
+ return {};
169
+ try {
170
+ const loaded = await loadConfigFromFile({
171
+ command: 'serve',
172
+ mode: process.env.NODE_ENV ?? 'production'
173
+ }, configFile, root, 'silent');
174
+ if (loaded?.config && typeof loaded.config === 'object') {
175
+ return { config: loaded.config, configFile };
176
+ }
177
+ }
178
+ catch (error) {
179
+ if (!/\.[cm]?js$/.test(configFile)) {
180
+ const message = error instanceof Error ? error.message : String(error);
181
+ throw new Error(`Failed to load ${path.relative(root, configFile)}: ${message}`);
182
+ }
183
+ }
184
+ const module = await import(pathToFileURL(configFile).href);
185
+ return { config: (module.default ?? module.config), configFile };
186
+ }
187
+ async function findConfigFile(root) {
188
+ for (const file of defaultConfigFiles) {
189
+ const candidate = path.join(root, file);
190
+ if (await fileExists(candidate))
191
+ return candidate;
192
+ }
193
+ return undefined;
194
+ }
195
+ async function fileExists(filePath) {
196
+ try {
197
+ await access(filePath);
198
+ return true;
199
+ }
200
+ catch {
201
+ return false;
202
+ }
203
+ }
204
+ function createComponentsModule(pages) {
205
+ const componentPages = pages.filter((page) => /\.(mdx|svx)$/.test(page.sourcePath));
206
+ const imports = componentPages
207
+ .map((page, index) => `import C${index} from '${componentVirtualPrefix}${encodeURIComponent(page.id)}.svelte';`)
208
+ .join('\n');
209
+ const entries = componentPages
210
+ .map((page, index) => `${JSON.stringify(page.id)}: C${index}`)
211
+ .join(',\n ');
212
+ return `${imports}\nexport default {\n ${entries}\n};`;
213
+ }
214
+ function createPageIndex(pages) {
215
+ return pages.map((page) => ({
216
+ ...page,
217
+ html: '',
218
+ plainText: '',
219
+ headings: [],
220
+ links: [],
221
+ codeBlocks: [],
222
+ search: []
223
+ }));
224
+ }
225
+ function createPageLoadersModule(pages) {
226
+ const entries = pages
227
+ .map((page) => `${JSON.stringify(page.id)}: () => import('${pageVirtualPrefix}${encodeURIComponent(page.id)}.js')`)
228
+ .join(',\n ');
229
+ return `export default {\n ${entries}\n};`;
230
+ }
231
+ function loadPageDataModule(id, pages) {
232
+ const pageId = decodeURIComponent(id.slice(`\0${pageVirtualPrefix}`.length).replace(/\.js$/, ''));
233
+ const page = pages.find((item) => item.id === pageId);
234
+ return `export default ${JSON.stringify(page)};`;
235
+ }
236
+ function createNamedImportModule(entries) {
237
+ const imports = Object.entries(entries)
238
+ .map(([, specifier], index) => `import C${index} from ${JSON.stringify(specifier)};`)
239
+ .join('\n');
240
+ const exports = Object.keys(entries)
241
+ .map((name, index) => `${JSON.stringify(name)}: C${index}`)
242
+ .join(',\n ');
243
+ return `${imports}\nexport default {\n ${exports}\n};`;
244
+ }
245
+ async function loadPageComponent(root, id, pages, components, rawConfig, manifestConfig) {
246
+ const pageId = decodeURIComponent(id.slice(`\0${componentVirtualPrefix}`.length).replace(/\.svelte$/, ''));
247
+ const page = pages.find((item) => item.id === pageId);
248
+ if (!page)
249
+ return '<script>export const prerender = true;</script>';
250
+ const raw = await readFile(path.join(root, page.sourcePath), 'utf8');
251
+ const parsed = matter(raw);
252
+ const source = injectSvedocsComponentImports(stripFirstTitleHeading(parsed.content), components);
253
+ try {
254
+ const compiled = await compileMdsvex(source, {
255
+ filename: page.sourcePath,
256
+ ...createSvedocsMdsvexOptions(source, createMdsvexOptionsFromConfig(rawConfig), {
257
+ codeThemes: {
258
+ light: manifestConfig.theme.codeTheme.light,
259
+ dark: manifestConfig.theme.codeTheme.dark
260
+ },
261
+ ...(rawConfig?.markdown?.shiki?.transformers ? { shikiTransformers: rawConfig.markdown.shiki.transformers } : {})
262
+ })
263
+ });
264
+ const result = await compiled;
265
+ return stripInlineSourceMap(result?.code ?? '<script>export const prerender = true;</script>');
266
+ }
267
+ catch (error) {
268
+ const message = error instanceof Error ? error.message : String(error);
269
+ throw new Error(`Failed to compile ${page.sourcePath} as Svelte-compatible MDX: ${message}`);
270
+ }
271
+ }
272
+ function createMdsvexOptionsFromConfig(config) {
273
+ const options = {};
274
+ if (config?.markdown?.remarkPlugins) {
275
+ options.remarkPlugins = config.markdown.remarkPlugins;
276
+ }
277
+ if (config?.markdown?.rehypePlugins) {
278
+ options.rehypePlugins = config.markdown.rehypePlugins;
279
+ }
280
+ return options;
281
+ }
282
+ function stripFirstTitleHeading(markdown) {
283
+ const lines = markdown.split(/\r?\n/);
284
+ const index = lines.findIndex((line) => /^#\s+/.test(line.trim()));
285
+ if (index >= 0)
286
+ lines.splice(index, 1);
287
+ return lines.join('\n').trim();
288
+ }
289
+ function injectSvedocsComponentImports(source, components) {
290
+ const imports = Object.entries(components)
291
+ .map(([name, specifier]) => `import ${name} from ${JSON.stringify(specifier)};`)
292
+ .join('\n');
293
+ if (!imports)
294
+ return source;
295
+ const instanceScript = /<script(\s(?![^>]*\bcontext=["']module["'])[^>]*)?>/.exec(source);
296
+ if (!instanceScript || instanceScript.index === undefined) {
297
+ return `<script>\n${imports}\n</script>\n\n${source}`;
298
+ }
299
+ const insertAt = instanceScript.index + instanceScript[0].length;
300
+ return `${source.slice(0, insertAt)}\n${imports}${source.slice(insertAt)}`;
301
+ }
302
+ function stripInlineSourceMap(code) {
303
+ return code.replace(/\n?\/\/# sourceMappingURL=data:application\/json;base64,[A-Za-z0-9+/=]+$/m, '');
304
+ }
package/package.json ADDED
@@ -0,0 +1,118 @@
1
+ {
2
+ "name": "svedocs",
3
+ "version": "0.1.0-beta.2",
4
+ "description": "SvelteKit-native documentation framework.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/backrunner/svedocs.git",
9
+ "directory": "packages/svedocs"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/backrunner/svedocs/issues"
13
+ },
14
+ "homepage": "https://github.com/backrunner/svedocs/tree/main/packages/svedocs#readme",
15
+ "type": "module",
16
+ "publishConfig": {
17
+ "access": "public",
18
+ "provenance": true
19
+ },
20
+ "sideEffects": [
21
+ "**/*.css",
22
+ "**/*.svelte"
23
+ ],
24
+ "svelte": "./dist/index.js",
25
+ "exports": {
26
+ ".": {
27
+ "svelte": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js"
30
+ },
31
+ "./config": {
32
+ "types": "./dist/config.d.ts",
33
+ "import": "./dist/config.js"
34
+ },
35
+ "./core": {
36
+ "types": "./dist/core.d.ts",
37
+ "import": "./dist/core.js"
38
+ },
39
+ "./vite": {
40
+ "types": "./dist/vite.d.ts",
41
+ "import": "./dist/vite.js"
42
+ },
43
+ "./theme": {
44
+ "svelte": "./dist/theme/index.js",
45
+ "types": "./dist/theme/index.d.ts",
46
+ "import": "./dist/theme/index.js"
47
+ },
48
+ "./theme/styles.css": {
49
+ "default": "./dist/theme/styles.css"
50
+ },
51
+ "./cloudflare": {
52
+ "types": "./dist/cloudflare.d.ts",
53
+ "import": "./dist/cloudflare.js"
54
+ },
55
+ "./search": {
56
+ "types": "./dist/search.d.ts",
57
+ "import": "./dist/search.js"
58
+ },
59
+ "./ai": {
60
+ "types": "./dist/ai.d.ts",
61
+ "import": "./dist/ai.js"
62
+ },
63
+ "./og": {
64
+ "types": "./dist/og.d.ts",
65
+ "import": "./dist/og.js"
66
+ },
67
+ "./svelte": {
68
+ "types": "./dist/svelte.d.ts",
69
+ "import": "./dist/svelte.js"
70
+ },
71
+ "./testing": {
72
+ "types": "./dist/testing.d.ts",
73
+ "import": "./dist/testing.js"
74
+ }
75
+ },
76
+ "files": [
77
+ "dist",
78
+ "README.md",
79
+ "LICENSE"
80
+ ],
81
+ "dependencies": {
82
+ "@resvg/resvg-js": "2.6.2",
83
+ "fast-glob": "3.3.3",
84
+ "github-slugger": "2.0.0",
85
+ "gray-matter": "4.0.3",
86
+ "hast-util-to-string": "3.0.0",
87
+ "katex": "0.16.47",
88
+ "mdsvex": "0.12.7",
89
+ "minisearch": "7.2.0",
90
+ "rehype-autolink-headings": "7.1.0",
91
+ "rehype-katex": "7.0.1",
92
+ "rehype-raw": "7.0.0",
93
+ "rehype-slug": "6.0.0",
94
+ "rehype-stringify": "10.0.1",
95
+ "remark-gfm": "4.0.1",
96
+ "remark-math": "6.0.0",
97
+ "remark-parse": "11.0.0",
98
+ "remark-rehype": "11.1.2",
99
+ "satori": "0.26.0",
100
+ "shiki": "4.0.2",
101
+ "unified": "11.0.5",
102
+ "unist-util-visit": "5.1.0",
103
+ "zod": "4.4.3"
104
+ },
105
+ "peerDependencies": {
106
+ "@sveltejs/kit": ">=2.0.0",
107
+ "svelte": ">=5.0.0",
108
+ "vite": ">=8.0.0"
109
+ },
110
+ "scripts": {
111
+ "build": "svelte-package -i src -o dist",
112
+ "test": "vitest run",
113
+ "check": "tsc -p tsconfig.json --noEmit",
114
+ "lint": "tsc -p tsconfig.json --noEmit",
115
+ "pack:dry-run": "pnpm pack --dry-run",
116
+ "dev": "svelte-package -i src -o dist --watch"
117
+ }
118
+ }