@fuzdev/fuz_ui 0.169.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +93 -0
- package/dist/Alert.svelte +108 -0
- package/dist/Alert.svelte.d.ts +16 -0
- package/dist/Alert.svelte.d.ts.map +1 -0
- package/dist/ApiDeclarationList.svelte +35 -0
- package/dist/ApiDeclarationList.svelte.d.ts +9 -0
- package/dist/ApiDeclarationList.svelte.d.ts.map +1 -0
- package/dist/ApiIndex.svelte +65 -0
- package/dist/ApiIndex.svelte.d.ts +23 -0
- package/dist/ApiIndex.svelte.d.ts.map +1 -0
- package/dist/ApiModule.svelte +124 -0
- package/dist/ApiModule.svelte.d.ts +22 -0
- package/dist/ApiModule.svelte.d.ts.map +1 -0
- package/dist/Breadcrumb.svelte +83 -0
- package/dist/Breadcrumb.svelte.d.ts +23 -0
- package/dist/Breadcrumb.svelte.d.ts.map +1 -0
- package/dist/Card.svelte +157 -0
- package/dist/Card.svelte.d.ts +13 -0
- package/dist/Card.svelte.d.ts.map +1 -0
- package/dist/ColorSchemeInput.svelte +65 -0
- package/dist/ColorSchemeInput.svelte.d.ts +11 -0
- package/dist/ColorSchemeInput.svelte.d.ts.map +1 -0
- package/dist/Contextmenu.svelte +30 -0
- package/dist/Contextmenu.svelte.d.ts +32 -0
- package/dist/Contextmenu.svelte.d.ts.map +1 -0
- package/dist/ContextmenuEntry.svelte +74 -0
- package/dist/ContextmenuEntry.svelte.d.ts +12 -0
- package/dist/ContextmenuEntry.svelte.d.ts.map +1 -0
- package/dist/ContextmenuLinkEntry.svelte +112 -0
- package/dist/ContextmenuLinkEntry.svelte.d.ts +12 -0
- package/dist/ContextmenuLinkEntry.svelte.d.ts.map +1 -0
- package/dist/ContextmenuRoot.svelte +372 -0
- package/dist/ContextmenuRoot.svelte.d.ts +71 -0
- package/dist/ContextmenuRoot.svelte.d.ts.map +1 -0
- package/dist/ContextmenuRootForSafariCompatibility.svelte +541 -0
- package/dist/ContextmenuRootForSafariCompatibility.svelte.d.ts +79 -0
- package/dist/ContextmenuRootForSafariCompatibility.svelte.d.ts.map +1 -0
- package/dist/ContextmenuSeparator.svelte +16 -0
- package/dist/ContextmenuSeparator.svelte.d.ts +4 -0
- package/dist/ContextmenuSeparator.svelte.d.ts.map +1 -0
- package/dist/ContextmenuSubmenu.svelte +116 -0
- package/dist/ContextmenuSubmenu.svelte.d.ts +10 -0
- package/dist/ContextmenuSubmenu.svelte.d.ts.map +1 -0
- package/dist/ContextmenuTextEntry.svelte +21 -0
- package/dist/ContextmenuTextEntry.svelte.d.ts +10 -0
- package/dist/ContextmenuTextEntry.svelte.d.ts.map +1 -0
- package/dist/CopyToClipboard.svelte +81 -0
- package/dist/CopyToClipboard.svelte.d.ts +18 -0
- package/dist/CopyToClipboard.svelte.d.ts.map +1 -0
- package/dist/DeclarationDetail.svelte +340 -0
- package/dist/DeclarationDetail.svelte.d.ts +8 -0
- package/dist/DeclarationDetail.svelte.d.ts.map +1 -0
- package/dist/DeclarationLink.svelte +50 -0
- package/dist/DeclarationLink.svelte.d.ts +8 -0
- package/dist/DeclarationLink.svelte.d.ts.map +1 -0
- package/dist/Details.svelte +51 -0
- package/dist/Details.svelte.d.ts +20 -0
- package/dist/Details.svelte.d.ts.map +1 -0
- package/dist/Dialog.svelte +217 -0
- package/dist/Dialog.svelte.d.ts +30 -0
- package/dist/Dialog.svelte.d.ts.map +1 -0
- package/dist/Dialogs.svelte +28 -0
- package/dist/Dialogs.svelte.d.ts +11 -0
- package/dist/Dialogs.svelte.d.ts.map +1 -0
- package/dist/Docs.svelte +179 -0
- package/dist/Docs.svelte.d.ts +13 -0
- package/dist/Docs.svelte.d.ts.map +1 -0
- package/dist/DocsContent.svelte +40 -0
- package/dist/DocsContent.svelte.d.ts +14 -0
- package/dist/DocsContent.svelte.d.ts.map +1 -0
- package/dist/DocsFooter.svelte +64 -0
- package/dist/DocsFooter.svelte.d.ts +15 -0
- package/dist/DocsFooter.svelte.d.ts.map +1 -0
- package/dist/DocsLink.svelte +41 -0
- package/dist/DocsLink.svelte.d.ts +12 -0
- package/dist/DocsLink.svelte.d.ts.map +1 -0
- package/dist/DocsList.svelte +44 -0
- package/dist/DocsList.svelte.d.ts +11 -0
- package/dist/DocsList.svelte.d.ts.map +1 -0
- package/dist/DocsMenu.svelte +55 -0
- package/dist/DocsMenu.svelte.d.ts +11 -0
- package/dist/DocsMenu.svelte.d.ts.map +1 -0
- package/dist/DocsMenuHeader.svelte +15 -0
- package/dist/DocsMenuHeader.svelte.d.ts +9 -0
- package/dist/DocsMenuHeader.svelte.d.ts.map +1 -0
- package/dist/DocsModulesList.svelte +32 -0
- package/dist/DocsModulesList.svelte.d.ts +7 -0
- package/dist/DocsModulesList.svelte.d.ts.map +1 -0
- package/dist/DocsPageLinks.svelte +61 -0
- package/dist/DocsPageLinks.svelte.d.ts +8 -0
- package/dist/DocsPageLinks.svelte.d.ts.map +1 -0
- package/dist/DocsPrimaryNav.svelte +93 -0
- package/dist/DocsPrimaryNav.svelte.d.ts +11 -0
- package/dist/DocsPrimaryNav.svelte.d.ts.map +1 -0
- package/dist/DocsSearch.svelte +48 -0
- package/dist/DocsSearch.svelte.d.ts +11 -0
- package/dist/DocsSearch.svelte.d.ts.map +1 -0
- package/dist/DocsSecondaryNav.svelte +63 -0
- package/dist/DocsSecondaryNav.svelte.d.ts +9 -0
- package/dist/DocsSecondaryNav.svelte.d.ts.map +1 -0
- package/dist/DocsTertiaryNav.svelte +118 -0
- package/dist/DocsTertiaryNav.svelte.d.ts +10 -0
- package/dist/DocsTertiaryNav.svelte.d.ts.map +1 -0
- package/dist/EcosystemLinks.svelte +53 -0
- package/dist/EcosystemLinks.svelte.d.ts +7 -0
- package/dist/EcosystemLinks.svelte.d.ts.map +1 -0
- package/dist/EcosystemLinksPanel.svelte +22 -0
- package/dist/EcosystemLinksPanel.svelte.d.ts +8 -0
- package/dist/EcosystemLinksPanel.svelte.d.ts.map +1 -0
- package/dist/GithubLink.svelte +75 -0
- package/dist/GithubLink.svelte.d.ts +14 -0
- package/dist/GithubLink.svelte.d.ts.map +1 -0
- package/dist/Glyph.svelte +28 -0
- package/dist/Glyph.svelte.d.ts +9 -0
- package/dist/Glyph.svelte.d.ts.map +1 -0
- package/dist/Hashlink.svelte +41 -0
- package/dist/Hashlink.svelte.d.ts +8 -0
- package/dist/Hashlink.svelte.d.ts.map +1 -0
- package/dist/HiddenPersonalLinks.svelte +6 -0
- package/dist/HiddenPersonalLinks.svelte.d.ts +27 -0
- package/dist/HiddenPersonalLinks.svelte.d.ts.map +1 -0
- package/dist/HueInput.svelte +127 -0
- package/dist/HueInput.svelte.d.ts +11 -0
- package/dist/HueInput.svelte.d.ts.map +1 -0
- package/dist/ImgOrSvg.svelte +58 -0
- package/dist/ImgOrSvg.svelte.d.ts +25 -0
- package/dist/ImgOrSvg.svelte.d.ts.map +1 -0
- package/dist/LibraryDetail.svelte +297 -0
- package/dist/LibraryDetail.svelte.d.ts +15 -0
- package/dist/LibraryDetail.svelte.d.ts.map +1 -0
- package/dist/LibrarySummary.svelte +151 -0
- package/dist/LibrarySummary.svelte.d.ts +16 -0
- package/dist/LibrarySummary.svelte.d.ts.map +1 -0
- package/dist/MdnLink.svelte +40 -0
- package/dist/MdnLink.svelte.d.ts +8 -0
- package/dist/MdnLink.svelte.d.ts.map +1 -0
- package/dist/Mdz.svelte +30 -0
- package/dist/Mdz.svelte.d.ts +10 -0
- package/dist/Mdz.svelte.d.ts.map +1 -0
- package/dist/MdzNodeView.svelte +93 -0
- package/dist/MdzNodeView.svelte.d.ts +9 -0
- package/dist/MdzNodeView.svelte.d.ts.map +1 -0
- package/dist/ModuleLink.svelte +48 -0
- package/dist/ModuleLink.svelte.d.ts +8 -0
- package/dist/ModuleLink.svelte.d.ts.map +1 -0
- package/dist/PasteFromClipboard.svelte +35 -0
- package/dist/PasteFromClipboard.svelte.d.ts +9 -0
- package/dist/PasteFromClipboard.svelte.d.ts.map +1 -0
- package/dist/PendingAnimation.svelte +62 -0
- package/dist/PendingAnimation.svelte.d.ts +13 -0
- package/dist/PendingAnimation.svelte.d.ts.map +1 -0
- package/dist/PendingButton.svelte +75 -0
- package/dist/PendingButton.svelte.d.ts +17 -0
- package/dist/PendingButton.svelte.d.ts.map +1 -0
- package/dist/ProjectLinks.svelte +54 -0
- package/dist/ProjectLinks.svelte.d.ts +19 -0
- package/dist/ProjectLinks.svelte.d.ts.map +1 -0
- package/dist/Redirect.svelte +44 -0
- package/dist/Redirect.svelte.d.ts +23 -0
- package/dist/Redirect.svelte.d.ts.map +1 -0
- package/dist/Spiders.svelte +57 -0
- package/dist/Spiders.svelte.d.ts +9 -0
- package/dist/Spiders.svelte.d.ts.map +1 -0
- package/dist/Svg.svelte +99 -0
- package/dist/Svg.svelte.d.ts +54 -0
- package/dist/Svg.svelte.d.ts.map +1 -0
- package/dist/Teleport.svelte +48 -0
- package/dist/Teleport.svelte.d.ts +15 -0
- package/dist/Teleport.svelte.d.ts.map +1 -0
- package/dist/ThemeInput.svelte +75 -0
- package/dist/ThemeInput.svelte.d.ts +15 -0
- package/dist/ThemeInput.svelte.d.ts.map +1 -0
- package/dist/Themed.svelte +101 -0
- package/dist/Themed.svelte.d.ts +24 -0
- package/dist/Themed.svelte.d.ts.map +1 -0
- package/dist/TomeContent.svelte +67 -0
- package/dist/TomeContent.svelte.d.ts +12 -0
- package/dist/TomeContent.svelte.d.ts.map +1 -0
- package/dist/TomeHeader.svelte +56 -0
- package/dist/TomeHeader.svelte.d.ts +4 -0
- package/dist/TomeHeader.svelte.d.ts.map +1 -0
- package/dist/TomeLink.svelte +29 -0
- package/dist/TomeLink.svelte.d.ts +10 -0
- package/dist/TomeLink.svelte.d.ts.map +1 -0
- package/dist/TomeSection.svelte +65 -0
- package/dist/TomeSection.svelte.d.ts +24 -0
- package/dist/TomeSection.svelte.d.ts.map +1 -0
- package/dist/TomeSectionHeader.svelte +90 -0
- package/dist/TomeSectionHeader.svelte.d.ts +13 -0
- package/dist/TomeSectionHeader.svelte.d.ts.map +1 -0
- package/dist/TypeLink.svelte +19 -0
- package/dist/TypeLink.svelte.d.ts +7 -0
- package/dist/TypeLink.svelte.d.ts.map +1 -0
- package/dist/alert.d.ts +7 -0
- package/dist/alert.d.ts.map +1 -0
- package/dist/alert.js +6 -0
- package/dist/api_search.svelte.d.ts +16 -0
- package/dist/api_search.svelte.d.ts.map +1 -0
- package/dist/api_search.svelte.js +61 -0
- package/dist/constants.d.ts +2 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +3 -0
- package/dist/context_helpers.d.ts +17 -0
- package/dist/context_helpers.d.ts.map +1 -0
- package/dist/context_helpers.js +19 -0
- package/dist/contextmenu_helpers.d.ts +16 -0
- package/dist/contextmenu_helpers.d.ts.map +1 -0
- package/dist/contextmenu_helpers.js +39 -0
- package/dist/contextmenu_state.svelte.d.ts +152 -0
- package/dist/contextmenu_state.svelte.d.ts.map +1 -0
- package/dist/contextmenu_state.svelte.js +424 -0
- package/dist/csp.d.ts +160 -0
- package/dist/csp.d.ts.map +1 -0
- package/dist/csp.js +354 -0
- package/dist/csp_of_ryanatkn.d.ts +6 -0
- package/dist/csp_of_ryanatkn.d.ts.map +1 -0
- package/dist/csp_of_ryanatkn.js +14 -0
- package/dist/declaration.svelte.d.ts +84 -0
- package/dist/declaration.svelte.d.ts.map +1 -0
- package/dist/declaration.svelte.js +66 -0
- package/dist/declaration_contextmenu.d.ts +4 -0
- package/dist/declaration_contextmenu.d.ts.map +1 -0
- package/dist/declaration_contextmenu.js +14 -0
- package/dist/dialog.d.ts +24 -0
- package/dist/dialog.d.ts.map +1 -0
- package/dist/dialog.js +12 -0
- package/dist/dimensions.svelte.d.ts +5 -0
- package/dist/dimensions.svelte.d.ts.map +1 -0
- package/dist/dimensions.svelte.js +4 -0
- package/dist/docs_helpers.svelte.d.ts +48 -0
- package/dist/docs_helpers.svelte.d.ts.map +1 -0
- package/dist/docs_helpers.svelte.js +99 -0
- package/dist/helpers.d.ts +2 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +16 -0
- package/dist/intersect.svelte.d.ts +47 -0
- package/dist/intersect.svelte.d.ts.map +1 -0
- package/dist/intersect.svelte.js +92 -0
- package/dist/library.svelte.d.ts +197 -0
- package/dist/library.svelte.d.ts.map +1 -0
- package/dist/library.svelte.js +130 -0
- package/dist/library_gen.d.ts +34 -0
- package/dist/library_gen.d.ts.map +1 -0
- package/dist/library_gen.js +123 -0
- package/dist/library_gen_helpers.d.ts +85 -0
- package/dist/library_gen_helpers.d.ts.map +1 -0
- package/dist/library_gen_helpers.js +188 -0
- package/dist/library_helpers.d.ts +54 -0
- package/dist/library_helpers.d.ts.map +1 -0
- package/dist/library_helpers.js +102 -0
- package/dist/logos.d.ts +134 -0
- package/dist/logos.d.ts.map +1 -0
- package/dist/logos.js +281 -0
- package/dist/mdz.d.ts +106 -0
- package/dist/mdz.d.ts.map +1 -0
- package/dist/mdz.js +1481 -0
- package/dist/mdz_components.d.ts +37 -0
- package/dist/mdz_components.d.ts.map +1 -0
- package/dist/mdz_components.js +12 -0
- package/dist/module.svelte.d.ts +47 -0
- package/dist/module.svelte.d.ts.map +1 -0
- package/dist/module.svelte.js +56 -0
- package/dist/module_contextmenu.d.ts +4 -0
- package/dist/module_contextmenu.d.ts.map +1 -0
- package/dist/module_contextmenu.js +14 -0
- package/dist/module_helpers.d.ts +69 -0
- package/dist/module_helpers.d.ts.map +1 -0
- package/dist/module_helpers.js +87 -0
- package/dist/rune_helpers.svelte.d.ts +6 -0
- package/dist/rune_helpers.svelte.d.ts.map +1 -0
- package/dist/rune_helpers.svelte.js +10 -0
- package/dist/storage.d.ts +13 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +43 -0
- package/dist/svelte_helpers.d.ts +37 -0
- package/dist/svelte_helpers.d.ts.map +1 -0
- package/dist/svelte_helpers.js +245 -0
- package/dist/themer.svelte.d.ts +24 -0
- package/dist/themer.svelte.d.ts.map +1 -0
- package/dist/themer.svelte.js +43 -0
- package/dist/tome.d.ts +80 -0
- package/dist/tome.d.ts.map +1 -0
- package/dist/tome.js +27 -0
- package/dist/ts_helpers.d.ts +110 -0
- package/dist/ts_helpers.d.ts.map +1 -0
- package/dist/ts_helpers.js +533 -0
- package/dist/tsdoc_helpers.d.ts +98 -0
- package/dist/tsdoc_helpers.d.ts.map +1 -0
- package/dist/tsdoc_helpers.js +221 -0
- package/package.json +128 -0
- package/src/lib/alert.ts +14 -0
- package/src/lib/api_search.svelte.ts +85 -0
- package/src/lib/constants.ts +3 -0
- package/src/lib/context_helpers.ts +47 -0
- package/src/lib/contextmenu_helpers.ts +63 -0
- package/src/lib/contextmenu_state.svelte.ts +515 -0
- package/src/lib/csp.ts +576 -0
- package/src/lib/csp_of_ryanatkn.ts +16 -0
- package/src/lib/declaration.svelte.ts +102 -0
- package/src/lib/declaration_contextmenu.ts +22 -0
- package/src/lib/dialog.ts +35 -0
- package/src/lib/dimensions.svelte.ts +4 -0
- package/src/lib/docs_helpers.svelte.ts +149 -0
- package/src/lib/helpers.ts +10 -0
- package/src/lib/intersect.svelte.ts +152 -0
- package/src/lib/library.svelte.ts +162 -0
- package/src/lib/library_gen.ts +160 -0
- package/src/lib/library_gen_helpers.ts +262 -0
- package/src/lib/library_helpers.ts +123 -0
- package/src/lib/logos.ts +302 -0
- package/src/lib/mdz.ts +1819 -0
- package/src/lib/mdz_components.ts +34 -0
- package/src/lib/module.svelte.ts +78 -0
- package/src/lib/module_contextmenu.ts +20 -0
- package/src/lib/module_helpers.ts +113 -0
- package/src/lib/rune_helpers.svelte.ts +10 -0
- package/src/lib/storage.ts +48 -0
- package/src/lib/svelte_helpers.ts +303 -0
- package/src/lib/themer.svelte.ts +68 -0
- package/src/lib/tome.ts +38 -0
- package/src/lib/ts_helpers.ts +662 -0
- package/src/lib/tsdoc_helpers.ts +259 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Svelte component analysis helpers.
|
|
3
|
+
*
|
|
4
|
+
* Extracts metadata from Svelte components using svelte2tsx transformations:
|
|
5
|
+
*
|
|
6
|
+
* - Component props with types and JSDoc
|
|
7
|
+
* - Component-level documentation
|
|
8
|
+
* - Type information
|
|
9
|
+
*
|
|
10
|
+
* Workflow: Transform Svelte to TypeScript via svelte2tsx, parse the transformed
|
|
11
|
+
* TypeScript with the TS Compiler API, extract component-level JSDoc from original source.
|
|
12
|
+
*
|
|
13
|
+
* All functions are prefixed with `svelte_` for clarity.
|
|
14
|
+
*/
|
|
15
|
+
import ts from 'typescript';
|
|
16
|
+
import { readFileSync } from 'node:fs';
|
|
17
|
+
import { svelte2tsx } from 'svelte2tsx';
|
|
18
|
+
import { tsdoc_parse, tsdoc_apply_to_declaration } from './tsdoc_helpers.js';
|
|
19
|
+
import { module_get_component_name } from './module_helpers.js';
|
|
20
|
+
/**
|
|
21
|
+
* Analyze a Svelte component from its svelte2tsx transformation.
|
|
22
|
+
*/
|
|
23
|
+
export const svelte_analyze_component = (ts_code, source_file, checker, component_name) => {
|
|
24
|
+
const result = {
|
|
25
|
+
name: component_name,
|
|
26
|
+
kind: 'component',
|
|
27
|
+
};
|
|
28
|
+
try {
|
|
29
|
+
// Create a virtual source file from the svelte2tsx output
|
|
30
|
+
// svelte2tsx generates plain TypeScript (not TSX/JSX)
|
|
31
|
+
const virtual_source = ts.createSourceFile(source_file.fileName + '.ts', ts_code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
32
|
+
// Extract component-level TSDoc from svelte2tsx transformed output
|
|
33
|
+
const component_tsdoc = svelte_extract_component_tsdoc(virtual_source);
|
|
34
|
+
tsdoc_apply_to_declaration(result, component_tsdoc);
|
|
35
|
+
// Extract props from svelte2tsx transformed output
|
|
36
|
+
const props = svelte_extract_props(virtual_source, checker);
|
|
37
|
+
if (props.length > 0) {
|
|
38
|
+
result.props = props;
|
|
39
|
+
}
|
|
40
|
+
// Extract source line from original file
|
|
41
|
+
const start_pos = source_file.getLineAndCharacterOfPosition(0);
|
|
42
|
+
result.source_line = start_pos.line + 1;
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
// If analysis fails, return basic component info
|
|
46
|
+
// eslint-disable-next-line no-console
|
|
47
|
+
console.error(`Error analyzing Svelte component ${component_name}:`, error);
|
|
48
|
+
}
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Extract component-level TSDoc comment from svelte2tsx transformed output.
|
|
53
|
+
*
|
|
54
|
+
* svelte2tsx places component-level JSDoc inside the $$render() function,
|
|
55
|
+
* attached to a variable statement (usually before the props destructuring).
|
|
56
|
+
* This function searches the AST recursively to find it.
|
|
57
|
+
*/
|
|
58
|
+
const svelte_extract_component_tsdoc = (source_file) => {
|
|
59
|
+
let found_tsdoc = undefined;
|
|
60
|
+
// Recursively search for component-level JSDoc
|
|
61
|
+
function visit(node) {
|
|
62
|
+
if (found_tsdoc)
|
|
63
|
+
return; // Already found, stop searching
|
|
64
|
+
// Skip PropertySignature nodes - those are prop-level JSDoc, not component-level
|
|
65
|
+
if (ts.isPropertySignature(node)) {
|
|
66
|
+
return; // Don't recurse into property signatures
|
|
67
|
+
}
|
|
68
|
+
// Check for JSDoc on VariableStatement or VariableDeclaration
|
|
69
|
+
// Component-level JSDoc is attached to these node types
|
|
70
|
+
if (ts.isVariableStatement(node) || ts.isVariableDeclaration(node)) {
|
|
71
|
+
const tsdoc = tsdoc_parse(node, source_file);
|
|
72
|
+
if (tsdoc) {
|
|
73
|
+
found_tsdoc = tsdoc;
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Continue searching child nodes
|
|
78
|
+
ts.forEachChild(node, visit);
|
|
79
|
+
}
|
|
80
|
+
visit(source_file);
|
|
81
|
+
return found_tsdoc;
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Helper to extract prop info from a property signature member.
|
|
85
|
+
*/
|
|
86
|
+
const svelte_extract_prop_from_member = (member, source_file, checker) => {
|
|
87
|
+
if (!ts.isIdentifier(member.name))
|
|
88
|
+
return undefined;
|
|
89
|
+
const prop_name = member.name.text;
|
|
90
|
+
const optional = !!member.questionToken;
|
|
91
|
+
// Get type string
|
|
92
|
+
let type_string = 'any';
|
|
93
|
+
if (member.type) {
|
|
94
|
+
type_string = member.type.getText(source_file);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
// Try to get type from type checker
|
|
98
|
+
try {
|
|
99
|
+
const prop_type = checker.getTypeAtLocation(member);
|
|
100
|
+
type_string = checker.typeToString(prop_type);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Fallback to 'any'
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// Extract TSDoc description
|
|
107
|
+
let description;
|
|
108
|
+
const tsdoc = tsdoc_parse(member, source_file);
|
|
109
|
+
if (tsdoc) {
|
|
110
|
+
description = tsdoc.text;
|
|
111
|
+
}
|
|
112
|
+
// Extract default value (if available in TSDoc or initializer)
|
|
113
|
+
let default_value;
|
|
114
|
+
const default_match = description?.match(/@default\s+(.+)/);
|
|
115
|
+
if (default_match) {
|
|
116
|
+
default_value = default_match[1].trim();
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
name: prop_name,
|
|
120
|
+
type: type_string,
|
|
121
|
+
...(optional && { optional }),
|
|
122
|
+
description,
|
|
123
|
+
default_value,
|
|
124
|
+
};
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Extract bindable prop names from svelte2tsx transformed output.
|
|
128
|
+
*
|
|
129
|
+
* svelte2tsx marks bindable props with `__sveltets_$$bindings('prop1', 'prop2', ...)`.
|
|
130
|
+
* This function extracts those prop names.
|
|
131
|
+
*/
|
|
132
|
+
const svelte_extract_bindable_props = (virtual_source) => {
|
|
133
|
+
const bindable_props = new Set();
|
|
134
|
+
// Search for __sveltets_$$bindings call
|
|
135
|
+
function visit(node) {
|
|
136
|
+
if (ts.isCallExpression(node)) {
|
|
137
|
+
const expr = node.expression;
|
|
138
|
+
if (ts.isIdentifier(expr) && expr.text === '__sveltets_$$bindings') {
|
|
139
|
+
// Extract string literal arguments
|
|
140
|
+
for (const arg of node.arguments) {
|
|
141
|
+
if (ts.isStringLiteral(arg)) {
|
|
142
|
+
bindable_props.add(arg.text);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
ts.forEachChild(node, visit);
|
|
148
|
+
}
|
|
149
|
+
visit(virtual_source);
|
|
150
|
+
return bindable_props;
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* Extract props from a type node (handles type literals and intersection types).
|
|
154
|
+
*
|
|
155
|
+
* @mutates props - adds extracted prop info to the array
|
|
156
|
+
*/
|
|
157
|
+
const svelte_extract_props_from_type = (type_node, virtual_source, checker, bindable_props, props) => {
|
|
158
|
+
if (ts.isTypeLiteralNode(type_node)) {
|
|
159
|
+
// Handle direct type literal: { prop1: type1, prop2: type2 }
|
|
160
|
+
for (const member of type_node.members) {
|
|
161
|
+
if (ts.isPropertySignature(member)) {
|
|
162
|
+
const prop_info = svelte_extract_prop_from_member(member, virtual_source, checker);
|
|
163
|
+
if (prop_info) {
|
|
164
|
+
// Mark as bindable if found in bindings
|
|
165
|
+
if (bindable_props.has(prop_info.name)) {
|
|
166
|
+
prop_info.bindable = true;
|
|
167
|
+
}
|
|
168
|
+
props.push(prop_info);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
else if (ts.isIntersectionTypeNode(type_node)) {
|
|
174
|
+
// Handle intersection type: TypeA & TypeB & { prop: type }
|
|
175
|
+
for (const type_part of type_node.types) {
|
|
176
|
+
svelte_extract_props_from_type(type_part, virtual_source, checker, bindable_props, props);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Skip other type references like SvelteHTMLElements['details'] since we can't easily resolve them
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* Extract props from svelte2tsx transformed output.
|
|
183
|
+
*
|
|
184
|
+
* svelte2tsx generates a `$$ComponentProps` type alias containing the component props.
|
|
185
|
+
* This function extracts prop metadata from that type.
|
|
186
|
+
*/
|
|
187
|
+
const svelte_extract_props = (virtual_source, checker) => {
|
|
188
|
+
const props = [];
|
|
189
|
+
const bindable_props = svelte_extract_bindable_props(virtual_source);
|
|
190
|
+
// Look for $$ComponentProps type alias or Props interface
|
|
191
|
+
ts.forEachChild(virtual_source, (node) => {
|
|
192
|
+
// Check for type alias ($$ComponentProps)
|
|
193
|
+
if (ts.isTypeAliasDeclaration(node) && node.name.text === '$$ComponentProps') {
|
|
194
|
+
svelte_extract_props_from_type(node.type, virtual_source, checker, bindable_props, props);
|
|
195
|
+
}
|
|
196
|
+
// Also check for Props interface (fallback/older format)
|
|
197
|
+
else if (ts.isInterfaceDeclaration(node) && node.name.text === 'Props') {
|
|
198
|
+
for (const member of node.members) {
|
|
199
|
+
if (ts.isPropertySignature(member)) {
|
|
200
|
+
const prop_info = svelte_extract_prop_from_member(member, virtual_source, checker);
|
|
201
|
+
if (prop_info) {
|
|
202
|
+
// Mark as bindable if found in bindings
|
|
203
|
+
if (bindable_props.has(prop_info.name)) {
|
|
204
|
+
prop_info.bindable = true;
|
|
205
|
+
}
|
|
206
|
+
props.push(prop_info);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
return props;
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* Analyze a Svelte component file from disk.
|
|
216
|
+
*
|
|
217
|
+
* This is a high-level function that handles the complete workflow:
|
|
218
|
+
* 1. Read the Svelte source from disk
|
|
219
|
+
* 2. Transform to TypeScript via svelte2tsx
|
|
220
|
+
* 3. Extract component metadata (props, documentation)
|
|
221
|
+
*
|
|
222
|
+
* Suitable for use in documentation generators, build tools, and analysis.
|
|
223
|
+
*
|
|
224
|
+
* @param file_path Absolute path to the .svelte file
|
|
225
|
+
* @param module_path Module path relative to src/lib (e.g., 'Alert.svelte')
|
|
226
|
+
* @param checker TypeScript type checker for type resolution
|
|
227
|
+
* @returns Complete declaration metadata for the component
|
|
228
|
+
*/
|
|
229
|
+
export const svelte_analyze_file = (file_path, module_path, checker) => {
|
|
230
|
+
const svelte_source = readFileSync(file_path, 'utf-8');
|
|
231
|
+
// Check if component uses TypeScript
|
|
232
|
+
const is_ts_file = svelte_source.includes('lang="ts"');
|
|
233
|
+
// Transform Svelte to TS
|
|
234
|
+
const ts_result = svelte2tsx(svelte_source, {
|
|
235
|
+
filename: file_path,
|
|
236
|
+
isTsFile: is_ts_file,
|
|
237
|
+
emitOnTemplateError: true, // Handle malformed templates gracefully
|
|
238
|
+
});
|
|
239
|
+
// Get component name from filename
|
|
240
|
+
const component_name = module_get_component_name(module_path);
|
|
241
|
+
// Create a temporary source file from the original Svelte content for JSDoc extraction
|
|
242
|
+
const temp_source = ts.createSourceFile(file_path, svelte_source, ts.ScriptTarget.Latest, true);
|
|
243
|
+
// Analyze the component using the existing lower-level function
|
|
244
|
+
return svelte_analyze_component(ts_result.code, temp_source, checker, component_name);
|
|
245
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type ColorScheme, type Theme } from '@fuzdev/fuz_css/theme.js';
|
|
2
|
+
export declare class Themer {
|
|
3
|
+
theme: Theme;
|
|
4
|
+
color_scheme: ColorScheme;
|
|
5
|
+
constructor(theme?: Theme, color_scheme?: ColorScheme);
|
|
6
|
+
toJSON(): ThemerJson;
|
|
7
|
+
}
|
|
8
|
+
export interface ThemerJson {
|
|
9
|
+
theme: Theme;
|
|
10
|
+
color_scheme: ColorScheme;
|
|
11
|
+
}
|
|
12
|
+
export declare const themer_context: {
|
|
13
|
+
get: (error_message?: string) => Themer;
|
|
14
|
+
get_maybe: () => Themer | undefined;
|
|
15
|
+
set: (value: Themer) => Themer;
|
|
16
|
+
};
|
|
17
|
+
export declare const sync_color_scheme: (color_scheme: ColorScheme | null) => void;
|
|
18
|
+
export declare const COLOR_SCHEME_STORAGE_KEY = "fuz:color-scheme";
|
|
19
|
+
export declare const THEME_STORAGE_KEY = "fuz:theme";
|
|
20
|
+
export declare const save_color_scheme: (color_scheme: ColorScheme | null, key?: string) => void;
|
|
21
|
+
export declare const load_color_scheme: (fallback?: ColorScheme, key?: string) => ColorScheme;
|
|
22
|
+
export declare const save_theme: (theme: Theme | null, key?: string) => void;
|
|
23
|
+
export declare const load_theme: (fallback?: Theme, key?: string) => Theme;
|
|
24
|
+
//# sourceMappingURL=themer.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"themer.svelte.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/themer.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,WAAW,EAAE,KAAK,KAAK,EAAC,MAAM,0BAA0B,CAAC;AAOrF,qBAAa,MAAM;IAClB,KAAK,EAAE,KAAK,CAAa;IACzB,YAAY,EAAE,WAAW,CAAa;gBAE1B,KAAK,GAAE,KAA0B,EAAE,YAAY,GAAE,WAAoB;IAQjF,MAAM,IAAI,UAAU;CAMpB;AAED,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,WAAW,CAAC;CAC1B;AAED,eAAO,MAAM,cAAc;;;;CAA2B,CAAC;AAEvD,eAAO,MAAM,iBAAiB,GAAI,cAAc,WAAW,GAAG,IAAI,KAAG,IAOpE,CAAC;AAEF,eAAO,MAAM,wBAAwB,qBAAqB,CAAC;AAC3D,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAE7C,eAAO,MAAM,iBAAiB,GAC7B,cAAc,WAAW,GAAG,IAAI,EAChC,YAA8B,KAC5B,IAEF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC7B,WAAU,WAAoB,EAC9B,YAA8B,KAC5B,WAA4E,CAAC;AAEhF,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,GAAG,IAAI,EAAE,YAAuB,KAAG,IAEzE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,WAAU,KAA0B,EAAE,YAAuB,KAAG,KAC3C,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { color_schemes } from '@fuzdev/fuz_css/theme.js';
|
|
2
|
+
import { default_themes } from '@fuzdev/fuz_css/themes.js';
|
|
3
|
+
import { BROWSER } from 'esm-env';
|
|
4
|
+
import { create_context } from './context_helpers.js';
|
|
5
|
+
import { load_from_storage, save_to_storage } from './storage.js';
|
|
6
|
+
export class Themer {
|
|
7
|
+
theme = $state();
|
|
8
|
+
color_scheme = $state();
|
|
9
|
+
constructor(theme = default_themes[0], color_scheme = 'auto') {
|
|
10
|
+
if (parse_color_scheme(color_scheme) === null) {
|
|
11
|
+
throw Error('unknown color scheme: ' + color_scheme);
|
|
12
|
+
}
|
|
13
|
+
this.theme = theme;
|
|
14
|
+
this.color_scheme = color_scheme; // TODO `resolved_color_scheme` if auto? users could then do different things based on the final value - would not be added to `ThemerJson`
|
|
15
|
+
}
|
|
16
|
+
toJSON() {
|
|
17
|
+
return {
|
|
18
|
+
theme: this.theme,
|
|
19
|
+
color_scheme: this.color_scheme,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export const themer_context = create_context();
|
|
24
|
+
export const sync_color_scheme = (color_scheme) => {
|
|
25
|
+
if (!BROWSER)
|
|
26
|
+
return;
|
|
27
|
+
const dark = color_scheme === 'dark' ||
|
|
28
|
+
(color_scheme !== 'light' && matchMedia('(prefers-color-scheme: dark)').matches);
|
|
29
|
+
document.documentElement.classList.add(dark ? 'dark' : 'light');
|
|
30
|
+
document.documentElement.classList.remove(dark ? 'light' : 'dark');
|
|
31
|
+
};
|
|
32
|
+
export const COLOR_SCHEME_STORAGE_KEY = 'fuz:color-scheme';
|
|
33
|
+
export const THEME_STORAGE_KEY = 'fuz:theme';
|
|
34
|
+
export const save_color_scheme = (color_scheme, key = COLOR_SCHEME_STORAGE_KEY) => {
|
|
35
|
+
save_to_storage(key, color_scheme);
|
|
36
|
+
};
|
|
37
|
+
export const load_color_scheme = (fallback = 'auto', key = COLOR_SCHEME_STORAGE_KEY) => load_from_storage(key, false, parse_color_scheme) ?? fallback;
|
|
38
|
+
export const save_theme = (theme, key = THEME_STORAGE_KEY) => {
|
|
39
|
+
save_to_storage(key, theme, true);
|
|
40
|
+
};
|
|
41
|
+
export const load_theme = (fallback = default_themes[0], key = THEME_STORAGE_KEY) => load_from_storage(key, true) ?? fallback; // TODO use `parse_theme` from moss
|
|
42
|
+
// TODO move to moss
|
|
43
|
+
const parse_color_scheme = (value) => color_schemes.includes(value) ? value : null;
|
package/dist/tome.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Component } from 'svelte';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export declare const Tome: z.ZodObject<{
|
|
4
|
+
name: z.ZodString;
|
|
5
|
+
category: z.ZodString;
|
|
6
|
+
Component: z.ZodCustom<Component<any, any, string>, Component<any, any, string>>;
|
|
7
|
+
related_tomes: z.ZodArray<z.ZodString>;
|
|
8
|
+
related_modules: z.ZodArray<z.ZodString>;
|
|
9
|
+
related_declarations: z.ZodArray<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
export type Tome = z.infer<typeof Tome>;
|
|
12
|
+
export declare const to_tome_pathname: (item: Tome | string, docs_path?: string, hash?: string) => string;
|
|
13
|
+
export declare const tomes_context: {
|
|
14
|
+
get: (error_message?: string) => Map<string, {
|
|
15
|
+
name: string;
|
|
16
|
+
category: string;
|
|
17
|
+
Component: Component<any, any, string>;
|
|
18
|
+
related_tomes: string[];
|
|
19
|
+
related_modules: string[];
|
|
20
|
+
related_declarations: string[];
|
|
21
|
+
}>;
|
|
22
|
+
get_maybe: () => Map<string, {
|
|
23
|
+
name: string;
|
|
24
|
+
category: string;
|
|
25
|
+
Component: Component<any, any, string>;
|
|
26
|
+
related_tomes: string[];
|
|
27
|
+
related_modules: string[];
|
|
28
|
+
related_declarations: string[];
|
|
29
|
+
}> | undefined;
|
|
30
|
+
set: (value: Map<string, {
|
|
31
|
+
name: string;
|
|
32
|
+
category: string;
|
|
33
|
+
Component: Component<any, any, string>;
|
|
34
|
+
related_tomes: string[];
|
|
35
|
+
related_modules: string[];
|
|
36
|
+
related_declarations: string[];
|
|
37
|
+
}>) => Map<string, {
|
|
38
|
+
name: string;
|
|
39
|
+
category: string;
|
|
40
|
+
Component: Component<any, any, string>;
|
|
41
|
+
related_tomes: string[];
|
|
42
|
+
related_modules: string[];
|
|
43
|
+
related_declarations: string[];
|
|
44
|
+
}>;
|
|
45
|
+
};
|
|
46
|
+
export declare const get_tome_by_name: (name: string) => Tome;
|
|
47
|
+
export declare const tome_context: {
|
|
48
|
+
get: (error_message?: string) => {
|
|
49
|
+
name: string;
|
|
50
|
+
category: string;
|
|
51
|
+
Component: Component<any, any, string>;
|
|
52
|
+
related_tomes: string[];
|
|
53
|
+
related_modules: string[];
|
|
54
|
+
related_declarations: string[];
|
|
55
|
+
};
|
|
56
|
+
get_maybe: () => {
|
|
57
|
+
name: string;
|
|
58
|
+
category: string;
|
|
59
|
+
Component: Component<any, any, string>;
|
|
60
|
+
related_tomes: string[];
|
|
61
|
+
related_modules: string[];
|
|
62
|
+
related_declarations: string[];
|
|
63
|
+
} | undefined;
|
|
64
|
+
set: (value: {
|
|
65
|
+
name: string;
|
|
66
|
+
category: string;
|
|
67
|
+
Component: Component<any, any, string>;
|
|
68
|
+
related_tomes: string[];
|
|
69
|
+
related_modules: string[];
|
|
70
|
+
related_declarations: string[];
|
|
71
|
+
}) => {
|
|
72
|
+
name: string;
|
|
73
|
+
category: string;
|
|
74
|
+
Component: Component<any, any, string>;
|
|
75
|
+
related_tomes: string[];
|
|
76
|
+
related_modules: string[];
|
|
77
|
+
related_declarations: string[];
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=tome.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tome.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/tome.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAKtB,eAAO,MAAM,IAAI;;;;;;;iBAQf,CAAC;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AAExC,eAAO,MAAM,gBAAgB,GAC5B,MAAM,IAAI,GAAG,MAAM,EACnB,kBAA6B,EAC7B,OAAO,MAAM,KACX,MAIF,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAsC,CAAC;AAEjE,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,KAAG,IAK/C,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAyB,CAAC"}
|
package/dist/tome.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { resolve } from '$app/paths';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { create_context } from './context_helpers.js';
|
|
4
|
+
import { DOCS_PATH_DEFAULT, docs_slugify } from './docs_helpers.svelte.js';
|
|
5
|
+
export const Tome = z.object({
|
|
6
|
+
name: z.string(),
|
|
7
|
+
// TODO maybe now this makes sense with mdz? summary: z.string(),
|
|
8
|
+
category: z.string(),
|
|
9
|
+
Component: z.custom(),
|
|
10
|
+
related_tomes: z.array(z.string()),
|
|
11
|
+
related_modules: z.array(z.string()),
|
|
12
|
+
related_declarations: z.array(z.string()),
|
|
13
|
+
});
|
|
14
|
+
export const to_tome_pathname = (item, docs_path = DOCS_PATH_DEFAULT, hash) => {
|
|
15
|
+
const name = typeof item === 'string' ? item : item.name;
|
|
16
|
+
const path = docs_path + '/' + docs_slugify(name);
|
|
17
|
+
return resolve((hash ? path + '#' + hash : path));
|
|
18
|
+
};
|
|
19
|
+
export const tomes_context = create_context();
|
|
20
|
+
export const get_tome_by_name = (name) => {
|
|
21
|
+
const tomes = tomes_context.get();
|
|
22
|
+
const tome = tomes.get(name);
|
|
23
|
+
if (!tome)
|
|
24
|
+
throw Error(`unable to find tome "${name}"`);
|
|
25
|
+
return tome;
|
|
26
|
+
};
|
|
27
|
+
export const tome_context = create_context();
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript compiler API helpers for extracting metadata from source code.
|
|
3
|
+
*
|
|
4
|
+
* All functions are prefixed with `ts_` for clarity.
|
|
5
|
+
*/
|
|
6
|
+
import ts from 'typescript';
|
|
7
|
+
import type { DeclarationJson, DeclarationKind } from '@fuzdev/fuz_util/source_json.js';
|
|
8
|
+
import { tsdoc_parse } from './tsdoc_helpers.js';
|
|
9
|
+
/**
|
|
10
|
+
* Infer declaration kind from symbol and node.
|
|
11
|
+
*/
|
|
12
|
+
export declare const ts_infer_declaration_kind: (symbol: ts.Symbol, node: ts.Node) => DeclarationKind;
|
|
13
|
+
/**
|
|
14
|
+
* Extract function/method information including parameters
|
|
15
|
+
* with descriptions and default values.
|
|
16
|
+
*
|
|
17
|
+
* @mutates declaration - adds type_signature, return_type, return_description, throws, since, parameters, generic_params
|
|
18
|
+
*/
|
|
19
|
+
export declare const ts_extract_function_info: (node: ts.Node, symbol: ts.Symbol, checker: ts.TypeChecker, declaration: DeclarationJson, tsdoc: ReturnType<typeof tsdoc_parse>) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Extract type/interface information with rich property metadata.
|
|
22
|
+
*
|
|
23
|
+
* @mutates declaration - adds type_signature, generic_params, extends, properties
|
|
24
|
+
*/
|
|
25
|
+
export declare const ts_extract_type_info: (node: ts.Node, _symbol: ts.Symbol, checker: ts.TypeChecker, declaration: DeclarationJson) => void;
|
|
26
|
+
/**
|
|
27
|
+
* Extract class information with rich member metadata.
|
|
28
|
+
*
|
|
29
|
+
* @mutates declaration - adds extends, implements, generic_params, members
|
|
30
|
+
*/
|
|
31
|
+
export declare const ts_extract_class_info: (node: ts.Node, _symbol: ts.Symbol, checker: ts.TypeChecker, declaration: DeclarationJson) => void;
|
|
32
|
+
/**
|
|
33
|
+
* Extract variable information.
|
|
34
|
+
*
|
|
35
|
+
* @mutates declaration - adds type_signature
|
|
36
|
+
*/
|
|
37
|
+
export declare const ts_extract_variable_info: (node: ts.Node, symbol: ts.Symbol, checker: ts.TypeChecker, declaration: DeclarationJson) => void;
|
|
38
|
+
/**
|
|
39
|
+
* Result of analyzing a single declaration.
|
|
40
|
+
*/
|
|
41
|
+
export interface TsDeclarationAnalysis {
|
|
42
|
+
/** The analyzed declaration metadata. */
|
|
43
|
+
declaration: DeclarationJson;
|
|
44
|
+
/** Whether the declaration is marked @nodocs (should be excluded from documentation). */
|
|
45
|
+
nodocs: boolean;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Analyze a TypeScript symbol and extract rich metadata.
|
|
49
|
+
*
|
|
50
|
+
* This is a high-level function that combines TSDoc parsing with TypeScript
|
|
51
|
+
* type analysis to produce complete declaration metadata. Suitable for use
|
|
52
|
+
* in documentation generators, IDE integrations, and other tooling.
|
|
53
|
+
*
|
|
54
|
+
* @param symbol The TypeScript symbol to analyze
|
|
55
|
+
* @param source_file The source file containing the symbol
|
|
56
|
+
* @param checker The TypeScript type checker
|
|
57
|
+
* @returns Complete declaration metadata including docs, types, and parameters, plus nodocs flag
|
|
58
|
+
*/
|
|
59
|
+
export declare const ts_analyze_declaration: (symbol: ts.Symbol, source_file: ts.SourceFile, checker: ts.TypeChecker) => TsDeclarationAnalysis;
|
|
60
|
+
/**
|
|
61
|
+
* Information about a same-name re-export.
|
|
62
|
+
* Used for post-processing to build `also_exported_from` arrays.
|
|
63
|
+
*/
|
|
64
|
+
export interface ReExportInfo {
|
|
65
|
+
/** Name of the re-exported declaration. */
|
|
66
|
+
name: string;
|
|
67
|
+
/** Module path (relative to src/lib) where the declaration is originally declared. */
|
|
68
|
+
original_module: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Result of analyzing a module's exports.
|
|
72
|
+
*/
|
|
73
|
+
export interface ModuleExportsAnalysis {
|
|
74
|
+
/** Module-level documentation comment. */
|
|
75
|
+
module_comment?: string;
|
|
76
|
+
/** All exported declarations with their metadata (excludes same-name re-exports). */
|
|
77
|
+
declarations: Array<DeclarationJson>;
|
|
78
|
+
/** Same-name re-exports (for building also_exported_from in post-processing). */
|
|
79
|
+
re_exports: Array<ReExportInfo>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Analyze all exports from a TypeScript source file.
|
|
83
|
+
*
|
|
84
|
+
* Extracts the module-level comment and all exported declarations with
|
|
85
|
+
* complete metadata. Handles re-exports by:
|
|
86
|
+
* - Same-name re-exports: tracked in `re_exports` for `also_exported_from` building
|
|
87
|
+
* - Renamed re-exports: included as new declarations with `alias_of` metadata
|
|
88
|
+
*
|
|
89
|
+
* This is a high-level function suitable for building documentation, API explorers, or analysis tools.
|
|
90
|
+
*
|
|
91
|
+
* @param source_file The TypeScript source file to analyze
|
|
92
|
+
* @param checker The TypeScript type checker
|
|
93
|
+
* @returns Module comment, array of analyzed declarations, and re-export information
|
|
94
|
+
*/
|
|
95
|
+
export declare const ts_analyze_module_exports: (source_file: ts.SourceFile, checker: ts.TypeChecker) => ModuleExportsAnalysis;
|
|
96
|
+
/**
|
|
97
|
+
* Extract module-level comment.
|
|
98
|
+
*
|
|
99
|
+
* Only accepts JSDoc/TSDoc comments (`/** ... *\/`) followed by a blank line to distinguish
|
|
100
|
+
* them from identifier-level comments. This prevents accidentally treating function/class
|
|
101
|
+
* comments as module comments. Module comments can appear after imports.
|
|
102
|
+
*/
|
|
103
|
+
export declare const ts_extract_module_comment: (source_file: ts.SourceFile) => string | undefined;
|
|
104
|
+
/**
|
|
105
|
+
* Create TypeScript program for analysis.
|
|
106
|
+
*/
|
|
107
|
+
export declare const ts_create_program: (log: {
|
|
108
|
+
warn: (message: string) => void;
|
|
109
|
+
}) => ts.Program | null;
|
|
110
|
+
//# sourceMappingURL=ts_helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ts_helpers.d.ts","sourceRoot":"../src/lib/","sources":["../src/lib/ts_helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EACX,eAAe,EAEf,eAAe,EACf,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAC,WAAW,EAA6B,MAAM,oBAAoB,CAAC;AA0C3E;;GAEG;AACH,eAAO,MAAM,yBAAyB,GAAI,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,IAAI,KAAG,eAsB5E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACpC,MAAM,EAAE,CAAC,IAAI,EACb,QAAQ,EAAE,CAAC,MAAM,EACjB,SAAS,EAAE,CAAC,WAAW,EACvB,aAAa,eAAe,EAC5B,OAAO,UAAU,CAAC,OAAO,WAAW,CAAC,KACnC,IA4DF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAChC,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,MAAM,EAClB,SAAS,EAAE,CAAC,WAAW,EACvB,aAAa,eAAe,KAC1B,IAoDF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GACjC,MAAM,EAAE,CAAC,IAAI,EACb,SAAS,EAAE,CAAC,MAAM,EAClB,SAAS,EAAE,CAAC,WAAW,EACvB,aAAa,eAAe,KAC1B,IA+IF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GACpC,MAAM,EAAE,CAAC,IAAI,EACb,QAAQ,EAAE,CAAC,MAAM,EACjB,SAAS,EAAE,CAAC,WAAW,EACvB,aAAa,eAAe,KAC1B,IAOF,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACrC,yCAAyC;IACzC,WAAW,EAAE,eAAe,CAAC;IAC7B,yFAAyF;IACzF,MAAM,EAAE,OAAO,CAAC;CAChB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,GAClC,QAAQ,EAAE,CAAC,MAAM,EACjB,aAAa,EAAE,CAAC,UAAU,EAC1B,SAAS,EAAE,CAAC,WAAW,KACrB,qBAsCF,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC5B,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,eAAe,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACrC,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IACrC,iFAAiF;IACjF,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;CAChC;AAED;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,yBAAyB,GACrC,aAAa,EAAE,CAAC,UAAU,EAC1B,SAAS,EAAE,CAAC,WAAW,KACrB,qBAqEF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,GAAI,aAAa,EAAE,CAAC,UAAU,KAAG,MAAM,GAAG,SA8C/E,CAAC;AAuBF;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAI,KAAK;IAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CAAC,KAAG,EAAE,CAAC,OAAO,GAAG,IAWvF,CAAC"}
|