@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,296 @@
1
+ import { Scanner } from '../base/scanner.js';
2
+ import { createComponentId } from '@buoy-design/core';
3
+ import { glob } from 'glob';
4
+ import { readFile } from 'fs/promises';
5
+ import { relative, basename } from 'path';
6
+ export class VueComponentScanner extends Scanner {
7
+ async scan() {
8
+ const startTime = Date.now();
9
+ const files = await this.findComponentFiles();
10
+ const components = [];
11
+ const errors = [];
12
+ for (const file of files) {
13
+ try {
14
+ const parsed = await this.parseFile(file);
15
+ if (parsed)
16
+ components.push(parsed);
17
+ }
18
+ catch (err) {
19
+ const message = err instanceof Error ? err.message : String(err);
20
+ errors.push({
21
+ file,
22
+ message,
23
+ code: 'PARSE_ERROR',
24
+ });
25
+ }
26
+ }
27
+ const stats = {
28
+ filesScanned: files.length,
29
+ itemsFound: components.length,
30
+ duration: Date.now() - startTime,
31
+ };
32
+ return { items: components, errors, stats };
33
+ }
34
+ getSourceType() {
35
+ return 'vue';
36
+ }
37
+ async findComponentFiles() {
38
+ const patterns = this.config.include || ['**/*.vue'];
39
+ const ignore = this.config.exclude || [
40
+ '**/node_modules/**',
41
+ '**/*.test.*',
42
+ '**/*.spec.*',
43
+ '**/*.stories.*',
44
+ '**/dist/**',
45
+ '**/build/**',
46
+ ];
47
+ const allFiles = [];
48
+ for (const pattern of patterns) {
49
+ const matches = await glob(pattern, {
50
+ cwd: this.config.projectRoot,
51
+ ignore,
52
+ absolute: true,
53
+ });
54
+ allFiles.push(...matches);
55
+ }
56
+ return [...new Set(allFiles)];
57
+ }
58
+ async parseFile(filePath) {
59
+ const content = await readFile(filePath, 'utf-8');
60
+ const relativePath = relative(this.config.projectRoot, filePath);
61
+ // Extract component name from filename (e.g., MyButton.vue -> MyButton)
62
+ const name = basename(filePath, '.vue');
63
+ // Only process PascalCase component names
64
+ if (!/^[A-Z]/.test(name))
65
+ return null;
66
+ // Extract script content
67
+ const scriptMatch = content.match(/<script[^>]*>([\s\S]*?)<\/script>/);
68
+ const scriptSetupMatch = content.match(/<script\s+setup[^>]*>([\s\S]*?)<\/script>/);
69
+ const scriptContent = scriptSetupMatch?.[1] || scriptMatch?.[1] || '';
70
+ const props = this.extractProps(scriptContent, !!scriptSetupMatch);
71
+ const dependencies = this.extractDependencies(content);
72
+ const source = {
73
+ type: 'vue',
74
+ path: relativePath,
75
+ exportName: name,
76
+ line: 1,
77
+ };
78
+ return {
79
+ id: createComponentId(source, name),
80
+ name,
81
+ source,
82
+ props,
83
+ variants: [],
84
+ tokens: [],
85
+ dependencies,
86
+ metadata: {
87
+ deprecated: this.hasDeprecatedComment(content),
88
+ tags: [],
89
+ },
90
+ scannedAt: new Date(),
91
+ };
92
+ }
93
+ /**
94
+ * Extract matched content with proper brace balancing.
95
+ * Handles nested braces like: { cb: () => { value: string } }
96
+ */
97
+ extractBalancedBraces(content, startIndex) {
98
+ if (content[startIndex] !== '{')
99
+ return null;
100
+ let depth = 0;
101
+ let i = startIndex;
102
+ while (i < content.length) {
103
+ const char = content[i];
104
+ if (char === '{') {
105
+ depth++;
106
+ }
107
+ else if (char === '}') {
108
+ depth--;
109
+ if (depth === 0) {
110
+ // Return content between braces (excluding the braces themselves)
111
+ return content.substring(startIndex + 1, i);
112
+ }
113
+ }
114
+ i++;
115
+ }
116
+ return null; // Unbalanced braces
117
+ }
118
+ /**
119
+ * Parse TypeScript props string into individual prop definitions.
120
+ * Handles complex types like: { cb: () => void, data: { nested: string } }
121
+ */
122
+ parseTypeProps(propsContent) {
123
+ const props = [];
124
+ let i = 0;
125
+ while (i < propsContent.length) {
126
+ // Skip whitespace
127
+ while (i < propsContent.length && /\s/.test(propsContent[i] ?? ''))
128
+ i++;
129
+ if (i >= propsContent.length)
130
+ break;
131
+ // Match prop name
132
+ const nameMatch = propsContent.substring(i).match(/^(\w+)(\?)?:\s*/);
133
+ if (!nameMatch || !nameMatch[1]) {
134
+ // Skip to next comma or end
135
+ while (i < propsContent.length && propsContent[i] !== ',')
136
+ i++;
137
+ i++; // skip comma
138
+ continue;
139
+ }
140
+ const propName = nameMatch[1];
141
+ const isOptional = !!nameMatch[2];
142
+ i += nameMatch[0].length;
143
+ // Now extract the type - need to handle nested braces, parens, and generics
144
+ let typeStr = '';
145
+ let depth = 0;
146
+ const depthChars = { '{': 1, '}': -1, '(': 1, ')': -1, '<': 1, '>': -1 };
147
+ while (i < propsContent.length) {
148
+ const char = propsContent[i];
149
+ if (char === undefined)
150
+ break;
151
+ if (char in depthChars) {
152
+ depth += depthChars[char] ?? 0;
153
+ }
154
+ // Stop at comma or semicolon only when not nested
155
+ if (depth === 0 && (char === ',' || char === ';')) {
156
+ i++; // skip the delimiter
157
+ break;
158
+ }
159
+ typeStr += char;
160
+ i++;
161
+ }
162
+ typeStr = typeStr.trim();
163
+ if (propName && typeStr) {
164
+ props.push({
165
+ name: propName,
166
+ type: typeStr,
167
+ required: !isOptional,
168
+ });
169
+ }
170
+ }
171
+ return props;
172
+ }
173
+ extractProps(scriptContent, isSetup) {
174
+ const props = [];
175
+ if (isSetup) {
176
+ // Vue 3 <script setup> with defineProps
177
+ // defineProps<{ title: string, count?: number }>()
178
+ // Need to handle nested types like: defineProps<{ cb: () => { value: string } }>()
179
+ const typePropsStartMatch = scriptContent.match(/defineProps<\{/);
180
+ if (typePropsStartMatch) {
181
+ const startIdx = scriptContent.indexOf('defineProps<{') + 'defineProps<'.length;
182
+ const propsContent = this.extractBalancedBraces(scriptContent, startIdx);
183
+ if (propsContent) {
184
+ const parsedProps = this.parseTypeProps(propsContent);
185
+ props.push(...parsedProps);
186
+ }
187
+ }
188
+ // defineProps({ title: String, count: { type: Number, required: false } })
189
+ if (props.length === 0) {
190
+ const objPropsStartMatch = scriptContent.match(/defineProps\(\{/);
191
+ if (objPropsStartMatch) {
192
+ const startIdx = scriptContent.indexOf('defineProps({') + 'defineProps('.length;
193
+ const propsContent = this.extractBalancedBraces(scriptContent, startIdx);
194
+ if (propsContent) {
195
+ this.parseObjectProps(propsContent, props);
196
+ }
197
+ }
198
+ }
199
+ // defineProps(['title', 'count'])
200
+ const arrayPropsMatch = scriptContent.match(/defineProps\(\[([^\]]+)\]\)/);
201
+ if (arrayPropsMatch && arrayPropsMatch[1] && props.length === 0) {
202
+ const propNames = arrayPropsMatch[1].match(/['"](\w+)['"]/g);
203
+ if (propNames) {
204
+ for (const p of propNames) {
205
+ props.push({
206
+ name: p.replace(/['"]/g, ''),
207
+ type: 'unknown',
208
+ required: false,
209
+ });
210
+ }
211
+ }
212
+ }
213
+ }
214
+ else {
215
+ // Options API: props: { ... } or props: [...]
216
+ const propsObjStartMatch = scriptContent.match(/props:\s*\{/);
217
+ if (propsObjStartMatch && propsObjStartMatch.index !== undefined) {
218
+ const braceIdx = scriptContent.indexOf('{', propsObjStartMatch.index);
219
+ const propsContent = this.extractBalancedBraces(scriptContent, braceIdx);
220
+ if (propsContent) {
221
+ this.parseObjectProps(propsContent, props);
222
+ }
223
+ }
224
+ const propsArrayMatch = scriptContent.match(/props:\s*\[([^\]]+)\]/);
225
+ if (propsArrayMatch && propsArrayMatch[1] && props.length === 0) {
226
+ const propNames = propsArrayMatch[1].match(/['"](\w+)['"]/g);
227
+ if (propNames) {
228
+ for (const p of propNames) {
229
+ props.push({
230
+ name: p.replace(/['"]/g, ''),
231
+ type: 'unknown',
232
+ required: false,
233
+ });
234
+ }
235
+ }
236
+ }
237
+ }
238
+ return props;
239
+ }
240
+ parseObjectProps(propsStr, props) {
241
+ // Match: propName: Type or propName: { type: Type, required: true }
242
+ const simpleMatch = propsStr.matchAll(/(\w+):\s*(String|Number|Boolean|Array|Object|Function)/g);
243
+ for (const m of simpleMatch) {
244
+ if (m[1] && m[2]) {
245
+ props.push({
246
+ name: m[1],
247
+ type: m[2].toLowerCase(),
248
+ required: false,
249
+ });
250
+ }
251
+ }
252
+ // Match complex props: propName: { type: Type, required: true/false }
253
+ const complexMatch = propsStr.matchAll(/(\w+):\s*\{[^}]*type:\s*(\w+)[^}]*\}/g);
254
+ for (const m of complexMatch) {
255
+ if (m[1] && m[2]) {
256
+ const isRequired = propsStr.includes(`${m[1]}:`) &&
257
+ propsStr.substring(propsStr.indexOf(`${m[1]}:`)).match(/required:\s*true/);
258
+ // Avoid duplicates
259
+ if (!props.some(p => p.name === m[1])) {
260
+ props.push({
261
+ name: m[1],
262
+ type: m[2].toLowerCase(),
263
+ required: !!isRequired,
264
+ });
265
+ }
266
+ }
267
+ }
268
+ }
269
+ extractDependencies(content) {
270
+ const deps = new Set();
271
+ // Find component usage in template: <ComponentName or <component-name
272
+ const templateMatch = content.match(/<template[^>]*>([\s\S]*?)<\/template>/);
273
+ if (templateMatch && templateMatch[1]) {
274
+ const template = templateMatch[1];
275
+ // PascalCase components
276
+ const pascalMatches = template.matchAll(/<([A-Z][a-zA-Z0-9]+)/g);
277
+ for (const m of pascalMatches) {
278
+ if (m[1])
279
+ deps.add(m[1]);
280
+ }
281
+ // kebab-case components (convert to PascalCase)
282
+ const kebabMatches = template.matchAll(/<([a-z]+-[a-z0-9-]+)/g);
283
+ for (const m of kebabMatches) {
284
+ if (m[1]) {
285
+ const pascal = m[1].split('-').map(s => s.charAt(0).toUpperCase() + s.slice(1)).join('');
286
+ deps.add(pascal);
287
+ }
288
+ }
289
+ }
290
+ return Array.from(deps);
291
+ }
292
+ hasDeprecatedComment(content) {
293
+ return content.includes('@deprecated') || content.includes('* @deprecated');
294
+ }
295
+ }
296
+ //# sourceMappingURL=vue-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue-scanner.js","sourceRoot":"","sources":["../../src/git/vue-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Scanner, ScanResult, ScannerConfig } from '../base/scanner.js';
2
+ import type { Component } from '@buoy-design/core';
3
+ export interface WebComponentScannerConfig extends ScannerConfig {
4
+ framework?: 'lit' | 'stencil' | 'auto';
5
+ }
6
+ export declare class WebComponentScanner extends Scanner<Component, WebComponentScannerConfig> {
7
+ scan(): Promise<ScanResult<Component>>;
8
+ getSourceType(): string;
9
+ private findComponentFiles;
10
+ private parseFile;
11
+ private extractLitComponent;
12
+ private extractLitTagName;
13
+ private extractLitProperties;
14
+ private extractStencilComponent;
15
+ private findStencilComponentDecorator;
16
+ private extractStencilTagName;
17
+ private extractStencilProps;
18
+ private extractStencilEvents;
19
+ private hasDeprecatedTag;
20
+ private toKebabCase;
21
+ }
22
+ //# sourceMappingURL=webcomponent-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webcomponent-scanner.d.ts","sourceRoot":"","sources":["../../src/git/webcomponent-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAwB,MAAM,oBAAoB,CAAC;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,mBAAmB,CAAC;AAOnE,MAAM,WAAW,yBAA0B,SAAQ,aAAa;IAC9D,SAAS,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;CACxC;AAUD,qBAAa,mBAAoB,SAAQ,OAAO,CAAC,SAAS,EAAE,yBAAyB,CAAC;IAC9E,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IA6B5C,aAAa,IAAI,MAAM;YAIT,kBAAkB;YAyBlB,SAAS;IAmCvB,OAAO,CAAC,mBAAmB;IA+C3B,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,oBAAoB;IAqC5B,OAAO,CAAC,uBAAuB;IA0C/B,OAAO,CAAC,6BAA6B;IAarC,OAAO,CAAC,qBAAqB;IAoB7B,OAAO,CAAC,mBAAmB;IAqC3B,OAAO,CAAC,oBAAoB;IAoC5B,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,WAAW;CAMpB"}
@@ -0,0 +1,312 @@
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 { readFileSync } from 'fs';
6
+ import { relative } from 'path';
7
+ export class WebComponentScanner extends Scanner {
8
+ async scan() {
9
+ const startTime = Date.now();
10
+ const files = await this.findComponentFiles();
11
+ const components = [];
12
+ const errors = [];
13
+ for (const file of files) {
14
+ try {
15
+ const parsed = await this.parseFile(file);
16
+ components.push(...parsed);
17
+ }
18
+ catch (err) {
19
+ const message = err instanceof Error ? err.message : String(err);
20
+ errors.push({
21
+ file,
22
+ message,
23
+ code: 'PARSE_ERROR',
24
+ });
25
+ }
26
+ }
27
+ const stats = {
28
+ filesScanned: files.length,
29
+ itemsFound: components.length,
30
+ duration: Date.now() - startTime,
31
+ };
32
+ return { items: components, errors, stats };
33
+ }
34
+ getSourceType() {
35
+ return this.config.framework || 'webcomponent';
36
+ }
37
+ async findComponentFiles() {
38
+ const patterns = this.config.include || ['**/*.ts', '**/*.tsx'];
39
+ const ignore = this.config.exclude || [
40
+ '**/node_modules/**',
41
+ '**/*.spec.ts',
42
+ '**/*.test.ts',
43
+ '**/*.d.ts',
44
+ '**/dist/**',
45
+ '**/build/**',
46
+ ];
47
+ const allFiles = [];
48
+ for (const pattern of patterns) {
49
+ const matches = await glob(pattern, {
50
+ cwd: this.config.projectRoot,
51
+ ignore,
52
+ absolute: true,
53
+ });
54
+ allFiles.push(...matches);
55
+ }
56
+ return [...new Set(allFiles)];
57
+ }
58
+ async parseFile(filePath) {
59
+ const content = readFileSync(filePath, 'utf-8');
60
+ const sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true, filePath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
61
+ const components = [];
62
+ const relativePath = relative(this.config.projectRoot, filePath);
63
+ // Detect framework from imports
64
+ const isLit = content.includes('lit') || content.includes('LitElement');
65
+ const isStencil = content.includes('@stencil/core');
66
+ const visit = (node) => {
67
+ if (ts.isClassDeclaration(node) && node.name) {
68
+ if (isLit) {
69
+ const comp = this.extractLitComponent(node, sourceFile, relativePath);
70
+ if (comp)
71
+ components.push(comp);
72
+ }
73
+ else if (isStencil) {
74
+ const comp = this.extractStencilComponent(node, sourceFile, relativePath);
75
+ if (comp)
76
+ components.push(comp);
77
+ }
78
+ }
79
+ ts.forEachChild(node, visit);
80
+ };
81
+ ts.forEachChild(sourceFile, visit);
82
+ return components;
83
+ }
84
+ extractLitComponent(node, sourceFile, relativePath) {
85
+ if (!node.name)
86
+ return null;
87
+ // Check if extends LitElement
88
+ const extendsLit = node.heritageClauses?.some(clause => {
89
+ return clause.types.some(type => {
90
+ const text = type.expression.getText(sourceFile);
91
+ return text === 'LitElement' || text.endsWith('Element');
92
+ });
93
+ });
94
+ if (!extendsLit)
95
+ return null;
96
+ const name = node.name.getText(sourceFile);
97
+ const tagName = this.extractLitTagName(node, sourceFile) || this.toKebabCase(name);
98
+ const line = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;
99
+ const source = {
100
+ type: 'lit',
101
+ path: relativePath,
102
+ exportName: name,
103
+ tagName,
104
+ line,
105
+ };
106
+ const props = this.extractLitProperties(node, sourceFile);
107
+ return {
108
+ id: createComponentId(source, name),
109
+ name,
110
+ source: source,
111
+ props,
112
+ variants: [],
113
+ tokens: [],
114
+ dependencies: [],
115
+ metadata: {
116
+ deprecated: this.hasDeprecatedTag(node),
117
+ tags: [],
118
+ },
119
+ scannedAt: new Date(),
120
+ };
121
+ }
122
+ extractLitTagName(node, _sourceFile) {
123
+ const decorators = ts.getDecorators(node);
124
+ if (!decorators)
125
+ return null;
126
+ for (const decorator of decorators) {
127
+ if (ts.isCallExpression(decorator.expression)) {
128
+ const expr = decorator.expression.expression;
129
+ if (ts.isIdentifier(expr) && expr.text === 'customElement') {
130
+ const arg = decorator.expression.arguments[0];
131
+ if (arg && ts.isStringLiteral(arg)) {
132
+ return arg.text;
133
+ }
134
+ }
135
+ }
136
+ }
137
+ return null;
138
+ }
139
+ extractLitProperties(node, sourceFile) {
140
+ const props = [];
141
+ for (const member of node.members) {
142
+ if (!ts.isPropertyDeclaration(member))
143
+ continue;
144
+ if (!member.name || !ts.isIdentifier(member.name))
145
+ continue;
146
+ const decorators = ts.getDecorators(member);
147
+ if (!decorators)
148
+ continue;
149
+ const hasProperty = decorators.some(d => {
150
+ if (ts.isCallExpression(d.expression)) {
151
+ const expr = d.expression.expression;
152
+ return ts.isIdentifier(expr) && (expr.text === 'property' || expr.text === 'state');
153
+ }
154
+ if (ts.isIdentifier(d.expression)) {
155
+ return d.expression.text === 'property' || d.expression.text === 'state';
156
+ }
157
+ return false;
158
+ });
159
+ if (hasProperty) {
160
+ const propName = member.name.getText(sourceFile);
161
+ const propType = member.type ? member.type.getText(sourceFile) : 'unknown';
162
+ props.push({
163
+ name: propName,
164
+ type: propType,
165
+ required: !member.initializer && !member.questionToken,
166
+ defaultValue: member.initializer?.getText(sourceFile),
167
+ });
168
+ }
169
+ }
170
+ return props;
171
+ }
172
+ extractStencilComponent(node, sourceFile, relativePath) {
173
+ if (!node.name)
174
+ return null;
175
+ // Check for @Component decorator
176
+ const componentDecorator = this.findStencilComponentDecorator(node);
177
+ if (!componentDecorator)
178
+ return null;
179
+ const name = node.name.getText(sourceFile);
180
+ const tagName = this.extractStencilTagName(componentDecorator, sourceFile) || this.toKebabCase(name);
181
+ const line = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile)).line + 1;
182
+ const source = {
183
+ type: 'stencil',
184
+ path: relativePath,
185
+ exportName: name,
186
+ tagName,
187
+ line,
188
+ };
189
+ const props = this.extractStencilProps(node, sourceFile);
190
+ const events = this.extractStencilEvents(node, sourceFile);
191
+ return {
192
+ id: createComponentId(source, name),
193
+ name,
194
+ source: source,
195
+ props: [...props, ...events],
196
+ variants: [],
197
+ tokens: [],
198
+ dependencies: [],
199
+ metadata: {
200
+ deprecated: this.hasDeprecatedTag(node),
201
+ tags: [],
202
+ },
203
+ scannedAt: new Date(),
204
+ };
205
+ }
206
+ findStencilComponentDecorator(node) {
207
+ const decorators = ts.getDecorators(node);
208
+ if (!decorators)
209
+ return undefined;
210
+ return decorators.find(d => {
211
+ if (ts.isCallExpression(d.expression)) {
212
+ const expr = d.expression.expression;
213
+ return ts.isIdentifier(expr) && expr.text === 'Component';
214
+ }
215
+ return false;
216
+ });
217
+ }
218
+ extractStencilTagName(decorator, _sourceFile) {
219
+ if (!ts.isCallExpression(decorator.expression))
220
+ return null;
221
+ const args = decorator.expression.arguments;
222
+ if (args.length === 0)
223
+ return null;
224
+ const config = args[0];
225
+ if (!config || !ts.isObjectLiteralExpression(config))
226
+ return null;
227
+ for (const prop of config.properties) {
228
+ if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {
229
+ if (prop.name.text === 'tag' && ts.isStringLiteral(prop.initializer)) {
230
+ return prop.initializer.text;
231
+ }
232
+ }
233
+ }
234
+ return null;
235
+ }
236
+ extractStencilProps(node, sourceFile) {
237
+ const props = [];
238
+ for (const member of node.members) {
239
+ if (!ts.isPropertyDeclaration(member))
240
+ continue;
241
+ if (!member.name || !ts.isIdentifier(member.name))
242
+ continue;
243
+ const decorators = ts.getDecorators(member);
244
+ if (!decorators)
245
+ continue;
246
+ const hasProp = decorators.some(d => {
247
+ if (ts.isCallExpression(d.expression)) {
248
+ const expr = d.expression.expression;
249
+ return ts.isIdentifier(expr) && expr.text === 'Prop';
250
+ }
251
+ if (ts.isIdentifier(d.expression)) {
252
+ return d.expression.text === 'Prop';
253
+ }
254
+ return false;
255
+ });
256
+ if (hasProp) {
257
+ const propName = member.name.getText(sourceFile);
258
+ const propType = member.type ? member.type.getText(sourceFile) : 'unknown';
259
+ props.push({
260
+ name: propName,
261
+ type: propType,
262
+ required: !member.initializer && !member.questionToken,
263
+ defaultValue: member.initializer?.getText(sourceFile),
264
+ });
265
+ }
266
+ }
267
+ return props;
268
+ }
269
+ extractStencilEvents(node, sourceFile) {
270
+ const events = [];
271
+ for (const member of node.members) {
272
+ if (!ts.isPropertyDeclaration(member))
273
+ continue;
274
+ if (!member.name || !ts.isIdentifier(member.name))
275
+ continue;
276
+ const decorators = ts.getDecorators(member);
277
+ if (!decorators)
278
+ continue;
279
+ const hasEvent = decorators.some(d => {
280
+ if (ts.isCallExpression(d.expression)) {
281
+ const expr = d.expression.expression;
282
+ return ts.isIdentifier(expr) && expr.text === 'Event';
283
+ }
284
+ if (ts.isIdentifier(d.expression)) {
285
+ return d.expression.text === 'Event';
286
+ }
287
+ return false;
288
+ });
289
+ if (hasEvent) {
290
+ const propName = member.name.getText(sourceFile);
291
+ events.push({
292
+ name: propName,
293
+ type: 'EventEmitter',
294
+ required: false,
295
+ description: 'Stencil event',
296
+ });
297
+ }
298
+ }
299
+ return events;
300
+ }
301
+ hasDeprecatedTag(node) {
302
+ const jsDocs = ts.getJSDocTags(node);
303
+ return jsDocs.some(tag => tag.tagName.text === 'deprecated');
304
+ }
305
+ toKebabCase(str) {
306
+ return str
307
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
308
+ .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')
309
+ .toLowerCase();
310
+ }
311
+ }
312
+ //# sourceMappingURL=webcomponent-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webcomponent-scanner.js","sourceRoot":"","sources":["../../src/git/webcomponent-scanner.ts"],"names":[],"mappings":"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"}