sdocs 0.0.3 → 0.0.4

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 (194) hide show
  1. package/bin/sdocs.js +1 -1
  2. package/dist/app-gen.d.ts +10 -0
  3. package/dist/app-gen.js +147 -0
  4. package/dist/cli.js +71 -0
  5. package/dist/client/App.svelte +151 -0
  6. package/dist/client/App.svelte.d.ts +14 -0
  7. package/dist/client/CollapsiblePanel.svelte +63 -0
  8. package/dist/client/CollapsiblePanel.svelte.d.ts +9 -0
  9. package/dist/client/ComponentView.svelte +321 -0
  10. package/dist/client/ComponentView.svelte.d.ts +10 -0
  11. package/dist/client/ControlsPanel.svelte +191 -0
  12. package/dist/client/ControlsPanel.svelte.d.ts +13 -0
  13. package/dist/client/DataTable.svelte +78 -0
  14. package/dist/client/DataTable.svelte.d.ts +11 -0
  15. package/dist/client/HomePage.svelte +92 -0
  16. package/dist/client/HomePage.svelte.d.ts +8 -0
  17. package/dist/client/LayoutView.svelte +27 -0
  18. package/dist/client/LayoutView.svelte.d.ts +8 -0
  19. package/dist/client/PageView.svelte +130 -0
  20. package/dist/client/PageView.svelte.d.ts +8 -0
  21. package/dist/client/PreviewFrame.svelte +100 -0
  22. package/dist/client/PreviewFrame.svelte.d.ts +10 -0
  23. package/dist/client/Sidebar.svelte +329 -0
  24. package/dist/client/Sidebar.svelte.d.ts +16 -0
  25. package/dist/client/controls/CheckboxControl.svelte +37 -0
  26. package/dist/client/controls/CheckboxControl.svelte.d.ts +8 -0
  27. package/dist/client/controls/ColorControl.svelte +47 -0
  28. package/dist/client/controls/ColorControl.svelte.d.ts +8 -0
  29. package/dist/client/controls/DimensionControl.svelte +56 -0
  30. package/dist/client/controls/DimensionControl.svelte.d.ts +8 -0
  31. package/dist/client/controls/NumberControl.svelte +44 -0
  32. package/dist/client/controls/NumberControl.svelte.d.ts +8 -0
  33. package/dist/client/controls/SelectControl.svelte +48 -0
  34. package/dist/client/controls/SelectControl.svelte.d.ts +9 -0
  35. package/dist/client/controls/TextControl.svelte +43 -0
  36. package/dist/client/controls/TextControl.svelte.d.ts +8 -0
  37. package/dist/client/router.svelte.d.ts +11 -0
  38. package/dist/client/router.svelte.js +45 -0
  39. package/dist/client/theme.css +34 -0
  40. package/dist/client/tree-builder.d.ts +30 -0
  41. package/dist/client/tree-builder.js +162 -0
  42. package/dist/commands/build.d.ts +1 -0
  43. package/dist/commands/build.js +38 -0
  44. package/dist/commands/dev.d.ts +1 -0
  45. package/dist/commands/dev.js +40 -0
  46. package/dist/commands/init.d.ts +1 -0
  47. package/dist/commands/init.js +41 -0
  48. package/dist/commands/preview.d.ts +1 -0
  49. package/dist/commands/preview.js +25 -0
  50. package/dist/config.d.ts +7 -0
  51. package/dist/config.js +57 -0
  52. package/dist/index.d.ts +2 -2
  53. package/dist/index.js +1 -4
  54. package/dist/server/discovery.d.ts +6 -0
  55. package/dist/server/discovery.js +24 -0
  56. package/dist/server/highlighter.d.ts +4 -0
  57. package/dist/server/highlighter.js +31 -0
  58. package/dist/server/meta-parser.d.ts +11 -0
  59. package/dist/server/meta-parser.js +107 -0
  60. package/dist/server/prop-parser.d.ts +5 -0
  61. package/dist/server/prop-parser.js +275 -0
  62. package/dist/server/sdocx-parser.d.ts +11 -0
  63. package/dist/server/sdocx-parser.js +197 -0
  64. package/dist/server/snippet-compiler.d.ts +27 -0
  65. package/dist/server/snippet-compiler.js +145 -0
  66. package/dist/server/snippet-extractor.d.ts +11 -0
  67. package/dist/server/snippet-extractor.js +37 -0
  68. package/dist/server/toc-extractor.d.ts +5 -0
  69. package/dist/server/toc-extractor.js +37 -0
  70. package/dist/types.d.ts +100 -148
  71. package/dist/vite.d.ts +5 -2
  72. package/dist/vite.js +266 -2
  73. package/package.json +50 -74
  74. package/README.md +0 -43
  75. package/dist/Sdocs.svelte +0 -1210
  76. package/dist/Sdocs.svelte.d.ts +0 -5
  77. package/dist/cli/app-plugin.d.ts +0 -7
  78. package/dist/cli/app-plugin.js +0 -69
  79. package/dist/cli/config.d.ts +0 -12
  80. package/dist/cli/config.js +0 -34
  81. package/dist/cli/index.js +0 -72
  82. package/dist/cli/server.d.ts +0 -2
  83. package/dist/cli/server.js +0 -64
  84. package/dist/docgen.d.ts +0 -47
  85. package/dist/docgen.js +0 -463
  86. package/dist/internal/ComponentPreview.svelte +0 -58
  87. package/dist/internal/ComponentPreview.svelte.d.ts +0 -17
  88. package/dist/internal/CssPropsTable.svelte +0 -239
  89. package/dist/internal/CssPropsTable.svelte.d.ts +0 -11
  90. package/dist/internal/Home.svelte +0 -92
  91. package/dist/internal/Home.svelte.d.ts +0 -9
  92. package/dist/internal/MethodsTable.svelte +0 -72
  93. package/dist/internal/MethodsTable.svelte.d.ts +0 -7
  94. package/dist/internal/PropsTable.svelte +0 -342
  95. package/dist/internal/PropsTable.svelte.d.ts +0 -12
  96. package/dist/internal/Showcase.svelte +0 -130
  97. package/dist/internal/Showcase.svelte.d.ts +0 -21
  98. package/dist/ui/Badge/Badge.docs.svelte +0 -46
  99. package/dist/ui/Badge/Badge.docs.svelte.d.ts +0 -26
  100. package/dist/ui/Badge/Badge.svelte +0 -59
  101. package/dist/ui/Badge/Badge.svelte.d.ts +0 -17
  102. package/dist/ui/Badge/index.d.ts +0 -1
  103. package/dist/ui/Badge/index.js +0 -1
  104. package/dist/ui/Checkbox/Checkbox.docs.svelte +0 -51
  105. package/dist/ui/Checkbox/Checkbox.docs.svelte.d.ts +0 -27
  106. package/dist/ui/Checkbox/Checkbox.svelte +0 -169
  107. package/dist/ui/Checkbox/Checkbox.svelte.d.ts +0 -18
  108. package/dist/ui/Checkbox/index.d.ts +0 -1
  109. package/dist/ui/Checkbox/index.js +0 -1
  110. package/dist/ui/CodeBlock/CodeBlock.docs.svelte +0 -28
  111. package/dist/ui/CodeBlock/CodeBlock.docs.svelte.d.ts +0 -24
  112. package/dist/ui/CodeBlock/CodeBlock.svelte +0 -101
  113. package/dist/ui/CodeBlock/CodeBlock.svelte.d.ts +0 -7
  114. package/dist/ui/CodeBlock/index.d.ts +0 -1
  115. package/dist/ui/CodeBlock/index.js +0 -1
  116. package/dist/ui/Frame/Frame.docs.svelte +0 -140
  117. package/dist/ui/Frame/Frame.docs.svelte.d.ts +0 -26
  118. package/dist/ui/Frame/Frame.svelte +0 -88
  119. package/dist/ui/Frame/Frame.svelte.d.ts +0 -15
  120. package/dist/ui/Frame/index.d.ts +0 -1
  121. package/dist/ui/Frame/index.js +0 -1
  122. package/dist/ui/InputNumber/InputNumber.docs.svelte +0 -50
  123. package/dist/ui/InputNumber/InputNumber.docs.svelte.d.ts +0 -26
  124. package/dist/ui/InputNumber/InputNumber.svelte +0 -275
  125. package/dist/ui/InputNumber/InputNumber.svelte.d.ts +0 -26
  126. package/dist/ui/InputNumber/index.d.ts +0 -1
  127. package/dist/ui/InputNumber/index.js +0 -1
  128. package/dist/ui/InputText/InputText.docs.svelte +0 -43
  129. package/dist/ui/InputText/InputText.docs.svelte.d.ts +0 -26
  130. package/dist/ui/InputText/InputText.svelte +0 -116
  131. package/dist/ui/InputText/InputText.svelte.d.ts +0 -22
  132. package/dist/ui/InputText/index.d.ts +0 -1
  133. package/dist/ui/InputText/index.js +0 -1
  134. package/dist/ui/Panel/CollapsiblePanel.docs.svelte +0 -45
  135. package/dist/ui/Panel/CollapsiblePanel.docs.svelte.d.ts +0 -25
  136. package/dist/ui/Panel/CollapsiblePanel.svelte +0 -93
  137. package/dist/ui/Panel/CollapsiblePanel.svelte.d.ts +0 -14
  138. package/dist/ui/Panel/index.d.ts +0 -1
  139. package/dist/ui/Panel/index.js +0 -1
  140. package/dist/ui/Placeholder/Placeholder.docs.svelte +0 -49
  141. package/dist/ui/Placeholder/Placeholder.docs.svelte.d.ts +0 -26
  142. package/dist/ui/Placeholder/Placeholder.svelte +0 -99
  143. package/dist/ui/Placeholder/Placeholder.svelte.d.ts +0 -21
  144. package/dist/ui/Placeholder/index.d.ts +0 -1
  145. package/dist/ui/Placeholder/index.js +0 -1
  146. package/dist/ui/Radio/Radio.docs.svelte +0 -67
  147. package/dist/ui/Radio/Radio.docs.svelte.d.ts +0 -27
  148. package/dist/ui/Radio/Radio.svelte +0 -165
  149. package/dist/ui/Radio/Radio.svelte.d.ts +0 -22
  150. package/dist/ui/Radio/RadioGroup.docs.svelte +0 -70
  151. package/dist/ui/Radio/RadioGroup.docs.svelte.d.ts +0 -27
  152. package/dist/ui/Radio/RadioGroup.svelte +0 -98
  153. package/dist/ui/Radio/RadioGroup.svelte.d.ts +0 -27
  154. package/dist/ui/Radio/index.d.ts +0 -2
  155. package/dist/ui/Radio/index.js +0 -2
  156. package/dist/ui/SegmentControl/SegmentControl.docs.svelte +0 -54
  157. package/dist/ui/SegmentControl/SegmentControl.docs.svelte.d.ts +0 -25
  158. package/dist/ui/SegmentControl/SegmentControl.svelte +0 -120
  159. package/dist/ui/SegmentControl/SegmentControl.svelte.d.ts +0 -18
  160. package/dist/ui/SegmentControl/index.d.ts +0 -1
  161. package/dist/ui/SegmentControl/index.js +0 -1
  162. package/dist/ui/Stack/Stack.docs.svelte +0 -63
  163. package/dist/ui/Stack/Stack.docs.svelte.d.ts +0 -26
  164. package/dist/ui/Stack/Stack.svelte +0 -45
  165. package/dist/ui/Stack/Stack.svelte.d.ts +0 -19
  166. package/dist/ui/Stack/index.d.ts +0 -1
  167. package/dist/ui/Stack/index.js +0 -1
  168. package/dist/ui/Table/Body.svelte +0 -17
  169. package/dist/ui/Table/Body.svelte.d.ts +0 -11
  170. package/dist/ui/Table/Caption.svelte +0 -17
  171. package/dist/ui/Table/Caption.svelte.d.ts +0 -11
  172. package/dist/ui/Table/Cell.svelte +0 -24
  173. package/dist/ui/Table/Cell.svelte.d.ts +0 -15
  174. package/dist/ui/Table/Foot.svelte +0 -17
  175. package/dist/ui/Table/Foot.svelte.d.ts +0 -11
  176. package/dist/ui/Table/Head.svelte +0 -17
  177. package/dist/ui/Table/Head.svelte.d.ts +0 -11
  178. package/dist/ui/Table/Header.svelte +0 -27
  179. package/dist/ui/Table/Header.svelte.d.ts +0 -17
  180. package/dist/ui/Table/Row.svelte +0 -19
  181. package/dist/ui/Table/Row.svelte.d.ts +0 -13
  182. package/dist/ui/Table/Table.docs.svelte +0 -197
  183. package/dist/ui/Table/Table.docs.svelte.d.ts +0 -28
  184. package/dist/ui/Table/Table.svelte +0 -140
  185. package/dist/ui/Table/Table.svelte.d.ts +0 -27
  186. package/dist/ui/Table/index.js +0 -10
  187. package/dist/ui/css/colors.css +0 -377
  188. package/dist/ui/css/global.css +0 -10
  189. package/dist/ui/index.d.ts +0 -12
  190. package/dist/ui/index.js +0 -12
  191. package/dist/virtual-sdocs.d.ts +0 -20
  192. package/dist/vite-plugin.d.ts +0 -18
  193. package/dist/vite-plugin.js +0 -206
  194. /package/dist/{cli/index.d.ts → cli.d.ts} +0 -0
