@auto-engineer/design-system-importer 0.1.2 → 0.2.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/.turbo/turbo-build.log +1 -1
- package/.turbo/turbo-test.log +12 -0
- package/.turbo/turbo-type-check.log +4 -0
- package/CHANGELOG.md +13 -0
- package/README.md +48 -0
- package/dist/FigmaComponentsBuilder.d.ts +16 -0
- package/dist/FigmaComponentsBuilder.d.ts.map +1 -0
- package/dist/FigmaComponentsBuilder.js +175 -0
- package/dist/FigmaComponentsBuilder.js.map +1 -0
- package/dist/commands/import-design-system.d.ts +3 -0
- package/dist/commands/import-design-system.d.ts.map +1 -1
- package/dist/commands/import-design-system.js +20 -3
- package/dist/commands/import-design-system.js.map +1 -1
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +91 -3
- package/dist/index.js.map +1 -1
- package/dist/utils/FilterLoader.d.ts +9 -0
- package/dist/utils/FilterLoader.d.ts.map +1 -0
- package/dist/utils/FilterLoader.js +66 -0
- package/dist/utils/FilterLoader.js.map +1 -0
- package/package.json +3 -2
- package/src/FigmaComponentsBuilder.ts +207 -0
- package/src/commands/import-design-system.ts +21 -3
- package/src/index.ts +110 -3
- package/src/utils/FilterLoader.ts +76 -0
- package/tsconfig.tsbuildinfo +1 -1
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> @auto-engineer/design-system-importer@0.
|
|
2
|
+
> @auto-engineer/design-system-importer@0.2.0 build /home/runner/work/auto-engineer/auto-engineer/packages/design-system-importer
|
|
3
3
|
> tsc && tsx ../../scripts/fix-esm-imports.ts
|
|
4
4
|
|
|
5
5
|
Fixed ESM imports in dist/
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
> @auto-engineer/design-system-importer@0.2.0 test /home/runner/work/auto-engineer/auto-engineer/packages/design-system-importer
|
|
3
|
+
> vitest run
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
[1m[46m RUN [49m[22m [36mv3.2.4 [39m[90m/home/runner/work/auto-engineer/auto-engineer/packages/design-system-importer[39m
|
|
7
|
+
|
|
8
|
+
[2minclude: [22m[33m**/*.specs.{js,ts}[39m
|
|
9
|
+
No test files found, exiting with code 0
|
|
10
|
+
[2mexclude: [22m[33m**/.tmp/**[2m, [22m**/node_modules/**[2m, [22m**/dist/**[39m
|
|
11
|
+
|
|
12
|
+
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# @auto-engineer/design-system-importer
|
|
2
2
|
|
|
3
|
+
## 0.2.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#24](https://github.com/SamHatoum/auto-engineer/pull/24) [`d4dcacd`](https://github.com/SamHatoum/auto-engineer/commit/d4dcacd18cf2217d3ac9f4354f79ab7ff2ba39a0) Thanks [@SamHatoum](https://github.com/SamHatoum)! - Making commands independent and CLI based
|
|
8
|
+
|
|
9
|
+
- [#22](https://github.com/SamHatoum/auto-engineer/pull/22) [`e39acf3`](https://github.com/SamHatoum/auto-engineer/commit/e39acf31e9051652084d0de99cf8c89b40e6531c) Thanks [@SamHatoum](https://github.com/SamHatoum)! - Some major refactorings of the directory structure
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- Updated dependencies [[`e39acf3`](https://github.com/SamHatoum/auto-engineer/commit/e39acf31e9051652084d0de99cf8c89b40e6531c)]:
|
|
14
|
+
- @auto-engineer/message-bus@0.1.0
|
|
15
|
+
|
|
3
16
|
## 0.1.2
|
|
4
17
|
|
|
5
18
|
### Patch Changes
|
package/README.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Design System Importer
|
|
2
|
+
|
|
3
|
+
Pull in your team’s design system to build consistent, on-brand apps—fast.
|
|
4
|
+
Easily sync shared styles, components, and tokens from design tools or code.
|
|
5
|
+
|
|
6
|
+
## Available Importers
|
|
7
|
+
|
|
8
|
+
- **Figma** – Import components directly from Figma. Use our [Auto plugin]() to export design tokens effortlessly.
|
|
9
|
+
- **Code** – _(coming soon)_ Import tokens and components from an existing codebase.
|
|
10
|
+
- **NPM Package** – _(coming soon)_ Pull in a published design system as a dependency.
|
|
11
|
+
|
|
12
|
+
## Figma Importer
|
|
13
|
+
|
|
14
|
+
Sync your design system directly from Figma and integrate it into your local project.
|
|
15
|
+
|
|
16
|
+
### Prerequisites
|
|
17
|
+
|
|
18
|
+
- A **Figma Personal Access Token**
|
|
19
|
+
- A **Professional Figma Plan** (or higher)
|
|
20
|
+
|
|
21
|
+
### Setup
|
|
22
|
+
|
|
23
|
+
1. **Generate a personal access token**
|
|
24
|
+
Follow [these instructions](https://help.figma.com/hc/en-us/articles/8085703771159-Manage-personal-access-tokens) from Figma.
|
|
25
|
+
|
|
26
|
+
2. **Get your design system file ID**
|
|
27
|
+
Open your Figma file and copy the part of the URL after `/design/`.
|
|
28
|
+
|
|
29
|
+
3. **Configure environment variables**
|
|
30
|
+
- `FIGMA_PERSONAL_TOKEN` – The token from your Figma account
|
|
31
|
+
- `FIGMA_FILE_ID` – The ID of the design file (found in the Figma URL after `/design/`)
|
|
32
|
+
|
|
33
|
+
4. **Publish your components in Figma**
|
|
34
|
+
Right-click anywhere → **Actions** → Search for “Publish changes to library”.
|
|
35
|
+
|
|
36
|
+
> _(Optional)_ If you're using a public design system, you may need to move the file into one of your own Figma projects first.
|
|
37
|
+
|
|
38
|
+
5. **Export tokens with the Auto plugin**
|
|
39
|
+
- Install the [Auto plugin]()
|
|
40
|
+
- Run it inside your Figma file
|
|
41
|
+
- Click **"Export Tokens"**
|
|
42
|
+
- Save the exported file inside the `.context` folder of your output directory
|
|
43
|
+
|
|
44
|
+
6. **Run the importer**
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pnpm import:design-system
|
|
48
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface FigmaComponent {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
thumbnail: string;
|
|
5
|
+
}
|
|
6
|
+
export type FilterFunctionType = (components: FigmaComponent[]) => FigmaComponent[];
|
|
7
|
+
export declare class FigmaComponentsBuilder {
|
|
8
|
+
components: FigmaComponent[];
|
|
9
|
+
withFigmaComponents(): Promise<this>;
|
|
10
|
+
withFigmaComponentSets(): Promise<this>;
|
|
11
|
+
withFilteredNamesForShadcn(): void;
|
|
12
|
+
withFilter(filter: FilterFunctionType): void;
|
|
13
|
+
withAllFigmaInstanceNames(): Promise<this>;
|
|
14
|
+
build(): FigmaComponent[];
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=FigmaComponentsBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FigmaComponentsBuilder.d.ts","sourceRoot":"","sources":["../src/FigmaComponentsBuilder.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,kBAAkB,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,CAAC;AAUpF,qBAAa,sBAAsB;IACjC,UAAU,EAAE,cAAc,EAAE,CAAM;IAE5B,mBAAmB;IAuBnB,sBAAsB;IA+B5B,0BAA0B,IAAI,IAAI;IA2BlC,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI;IAQtC,yBAAyB;IAsF/B,KAAK;CAGN"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import * as dotenv from 'dotenv';
|
|
2
|
+
import * as Figma from 'figma-api';
|
|
3
|
+
dotenv.config();
|
|
4
|
+
const figmaApi = new Figma.Api({
|
|
5
|
+
personalAccessToken: process.env.FIGMA_PERSONAL_TOKEN,
|
|
6
|
+
});
|
|
7
|
+
export class FigmaComponentsBuilder {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.components = [];
|
|
10
|
+
}
|
|
11
|
+
async withFigmaComponents() {
|
|
12
|
+
try {
|
|
13
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
14
|
+
const response = await figmaApi.getFileComponents({ file_key: process.env.FIGMA_FILE_ID });
|
|
15
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
16
|
+
if (response.meta.components.length > 0) {
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
18
|
+
console.log(JSON.stringify(response.meta.components.length, null, 2));
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
20
|
+
this.components = response.meta.components.map((component) => ({
|
|
21
|
+
name: component.name,
|
|
22
|
+
description: component.description,
|
|
23
|
+
thumbnail: component.thumbnail_url,
|
|
24
|
+
}));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (e) {
|
|
28
|
+
console.error(e);
|
|
29
|
+
}
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
async withFigmaComponentSets() {
|
|
33
|
+
try {
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
35
|
+
const response = await figmaApi.getFileComponentSets({ file_key: process.env.FIGMA_FILE_ID });
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
37
|
+
if (response.meta.component_sets.length > 0) {
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
39
|
+
this.components = response.meta.component_sets.map((component) => ({
|
|
40
|
+
name: component.name,
|
|
41
|
+
description: component.description ?? 'N/A',
|
|
42
|
+
thumbnail: component.thumbnail_url ?? 'N/A',
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
console.error(e);
|
|
48
|
+
}
|
|
49
|
+
return this;
|
|
50
|
+
}
|
|
51
|
+
// extractBracketedComponents(item: FigmaComponent): FigmaComponent | null {
|
|
52
|
+
// const match = item.name.match(/<([^>]+)>/);
|
|
53
|
+
// return match ? { ...item, name: match[1].trim() } : null;
|
|
54
|
+
// }
|
|
55
|
+
//
|
|
56
|
+
// withFilteredNamesForMui() {
|
|
57
|
+
// // eslint-disable-next-line @typescript-eslint/unbound-method
|
|
58
|
+
// this.components = this.components.map(this.extractBracketedComponents).filter(Boolean) as FigmaComponent[];
|
|
59
|
+
// }
|
|
60
|
+
withFilteredNamesForShadcn() {
|
|
61
|
+
this.components = this.components
|
|
62
|
+
.map((comp) => {
|
|
63
|
+
if (!comp?.name)
|
|
64
|
+
return null;
|
|
65
|
+
let str = comp.name.trim();
|
|
66
|
+
if (str.includes('/')) {
|
|
67
|
+
str = str.split('/')[0].trim();
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
str = str.split(' ')[0].trim();
|
|
71
|
+
}
|
|
72
|
+
if (str.length > 0) {
|
|
73
|
+
str = str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
...comp,
|
|
80
|
+
name: str.toLowerCase(),
|
|
81
|
+
};
|
|
82
|
+
})
|
|
83
|
+
.filter((c) => Boolean(c));
|
|
84
|
+
}
|
|
85
|
+
withFilter(filter) {
|
|
86
|
+
try {
|
|
87
|
+
this.components = filter(this.components);
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
console.error('Error applying custom filter:', e);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async withAllFigmaInstanceNames() {
|
|
94
|
+
try {
|
|
95
|
+
/// ----
|
|
96
|
+
const usedComponentMap = new Map();
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
98
|
+
const { document } = await figmaApi.getFile({
|
|
99
|
+
file_key: process.env.FIGMA_FILE_ID,
|
|
100
|
+
depth: 1,
|
|
101
|
+
});
|
|
102
|
+
function walkTree(node) {
|
|
103
|
+
if (node.type === 'INSTANCE' && Boolean(node.name)) {
|
|
104
|
+
if (!usedComponentMap.has(node.name)) {
|
|
105
|
+
usedComponentMap.set(node.name, {
|
|
106
|
+
name: node.name,
|
|
107
|
+
description: node.description ?? '',
|
|
108
|
+
thumbnail: node.thumbnail_url ?? '',
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
|
|
113
|
+
if (node.children) {
|
|
114
|
+
for (const child of node.children) {
|
|
115
|
+
walkTree(child);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
walkTree(document);
|
|
120
|
+
this.components = Array.from(usedComponentMap.values());
|
|
121
|
+
/// ----
|
|
122
|
+
// const components = []
|
|
123
|
+
// // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
124
|
+
// const { meta } = await figmaApi.getFileComponentSets({ file_key: process.env.FIGMA_FILE_ID });
|
|
125
|
+
// // console.log(response);
|
|
126
|
+
//
|
|
127
|
+
// console.log('Component sets:', meta.component_sets); // ⬅️ Check this!
|
|
128
|
+
//
|
|
129
|
+
// const componentSetIds = meta.component_sets.map(componentSet => componentSet.node_id); // This must return valid Figma node IDs
|
|
130
|
+
//
|
|
131
|
+
// console.log('ComponentSet IDs:', componentSetIds);
|
|
132
|
+
//
|
|
133
|
+
// const fileNodes = await figmaApi.getFileNodes({
|
|
134
|
+
// file_key: process.env.FIGMA_FILE_ID,
|
|
135
|
+
// }, {
|
|
136
|
+
// ids: componentSetIds.join(','),
|
|
137
|
+
// });
|
|
138
|
+
//
|
|
139
|
+
// for (const node of Object.values(fileNodes.nodes)) {
|
|
140
|
+
// const componentSet = node.document;
|
|
141
|
+
//
|
|
142
|
+
// if (componentSet.type === 'COMPONENT_SET' && componentSet.children?.length) {
|
|
143
|
+
// const variants = componentSet.children;
|
|
144
|
+
// const firstVariant = variants[0]; // or apply filtering logic
|
|
145
|
+
//
|
|
146
|
+
// components.push({
|
|
147
|
+
// name: componentSet.name, // e.g. "Button"
|
|
148
|
+
// id: firstVariant.id, // this is the actual variant node
|
|
149
|
+
// variantName: firstVariant.name // e.g. "primary=true, size=md"
|
|
150
|
+
// });
|
|
151
|
+
// }
|
|
152
|
+
// }
|
|
153
|
+
//
|
|
154
|
+
// fs.writeFileSync('output.json', JSON.stringify(components, null, 2));
|
|
155
|
+
// if (Boolean(response)) {
|
|
156
|
+
// // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
157
|
+
// this.components = response.meta.component_sets.map(
|
|
158
|
+
// (component: { name: string; description: string; thumbnail_url: string }) => ({
|
|
159
|
+
// name: component.name,
|
|
160
|
+
// description: component.description,
|
|
161
|
+
// thumbnail_url: component.thumbnail_url,
|
|
162
|
+
// }),
|
|
163
|
+
// );
|
|
164
|
+
// }
|
|
165
|
+
}
|
|
166
|
+
catch (e) {
|
|
167
|
+
console.error(e);
|
|
168
|
+
}
|
|
169
|
+
return this;
|
|
170
|
+
}
|
|
171
|
+
build() {
|
|
172
|
+
return this.components;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=FigmaComponentsBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FigmaComponentsBuilder.js","sourceRoot":"","sources":["../src/FigmaComponentsBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { type CommandHandler, type Command, type Event } from '@auto-engineer/message-bus';
|
|
2
|
+
import { ImportStrategy } from '../index';
|
|
2
3
|
export type ImportDesignSystemCommand = Command<'ImportDesignSystem', {
|
|
3
4
|
inputDir: string;
|
|
4
5
|
outputDir: string;
|
|
6
|
+
strategy?: keyof typeof ImportStrategy;
|
|
7
|
+
filterPath?: string;
|
|
5
8
|
}>;
|
|
6
9
|
export type DesignSystemImportedEvent = Event<'DesignSystemImported', {
|
|
7
10
|
inputDir: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-design-system.d.ts","sourceRoot":"","sources":["../../src/commands/import-design-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"import-design-system.d.ts","sourceRoot":"","sources":["../../src/commands/import-design-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAE3F,OAAO,EAAyC,cAAc,EAA2B,MAAM,UAAU,CAAC;AAG1G,MAAM,MAAM,yBAAyB,GAAG,OAAO,CAC7C,oBAAoB,EACpB;IACE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,OAAO,cAAc,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CACF,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,KAAK,CAC3C,sBAAsB,EACtB;IACE,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CACF,CAAC;AAEF,MAAM,MAAM,6BAA6B,GAAG,KAAK,CAC/C,0BAA0B,EAC1B;IACE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CACF,CAAC;AAGF,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,yBAAyB,GAAG,6BAA6B,CAAC,CAqEpE;AAED,eAAO,MAAM,gCAAgC,EAAE,cAAc,CAAC,yBAAyB,CAUtF,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { promises as fs } from 'fs';
|
|
2
|
-
import {
|
|
2
|
+
import { importDesignSystemComponentsFromFigma, ImportStrategy } from '../index.js';
|
|
3
|
+
import { FilterLoader } from '../utils/FilterLoader.js';
|
|
3
4
|
// Handler
|
|
4
5
|
export async function handleImportDesignSystemCommand(command) {
|
|
5
|
-
const { inputDir, outputDir } = command.data;
|
|
6
|
+
const { inputDir, outputDir, strategy, filterPath } = command.data;
|
|
6
7
|
try {
|
|
7
8
|
// Check if input directory exists
|
|
8
9
|
const inputExists = await fs
|
|
@@ -23,7 +24,23 @@ export async function handleImportDesignSystemCommand(command) {
|
|
|
23
24
|
correlationId: command.correlationId,
|
|
24
25
|
};
|
|
25
26
|
}
|
|
26
|
-
|
|
27
|
+
const resolvedStrategy = strategy ? ImportStrategy[strategy] : ImportStrategy.WITH_COMPONENT_SETS;
|
|
28
|
+
let filterFn;
|
|
29
|
+
let loader;
|
|
30
|
+
if (typeof filterPath === 'string' && filterPath.trim().length > 0) {
|
|
31
|
+
try {
|
|
32
|
+
loader = new FilterLoader();
|
|
33
|
+
filterFn = await loader.loadFilter(filterPath);
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
console.warn(`Could not import filter from ${filterPath}. Skipping custom filter.`, e);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
if (loader)
|
|
40
|
+
loader.cleanup();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
await importDesignSystemComponentsFromFigma(outputDir, resolvedStrategy, filterFn);
|
|
27
44
|
console.log(`Design system files processed from ${inputDir} to ${outputDir}`);
|
|
28
45
|
return {
|
|
29
46
|
type: 'DesignSystemImported',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-design-system.js","sourceRoot":"","sources":["../../src/commands/import-design-system.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"import-design-system.js","sourceRoot":"","sources":["../../src/commands/import-design-system.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,17 @@
|
|
|
1
|
+
import { type FilterFunctionType } from './FigmaComponentsBuilder';
|
|
1
2
|
export declare function generateDesignSystemMarkdown(inputDir: string, outputDir: string): Promise<void>;
|
|
2
3
|
export * from './commands/import-design-system';
|
|
4
|
+
export type { FilterFunctionType } from './FigmaComponentsBuilder';
|
|
3
5
|
export declare function copyDesignSystemDocsAndUserPreferences(inputDir: string, outputDir: string): Promise<void>;
|
|
6
|
+
export declare function generateMarkdownFromComponents(components: {
|
|
7
|
+
name: string;
|
|
8
|
+
description: string;
|
|
9
|
+
thumbnail: string;
|
|
10
|
+
}[]): string;
|
|
11
|
+
export declare enum ImportStrategy {
|
|
12
|
+
WITH_COMPONENTS = "WITH_COMPONENTS",
|
|
13
|
+
WITH_COMPONENT_SETS = "WITH_COMPONENT_SETS",
|
|
14
|
+
WITH_ALL_FIGMA_INSTANCES = "WITH_ALL_FIGMA_INSTANCES"
|
|
15
|
+
}
|
|
16
|
+
export declare function importDesignSystemComponentsFromFigma(outputDir: string, strategy?: ImportStrategy, filterFn?: FilterFunctionType): Promise<void>;
|
|
4
17
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAA0B,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AA+B3F,wBAAsB,4BAA4B,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBrG;AAED,cAAc,iCAAiC,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAiBnE,wBAAsB,sCAAsC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2B/G;AAwBD,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,GACrE,MAAM,CAYR;AAED,oBAAY,cAAc;IACxB,eAAe,oBAAoB;IACnC,mBAAmB,wBAAwB;IAC3C,wBAAwB,6BAA6B;CACtD;AAED,wBAAsB,qCAAqC,CACzD,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,cAAmD,EAC7D,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAyCf"}
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,14 @@ import * as path from 'path';
|
|
|
2
2
|
import * as fs from 'fs/promises';
|
|
3
3
|
import * as dotenv from 'dotenv';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
|
+
import * as Figma from 'figma-api';
|
|
6
|
+
import { FigmaComponentsBuilder } from './FigmaComponentsBuilder.js';
|
|
7
|
+
// import { AIProvider, generateTextWithAI } from '@auto-engineer/ai-gateway';
|
|
5
8
|
dotenv.config();
|
|
6
9
|
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const api = new Figma.Api({
|
|
11
|
+
personalAccessToken: process.env.FIGMA_PERSONAL_TOKEN,
|
|
12
|
+
});
|
|
7
13
|
async function getAllTsxFiles(dir) {
|
|
8
14
|
let results = [];
|
|
9
15
|
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
@@ -82,6 +88,80 @@ export async function copyDesignSystemDocsAndUserPreferences(inputDir, outputDir
|
|
|
82
88
|
}
|
|
83
89
|
}
|
|
84
90
|
}
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
92
|
+
async function getFigmaComponents() {
|
|
93
|
+
let components = [];
|
|
94
|
+
try {
|
|
95
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
96
|
+
const response = await api.getFileComponentSets({ file_key: process.env.FIGMA_FILE_ID });
|
|
97
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
98
|
+
components = response.meta.component_sets.map((component) => ({
|
|
99
|
+
name: component.name,
|
|
100
|
+
description: component.description,
|
|
101
|
+
thumbnail: component.thumbnail_url,
|
|
102
|
+
}));
|
|
103
|
+
console.log('figma response: ', response);
|
|
104
|
+
}
|
|
105
|
+
catch (e) {
|
|
106
|
+
console.error(e);
|
|
107
|
+
}
|
|
108
|
+
console.log(components.length);
|
|
109
|
+
return components;
|
|
110
|
+
}
|
|
111
|
+
export function generateMarkdownFromComponents(components) {
|
|
112
|
+
let md = '# Design System\n\n## Components\n\n';
|
|
113
|
+
if (components.length === 0) {
|
|
114
|
+
console.warn('No components found');
|
|
115
|
+
}
|
|
116
|
+
for (const component of components) {
|
|
117
|
+
md += `### ${component.name}\nDescription: ${component.description}\nImage: \n\n`;
|
|
118
|
+
}
|
|
119
|
+
return md;
|
|
120
|
+
}
|
|
121
|
+
export var ImportStrategy;
|
|
122
|
+
(function (ImportStrategy) {
|
|
123
|
+
ImportStrategy["WITH_COMPONENTS"] = "WITH_COMPONENTS";
|
|
124
|
+
ImportStrategy["WITH_COMPONENT_SETS"] = "WITH_COMPONENT_SETS";
|
|
125
|
+
ImportStrategy["WITH_ALL_FIGMA_INSTANCES"] = "WITH_ALL_FIGMA_INSTANCES";
|
|
126
|
+
})(ImportStrategy || (ImportStrategy = {}));
|
|
127
|
+
export async function importDesignSystemComponentsFromFigma(outputDir, strategy = ImportStrategy.WITH_COMPONENT_SETS, filterFn) {
|
|
128
|
+
const figmaComponentsBuilder = new FigmaComponentsBuilder();
|
|
129
|
+
if (strategy === ImportStrategy.WITH_COMPONENTS) {
|
|
130
|
+
await figmaComponentsBuilder.withFigmaComponents();
|
|
131
|
+
}
|
|
132
|
+
else if (strategy === ImportStrategy.WITH_COMPONENT_SETS) {
|
|
133
|
+
await figmaComponentsBuilder.withFigmaComponentSets();
|
|
134
|
+
}
|
|
135
|
+
else if (strategy === ImportStrategy.WITH_ALL_FIGMA_INSTANCES) {
|
|
136
|
+
await figmaComponentsBuilder.withAllFigmaInstanceNames();
|
|
137
|
+
}
|
|
138
|
+
// figmaComponentsBuilder.withFilteredNamesForMui();
|
|
139
|
+
// figmaComponentsBuilder.withFilteredNamesForShadcn();
|
|
140
|
+
if (filterFn) {
|
|
141
|
+
figmaComponentsBuilder.withFilter(filterFn);
|
|
142
|
+
}
|
|
143
|
+
const figmaComponents = figmaComponentsBuilder.build();
|
|
144
|
+
console.log(figmaComponents.length);
|
|
145
|
+
const generatedComponentsMDFile = generateMarkdownFromComponents(figmaComponents);
|
|
146
|
+
// const mdWithImageAnalysis = await generateTextWithAI(
|
|
147
|
+
// `
|
|
148
|
+
// Given this markdown file content:
|
|
149
|
+
// ${generatedComponentsMDFile}
|
|
150
|
+
//
|
|
151
|
+
// ------ INSTRUCTIONS -------
|
|
152
|
+
// !IMPORTANT: Only return with Markdown content, nothing else, I will be putting this straight in a .md file. Don't even start the file with \`\`\`markdown
|
|
153
|
+
// For every component Image: Analyze the given image and add to the given component.
|
|
154
|
+
// - add more content to the "Description:" part of the component.
|
|
155
|
+
// - add "Hierarchy:" part under the component, returning the parts a component is build of. like [Button, Input]
|
|
156
|
+
// `,
|
|
157
|
+
// AIProvider.OpenAI,
|
|
158
|
+
// { temperature: 0.2, maxTokens: 8000 },
|
|
159
|
+
// );
|
|
160
|
+
// await fs.mkdir(outputDir, { recursive: true });
|
|
161
|
+
const outPath = path.join(outputDir, 'design-system.md');
|
|
162
|
+
await fs.writeFile(outPath, generatedComponentsMDFile);
|
|
163
|
+
// await copyFile("../../../examples/design-system/design-system-principles.md", outputDir, 'design-system-principles.md');
|
|
164
|
+
}
|
|
85
165
|
// Check if this file is being run directly
|
|
86
166
|
if (process.argv[1] === __filename) {
|
|
87
167
|
const [, , inputDir, outputDir] = process.argv;
|
|
@@ -97,12 +177,20 @@ if (process.argv[1] === __filename) {
|
|
|
97
177
|
// console.error('Error generating design-system.md:', err);
|
|
98
178
|
// process.exit(1);
|
|
99
179
|
// });
|
|
100
|
-
copyDesignSystemDocsAndUserPreferences(inputDir, outputDir)
|
|
180
|
+
// copyDesignSystemDocsAndUserPreferences(inputDir, outputDir)
|
|
181
|
+
// .then(() => {
|
|
182
|
+
// console.log(`design-system.md copied to ${outputDir}`);
|
|
183
|
+
// })
|
|
184
|
+
// .catch((err) => {
|
|
185
|
+
// console.error('Error copying design-system.md:', err);
|
|
186
|
+
// process.exit(1);
|
|
187
|
+
// });
|
|
188
|
+
importDesignSystemComponentsFromFigma(outputDir)
|
|
101
189
|
.then(() => {
|
|
102
|
-
console.log(`design-system.md
|
|
190
|
+
console.log(`design-system.md generated to ${outputDir}`);
|
|
103
191
|
})
|
|
104
192
|
.catch((err) => {
|
|
105
|
-
console.error('Error
|
|
193
|
+
console.error('Error generating design-system.md:', err);
|
|
106
194
|
process.exit(1);
|
|
107
195
|
});
|
|
108
196
|
}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { FilterFunctionType } from '../FigmaComponentsBuilder';
|
|
2
|
+
export declare class FilterLoader {
|
|
3
|
+
private tsxRegistered;
|
|
4
|
+
private tsxUnregister;
|
|
5
|
+
loadFilter(filePath: string): Promise<FilterFunctionType>;
|
|
6
|
+
private ensureTsxSupport;
|
|
7
|
+
cleanup(): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=FilterLoader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterLoader.d.ts","sourceRoot":"","sources":["../../src/utils/FilterLoader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,qBAAa,YAAY;IACvB,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,aAAa,CAA6B;IAE5C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;YAmCjD,gBAAgB;IAqB9B,OAAO,IAAI,IAAI;CAUhB"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { extname, resolve as resolvePath } from 'path';
|
|
2
|
+
import { pathToFileURL } from 'url';
|
|
3
|
+
import { existsSync } from 'fs';
|
|
4
|
+
export class FilterLoader {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.tsxRegistered = false;
|
|
7
|
+
this.tsxUnregister = null;
|
|
8
|
+
}
|
|
9
|
+
async loadFilter(filePath) {
|
|
10
|
+
if (typeof filePath !== 'string' || filePath.trim().length === 0) {
|
|
11
|
+
throw new Error('Filter file path is required');
|
|
12
|
+
}
|
|
13
|
+
const absolutePath = resolvePath(process.cwd(), filePath);
|
|
14
|
+
if (!existsSync(absolutePath)) {
|
|
15
|
+
throw new Error(`Filter file not found: ${absolutePath}`);
|
|
16
|
+
}
|
|
17
|
+
const ext = extname(absolutePath).toLowerCase();
|
|
18
|
+
// Enable tsx loader for TS files at runtime
|
|
19
|
+
if (ext === '.ts' || ext === '.tsx') {
|
|
20
|
+
await this.ensureTsxSupport();
|
|
21
|
+
}
|
|
22
|
+
const fileUrl = pathToFileURL(absolutePath).href;
|
|
23
|
+
const loadedUnknown = await import(fileUrl);
|
|
24
|
+
const loadedModule = loadedUnknown;
|
|
25
|
+
if (typeof loadedModule.filter === 'function') {
|
|
26
|
+
return loadedModule.filter;
|
|
27
|
+
}
|
|
28
|
+
if (typeof loadedModule.default === 'function') {
|
|
29
|
+
console.warn('Using default export from filter module. Prefer a named export "filter".');
|
|
30
|
+
return loadedModule.default;
|
|
31
|
+
}
|
|
32
|
+
throw new Error('No filter function found. Export a function named "filter" or as a default export from the file.');
|
|
33
|
+
}
|
|
34
|
+
async ensureTsxSupport() {
|
|
35
|
+
if (this.tsxRegistered)
|
|
36
|
+
return;
|
|
37
|
+
try {
|
|
38
|
+
const tsxUnknown = await import('tsx/esm/api');
|
|
39
|
+
const tsxApi = tsxUnknown;
|
|
40
|
+
if (typeof tsxApi.register === 'function') {
|
|
41
|
+
this.tsxUnregister = tsxApi.register();
|
|
42
|
+
this.tsxRegistered = true;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
throw new Error('tsx/esm/api.register is not a function');
|
|
46
|
+
}
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
throw new Error('TypeScript filter detected but tsx is not available.\n' +
|
|
51
|
+
'Install tsx (npm i -D tsx) or provide a JavaScript file (.js/.mjs).');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
cleanup() {
|
|
55
|
+
if (this.tsxUnregister) {
|
|
56
|
+
try {
|
|
57
|
+
this.tsxUnregister();
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
this.tsxUnregister = null;
|
|
61
|
+
this.tsxRegistered = false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=FilterLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilterLoader.js","sourceRoot":"","sources":["../../src/utils/FilterLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,MAAM,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAGhC,MAAM,OAAO,YAAY;IAAzB;QACU,kBAAa,GAAG,KAAK,CAAC;QACtB,kBAAa,GAAwB,IAAI,CAAC;IAoEpD,CAAC;IAlEC,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC;QAE1D,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,0BAA0B,YAAY,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;QAEhD,4CAA4C;QAC5C,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACpC,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAChC,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC;QAEjD,MAAM,aAAa,GAAY,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,aAAwD,CAAC;QAE9E,IAAI,OAAO,YAAY,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC9C,OAAO,YAAY,CAAC,MAA4B,CAAC;QACnD,CAAC;QAED,IAAI,OAAO,YAAY,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,0EAA0E,CAAC,CAAC;YACzF,OAAO,YAAY,CAAC,OAA6B,CAAC;QACpD,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,kGAAkG,CAAC,CAAC;IACtH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO;QAE/B,IAAI,CAAC;YACH,MAAM,UAAU,GAAY,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,MAAM,GAAG,UAA4C,CAAC;YAC5D,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC1C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACvC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;YAC5D,CAAC;YACD,6DAA6D;QAC/D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,wDAAwD;gBACtD,qEAAqE,CACxE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,IAAI,CAAC;gBACH,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBAC1B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
|