vue-harvest 0.0.1
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/dist/analyze-EN7LZ24H.js +68 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +19 -0
- package/dist/extract-IXDSHKMT.js +101 -0
- package/dist/index.d.ts +266 -0
- package/dist/index.js +1854 -0
- package/dist/init-7D4WRW4O.js +48 -0
- package/dist/inspect-GYSHQGKR.js +89 -0
- package/dist/list-NVCU2SBD.js +59 -0
- package/dist/tokens-SE3ZP52M.js +50 -0
- package/package.json +58 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
// src/commands/analyze.ts
|
|
2
|
+
import { defineCommand } from "citty";
|
|
3
|
+
import { resolve } from "pathe";
|
|
4
|
+
import consola from "consola";
|
|
5
|
+
var analyze_default = defineCommand({
|
|
6
|
+
meta: {
|
|
7
|
+
name: "analyze",
|
|
8
|
+
description: "Analyze a Vue project and extract reusable components"
|
|
9
|
+
},
|
|
10
|
+
args: {
|
|
11
|
+
path: {
|
|
12
|
+
type: "positional",
|
|
13
|
+
description: "Path to the Vue project root",
|
|
14
|
+
default: "."
|
|
15
|
+
},
|
|
16
|
+
threshold: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Extraction confidence threshold 0-100 (default: 70)"
|
|
19
|
+
},
|
|
20
|
+
output: {
|
|
21
|
+
type: "string",
|
|
22
|
+
description: "Output directory (default: .vue-harvest)",
|
|
23
|
+
alias: "o"
|
|
24
|
+
},
|
|
25
|
+
json: {
|
|
26
|
+
type: "boolean",
|
|
27
|
+
description: "Output JSON to stdout"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
async run({ args }) {
|
|
31
|
+
const { analyze, writeOutput } = await import("./index.js");
|
|
32
|
+
const threshold = args.threshold ? parseInt(args.threshold, 10) / 100 : void 0;
|
|
33
|
+
const report = await analyze(resolve(args.path), {
|
|
34
|
+
extractionThreshold: threshold,
|
|
35
|
+
outDir: args.output
|
|
36
|
+
});
|
|
37
|
+
if (args.json) {
|
|
38
|
+
const output = {
|
|
39
|
+
summary: report.summary,
|
|
40
|
+
components: [...report.components.entries()].map(([name, c]) => ({
|
|
41
|
+
name,
|
|
42
|
+
tier: c.tier,
|
|
43
|
+
confidence: Math.round(c.extractionConfidence * 100),
|
|
44
|
+
loc: c.loc.total,
|
|
45
|
+
props: c.props.length,
|
|
46
|
+
issues: c.couplingIssues.length
|
|
47
|
+
}))
|
|
48
|
+
};
|
|
49
|
+
process.stdout.write(JSON.stringify(output, null, 2));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
await writeOutput(report);
|
|
53
|
+
consola.box(
|
|
54
|
+
[
|
|
55
|
+
`Vue Harvest Analysis`,
|
|
56
|
+
``,
|
|
57
|
+
`Components: ${report.summary.analyzed}`,
|
|
58
|
+
`Auto-extracted: ${report.summary.autoExtracted}`,
|
|
59
|
+
`Needs review: ${report.summary.needsMCP}`,
|
|
60
|
+
``,
|
|
61
|
+
Object.entries(report.summary.byTier).sort((a, b) => b[1] - a[1]).map(([tier, count]) => ` ${tier}: ${count}`).join("\n")
|
|
62
|
+
].join("\n")
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
export {
|
|
67
|
+
analyze_default as default
|
|
68
|
+
};
|
package/dist/cli.d.ts
ADDED
package/dist/cli.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// src/cli.ts
|
|
3
|
+
import { defineCommand, runMain } from "citty";
|
|
4
|
+
var main = defineCommand({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "vue-harvest",
|
|
7
|
+
version: "0.0.1",
|
|
8
|
+
description: "Extract reusable component libraries and design tokens from Vue applications"
|
|
9
|
+
},
|
|
10
|
+
subCommands: {
|
|
11
|
+
analyze: () => import("./analyze-EN7LZ24H.js").then((m) => m.default),
|
|
12
|
+
list: () => import("./list-NVCU2SBD.js").then((m) => m.default),
|
|
13
|
+
inspect: () => import("./inspect-GYSHQGKR.js").then((m) => m.default),
|
|
14
|
+
extract: () => import("./extract-IXDSHKMT.js").then((m) => m.default),
|
|
15
|
+
tokens: () => import("./tokens-SE3ZP52M.js").then((m) => m.default),
|
|
16
|
+
init: () => import("./init-7D4WRW4O.js").then((m) => m.default)
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
runMain(main);
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
// src/commands/extract.ts
|
|
2
|
+
import { defineCommand } from "citty";
|
|
3
|
+
import { resolve } from "pathe";
|
|
4
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
5
|
+
import { join } from "pathe";
|
|
6
|
+
import consola from "consola";
|
|
7
|
+
var extract_default = defineCommand({
|
|
8
|
+
meta: {
|
|
9
|
+
name: "extract",
|
|
10
|
+
description: "Extract a component and its dependencies into a standalone bundle"
|
|
11
|
+
},
|
|
12
|
+
args: {
|
|
13
|
+
name: {
|
|
14
|
+
type: "positional",
|
|
15
|
+
description: "Component name in PascalCase",
|
|
16
|
+
required: true
|
|
17
|
+
},
|
|
18
|
+
path: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Project root path",
|
|
21
|
+
default: "."
|
|
22
|
+
},
|
|
23
|
+
output: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "Output directory",
|
|
26
|
+
alias: "o",
|
|
27
|
+
default: ".vue-harvest/components"
|
|
28
|
+
},
|
|
29
|
+
force: {
|
|
30
|
+
type: "boolean",
|
|
31
|
+
description: "Extract even if below confidence threshold"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
async run({ args }) {
|
|
35
|
+
const { analyze, extractComponent, resolveConfig } = await import("./index.js");
|
|
36
|
+
const root = resolve(args.path);
|
|
37
|
+
const report = await analyze(root);
|
|
38
|
+
const comp = report.components.get(args.name);
|
|
39
|
+
if (!comp) {
|
|
40
|
+
const available = [...report.components.keys()].join(", ");
|
|
41
|
+
consola.error(`Component "${args.name}" not found. Available: ${available}`);
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
const pct = Math.round(comp.extractionConfidence * 100);
|
|
45
|
+
if (pct < 70 && !args.force) {
|
|
46
|
+
consola.warn(
|
|
47
|
+
`${args.name} confidence is ${pct}% (below 70% threshold). Use --force to extract anyway.`
|
|
48
|
+
);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
const pkgPath = resolve(root, "package.json");
|
|
52
|
+
const pkg = existsSync(pkgPath) ? JSON.parse(readFileSync(pkgPath, "utf-8")) : {};
|
|
53
|
+
const projectDeps = {
|
|
54
|
+
...pkg.dependencies || {},
|
|
55
|
+
...pkg.devDependencies || {}
|
|
56
|
+
};
|
|
57
|
+
const config = resolveConfig(root, {
|
|
58
|
+
extractionThreshold: args.force ? 0 : 0.7
|
|
59
|
+
});
|
|
60
|
+
const result = extractComponent(
|
|
61
|
+
args.name,
|
|
62
|
+
report.components,
|
|
63
|
+
report.graph,
|
|
64
|
+
config,
|
|
65
|
+
projectDeps
|
|
66
|
+
);
|
|
67
|
+
if (!result.success) {
|
|
68
|
+
consola.error("Extraction failed:");
|
|
69
|
+
for (const issue of result.issues) {
|
|
70
|
+
consola.log(` [${issue.severity}] ${issue.message}`);
|
|
71
|
+
}
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
const outDir = resolve(args.output, args.name);
|
|
75
|
+
mkdirSync(outDir, { recursive: true });
|
|
76
|
+
for (const [filePath, content] of Object.entries(result.files)) {
|
|
77
|
+
const fullPath = join(outDir, filePath);
|
|
78
|
+
const dir = fullPath.substring(0, fullPath.lastIndexOf("/"));
|
|
79
|
+
mkdirSync(dir, { recursive: true });
|
|
80
|
+
writeFileSync(fullPath, content);
|
|
81
|
+
}
|
|
82
|
+
writeFileSync(
|
|
83
|
+
join(outDir, "manifest.json"),
|
|
84
|
+
JSON.stringify(result.manifest, null, 2)
|
|
85
|
+
);
|
|
86
|
+
consola.success(`Extracted ${args.name} to ${outDir}`);
|
|
87
|
+
consola.info(` Files: ${Object.keys(result.files).length}`);
|
|
88
|
+
consola.info(
|
|
89
|
+
` Peer deps: ${Object.keys(result.manifest.peerDependencies).join(", ")}`
|
|
90
|
+
);
|
|
91
|
+
if (result.issues.length > 0) {
|
|
92
|
+
consola.warn("Notes:");
|
|
93
|
+
for (const issue of result.issues) {
|
|
94
|
+
consola.log(` [${issue.severity}] ${issue.message}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
export {
|
|
100
|
+
extract_default as default
|
|
101
|
+
};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
interface HarvestConfig {
|
|
2
|
+
root: string;
|
|
3
|
+
include: string[];
|
|
4
|
+
exclude: string[];
|
|
5
|
+
aliases: Record<string, string>;
|
|
6
|
+
extractionThreshold: number;
|
|
7
|
+
outDir: string;
|
|
8
|
+
registry: 'json' | 'typescript';
|
|
9
|
+
}
|
|
10
|
+
interface PropDefinition {
|
|
11
|
+
name: string;
|
|
12
|
+
type: string;
|
|
13
|
+
required: boolean;
|
|
14
|
+
default?: string;
|
|
15
|
+
validator?: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
}
|
|
18
|
+
interface EmitDefinition {
|
|
19
|
+
name: string;
|
|
20
|
+
payload?: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
}
|
|
23
|
+
interface SlotDefinition {
|
|
24
|
+
name: string;
|
|
25
|
+
bindings: Array<{
|
|
26
|
+
name: string;
|
|
27
|
+
type: string;
|
|
28
|
+
}>;
|
|
29
|
+
description?: string;
|
|
30
|
+
}
|
|
31
|
+
interface ExposeDefinition {
|
|
32
|
+
name: string;
|
|
33
|
+
type: string;
|
|
34
|
+
description?: string;
|
|
35
|
+
}
|
|
36
|
+
type ScriptVariant = 'setup-ts' | 'setup-js' | 'options-ts' | 'options-js' | 'composition-ts' | 'composition-js' | 'none';
|
|
37
|
+
interface StyleBlock {
|
|
38
|
+
lang: 'css' | 'scss' | 'less' | 'postcss' | 'stylus';
|
|
39
|
+
scoped: boolean;
|
|
40
|
+
module: boolean | string;
|
|
41
|
+
source: string;
|
|
42
|
+
cssVarsUsed: string[];
|
|
43
|
+
cssVarsDefined: string[];
|
|
44
|
+
externalImports: string[];
|
|
45
|
+
}
|
|
46
|
+
type DependencyKind = 'internal-component' | 'internal-composable' | 'internal-util' | 'internal-store' | 'internal-type' | 'internal-asset' | 'internal-style' | 'external-package' | 'vue-core' | 'global-plugin' | 'provide-inject' | 'unknown';
|
|
47
|
+
interface Dependency {
|
|
48
|
+
specifier: string;
|
|
49
|
+
resolvedPath: string | null;
|
|
50
|
+
kind: DependencyKind;
|
|
51
|
+
imports: string[];
|
|
52
|
+
typeOnly: boolean;
|
|
53
|
+
isPeer: boolean;
|
|
54
|
+
depth: number;
|
|
55
|
+
}
|
|
56
|
+
type CouplingIssueType = 'direct-store-access' | 'hardcoded-api' | 'router-dependency' | 'i18n-dependency' | 'global-inject' | 'env-variable' | 'unscoped-css' | 'deep-provide-chain' | 'implicit-global' | 'side-effect-import';
|
|
57
|
+
interface CouplingIssue {
|
|
58
|
+
type: CouplingIssueType;
|
|
59
|
+
description: string;
|
|
60
|
+
line?: number;
|
|
61
|
+
column?: number;
|
|
62
|
+
severity: 'blocker' | 'warning' | 'info';
|
|
63
|
+
suggestedFix?: string;
|
|
64
|
+
}
|
|
65
|
+
type ReusabilityTier = 'primitive' | 'composite' | 'feature' | 'page-bound' | 'app-specific';
|
|
66
|
+
interface AnalyzedComponent {
|
|
67
|
+
name: string;
|
|
68
|
+
filePath: string;
|
|
69
|
+
absolutePath: string;
|
|
70
|
+
fileSize: number;
|
|
71
|
+
props: PropDefinition[];
|
|
72
|
+
emits: EmitDefinition[];
|
|
73
|
+
slots: SlotDefinition[];
|
|
74
|
+
expose: ExposeDefinition[];
|
|
75
|
+
scriptVariant: ScriptVariant;
|
|
76
|
+
dependencies: Dependency[];
|
|
77
|
+
transitiveDeps: string[];
|
|
78
|
+
peerPackages: string[];
|
|
79
|
+
styles: StyleBlock[];
|
|
80
|
+
tier: ReusabilityTier;
|
|
81
|
+
extractionConfidence: number;
|
|
82
|
+
couplingIssues: CouplingIssue[];
|
|
83
|
+
rawSource: string;
|
|
84
|
+
templateSummary?: string;
|
|
85
|
+
loc: {
|
|
86
|
+
template: number;
|
|
87
|
+
script: number;
|
|
88
|
+
style: number;
|
|
89
|
+
total: number;
|
|
90
|
+
};
|
|
91
|
+
contentHash: string;
|
|
92
|
+
}
|
|
93
|
+
interface ComponentEdge {
|
|
94
|
+
source: string;
|
|
95
|
+
target: string;
|
|
96
|
+
type: 'imports' | 'slot-renders' | 'dynamic-component';
|
|
97
|
+
}
|
|
98
|
+
interface ComponentGraph {
|
|
99
|
+
nodes: Array<{
|
|
100
|
+
id: string;
|
|
101
|
+
filePath: string;
|
|
102
|
+
tier: ReusabilityTier;
|
|
103
|
+
confidence: number;
|
|
104
|
+
}>;
|
|
105
|
+
edges: ComponentEdge[];
|
|
106
|
+
roots: string[];
|
|
107
|
+
leaves: string[];
|
|
108
|
+
cycles: string[][];
|
|
109
|
+
}
|
|
110
|
+
interface ExtractionManifest {
|
|
111
|
+
component: string;
|
|
112
|
+
files: Array<{
|
|
113
|
+
from: string;
|
|
114
|
+
to: string;
|
|
115
|
+
needsTransform: boolean;
|
|
116
|
+
role: 'component' | 'composable' | 'util' | 'type' | 'style' | 'asset';
|
|
117
|
+
}>;
|
|
118
|
+
peerDependencies: Record<string, string>;
|
|
119
|
+
requiredGlobals: string[];
|
|
120
|
+
importRewrites: Record<string, string>;
|
|
121
|
+
requiredCssVars: string[];
|
|
122
|
+
notes: string[];
|
|
123
|
+
}
|
|
124
|
+
interface ExtractionResult {
|
|
125
|
+
success: boolean;
|
|
126
|
+
manifest: ExtractionManifest;
|
|
127
|
+
files: Record<string, string>;
|
|
128
|
+
issues: Array<{
|
|
129
|
+
severity: 'error' | 'warning' | 'info';
|
|
130
|
+
message: string;
|
|
131
|
+
file?: string;
|
|
132
|
+
suggestion?: string;
|
|
133
|
+
}>;
|
|
134
|
+
}
|
|
135
|
+
interface RegistryEntry {
|
|
136
|
+
name: string;
|
|
137
|
+
type: 'component' | 'composable' | 'util';
|
|
138
|
+
description?: string;
|
|
139
|
+
tier: ReusabilityTier;
|
|
140
|
+
files: string[];
|
|
141
|
+
dependencies: string[];
|
|
142
|
+
peerDependencies: string[];
|
|
143
|
+
registryDependencies: string[];
|
|
144
|
+
cssVars: string[];
|
|
145
|
+
meta: {
|
|
146
|
+
props: PropDefinition[];
|
|
147
|
+
emits: EmitDefinition[];
|
|
148
|
+
slots: SlotDefinition[];
|
|
149
|
+
loc: number;
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
interface HarvestRegistry {
|
|
153
|
+
$schema: string;
|
|
154
|
+
name: string;
|
|
155
|
+
version: string;
|
|
156
|
+
source: string;
|
|
157
|
+
generatedAt: string;
|
|
158
|
+
config: Partial<HarvestConfig>;
|
|
159
|
+
components: RegistryEntry[];
|
|
160
|
+
composables: RegistryEntry[];
|
|
161
|
+
utils: RegistryEntry[];
|
|
162
|
+
graph: ComponentGraph;
|
|
163
|
+
stats: {
|
|
164
|
+
totalComponents: number;
|
|
165
|
+
autoExtractable: number;
|
|
166
|
+
needsReview: number;
|
|
167
|
+
appSpecific: number;
|
|
168
|
+
totalFiles: number;
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
interface DesignToken {
|
|
172
|
+
name: string;
|
|
173
|
+
value: string;
|
|
174
|
+
type: DesignTokenType;
|
|
175
|
+
source: TokenSource;
|
|
176
|
+
usageCount: number;
|
|
177
|
+
/** Which components use this token */
|
|
178
|
+
usedBy: string[];
|
|
179
|
+
}
|
|
180
|
+
type DesignTokenType = 'color' | 'font-family' | 'font-size' | 'font-weight' | 'line-height' | 'letter-spacing' | 'spacing' | 'border-radius' | 'border-width' | 'shadow' | 'opacity' | 'z-index' | 'transition' | 'breakpoint';
|
|
181
|
+
interface TokenSource {
|
|
182
|
+
file: string;
|
|
183
|
+
line?: number;
|
|
184
|
+
context: 'css-value' | 'css-variable' | 'tailwind-class' | 'inline-style' | 'js-constant';
|
|
185
|
+
}
|
|
186
|
+
interface DesignSystemReport {
|
|
187
|
+
tokens: DesignToken[];
|
|
188
|
+
/** Grouped by type for easy consumption */
|
|
189
|
+
byType: Record<DesignTokenType, DesignToken[]>;
|
|
190
|
+
/** Color palette (deduplicated, normalized) */
|
|
191
|
+
palette: Array<{
|
|
192
|
+
hex: string;
|
|
193
|
+
name?: string;
|
|
194
|
+
usageCount: number;
|
|
195
|
+
}>;
|
|
196
|
+
/** Typography scale */
|
|
197
|
+
typography: {
|
|
198
|
+
families: string[];
|
|
199
|
+
sizes: string[];
|
|
200
|
+
weights: string[];
|
|
201
|
+
lineHeights: string[];
|
|
202
|
+
};
|
|
203
|
+
/** Spacing scale (sorted, deduplicated) */
|
|
204
|
+
spacing: string[];
|
|
205
|
+
/** Border radii */
|
|
206
|
+
radii: string[];
|
|
207
|
+
/** Shadows */
|
|
208
|
+
shadows: string[];
|
|
209
|
+
/** Stats */
|
|
210
|
+
stats: {
|
|
211
|
+
totalTokens: number;
|
|
212
|
+
uniqueColors: number;
|
|
213
|
+
uniqueFontSizes: number;
|
|
214
|
+
uniqueSpacingValues: number;
|
|
215
|
+
componentsAnalyzed: number;
|
|
216
|
+
/** How many values are hardcoded vs tokenized */
|
|
217
|
+
tokenizationRate: number;
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
interface ProjectMeta {
|
|
222
|
+
framework: 'vite' | 'nuxt' | 'vue-cli' | 'unknown';
|
|
223
|
+
typescript: boolean;
|
|
224
|
+
packageManager: 'npm' | 'yarn' | 'pnpm' | 'unknown';
|
|
225
|
+
tailwind: boolean;
|
|
226
|
+
}
|
|
227
|
+
declare function resolveConfig(root: string, overrides?: Partial<HarvestConfig>): HarvestConfig;
|
|
228
|
+
declare function resolveProjectMeta(root: string): ProjectMeta;
|
|
229
|
+
|
|
230
|
+
declare function extractComponent(componentName: string, allComponents: Map<string, AnalyzedComponent>, graph: ComponentGraph, config: HarvestConfig, projectDeps: Record<string, string>): ExtractionResult;
|
|
231
|
+
|
|
232
|
+
declare function analyzeSFC(filePath: string, absolutePath: string, projectRoot: string, aliases: Record<string, string>): Promise<AnalyzedComponent>;
|
|
233
|
+
|
|
234
|
+
declare function buildComponentGraph(components: AnalyzedComponent[], projectRoot: string, aliases: Record<string, string>): ComponentGraph;
|
|
235
|
+
|
|
236
|
+
declare function analyzeDesignSystem(config: HarvestConfig, analyzedComponents?: Map<string, {
|
|
237
|
+
name: string;
|
|
238
|
+
filePath: string;
|
|
239
|
+
styles: Array<{
|
|
240
|
+
source: string;
|
|
241
|
+
}>;
|
|
242
|
+
}>): Promise<DesignSystemReport>;
|
|
243
|
+
declare function generateTokenCSS(report: DesignSystemReport): string;
|
|
244
|
+
declare function generateDesignSystemHTML(report: DesignSystemReport): string;
|
|
245
|
+
|
|
246
|
+
interface AnalysisReport {
|
|
247
|
+
config: HarvestConfig;
|
|
248
|
+
components: Map<string, AnalyzedComponent>;
|
|
249
|
+
graph: ComponentGraph;
|
|
250
|
+
registry: HarvestRegistry;
|
|
251
|
+
extractions: Map<string, ExtractionResult>;
|
|
252
|
+
summary: {
|
|
253
|
+
totalFiles: number;
|
|
254
|
+
analyzed: number;
|
|
255
|
+
errors: number;
|
|
256
|
+
byTier: Record<string, number>;
|
|
257
|
+
autoExtracted: number;
|
|
258
|
+
needsMCP: number;
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
declare function analyze(rootPath: string, overrides?: Partial<HarvestConfig>): Promise<AnalysisReport>;
|
|
262
|
+
declare function writeOutput(report: AnalysisReport): Promise<void>;
|
|
263
|
+
declare function analyzeTokens(rootPath: string, overrides?: Partial<HarvestConfig>): Promise<DesignSystemReport>;
|
|
264
|
+
declare function writeDesignSystemOutput(report: DesignSystemReport, outputDir: string): Promise<void>;
|
|
265
|
+
|
|
266
|
+
export { type AnalysisReport, type AnalyzedComponent, type ComponentGraph, type CouplingIssue, type DesignSystemReport, type ExtractionResult, type HarvestConfig, type HarvestRegistry, analyze, analyzeDesignSystem, analyzeSFC, analyzeTokens, buildComponentGraph, extractComponent, generateDesignSystemHTML, generateTokenCSS, resolveConfig, resolveProjectMeta, writeDesignSystemOutput, writeOutput };
|