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.
- package/bin/sdocs.js +1 -1
- package/dist/app-gen.d.ts +10 -0
- package/dist/app-gen.js +147 -0
- package/dist/cli.js +71 -0
- package/dist/client/App.svelte +151 -0
- package/dist/client/App.svelte.d.ts +14 -0
- package/dist/client/CollapsiblePanel.svelte +63 -0
- package/dist/client/CollapsiblePanel.svelte.d.ts +9 -0
- package/dist/client/ComponentView.svelte +321 -0
- package/dist/client/ComponentView.svelte.d.ts +10 -0
- package/dist/client/ControlsPanel.svelte +191 -0
- package/dist/client/ControlsPanel.svelte.d.ts +13 -0
- package/dist/client/DataTable.svelte +78 -0
- package/dist/client/DataTable.svelte.d.ts +11 -0
- package/dist/client/HomePage.svelte +92 -0
- package/dist/client/HomePage.svelte.d.ts +8 -0
- package/dist/client/LayoutView.svelte +27 -0
- package/dist/client/LayoutView.svelte.d.ts +8 -0
- package/dist/client/PageView.svelte +130 -0
- package/dist/client/PageView.svelte.d.ts +8 -0
- package/dist/client/PreviewFrame.svelte +100 -0
- package/dist/client/PreviewFrame.svelte.d.ts +10 -0
- package/dist/client/Sidebar.svelte +329 -0
- package/dist/client/Sidebar.svelte.d.ts +16 -0
- package/dist/client/controls/CheckboxControl.svelte +37 -0
- package/dist/client/controls/CheckboxControl.svelte.d.ts +8 -0
- package/dist/client/controls/ColorControl.svelte +47 -0
- package/dist/client/controls/ColorControl.svelte.d.ts +8 -0
- package/dist/client/controls/DimensionControl.svelte +56 -0
- package/dist/client/controls/DimensionControl.svelte.d.ts +8 -0
- package/dist/client/controls/NumberControl.svelte +44 -0
- package/dist/client/controls/NumberControl.svelte.d.ts +8 -0
- package/dist/client/controls/SelectControl.svelte +48 -0
- package/dist/client/controls/SelectControl.svelte.d.ts +9 -0
- package/dist/client/controls/TextControl.svelte +43 -0
- package/dist/client/controls/TextControl.svelte.d.ts +8 -0
- package/dist/client/router.svelte.d.ts +11 -0
- package/dist/client/router.svelte.js +45 -0
- package/dist/client/theme.css +34 -0
- package/dist/client/tree-builder.d.ts +30 -0
- package/dist/client/tree-builder.js +162 -0
- package/dist/commands/build.d.ts +1 -0
- package/dist/commands/build.js +38 -0
- package/dist/commands/dev.d.ts +1 -0
- package/dist/commands/dev.js +40 -0
- package/dist/commands/init.d.ts +1 -0
- package/dist/commands/init.js +41 -0
- package/dist/commands/preview.d.ts +1 -0
- package/dist/commands/preview.js +25 -0
- package/dist/config.d.ts +7 -0
- package/dist/config.js +57 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -4
- package/dist/server/discovery.d.ts +6 -0
- package/dist/server/discovery.js +24 -0
- package/dist/server/highlighter.d.ts +4 -0
- package/dist/server/highlighter.js +31 -0
- package/dist/server/meta-parser.d.ts +11 -0
- package/dist/server/meta-parser.js +107 -0
- package/dist/server/prop-parser.d.ts +5 -0
- package/dist/server/prop-parser.js +275 -0
- package/dist/server/sdocx-parser.d.ts +11 -0
- package/dist/server/sdocx-parser.js +197 -0
- package/dist/server/snippet-compiler.d.ts +27 -0
- package/dist/server/snippet-compiler.js +145 -0
- package/dist/server/snippet-extractor.d.ts +11 -0
- package/dist/server/snippet-extractor.js +37 -0
- package/dist/server/toc-extractor.d.ts +5 -0
- package/dist/server/toc-extractor.js +37 -0
- package/dist/types.d.ts +100 -148
- package/dist/vite.d.ts +5 -2
- package/dist/vite.js +266 -2
- package/package.json +50 -74
- package/README.md +0 -43
- package/dist/Sdocs.svelte +0 -1210
- package/dist/Sdocs.svelte.d.ts +0 -5
- package/dist/cli/app-plugin.d.ts +0 -7
- package/dist/cli/app-plugin.js +0 -69
- package/dist/cli/config.d.ts +0 -12
- package/dist/cli/config.js +0 -34
- package/dist/cli/index.js +0 -72
- package/dist/cli/server.d.ts +0 -2
- package/dist/cli/server.js +0 -64
- package/dist/docgen.d.ts +0 -47
- package/dist/docgen.js +0 -463
- package/dist/internal/ComponentPreview.svelte +0 -58
- package/dist/internal/ComponentPreview.svelte.d.ts +0 -17
- package/dist/internal/CssPropsTable.svelte +0 -239
- package/dist/internal/CssPropsTable.svelte.d.ts +0 -11
- package/dist/internal/Home.svelte +0 -92
- package/dist/internal/Home.svelte.d.ts +0 -9
- package/dist/internal/MethodsTable.svelte +0 -72
- package/dist/internal/MethodsTable.svelte.d.ts +0 -7
- package/dist/internal/PropsTable.svelte +0 -342
- package/dist/internal/PropsTable.svelte.d.ts +0 -12
- package/dist/internal/Showcase.svelte +0 -130
- package/dist/internal/Showcase.svelte.d.ts +0 -21
- package/dist/ui/Badge/Badge.docs.svelte +0 -46
- package/dist/ui/Badge/Badge.docs.svelte.d.ts +0 -26
- package/dist/ui/Badge/Badge.svelte +0 -59
- package/dist/ui/Badge/Badge.svelte.d.ts +0 -17
- package/dist/ui/Badge/index.d.ts +0 -1
- package/dist/ui/Badge/index.js +0 -1
- package/dist/ui/Checkbox/Checkbox.docs.svelte +0 -51
- package/dist/ui/Checkbox/Checkbox.docs.svelte.d.ts +0 -27
- package/dist/ui/Checkbox/Checkbox.svelte +0 -169
- package/dist/ui/Checkbox/Checkbox.svelte.d.ts +0 -18
- package/dist/ui/Checkbox/index.d.ts +0 -1
- package/dist/ui/Checkbox/index.js +0 -1
- package/dist/ui/CodeBlock/CodeBlock.docs.svelte +0 -28
- package/dist/ui/CodeBlock/CodeBlock.docs.svelte.d.ts +0 -24
- package/dist/ui/CodeBlock/CodeBlock.svelte +0 -101
- package/dist/ui/CodeBlock/CodeBlock.svelte.d.ts +0 -7
- package/dist/ui/CodeBlock/index.d.ts +0 -1
- package/dist/ui/CodeBlock/index.js +0 -1
- package/dist/ui/Frame/Frame.docs.svelte +0 -140
- package/dist/ui/Frame/Frame.docs.svelte.d.ts +0 -26
- package/dist/ui/Frame/Frame.svelte +0 -88
- package/dist/ui/Frame/Frame.svelte.d.ts +0 -15
- package/dist/ui/Frame/index.d.ts +0 -1
- package/dist/ui/Frame/index.js +0 -1
- package/dist/ui/InputNumber/InputNumber.docs.svelte +0 -50
- package/dist/ui/InputNumber/InputNumber.docs.svelte.d.ts +0 -26
- package/dist/ui/InputNumber/InputNumber.svelte +0 -275
- package/dist/ui/InputNumber/InputNumber.svelte.d.ts +0 -26
- package/dist/ui/InputNumber/index.d.ts +0 -1
- package/dist/ui/InputNumber/index.js +0 -1
- package/dist/ui/InputText/InputText.docs.svelte +0 -43
- package/dist/ui/InputText/InputText.docs.svelte.d.ts +0 -26
- package/dist/ui/InputText/InputText.svelte +0 -116
- package/dist/ui/InputText/InputText.svelte.d.ts +0 -22
- package/dist/ui/InputText/index.d.ts +0 -1
- package/dist/ui/InputText/index.js +0 -1
- package/dist/ui/Panel/CollapsiblePanel.docs.svelte +0 -45
- package/dist/ui/Panel/CollapsiblePanel.docs.svelte.d.ts +0 -25
- package/dist/ui/Panel/CollapsiblePanel.svelte +0 -93
- package/dist/ui/Panel/CollapsiblePanel.svelte.d.ts +0 -14
- package/dist/ui/Panel/index.d.ts +0 -1
- package/dist/ui/Panel/index.js +0 -1
- package/dist/ui/Placeholder/Placeholder.docs.svelte +0 -49
- package/dist/ui/Placeholder/Placeholder.docs.svelte.d.ts +0 -26
- package/dist/ui/Placeholder/Placeholder.svelte +0 -99
- package/dist/ui/Placeholder/Placeholder.svelte.d.ts +0 -21
- package/dist/ui/Placeholder/index.d.ts +0 -1
- package/dist/ui/Placeholder/index.js +0 -1
- package/dist/ui/Radio/Radio.docs.svelte +0 -67
- package/dist/ui/Radio/Radio.docs.svelte.d.ts +0 -27
- package/dist/ui/Radio/Radio.svelte +0 -165
- package/dist/ui/Radio/Radio.svelte.d.ts +0 -22
- package/dist/ui/Radio/RadioGroup.docs.svelte +0 -70
- package/dist/ui/Radio/RadioGroup.docs.svelte.d.ts +0 -27
- package/dist/ui/Radio/RadioGroup.svelte +0 -98
- package/dist/ui/Radio/RadioGroup.svelte.d.ts +0 -27
- package/dist/ui/Radio/index.d.ts +0 -2
- package/dist/ui/Radio/index.js +0 -2
- package/dist/ui/SegmentControl/SegmentControl.docs.svelte +0 -54
- package/dist/ui/SegmentControl/SegmentControl.docs.svelte.d.ts +0 -25
- package/dist/ui/SegmentControl/SegmentControl.svelte +0 -120
- package/dist/ui/SegmentControl/SegmentControl.svelte.d.ts +0 -18
- package/dist/ui/SegmentControl/index.d.ts +0 -1
- package/dist/ui/SegmentControl/index.js +0 -1
- package/dist/ui/Stack/Stack.docs.svelte +0 -63
- package/dist/ui/Stack/Stack.docs.svelte.d.ts +0 -26
- package/dist/ui/Stack/Stack.svelte +0 -45
- package/dist/ui/Stack/Stack.svelte.d.ts +0 -19
- package/dist/ui/Stack/index.d.ts +0 -1
- package/dist/ui/Stack/index.js +0 -1
- package/dist/ui/Table/Body.svelte +0 -17
- package/dist/ui/Table/Body.svelte.d.ts +0 -11
- package/dist/ui/Table/Caption.svelte +0 -17
- package/dist/ui/Table/Caption.svelte.d.ts +0 -11
- package/dist/ui/Table/Cell.svelte +0 -24
- package/dist/ui/Table/Cell.svelte.d.ts +0 -15
- package/dist/ui/Table/Foot.svelte +0 -17
- package/dist/ui/Table/Foot.svelte.d.ts +0 -11
- package/dist/ui/Table/Head.svelte +0 -17
- package/dist/ui/Table/Head.svelte.d.ts +0 -11
- package/dist/ui/Table/Header.svelte +0 -27
- package/dist/ui/Table/Header.svelte.d.ts +0 -17
- package/dist/ui/Table/Row.svelte +0 -19
- package/dist/ui/Table/Row.svelte.d.ts +0 -13
- package/dist/ui/Table/Table.docs.svelte +0 -197
- package/dist/ui/Table/Table.docs.svelte.d.ts +0 -28
- package/dist/ui/Table/Table.svelte +0 -140
- package/dist/ui/Table/Table.svelte.d.ts +0 -27
- package/dist/ui/Table/index.js +0 -10
- package/dist/ui/css/colors.css +0 -377
- package/dist/ui/css/global.css +0 -10
- package/dist/ui/index.d.ts +0 -12
- package/dist/ui/index.js +0 -12
- package/dist/virtual-sdocs.d.ts +0 -20
- package/dist/vite-plugin.d.ts +0 -18
- package/dist/vite-plugin.js +0 -206
- /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
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
32
|
-
*/
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
|
|
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
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
|
|
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
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
description
|
|
49
|
+
type: string | null;
|
|
50
|
+
default: string | null;
|
|
51
|
+
description: string | null;
|
|
52
|
+
required: boolean;
|
|
53
|
+
category: 'prop' | 'event' | 'snippet';
|
|
64
54
|
}
|
|
65
|
-
/**
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
92
|
-
*/
|
|
93
|
-
export interface Example {
|
|
68
|
+
/** A CSS custom property */
|
|
69
|
+
export interface ParsedCssProp {
|
|
94
70
|
name: string;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
71
|
+
type: string | null;
|
|
72
|
+
default: string | null;
|
|
73
|
+
description: string | null;
|
|
98
74
|
}
|
|
99
|
-
/**
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
149
|
-
*/
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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;
|