@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.
- package/dist/__tests__/fixtures/react-components.d.ts +5 -0
- package/dist/__tests__/fixtures/react-components.d.ts.map +1 -0
- package/dist/__tests__/fixtures/react-components.js +36 -0
- package/dist/__tests__/fixtures/react-components.js.map +1 -0
- package/dist/__tests__/setup.d.ts +2 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +78 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/base/index.d.ts +2 -0
- package/dist/base/index.d.ts.map +1 -0
- package/dist/base/index.js +2 -0
- package/dist/base/index.js.map +1 -0
- package/dist/base/scanner.d.ts +28 -0
- package/dist/base/scanner.d.ts.map +1 -0
- package/dist/base/scanner.js +7 -0
- package/dist/base/scanner.js.map +1 -0
- package/dist/figma/client.d.ts +98 -0
- package/dist/figma/client.d.ts.map +1 -0
- package/dist/figma/client.js +54 -0
- package/dist/figma/client.js.map +1 -0
- package/dist/figma/component-scanner.d.ts +22 -0
- package/dist/figma/component-scanner.d.ts.map +1 -0
- package/dist/figma/component-scanner.js +174 -0
- package/dist/figma/component-scanner.js.map +1 -0
- package/dist/figma/index.d.ts +3 -0
- package/dist/figma/index.d.ts.map +1 -0
- package/dist/figma/index.js +3 -0
- package/dist/figma/index.js.map +1 -0
- package/dist/git/angular-scanner.d.ts +18 -0
- package/dist/git/angular-scanner.d.ts.map +1 -0
- package/dist/git/angular-scanner.js +244 -0
- package/dist/git/angular-scanner.js.map +1 -0
- package/dist/git/index.d.ts +8 -0
- package/dist/git/index.d.ts.map +1 -0
- package/dist/git/index.js +8 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/react-scanner.d.ts +29 -0
- package/dist/git/react-scanner.d.ts.map +1 -0
- package/dist/git/react-scanner.js +469 -0
- package/dist/git/react-scanner.js.map +1 -0
- package/dist/git/react-scanner.test.d.ts +2 -0
- package/dist/git/react-scanner.test.d.ts.map +1 -0
- package/dist/git/react-scanner.test.js +107 -0
- package/dist/git/react-scanner.test.js.map +1 -0
- package/dist/git/svelte-scanner.d.ts +30 -0
- package/dist/git/svelte-scanner.d.ts.map +1 -0
- package/dist/git/svelte-scanner.js +344 -0
- package/dist/git/svelte-scanner.js.map +1 -0
- package/dist/git/template-scanner.d.ts +16 -0
- package/dist/git/template-scanner.d.ts.map +1 -0
- package/dist/git/template-scanner.js +227 -0
- package/dist/git/template-scanner.js.map +1 -0
- package/dist/git/token-scanner.d.ts +43 -0
- package/dist/git/token-scanner.d.ts.map +1 -0
- package/dist/git/token-scanner.js +444 -0
- package/dist/git/token-scanner.js.map +1 -0
- package/dist/git/vue-scanner.d.ts +26 -0
- package/dist/git/vue-scanner.d.ts.map +1 -0
- package/dist/git/vue-scanner.js +296 -0
- package/dist/git/vue-scanner.js.map +1 -0
- package/dist/git/webcomponent-scanner.d.ts +22 -0
- package/dist/git/webcomponent-scanner.d.ts.map +1 -0
- package/dist/git/webcomponent-scanner.js +312 -0
- package/dist/git/webcomponent-scanner.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/plugin-adapter.d.ts +11 -0
- package/dist/plugin-adapter.d.ts.map +1 -0
- package/dist/plugin-adapter.js +21 -0
- package/dist/plugin-adapter.js.map +1 -0
- package/dist/storybook/extractor.d.ts +20 -0
- package/dist/storybook/extractor.d.ts.map +1 -0
- package/dist/storybook/extractor.js +146 -0
- package/dist/storybook/extractor.js.map +1 -0
- package/dist/storybook/index.d.ts +2 -0
- package/dist/storybook/index.d.ts.map +1 -0
- package/dist/storybook/index.js +2 -0
- package/dist/storybook/index.js.map +1 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|