@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,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build-time helpers for library metadata generation.
|
|
3
|
+
*
|
|
4
|
+
* These functions handle Gro-specific concerns like file collection and dependency
|
|
5
|
+
* graph extraction. Core analysis logic has been extracted to reusable helpers:
|
|
6
|
+
*
|
|
7
|
+
* - `ts_helpers.ts` - `ts_analyze_module_exports`
|
|
8
|
+
* - `svelte_helpers.ts` - `svelte_analyze_file`
|
|
9
|
+
* - `module_helpers.ts` - path utilities and source detection
|
|
10
|
+
*
|
|
11
|
+
* Design philosophy: Fail fast with clear errors rather than silently producing invalid
|
|
12
|
+
* metadata. All validation errors halt the build immediately with actionable messages.
|
|
13
|
+
*
|
|
14
|
+
* @see library_gen.ts for the main generation task
|
|
15
|
+
* @see @fuzdev/fuz_util/source_json.js for type definitions
|
|
16
|
+
* @see ts_helpers.ts for reusable TypeScript analysis
|
|
17
|
+
* @see svelte_helpers.ts for reusable Svelte component analysis
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import type {PackageJson} from '@fuzdev/fuz_util/package_json.js';
|
|
21
|
+
import type {Logger} from '@fuzdev/fuz_util/log.js';
|
|
22
|
+
import type {ModuleJson, SourceJson} from '@fuzdev/fuz_util/source_json.js';
|
|
23
|
+
import {library_json_parse, type LibraryJson} from '@fuzdev/fuz_util/library_json.js';
|
|
24
|
+
import type {Disknode} from '@ryanatkn/gro/disknode.js';
|
|
25
|
+
import type ts from 'typescript';
|
|
26
|
+
import type {PathId} from '@fuzdev/fuz_util/path.js';
|
|
27
|
+
|
|
28
|
+
import {ts_analyze_module_exports, type ReExportInfo} from './ts_helpers.js';
|
|
29
|
+
import {svelte_analyze_file} from './svelte_helpers.js';
|
|
30
|
+
import {
|
|
31
|
+
module_extract_path,
|
|
32
|
+
module_is_typescript,
|
|
33
|
+
module_is_svelte,
|
|
34
|
+
module_matches_source,
|
|
35
|
+
} from './module_helpers.js';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Result of analyzing a TypeScript file.
|
|
39
|
+
* Includes both the module metadata and re-export information for post-processing.
|
|
40
|
+
*/
|
|
41
|
+
export interface TsFileAnalysis {
|
|
42
|
+
/** Module metadata for inclusion in source_json. */
|
|
43
|
+
module: ModuleJson;
|
|
44
|
+
/** Re-exports from this module for building also_exported_from. */
|
|
45
|
+
re_exports: Array<ReExportInfo>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Validates that no declaration names are duplicated across modules.
|
|
50
|
+
* The flat namespace is intentional - duplicates should fail fast.
|
|
51
|
+
*
|
|
52
|
+
* @throws Error if duplicate declaration names are found
|
|
53
|
+
*/
|
|
54
|
+
export const library_gen_validate_no_duplicates = (source_json: SourceJson, log: Logger): void => {
|
|
55
|
+
const declaration_locations: Map<string, Array<{module: string; kind: string}>> = new Map();
|
|
56
|
+
|
|
57
|
+
// Collect all declaration names and their locations
|
|
58
|
+
for (const mod of source_json.modules ?? []) {
|
|
59
|
+
for (const declaration of mod.declarations ?? []) {
|
|
60
|
+
const name = declaration.name;
|
|
61
|
+
if (!declaration_locations.has(name)) {
|
|
62
|
+
declaration_locations.set(name, []);
|
|
63
|
+
}
|
|
64
|
+
declaration_locations.get(name)!.push({
|
|
65
|
+
module: mod.path,
|
|
66
|
+
kind: declaration.kind,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Check for duplicates
|
|
72
|
+
const duplicates: Array<{name: string; locations: Array<{module: string; kind: string}>}> = [];
|
|
73
|
+
for (const [name, locations] of declaration_locations.entries()) {
|
|
74
|
+
if (locations.length > 1) {
|
|
75
|
+
duplicates.push({name, locations});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
if (duplicates.length > 0) {
|
|
80
|
+
log.error('Duplicate declaration names detected in flat namespace:');
|
|
81
|
+
for (const {name, locations} of duplicates) {
|
|
82
|
+
log.error(` "${name}" found in:`);
|
|
83
|
+
for (const {module, kind} of locations) {
|
|
84
|
+
log.error(` - ${module} (${kind})`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
throw new Error(
|
|
88
|
+
`Found ${duplicates.length} duplicate declaration name${duplicates.length === 1 ? '' : 's'} across modules. ` +
|
|
89
|
+
'The flat namespace requires unique names. To resolve: ' +
|
|
90
|
+
'(1) rename one of the conflicting declarations, or ' +
|
|
91
|
+
'(2) add /** @nodocs */ to exclude from documentation. ' +
|
|
92
|
+
'See CLAUDE.md "Declaration namespacing" section for details.',
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Sort modules alphabetically by path for deterministic output and cleaner diffs.
|
|
99
|
+
*/
|
|
100
|
+
export const library_gen_sort_modules = (modules: Array<ModuleJson>): Array<ModuleJson> => {
|
|
101
|
+
return modules.slice().sort((a, b) => a.path.localeCompare(b.path));
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Generate the library.ts file content with library_json export.
|
|
106
|
+
* Parses at generation time so runtime only needs the pre-computed result.
|
|
107
|
+
*/
|
|
108
|
+
export const library_gen_generate_ts = (
|
|
109
|
+
package_json: PackageJson,
|
|
110
|
+
source_json: SourceJson,
|
|
111
|
+
): string => {
|
|
112
|
+
const is_this_belt = package_json.name === '@fuzdev/fuz_util';
|
|
113
|
+
const banner = `// generated by library.gen.ts !! do not edit directly or risk lost data`;
|
|
114
|
+
|
|
115
|
+
// Parse at generation time, not runtime
|
|
116
|
+
const library_json: LibraryJson = library_json_parse(package_json, source_json);
|
|
117
|
+
|
|
118
|
+
return `${banner}
|
|
119
|
+
|
|
120
|
+
import type {LibraryJson} from '${is_this_belt ? './library_json.js' : '@fuzdev/fuz_util/library_json.js'}';
|
|
121
|
+
|
|
122
|
+
export const library_json: LibraryJson = ${stringify(library_json)};
|
|
123
|
+
|
|
124
|
+
${banner}
|
|
125
|
+
`;
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const stringify = (v: unknown): string => JSON.stringify(v, null, '\t');
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Collect and filter source files from filer.
|
|
132
|
+
*
|
|
133
|
+
* Returns disknodes for TypeScript/JS files and Svelte components from src/lib, excluding test files.
|
|
134
|
+
* Returns an empty array with a warning if no source files are found.
|
|
135
|
+
*/
|
|
136
|
+
export const library_gen_collect_source_files = (
|
|
137
|
+
files: Map<PathId, Disknode>,
|
|
138
|
+
log: Logger,
|
|
139
|
+
): Array<Disknode> => {
|
|
140
|
+
log.info(`filer has ${files.size} files total`);
|
|
141
|
+
|
|
142
|
+
const source_disknodes: Array<Disknode> = [];
|
|
143
|
+
for (const [id, disknode] of files.entries()) {
|
|
144
|
+
if (module_matches_source(id)) {
|
|
145
|
+
// Include TypeScript/JS files and Svelte components
|
|
146
|
+
if (module_is_typescript(id) || module_is_svelte(id)) {
|
|
147
|
+
source_disknodes.push(disknode);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
log.info(`found ${source_disknodes.length} source files to analyze`);
|
|
153
|
+
|
|
154
|
+
if (source_disknodes.length === 0) {
|
|
155
|
+
log.warn('No source files found in src/lib - generating empty library metadata');
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Sort for deterministic output (stable alphabetical module ordering)
|
|
160
|
+
source_disknodes.sort((a, b) => a.id.localeCompare(b.id));
|
|
161
|
+
|
|
162
|
+
return source_disknodes;
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Analyze a Svelte component file and extract metadata.
|
|
167
|
+
*
|
|
168
|
+
* Uses `svelte_analyze_file` for core analysis, then adds
|
|
169
|
+
* Gro-specific dependency information from the disknode.
|
|
170
|
+
*/
|
|
171
|
+
export const library_gen_analyze_svelte_file = (
|
|
172
|
+
disknode: Disknode,
|
|
173
|
+
module_path: string,
|
|
174
|
+
checker: ts.TypeChecker,
|
|
175
|
+
): ModuleJson => {
|
|
176
|
+
// Use the extracted helper for core analysis
|
|
177
|
+
const declaration_json = svelte_analyze_file(disknode.id, module_path, checker);
|
|
178
|
+
|
|
179
|
+
// Extract dependencies and dependents (Gro-specific)
|
|
180
|
+
const {dependencies, dependents} = library_gen_extract_dependencies(disknode);
|
|
181
|
+
|
|
182
|
+
return {
|
|
183
|
+
path: module_path,
|
|
184
|
+
declarations: [declaration_json],
|
|
185
|
+
dependencies: dependencies.length > 0 ? dependencies : undefined,
|
|
186
|
+
dependents: dependents.length > 0 ? dependents : undefined,
|
|
187
|
+
};
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Analyze a TypeScript file and extract all declarations.
|
|
192
|
+
*
|
|
193
|
+
* Uses `ts_analyze_module_exports` for core analysis, then adds
|
|
194
|
+
* Gro-specific dependency information from the disknode.
|
|
195
|
+
*
|
|
196
|
+
* Returns both the module metadata and re-export information for post-processing.
|
|
197
|
+
*/
|
|
198
|
+
export const library_gen_analyze_typescript_file = (
|
|
199
|
+
disknode: Disknode,
|
|
200
|
+
source_file: ts.SourceFile,
|
|
201
|
+
module_path: string,
|
|
202
|
+
checker: ts.TypeChecker,
|
|
203
|
+
): TsFileAnalysis => {
|
|
204
|
+
// Use the extracted helper for core analysis
|
|
205
|
+
const {module_comment, declarations, re_exports} = ts_analyze_module_exports(
|
|
206
|
+
source_file,
|
|
207
|
+
checker,
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
const mod: ModuleJson = {
|
|
211
|
+
path: module_path,
|
|
212
|
+
declarations,
|
|
213
|
+
};
|
|
214
|
+
|
|
215
|
+
if (module_comment) {
|
|
216
|
+
mod.module_comment = module_comment;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Extract dependencies and dependents (Gro-specific)
|
|
220
|
+
const {dependencies, dependents} = library_gen_extract_dependencies(disknode);
|
|
221
|
+
if (dependencies.length > 0) {
|
|
222
|
+
mod.dependencies = dependencies;
|
|
223
|
+
}
|
|
224
|
+
if (dependents.length > 0) {
|
|
225
|
+
mod.dependents = dependents;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return {module: mod, re_exports};
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Extract dependencies and dependents for a module from the filer's dependency graph.
|
|
233
|
+
*
|
|
234
|
+
* Filters to only include source modules from src/lib (excludes external packages, node_modules, tests).
|
|
235
|
+
* Returns sorted arrays of module paths (relative to src/lib) for deterministic output.
|
|
236
|
+
*/
|
|
237
|
+
export const library_gen_extract_dependencies = (
|
|
238
|
+
disknode: Disknode,
|
|
239
|
+
): {dependencies: Array<string>; dependents: Array<string>} => {
|
|
240
|
+
const dependencies: Array<string> = [];
|
|
241
|
+
const dependents: Array<string> = [];
|
|
242
|
+
|
|
243
|
+
// Extract dependencies (files this module imports)
|
|
244
|
+
for (const dep_id of disknode.dependencies.keys()) {
|
|
245
|
+
if (module_matches_source(dep_id)) {
|
|
246
|
+
dependencies.push(module_extract_path(dep_id));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Extract dependents (files that import this module)
|
|
251
|
+
for (const dependent_id of disknode.dependents.keys()) {
|
|
252
|
+
if (module_matches_source(dependent_id)) {
|
|
253
|
+
dependents.push(module_extract_path(dependent_id));
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Sort for deterministic output
|
|
258
|
+
dependencies.sort();
|
|
259
|
+
dependents.sort();
|
|
260
|
+
|
|
261
|
+
return {dependencies, dependents};
|
|
262
|
+
};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import {ensure_end, strip_end, strip_start} from '@fuzdev/fuz_util/string.js';
|
|
2
|
+
import type {PackageJson} from '@fuzdev/fuz_util/package_json.js';
|
|
3
|
+
import {page} from '$app/state';
|
|
4
|
+
|
|
5
|
+
import {DOCS_API_PATH, DOCS_PATH_DEFAULT} from './docs_helpers.svelte.js';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Build project-relative API documentation URL with hash anchor.
|
|
9
|
+
*/
|
|
10
|
+
export const url_api_declaration = (declaration_name: string): string =>
|
|
11
|
+
`${DOCS_API_PATH}#${encodeURIComponent(declaration_name)}`;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Build full API documentation URL with domain and hash anchor.
|
|
15
|
+
*/
|
|
16
|
+
export const url_api_declaration_full = (homepage: string, declaration_name: string): string =>
|
|
17
|
+
`${homepage}${DOCS_PATH_DEFAULT}/api#${encodeURIComponent(declaration_name)}`;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Build project-relative module documentation URL.
|
|
21
|
+
*/
|
|
22
|
+
export const url_api_module = (module_path: string): string => `${DOCS_API_PATH}/${module_path}`;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Build GitHub file URL for a repository.
|
|
26
|
+
*/
|
|
27
|
+
export const url_github_file = (repo_url: string, file_path: string, line?: number): string => {
|
|
28
|
+
const clean_path = file_path.replace(/^\.\//, '');
|
|
29
|
+
const base = `${repo_url}/blob/main/${clean_path}`;
|
|
30
|
+
return line ? `${base}#L${line}` : base;
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Build GitHub organization URL from repo URL and repo name.
|
|
35
|
+
*/
|
|
36
|
+
export const url_github_org = (repo_url: string, repo_name: string): string | null => {
|
|
37
|
+
return repo_url.endsWith('/' + repo_name) ? strip_end(repo_url, '/' + repo_name) : null;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Parse GitHub owner/org name from repository URL.
|
|
42
|
+
*/
|
|
43
|
+
export const github_owner_parse = (repo_url: string): string | null => {
|
|
44
|
+
const stripped = strip_start(repo_url, 'https://github.com/');
|
|
45
|
+
if (stripped === repo_url) return null;
|
|
46
|
+
const parts = stripped.split('/');
|
|
47
|
+
return parts[0] || null;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Build npm package URL.
|
|
52
|
+
*/
|
|
53
|
+
export const url_npm_package = (package_name: string): string =>
|
|
54
|
+
'https://www.npmjs.com/package/' + package_name;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Check if a package is published to npm.
|
|
58
|
+
*/
|
|
59
|
+
export const package_is_published = (package_json: PackageJson): boolean => {
|
|
60
|
+
return !package_json.private && !!package_json.exports && package_json.version !== '0.0.1';
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Build package logo URL with favicon.png fallback.
|
|
65
|
+
*/
|
|
66
|
+
export const url_package_logo = (
|
|
67
|
+
homepage_url: string | null,
|
|
68
|
+
logo_path?: string,
|
|
69
|
+
): string | null => {
|
|
70
|
+
if (!homepage_url) return null;
|
|
71
|
+
const path = logo_path ? strip_start(logo_path, '/') : 'favicon.png';
|
|
72
|
+
return ensure_end(homepage_url, '/') + path;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Extract repository name without scope from package name.
|
|
77
|
+
*/
|
|
78
|
+
export const repo_name_parse = (name: string): string => {
|
|
79
|
+
if (name[0] === '@') {
|
|
80
|
+
const parts = name.split('/');
|
|
81
|
+
if (parts.length < 2) {
|
|
82
|
+
throw new Error(`invalid scoped package name: "${name}" (expected format: @org/package)`);
|
|
83
|
+
}
|
|
84
|
+
return parts[1]!;
|
|
85
|
+
}
|
|
86
|
+
return name;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Parse repository URL from package.json format.
|
|
91
|
+
*/
|
|
92
|
+
export const repo_url_parse = (repository: PackageJson['repository']): string | null => {
|
|
93
|
+
if (!repository) return null;
|
|
94
|
+
const url = typeof repository === 'string' ? repository : repository.url;
|
|
95
|
+
if (!url) return null;
|
|
96
|
+
return strip_end(strip_start(strip_end(url, '.git'), 'git+'), '/');
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Build .well-known URL for package metadata files.
|
|
101
|
+
*/
|
|
102
|
+
export const url_well_known = (homepage_url: string, filename: string): string => {
|
|
103
|
+
return `${ensure_end(homepage_url, '/')}.well-known/${filename}`;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Convert a full URL to root-relative format by removing the origin.
|
|
108
|
+
*/
|
|
109
|
+
export const url_to_root_relative = (url: string, origin: string = page.url.origin): string => {
|
|
110
|
+
const origin_with_slash = ensure_end(origin, '/');
|
|
111
|
+
|
|
112
|
+
if (url === origin || url === origin_with_slash) {
|
|
113
|
+
return '/';
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const stripped = strip_start(url, origin_with_slash);
|
|
117
|
+
|
|
118
|
+
if (stripped === url) {
|
|
119
|
+
return url;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return '/' + stripped;
|
|
123
|
+
};
|