@buoy-design/scanners 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/dist/__tests__/fixtures/react-components.d.ts +5 -0
  2. package/dist/__tests__/fixtures/react-components.d.ts.map +1 -0
  3. package/dist/__tests__/fixtures/react-components.js +36 -0
  4. package/dist/__tests__/fixtures/react-components.js.map +1 -0
  5. package/dist/__tests__/setup.d.ts +2 -0
  6. package/dist/__tests__/setup.d.ts.map +1 -0
  7. package/dist/__tests__/setup.js +78 -0
  8. package/dist/__tests__/setup.js.map +1 -0
  9. package/dist/base/index.d.ts +2 -0
  10. package/dist/base/index.d.ts.map +1 -0
  11. package/dist/base/index.js +2 -0
  12. package/dist/base/index.js.map +1 -0
  13. package/dist/base/scanner.d.ts +28 -0
  14. package/dist/base/scanner.d.ts.map +1 -0
  15. package/dist/base/scanner.js +7 -0
  16. package/dist/base/scanner.js.map +1 -0
  17. package/dist/figma/client.d.ts +98 -0
  18. package/dist/figma/client.d.ts.map +1 -0
  19. package/dist/figma/client.js +54 -0
  20. package/dist/figma/client.js.map +1 -0
  21. package/dist/figma/component-scanner.d.ts +22 -0
  22. package/dist/figma/component-scanner.d.ts.map +1 -0
  23. package/dist/figma/component-scanner.js +174 -0
  24. package/dist/figma/component-scanner.js.map +1 -0
  25. package/dist/figma/index.d.ts +3 -0
  26. package/dist/figma/index.d.ts.map +1 -0
  27. package/dist/figma/index.js +3 -0
  28. package/dist/figma/index.js.map +1 -0
  29. package/dist/git/angular-scanner.d.ts +18 -0
  30. package/dist/git/angular-scanner.d.ts.map +1 -0
  31. package/dist/git/angular-scanner.js +244 -0
  32. package/dist/git/angular-scanner.js.map +1 -0
  33. package/dist/git/index.d.ts +8 -0
  34. package/dist/git/index.d.ts.map +1 -0
  35. package/dist/git/index.js +8 -0
  36. package/dist/git/index.js.map +1 -0
  37. package/dist/git/react-scanner.d.ts +29 -0
  38. package/dist/git/react-scanner.d.ts.map +1 -0
  39. package/dist/git/react-scanner.js +469 -0
  40. package/dist/git/react-scanner.js.map +1 -0
  41. package/dist/git/react-scanner.test.d.ts +2 -0
  42. package/dist/git/react-scanner.test.d.ts.map +1 -0
  43. package/dist/git/react-scanner.test.js +107 -0
  44. package/dist/git/react-scanner.test.js.map +1 -0
  45. package/dist/git/svelte-scanner.d.ts +30 -0
  46. package/dist/git/svelte-scanner.d.ts.map +1 -0
  47. package/dist/git/svelte-scanner.js +344 -0
  48. package/dist/git/svelte-scanner.js.map +1 -0
  49. package/dist/git/template-scanner.d.ts +16 -0
  50. package/dist/git/template-scanner.d.ts.map +1 -0
  51. package/dist/git/template-scanner.js +227 -0
  52. package/dist/git/template-scanner.js.map +1 -0
  53. package/dist/git/token-scanner.d.ts +43 -0
  54. package/dist/git/token-scanner.d.ts.map +1 -0
  55. package/dist/git/token-scanner.js +444 -0
  56. package/dist/git/token-scanner.js.map +1 -0
  57. package/dist/git/vue-scanner.d.ts +26 -0
  58. package/dist/git/vue-scanner.d.ts.map +1 -0
  59. package/dist/git/vue-scanner.js +296 -0
  60. package/dist/git/vue-scanner.js.map +1 -0
  61. package/dist/git/webcomponent-scanner.d.ts +22 -0
  62. package/dist/git/webcomponent-scanner.d.ts.map +1 -0
  63. package/dist/git/webcomponent-scanner.js +312 -0
  64. package/dist/git/webcomponent-scanner.js.map +1 -0
  65. package/dist/index.d.ts +7 -0
  66. package/dist/index.d.ts.map +1 -0
  67. package/dist/index.js +12 -0
  68. package/dist/index.js.map +1 -0
  69. package/dist/plugin-adapter.d.ts +11 -0
  70. package/dist/plugin-adapter.d.ts.map +1 -0
  71. package/dist/plugin-adapter.js +21 -0
  72. package/dist/plugin-adapter.js.map +1 -0
  73. package/dist/storybook/extractor.d.ts +20 -0
  74. package/dist/storybook/extractor.d.ts.map +1 -0
  75. package/dist/storybook/extractor.js +146 -0
  76. package/dist/storybook/extractor.js.map +1 -0
  77. package/dist/storybook/index.d.ts +2 -0
  78. package/dist/storybook/index.d.ts.map +1 -0
  79. package/dist/storybook/index.js +2 -0
  80. package/dist/storybook/index.js.map +1 -0
  81. package/package.json +56 -0
