@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,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TSDoc/JSDoc parsing helpers using the TypeScript Compiler API.
|
|
3
|
+
*
|
|
4
|
+
* Provides `tsdoc_parse()` for extracting JSDoc/TSDoc from TypeScript nodes.
|
|
5
|
+
* Primarily designed for build-time code generation but can be used at runtime.
|
|
6
|
+
*
|
|
7
|
+
* ## Design
|
|
8
|
+
*
|
|
9
|
+
* Pure extraction approach: extracts documentation as-is with minimal transformation,
|
|
10
|
+
* preserving source intent. Works around TypeScript Compiler API quirks where needed.
|
|
11
|
+
*
|
|
12
|
+
* Supports both regular TypeScript and Svelte components (via svelte2tsx output).
|
|
13
|
+
*
|
|
14
|
+
* ## Tag support
|
|
15
|
+
*
|
|
16
|
+
* Supports a subset of standard TSDoc tags:
|
|
17
|
+
* `@param`, `@returns`, `@throws`, `@example`, `@deprecated`, `@see`, `@since`, `@nodocs`.
|
|
18
|
+
*
|
|
19
|
+
* The `@nodocs` tag excludes exports from documentation and flat namespace validation.
|
|
20
|
+
* The declaration is still exported and usable, just not documented.
|
|
21
|
+
*
|
|
22
|
+
* Also supports `@mutates` (non-standard) for documenting mutations to parameters or external state.
|
|
23
|
+
* Use format: `@mutates paramName - description of mutation`.
|
|
24
|
+
*
|
|
25
|
+
* Only `@returns` is supported (not `@return`).
|
|
26
|
+
*
|
|
27
|
+
* The `@see` tag supports multiple formats: plain URLs (`https://...`), `{@link}` syntax, and module names.
|
|
28
|
+
* Relative/absolute path support in `@see` is TBD.
|
|
29
|
+
*
|
|
30
|
+
* ## Behavioral notes
|
|
31
|
+
*
|
|
32
|
+
* Due to TS Compiler API limitations:
|
|
33
|
+
* - Preserves dash separator in `@param` descriptions: `@param x desc` → `"- desc"`
|
|
34
|
+
* - `@throws` tags have `{Type}` stripped by TS API; fallback regex extracts first word as error type
|
|
35
|
+
* - TS API strips URL protocols from `@see` tag text; we use `getText()` to preserve original format including `{@link}` syntax
|
|
36
|
+
*
|
|
37
|
+
* All functions are prefixed with `tsdoc_` for clarity.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
import ts from 'typescript';
|
|
41
|
+
import type {DeclarationJson} from '@fuzdev/fuz_util/source_json.js';
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Parsed JSDoc/TSDoc comment with structured metadata.
|
|
45
|
+
*/
|
|
46
|
+
export interface TsdocParsedComment {
|
|
47
|
+
/** Comment text (excluding comment markers) */
|
|
48
|
+
text: string;
|
|
49
|
+
/** Parameter descriptions mapped by parameter name */
|
|
50
|
+
params: Map<string, string>;
|
|
51
|
+
/** Return value description from `@returns` */
|
|
52
|
+
returns?: string;
|
|
53
|
+
/** Thrown errors from `@throws` */
|
|
54
|
+
throws?: Array<{type?: string; description: string}>;
|
|
55
|
+
/** Code examples from `@example` */
|
|
56
|
+
examples?: Array<string>;
|
|
57
|
+
/** Deprecation message from `@deprecated` */
|
|
58
|
+
deprecated_message?: string;
|
|
59
|
+
/** Related references from `@see` */
|
|
60
|
+
see_also?: Array<string>;
|
|
61
|
+
/** Version information from `@since` */
|
|
62
|
+
since?: string;
|
|
63
|
+
/** Mutation documentation from `@mutates` (non-standard) */
|
|
64
|
+
mutates?: Array<string>;
|
|
65
|
+
/** Whether to exclude from documentation. From `@nodocs` tag. */
|
|
66
|
+
nodocs?: boolean;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Convert TSDoc link syntax to mdz-compatible format.
|
|
71
|
+
*
|
|
72
|
+
* Conversions:
|
|
73
|
+
* - `{@link url|text}` → `[text](url)` (markdown link)
|
|
74
|
+
* - `{@link https://...}` → `https://...` (bare URL)
|
|
75
|
+
* - `{@link identifier}` → `` `identifier` `` (backticks)
|
|
76
|
+
* - `@see` variants follow same rules
|
|
77
|
+
*
|
|
78
|
+
* @param content The @see tag content to convert
|
|
79
|
+
*/
|
|
80
|
+
const tsdoc_convert_link_to_mdz = (content: string): string => {
|
|
81
|
+
// Check for {@link ...} or {@see ...} syntax
|
|
82
|
+
const link_match = /^\{@(?:link|see)\s+([^}]+)\}$/.exec(content.trim());
|
|
83
|
+
if (link_match) {
|
|
84
|
+
const inner = link_match[1]!.trim();
|
|
85
|
+
|
|
86
|
+
// Check for pipe separator (custom display text)
|
|
87
|
+
const pipe_index = inner.indexOf('|');
|
|
88
|
+
if (pipe_index !== -1) {
|
|
89
|
+
const reference = inner.slice(0, pipe_index).trim();
|
|
90
|
+
const display_text = inner.slice(pipe_index + 1).trim();
|
|
91
|
+
// Convert to markdown link: [text](url)
|
|
92
|
+
return `[${display_text}](${reference})`;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// No pipe - check if it's a URL or declaration
|
|
96
|
+
if (inner.startsWith('https://') || inner.startsWith('http://')) {
|
|
97
|
+
// Bare URL - return as-is
|
|
98
|
+
return inner;
|
|
99
|
+
} else {
|
|
100
|
+
// Declaration or module - wrap in backticks
|
|
101
|
+
return `\`${inner}\``;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// No {@link} or {@see} syntax - check if it's a bare URL or declaration
|
|
106
|
+
const trimmed = content.trim();
|
|
107
|
+
if (trimmed.startsWith('https://') || trimmed.startsWith('http://')) {
|
|
108
|
+
// Already a bare URL - return as-is
|
|
109
|
+
return trimmed;
|
|
110
|
+
} else {
|
|
111
|
+
// Declaration or module - wrap in backticks
|
|
112
|
+
return `\`${trimmed}\``;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Parse JSDoc comment from a TypeScript node.
|
|
118
|
+
*
|
|
119
|
+
* Extracts and parses all JSDoc tags including:
|
|
120
|
+
*
|
|
121
|
+
* - `@param` - parameter descriptions
|
|
122
|
+
* - `@returns` - return value description
|
|
123
|
+
* - `@throws` - error documentation
|
|
124
|
+
* - `@example` - code examples
|
|
125
|
+
* - `@deprecated` - deprecation warnings
|
|
126
|
+
* - `@see` - related references
|
|
127
|
+
* - `@since` - version information
|
|
128
|
+
* - `@mutates` - mutation documentation (non-standard)
|
|
129
|
+
*
|
|
130
|
+
* @param node The TypeScript node to extract JSDoc from
|
|
131
|
+
* @param source_file Source file (used for extracting full` @see` tag text)
|
|
132
|
+
*/
|
|
133
|
+
export const tsdoc_parse = (
|
|
134
|
+
node: ts.Node,
|
|
135
|
+
source_file: ts.SourceFile,
|
|
136
|
+
): TsdocParsedComment | undefined => {
|
|
137
|
+
const tsdoc_comments = ts.getJSDocCommentsAndTags(node);
|
|
138
|
+
if (tsdoc_comments.length === 0) return undefined;
|
|
139
|
+
|
|
140
|
+
let full_text = '';
|
|
141
|
+
const params: Map<string, string> = new Map();
|
|
142
|
+
let returns: string | undefined;
|
|
143
|
+
const throws: Array<{type?: string; description: string}> = [];
|
|
144
|
+
const examples: Array<string> = [];
|
|
145
|
+
let deprecated_message: string | undefined;
|
|
146
|
+
const see_also: Array<string> = [];
|
|
147
|
+
let since: string | undefined;
|
|
148
|
+
const mutates: Array<string> = [];
|
|
149
|
+
let nodocs = false;
|
|
150
|
+
|
|
151
|
+
// Extract main comment text
|
|
152
|
+
for (const comment of tsdoc_comments) {
|
|
153
|
+
if (ts.isJSDoc(comment) && comment.comment) {
|
|
154
|
+
const text =
|
|
155
|
+
typeof comment.comment === 'string'
|
|
156
|
+
? comment.comment
|
|
157
|
+
: comment.comment.map((c) => c.text).join('');
|
|
158
|
+
full_text += text + '\n';
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Extract tags
|
|
163
|
+
const tags = ts.getJSDocTags(node);
|
|
164
|
+
for (const tag of tags) {
|
|
165
|
+
const tag_text =
|
|
166
|
+
typeof tag.comment === 'string' ? tag.comment : tag.comment?.map((c) => c.text).join('');
|
|
167
|
+
const tag_name = tag.tagName.text;
|
|
168
|
+
|
|
169
|
+
if (tag_name === 'param' && ts.isJSDocParameterTag(tag)) {
|
|
170
|
+
// Extract parameter name and description
|
|
171
|
+
const param_name = ts.isIdentifier(tag.name) ? tag.name.text : tag.name.getText();
|
|
172
|
+
if (param_name && tag_text) {
|
|
173
|
+
params.set(param_name, tag_text.trim());
|
|
174
|
+
}
|
|
175
|
+
} else if (tag_name === 'returns' && tag_text) {
|
|
176
|
+
returns = tag_text.trim();
|
|
177
|
+
} else if (tag_name === 'throws' && tag_text) {
|
|
178
|
+
// Try to extract error type and description
|
|
179
|
+
const match = /^\{?(\w+)\}?\s+(.+)/.exec(tag_text);
|
|
180
|
+
if (match) {
|
|
181
|
+
throws.push({type: match[1], description: match[2]!.trim()});
|
|
182
|
+
} else {
|
|
183
|
+
throws.push({description: tag_text.trim()});
|
|
184
|
+
}
|
|
185
|
+
} else if (tag_name === 'example' && tag_text) {
|
|
186
|
+
examples.push(tag_text.trim());
|
|
187
|
+
} else if (tag_name === 'deprecated' && tag_text) {
|
|
188
|
+
deprecated_message = tag_text.trim();
|
|
189
|
+
} else if (tag_name === 'see') {
|
|
190
|
+
// The TS API strips 'https' from URLs in @see tags, so get full text from source
|
|
191
|
+
const full_tag_text = tag.getText(source_file);
|
|
192
|
+
// Extract content after @see, handling JSDoc formatting artifacts
|
|
193
|
+
const see_content = full_tag_text
|
|
194
|
+
.replace(/^@see\s+/, '') // remove @see prefix
|
|
195
|
+
.replace(/\n\s*\*\s*/g, ' ') // remove JSDoc line continuations
|
|
196
|
+
.trim();
|
|
197
|
+
|
|
198
|
+
if (see_content) {
|
|
199
|
+
// Convert TSDoc link syntax to mdz-compatible format
|
|
200
|
+
see_also.push(tsdoc_convert_link_to_mdz(see_content));
|
|
201
|
+
}
|
|
202
|
+
} else if (tag_name === 'since' && tag_text) {
|
|
203
|
+
since = tag_text.trim();
|
|
204
|
+
} else if (tag_name === 'mutates' && tag_text) {
|
|
205
|
+
mutates.push(tag_text.trim());
|
|
206
|
+
} else if (tag_name === 'nodocs') {
|
|
207
|
+
nodocs = true;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
full_text = full_text.trim();
|
|
212
|
+
|
|
213
|
+
return {
|
|
214
|
+
text: full_text,
|
|
215
|
+
params,
|
|
216
|
+
returns,
|
|
217
|
+
...(throws.length && {throws}),
|
|
218
|
+
...(examples.length && {examples}),
|
|
219
|
+
deprecated_message,
|
|
220
|
+
...(see_also.length && {see_also}),
|
|
221
|
+
since,
|
|
222
|
+
...(mutates.length && {mutates}),
|
|
223
|
+
...(nodocs && {nodocs}),
|
|
224
|
+
};
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Apply parsed TSDoc metadata to a declaration.
|
|
229
|
+
*
|
|
230
|
+
* Consolidates the common pattern of assigning TSDoc fields to declarations,
|
|
231
|
+
* with conditional assignment for array fields (only if non-empty).
|
|
232
|
+
*
|
|
233
|
+
* @param declaration declaration object to update
|
|
234
|
+
* @param tsdoc parsed TSDoc comment (if available)
|
|
235
|
+
* @mutates declaration - adds doc_comment, deprecated_message, examples, see_also, throws, since fields
|
|
236
|
+
*/
|
|
237
|
+
export const tsdoc_apply_to_declaration = (
|
|
238
|
+
declaration: DeclarationJson,
|
|
239
|
+
tsdoc: TsdocParsedComment | undefined,
|
|
240
|
+
): void => {
|
|
241
|
+
if (!tsdoc) return;
|
|
242
|
+
|
|
243
|
+
declaration.doc_comment = tsdoc.text;
|
|
244
|
+
declaration.deprecated_message = tsdoc.deprecated_message;
|
|
245
|
+
|
|
246
|
+
// Only assign arrays if they have content
|
|
247
|
+
if (tsdoc.examples?.length) {
|
|
248
|
+
declaration.examples = tsdoc.examples;
|
|
249
|
+
}
|
|
250
|
+
if (tsdoc.see_also?.length) {
|
|
251
|
+
declaration.see_also = tsdoc.see_also;
|
|
252
|
+
}
|
|
253
|
+
if (tsdoc.throws?.length) {
|
|
254
|
+
declaration.throws = tsdoc.throws;
|
|
255
|
+
}
|
|
256
|
+
if (tsdoc.since) {
|
|
257
|
+
declaration.since = tsdoc.since;
|
|
258
|
+
}
|
|
259
|
+
};
|