sdocs 0.0.3 → 0.0.5
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
package/dist/vite.js
CHANGED
|
@@ -1,2 +1,266 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { loadConfig, resolveConfig } from './config.js';
|
|
3
|
+
import { discoverDocFiles, getSdocKind } from './server/discovery.js';
|
|
4
|
+
import { parseDocSource } from './server/meta-parser.js';
|
|
5
|
+
import { parseComponent } from './server/prop-parser.js';
|
|
6
|
+
import { extractSnippets, extractMarkupBody, hasDefaultSnippet, generateAutoDefault, } from './server/snippet-extractor.js';
|
|
7
|
+
import { highlight, disposeHighlighter } from './server/highlighter.js';
|
|
8
|
+
import { extractTocFromHtml } from './server/toc-extractor.js';
|
|
9
|
+
import { parseSdocx } from './server/sdocx-parser.js';
|
|
10
|
+
import { parseIframeId, parsePreviewUrl, resolveImportsToAbsolute, generateIframeComponent, generatePreviewHtml, iframeVirtualId, previewUrl, buildPreviewUrl, } from './server/snippet-compiler.js';
|
|
11
|
+
const VIRTUAL_MODULE_ID = 'virtual:sdocs';
|
|
12
|
+
const RESOLVED_VIRTUAL_ID = '\0virtual:sdocs';
|
|
13
|
+
const IFRAME_PREFIX = '/@sdocs/iframe/';
|
|
14
|
+
const PREVIEW_PREFIX = '/@sdocs/preview/';
|
|
15
|
+
export function sdocsPlugin(userConfig) {
|
|
16
|
+
let config;
|
|
17
|
+
let root;
|
|
18
|
+
let server;
|
|
19
|
+
let docEntries = new Map();
|
|
20
|
+
let docImportsCache = new Map();
|
|
21
|
+
const buildMode = userConfig?._buildMode ?? false;
|
|
22
|
+
return {
|
|
23
|
+
name: 'sdocs',
|
|
24
|
+
async configResolved(resolvedConfig) {
|
|
25
|
+
root = resolvedConfig.root;
|
|
26
|
+
if (userConfig) {
|
|
27
|
+
config = resolveConfig(userConfig);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
config = await loadConfig(root);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
configureServer(devServer) {
|
|
34
|
+
server = devServer;
|
|
35
|
+
// Middleware: serve iframe preview HTML pages
|
|
36
|
+
server.middlewares.use((req, res, next) => {
|
|
37
|
+
if (!req.url?.startsWith(PREVIEW_PREFIX))
|
|
38
|
+
return next();
|
|
39
|
+
const parsed = parsePreviewUrl(req.url);
|
|
40
|
+
if (!parsed)
|
|
41
|
+
return next();
|
|
42
|
+
const entry = docEntries.get(parsed.docFilePath);
|
|
43
|
+
if (!entry) {
|
|
44
|
+
res.statusCode = 404;
|
|
45
|
+
res.end('Doc not found');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const snippet = entry.snippets.find((s) => s.name === parsed.snippetName);
|
|
49
|
+
if (!snippet) {
|
|
50
|
+
res.statusCode = 404;
|
|
51
|
+
res.end('Snippet not found');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const iframeId = iframeVirtualId(parsed.docFilePath, parsed.snippetName);
|
|
55
|
+
const html = generatePreviewHtml(iframeId, config.css);
|
|
56
|
+
res.setHeader('Content-Type', 'text/html');
|
|
57
|
+
// Let Vite transform the HTML (resolves imports, injects HMR client)
|
|
58
|
+
server.transformIndexHtml(req.url, html).then((transformed) => {
|
|
59
|
+
res.end(transformed);
|
|
60
|
+
}).catch((err) => {
|
|
61
|
+
console.error('[sdocs] Preview HTML transform error:', err);
|
|
62
|
+
res.statusCode = 500;
|
|
63
|
+
res.end('Internal error');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
// Watch for .sdoc file add/unlink/change
|
|
67
|
+
server.watcher.on('add', async (filePath) => {
|
|
68
|
+
if (isDocFile(filePath)) {
|
|
69
|
+
console.log(`[sdocs] New doc file: ${filePath}`);
|
|
70
|
+
await processDocFile(filePath);
|
|
71
|
+
invalidateVirtualModule();
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
server.watcher.on('unlink', (filePath) => {
|
|
75
|
+
if (isDocFile(filePath)) {
|
|
76
|
+
console.log(`[sdocs] Removed doc file: ${filePath}`);
|
|
77
|
+
docEntries.delete(filePath);
|
|
78
|
+
docImportsCache.delete(filePath);
|
|
79
|
+
invalidateVirtualModule();
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
server.watcher.on('change', async (filePath) => {
|
|
83
|
+
if (isDocFile(filePath)) {
|
|
84
|
+
console.log(`[sdocs] Doc file changed: ${filePath}`);
|
|
85
|
+
await processDocFile(filePath);
|
|
86
|
+
invalidateVirtualModule();
|
|
87
|
+
}
|
|
88
|
+
else if (isComponentReferencedByDoc(filePath)) {
|
|
89
|
+
console.log(`[sdocs] Component changed: ${filePath}`);
|
|
90
|
+
await reprocessComponentEntries(filePath);
|
|
91
|
+
invalidateVirtualModule();
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
},
|
|
95
|
+
async buildStart() {
|
|
96
|
+
const files = await discoverDocFiles(config.include, root);
|
|
97
|
+
console.log(`[sdocs] Discovered ${files.length} doc file(s):`);
|
|
98
|
+
for (const file of files) {
|
|
99
|
+
console.log(` - ${file}`);
|
|
100
|
+
await processDocFile(file);
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
resolveId(id) {
|
|
104
|
+
if (id === VIRTUAL_MODULE_ID)
|
|
105
|
+
return RESOLVED_VIRTUAL_ID;
|
|
106
|
+
if (id.startsWith(IFRAME_PREFIX))
|
|
107
|
+
return '\0' + id;
|
|
108
|
+
},
|
|
109
|
+
load(id) {
|
|
110
|
+
if (id === RESOLVED_VIRTUAL_ID) {
|
|
111
|
+
return generateVirtualModule();
|
|
112
|
+
}
|
|
113
|
+
// Virtual iframe wrapper component
|
|
114
|
+
if (id.startsWith('\0' + IFRAME_PREFIX)) {
|
|
115
|
+
const realId = id.slice(1);
|
|
116
|
+
const parsed = parseIframeId(realId);
|
|
117
|
+
if (!parsed)
|
|
118
|
+
return null;
|
|
119
|
+
const entry = docEntries.get(parsed.docFilePath);
|
|
120
|
+
if (!entry)
|
|
121
|
+
return null;
|
|
122
|
+
const snippet = entry.snippets.find((s) => s.name === parsed.snippetName);
|
|
123
|
+
if (!snippet)
|
|
124
|
+
return null;
|
|
125
|
+
const absoluteImports = docImportsCache.get(parsed.docFilePath) ?? [];
|
|
126
|
+
return generateIframeComponent(absoluteImports, snippet.body);
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
async buildEnd() {
|
|
130
|
+
await disposeHighlighter();
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
// ─── Process a single doc file ───
|
|
134
|
+
async function processDocFile(filePath) {
|
|
135
|
+
const source = await readFile(filePath, 'utf-8');
|
|
136
|
+
const kind = getSdocKind(filePath);
|
|
137
|
+
const isSdocx = filePath.endsWith('.sdocx');
|
|
138
|
+
let meta;
|
|
139
|
+
let componentPath = null;
|
|
140
|
+
let imports = [];
|
|
141
|
+
let snippets;
|
|
142
|
+
let toc;
|
|
143
|
+
if (isSdocx) {
|
|
144
|
+
// Markdown format: parse with mdsvex
|
|
145
|
+
const result = await parseSdocx(source, filePath, kind);
|
|
146
|
+
meta = result.meta;
|
|
147
|
+
componentPath = result.componentPath;
|
|
148
|
+
imports = result.imports;
|
|
149
|
+
snippets = result.snippets;
|
|
150
|
+
toc = result.toc;
|
|
151
|
+
// For component kind, auto-generate Default if missing
|
|
152
|
+
if (kind === 'component') {
|
|
153
|
+
const hasDefault = snippets.some((s) => s.name === 'Default');
|
|
154
|
+
if (!hasDefault && componentPath) {
|
|
155
|
+
const componentName = componentPath.split('/').pop()?.replace('.svelte', '') ?? 'Component';
|
|
156
|
+
snippets.unshift({
|
|
157
|
+
name: 'Default',
|
|
158
|
+
body: generateAutoDefault(componentName),
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
// Svelte format: existing pipeline
|
|
165
|
+
const parsed = parseDocSource(source, filePath);
|
|
166
|
+
meta = parsed.meta;
|
|
167
|
+
componentPath = parsed.componentPath;
|
|
168
|
+
imports = parsed.imports;
|
|
169
|
+
if (kind === 'page' || kind === 'layout') {
|
|
170
|
+
const body = extractMarkupBody(source);
|
|
171
|
+
snippets = [{ name: 'Content', body }];
|
|
172
|
+
if (kind === 'page') {
|
|
173
|
+
toc = extractTocFromHtml(body);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
snippets = extractSnippets(source);
|
|
178
|
+
if (!hasDefaultSnippet(snippets)) {
|
|
179
|
+
const componentName = componentPath?.split('/').pop()?.replace('.svelte', '') ?? 'Component';
|
|
180
|
+
snippets.unshift({
|
|
181
|
+
name: 'Default',
|
|
182
|
+
body: generateAutoDefault(componentName),
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Cache resolved imports for iframe component generation
|
|
188
|
+
docImportsCache.set(filePath, resolveImportsToAbsolute(imports, filePath));
|
|
189
|
+
let componentData = null;
|
|
190
|
+
let highlightedSource = null;
|
|
191
|
+
if (kind === 'component' && componentPath) {
|
|
192
|
+
try {
|
|
193
|
+
componentData = await parseComponent(componentPath);
|
|
194
|
+
const componentSource = await readFile(componentPath, 'utf-8');
|
|
195
|
+
highlightedSource = await highlight(componentSource);
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
console.warn(`[sdocs] Failed to parse component: ${componentPath}`, err);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
for (const snippet of snippets) {
|
|
202
|
+
snippet.highlightedHtml = await highlight(snippet.body);
|
|
203
|
+
}
|
|
204
|
+
docEntries.set(filePath, {
|
|
205
|
+
kind,
|
|
206
|
+
filePath,
|
|
207
|
+
componentPath,
|
|
208
|
+
meta,
|
|
209
|
+
componentData,
|
|
210
|
+
snippets,
|
|
211
|
+
highlightedSource,
|
|
212
|
+
toc,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
// ─── Generate the virtual module ───
|
|
216
|
+
function generateVirtualModule() {
|
|
217
|
+
const entries = Array.from(docEntries.values());
|
|
218
|
+
const data = entries.map((e) => ({
|
|
219
|
+
kind: e.kind,
|
|
220
|
+
filePath: e.filePath,
|
|
221
|
+
componentPath: e.componentPath,
|
|
222
|
+
meta: e.meta,
|
|
223
|
+
componentData: e.componentData,
|
|
224
|
+
snippets: e.snippets.map((s) => ({
|
|
225
|
+
name: s.name,
|
|
226
|
+
body: s.body,
|
|
227
|
+
highlightedHtml: s.highlightedHtml,
|
|
228
|
+
previewUrl: buildMode ? buildPreviewUrl(e.filePath, s.name) : previewUrl(e.filePath, s.name),
|
|
229
|
+
})),
|
|
230
|
+
highlightedSource: e.highlightedSource,
|
|
231
|
+
toc: e.toc,
|
|
232
|
+
}));
|
|
233
|
+
// Extract named CSS stylesheet names (empty array if single string or null)
|
|
234
|
+
const cssNames = config.css && typeof config.css === 'object'
|
|
235
|
+
? Object.keys(config.css)
|
|
236
|
+
: [];
|
|
237
|
+
return `export const docs = ${JSON.stringify(data)};\nexport const cssNames = ${JSON.stringify(cssNames)};\nexport default docs;`;
|
|
238
|
+
}
|
|
239
|
+
// ─── HMR helpers ───
|
|
240
|
+
function invalidateVirtualModule() {
|
|
241
|
+
if (!server)
|
|
242
|
+
return;
|
|
243
|
+
const mod = server.moduleGraph.getModuleById(RESOLVED_VIRTUAL_ID);
|
|
244
|
+
if (mod) {
|
|
245
|
+
server.moduleGraph.invalidateModule(mod);
|
|
246
|
+
server.ws.send({ type: 'full-reload' });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function isDocFile(filePath) {
|
|
250
|
+
return filePath.endsWith('.sdoc') || filePath.endsWith('.sdocx');
|
|
251
|
+
}
|
|
252
|
+
function isComponentReferencedByDoc(filePath) {
|
|
253
|
+
for (const entry of docEntries.values()) {
|
|
254
|
+
if (entry.componentPath === filePath)
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
return false;
|
|
258
|
+
}
|
|
259
|
+
async function reprocessComponentEntries(componentPath) {
|
|
260
|
+
for (const [docPath, entry] of docEntries) {
|
|
261
|
+
if (entry.componentPath === componentPath) {
|
|
262
|
+
await processDocFile(docPath);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
package/package.json
CHANGED
|
@@ -1,76 +1,52 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
"peerDependenciesMeta": {
|
|
53
|
-
"vite": { "optional": true },
|
|
54
|
-
"@sveltejs/vite-plugin-svelte": { "optional": true }
|
|
55
|
-
},
|
|
56
|
-
"devDependencies": {
|
|
57
|
-
"@sveltejs/adapter-auto": "^7.0.0",
|
|
58
|
-
"@sveltejs/kit": "^2.50.1",
|
|
59
|
-
"@sveltejs/package": "^2.5.7",
|
|
60
|
-
"@sveltejs/vite-plugin-svelte": "^6.2.4",
|
|
61
|
-
"mdsvex": "^0.12.6",
|
|
62
|
-
"publint": "^0.3.17",
|
|
63
|
-
"svelte": "^5.48.2",
|
|
64
|
-
"svelte-check": "^4.3.5",
|
|
65
|
-
"typescript": "^5.9.3",
|
|
66
|
-
"vite": "^7.3.1"
|
|
67
|
-
},
|
|
68
|
-
"keywords": [
|
|
69
|
-
"svelte",
|
|
70
|
-
"documentation",
|
|
71
|
-
"components"
|
|
72
|
-
],
|
|
73
|
-
"dependencies": {
|
|
74
|
-
"lucide-svelte": "^0.563.0"
|
|
75
|
-
}
|
|
2
|
+
"name": "sdocs",
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"description": "A lightweight documentation tool for Svelte 5 components",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"bin": {
|
|
8
|
+
"sdocs": "./bin/sdocs.js"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"svelte": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"./vite": {
|
|
16
|
+
"types": "./dist/vite.d.ts",
|
|
17
|
+
"default": "./dist/vite.js"
|
|
18
|
+
},
|
|
19
|
+
"./client": {
|
|
20
|
+
"svelte": "./dist/client/App.svelte"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"bin"
|
|
26
|
+
],
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"@sveltejs/vite-plugin-svelte": "^5.0.0 || ^6.0.0",
|
|
29
|
+
"svelte": "^5.0.0",
|
|
30
|
+
"vite": "^6.0.0 || ^7.0.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@sveltejs/package": "^2.5.7",
|
|
34
|
+
"@sveltejs/vite-plugin-svelte": "^6.2.4",
|
|
35
|
+
"svelte": "^5.50.0",
|
|
36
|
+
"svelte-check": "^4.0.0",
|
|
37
|
+
"typescript": "^5.7.0",
|
|
38
|
+
"vite": "^7.3.1",
|
|
39
|
+
"vitest": "^3.0.0"
|
|
40
|
+
},
|
|
41
|
+
"scripts": {
|
|
42
|
+
"dev": "vite",
|
|
43
|
+
"build": "svelte-package -i src/lib -o dist",
|
|
44
|
+
"check": "svelte-check --tsconfig ./tsconfig.json",
|
|
45
|
+
"test": "vitest run"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"mdsvex": "^0.12.6",
|
|
49
|
+
"shiki": "^3.22.0",
|
|
50
|
+
"tinyglobby": "^0.2.15"
|
|
51
|
+
}
|
|
76
52
|
}
|
package/README.md
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
# sdocs
|
|
2
|
-
|
|
3
|
-
A lightweight documentation tool for Svelte 5 components.
|
|
4
|
-
|
|
5
|
-
Drop `.docs.svelte` files next to your components and get auto-generated interactive documentation with live previews, prop controls, CSS custom property editors, and method listings — all extracted from your source code.
|
|
6
|
-
|
|
7
|
-
## Features
|
|
8
|
-
|
|
9
|
-
- Auto-detected props with interactive controls
|
|
10
|
-
- CSS custom properties via `@cssvar` JSDoc tags
|
|
11
|
-
- Exported function detection (methods panel)
|
|
12
|
-
- Snippet-based examples with source code display
|
|
13
|
-
- Vite plugin with HMR support
|
|
14
|
-
- Zero config — works out of the box
|
|
15
|
-
|
|
16
|
-
## Quick start
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npm install sdocs
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
```js
|
|
23
|
-
// vite.config.ts
|
|
24
|
-
import { sdocsPlugin } from 'sdocs/vite';
|
|
25
|
-
|
|
26
|
-
export default defineConfig({
|
|
27
|
-
plugins: [sveltekit(), sdocsPlugin()]
|
|
28
|
-
});
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
```svelte
|
|
32
|
-
<!-- +page.svelte -->
|
|
33
|
-
<script>
|
|
34
|
-
import { Sdocs } from 'sdocs';
|
|
35
|
-
import { docs } from 'virtual:sdocs';
|
|
36
|
-
</script>
|
|
37
|
-
|
|
38
|
-
<Sdocs {docs} />
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## License
|
|
42
|
-
|
|
43
|
-
MIT
|