@@ -0,0 +1,145 @@
1
+ import { dirname, resolve } from 'node:path';
2
+ /** Base64url encode a string (URL-safe, no padding) */
3
+ export function base64urlEncode(str) {
4
+ return Buffer.from(str).toString('base64url');
5
+ }
6
+ /** Base64url decode */
7
+ export function base64urlDecode(str) {
8
+ return Buffer.from(str, 'base64url').toString('utf-8');
9
+ }
10
+ /** Resolve relative imports to absolute paths for use in virtual components */
11
+ export function resolveImportsToAbsolute(imports, docFilePath) {
12
+ const docDir = dirname(docFilePath);
13
+ return imports.map((imp) => {
14
+ const match = imp.match(/^(import\s+.+\s+from\s+)['"](\.[^'"]+)['"](;?)$/);
15
+ if (match) {
16
+ const absolutePath = resolve(docDir, match[2]);
17
+ return `${match[1]}'${absolutePath}'${match[3]}`;
18
+ }
19
+ return imp;
20
+ });
21
+ }
22
+ /** Generate a virtual Svelte iframe wrapper component for a snippet.
23
+ * Includes $state for reactive prop updates via postMessage. */
24
+ export function generateIframeComponent(absoluteImports, snippetBody) {
25
+ const importBlock = absoluteImports.length > 0
26
+ ? absoluteImports.join('\n') + '\n'
27
+ : '';
28
+ return `<script>
29
+ ${importBlock}import { onMount } from 'svelte';
30
+
31
+ let args = $state({});
32
+
33
+ onMount(() => {
34
+ window.addEventListener('message', (e) => {
35
+ if (e.data?.type === 'sdocs:update-props') {
36
+ args = { ...e.data.props };
37
+ }
38
+ if (e.data?.type === 'sdocs:update-css') {
39
+ const el = document.getElementById('sdocs-preview');
40
+ if (el) {
41
+ for (const [key, value] of Object.entries(e.data.vars)) {
42
+ el.style.setProperty(key, String(value));
43
+ }
44
+ }
45
+ }
46
+ });
47
+
48
+ // Assign IDs to headings for ToC scroll-to
49
+ const preview = document.getElementById('sdocs-preview');
50
+ if (preview) {
51
+ preview.querySelectorAll('h1,h2,h3,h4,h5,h6').forEach((h) => {
52
+ if (!h.id) {
53
+ h.id = h.textContent.toLowerCase().replace(/[^a-z0-9\\s-]/g, '').replace(/\\s+/g, '-').replace(/-+/g, '-').trim();
54
+ }
55
+ });
56
+ }
57
+
58
+ window.parent.postMessage({ type: 'sdocs:preview-ready' }, '*');
59
+ });
60
+ </script>
61
+
62
+ <div id="sdocs-preview">
63
+ ${snippetBody}
64
+ </div>`;
65
+ }
66
+ /** Generate CSS link tags for the preview HTML */
67
+ function generateCssLinks(css) {
68
+ if (!css)
69
+ return '';
70
+ if (typeof css === 'string') {
71
+ return `<link rel="stylesheet" href="${css}">`;
72
+ }
73
+ // Named stylesheets: first one active, rest disabled
74
+ const names = Object.keys(css);
75
+ return names
76
+ .map((name, i) => `<link rel="stylesheet" href="${css[name]}" data-sdocs-stylesheet="${name}"${i > 0 ? ' disabled' : ''}>`)
77
+ .join('\n\t');
78
+ }
79
+ /** Generate the HTML page served inside the iframe */
80
+ export function generatePreviewHtml(iframeComponentId, css) {
81
+ const cssLinks = generateCssLinks(css);
82
+ return `<!DOCTYPE html>
83
+ <html>
84
+ <head>
85
+ <meta charset="utf-8">
86
+ <meta name="viewport" content="width=device-width, initial-scale=1">
87
+ ${cssLinks}
88
+ <style>body { margin: 0; }</style>
89
+ </head>
90
+ <body>
91
+ <div id="app"></div>
92
+ <script type="module">
93
+ import { mount } from 'svelte';
94
+ import App from '${iframeComponentId}';
95
+ mount(App, { target: document.getElementById('app') });
96
+
97
+ // Listen for sdocs messages from the parent frame
98
+ window.addEventListener('message', (e) => {
99
+ if (e.data?.type === 'sdocs:update-stylesheet') {
100
+ const name = e.data.name;
101
+ document.querySelectorAll('link[data-sdocs-stylesheet]').forEach((link) => {
102
+ link.disabled = link.dataset.sdocsStylesheet !== name;
103
+ });
104
+ }
105
+ if (e.data?.type === 'sdocs:scroll-to') {
106
+ const el = document.getElementById(e.data.id);
107
+ if (el) el.scrollIntoView({ behavior: 'smooth' });
108
+ }
109
+ });
110
+ </script>
111
+ </body>
112
+ </html>`;
113
+ }
114
+ /** Build the virtual module ID for an iframe wrapper component */
115
+ export function iframeVirtualId(docFilePath, snippetName) {
116
+ return `/@sdocs/iframe/${base64urlEncode(docFilePath)}/${snippetName}.svelte`;
117
+ }
118
+ /** Build the preview URL for an iframe HTML page (dev mode) */
119
+ export function previewUrl(docFilePath, snippetName) {
120
+ return `/@sdocs/preview/${base64urlEncode(docFilePath)}/${snippetName}`;
121
+ }
122
+ /** Build the preview URL for static build output */
123
+ export function buildPreviewUrl(docFilePath, snippetName) {
124
+ return `/previews/${base64urlEncode(docFilePath)}/${snippetName}.html`;
125
+ }
126
+ /** Parse an iframe virtual ID back into its parts */
127
+ export function parseIframeId(id) {
128
+ const match = id.match(/^\/@sdocs\/iframe\/([^/]+)\/(\w+)\.svelte$/);
129
+ if (!match)
130
+ return null;
131
+ return {
132
+ docFilePath: base64urlDecode(match[1]),
133
+ snippetName: match[2],
134
+ };
135
+ }
136
+ /** Parse a preview URL back into its parts */
137
+ export function parsePreviewUrl(url) {
138
+ const match = url.match(/^\/@sdocs\/preview\/([^/]+)\/(\w+)$/);
139
+ if (!match)
140
+ return null;
141
+ return {
142
+ docFilePath: base64urlDecode(match[1]),
143
+ snippetName: match[2],
144
+ };
145
+ }
@@ -0,0 +1,11 @@
1
+ import type { ExtractedSnippet } from '../types.js';
2
+ /** Extract {#snippet} blocks from .sdoc source */
3
+ export declare function extractSnippets(source: string): ExtractedSnippet[];
4
+ /** Check if a Default snippet exists or needs auto-generation */
5
+ export declare function hasDefaultSnippet(snippets: ExtractedSnippet[]): boolean;
6
+ /** Generate an auto-generated Default snippet body */
7
+ export declare function generateAutoDefault(componentName: string): string;
8
+ /** Extract the markup body of a .sdoc file (everything outside <script> and <style>) */
9
+ export declare function extractMarkupBody(source: string): string;
10
+ /** Get the snippet names in order (Default first, then alphabetical) */
11
+ export declare function getSnippetOrder(snippets: ExtractedSnippet[]): string[];
@@ -0,0 +1,37 @@
1
+ /** Extract {#snippet} blocks from .sdoc source */
2
+ export function extractSnippets(source) {
3
+ const snippets = [];
4
+ const regex = /\{#snippet\s+(\w+)\s*\(([^)]*)\)\}([\s\S]*?)\{\/snippet\}/g;
5
+ let match;
6
+ while ((match = regex.exec(source)) !== null) {
7
+ const name = match[1];
8
+ const body = match[3].trim();
9
+ snippets.push({ name, body });
10
+ }
11
+ return snippets;
12
+ }
13
+ /** Check if a Default snippet exists or needs auto-generation */
14
+ export function hasDefaultSnippet(snippets) {
15
+ return snippets.some((s) => s.name === 'Default');
16
+ }
17
+ /** Generate an auto-generated Default snippet body */
18
+ export function generateAutoDefault(componentName) {
19
+ return `<${componentName} {...args} />`;
20
+ }
21
+ /** Extract the markup body of a .sdoc file (everything outside <script> and <style>) */
22
+ export function extractMarkupBody(source) {
23
+ return source
24
+ .replace(/<script[^>]*>[\s\S]*?<\/script>/g, '')
25
+ .replace(/<style[^>]*>[\s\S]*?<\/style>/g, '')
26
+ .trim();
27
+ }
28
+ /** Get the snippet names in order (Default first, then alphabetical) */
29
+ export function getSnippetOrder(snippets) {
30
+ const names = snippets.map((s) => s.name);
31
+ const defaultIndex = names.indexOf('Default');
32
+ if (defaultIndex > 0) {
33
+ names.splice(defaultIndex, 1);
34
+ names.unshift('Default');
35
+ }
36
+ return names;
37
+ }
@@ -0,0 +1,5 @@
1
+ import type { TocHeading } from '../types.js';
2
+ /** Extract ToC headings from HTML markup (for .sdoc pages) */
3
+ export declare function extractTocFromHtml(body: string): TocHeading[];
4
+ /** Extract ToC headings from markdown (for .sdocx pages) */
5
+ export declare function extractTocFromMarkdown(body: string): TocHeading[];
@@ -0,0 +1,37 @@
1
+ /** Slugify a heading text into an ID */
2
+ function slugify(text) {
3
+ return text
4
+ .toLowerCase()
5
+ .replace(/[^\w\s-]/g, '')
6
+ .replace(/\s+/g, '-')
7
+ .replace(/-+/g, '-')
8
+ .trim();
9
+ }
10
+ /** Extract ToC headings from HTML markup (for .sdoc pages) */
11
+ export function extractTocFromHtml(body) {
12
+ const headings = [];
13
+ const regex = /<h([2-4])[^>]*>([\s\S]*?)<\/h[2-4]>/gi;
14
+ let match;
15
+ while ((match = regex.exec(body)) !== null) {
16
+ const level = parseInt(match[1]);
17
+ const text = match[2].replace(/<[^>]*>/g, '').trim();
18
+ if (text) {
19
+ headings.push({ text, level, id: slugify(text) });
20
+ }
21
+ }
22
+ return headings;
23
+ }
24
+ /** Extract ToC headings from markdown (for .sdocx pages) */
25
+ export function extractTocFromMarkdown(body) {
26
+ const headings = [];
27
+ const regex = /^(#{2,4})\s+(.+)$/gm;
28
+ let match;
29
+ while ((match = regex.exec(body)) !== null) {
30
+ const level = match[1].length;
31
+ const text = match[2].trim();
32
+ if (text) {
33
+ headings.push({ text, level, id: slugify(text) });
34
+ }
35
+ }
36
+ return headings;
37
+ }
package/dist/types.d.ts CHANGED
@@ -1,162 +1,114 @@
1
- import type { Component, Snippet } from 'svelte';
2
- /**
3
- * Control types for the props panel
4
- */
5
- export type ControlType = 'text' | 'number' | 'boolean' | 'select' | 'radio' | 'color' | 'range';
6
- /**
7
- * Control configuration for a single arg
8
- */
9
- export interface ArgType {
10
- /** Control type or false to disable control (prop still shows in table) */
11
- control: ControlType | {
12
- type: ControlType;
13
- options?: string[];
14
- min?: number;
15
- max?: number;
16
- step?: number;
17
- } | false;
18
- /** Description of the prop */
19
- description?: string;
20
- /** Type information for the props table */
21
- type?: {
22
- name: string;
23
- summary?: string;
1
+ /** sdocs config file schema */
2
+ export interface SdocsConfig {
3
+ /** Glob pattern(s) to find sdoc files. Default: ['./src/**\/*.sdoc', './src/**\/*.sdocx'] */
4
+ include?: string | string[];
5
+ /** Dev server port. Default: 5174 */
6
+ port?: number;
7
+ /** Open browser on start. Default: false */
8
+ open?: boolean;
9
+ /** CSS loaded in preview iframes. Single path or named stylesheets. */
10
+ css?: string | Record<string, string>;
11
+ /** Sidebar logo text. Default: 'sdocs' */
12
+ logo?: string;
13
+ /** Sidebar configuration */
14
+ sidebar?: {
15
+ /** Per-folder sort overrides. Keys are folder paths, 'root' for top level. '*' = unlisted items. */
16
+ order?: Record<string, string[]>;
17
+ /** Folders expanded by default on load. */
18
+ open?: string[];
19
+ };
20
+ }
21
+ /** Resolved config with all defaults applied */
22
+ export interface ResolvedSdocsConfig {
23
+ include: string[];
24
+ port: number;
25
+ open: boolean;
26
+ css: string | Record<string, string> | null;
27
+ logo: string;
28
+ sidebar: {
29
+ order: Record<string, string[]>;
30
+ open: string[];
24
31
  };
25
- /** Whether this prop is required */
26
- required?: boolean;
27
- /** Default value for display in props table */
28
- defaultValue?: unknown;
29
32
  }
30
- /**
31
- * Map of prop names to their ArgType configuration
32
- */
33
- export type ArgTypes = Record<string, ArgType>;
34
- /**
35
- * Control types for CSS custom properties
36
- */
37
- export type CssControlType = 'color' | 'text' | 'length' | 'number' | 'select';
38
- /**
39
- * Configuration for a CSS custom property
40
- */
41
- export interface CssPropType {
42
- /** Description of the CSS prop */
33
+ /** Meta extracted from a .sdoc file */
34
+ export interface SdocMeta {
35
+ /** The Svelte component being documented */
36
+ component?: unknown;
37
+ /** Sidebar path (e.g. 'Demo / Button') */
38
+ title: string;
39
+ /** Short description */
43
40
  description?: string;
44
- /** Default value */
45
- default?: string;
46
- /** Control type or config. Use false to disable control. */
47
- control?: CssControlType | {
48
- type: CssControlType;
49
- options?: string[];
50
- } | false;
41
+ /** Default prop values */
42
+ args?: Record<string, unknown>;
43
+ /** Preview settings (padding, background, etc.) */
44
+ settings?: Record<string, unknown>;
51
45
  }
52
- /**
53
- * Map of CSS prop names to their configuration
54
- */
55
- export type CssProps = Record<string, CssPropType>;
56
- /**
57
- * Exported component method
58
- */
59
- export interface MethodType {
46
+ /** A parsed prop */
47
+ export interface ParsedProp {
60
48
  name: string;
61
- params?: string;
62
- returnType?: string;
63
- description?: string;
49
+ type: string | null;
50
+ default: string | null;
51
+ description: string | null;
52
+ required: boolean;
53
+ category: 'prop' | 'event' | 'snippet';
64
54
  }
65
- /**
66
- * Metadata exported from a .docs.svelte or .docs.svx file
67
- */
68
- export interface DocMeta {
69
- title?: string;
70
- /** Component description (extracted from JSDoc) */
71
- description?: string;
72
- /** Component to document (if this is a component doc) */
73
- component?: Component<any>;
74
- /** Initial values for props (only for props that exist in the component) */
75
- args?: Record<string, unknown>;
55
+ /** An exported function */
56
+ export interface ParsedMethod {
57
+ name: string;
58
+ params: string;
59
+ returnType: string | null;
60
+ description: string | null;
76
61
  }
77
- /**
78
- * Parsed metadata with auto-generated fields (internal use)
79
- */
80
- export interface ParsedDocMeta extends DocMeta {
81
- /** Auto-generated from component props */
82
- args?: Record<string, unknown>;
83
- /** Auto-generated from component interface Props */
84
- argTypes?: Record<string, ArgType>;
85
- /** Auto-generated from @cssvar JSDoc tags */
86
- cssProps?: CssProps;
87
- /** Auto-generated from exported functions */
88
- methods?: MethodType[];
62
+ /** An exported state value */
63
+ export interface ParsedState {
64
+ name: string;
65
+ type: string | null;
66
+ description: string | null;
89
67
  }
90
- /**
91
- * A single example extracted from a doc file
92
- */
93
- export interface Example {
68
+ /** A CSS custom property */
69
+ export interface ParsedCssProp {
94
70
  name: string;
95
- render: Snippet<[args: Record<string, unknown>]> | Snippet<[]>;
96
- /** Source code of the snippet (extracted by vite plugin) */
97
- source?: string;
71
+ type: string | null;
72
+ default: string | null;
73
+ description: string | null;
98
74
  }
99
- /**
100
- * Parsed doc file with metadata and examples
101
- */
102
- export interface DocFile {
103
- path: string;
104
- meta: ParsedDocMeta;
105
- examples: Example[];
106
- module: Record<string, unknown>;
107
- /** Type of doc: 'component' has a component in meta, 'page' is standalone documentation */
108
- type: 'component' | 'page';
109
- /** Whether this file is a markdown (.svx) file */
110
- isMarkdown?: boolean;
75
+ /** All parsed data from a component */
76
+ export interface ComponentData {
77
+ props: ParsedProp[];
78
+ methods: ParsedMethod[];
79
+ state: ParsedState[];
80
+ cssProps: ParsedCssProp[];
111
81
  }
112
- /**
113
- * Sidebar configuration options
114
- */
115
- export interface SidebarOptions {
116
- /**
117
- * Custom order for sidebar items. Use '*' for "everything else" (alphabetically).
118
- *
119
- * Can be an array for top-level ordering, or an object for nested folder ordering.
120
- * Use path keys (e.g., 'Components/Forms') for deep nesting.
121
- * @example
122
- * // Top-level only
123
- * order: ['Specs', 'Components', '*']
124
- *
125
- * // With nested folder ordering
126
- * order: {
127
- * root: ['Specs', '*'],
128
- * Specs: ['Sidebar', 'Doc Files', '*'],
129
- * 'Components/Forms': ['Input', 'Select', '*']
130
- * }
131
- */
132
- order?: string[] | Record<string, string[]>;
133
- /**
134
- * Paths to expand by default in the sidebar.
135
- * @example
136
- * open: ['Layout', 'Layout/Frame', 'Components']
137
- */
138
- open?: string[];
82
+ /** An extracted snippet */
83
+ export interface ExtractedSnippet {
84
+ name: string;
85
+ body: string;
86
+ highlightedHtml?: string;
87
+ /** Preview URL for iframe (added by virtual module) */
88
+ previewUrl?: string;
139
89
  }
140
- /**
141
- * Sdocs configuration options
142
- */
143
- export interface SdocsOptions {
144
- /** Sidebar configuration */
145
- sidebar?: SidebarOptions;
90
+ /** A table of contents heading (for pages) */
91
+ export interface TocHeading {
92
+ text: string;
93
+ level: number;
94
+ id: string;
146
95
  }
147
- /**
148
- * Props for the main Sdocs component
149
- */
150
- export interface SdocsProps {
151
- /**
152
- * Configuration options for Sdocs.
153
- * @example
154
- * options: {
155
- * sidebar: {
156
- * order: { root: ['Layout', '*'] },
157
- * open: ['Layout']
158
- * }
159
- * }
160
- */
161
- options?: SdocsOptions;
96
+ /** A complete doc entry (one .sdoc/.sdocx file) */
97
+ export interface DocEntry {
98
+ /** Doc kind */
99
+ kind: 'component' | 'page' | 'layout';
100
+ /** Absolute path to the .sdoc file */
101
+ filePath: string;
102
+ /** Absolute path to the documented component */
103
+ componentPath: string | null;
104
+ /** Parsed meta */
105
+ meta: SdocMeta;
106
+ /** Parsed component data (props, methods, state, CSS props) */
107
+ componentData: ComponentData | null;
108
+ /** Extracted snippets */
109
+ snippets: ExtractedSnippet[];
110
+ /** Highlighted component source HTML */
111
+ highlightedSource: string | null;
112
+ /** Table of contents headings (pages only) */
113
+ toc?: TocHeading[];
162
114
  }
package/dist/vite.d.ts CHANGED
@@ -1,2 +1,5 @@
1
- export { sdocsPlugin, default } from './vite-plugin.js';
2
- export type { ComponentDocgen, SdocsPluginOptions } from './vite-plugin.js';
1
+ import type { Plugin } from 'vite';
2
+ import type { SdocsConfig } from './types.js';
3
+ export declare function sdocsPlugin(userConfig?: SdocsConfig & {
4
+ _buildMode?: boolean;
5
+ }): Plugin;