@@ -0,0 +1,469 @@
1
+ import { Scanner } from '../base/scanner.js';
2
+ import { createComponentId } from '@buoy-design/core';
3
+ import * as ts from 'typescript';
4
+ import { glob } from 'glob';
5
+ import { readFile } from 'fs/promises';
6
+ import { relative } from 'path';
7
+ // Patterns for detecting hardcoded values
8
+ const COLOR_PATTERNS = [
9
+ /^#[0-9a-fA-F]{3,8}$/, // Hex colors
10
+ /^rgb\s*\(/i, // rgb()
11
+ /^rgba\s*\(/i, // rgba()
12
+ /^hsl\s*\(/i, // hsl()
13
+ /^hsla\s*\(/i, // hsla()
14
+ ];
15
+ const SPACING_PATTERNS = [
16
+ /^\d+(\.\d+)?(px|rem|em|vh|vw|%)$/, // Numeric with units
17
+ ];
18
+ const FONT_SIZE_PATTERNS = [
19
+ /^\d+(\.\d+)?(px|rem|em|pt)$/, // Font sizes
20
+ ];
21
+ // Style properties that commonly contain design tokens
22
+ const STYLE_PROPERTIES = {
23
+ color: 'color',
24
+ backgroundColor: 'color',
25
+ background: 'color',
26
+ borderColor: 'color',
27
+ fill: 'color',
28
+ stroke: 'color',
29
+ padding: 'spacing',
30
+ paddingTop: 'spacing',
31
+ paddingRight: 'spacing',
32
+ paddingBottom: 'spacing',
33
+ paddingLeft: 'spacing',
34
+ margin: 'spacing',
35
+ marginTop: 'spacing',
36
+ marginRight: 'spacing',
37
+ marginBottom: 'spacing',
38
+ marginLeft: 'spacing',
39
+ gap: 'spacing',
40
+ width: 'spacing',
41
+ height: 'spacing',
42
+ top: 'spacing',
43
+ right: 'spacing',
44
+ bottom: 'spacing',
45
+ left: 'spacing',
46
+ fontSize: 'fontSize',
47
+ fontFamily: 'fontFamily',
48
+ boxShadow: 'shadow',
49
+ textShadow: 'shadow',
50
+ border: 'border',
51
+ borderWidth: 'border',
52
+ borderRadius: 'border',
53
+ };
54
+ export class ReactComponentScanner extends Scanner {
55
+ async scan() {
56
+ const startTime = Date.now();
57
+ const files = await this.findComponentFiles();
58
+ const components = [];
59
+ const errors = [];
60
+ for (const file of files) {
61
+ try {
62
+ const parsed = await this.parseFile(file);
63
+ components.push(...parsed);
64
+ }
65
+ catch (err) {
66
+ const message = err instanceof Error ? err.message : String(err);
67
+ errors.push({
68
+ file,
69
+ message,
70
+ code: 'PARSE_ERROR',
71
+ });
72
+ }
73
+ }
74
+ const stats = {
75
+ filesScanned: files.length,
76
+ itemsFound: components.length,
77
+ duration: Date.now() - startTime,
78
+ };
79
+ return { items: components, errors, stats };
80
+ }
81
+ getSourceType() {
82
+ return 'react';
83
+ }
84
+ async findComponentFiles() {
85
+ const patterns = this.config.include || ['**/*.tsx', '**/*.jsx'];
86
+ const ignore = this.config.exclude || [
87
+ '**/node_modules/**',
88
+ '**/*.test.*',
89
+ '**/*.spec.*',
90
+ '**/*.stories.*',
91
+ '**/dist/**',
92
+ '**/build/**',
93
+ ];
94
+ const allFiles = [];
95
+ for (const pattern of patterns) {
96
+ const matches = await glob(pattern, {
97
+ cwd: this.config.projectRoot,
98
+ ignore,
99
+ absolute: true,
100
+ });
101
+ allFiles.push(...matches);
102
+ }
103
+ // Deduplicate
104
+ return [...new Set(allFiles)];
105
+ }
106
+ async parseFile(filePath) {
107
+ const content = await readFile(filePath, 'utf-8');
108
+ const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true, filePath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.JSX);
109
+ const components = [];
110
+ const relativePath = relative(this.config.projectRoot, filePath);
111
+ const visit = (node) => {
112
+ // Function declarations: function Button() {}
113
+ if (ts.isFunctionDeclaration(node) && node.name) {
114
+ if (this.isReactComponent(node, sourceFile)) {
115
+ const comp = this.extractFunctionComponent(node, sourceFile, relativePath);
116
+ if (comp)
117
+ components.push(comp);
118
+ }
119
+ }
120
+ // Variable declarations: const Button = () => {} or const Button = function() {}
121
+ if (ts.isVariableStatement(node)) {
122
+ for (const decl of node.declarationList.declarations) {
123
+ if (ts.isIdentifier(decl.name) && decl.initializer) {
124
+ if (this.isReactComponentExpression(decl.initializer, sourceFile)) {
125
+ const comp = this.extractVariableComponent(decl, sourceFile, relativePath);
126
+ if (comp)
127
+ components.push(comp);
128
+ }
129
+ }
130
+ }
131
+ }
132
+ ts.forEachChild(node, visit);
133
+ };
134
+ ts.forEachChild(sourceFile, visit);
135
+ return components;
136
+ }
137
+ isReactComponent(node, sourceFile) {
138
+ // Check if function name starts with uppercase (React convention)
139
+ if (!node.name)
140
+ return false;
141
+ const name = node.name.getText(sourceFile);
142
+ if (!/^[A-Z]/.test(name))
143
+ return false;
144
+ // Check if it returns JSX
145
+ return this.returnsJsx(node);
146
+ }
147
+ isReactComponentExpression(node, sourceFile) {
148
+ // Arrow function or function expression
149
+ if (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) {
150
+ return this.returnsJsx(node);
151
+ }
152
+ // React.forwardRef or React.memo
153
+ if (ts.isCallExpression(node)) {
154
+ const callText = node.expression.getText(sourceFile);
155
+ if (callText.includes('forwardRef') ||
156
+ callText.includes('memo') ||
157
+ callText.includes('React.forwardRef') ||
158
+ callText.includes('React.memo')) {
159
+ return true;
160
+ }
161
+ }
162
+ return false;
163
+ }
164
+ returnsJsx(node) {
165
+ let hasJsx = false;
166
+ const checkNode = (n) => {
167
+ if (ts.isJsxElement(n) || ts.isJsxSelfClosingElement(n) || ts.isJsxFragment(n)) {
168
+ hasJsx = true;
169
+ return;
170
+ }
171
+ ts.forEachChild(n, checkNode);
172
+ };
173
+ if (node.body) {
174
+ checkNode(node.body);
175
+ }
176
+ return hasJsx;
177
+ }
178
+ extractFunctionComponent(node, sourceFile, relativePath) {
179
+ if (!node.name)
180
+ return null;
181
+ const name = node.name.getText(sourceFile);
182
+ const props = this.extractProps(node.parameters, sourceFile);
183
+ const line = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;
184
+ const source = {
185
+ type: 'react',
186
+ path: relativePath,
187
+ exportName: name,
188
+ line,
189
+ };
190
+ const hardcodedValues = this.extractHardcodedValues(node, sourceFile);
191
+ return {
192
+ id: createComponentId(source, name),
193
+ name,
194
+ source,
195
+ props,
196
+ variants: [],
197
+ tokens: [],
198
+ dependencies: this.extractDependencies(node, sourceFile),
199
+ metadata: {
200
+ deprecated: this.hasDeprecatedTag(node, sourceFile),
201
+ tags: this.extractTags(node, sourceFile),
202
+ hardcodedValues: hardcodedValues.length > 0 ? hardcodedValues : undefined,
203
+ },
204
+ scannedAt: new Date(),
205
+ };
206
+ }
207
+ extractVariableComponent(node, sourceFile, relativePath) {
208
+ if (!ts.isIdentifier(node.name))
209
+ return null;
210
+ const name = node.name.getText(sourceFile);
211
+ // Check for uppercase first letter
212
+ if (!/^[A-Z]/.test(name))
213
+ return null;
214
+ const line = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;
215
+ const source = {
216
+ type: 'react',
217
+ path: relativePath,
218
+ exportName: name,
219
+ line,
220
+ };
221
+ let props = [];
222
+ const init = node.initializer;
223
+ if (init && (ts.isArrowFunction(init) || ts.isFunctionExpression(init))) {
224
+ props = this.extractProps(init.parameters, sourceFile);
225
+ }
226
+ const hardcodedValues = this.extractHardcodedValues(node, sourceFile);
227
+ return {
228
+ id: createComponentId(source, name),
229
+ name,
230
+ source,
231
+ props,
232
+ variants: [],
233
+ tokens: [],
234
+ dependencies: [],
235
+ metadata: {
236
+ tags: [],
237
+ hardcodedValues: hardcodedValues.length > 0 ? hardcodedValues : undefined,
238
+ },
239
+ scannedAt: new Date(),
240
+ };
241
+ }
242
+ extractProps(parameters, sourceFile) {
243
+ const props = [];
244
+ // Usually the first parameter is props
245
+ const propsParam = parameters[0];
246
+ if (!propsParam)
247
+ return props;
248
+ // Check for destructured props or typed props
249
+ const typeNode = propsParam.type;
250
+ if (typeNode && ts.isTypeLiteralNode(typeNode)) {
251
+ for (const member of typeNode.members) {
252
+ if (ts.isPropertySignature(member) && member.name) {
253
+ props.push({
254
+ name: member.name.getText(sourceFile),
255
+ type: member.type ? member.type.getText(sourceFile) : 'unknown',
256
+ required: !member.questionToken,
257
+ });
258
+ }
259
+ }
260
+ }
261
+ else if (typeNode && ts.isTypeReferenceNode(typeNode)) {
262
+ // Reference to an interface/type - we just note the type name
263
+ props.push({
264
+ name: 'props',
265
+ type: typeNode.getText(sourceFile),
266
+ required: true,
267
+ });
268
+ }
269
+ // Handle destructured props: ({ onClick, disabled })
270
+ if (ts.isObjectBindingPattern(propsParam.name)) {
271
+ for (const element of propsParam.name.elements) {
272
+ if (ts.isBindingElement(element) && ts.isIdentifier(element.name)) {
273
+ props.push({
274
+ name: element.name.getText(sourceFile),
275
+ type: 'unknown',
276
+ required: !element.initializer,
277
+ defaultValue: element.initializer
278
+ ? element.initializer.getText(sourceFile)
279
+ : undefined,
280
+ });
281
+ }
282
+ }
283
+ }
284
+ return props;
285
+ }
286
+ extractDependencies(node, sourceFile) {
287
+ const deps = new Set();
288
+ const visit = (n) => {
289
+ // Find JSX elements that reference other components
290
+ if (ts.isJsxOpeningElement(n) || ts.isJsxSelfClosingElement(n)) {
291
+ const tagName = n.tagName.getText(sourceFile);
292
+ // Only include PascalCase names (components, not HTML elements)
293
+ if (/^[A-Z]/.test(tagName)) {
294
+ deps.add(tagName);
295
+ }
296
+ }
297
+ ts.forEachChild(n, visit);
298
+ };
299
+ visit(node);
300
+ return Array.from(deps);
301
+ }
302
+ hasDeprecatedTag(node, sourceFile) {
303
+ const jsDocs = ts.getJSDocTags(node);
304
+ return jsDocs.some(tag => tag.tagName.getText(sourceFile) === 'deprecated');
305
+ }
306
+ extractTags(node, sourceFile) {
307
+ const tags = [];
308
+ const jsDocs = ts.getJSDocTags(node);
309
+ for (const tag of jsDocs) {
310
+ const tagName = tag.tagName.getText(sourceFile);
311
+ if (tagName !== 'param' && tagName !== 'returns' && tagName !== 'type') {
312
+ tags.push(tagName);
313
+ }
314
+ }
315
+ return tags;
316
+ }
317
+ extractHardcodedValues(node, sourceFile) {
318
+ const hardcoded = [];
319
+ const visit = (n) => {
320
+ // Check JSX attributes for style prop
321
+ if (ts.isJsxAttribute(n)) {
322
+ const attrName = n.name.getText(sourceFile);
323
+ // style={{ color: '#fff', padding: '8px' }}
324
+ if (attrName === 'style' && n.initializer) {
325
+ const styleValues = this.extractStyleObjectValues(n.initializer, sourceFile);
326
+ hardcoded.push(...styleValues);
327
+ }
328
+ // Direct color/size props like color="#fff" or size={16}
329
+ if (['color', 'bg', 'backgroundColor', 'fill', 'stroke'].includes(attrName)) {
330
+ const value = this.getJsxAttributeValue(n, sourceFile);
331
+ if (value && this.isHardcodedColor(value)) {
332
+ const line = sourceFile.getLineAndCharacterOfPosition(n.getStart(sourceFile)).line + 1;
333
+ hardcoded.push({
334
+ type: 'color',
335
+ value,
336
+ property: attrName,
337
+ location: `line ${line}`,
338
+ });
339
+ }
340
+ }
341
+ // Size props
342
+ if (['size', 'width', 'height', 'padding', 'margin', 'gap'].includes(attrName)) {
343
+ const value = this.getJsxAttributeValue(n, sourceFile);
344
+ if (value && this.isHardcodedSpacing(value)) {
345
+ const line = sourceFile.getLineAndCharacterOfPosition(n.getStart(sourceFile)).line + 1;
346
+ hardcoded.push({
347
+ type: 'spacing',
348
+ value,
349
+ property: attrName,
350
+ location: `line ${line}`,
351
+ });
352
+ }
353
+ }
354
+ }
355
+ ts.forEachChild(n, visit);
356
+ };
357
+ visit(node);
358
+ // Deduplicate by value+property
359
+ const seen = new Set();
360
+ return hardcoded.filter(h => {
361
+ const key = `${h.property}:${h.value}`;
362
+ if (seen.has(key))
363
+ return false;
364
+ seen.add(key);
365
+ return true;
366
+ });
367
+ }
368
+ extractStyleObjectValues(initializer, sourceFile) {
369
+ const values = [];
370
+ const processObject = (obj) => {
371
+ for (const prop of obj.properties) {
372
+ if (ts.isPropertyAssignment(prop) && prop.name) {
373
+ const propName = prop.name.getText(sourceFile);
374
+ const valueType = STYLE_PROPERTIES[propName];
375
+ if (valueType && prop.initializer) {
376
+ const value = this.getLiteralValue(prop.initializer, sourceFile);
377
+ if (value && this.isHardcodedValue(value, valueType)) {
378
+ const line = sourceFile.getLineAndCharacterOfPosition(prop.getStart(sourceFile)).line + 1;
379
+ values.push({
380
+ type: valueType,
381
+ value,
382
+ property: propName,
383
+ location: `line ${line}`,
384
+ });
385
+ }
386
+ }
387
+ }
388
+ }
389
+ };
390
+ // style={{ ... }}
391
+ if (ts.isJsxExpression(initializer) && initializer.expression) {
392
+ if (ts.isObjectLiteralExpression(initializer.expression)) {
393
+ processObject(initializer.expression);
394
+ }
395
+ }
396
+ return values;
397
+ }
398
+ getJsxAttributeValue(attr, sourceFile) {
399
+ if (!attr.initializer)
400
+ return null;
401
+ // color="red" or color="#fff"
402
+ if (ts.isStringLiteral(attr.initializer)) {
403
+ return attr.initializer.text;
404
+ }
405
+ // color={...}
406
+ if (ts.isJsxExpression(attr.initializer) && attr.initializer.expression) {
407
+ return this.getLiteralValue(attr.initializer.expression, sourceFile);
408
+ }
409
+ return null;
410
+ }
411
+ getLiteralValue(node, sourceFile) {
412
+ if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {
413
+ return node.text;
414
+ }
415
+ if (ts.isNumericLiteral(node)) {
416
+ return node.text;
417
+ }
418
+ // Template literal with static content
419
+ if (ts.isTemplateExpression(node)) {
420
+ // Only if it's a simple template
421
+ const text = node.getText(sourceFile);
422
+ if (!text.includes('${')) {
423
+ return text.slice(1, -1); // Remove backticks
424
+ }
425
+ }
426
+ return null;
427
+ }
428
+ isHardcodedValue(value, type) {
429
+ // Skip CSS variables and token references
430
+ if (value.includes('var(--') || value.includes('theme.') || value.includes('tokens.')) {
431
+ return false;
432
+ }
433
+ switch (type) {
434
+ case 'color':
435
+ return this.isHardcodedColor(value);
436
+ case 'spacing':
437
+ case 'fontSize':
438
+ return this.isHardcodedSpacing(value);
439
+ case 'fontFamily':
440
+ // Font families are often hardcoded, only flag if it's a system font
441
+ return !value.includes('var(--') && !value.includes('inherit');
442
+ default:
443
+ return false;
444
+ }
445
+ }
446
+ isHardcodedColor(value) {
447
+ // Skip CSS variables and token references
448
+ if (value.includes('var(--') || value.includes('theme.') || value.includes('tokens.')) {
449
+ return false;
450
+ }
451
+ // Skip named colors that might be intentional (inherit, transparent, currentColor)
452
+ if (['inherit', 'transparent', 'currentColor', 'initial', 'unset'].includes(value)) {
453
+ return false;
454
+ }
455
+ return COLOR_PATTERNS.some(p => p.test(value));
456
+ }
457
+ isHardcodedSpacing(value) {
458
+ // Skip CSS variables and token references
459
+ if (value.includes('var(--') || value.includes('theme.') || value.includes('tokens.')) {
460
+ return false;
461
+ }
462
+ // Skip common non-token values
463
+ if (['auto', 'inherit', '0', '100%', '50%'].includes(value)) {
464
+ return false;
465
+ }
466
+ return SPACING_PATTERNS.some(p => p.test(value)) || FONT_SIZE_PATTERNS.some(p => p.test(value));
467
+ }
468
+ }
469
+ //# sourceMappingURL=react-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-scanner.js","sourceRoot":"","sources":["../../src/git/react-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=react-scanner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-scanner.test.d.ts","sourceRoot":"","sources":["../../src/git/react-scanner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,107 @@
1
+ // packages/scanners/src/git/react-scanner.test.ts
2
+ import { describe, it, expect, beforeEach } from 'vitest';
3
+ import { vol } from 'memfs';
4
+ import { SIMPLE_BUTTON, ARROW_COMPONENT, HARDCODED_STYLES, DEPRECATED_COMPONENT, } from '../__tests__/fixtures/react-components.js';
5
+ import { ReactComponentScanner } from './react-scanner.js';
6
+ describe('ReactComponentScanner', () => {
7
+ beforeEach(() => {
8
+ vol.reset();
9
+ });
10
+ describe('component detection', () => {
11
+ it('detects function declaration components', async () => {
12
+ vol.fromJSON({
13
+ '/project/src/Button.tsx': SIMPLE_BUTTON,
14
+ });
15
+ const scanner = new ReactComponentScanner({
16
+ projectRoot: '/project',
17
+ include: ['src/**/*.tsx'],
18
+ });
19
+ const result = await scanner.scan();
20
+ expect(result.items).toHaveLength(1);
21
+ expect(result.items[0].name).toBe('Button');
22
+ expect(result.items[0].source.type).toBe('react');
23
+ });
24
+ it('detects arrow function components', async () => {
25
+ vol.fromJSON({
26
+ '/project/src/Card.tsx': ARROW_COMPONENT,
27
+ });
28
+ const scanner = new ReactComponentScanner({
29
+ projectRoot: '/project',
30
+ include: ['src/**/*.tsx'],
31
+ });
32
+ const result = await scanner.scan();
33
+ expect(result.items).toHaveLength(1);
34
+ expect(result.items[0].name).toBe('Card');
35
+ });
36
+ it('ignores non-component functions', async () => {
37
+ vol.fromJSON({
38
+ '/project/src/utils.tsx': `
39
+ export function formatDate(date: Date): string {
40
+ return date.toISOString();
41
+ }
42
+ `,
43
+ });
44
+ const scanner = new ReactComponentScanner({
45
+ projectRoot: '/project',
46
+ include: ['src/**/*.tsx'],
47
+ });
48
+ const result = await scanner.scan();
49
+ expect(result.items).toHaveLength(0);
50
+ });
51
+ it('ignores lowercase named functions', async () => {
52
+ vol.fromJSON({
53
+ '/project/src/helper.tsx': `
54
+ export function button() {
55
+ return <button>Click</button>;
56
+ }
57
+ `,
58
+ });
59
+ const scanner = new ReactComponentScanner({
60
+ projectRoot: '/project',
61
+ include: ['src/**/*.tsx'],
62
+ });
63
+ const result = await scanner.scan();
64
+ expect(result.items).toHaveLength(0);
65
+ });
66
+ });
67
+ describe('hardcoded value detection', () => {
68
+ it('detects hex colors in style prop', async () => {
69
+ vol.fromJSON({
70
+ '/project/src/Badge.tsx': HARDCODED_STYLES,
71
+ });
72
+ const scanner = new ReactComponentScanner({
73
+ projectRoot: '/project',
74
+ include: ['src/**/*.tsx'],
75
+ });
76
+ const result = await scanner.scan();
77
+ const hardcoded = result.items[0].metadata.hardcodedValues || [];
78
+ expect(hardcoded).toContainEqual(expect.objectContaining({ type: 'color', value: '#ff0000' }));
79
+ });
80
+ it('detects hardcoded spacing', async () => {
81
+ vol.fromJSON({
82
+ '/project/src/Badge.tsx': HARDCODED_STYLES,
83
+ });
84
+ const scanner = new ReactComponentScanner({
85
+ projectRoot: '/project',
86
+ include: ['src/**/*.tsx'],
87
+ });
88
+ const result = await scanner.scan();
89
+ const hardcoded = result.items[0].metadata.hardcodedValues || [];
90
+ expect(hardcoded).toContainEqual(expect.objectContaining({ type: 'spacing', value: '8px' }));
91
+ });
92
+ });
93
+ describe('deprecation detection', () => {
94
+ it('detects @deprecated JSDoc tag', async () => {
95
+ vol.fromJSON({
96
+ '/project/src/OldButton.tsx': DEPRECATED_COMPONENT,
97
+ });
98
+ const scanner = new ReactComponentScanner({
99
+ projectRoot: '/project',
100
+ include: ['src/**/*.tsx'],
101
+ });
102
+ const result = await scanner.scan();
103
+ expect(result.items[0].metadata.deprecated).toBe(true);
104
+ });
105
+ });
106
+ });
107
+ //# sourceMappingURL=react-scanner.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-scanner.test.js","sourceRoot":"","sources":["../../src/git/react-scanner.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Scanner, ScanResult, ScannerConfig } from '../base/scanner.js';
2
+ import type { Component } from '@buoy-design/core';
3
+ export interface SvelteScannerConfig extends ScannerConfig {
4
+ designSystemPackage?: string;
5
+ }
6
+ export declare class SvelteComponentScanner extends Scanner<Component, SvelteScannerConfig> {
7
+ scan(): Promise<ScanResult<Component>>;
8
+ getSourceType(): string;
9
+ private findComponentFiles;
10
+ private parseFile;
11
+ /**
12
+ * Extract matched content with proper brace balancing.
13
+ * Handles nested braces like: { cb: () => { value: string } }
14
+ */
15
+ private extractBalancedBraces;
16
+ /**
17
+ * Parse Svelte 5 $props() destructuring with proper handling of nested types.
18
+ * Handles: let { cb = () => {}, data: { nested } = {} } = $props();
19
+ */
20
+ private parseSvelte5Props;
21
+ /**
22
+ * Extract type from export let statement, handling nested types.
23
+ * Handles: export let cb: () => { value: string };
24
+ */
25
+ private extractTypeFromExportLet;
26
+ private extractProps;
27
+ private extractDependencies;
28
+ private hasDeprecatedComment;
29
+ }
30
+ //# sourceMappingURL=svelte-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte-scanner.d.ts","sourceRoot":"","sources":["../../src/git/svelte-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAwB,MAAM,oBAAoB,CAAC;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAgC,MAAM,mBAAmB,CAAC;AAMjF,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,sBAAuB,SAAQ,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC;IAC3E,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IA6B5C,aAAa,IAAI,MAAM;YAIT,kBAAkB;YA0BlB,SAAS;IAwCvB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IA+HzB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IA+BhC,OAAO,CAAC,YAAY;IAsEpB,OAAO,CAAC,mBAAmB;IAoB3B,OAAO,CAAC,oBAAoB;CAG7B"}