@urbicon-ui/docs-gen 6.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +92 -0
- package/dist/cli/CLI.d.ts +10 -0
- package/dist/cli/CLI.d.ts.map +1 -0
- package/dist/cli/CLI.js +340 -0
- package/dist/cli/CLI.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +7 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/discovery/ComponentFinder.d.ts +43 -0
- package/dist/core/discovery/ComponentFinder.d.ts.map +1 -0
- package/dist/core/discovery/ComponentFinder.js +421 -0
- package/dist/core/discovery/ComponentFinder.js.map +1 -0
- package/dist/core/discovery/FileStructureAnalyzer.d.ts +15 -0
- package/dist/core/discovery/FileStructureAnalyzer.d.ts.map +1 -0
- package/dist/core/discovery/FileStructureAnalyzer.js +35 -0
- package/dist/core/discovery/FileStructureAnalyzer.js.map +1 -0
- package/dist/core/discovery/MetadataExtractor.d.ts +15 -0
- package/dist/core/discovery/MetadataExtractor.d.ts.map +1 -0
- package/dist/core/discovery/MetadataExtractor.js +47 -0
- package/dist/core/discovery/MetadataExtractor.js.map +1 -0
- package/dist/core/discovery/index.d.ts +2 -0
- package/dist/core/discovery/index.d.ts.map +1 -0
- package/dist/core/discovery/index.js +2 -0
- package/dist/core/discovery/index.js.map +1 -0
- package/dist/core/enrichment/APIDataGenerator.d.ts +77 -0
- package/dist/core/enrichment/APIDataGenerator.d.ts.map +1 -0
- package/dist/core/enrichment/APIDataGenerator.js +663 -0
- package/dist/core/enrichment/APIDataGenerator.js.map +1 -0
- package/dist/core/enrichment/index.d.ts +2 -0
- package/dist/core/enrichment/index.d.ts.map +1 -0
- package/dist/core/enrichment/index.js +6 -0
- package/dist/core/enrichment/index.js.map +1 -0
- package/dist/core/extraction/ExtractionCoordinator.d.ts +53 -0
- package/dist/core/extraction/ExtractionCoordinator.d.ts.map +1 -0
- package/dist/core/extraction/ExtractionCoordinator.js +352 -0
- package/dist/core/extraction/ExtractionCoordinator.js.map +1 -0
- package/dist/core/extraction/index.d.ts +2 -0
- package/dist/core/extraction/index.d.ts.map +1 -0
- package/dist/core/extraction/index.js +2 -0
- package/dist/core/extraction/index.js.map +1 -0
- package/dist/core/generation/GenerationCoordinator.d.ts +51 -0
- package/dist/core/generation/GenerationCoordinator.d.ts.map +1 -0
- package/dist/core/generation/GenerationCoordinator.js +206 -0
- package/dist/core/generation/GenerationCoordinator.js.map +1 -0
- package/dist/core/generation/index.d.ts +2 -0
- package/dist/core/generation/index.d.ts.map +1 -0
- package/dist/core/generation/index.js +2 -0
- package/dist/core/generation/index.js.map +1 -0
- package/dist/core/index.d.ts +7 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +16 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/pipeline/ErrorHandler.d.ts +129 -0
- package/dist/core/pipeline/ErrorHandler.d.ts.map +1 -0
- package/dist/core/pipeline/ErrorHandler.js +321 -0
- package/dist/core/pipeline/ErrorHandler.js.map +1 -0
- package/dist/core/pipeline/PipelineOrchestrator.d.ts +45 -0
- package/dist/core/pipeline/PipelineOrchestrator.d.ts.map +1 -0
- package/dist/core/pipeline/PipelineOrchestrator.js +216 -0
- package/dist/core/pipeline/PipelineOrchestrator.js.map +1 -0
- package/dist/core/pipeline/index.d.ts +1 -0
- package/dist/core/pipeline/index.d.ts.map +1 -0
- package/dist/core/pipeline/index.js +2 -0
- package/dist/core/pipeline/index.js.map +1 -0
- package/dist/extractors/BaseExtractor.d.ts +33 -0
- package/dist/extractors/BaseExtractor.d.ts.map +1 -0
- package/dist/extractors/BaseExtractor.js +68 -0
- package/dist/extractors/BaseExtractor.js.map +1 -0
- package/dist/extractors/ExtractorFactory.d.ts +35 -0
- package/dist/extractors/ExtractorFactory.d.ts.map +1 -0
- package/dist/extractors/ExtractorFactory.js +88 -0
- package/dist/extractors/ExtractorFactory.js.map +1 -0
- package/dist/extractors/documentation/index.d.ts +1 -0
- package/dist/extractors/documentation/index.d.ts.map +1 -0
- package/dist/extractors/documentation/index.js +2 -0
- package/dist/extractors/documentation/index.js.map +1 -0
- package/dist/extractors/index.d.ts +1 -0
- package/dist/extractors/index.d.ts.map +1 -0
- package/dist/extractors/index.js +2 -0
- package/dist/extractors/index.js.map +1 -0
- package/dist/extractors/typescript/ExamplesExtractor.d.ts +32 -0
- package/dist/extractors/typescript/ExamplesExtractor.d.ts.map +1 -0
- package/dist/extractors/typescript/ExamplesExtractor.js +209 -0
- package/dist/extractors/typescript/ExamplesExtractor.js.map +1 -0
- package/dist/extractors/typescript/InheritanceExtractor.d.ts +45 -0
- package/dist/extractors/typescript/InheritanceExtractor.d.ts.map +1 -0
- package/dist/extractors/typescript/InheritanceExtractor.js +368 -0
- package/dist/extractors/typescript/InheritanceExtractor.js.map +1 -0
- package/dist/extractors/typescript/LocalTypesExtractor.d.ts +20 -0
- package/dist/extractors/typescript/LocalTypesExtractor.d.ts.map +1 -0
- package/dist/extractors/typescript/LocalTypesExtractor.js +100 -0
- package/dist/extractors/typescript/LocalTypesExtractor.js.map +1 -0
- package/dist/extractors/typescript/PropsExtractor.d.ts +142 -0
- package/dist/extractors/typescript/PropsExtractor.d.ts.map +1 -0
- package/dist/extractors/typescript/PropsExtractor.js +709 -0
- package/dist/extractors/typescript/PropsExtractor.js.map +1 -0
- package/dist/extractors/typescript/TypeScriptBaseExtractor.d.ts +74 -0
- package/dist/extractors/typescript/TypeScriptBaseExtractor.d.ts.map +1 -0
- package/dist/extractors/typescript/TypeScriptBaseExtractor.js +249 -0
- package/dist/extractors/typescript/TypeScriptBaseExtractor.js.map +1 -0
- package/dist/extractors/typescript/index.d.ts +1 -0
- package/dist/extractors/typescript/index.d.ts.map +1 -0
- package/dist/extractors/typescript/index.js +2 -0
- package/dist/extractors/typescript/index.js.map +1 -0
- package/dist/extractors/variants/TailwindVariantsParser.d.ts +16 -0
- package/dist/extractors/variants/TailwindVariantsParser.d.ts.map +1 -0
- package/dist/extractors/variants/TailwindVariantsParser.js +53 -0
- package/dist/extractors/variants/TailwindVariantsParser.js.map +1 -0
- package/dist/extractors/variants/VariantsExtractor.d.ts +45 -0
- package/dist/extractors/variants/VariantsExtractor.d.ts.map +1 -0
- package/dist/extractors/variants/VariantsExtractor.js +340 -0
- package/dist/extractors/variants/VariantsExtractor.js.map +1 -0
- package/dist/extractors/variants/index.d.ts +2 -0
- package/dist/extractors/variants/index.d.ts.map +1 -0
- package/dist/extractors/variants/index.js +2 -0
- package/dist/extractors/variants/index.js.map +1 -0
- package/dist/generators/api/APIFileGenerator.d.ts +32 -0
- package/dist/generators/api/APIFileGenerator.d.ts.map +1 -0
- package/dist/generators/api/APIFileGenerator.js +450 -0
- package/dist/generators/api/APIFileGenerator.js.map +1 -0
- package/dist/generators/api/TypeDefinitionGenerator.d.ts +1 -0
- package/dist/generators/api/TypeDefinitionGenerator.d.ts.map +1 -0
- package/dist/generators/api/TypeDefinitionGenerator.js +2 -0
- package/dist/generators/api/TypeDefinitionGenerator.js.map +1 -0
- package/dist/generators/api/index.d.ts +2 -0
- package/dist/generators/api/index.d.ts.map +1 -0
- package/dist/generators/api/index.js +2 -0
- package/dist/generators/api/index.js.map +1 -0
- package/dist/generators/index.d.ts +5 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +4 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/generators/llm/LLMDocumentationGenerator.d.ts +34 -0
- package/dist/generators/llm/LLMDocumentationGenerator.d.ts.map +1 -0
- package/dist/generators/llm/LLMDocumentationGenerator.js +480 -0
- package/dist/generators/llm/LLMDocumentationGenerator.js.map +1 -0
- package/dist/generators/llm/LLMFormatter.d.ts +4 -0
- package/dist/generators/llm/LLMFormatter.d.ts.map +1 -0
- package/dist/generators/llm/LLMFormatter.js +8 -0
- package/dist/generators/llm/LLMFormatter.js.map +1 -0
- package/dist/generators/llm/LlmsFullAssembler.d.ts +20 -0
- package/dist/generators/llm/LlmsFullAssembler.d.ts.map +1 -0
- package/dist/generators/llm/LlmsFullAssembler.js +63 -0
- package/dist/generators/llm/LlmsFullAssembler.js.map +1 -0
- package/dist/generators/llm/index.d.ts +1 -0
- package/dist/generators/llm/index.d.ts.map +1 -0
- package/dist/generators/llm/index.js +2 -0
- package/dist/generators/llm/index.js.map +1 -0
- package/dist/generators/mcp/MCPCatalogAssembler.d.ts +27 -0
- package/dist/generators/mcp/MCPCatalogAssembler.d.ts.map +1 -0
- package/dist/generators/mcp/MCPCatalogAssembler.js +147 -0
- package/dist/generators/mcp/MCPCatalogAssembler.js.map +1 -0
- package/dist/generators/mcp/MCPCatalogGenerator.d.ts +55 -0
- package/dist/generators/mcp/MCPCatalogGenerator.d.ts.map +1 -0
- package/dist/generators/mcp/MCPCatalogGenerator.js +153 -0
- package/dist/generators/mcp/MCPCatalogGenerator.js.map +1 -0
- package/dist/generators/svelte/PageGenerator.d.ts +82 -0
- package/dist/generators/svelte/PageGenerator.d.ts.map +1 -0
- package/dist/generators/svelte/PageGenerator.js +557 -0
- package/dist/generators/svelte/PageGenerator.js.map +1 -0
- package/dist/generators/svelte/PlaygroundPresets.d.ts +2 -0
- package/dist/generators/svelte/PlaygroundPresets.d.ts.map +1 -0
- package/dist/generators/svelte/PlaygroundPresets.js +4 -0
- package/dist/generators/svelte/PlaygroundPresets.js.map +1 -0
- package/dist/generators/svelte/SectionMerger.d.ts +38 -0
- package/dist/generators/svelte/SectionMerger.d.ts.map +1 -0
- package/dist/generators/svelte/SectionMerger.js +154 -0
- package/dist/generators/svelte/SectionMerger.js.map +1 -0
- package/dist/generators/svelte/TemplateEngine.d.ts +91 -0
- package/dist/generators/svelte/TemplateEngine.d.ts.map +1 -0
- package/dist/generators/svelte/TemplateEngine.js +500 -0
- package/dist/generators/svelte/TemplateEngine.js.map +1 -0
- package/dist/generators/svelte/index.d.ts +8 -0
- package/dist/generators/svelte/index.d.ts.map +1 -0
- package/dist/generators/svelte/index.js +11 -0
- package/dist/generators/svelte/index.js.map +1 -0
- package/dist/generators/svelte/renderers/ApiRenderer.d.ts +17 -0
- package/dist/generators/svelte/renderers/ApiRenderer.d.ts.map +1 -0
- package/dist/generators/svelte/renderers/ApiRenderer.js +44 -0
- package/dist/generators/svelte/renderers/ApiRenderer.js.map +1 -0
- package/dist/generators/svelte/renderers/ExampleRenderer.d.ts +33 -0
- package/dist/generators/svelte/renderers/ExampleRenderer.d.ts.map +1 -0
- package/dist/generators/svelte/renderers/ExampleRenderer.js +137 -0
- package/dist/generators/svelte/renderers/ExampleRenderer.js.map +1 -0
- package/dist/generators/svelte/renderers/OverviewRenderer.d.ts +9 -0
- package/dist/generators/svelte/renderers/OverviewRenderer.d.ts.map +1 -0
- package/dist/generators/svelte/renderers/OverviewRenderer.js +45 -0
- package/dist/generators/svelte/renderers/OverviewRenderer.js.map +1 -0
- package/dist/generators/svelte/renderers/PlaygroundRenderer.d.ts +35 -0
- package/dist/generators/svelte/renderers/PlaygroundRenderer.d.ts.map +1 -0
- package/dist/generators/svelte/renderers/PlaygroundRenderer.js +319 -0
- package/dist/generators/svelte/renderers/PlaygroundRenderer.js.map +1 -0
- package/dist/generators/svelte/renderers/TypesRenderer.d.ts +9 -0
- package/dist/generators/svelte/renderers/TypesRenderer.d.ts.map +1 -0
- package/dist/generators/svelte/renderers/TypesRenderer.js +23 -0
- package/dist/generators/svelte/renderers/TypesRenderer.js.map +1 -0
- package/dist/generators/svelte/renderers/UsageRenderer.d.ts +14 -0
- package/dist/generators/svelte/renderers/UsageRenderer.d.ts.map +1 -0
- package/dist/generators/svelte/renderers/UsageRenderer.js +91 -0
- package/dist/generators/svelte/renderers/UsageRenderer.js.map +1 -0
- package/dist/generators/svelte/renderers/VariantsRenderer.d.ts +43 -0
- package/dist/generators/svelte/renderers/VariantsRenderer.d.ts.map +1 -0
- package/dist/generators/svelte/renderers/VariantsRenderer.js +277 -0
- package/dist/generators/svelte/renderers/VariantsRenderer.js.map +1 -0
- package/dist/generators/svelte/renderers/index.d.ts +8 -0
- package/dist/generators/svelte/renderers/index.d.ts.map +1 -0
- package/dist/generators/svelte/renderers/index.js +8 -0
- package/dist/generators/svelte/renderers/index.js.map +1 -0
- package/dist/generators/svelte/types.d.ts +13 -0
- package/dist/generators/svelte/types.d.ts.map +1 -0
- package/dist/generators/svelte/types.js +2 -0
- package/dist/generators/svelte/types.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/SvelteDocsParser.d.ts +44 -0
- package/dist/parsers/SvelteDocsParser.d.ts.map +1 -0
- package/dist/parsers/SvelteDocsParser.js +141 -0
- package/dist/parsers/SvelteDocsParser.js.map +1 -0
- package/dist/parsers/index.d.ts +2 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +6 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/schema/ConfigurationBuilder.d.ts +55 -0
- package/dist/schema/ConfigurationBuilder.d.ts.map +1 -0
- package/dist/schema/ConfigurationBuilder.js +447 -0
- package/dist/schema/ConfigurationBuilder.js.map +1 -0
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +2 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/configuration.d.ts +255 -0
- package/dist/types/configuration.d.ts.map +1 -0
- package/dist/types/configuration.js +2 -0
- package/dist/types/configuration.js.map +1 -0
- package/dist/types/core.d.ts +96 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +2 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/docs-config.d.ts +5 -0
- package/dist/types/docs-config.d.ts.map +1 -0
- package/dist/types/docs-config.js +51 -0
- package/dist/types/docs-config.js.map +1 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/validation.d.ts +321 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +2 -0
- package/dist/types/validation.js.map +1 -0
- package/dist/utils/DeploymentManager.d.ts +80 -0
- package/dist/utils/DeploymentManager.d.ts.map +1 -0
- package/dist/utils/DeploymentManager.js +360 -0
- package/dist/utils/DeploymentManager.js.map +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
import * as fs from 'node:fs/promises';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { glob } from 'glob';
|
|
4
|
+
import * as ts from 'typescript';
|
|
5
|
+
/**
|
|
6
|
+
* Finds and analyzes components in packages using glob patterns
|
|
7
|
+
*/
|
|
8
|
+
export class ComponentFinder {
|
|
9
|
+
cache = new Map();
|
|
10
|
+
/**
|
|
11
|
+
* Find all components in a package
|
|
12
|
+
*/
|
|
13
|
+
async findComponents(packageConfig) {
|
|
14
|
+
const cacheKey = `${packageConfig.name}:${packageConfig.path}`;
|
|
15
|
+
if (this.cache.has(cacheKey)) {
|
|
16
|
+
console.log(`📦 Using cached results for ${packageConfig.name}`);
|
|
17
|
+
return this.cache.get(cacheKey);
|
|
18
|
+
}
|
|
19
|
+
console.log(`🔍 Discovering components in ${packageConfig.name}`);
|
|
20
|
+
try {
|
|
21
|
+
const manifests = await this.discoverComponents(packageConfig);
|
|
22
|
+
this.cache.set(cacheKey, manifests);
|
|
23
|
+
console.log(`✅ Found ${manifests.length} components in ${packageConfig.name}`);
|
|
24
|
+
return manifests;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
console.error(`❌ Failed to discover components in ${packageConfig.name}:`, error);
|
|
28
|
+
throw new Error(`Component discovery failed for ${packageConfig.name}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Clear the cache (useful for watch mode)
|
|
33
|
+
*/
|
|
34
|
+
clearCache() {
|
|
35
|
+
this.cache.clear();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get package info from package.json
|
|
39
|
+
*/
|
|
40
|
+
async getPackageInfo(packagePath) {
|
|
41
|
+
try {
|
|
42
|
+
const packageJsonPath = path.join(packagePath, 'package.json');
|
|
43
|
+
const content = await fs.readFile(packageJsonPath, 'utf-8');
|
|
44
|
+
const packageJson = JSON.parse(content);
|
|
45
|
+
return {
|
|
46
|
+
name: packageJson.name,
|
|
47
|
+
version: packageJson.version || '0.0.0',
|
|
48
|
+
description: packageJson.description,
|
|
49
|
+
homepage: packageJson.homepage,
|
|
50
|
+
repository: typeof packageJson.repository === 'string'
|
|
51
|
+
? packageJson.repository
|
|
52
|
+
: packageJson.repository?.url
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (_error) {
|
|
56
|
+
console.warn(`⚠️ Could not read package.json from ${packagePath}, using defaults`);
|
|
57
|
+
return {
|
|
58
|
+
name: path.basename(packagePath),
|
|
59
|
+
version: '0.0.0'
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// ==========================================
|
|
64
|
+
// PRIVATE METHODS
|
|
65
|
+
// ==========================================
|
|
66
|
+
async discoverComponents(packageConfig) {
|
|
67
|
+
const manifests = [];
|
|
68
|
+
// Find component files using glob pattern
|
|
69
|
+
const componentFiles = await this.findComponentFiles(packageConfig);
|
|
70
|
+
if (componentFiles.length === 0) {
|
|
71
|
+
console.warn(`⚠️ No component files found in ${packageConfig.name} using pattern: ${packageConfig.glob.components}`);
|
|
72
|
+
return manifests;
|
|
73
|
+
}
|
|
74
|
+
console.log(`📁 Found ${componentFiles.length} component files`);
|
|
75
|
+
// Get package info once
|
|
76
|
+
const packageInfo = await this.getPackageInfo(packageConfig.path);
|
|
77
|
+
// Process each component file
|
|
78
|
+
for (const componentFile of componentFiles) {
|
|
79
|
+
try {
|
|
80
|
+
const manifest = await this.createComponentManifest(componentFile, packageConfig, packageInfo);
|
|
81
|
+
if (manifest) {
|
|
82
|
+
manifests.push(manifest);
|
|
83
|
+
console.log(` ✅ ${manifest.component.name}`);
|
|
84
|
+
// A multi-component index.ts can opt additional exports into the catalog via a
|
|
85
|
+
// `@standalone` JSDoc tag on their `<Name>Props` interface (e.g. the Guide surfaces).
|
|
86
|
+
// Each one becomes a full manifest pointing at the same index.ts — the extractors
|
|
87
|
+
// already work per (filePath, componentName) pair.
|
|
88
|
+
const standaloneNames = await this.findStandaloneComponentNames(componentFile, manifest.component.name);
|
|
89
|
+
for (const standaloneName of standaloneNames) {
|
|
90
|
+
const standaloneManifest = await this.createComponentManifest(componentFile, packageConfig, packageInfo, standaloneName);
|
|
91
|
+
if (standaloneManifest) {
|
|
92
|
+
manifests.push(standaloneManifest);
|
|
93
|
+
console.log(` ✅ ${standaloneName} (@standalone in ${manifest.component.name})`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.warn(` ⚠️ Failed to process ${componentFile}:`, error instanceof Error ? error.message : String(error));
|
|
100
|
+
// Continue with other components
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return manifests;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Find component exports in an index.ts that opt into their own catalog entry.
|
|
107
|
+
*
|
|
108
|
+
* An export qualifies when both hold:
|
|
109
|
+
* 1. it is re-exported from a Svelte file: `export { default as X } from './X.svelte'`
|
|
110
|
+
* 2. a local `interface XProps` carries the `@standalone` JSDoc tag
|
|
111
|
+
*
|
|
112
|
+
* The tag is the explicit opt-in that separates independent surfaces (Guide family) from
|
|
113
|
+
* compound subcomponents (TabItem, MenuItem, CalendarDay, …), which carry the same
|
|
114
|
+
* `@description`/`@tag` metadata but must NOT become standalone catalog entries.
|
|
115
|
+
*/
|
|
116
|
+
async findStandaloneComponentNames(indexFilePath, primaryComponentName) {
|
|
117
|
+
let content;
|
|
118
|
+
try {
|
|
119
|
+
content = await fs.readFile(indexFilePath, 'utf-8');
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
// Cheap pre-filter before paying for an AST parse.
|
|
125
|
+
if (!content.includes('@standalone'))
|
|
126
|
+
return [];
|
|
127
|
+
const sourceFile = ts.createSourceFile(indexFilePath, content, ts.ScriptTarget.Latest,
|
|
128
|
+
/* setParentNodes */ true);
|
|
129
|
+
const svelteExports = [];
|
|
130
|
+
const standaloneProps = new Set();
|
|
131
|
+
for (const statement of sourceFile.statements) {
|
|
132
|
+
// `export { default as X } from './X.svelte'`
|
|
133
|
+
if (ts.isExportDeclaration(statement) &&
|
|
134
|
+
statement.exportClause &&
|
|
135
|
+
ts.isNamedExports(statement.exportClause) &&
|
|
136
|
+
statement.moduleSpecifier &&
|
|
137
|
+
ts.isStringLiteral(statement.moduleSpecifier) &&
|
|
138
|
+
statement.moduleSpecifier.text.endsWith('.svelte')) {
|
|
139
|
+
for (const element of statement.exportClause.elements) {
|
|
140
|
+
if (element.propertyName?.text === 'default') {
|
|
141
|
+
svelteExports.push(element.name.text);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// `interface XProps { … }` or `type XProps = …` (discriminated-union pattern,
|
|
146
|
+
// e.g. TabProps/BadgeProps) with an `@standalone` JSDoc tag
|
|
147
|
+
if ((ts.isInterfaceDeclaration(statement) || ts.isTypeAliasDeclaration(statement)) &&
|
|
148
|
+
statement.name.text.endsWith('Props')) {
|
|
149
|
+
const hasTag = ts.getJSDocTags(statement).some((tag) => tag.tagName.text === 'standalone');
|
|
150
|
+
if (hasTag) {
|
|
151
|
+
standaloneProps.add(statement.name.text.slice(0, -'Props'.length));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const names = [];
|
|
156
|
+
for (const exportName of svelteExports) {
|
|
157
|
+
if (exportName === primaryComponentName)
|
|
158
|
+
continue; // already the primary manifest
|
|
159
|
+
if (standaloneProps.has(exportName)) {
|
|
160
|
+
names.push(exportName);
|
|
161
|
+
standaloneProps.delete(exportName);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
standaloneProps.delete(primaryComponentName);
|
|
165
|
+
for (const orphan of standaloneProps) {
|
|
166
|
+
console.warn(` ⚠️ @standalone on ${orphan}Props in ${indexFilePath} has no matching ` +
|
|
167
|
+
`\`export { default as ${orphan} } from './${orphan}.svelte'\` — entry skipped.`);
|
|
168
|
+
}
|
|
169
|
+
return names;
|
|
170
|
+
}
|
|
171
|
+
async findComponentFiles(packageConfig) {
|
|
172
|
+
const pattern = path.join(packageConfig.path, packageConfig.glob.components);
|
|
173
|
+
// Debug logging
|
|
174
|
+
console.log(`🔍 Searching for components:`);
|
|
175
|
+
console.log(` 📦 Package: ${packageConfig.name}`);
|
|
176
|
+
console.log(` 📂 Path: ${packageConfig.path}`);
|
|
177
|
+
console.log(` 🔍 Glob: ${packageConfig.glob.components}`);
|
|
178
|
+
console.log(` 📋 Pattern: ${pattern}`);
|
|
179
|
+
console.log(` 🏠 CWD: ${process.cwd()}`);
|
|
180
|
+
try {
|
|
181
|
+
const files = await glob(pattern, {
|
|
182
|
+
ignore: packageConfig.exclude || [],
|
|
183
|
+
absolute: true
|
|
184
|
+
});
|
|
185
|
+
console.log(` ✅ Found ${files.length} files`);
|
|
186
|
+
if (files.length === 0) {
|
|
187
|
+
console.log(` 🔍 Debug: Trying to resolve pattern...`);
|
|
188
|
+
const resolvedPattern = path.resolve(pattern);
|
|
189
|
+
console.log(` 📍 Resolved pattern: ${resolvedPattern}`);
|
|
190
|
+
}
|
|
191
|
+
// Filter by include patterns if specified
|
|
192
|
+
if (packageConfig.include?.length) {
|
|
193
|
+
return files.filter((file) => packageConfig.include.some((includePattern) => file.includes(includePattern)));
|
|
194
|
+
}
|
|
195
|
+
return files;
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
throw new Error(`Glob pattern failed: ${pattern} - ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async createComponentManifest(componentFilePath, packageConfig, packageInfo, nameOverride) {
|
|
202
|
+
// Extract component name from file path (or take the @standalone export's name —
|
|
203
|
+
// related-file discovery below still keys on the path-derived family name, so a
|
|
204
|
+
// surface shares its family's variants/docs files, e.g. Guide/guide.variants.ts).
|
|
205
|
+
const componentName = nameOverride ?? this.extractComponentName(componentFilePath);
|
|
206
|
+
if (!componentName) {
|
|
207
|
+
console.warn(`⚠️ Could not extract component name from ${componentFilePath}`);
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
// Verify the file exists and is readable
|
|
211
|
+
try {
|
|
212
|
+
await fs.access(componentFilePath);
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
throw new Error(`Component file not accessible: ${componentFilePath}`, { cause: error });
|
|
216
|
+
}
|
|
217
|
+
// Create component info
|
|
218
|
+
const componentInfo = {
|
|
219
|
+
name: componentName,
|
|
220
|
+
packageName: packageConfig.name,
|
|
221
|
+
filePath: componentFilePath,
|
|
222
|
+
version: packageInfo.version,
|
|
223
|
+
description: `${componentName} component`, // TODO: Extract from JSDoc
|
|
224
|
+
props: [], // Will be populated by TypeScript extractor
|
|
225
|
+
variants: [], // Will be populated by variants extractor
|
|
226
|
+
inheritance: [], // Will be populated by inheritance extractor
|
|
227
|
+
stats: {
|
|
228
|
+
// Basic stats, will be enriched later
|
|
229
|
+
totalProps: 0,
|
|
230
|
+
directProps: 0,
|
|
231
|
+
variantProps: 0,
|
|
232
|
+
inheritedProps: 0
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
// Discover related files
|
|
236
|
+
const files = await this.discoverRelatedFiles(componentFilePath, packageConfig);
|
|
237
|
+
return {
|
|
238
|
+
component: componentInfo,
|
|
239
|
+
files,
|
|
240
|
+
packageInfo
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
extractComponentName(filePath) {
|
|
244
|
+
const basename = path.basename(filePath, path.extname(filePath));
|
|
245
|
+
// Handle index.ts files - use parent directory name
|
|
246
|
+
if (basename === 'index') {
|
|
247
|
+
const parentDir = path.basename(path.dirname(filePath));
|
|
248
|
+
// Skip group root aggregators like src/lib/components/index.ts or src/lib/primitives/index.ts
|
|
249
|
+
if (parentDir.toLowerCase() === 'components' || parentDir.toLowerCase() === 'primitives') {
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
// 🔧 FIX: Better PascalCase handling
|
|
253
|
+
if (parentDir.match(/^[A-Z]/)) {
|
|
254
|
+
// Already PascalCase: Button, Badge, etc.
|
|
255
|
+
return parentDir;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
// Convert to PascalCase: button -> Button
|
|
259
|
+
return parentDir.charAt(0).toUpperCase() + parentDir.slice(1);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// Handle direct component files
|
|
263
|
+
if (basename.match(/^[A-Z]/)) {
|
|
264
|
+
return basename;
|
|
265
|
+
}
|
|
266
|
+
// Handle kebab-case or snake_case
|
|
267
|
+
const pascalCase = basename
|
|
268
|
+
.split(/[-_]/)
|
|
269
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
270
|
+
.join('');
|
|
271
|
+
return pascalCase || null;
|
|
272
|
+
}
|
|
273
|
+
async discoverRelatedFiles(componentFilePath, packageConfig) {
|
|
274
|
+
const componentName = this.extractComponentName(componentFilePath);
|
|
275
|
+
const files = {
|
|
276
|
+
main: componentFilePath
|
|
277
|
+
};
|
|
278
|
+
// Look for variants file
|
|
279
|
+
if (packageConfig.glob.variants) {
|
|
280
|
+
const variantsFile = await this.findRelatedFile(packageConfig.path, // ← FIX: Use package path instead of component dir
|
|
281
|
+
packageConfig.glob.variants, componentName);
|
|
282
|
+
if (variantsFile) {
|
|
283
|
+
files.variants = variantsFile;
|
|
284
|
+
console.log(` 🎨 Found variants: ${path.relative(packageConfig.path, variantsFile)}`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// Look for documentation file
|
|
288
|
+
if (packageConfig.glob.documentation) {
|
|
289
|
+
const docFile = await this.findRelatedFile(packageConfig.path, packageConfig.glob.documentation, componentName);
|
|
290
|
+
if (docFile) {
|
|
291
|
+
files.documentation = docFile;
|
|
292
|
+
console.log(` 📚 Found docs: ${path.relative(packageConfig.path, docFile)}`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// Look for test files
|
|
296
|
+
if (packageConfig.glob.tests) {
|
|
297
|
+
const testFiles = await this.findRelatedFiles(packageConfig.path, packageConfig.glob.tests, componentName);
|
|
298
|
+
if (testFiles.length > 0) {
|
|
299
|
+
files.tests = testFiles;
|
|
300
|
+
console.log(` 🧪 Found tests: ${testFiles.length} files`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return files;
|
|
304
|
+
}
|
|
305
|
+
async findRelatedFile(baseDir, globPattern, componentName) {
|
|
306
|
+
const files = await this.findRelatedFiles(baseDir, globPattern, componentName);
|
|
307
|
+
return files[0]; // Return first match
|
|
308
|
+
}
|
|
309
|
+
async findRelatedFiles(baseDir, globPattern, componentName) {
|
|
310
|
+
try {
|
|
311
|
+
// Replace {component} placeholder with actual component name
|
|
312
|
+
let pattern = globPattern;
|
|
313
|
+
if (componentName) {
|
|
314
|
+
pattern = pattern.replace(/\{component\}/g, componentName.toLowerCase());
|
|
315
|
+
}
|
|
316
|
+
// 🔧 FIX: Try multiple patterns for better coverage
|
|
317
|
+
const patterns = [
|
|
318
|
+
path.join(baseDir, pattern),
|
|
319
|
+
// Also try without ** if it exists (for direct files)
|
|
320
|
+
path.join(baseDir, pattern.replace('/**/', '/')),
|
|
321
|
+
// Try with PascalCase component name too
|
|
322
|
+
componentName
|
|
323
|
+
? path.join(baseDir, globPattern.replace(/\{component\}/g, componentName))
|
|
324
|
+
: null
|
|
325
|
+
].filter(Boolean);
|
|
326
|
+
console.log(` 🔍 Searching for related files with patterns:`, patterns.map((p) => path.relative(baseDir, p)));
|
|
327
|
+
let allFiles = [];
|
|
328
|
+
for (const patternToTry of patterns) {
|
|
329
|
+
try {
|
|
330
|
+
const files = await glob(patternToTry, { absolute: true });
|
|
331
|
+
allFiles.push(...files);
|
|
332
|
+
if (files.length > 0) {
|
|
333
|
+
console.log(` ✅ Pattern "${path.relative(baseDir, patternToTry)}" found:`, files.map((f) => path.relative(baseDir, f)));
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
catch (error) {
|
|
337
|
+
console.log(` ⚠️ Pattern "${path.relative(baseDir, patternToTry)}" failed:`, error);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// Remove duplicates
|
|
341
|
+
allFiles = [...new Set(allFiles)];
|
|
342
|
+
// Enhanced filtering logic
|
|
343
|
+
if (componentName && allFiles.length > 0) {
|
|
344
|
+
const componentDirName = componentName;
|
|
345
|
+
const componentFileNameLower = componentName.toLowerCase();
|
|
346
|
+
return allFiles.filter((file) => {
|
|
347
|
+
const relativePath = path.relative(baseDir, file);
|
|
348
|
+
const fileName = path.basename(file);
|
|
349
|
+
return (
|
|
350
|
+
// File is in component directory (PascalCase): src/lib/primitives/Button/...
|
|
351
|
+
relativePath.includes(`/${componentDirName}/`) ||
|
|
352
|
+
// File is in component directory (lowercase): src/lib/primitives/button/...
|
|
353
|
+
relativePath.includes(`/${componentFileNameLower}/`) ||
|
|
354
|
+
// File matches component name pattern: button.variants.ts
|
|
355
|
+
fileName.startsWith(`${componentFileNameLower}.`) ||
|
|
356
|
+
// File matches component name pattern: Button.variants.ts
|
|
357
|
+
fileName.startsWith(`${componentDirName}.`) ||
|
|
358
|
+
// Special case for common docs files: docs.svelte, docs.md, etc.
|
|
359
|
+
fileName.startsWith('docs.'));
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
return allFiles;
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
console.warn(` ⚠️ Failed to find related files with pattern ${globPattern}:`, error);
|
|
366
|
+
return [];
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Validate that a component manifest is complete and valid
|
|
371
|
+
*/
|
|
372
|
+
async validateManifest(manifest) {
|
|
373
|
+
const errors = [];
|
|
374
|
+
const warnings = [];
|
|
375
|
+
// Validate main component file exists
|
|
376
|
+
try {
|
|
377
|
+
await fs.access(manifest.files.main);
|
|
378
|
+
}
|
|
379
|
+
catch {
|
|
380
|
+
errors.push({
|
|
381
|
+
type: 'missing_file',
|
|
382
|
+
message: `Main component file does not exist: ${manifest.files.main}`,
|
|
383
|
+
location: { file: manifest.files.main, line: 0, column: 0 }
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
// Validate component name
|
|
387
|
+
if (!manifest.component.name.match(/^[A-Z][a-zA-Z0-9]*$/)) {
|
|
388
|
+
warnings.push({
|
|
389
|
+
type: 'naming_convention',
|
|
390
|
+
message: `Component name should be PascalCase: ${manifest.component.name}`,
|
|
391
|
+
suggestion: 'Use PascalCase naming convention for components'
|
|
392
|
+
});
|
|
393
|
+
}
|
|
394
|
+
// Check if variants file exists
|
|
395
|
+
if (manifest.files.variants) {
|
|
396
|
+
try {
|
|
397
|
+
await fs.access(manifest.files.variants);
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
warnings.push({
|
|
401
|
+
type: 'missing_variants',
|
|
402
|
+
message: `Variants file claimed but not found: ${manifest.files.variants}`,
|
|
403
|
+
suggestion: 'Remove variants glob pattern or create the variants file'
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return {
|
|
408
|
+
success: errors.length === 0,
|
|
409
|
+
data: manifest,
|
|
410
|
+
errors,
|
|
411
|
+
warnings,
|
|
412
|
+
metadata: {
|
|
413
|
+
duration: 0,
|
|
414
|
+
extractorVersion: '2.0.0',
|
|
415
|
+
sourceFile: manifest.files.main,
|
|
416
|
+
timestamp: new Date().toISOString()
|
|
417
|
+
}
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
//# sourceMappingURL=ComponentFinder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentFinder.js","sourceRoot":"","sources":["../../../src/core/discovery/ComponentFinder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class FileStructureAnalyzer {
|
|
2
|
+
/**
|
|
3
|
+
* Analyze the file structure of a component directory
|
|
4
|
+
*/
|
|
5
|
+
analyzeStructure(componentPath: string): Promise<{
|
|
6
|
+
hasIndex: boolean;
|
|
7
|
+
hasComponent: boolean;
|
|
8
|
+
hasVariants: boolean;
|
|
9
|
+
hasDocs: boolean;
|
|
10
|
+
hasTests: boolean;
|
|
11
|
+
structure: 'flat' | 'nested' | 'mixed';
|
|
12
|
+
}>;
|
|
13
|
+
private determineStructure;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=FileStructureAnalyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileStructureAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/core/discovery/FileStructureAnalyzer.ts"],"names":[],"mappings":"AAGA,qBAAa,qBAAqB;IACjC;;OAEG;IACG,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC;QACtD,QAAQ,EAAE,OAAO,CAAC;QAClB,YAAY,EAAE,OAAO,CAAC;QACtB,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;KACvC,CAAC;IAqBF,OAAO,CAAC,kBAAkB;CAQ1B"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import * as path from 'path';
|
|
2
|
+
import * as fs from 'fs/promises';
|
|
3
|
+
export class FileStructureAnalyzer {
|
|
4
|
+
/**
|
|
5
|
+
* Analyze the file structure of a component directory
|
|
6
|
+
*/
|
|
7
|
+
async analyzeStructure(componentPath) {
|
|
8
|
+
const dir = path.dirname(componentPath);
|
|
9
|
+
try {
|
|
10
|
+
const files = await fs.readdir(dir);
|
|
11
|
+
const analysis = {
|
|
12
|
+
hasIndex: files.includes('index.ts') || files.includes('index.js'),
|
|
13
|
+
hasComponent: files.some((f) => f.endsWith('.svelte') || f.endsWith('.tsx')),
|
|
14
|
+
hasVariants: files.some((f) => f.includes('variants')),
|
|
15
|
+
hasDocs: files.some((f) => f.includes('docs') || f.includes('documentation')),
|
|
16
|
+
hasTests: files.some((f) => f.includes('test') || f.includes('spec')),
|
|
17
|
+
structure: this.determineStructure(files)
|
|
18
|
+
};
|
|
19
|
+
return analysis;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
throw new Error(`Failed to analyze directory structure: ${dir}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
determineStructure(files) {
|
|
26
|
+
const hasSubdirectories = files.some((f) => !f.includes('.'));
|
|
27
|
+
const hasFiles = files.some((f) => f.includes('.'));
|
|
28
|
+
if (hasSubdirectories && hasFiles)
|
|
29
|
+
return 'mixed';
|
|
30
|
+
if (hasSubdirectories)
|
|
31
|
+
return 'nested';
|
|
32
|
+
return 'flat';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=FileStructureAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FileStructureAnalyzer.js","sourceRoot":"","sources":["../../../src/core/discovery/FileStructureAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAElC,MAAM,OAAO,qBAAqB;IACjC;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,aAAqB;QAQ3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAExC,IAAI,CAAC;YACJ,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAEpC,MAAM,QAAQ,GAAG;gBAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAClE,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC5E,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACtD,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAC7E,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACrE,SAAS,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;aACzC,CAAC;YAEF,OAAO,QAAQ,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;QAClE,CAAC;IACF,CAAC;IAEO,kBAAkB,CAAC,KAAe;QACzC,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAEpD,IAAI,iBAAiB,IAAI,QAAQ;YAAE,OAAO,OAAO,CAAC;QAClD,IAAI,iBAAiB;YAAE,OAAO,QAAQ,CAAC;QACvC,OAAO,MAAM,CAAC;IACf,CAAC;CACD"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class MetadataExtractor {
|
|
2
|
+
/**
|
|
3
|
+
* Extract basic metadata from component file without full TypeScript parsing
|
|
4
|
+
*/
|
|
5
|
+
extractBasicMetadata(filePath: string): Promise<{
|
|
6
|
+
hasInterface: boolean;
|
|
7
|
+
hasExports: boolean;
|
|
8
|
+
linesOfCode: number;
|
|
9
|
+
imports: string[];
|
|
10
|
+
exports: string[];
|
|
11
|
+
}>;
|
|
12
|
+
private extractImports;
|
|
13
|
+
private extractExports;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=MetadataExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetadataExtractor.d.ts","sourceRoot":"","sources":["../../../src/core/discovery/MetadataExtractor.ts"],"names":[],"mappings":"AAEA,qBAAa,iBAAiB;IAC7B;;OAEG;IACG,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;QACrD,YAAY,EAAE,OAAO,CAAC;QACtB,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IAsBF,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,cAAc;CAatB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
export class MetadataExtractor {
|
|
3
|
+
/**
|
|
4
|
+
* Extract basic metadata from component file without full TypeScript parsing
|
|
5
|
+
*/
|
|
6
|
+
async extractBasicMetadata(filePath) {
|
|
7
|
+
try {
|
|
8
|
+
const content = await readFile(filePath, 'utf-8');
|
|
9
|
+
const lines = content.split('\n');
|
|
10
|
+
const metadata = {
|
|
11
|
+
hasInterface: /interface\s+\w+Props/.test(content),
|
|
12
|
+
hasExports: /export\s+(interface|type|const|function|class)/.test(content),
|
|
13
|
+
linesOfCode: lines.filter((line) => line.trim() && !line.trim().startsWith('//'))
|
|
14
|
+
.length,
|
|
15
|
+
imports: this.extractImports(content),
|
|
16
|
+
exports: this.extractExports(content)
|
|
17
|
+
};
|
|
18
|
+
return metadata;
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
throw new Error(`Failed to extract metadata from ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
extractImports(content) {
|
|
25
|
+
const importRegex = /import\s+.*?\s+from\s+['"`]([^'"`]+)['"`]/g;
|
|
26
|
+
const imports = [];
|
|
27
|
+
let match;
|
|
28
|
+
while ((match = importRegex.exec(content)) !== null) {
|
|
29
|
+
if (match[1]) {
|
|
30
|
+
imports.push(match[1]);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return imports;
|
|
34
|
+
}
|
|
35
|
+
extractExports(content) {
|
|
36
|
+
const exportRegex = /export\s+(?:interface|type|const|function|class)\s+(\w+)/g;
|
|
37
|
+
const exports = [];
|
|
38
|
+
let match;
|
|
39
|
+
while ((match = exportRegex.exec(content)) !== null) {
|
|
40
|
+
if (match[1]) {
|
|
41
|
+
exports.push(match[1]);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return exports;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=MetadataExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetadataExtractor.js","sourceRoot":"","sources":["../../../src/core/discovery/MetadataExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,OAAO,iBAAiB;IAC7B;;OAEG;IACH,KAAK,CAAC,oBAAoB,CAAC,QAAgB;QAO1C,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAElC,MAAM,QAAQ,GAAG;gBAChB,YAAY,EAAE,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAClD,UAAU,EAAE,gDAAgD,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC1E,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;qBACvF,MAAM;gBACR,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;gBACrC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;aACrC,CAAC;YAEF,OAAO,QAAQ,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACd,mCAAmC,QAAQ,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CACxG,CAAC;QACH,CAAC;IACF,CAAC;IAEO,cAAc,CAAC,OAAe;QACrC,MAAM,WAAW,GAAG,4CAA4C,CAAC;QACjE,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,KAA6B,CAAC;QAElC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACrD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;IAEO,cAAc,CAAC,OAAe;QACrC,MAAM,WAAW,GAAG,2DAA2D,CAAC;QAChF,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,IAAI,KAA6B,CAAC;QAElC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACrD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxB,CAAC;QACF,CAAC;QAED,OAAO,OAAO,CAAC;IAChB,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/discovery/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
|