@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,5 @@
1
+ export declare const SIMPLE_BUTTON = "\nimport React from 'react';\n\nexport function Button({ onClick, children }: { onClick: () => void; children: React.ReactNode }) {\n return <button onClick={onClick}>{children}</button>;\n}\n";
2
+ export declare const ARROW_COMPONENT = "\nimport React from 'react';\n\nexport const Card = ({ title }: { title: string }) => {\n return <div className=\"card\">{title}</div>;\n};\n";
3
+ export declare const HARDCODED_STYLES = "\nimport React from 'react';\n\nexport function Badge({ label }: { label: string }) {\n return (\n <span style={{ backgroundColor: '#ff0000', padding: '8px' }}>\n {label}\n </span>\n );\n}\n";
4
+ export declare const DEPRECATED_COMPONENT = "\nimport React from 'react';\n\n/**\n * @deprecated Use NewButton instead\n */\nexport function OldButton({ onClick }: { onClick: () => void }) {\n return <button onClick={onClick}>Click</button>;\n}\n";
5
+ //# sourceMappingURL=react-components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-components.d.ts","sourceRoot":"","sources":["../../../src/__tests__/fixtures/react-components.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,aAAa,sMAMzB,CAAC;AAEF,eAAO,MAAM,eAAe,mJAM3B,CAAC;AAEF,eAAO,MAAM,gBAAgB,gNAU5B,CAAC;AAEF,eAAO,MAAM,oBAAoB,+MAShC,CAAC"}
@@ -0,0 +1,36 @@
1
+ export const SIMPLE_BUTTON = `
2
+ import React from 'react';
3
+
4
+ export function Button({ onClick, children }: { onClick: () => void; children: React.ReactNode }) {
5
+ return <button onClick={onClick}>{children}</button>;
6
+ }
7
+ `;
8
+ export const ARROW_COMPONENT = `
9
+ import React from 'react';
10
+
11
+ export const Card = ({ title }: { title: string }) => {
12
+ return <div className="card">{title}</div>;
13
+ };
14
+ `;
15
+ export const HARDCODED_STYLES = `
16
+ import React from 'react';
17
+
18
+ export function Badge({ label }: { label: string }) {
19
+ return (
20
+ <span style={{ backgroundColor: '#ff0000', padding: '8px' }}>
21
+ {label}
22
+ </span>
23
+ );
24
+ }
25
+ `;
26
+ export const DEPRECATED_COMPONENT = `
27
+ import React from 'react';
28
+
29
+ /**
30
+ * @deprecated Use NewButton instead
31
+ */
32
+ export function OldButton({ onClick }: { onClick: () => void }) {
33
+ return <button onClick={onClick}>Click</button>;
34
+ }
35
+ `;
36
+ //# sourceMappingURL=react-components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-components.js","sourceRoot":"","sources":["../../../src/__tests__/fixtures/react-components.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;CAM5B,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;CAM9B,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;CAU/B,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;CASnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ import { vi, beforeEach } from 'vitest';
2
+ // Mock fs/promises for scanner tests
3
+ vi.mock('fs/promises', async () => {
4
+ const memfs = await import('memfs');
5
+ return memfs.fs.promises;
6
+ });
7
+ // Mock glob to work with memfs
8
+ vi.mock('glob', async () => {
9
+ return {
10
+ glob: async (pattern, options) => {
11
+ const { vol } = await import('memfs');
12
+ const allFiles = Object.keys(vol.toJSON());
13
+ const cwd = options?.cwd || '/';
14
+ // Convert glob pattern to regex
15
+ const escapeRegex = (str) => str.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
16
+ const patternToRegex = (p) => {
17
+ let regex = '';
18
+ let i = 0;
19
+ while (i < p.length) {
20
+ if (p[i] === '*' && p[i + 1] === '*') {
21
+ // ** matches any path segment(s)
22
+ if (p[i + 2] === '/') {
23
+ regex += '(?:[^/]+/)*';
24
+ i += 3;
25
+ }
26
+ else {
27
+ regex += '.*';
28
+ i += 2;
29
+ }
30
+ }
31
+ else if (p[i] === '*') {
32
+ // * matches anything except /
33
+ regex += '[^/]*';
34
+ i++;
35
+ }
36
+ else if (p[i] === '?') {
37
+ regex += '[^/]';
38
+ i++;
39
+ }
40
+ else {
41
+ regex += escapeRegex(p[i]);
42
+ i++;
43
+ }
44
+ }
45
+ return new RegExp(`^${regex}$`);
46
+ };
47
+ const matchPattern = patternToRegex(pattern);
48
+ return allFiles.filter((file) => {
49
+ // Check if file is under cwd
50
+ if (!file.startsWith(cwd))
51
+ return false;
52
+ // Get relative path for matching
53
+ let relativePath = file.slice(cwd.length);
54
+ if (relativePath.startsWith('/')) {
55
+ relativePath = relativePath.slice(1);
56
+ }
57
+ // Check against ignore patterns
58
+ if (options?.ignore) {
59
+ for (const ignorePattern of options.ignore) {
60
+ const ignoreRegex = patternToRegex(ignorePattern);
61
+ if (ignoreRegex.test(relativePath))
62
+ return false;
63
+ }
64
+ }
65
+ // Match against pattern
66
+ if (!matchPattern.test(relativePath))
67
+ return false;
68
+ return true;
69
+ }).map((file) => (options?.absolute ? file : file.slice(cwd.length + 1)));
70
+ },
71
+ };
72
+ });
73
+ // Reset filesystem between tests
74
+ beforeEach(async () => {
75
+ const { vol } = await import('memfs');
76
+ vol.reset();
77
+ });
78
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAExC,qCAAqC;AACrC,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,IAAI,EAAE;IAChC,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,+BAA+B;AAC/B,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;IACzB,OAAO;QACL,IAAI,EAAE,KAAK,EACT,OAAe,EACf,OAAgE,EAC7C,EAAE;YACrB,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC3C,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,GAAG,CAAC;YAEhC,gCAAgC;YAChC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,EAAE,CAClC,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;YAE5C,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,EAAE;gBACnC,IAAI,KAAK,GAAG,EAAE,CAAC;gBACf,IAAI,CAAC,GAAG,CAAC,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;oBACpB,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;wBACrC,iCAAiC;wBACjC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;4BACrB,KAAK,IAAI,aAAa,CAAC;4BACvB,CAAC,IAAI,CAAC,CAAC;wBACT,CAAC;6BAAM,CAAC;4BACN,KAAK,IAAI,IAAI,CAAC;4BACd,CAAC,IAAI,CAAC,CAAC;wBACT,CAAC;oBACH,CAAC;yBAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;wBACxB,8BAA8B;wBAC9B,KAAK,IAAI,OAAO,CAAC;wBACjB,CAAC,EAAE,CAAC;oBACN,CAAC;yBAAM,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;wBACxB,KAAK,IAAI,MAAM,CAAC;wBAChB,CAAC,EAAE,CAAC;oBACN,CAAC;yBAAM,CAAC;wBACN,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;wBAC5B,CAAC,EAAE,CAAC;oBACN,CAAC;gBACH,CAAC;gBACD,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;YAClC,CAAC,CAAC;YAEF,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAE7C,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC9B,6BAA6B;gBAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAExC,iCAAiC;gBACjC,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC1C,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACjC,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACvC,CAAC;gBAED,gCAAgC;gBAChC,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;oBACpB,KAAK,MAAM,aAAa,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;wBAC3C,MAAM,WAAW,GAAG,cAAc,CAAC,aAAa,CAAC,CAAC;wBAClD,IAAI,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;4BAAE,OAAO,KAAK,CAAC;oBACnD,CAAC;gBACH,CAAC;gBAED,wBAAwB;gBACxB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC;oBAAE,OAAO,KAAK,CAAC;gBAEnD,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,CAAC;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,iCAAiC;AACjC,UAAU,CAAC,KAAK,IAAI,EAAE;IACpB,MAAM,EAAE,GAAG,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IACtC,GAAG,CAAC,KAAK,EAAE,CAAC;AACd,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './scanner.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './scanner.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/base/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,28 @@
1
+ export interface ScannerConfig {
2
+ projectRoot: string;
3
+ include?: string[];
4
+ exclude?: string[];
5
+ options?: Record<string, unknown>;
6
+ }
7
+ export interface ScanError {
8
+ file?: string;
9
+ message: string;
10
+ code: string;
11
+ }
12
+ export interface ScanStats {
13
+ filesScanned: number;
14
+ itemsFound: number;
15
+ duration: number;
16
+ }
17
+ export interface ScanResult<T> {
18
+ items: T[];
19
+ errors: ScanError[];
20
+ stats: ScanStats;
21
+ }
22
+ export declare abstract class Scanner<T, C extends ScannerConfig = ScannerConfig> {
23
+ protected config: C;
24
+ constructor(config: C);
25
+ abstract scan(): Promise<ScanResult<T>>;
26
+ abstract getSourceType(): string;
27
+ }
28
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/base/scanner.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,8BAAsB,OAAO,CAAC,CAAC,EAAE,CAAC,SAAS,aAAa,GAAG,aAAa;IACtE,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;gBAER,MAAM,EAAE,CAAC;IAIrB,QAAQ,CAAC,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACvC,QAAQ,CAAC,aAAa,IAAI,MAAM;CACjC"}
@@ -0,0 +1,7 @@
1
+ export class Scanner {
2
+ config;
3
+ constructor(config) {
4
+ this.config = config;
5
+ }
6
+ }
7
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/base/scanner.ts"],"names":[],"mappings":"AAyBA,MAAM,OAAgB,OAAO;IACjB,MAAM,CAAI;IAEpB,YAAY,MAAS;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CAIF"}
@@ -0,0 +1,98 @@
1
+ export interface FigmaFile {
2
+ name: string;
3
+ document: FigmaDocument;
4
+ components: Record<string, FigmaComponentMeta>;
5
+ styles: Record<string, FigmaStyleMeta>;
6
+ }
7
+ export interface FigmaDocument {
8
+ id: string;
9
+ name: string;
10
+ type: string;
11
+ children: FigmaNode[];
12
+ }
13
+ export interface FigmaNode {
14
+ id: string;
15
+ name: string;
16
+ type: string;
17
+ children?: FigmaNode[];
18
+ componentId?: string;
19
+ componentPropertyDefinitions?: Record<string, FigmaPropertyDefinition>;
20
+ }
21
+ export interface FigmaPropertyDefinition {
22
+ type: string;
23
+ defaultValue: unknown;
24
+ variantOptions?: string[];
25
+ }
26
+ export interface FigmaComponentMeta {
27
+ key: string;
28
+ name: string;
29
+ description: string;
30
+ documentationLinks: string[];
31
+ }
32
+ export interface FigmaStyleMeta {
33
+ key: string;
34
+ name: string;
35
+ styleType: string;
36
+ description: string;
37
+ }
38
+ export interface FigmaVariablesResponse {
39
+ meta: {
40
+ variables: Record<string, FigmaVariable>;
41
+ variableCollections: Record<string, FigmaVariableCollection>;
42
+ };
43
+ }
44
+ export interface FigmaVariable {
45
+ id: string;
46
+ name: string;
47
+ key: string;
48
+ resolvedType: string;
49
+ valuesByMode: Record<string, FigmaVariableValue>;
50
+ }
51
+ export interface FigmaVariableCollection {
52
+ id: string;
53
+ name: string;
54
+ modes: {
55
+ modeId: string;
56
+ name: string;
57
+ }[];
58
+ defaultModeId: string;
59
+ }
60
+ export type FigmaVariableValue = {
61
+ type: 'COLOR';
62
+ value: {
63
+ r: number;
64
+ g: number;
65
+ b: number;
66
+ a: number;
67
+ };
68
+ } | {
69
+ type: 'FLOAT';
70
+ value: number;
71
+ } | {
72
+ type: 'STRING';
73
+ value: string;
74
+ } | {
75
+ type: 'BOOLEAN';
76
+ value: boolean;
77
+ };
78
+ export declare class FigmaClient {
79
+ private accessToken;
80
+ private baseUrl;
81
+ private timeoutMs;
82
+ constructor(accessToken: string);
83
+ private fetch;
84
+ getFile(fileKey: string): Promise<FigmaFile>;
85
+ getFileComponents(fileKey: string): Promise<{
86
+ meta: {
87
+ components: FigmaComponentMeta[];
88
+ };
89
+ }>;
90
+ getFileStyles(fileKey: string): Promise<{
91
+ meta: {
92
+ styles: FigmaStyleMeta[];
93
+ };
94
+ }>;
95
+ getLocalVariables(fileKey: string): Promise<FigmaVariablesResponse>;
96
+ getFigmaUrl(fileKey: string, nodeId?: string): string;
97
+ }
98
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/figma/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ export class FigmaClient {
2
+ accessToken;
3
+ baseUrl = 'https://api.figma.com/v1';
4
+ timeoutMs = 30000; // 30 seconds
5
+ constructor(accessToken) {
6
+ this.accessToken = accessToken;
7
+ }
8
+ async fetch(endpoint) {
9
+ const controller = new AbortController();
10
+ const timeoutId = setTimeout(() => controller.abort(), this.timeoutMs);
11
+ try {
12
+ const response = await fetch(`${this.baseUrl}${endpoint}`, {
13
+ headers: {
14
+ 'X-Figma-Token': this.accessToken,
15
+ },
16
+ signal: controller.signal,
17
+ });
18
+ if (!response.ok) {
19
+ const text = await response.text();
20
+ throw new Error(`Figma API error: ${response.status} ${response.statusText} - ${text}`);
21
+ }
22
+ return response.json();
23
+ }
24
+ catch (error) {
25
+ if (error instanceof Error && error.name === 'AbortError') {
26
+ throw new Error(`Figma API request timed out after ${this.timeoutMs / 1000}s`);
27
+ }
28
+ throw error;
29
+ }
30
+ finally {
31
+ clearTimeout(timeoutId);
32
+ }
33
+ }
34
+ async getFile(fileKey) {
35
+ return this.fetch(`/files/${fileKey}`);
36
+ }
37
+ async getFileComponents(fileKey) {
38
+ return this.fetch(`/files/${fileKey}/components`);
39
+ }
40
+ async getFileStyles(fileKey) {
41
+ return this.fetch(`/files/${fileKey}/styles`);
42
+ }
43
+ async getLocalVariables(fileKey) {
44
+ return this.fetch(`/files/${fileKey}/variables/local`);
45
+ }
46
+ getFigmaUrl(fileKey, nodeId) {
47
+ const base = `https://www.figma.com/file/${fileKey}`;
48
+ if (nodeId) {
49
+ return `${base}?node-id=${encodeURIComponent(nodeId)}`;
50
+ }
51
+ return base;
52
+ }
53
+ }
54
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/figma/client.ts"],"names":[],"mappings":"AAuEA,MAAM,OAAO,WAAW;IACd,WAAW,CAAS;IACpB,OAAO,GAAG,0BAA0B,CAAC;IACrC,SAAS,GAAG,KAAK,CAAC,CAAC,aAAa;IAExC,YAAY,WAAmB;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAEO,KAAK,CAAC,KAAK,CAAI,QAAgB;QACrC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEvE,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE;gBACzD,OAAO,EAAE;oBACP,eAAe,EAAE,IAAI,CAAC,WAAW;iBAClC;gBACD,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;gBACnC,MAAM,IAAI,KAAK,CAAC,oBAAoB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,MAAM,IAAI,EAAE,CAAC,CAAC;YAC1F,CAAC;YAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC;YACjF,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,OAAO,IAAI,CAAC,KAAK,CAAY,UAAU,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAAe;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,OAAO,aAAa,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,OAAO,SAAS,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAAe;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,OAAO,kBAAkB,CAAC,CAAC;IACzD,CAAC;IAED,WAAW,CAAC,OAAe,EAAE,MAAe;QAC1C,MAAM,IAAI,GAAG,8BAA8B,OAAO,EAAE,CAAC;QACrD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,GAAG,IAAI,YAAY,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QACzD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ import { Scanner, ScanResult, ScannerConfig } from '../base/scanner.js';
2
+ import type { Component } from '@buoy-design/core';
3
+ export interface FigmaScannerConfig extends ScannerConfig {
4
+ accessToken: string;
5
+ fileKeys: string[];
6
+ componentPageName?: string;
7
+ }
8
+ export declare class FigmaComponentScanner extends Scanner<Component, FigmaScannerConfig> {
9
+ private client;
10
+ constructor(config: FigmaScannerConfig);
11
+ scan(): Promise<ScanResult<Component>>;
12
+ getSourceType(): string;
13
+ private extractComponents;
14
+ private findComponentsRecursive;
15
+ private nodeToComponent;
16
+ private cleanComponentName;
17
+ private extractProps;
18
+ private extractVariants;
19
+ private parseVariantName;
20
+ private mapFigmaType;
21
+ }
22
+ //# sourceMappingURL=component-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-scanner.d.ts","sourceRoot":"","sources":["../../src/figma/component-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAwB,MAAM,oBAAoB,CAAC;AAC9F,OAAO,KAAK,EAAE,SAAS,EAAkD,MAAM,mBAAmB,CAAC;AAInG,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,qBAAa,qBAAsB,SAAQ,OAAO,CAAC,SAAS,EAAE,kBAAkB,CAAC;IAC/E,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,EAAE,kBAAkB;IAKhC,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IA+B5C,aAAa,IAAI,MAAM;IAIvB,OAAO,CAAC,iBAAiB;IAuBzB,OAAO,CAAC,uBAAuB;IAwB/B,OAAO,CAAC,eAAe;IA0BvB,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,eAAe;IAoCvB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,YAAY;CASrB"}
@@ -0,0 +1,174 @@
1
+ import { Scanner } from '../base/scanner.js';
2
+ import { createComponentId } from '@buoy-design/core';
3
+ import { FigmaClient } from './client.js';
4
+ export class FigmaComponentScanner extends Scanner {
5
+ client;
6
+ constructor(config) {
7
+ super(config);
8
+ this.client = new FigmaClient(config.accessToken);
9
+ }
10
+ async scan() {
11
+ const startTime = Date.now();
12
+ const components = [];
13
+ const errors = [];
14
+ let filesScanned = 0;
15
+ for (const fileKey of this.config.fileKeys) {
16
+ try {
17
+ const file = await this.client.getFile(fileKey);
18
+ const fileComponents = this.extractComponents(file.document, fileKey);
19
+ components.push(...fileComponents);
20
+ filesScanned++;
21
+ }
22
+ catch (err) {
23
+ const message = err instanceof Error ? err.message : String(err);
24
+ errors.push({
25
+ file: fileKey,
26
+ message,
27
+ code: 'FIGMA_API_ERROR',
28
+ });
29
+ }
30
+ }
31
+ const stats = {
32
+ filesScanned,
33
+ itemsFound: components.length,
34
+ duration: Date.now() - startTime,
35
+ };
36
+ return { items: components, errors, stats };
37
+ }
38
+ getSourceType() {
39
+ return 'figma';
40
+ }
41
+ extractComponents(document, fileKey) {
42
+ const components = [];
43
+ const pageName = this.config.componentPageName?.toLowerCase() || 'components';
44
+ // Find the components page
45
+ const componentPage = document.children.find(page => page.name.toLowerCase() === pageName);
46
+ if (!componentPage || !componentPage.children) {
47
+ // Search all pages if no specific component page found
48
+ for (const page of document.children) {
49
+ if (page.children) {
50
+ this.findComponentsRecursive(page.children, fileKey, components);
51
+ }
52
+ }
53
+ }
54
+ else {
55
+ this.findComponentsRecursive(componentPage.children, fileKey, components);
56
+ }
57
+ return components;
58
+ }
59
+ findComponentsRecursive(nodes, fileKey, components) {
60
+ for (const node of nodes) {
61
+ // COMPONENT_SET is a group of variants
62
+ if (node.type === 'COMPONENT_SET') {
63
+ const component = this.nodeToComponent(node, fileKey, true);
64
+ components.push(component);
65
+ }
66
+ // COMPONENT is a single component
67
+ else if (node.type === 'COMPONENT') {
68
+ const component = this.nodeToComponent(node, fileKey, false);
69
+ components.push(component);
70
+ }
71
+ // Recurse into children
72
+ if (node.children) {
73
+ this.findComponentsRecursive(node.children, fileKey, components);
74
+ }
75
+ }
76
+ }
77
+ nodeToComponent(node, fileKey, isComponentSet) {
78
+ const source = {
79
+ type: 'figma',
80
+ fileKey,
81
+ nodeId: node.id,
82
+ url: this.client.getFigmaUrl(fileKey, node.id),
83
+ };
84
+ const props = this.extractProps(node);
85
+ const variants = this.extractVariants(node);
86
+ return {
87
+ id: createComponentId(source, node.name),
88
+ name: this.cleanComponentName(node.name),
89
+ source,
90
+ props,
91
+ variants,
92
+ tokens: [],
93
+ dependencies: [],
94
+ metadata: {
95
+ tags: isComponentSet ? ['component-set'] : [],
96
+ },
97
+ scannedAt: new Date(),
98
+ };
99
+ }
100
+ cleanComponentName(name) {
101
+ // Remove any variant suffixes like "Button, State=Hover, Size=Large"
102
+ const baseName = name.split(',')[0] ?? name;
103
+ // Remove any slash prefixes like "Components / Button"
104
+ const parts = baseName.trim().split('/');
105
+ return (parts[parts.length - 1] ?? baseName).trim();
106
+ }
107
+ extractProps(node) {
108
+ const props = [];
109
+ if (node.componentPropertyDefinitions) {
110
+ for (const [key, def] of Object.entries(node.componentPropertyDefinitions)) {
111
+ props.push({
112
+ name: key,
113
+ type: this.mapFigmaType(def.type),
114
+ required: true,
115
+ defaultValue: def.defaultValue,
116
+ });
117
+ }
118
+ }
119
+ return props;
120
+ }
121
+ extractVariants(node) {
122
+ const variants = [];
123
+ if (node.componentPropertyDefinitions) {
124
+ // Find properties that are VARIANT type
125
+ for (const [key, def] of Object.entries(node.componentPropertyDefinitions)) {
126
+ if (def.type === 'VARIANT' && def.variantOptions) {
127
+ for (const option of def.variantOptions) {
128
+ variants.push({
129
+ name: `${key}=${option}`,
130
+ props: { [key]: option },
131
+ });
132
+ }
133
+ }
134
+ }
135
+ }
136
+ // Also extract variants from component set children
137
+ if (node.type === 'COMPONENT_SET' && node.children) {
138
+ for (const child of node.children) {
139
+ if (child.type === 'COMPONENT') {
140
+ // Parse variant props from name like "State=Hover, Size=Large"
141
+ const variantProps = this.parseVariantName(child.name);
142
+ if (Object.keys(variantProps).length > 0) {
143
+ variants.push({
144
+ name: child.name,
145
+ props: variantProps,
146
+ });
147
+ }
148
+ }
149
+ }
150
+ }
151
+ return variants;
152
+ }
153
+ parseVariantName(name) {
154
+ const props = {};
155
+ const parts = name.split(',');
156
+ for (const part of parts) {
157
+ const [key, value] = part.split('=').map(s => s.trim());
158
+ if (key && value) {
159
+ props[key] = value;
160
+ }
161
+ }
162
+ return props;
163
+ }
164
+ mapFigmaType(figmaType) {
165
+ const typeMap = {
166
+ TEXT: 'string',
167
+ BOOLEAN: 'boolean',
168
+ VARIANT: 'enum',
169
+ INSTANCE_SWAP: 'ReactNode',
170
+ };
171
+ return typeMap[figmaType] || figmaType.toLowerCase();
172
+ }
173
+ }
174
+ //# sourceMappingURL=component-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-scanner.js","sourceRoot":"","sources":["../../src/figma/component-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { FigmaClient, type FigmaFile, type FigmaNode, type FigmaVariable } from './client.js';
2
+ export { FigmaComponentScanner, type FigmaScannerConfig } from './component-scanner.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/figma/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAAE,KAAK,kBAAkB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { FigmaClient } from './client.js';
2
+ export { FigmaComponentScanner } from './component-scanner.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/figma/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAsD,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,qBAAqB,EAA2B,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { Scanner, ScanResult, ScannerConfig } from '../base/scanner.js';
2
+ import type { Component } from '@buoy-design/core';
3
+ export interface AngularScannerConfig extends ScannerConfig {
4
+ designSystemPackage?: string;
5
+ }
6
+ export declare class AngularComponentScanner extends Scanner<Component, AngularScannerConfig> {
7
+ scan(): Promise<ScanResult<Component>>;
8
+ getSourceType(): string;
9
+ private findComponentFiles;
10
+ private parseFile;
11
+ private findComponentDecorator;
12
+ private extractComponent;
13
+ private extractSelector;
14
+ private extractInputs;
15
+ private extractOutputs;
16
+ private hasDeprecatedDecorator;
17
+ }
18
+ //# sourceMappingURL=angular-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-scanner.d.ts","sourceRoot":"","sources":["../../src/git/angular-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,oBAAqB,SAAQ,aAAa;IACzD,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAUD,qBAAa,uBAAwB,SAAQ,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC;IAC7E,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IA6B5C,aAAa,IAAI,MAAM;YAIT,kBAAkB;YAwBlB,SAAS;IA8BvB,OAAO,CAAC,sBAAsB;IAa9B,OAAO,CAAC,gBAAgB;IAuCxB,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,aAAa;IAwDrB,OAAO,CAAC,cAAc;IAsDtB,OAAO,CAAC,sBAAsB;CAI/B"}