@buoy-design/cli 0.1.0 → 0.1.2
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/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +235 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/baseline.d.ts +39 -0
- package/dist/commands/baseline.d.ts.map +1 -0
- package/dist/commands/baseline.js +298 -0
- package/dist/commands/baseline.js.map +1 -0
- package/dist/commands/check.d.ts +16 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +168 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/ci.d.ts +2 -2
- package/dist/commands/ci.d.ts.map +1 -1
- package/dist/commands/ci.js +124 -142
- package/dist/commands/ci.js.map +1 -1
- package/dist/commands/compare.d.ts +3 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +170 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/drift.d.ts +1 -1
- package/dist/commands/drift.d.ts.map +1 -1
- package/dist/commands/drift.js +79 -121
- package/dist/commands/drift.js.map +1 -1
- package/dist/commands/explain.d.ts +3 -0
- package/dist/commands/explain.d.ts.map +1 -0
- package/dist/commands/explain.js +212 -0
- package/dist/commands/explain.js.map +1 -0
- package/dist/commands/graph.d.ts +3 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +430 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/index.d.ts +14 -8
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +14 -8
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +404 -237
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/plugins.d.ts.map +1 -1
- package/dist/commands/plugins.js +32 -41
- package/dist/commands/plugins.js.map +1 -1
- package/dist/commands/scan.d.ts +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +107 -219
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/status.d.ts +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +114 -122
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/tokens.d.ts +3 -0
- package/dist/commands/tokens.d.ts.map +1 -0
- package/dist/commands/tokens.js +261 -0
- package/dist/commands/tokens.js.map +1 -0
- package/dist/config/auto-detect.d.ts +21 -0
- package/dist/config/auto-detect.d.ts.map +1 -0
- package/dist/config/auto-detect.js +278 -0
- package/dist/config/auto-detect.js.map +1 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +17 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +63 -63
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +20 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/constants.d.ts +36 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +37 -0
- package/dist/constants.js.map +1 -0
- package/dist/detect/frameworks.d.ts +11 -2
- package/dist/detect/frameworks.d.ts.map +1 -1
- package/dist/detect/frameworks.js +78 -78
- package/dist/detect/frameworks.js.map +1 -1
- package/dist/detect/index.d.ts +1 -0
- package/dist/detect/index.d.ts.map +1 -1
- package/dist/detect/index.js +3 -0
- package/dist/detect/index.js.map +1 -1
- package/dist/detect/monorepo-patterns.d.ts +54 -0
- package/dist/detect/monorepo-patterns.d.ts.map +1 -0
- package/dist/detect/monorepo-patterns.js +209 -0
- package/dist/detect/monorepo-patterns.js.map +1 -0
- package/dist/detect/project-detector.d.ts +1 -1
- package/dist/detect/project-detector.d.ts.map +1 -1
- package/dist/detect/project-detector.js +132 -0
- package/dist/detect/project-detector.js.map +1 -1
- package/dist/explain/agents.d.ts +31 -0
- package/dist/explain/agents.d.ts.map +1 -0
- package/dist/explain/agents.js +507 -0
- package/dist/explain/agents.js.map +1 -0
- package/dist/hooks/index.d.ts +26 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +283 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -7
- package/dist/index.js.map +1 -1
- package/dist/integrations/github-formatter.d.ts +55 -0
- package/dist/integrations/github-formatter.d.ts.map +1 -0
- package/dist/integrations/github-formatter.js +391 -0
- package/dist/integrations/github-formatter.js.map +1 -0
- package/dist/integrations/github.d.ts +95 -0
- package/dist/integrations/github.d.ts.map +1 -0
- package/dist/integrations/github.js +281 -0
- package/dist/integrations/github.js.map +1 -0
- package/dist/integrations/index.d.ts +4 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +4 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/output/formatters.d.ts.map +1 -1
- package/dist/output/formatters.js +5 -10
- package/dist/output/formatters.js.map +1 -1
- package/dist/scan/orchestrator.d.ts +76 -0
- package/dist/scan/orchestrator.d.ts.map +1 -0
- package/dist/scan/orchestrator.js +247 -0
- package/dist/scan/orchestrator.js.map +1 -0
- package/dist/services/ai-analysis.d.ts +54 -0
- package/dist/services/ai-analysis.d.ts.map +1 -0
- package/dist/services/ai-analysis.js +239 -0
- package/dist/services/ai-analysis.js.map +1 -0
- package/dist/services/drift-analysis.d.ts +77 -0
- package/dist/services/drift-analysis.d.ts.map +1 -0
- package/dist/services/drift-analysis.js +145 -0
- package/dist/services/drift-analysis.js.map +1 -0
- package/package.json +17 -5
- package/dist/commands/__tests__/ci.test.d.ts +0 -2
- package/dist/commands/__tests__/ci.test.d.ts.map +0 -1
- package/dist/commands/__tests__/ci.test.js +0 -33
- package/dist/commands/__tests__/ci.test.js.map +0 -1
- package/dist/commands/bootstrap.d.ts +0 -3
- package/dist/commands/bootstrap.d.ts.map +0 -1
- package/dist/commands/bootstrap.js +0 -458
- package/dist/commands/bootstrap.js.map +0 -1
- package/dist/plugins/index.d.ts +0 -3
- package/dist/plugins/index.d.ts.map +0 -1
- package/dist/plugins/index.js +0 -3
- package/dist/plugins/index.js.map +0 -1
- package/dist/plugins/loader.d.ts +0 -11
- package/dist/plugins/loader.d.ts.map +0 -1
- package/dist/plugins/loader.js +0 -77
- package/dist/plugins/loader.js.map +0 -1
- package/dist/plugins/registry.d.ts +0 -15
- package/dist/plugins/registry.d.ts.map +0 -1
- package/dist/plugins/registry.js +0 -32
- package/dist/plugins/registry.js.map +0 -1
|
@@ -1,458 +0,0 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import { writeFileSync, readFileSync } from 'fs';
|
|
3
|
-
import { resolve, relative } from 'path';
|
|
4
|
-
import chalk from 'chalk';
|
|
5
|
-
import { glob } from 'glob';
|
|
6
|
-
import { loadConfig, getConfigPath } from '../config/loader.js';
|
|
7
|
-
import { spinner, success, error, info, header, newline, warning } from '../output/reporters.js';
|
|
8
|
-
import { detectFrameworks } from '../detect/frameworks.js';
|
|
9
|
-
// Patterns for detecting hardcoded values in CSS/SCSS
|
|
10
|
-
const COLOR_PATTERNS = [
|
|
11
|
-
/#[0-9a-fA-F]{3,8}\b/g, // Hex colors
|
|
12
|
-
/rgb\s*\([^)]+\)/gi, // rgb()
|
|
13
|
-
/rgba\s*\([^)]+\)/gi, // rgba()
|
|
14
|
-
/hsl\s*\([^)]+\)/gi, // hsl()
|
|
15
|
-
/hsla\s*\([^)]+\)/gi, // hsla()
|
|
16
|
-
];
|
|
17
|
-
const SPACING_PATTERN = /:\s*(\d+(?:\.\d+)?(?:px|rem|em))\s*[;}\n]/g;
|
|
18
|
-
const FONT_SIZE_PATTERN = /font-size\s*:\s*(\d+(?:\.\d+)?(?:px|rem|em|pt))/gi;
|
|
19
|
-
export function createBootstrapCommand() {
|
|
20
|
-
const cmd = new Command('bootstrap')
|
|
21
|
-
.description('Extract design tokens from existing hardcoded values')
|
|
22
|
-
.option('--format <format>', 'Output format: json, css-variables, tailwind', 'json')
|
|
23
|
-
.option('--output <path>', 'Output file path', 'tokens.json')
|
|
24
|
-
.option('--dry-run', 'Preview without writing files')
|
|
25
|
-
.option('-v, --verbose', 'Show detailed extraction info')
|
|
26
|
-
.action(async (options) => {
|
|
27
|
-
try {
|
|
28
|
-
const cwd = process.cwd();
|
|
29
|
-
// Early validation: Check if this is a frontend project
|
|
30
|
-
const frameworks = await detectFrameworks(cwd);
|
|
31
|
-
const frontendFrameworks = frameworks.filter(f => ['react', 'vue', 'svelte', 'angular', 'webcomponents', 'tailwind', 'css'].includes(f.plugin));
|
|
32
|
-
// Check for style files
|
|
33
|
-
const stylePatterns = ['**/*.css', '**/*.scss', '**/*.sass', '**/*.less'];
|
|
34
|
-
const styleIgnore = ['**/node_modules/**', '**/dist/**', '**/build/**'];
|
|
35
|
-
let hasStyleFiles = false;
|
|
36
|
-
for (const pattern of stylePatterns) {
|
|
37
|
-
const matches = await glob(pattern, { cwd, ignore: styleIgnore, nodir: true });
|
|
38
|
-
if (matches.length > 0) {
|
|
39
|
-
hasStyleFiles = true;
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// If no frontend framework and no style files, abort early
|
|
44
|
-
if (frontendFrameworks.length === 0 && !hasStyleFiles) {
|
|
45
|
-
newline();
|
|
46
|
-
warning('This doesn\'t appear to be a frontend project.');
|
|
47
|
-
newline();
|
|
48
|
-
info('Bootstrap extracts design tokens from existing CSS and component files.');
|
|
49
|
-
info('No frontend frameworks or stylesheets were detected in this project.');
|
|
50
|
-
newline();
|
|
51
|
-
console.log(chalk.dim('Detected project type:'));
|
|
52
|
-
if (frameworks.length > 0) {
|
|
53
|
-
frameworks.forEach(f => console.log(chalk.dim(` • ${f.name} (${f.evidence})`)));
|
|
54
|
-
}
|
|
55
|
-
else {
|
|
56
|
-
console.log(chalk.dim(' • No known frameworks detected'));
|
|
57
|
-
}
|
|
58
|
-
newline();
|
|
59
|
-
console.log(chalk.cyan('💡 If this is a frontend project:'));
|
|
60
|
-
console.log(chalk.dim(' • Ensure you\'re in the correct directory'));
|
|
61
|
-
console.log(chalk.dim(' • Check that your CSS/component files exist'));
|
|
62
|
-
newline();
|
|
63
|
-
console.log(chalk.cyan('💡 To create a design system from scratch:'));
|
|
64
|
-
console.log(chalk.dim(' Run: buoy build'));
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const spin = spinner('Scanning for hardcoded values...');
|
|
68
|
-
const extracted = new Map();
|
|
69
|
-
// Check if config exists - if so, use component scanning
|
|
70
|
-
const configExists = getConfigPath() !== null;
|
|
71
|
-
if (configExists) {
|
|
72
|
-
spin.text = 'Scanning components for hardcoded values...';
|
|
73
|
-
await extractFromComponents(cwd, extracted, options.verbose);
|
|
74
|
-
}
|
|
75
|
-
// Always scan CSS/SCSS files
|
|
76
|
-
spin.text = 'Scanning stylesheets...';
|
|
77
|
-
await extractFromStylesheets(cwd, extracted, options.verbose);
|
|
78
|
-
spin.stop();
|
|
79
|
-
// Group by type
|
|
80
|
-
const colors = [...extracted.values()].filter(v => v.type === 'color');
|
|
81
|
-
const spacing = [...extracted.values()].filter(v => v.type === 'spacing');
|
|
82
|
-
const fontSizes = [...extracted.values()].filter(v => v.type === 'fontSize');
|
|
83
|
-
// Display summary
|
|
84
|
-
newline();
|
|
85
|
-
header('Extracted Values');
|
|
86
|
-
newline();
|
|
87
|
-
if (colors.length === 0 && spacing.length === 0 && fontSizes.length === 0) {
|
|
88
|
-
info('No hardcoded values found to extract.');
|
|
89
|
-
newline();
|
|
90
|
-
info('This could mean:');
|
|
91
|
-
info(' • Your codebase already uses design tokens');
|
|
92
|
-
info(' • No CSS/component files were found');
|
|
93
|
-
info(' • Values are using CSS variables or theme objects');
|
|
94
|
-
newline();
|
|
95
|
-
// Suggest buoy build
|
|
96
|
-
console.log(chalk.cyan('💡 Want to create a design system from scratch?'));
|
|
97
|
-
console.log(chalk.dim(' Run: buoy build'));
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
console.log(` ${chalk.cyan('Colors:')} ${colors.length} unique values`);
|
|
101
|
-
if (options.verbose && colors.length > 0) {
|
|
102
|
-
colors.slice(0, 5).forEach(c => {
|
|
103
|
-
console.log(chalk.dim(` ${c.value} (${c.count}x)`));
|
|
104
|
-
});
|
|
105
|
-
if (colors.length > 5)
|
|
106
|
-
console.log(chalk.dim(` ... and ${colors.length - 5} more`));
|
|
107
|
-
}
|
|
108
|
-
console.log(` ${chalk.cyan('Spacing:')} ${spacing.length} unique values`);
|
|
109
|
-
if (options.verbose && spacing.length > 0) {
|
|
110
|
-
spacing.slice(0, 5).forEach(s => {
|
|
111
|
-
console.log(chalk.dim(` ${s.value} (${s.count}x)`));
|
|
112
|
-
});
|
|
113
|
-
if (spacing.length > 5)
|
|
114
|
-
console.log(chalk.dim(` ... and ${spacing.length - 5} more`));
|
|
115
|
-
}
|
|
116
|
-
console.log(` ${chalk.cyan('Font sizes:')} ${fontSizes.length} unique values`);
|
|
117
|
-
if (options.verbose && fontSizes.length > 0) {
|
|
118
|
-
fontSizes.slice(0, 5).forEach(f => {
|
|
119
|
-
console.log(chalk.dim(` ${f.value} (${f.count}x)`));
|
|
120
|
-
});
|
|
121
|
-
if (fontSizes.length > 5)
|
|
122
|
-
console.log(chalk.dim(` ... and ${fontSizes.length - 5} more`));
|
|
123
|
-
}
|
|
124
|
-
newline();
|
|
125
|
-
// Generate output
|
|
126
|
-
const outputPath = resolve(cwd, options.output);
|
|
127
|
-
if (options.dryRun) {
|
|
128
|
-
info('Dry run - no files written');
|
|
129
|
-
newline();
|
|
130
|
-
console.log(chalk.dim('Would generate:'));
|
|
131
|
-
console.log(chalk.dim(` ${outputPath}`));
|
|
132
|
-
newline();
|
|
133
|
-
// Preview the output
|
|
134
|
-
const tokens = generateTokens(colors, spacing, fontSizes);
|
|
135
|
-
console.log(chalk.dim(JSON.stringify(tokens, null, 2).slice(0, 500) + '...'));
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
// Generate and write tokens
|
|
139
|
-
const tokens = generateTokens(colors, spacing, fontSizes);
|
|
140
|
-
switch (options.format) {
|
|
141
|
-
case 'css-variables':
|
|
142
|
-
writeFileSync(outputPath.replace('.json', '.css'), generateCssVariables(tokens));
|
|
143
|
-
success(`Created ${relative(cwd, outputPath.replace('.json', '.css'))}`);
|
|
144
|
-
break;
|
|
145
|
-
case 'tailwind':
|
|
146
|
-
writeFileSync(outputPath.replace('.json', '.js'), generateTailwindConfig(tokens));
|
|
147
|
-
success(`Created ${relative(cwd, outputPath.replace('.json', '.js'))}`);
|
|
148
|
-
break;
|
|
149
|
-
default:
|
|
150
|
-
writeFileSync(outputPath, JSON.stringify(tokens, null, 2));
|
|
151
|
-
success(`Created ${relative(cwd, outputPath)}`);
|
|
152
|
-
}
|
|
153
|
-
newline();
|
|
154
|
-
info('Next steps:');
|
|
155
|
-
info(' 1. Review and rename tokens in the generated file');
|
|
156
|
-
info(' 2. Update your config to reference the token file');
|
|
157
|
-
info(' 3. Run ' + chalk.cyan('buoy drift check') + ' to find usage of hardcoded values');
|
|
158
|
-
newline();
|
|
159
|
-
console.log(chalk.dim('💡 Tip: Use buoy build to generate a complete design system with AI'));
|
|
160
|
-
}
|
|
161
|
-
catch (err) {
|
|
162
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
163
|
-
error(`Bootstrap failed: ${message}`);
|
|
164
|
-
process.exit(1);
|
|
165
|
-
}
|
|
166
|
-
});
|
|
167
|
-
return cmd;
|
|
168
|
-
}
|
|
169
|
-
async function extractFromComponents(cwd, extracted, _verbose) {
|
|
170
|
-
const { config } = await loadConfig();
|
|
171
|
-
// Import scanners dynamically
|
|
172
|
-
const { ReactComponentScanner, VueComponentScanner, SvelteComponentScanner, } = await import('@buoy-design/scanners/git');
|
|
173
|
-
// Scan React components
|
|
174
|
-
if (config.sources.react?.enabled) {
|
|
175
|
-
const scanner = new ReactComponentScanner({
|
|
176
|
-
projectRoot: cwd,
|
|
177
|
-
include: config.sources.react.include,
|
|
178
|
-
exclude: config.sources.react.exclude,
|
|
179
|
-
});
|
|
180
|
-
const result = await scanner.scan();
|
|
181
|
-
for (const component of result.items) {
|
|
182
|
-
if (component.metadata.hardcodedValues) {
|
|
183
|
-
const sourcePath = 'path' in component.source ? component.source.path : component.name;
|
|
184
|
-
for (const hv of component.metadata.hardcodedValues) {
|
|
185
|
-
addExtractedValue(extracted, hv.value, hv.type, sourcePath);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
// Scan Vue components
|
|
191
|
-
if (config.sources.vue?.enabled) {
|
|
192
|
-
const scanner = new VueComponentScanner({
|
|
193
|
-
projectRoot: cwd,
|
|
194
|
-
include: config.sources.vue.include,
|
|
195
|
-
exclude: config.sources.vue.exclude,
|
|
196
|
-
});
|
|
197
|
-
const result = await scanner.scan();
|
|
198
|
-
for (const component of result.items) {
|
|
199
|
-
if (component.metadata.hardcodedValues) {
|
|
200
|
-
const sourcePath = 'path' in component.source ? component.source.path : component.name;
|
|
201
|
-
for (const hv of component.metadata.hardcodedValues) {
|
|
202
|
-
addExtractedValue(extracted, hv.value, hv.type, sourcePath);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
// Scan Svelte components
|
|
208
|
-
if (config.sources.svelte?.enabled) {
|
|
209
|
-
const scanner = new SvelteComponentScanner({
|
|
210
|
-
projectRoot: cwd,
|
|
211
|
-
include: config.sources.svelte.include,
|
|
212
|
-
exclude: config.sources.svelte.exclude,
|
|
213
|
-
});
|
|
214
|
-
const result = await scanner.scan();
|
|
215
|
-
for (const component of result.items) {
|
|
216
|
-
if (component.metadata.hardcodedValues) {
|
|
217
|
-
const sourcePath = 'path' in component.source ? component.source.path : component.name;
|
|
218
|
-
for (const hv of component.metadata.hardcodedValues) {
|
|
219
|
-
addExtractedValue(extracted, hv.value, hv.type, sourcePath);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
async function extractFromStylesheets(cwd, extracted, _verbose) {
|
|
226
|
-
// Find CSS/SCSS files
|
|
227
|
-
const patterns = ['**/*.css', '**/*.scss', '**/*.sass', '**/*.less'];
|
|
228
|
-
const ignore = ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.next/**'];
|
|
229
|
-
const files = [];
|
|
230
|
-
for (const pattern of patterns) {
|
|
231
|
-
const matches = await glob(pattern, { cwd, ignore, absolute: true });
|
|
232
|
-
files.push(...matches);
|
|
233
|
-
}
|
|
234
|
-
for (const file of files) {
|
|
235
|
-
try {
|
|
236
|
-
const content = readFileSync(file, 'utf-8');
|
|
237
|
-
const relativePath = relative(cwd, file);
|
|
238
|
-
// Skip files that are likely generated or vendor
|
|
239
|
-
if (relativePath.includes('vendor') || relativePath.includes('.min.')) {
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
// Extract colors
|
|
243
|
-
for (const pattern of COLOR_PATTERNS) {
|
|
244
|
-
const matches = content.matchAll(pattern);
|
|
245
|
-
for (const match of matches) {
|
|
246
|
-
const value = match[0].toLowerCase();
|
|
247
|
-
// Skip CSS variable references
|
|
248
|
-
if (!value.includes('var(')) {
|
|
249
|
-
addExtractedValue(extracted, value, 'color', relativePath);
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
// Extract spacing values
|
|
254
|
-
const spacingMatches = content.matchAll(SPACING_PATTERN);
|
|
255
|
-
for (const match of spacingMatches) {
|
|
256
|
-
if (match[1]) {
|
|
257
|
-
addExtractedValue(extracted, match[1], 'spacing', relativePath);
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
// Extract font sizes
|
|
261
|
-
const fontMatches = content.matchAll(FONT_SIZE_PATTERN);
|
|
262
|
-
for (const match of fontMatches) {
|
|
263
|
-
if (match[1]) {
|
|
264
|
-
addExtractedValue(extracted, match[1], 'fontSize', relativePath);
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
catch {
|
|
269
|
-
// Skip files that can't be read
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
function addExtractedValue(extracted, value, type, source) {
|
|
274
|
-
const key = `${type}:${value}`;
|
|
275
|
-
const existing = extracted.get(key);
|
|
276
|
-
if (existing) {
|
|
277
|
-
existing.count++;
|
|
278
|
-
if (!existing.sources.includes(source)) {
|
|
279
|
-
existing.sources.push(source);
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
extracted.set(key, {
|
|
284
|
-
type,
|
|
285
|
-
value,
|
|
286
|
-
count: 1,
|
|
287
|
-
sources: [source],
|
|
288
|
-
});
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
function generateTokens(colors, spacing, fontSizes) {
|
|
292
|
-
const tokens = {
|
|
293
|
-
colors: {},
|
|
294
|
-
spacing: {},
|
|
295
|
-
typography: {
|
|
296
|
-
fontSizes: {},
|
|
297
|
-
},
|
|
298
|
-
};
|
|
299
|
-
// Sort by frequency (most used first)
|
|
300
|
-
colors.sort((a, b) => b.count - a.count);
|
|
301
|
-
spacing.sort((a, b) => b.count - a.count);
|
|
302
|
-
fontSizes.sort((a, b) => b.count - a.count);
|
|
303
|
-
// Generate color tokens
|
|
304
|
-
colors.forEach((color, i) => {
|
|
305
|
-
const name = generateColorName(color.value, i);
|
|
306
|
-
tokens.colors[name] = {
|
|
307
|
-
value: color.value,
|
|
308
|
-
description: `Used ${color.count}x`,
|
|
309
|
-
};
|
|
310
|
-
});
|
|
311
|
-
// Generate spacing tokens
|
|
312
|
-
spacing.forEach((space, i) => {
|
|
313
|
-
const name = generateSpacingName(space.value, i);
|
|
314
|
-
tokens.spacing[name] = {
|
|
315
|
-
value: space.value,
|
|
316
|
-
description: `Used ${space.count}x`,
|
|
317
|
-
};
|
|
318
|
-
});
|
|
319
|
-
// Generate font size tokens
|
|
320
|
-
fontSizes.forEach((size, i) => {
|
|
321
|
-
const name = generateFontSizeName(size.value, i);
|
|
322
|
-
tokens.typography.fontSizes[name] = {
|
|
323
|
-
value: size.value,
|
|
324
|
-
description: `Used ${size.count}x`,
|
|
325
|
-
};
|
|
326
|
-
});
|
|
327
|
-
return tokens;
|
|
328
|
-
}
|
|
329
|
-
function generateColorName(value, index) {
|
|
330
|
-
// Try to generate semantic names based on value
|
|
331
|
-
const lower = value.toLowerCase();
|
|
332
|
-
if (lower === '#fff' || lower === '#ffffff' || lower === 'rgb(255, 255, 255)') {
|
|
333
|
-
return 'white';
|
|
334
|
-
}
|
|
335
|
-
if (lower === '#000' || lower === '#000000' || lower === 'rgb(0, 0, 0)') {
|
|
336
|
-
return 'black';
|
|
337
|
-
}
|
|
338
|
-
// For other colors, use generic names
|
|
339
|
-
return `color-${index + 1}`;
|
|
340
|
-
}
|
|
341
|
-
function generateSpacingName(value, index) {
|
|
342
|
-
// Map common values to semantic names
|
|
343
|
-
const num = parseFloat(value);
|
|
344
|
-
if (value.includes('rem')) {
|
|
345
|
-
return `space-${Math.round(num * 4)}`;
|
|
346
|
-
}
|
|
347
|
-
if (value.includes('px')) {
|
|
348
|
-
if (num <= 4)
|
|
349
|
-
return 'space-xs';
|
|
350
|
-
if (num <= 8)
|
|
351
|
-
return 'space-sm';
|
|
352
|
-
if (num <= 16)
|
|
353
|
-
return 'space-md';
|
|
354
|
-
if (num <= 24)
|
|
355
|
-
return 'space-lg';
|
|
356
|
-
if (num <= 32)
|
|
357
|
-
return 'space-xl';
|
|
358
|
-
return `space-${index + 1}`;
|
|
359
|
-
}
|
|
360
|
-
return `space-${index + 1}`;
|
|
361
|
-
}
|
|
362
|
-
function generateFontSizeName(value, index) {
|
|
363
|
-
const num = parseFloat(value);
|
|
364
|
-
if (value.includes('px')) {
|
|
365
|
-
if (num <= 12)
|
|
366
|
-
return 'text-xs';
|
|
367
|
-
if (num <= 14)
|
|
368
|
-
return 'text-sm';
|
|
369
|
-
if (num <= 16)
|
|
370
|
-
return 'text-base';
|
|
371
|
-
if (num <= 18)
|
|
372
|
-
return 'text-lg';
|
|
373
|
-
if (num <= 20)
|
|
374
|
-
return 'text-xl';
|
|
375
|
-
if (num <= 24)
|
|
376
|
-
return 'text-2xl';
|
|
377
|
-
if (num <= 30)
|
|
378
|
-
return 'text-3xl';
|
|
379
|
-
return `text-${index + 1}`;
|
|
380
|
-
}
|
|
381
|
-
if (value.includes('rem')) {
|
|
382
|
-
if (num <= 0.75)
|
|
383
|
-
return 'text-xs';
|
|
384
|
-
if (num <= 0.875)
|
|
385
|
-
return 'text-sm';
|
|
386
|
-
if (num <= 1)
|
|
387
|
-
return 'text-base';
|
|
388
|
-
if (num <= 1.125)
|
|
389
|
-
return 'text-lg';
|
|
390
|
-
if (num <= 1.25)
|
|
391
|
-
return 'text-xl';
|
|
392
|
-
return `text-${index + 1}`;
|
|
393
|
-
}
|
|
394
|
-
return `text-${index + 1}`;
|
|
395
|
-
}
|
|
396
|
-
function generateCssVariables(tokens) {
|
|
397
|
-
const lines = [
|
|
398
|
-
'/* Generated by buoy bootstrap */',
|
|
399
|
-
'/* Review and rename these variables as needed */',
|
|
400
|
-
'',
|
|
401
|
-
':root {',
|
|
402
|
-
];
|
|
403
|
-
// Colors
|
|
404
|
-
if (Object.keys(tokens.colors).length > 0) {
|
|
405
|
-
lines.push(' /* Colors */');
|
|
406
|
-
for (const [name, token] of Object.entries(tokens.colors)) {
|
|
407
|
-
lines.push(` --${name}: ${token.value};`);
|
|
408
|
-
}
|
|
409
|
-
lines.push('');
|
|
410
|
-
}
|
|
411
|
-
// Spacing
|
|
412
|
-
if (Object.keys(tokens.spacing).length > 0) {
|
|
413
|
-
lines.push(' /* Spacing */');
|
|
414
|
-
for (const [name, token] of Object.entries(tokens.spacing)) {
|
|
415
|
-
lines.push(` --${name}: ${token.value};`);
|
|
416
|
-
}
|
|
417
|
-
lines.push('');
|
|
418
|
-
}
|
|
419
|
-
// Typography
|
|
420
|
-
if (Object.keys(tokens.typography.fontSizes).length > 0) {
|
|
421
|
-
lines.push(' /* Typography */');
|
|
422
|
-
for (const [name, token] of Object.entries(tokens.typography.fontSizes)) {
|
|
423
|
-
lines.push(` --${name}: ${token.value};`);
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
lines.push('}');
|
|
427
|
-
lines.push('');
|
|
428
|
-
return lines.join('\n');
|
|
429
|
-
}
|
|
430
|
-
function generateTailwindConfig(tokens) {
|
|
431
|
-
const colors = {};
|
|
432
|
-
const spacing = {};
|
|
433
|
-
const fontSize = {};
|
|
434
|
-
for (const [name, token] of Object.entries(tokens.colors)) {
|
|
435
|
-
colors[name] = token.value;
|
|
436
|
-
}
|
|
437
|
-
for (const [name, token] of Object.entries(tokens.spacing)) {
|
|
438
|
-
spacing[name.replace('space-', '')] = token.value;
|
|
439
|
-
}
|
|
440
|
-
for (const [name, token] of Object.entries(tokens.typography.fontSizes)) {
|
|
441
|
-
fontSize[name.replace('text-', '')] = token.value;
|
|
442
|
-
}
|
|
443
|
-
return `// Generated by buoy bootstrap
|
|
444
|
-
// Review and rename these values as needed
|
|
445
|
-
|
|
446
|
-
/** @type {import('tailwindcss').Config} */
|
|
447
|
-
module.exports = {
|
|
448
|
-
theme: {
|
|
449
|
-
extend: {
|
|
450
|
-
colors: ${JSON.stringify(colors, null, 6).replace(/\n/g, '\n ')},
|
|
451
|
-
spacing: ${JSON.stringify(spacing, null, 6).replace(/\n/g, '\n ')},
|
|
452
|
-
fontSize: ${JSON.stringify(fontSize, null, 6).replace(/\n/g, '\n ')},
|
|
453
|
-
},
|
|
454
|
-
},
|
|
455
|
-
};
|
|
456
|
-
`;
|
|
457
|
-
}
|
|
458
|
-
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjG,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,sDAAsD;AACtD,MAAM,cAAc,GAAG;IACrB,sBAAsB,EAAY,aAAa;IAC/C,mBAAmB,EAAgB,QAAQ;IAC3C,oBAAoB,EAAe,SAAS;IAC5C,mBAAmB,EAAgB,QAAQ;IAC3C,oBAAoB,EAAe,SAAS;CAC7C,CAAC;AAEF,MAAM,eAAe,GAAG,4CAA4C,CAAC;AACrE,MAAM,iBAAiB,GAAG,mDAAmD,CAAC;AAkB9E,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;SACjC,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,mBAAmB,EAAE,8CAA8C,EAAE,MAAM,CAAC;SACnF,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,aAAa,CAAC;SAC5D,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;SACpD,MAAM,CAAC,eAAe,EAAE,+BAA+B,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAE1B,wDAAwD;YACxD,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC/C,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC/C,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAC7F,CAAC;YAEF,wBAAwB;YACxB,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YAC1E,MAAM,WAAW,GAAG,CAAC,oBAAoB,EAAE,YAAY,EAAE,aAAa,CAAC,CAAC;YACxE,IAAI,aAAa,GAAG,KAAK,CAAC;YAE1B,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE,CAAC;gBACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACvB,aAAa,GAAG,IAAI,CAAC;oBACrB,MAAM;gBACR,CAAC;YACH,CAAC;YAED,2DAA2D;YAC3D,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBACtD,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,gDAAgD,CAAC,CAAC;gBAC1D,OAAO,EAAE,CAAC;gBACV,IAAI,CAAC,yEAAyE,CAAC,CAAC;gBAChF,IAAI,CAAC,sEAAsE,CAAC,CAAC;gBAC7E,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBACjD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;gBACnF,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC,CAAC;gBAC7D,CAAC;gBACD,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;gBAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;gBACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC,CAAC;gBACzE,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,MAAM,IAAI,GAAG,OAAO,CAAC,kCAAkC,CAAC,CAAC;YACzD,MAAM,SAAS,GAAgC,IAAI,GAAG,EAAE,CAAC;YAEzD,yDAAyD;YACzD,MAAM,YAAY,GAAG,aAAa,EAAE,KAAK,IAAI,CAAC;YAE9C,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC,IAAI,GAAG,6CAA6C,CAAC;gBAC1D,MAAM,qBAAqB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAC/D,CAAC;YAED,6BAA6B;YAC7B,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;YACtC,MAAM,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YAE9D,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,gBAAgB;YAChB,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAC1E,MAAM,SAAS,GAAG,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;YAE7E,kBAAkB;YAClB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,kBAAkB,CAAC,CAAC;YAC3B,OAAO,EAAE,CAAC;YAEV,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1E,IAAI,CAAC,uCAAuC,CAAC,CAAC;gBAC9C,OAAO,EAAE,CAAC;gBACV,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACzB,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBACrD,IAAI,CAAC,uCAAuC,CAAC,CAAC;gBAC9C,IAAI,CAAC,qDAAqD,CAAC,CAAC;gBAC5D,OAAO,EAAE,CAAC;gBAEV,qBAAqB;gBACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC7C,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,MAAM,gBAAgB,CAAC,CAAC;YACzE,IAAI,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;gBACH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YACzF,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC;YAC3E,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;gBACH,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,OAAO,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3F,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,SAAS,CAAC,MAAM,gBAAgB,CAAC,CAAC;YAChF,IAAI,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;oBAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;gBACzD,CAAC,CAAC,CAAC;gBACH,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,SAAS,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;YAC/F,CAAC;YAED,OAAO,EAAE,CAAC;YAEV,kBAAkB;YAClB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YAEhD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBACnC,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC1C,OAAO,EAAE,CAAC;gBAEV,qBAAqB;gBACrB,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;gBAC9E,OAAO;YACT,CAAC;YAED,4BAA4B;YAC5B,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAE1D,QAAQ,OAAO,CAAC,MAAM,EAAE,CAAC;gBACvB,KAAK,eAAe;oBAClB,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;oBACjF,OAAO,CAAC,WAAW,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;oBACzE,MAAM;gBACR,KAAK,UAAU;oBACb,aAAa,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;oBAClF,OAAO,CAAC,WAAW,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;oBACxE,MAAM;gBACR;oBACE,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC3D,OAAO,CAAC,WAAW,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;YACpD,CAAC;YAED,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,aAAa,CAAC,CAAC;YACpB,IAAI,CAAC,qDAAqD,CAAC,CAAC;YAC5D,IAAI,CAAC,qDAAqD,CAAC,CAAC;YAC5D,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,oCAAoC,CAAC,CAAC;YAC1F,OAAO,EAAE,CAAC;YAEV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC,CAAC;QAEhG,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,KAAK,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,GAAW,EACX,SAAsC,EACtC,QAAiB;IAEjB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,EAAE,CAAC;IAEtC,8BAA8B;IAC9B,MAAM,EACJ,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,GACvB,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;IAE9C,wBAAwB;IACxB,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC;YACxC,WAAW,EAAE,GAAG;YAChB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO;YACrC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO;SACtC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAEpC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;gBACvC,MAAM,UAAU,GAAG,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;gBACvF,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;oBACpD,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,mBAAmB,CAAC;YACtC,WAAW,EAAE,GAAG;YAChB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO;YACnC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO;SACpC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAEpC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;gBACvC,MAAM,UAAU,GAAG,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;gBACvF,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;oBACpD,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,sBAAsB,CAAC;YACzC,WAAW,EAAE,GAAG;YAChB,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;YACtC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;SACvC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAEpC,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACrC,IAAI,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;gBACvC,MAAM,UAAU,GAAG,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC;gBACvF,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;oBACpD,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,GAAW,EACX,SAAsC,EACtC,QAAiB;IAEjB,sBAAsB;IACtB,MAAM,QAAQ,GAAG,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IACrE,MAAM,MAAM,GAAG,CAAC,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;IAElF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAEzC,iDAAiD;YACjD,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtE,SAAS;YACX,CAAC;YAED,iBAAiB;YACjB,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAC1C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;oBAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;oBACrC,+BAA+B;oBAC/B,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC5B,iBAAiB,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;YAED,yBAAyB;YACzB,MAAM,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YACzD,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;gBACnC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACb,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;gBAClE,CAAC;YACH,CAAC;YAED,qBAAqB;YACrB,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;YACxD,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;gBAChC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;oBACb,iBAAiB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,gCAAgC;QAClC,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CACxB,SAAsC,EACtC,KAAa,EACb,IAA4B,EAC5B,MAAc;IAEd,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEpC,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACvC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE;YACjB,IAAI;YACJ,KAAK;YACL,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,CAAC,MAAM,CAAC;SAClB,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CACrB,MAAwB,EACxB,OAAyB,EACzB,SAA2B;IAE3B,MAAM,MAAM,GAAgB;QAC1B,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;QACX,UAAU,EAAE;YACV,SAAS,EAAE,EAAE;SACd;KACF,CAAC;IAEF,sCAAsC;IACtC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC1C,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAE5C,wBAAwB;IACxB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,QAAQ,KAAK,CAAC,KAAK,GAAG;SACpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;YACrB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,QAAQ,KAAK,CAAC,KAAK,GAAG;SACpC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,4BAA4B;IAC5B,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,IAAI,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;YAClC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,QAAQ,IAAI,CAAC,KAAK,GAAG;SACnC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,KAAa;IACrD,gDAAgD;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAElC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,oBAAoB,EAAE,CAAC;QAC9E,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,cAAc,EAAE,CAAC;QACxE,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,sCAAsC;IACtC,OAAO,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,KAAa;IACvD,sCAAsC;IACtC,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAE9B,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,SAAS,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;IACxC,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,UAAU,CAAC;QAChC,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,UAAU,CAAC;QAChC,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,UAAU,CAAC;QACjC,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,UAAU,CAAC;QACjC,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,UAAU,CAAC;QACjC,OAAO,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC;IAC9B,CAAC;IAED,OAAO,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa,EAAE,KAAa;IACxD,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAE9B,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,WAAW,CAAC;QAClC,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,SAAS,CAAC;QAChC,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,UAAU,CAAC;QACjC,IAAI,GAAG,IAAI,EAAE;YAAE,OAAO,UAAU,CAAC;QACjC,OAAO,QAAQ,KAAK,GAAG,CAAC,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QAClC,IAAI,GAAG,IAAI,KAAK;YAAE,OAAO,SAAS,CAAC;QACnC,IAAI,GAAG,IAAI,CAAC;YAAE,OAAO,WAAW,CAAC;QACjC,IAAI,GAAG,IAAI,KAAK;YAAE,OAAO,SAAS,CAAC;QACnC,IAAI,GAAG,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QAClC,OAAO,QAAQ,KAAK,GAAG,CAAC,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,QAAQ,KAAK,GAAG,CAAC,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAmB;IAC/C,MAAM,KAAK,GAAa;QACtB,mCAAmC;QACnC,mDAAmD;QACnD,EAAE;QACF,SAAS;KACV,CAAC;IAEF,SAAS;IACT,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,UAAU;IACV,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAC7C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,aAAa;IACb,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACxE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAmB;IACjD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAA2B,EAAE,CAAC;IAE5C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IACpD,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACxE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;IACpD,CAAC;IAED,OAAO;;;;;;;gBAOO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC;iBACzD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC;kBAC1D,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,CAAC;;;;CAI7E,CAAC;AACF,CAAC"}
|
package/dist/plugins/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/plugins/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugins/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/plugins/loader.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { BuoyPlugin } from '@buoy-design/core';
|
|
2
|
-
import { registry } from './registry.js';
|
|
3
|
-
interface LoaderOptions {
|
|
4
|
-
projectRoot?: string;
|
|
5
|
-
autoDiscover?: boolean;
|
|
6
|
-
}
|
|
7
|
-
export declare function loadPlugin(nameOrPath: string): Promise<BuoyPlugin>;
|
|
8
|
-
export declare function discoverPlugins(options?: LoaderOptions): Promise<string[]>;
|
|
9
|
-
export declare function loadDiscoveredPlugins(options?: LoaderOptions): Promise<BuoyPlugin[]>;
|
|
10
|
-
export { registry };
|
|
11
|
-
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AA4BzC,UAAU,aAAa;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA4BxE;AAED,wBAAsB,eAAe,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAepF;AAED,wBAAsB,qBAAqB,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAc9F;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
|
package/dist/plugins/loader.js
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { resolve } from 'node:path';
|
|
2
|
-
import { existsSync } from 'node:fs';
|
|
3
|
-
import { readFile } from 'node:fs/promises';
|
|
4
|
-
import { registry } from './registry.js';
|
|
5
|
-
const PLUGIN_PREFIX = '@buoy-design/plugin-';
|
|
6
|
-
// Security: Only allow safe characters in plugin names to prevent arbitrary package imports
|
|
7
|
-
const VALID_SIMPLE_NAME = /^[a-z0-9-]+$/;
|
|
8
|
-
const VALID_SCOPED_PACKAGE = /^@[a-z0-9-]+\/[a-z0-9-]+$/;
|
|
9
|
-
function validatePluginName(nameOrPath) {
|
|
10
|
-
if (nameOrPath.startsWith('@')) {
|
|
11
|
-
// Scoped package: must match @org/name pattern with safe characters only
|
|
12
|
-
if (!VALID_SCOPED_PACKAGE.test(nameOrPath)) {
|
|
13
|
-
throw new Error(`Invalid plugin name "${nameOrPath}". Scoped packages must match @org/name ` +
|
|
14
|
-
`with only lowercase letters, numbers, and hyphens.`);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
// Simple name: only allow lowercase letters, numbers, and hyphens
|
|
19
|
-
if (!VALID_SIMPLE_NAME.test(nameOrPath)) {
|
|
20
|
-
throw new Error(`Invalid plugin name "${nameOrPath}". Plugin names must contain only ` +
|
|
21
|
-
`lowercase letters, numbers, and hyphens.`);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
export async function loadPlugin(nameOrPath) {
|
|
26
|
-
// Security: Validate plugin name before dynamic import
|
|
27
|
-
validatePluginName(nameOrPath);
|
|
28
|
-
// Handle shorthand: "react" -> "@buoy-design/plugin-react"
|
|
29
|
-
const moduleName = nameOrPath.startsWith('@')
|
|
30
|
-
? nameOrPath
|
|
31
|
-
: `${PLUGIN_PREFIX}${nameOrPath}`;
|
|
32
|
-
try {
|
|
33
|
-
const imported = await import(moduleName);
|
|
34
|
-
const factory = imported.default || imported.plugin || imported;
|
|
35
|
-
if (typeof factory !== 'function') {
|
|
36
|
-
throw new Error(`Plugin ${moduleName} does not export a valid factory function`);
|
|
37
|
-
}
|
|
38
|
-
const plugin = await factory();
|
|
39
|
-
registry.register(plugin);
|
|
40
|
-
return plugin;
|
|
41
|
-
}
|
|
42
|
-
catch (err) {
|
|
43
|
-
if (err.code === 'ERR_MODULE_NOT_FOUND') {
|
|
44
|
-
throw new Error(`Plugin "${moduleName}" not found. Install it with: npm install ${moduleName}`);
|
|
45
|
-
}
|
|
46
|
-
throw err;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
export async function discoverPlugins(options = {}) {
|
|
50
|
-
const projectRoot = options.projectRoot || process.cwd();
|
|
51
|
-
const pkgPath = resolve(projectRoot, 'package.json');
|
|
52
|
-
if (!existsSync(pkgPath)) {
|
|
53
|
-
return [];
|
|
54
|
-
}
|
|
55
|
-
const pkgJson = JSON.parse(await readFile(pkgPath, 'utf-8'));
|
|
56
|
-
const allDeps = {
|
|
57
|
-
...pkgJson.dependencies,
|
|
58
|
-
...pkgJson.devDependencies,
|
|
59
|
-
};
|
|
60
|
-
return Object.keys(allDeps).filter((dep) => dep.startsWith(PLUGIN_PREFIX));
|
|
61
|
-
}
|
|
62
|
-
export async function loadDiscoveredPlugins(options = {}) {
|
|
63
|
-
const pluginNames = await discoverPlugins(options);
|
|
64
|
-
const plugins = [];
|
|
65
|
-
for (const name of pluginNames) {
|
|
66
|
-
try {
|
|
67
|
-
const plugin = await loadPlugin(name);
|
|
68
|
-
plugins.push(plugin);
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
console.warn(`Warning: Failed to load plugin ${name}:`, err.message);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return plugins;
|
|
75
|
-
}
|
|
76
|
-
export { registry };
|
|
77
|
-
//# sourceMappingURL=loader.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/plugins/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import type { BuoyPlugin, PluginMetadata } from '@buoy-design/core';
|
|
2
|
-
export declare class PluginRegistry {
|
|
3
|
-
private plugins;
|
|
4
|
-
register(plugin: BuoyPlugin): void;
|
|
5
|
-
get(name: string): BuoyPlugin | undefined;
|
|
6
|
-
getAll(): BuoyPlugin[];
|
|
7
|
-
getScanners(): BuoyPlugin[];
|
|
8
|
-
getReporters(): BuoyPlugin[];
|
|
9
|
-
getByDetection(framework: string): BuoyPlugin | undefined;
|
|
10
|
-
list(): PluginMetadata[];
|
|
11
|
-
unregister(name: string): boolean;
|
|
12
|
-
clear(): void;
|
|
13
|
-
}
|
|
14
|
-
export declare const registry: PluginRegistry;
|
|
15
|
-
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/plugins/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEpE,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAsC;IAErD,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAIlC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIzC,MAAM,IAAI,UAAU,EAAE;IAItB,WAAW,IAAI,UAAU,EAAE;IAI3B,YAAY,IAAI,UAAU,EAAE;IAI5B,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAMzD,IAAI,IAAI,cAAc,EAAE;IAIxB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,KAAK,IAAI,IAAI;CAGd;AAED,eAAO,MAAM,QAAQ,gBAAuB,CAAC"}
|