@futurebrand/dev-tools 2.7.0 → 2.7.2
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/commands/ai/modules/figma/index.d.ts +3 -1
- package/dist/commands/ai/modules/figma/index.js +51 -41
- package/dist/commands/ai/modules/state/index.d.ts +0 -1
- package/dist/commands/ai/modules/state/index.js +1 -16
- package/dist/commands/ai/modules/state/types.d.ts +0 -1
- package/dist/modules/ai-server-module/index.d.ts +0 -1
- package/dist/modules/ai-server-module/index.js +2 -12
- package/dist/modules/ai-server-module/types.d.ts +0 -1
- package/package.json +1 -1
|
@@ -4,7 +4,9 @@ declare class FigmaModule {
|
|
|
4
4
|
private api;
|
|
5
5
|
constructor(state: AIState);
|
|
6
6
|
private addVariantsToBlock;
|
|
7
|
-
private
|
|
7
|
+
private getNewBlocks;
|
|
8
|
+
private getBlocksDataFromFigma;
|
|
9
|
+
private getDefaultBlocks;
|
|
8
10
|
loadBlocks(): Promise<void>;
|
|
9
11
|
}
|
|
10
12
|
export default FigmaModule;
|
|
@@ -19,35 +19,25 @@ class FigmaModule {
|
|
|
19
19
|
data.variants.push(variant);
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
async
|
|
22
|
+
async getNewBlocks(blocks) {
|
|
23
23
|
const data = this.state.getData();
|
|
24
|
-
const
|
|
24
|
+
const newBlocks = [];
|
|
25
25
|
const nextProject = data.projects.find((project) => project.type === 'next.js');
|
|
26
|
+
if (!nextProject) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
26
29
|
for (const block of blocks) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
continue;
|
|
31
|
-
}
|
|
32
|
-
const alreadyExist = await this.state.file.verifyBlockAlreadyExists(nextProject, block.name);
|
|
33
|
-
if (alreadyExist) {
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (!block.hidden) {
|
|
38
|
-
defaultBlocks.push(block.name);
|
|
30
|
+
const alreadyExist = await this.state.file.verifyBlockAlreadyExists(nextProject, block.name);
|
|
31
|
+
if (!alreadyExist) {
|
|
32
|
+
newBlocks.push(block.name);
|
|
39
33
|
}
|
|
40
34
|
}
|
|
41
|
-
return
|
|
35
|
+
return newBlocks;
|
|
42
36
|
}
|
|
43
|
-
async
|
|
44
|
-
console.log('- Finding figma blocks canvas... Please wait');
|
|
45
|
-
const data = this.state.getData();
|
|
46
|
-
const figmaPageID = data.configs.figma;
|
|
37
|
+
async getBlocksDataFromFigma(figmaPageID) {
|
|
47
38
|
const canvas = await this.api.getBlockCanvas(figmaPageID);
|
|
48
|
-
console.log('- Loading pages blocks');
|
|
49
|
-
const blocksData = [];
|
|
50
39
|
const blocks = await this.api.getBlocks(figmaPageID, canvas);
|
|
40
|
+
const blocksData = [];
|
|
51
41
|
Object.keys(blocks).forEach((blockName) => {
|
|
52
42
|
let block = blocksData.find((block) => block.name === blockName);
|
|
53
43
|
if (!block) {
|
|
@@ -55,31 +45,51 @@ class FigmaModule {
|
|
|
55
45
|
name: blockName,
|
|
56
46
|
variants: [],
|
|
57
47
|
hidden: false,
|
|
58
|
-
generated: false,
|
|
59
48
|
};
|
|
60
49
|
blocksData.push(block);
|
|
61
50
|
}
|
|
62
51
|
this.addVariantsToBlock(block, blocks[blockName]);
|
|
63
52
|
});
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
53
|
+
return blocksData;
|
|
54
|
+
}
|
|
55
|
+
getDefaultBlocks(blockNames) {
|
|
56
|
+
try {
|
|
57
|
+
const blocks = this.state.getData().blocks;
|
|
58
|
+
return blockNames.filter((blockName) => {
|
|
59
|
+
const block = blocks.find((b) => b.name === blockName);
|
|
60
|
+
return block ? !block.hidden : true;
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return blockNames;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async loadBlocks() {
|
|
68
|
+
console.log('- Finding figma blocks canvas... Please wait');
|
|
69
|
+
const data = this.state.getData();
|
|
70
|
+
console.log('- Loading pages blocks');
|
|
71
|
+
const blocksData = await this.getBlocksDataFromFigma(data.configs.figma);
|
|
72
|
+
const newBlocks = await this.getNewBlocks(blocksData);
|
|
73
|
+
if (newBlocks.length === 0) {
|
|
74
|
+
console.log('- No new blocks found in Figma');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const defaultBlocks = this.getDefaultBlocks(newBlocks);
|
|
78
|
+
console.log(`- Loaded ${blocksData.length} blocks from Figma ${blocksData.length !== newBlocks.length ? `(${newBlocks.length} new)` : ''}`);
|
|
79
|
+
const query = await inquirer_1.default.prompt([
|
|
80
|
+
{
|
|
81
|
+
type: 'checkbox',
|
|
82
|
+
name: 'blocks',
|
|
83
|
+
message: 'What blocks do you want to use?',
|
|
84
|
+
choices: newBlocks,
|
|
85
|
+
default: defaultBlocks,
|
|
86
|
+
},
|
|
87
|
+
]);
|
|
88
|
+
for (const blockName of newBlocks) {
|
|
89
|
+
const block = blocksData.find((b) => b.name === blockName);
|
|
90
|
+
if (block) {
|
|
91
|
+
const isNotHidden = query.blocks.includes(blockName);
|
|
92
|
+
block.hidden = !isNotHidden;
|
|
83
93
|
}
|
|
84
94
|
}
|
|
85
95
|
this.state.setBlocks(blocksData);
|
|
@@ -19,7 +19,6 @@ declare class AIState {
|
|
|
19
19
|
getAvailableBlocksNames(filters?: IAvailableFilters): string[];
|
|
20
20
|
setBlocks(blocks: IAIFileState['blocks']): void;
|
|
21
21
|
setColors(colors: IAIFileState['colors']): void;
|
|
22
|
-
setBlockGenerated(blockName: string, generated?: boolean): void;
|
|
23
22
|
getBlockVariants(blockName: string): any[];
|
|
24
23
|
setBlockHidden(blockName: string, hidden?: boolean): void;
|
|
25
24
|
static init(): Promise<AIState>;
|
|
@@ -20,13 +20,9 @@ class AIState {
|
|
|
20
20
|
{
|
|
21
21
|
type: 'input',
|
|
22
22
|
name: 'apiUrl',
|
|
23
|
+
default: 'http://localhost:3333',
|
|
23
24
|
message: 'What is the AI API url?',
|
|
24
25
|
},
|
|
25
|
-
{
|
|
26
|
-
type: 'input',
|
|
27
|
-
name: 'apiToken',
|
|
28
|
-
message: 'What is the AI API token?',
|
|
29
|
-
},
|
|
30
26
|
{
|
|
31
27
|
type: 'input',
|
|
32
28
|
name: 'page',
|
|
@@ -37,7 +33,6 @@ class AIState {
|
|
|
37
33
|
return {
|
|
38
34
|
configs: {
|
|
39
35
|
api: query.apiUrl,
|
|
40
|
-
token: query.apiToken,
|
|
41
36
|
figma: query.page,
|
|
42
37
|
},
|
|
43
38
|
projects,
|
|
@@ -84,9 +79,6 @@ class AIState {
|
|
|
84
79
|
if (hidden != null && block.hidden !== hidden) {
|
|
85
80
|
return false;
|
|
86
81
|
}
|
|
87
|
-
if (generated != null && block.generated !== generated) {
|
|
88
|
-
return false;
|
|
89
|
-
}
|
|
90
82
|
return true;
|
|
91
83
|
});
|
|
92
84
|
}
|
|
@@ -105,13 +97,6 @@ class AIState {
|
|
|
105
97
|
}
|
|
106
98
|
this.data.colors = colors;
|
|
107
99
|
}
|
|
108
|
-
setBlockGenerated(blockName, generated = true) {
|
|
109
|
-
const blocks = this.getData().blocks;
|
|
110
|
-
const block = blocks.find((block) => block.name === blockName);
|
|
111
|
-
if (block) {
|
|
112
|
-
block.generated = generated;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
100
|
getBlockVariants(blockName) {
|
|
116
101
|
const blocks = this.getData().blocks.find((block) => block.name === blockName);
|
|
117
102
|
return blocks?.variants || [];
|
|
@@ -16,7 +16,6 @@ const longTimeoutAgent = new undici_1.Agent({
|
|
|
16
16
|
class AIServerModule {
|
|
17
17
|
filePath = '';
|
|
18
18
|
api = '';
|
|
19
|
-
token = '';
|
|
20
19
|
constructor() {
|
|
21
20
|
(0, node_net_1.setDefaultAutoSelectFamilyAttemptTimeout)(TIMEOUT_LIMIT_TIME);
|
|
22
21
|
}
|
|
@@ -25,23 +24,17 @@ class AIServerModule {
|
|
|
25
24
|
{
|
|
26
25
|
type: 'input',
|
|
27
26
|
name: 'apiUrl',
|
|
27
|
+
default: 'http://localhost:3333',
|
|
28
28
|
message: 'What is the AI API url?',
|
|
29
29
|
},
|
|
30
|
-
{
|
|
31
|
-
type: 'input',
|
|
32
|
-
name: 'apiToken',
|
|
33
|
-
message: 'What is the AI API token?',
|
|
34
|
-
},
|
|
35
30
|
]);
|
|
36
31
|
return {
|
|
37
32
|
api: query.apiUrl,
|
|
38
|
-
token: query.apiToken,
|
|
39
33
|
};
|
|
40
34
|
}
|
|
41
35
|
async create() {
|
|
42
36
|
const configs = await this.createConfigs();
|
|
43
37
|
this.api = configs.api;
|
|
44
|
-
this.token = configs.token;
|
|
45
38
|
}
|
|
46
39
|
async fetchApi(path, init) {
|
|
47
40
|
if (!this.isReady) {
|
|
@@ -55,7 +48,6 @@ class AIServerModule {
|
|
|
55
48
|
...init,
|
|
56
49
|
headers: {
|
|
57
50
|
'Content-Type': 'application/json',
|
|
58
|
-
Authorization: `Bearer ${this.token}`,
|
|
59
51
|
...init?.headers,
|
|
60
52
|
},
|
|
61
53
|
signal: AbortSignal.timeout(TIMEOUT_LIMIT_TIME),
|
|
@@ -83,7 +75,6 @@ class AIServerModule {
|
|
|
83
75
|
}
|
|
84
76
|
setApiConfigs(configs) {
|
|
85
77
|
this.api = configs.api;
|
|
86
|
-
this.token = configs.token;
|
|
87
78
|
}
|
|
88
79
|
async save() {
|
|
89
80
|
if (!this.isReady) {
|
|
@@ -92,11 +83,10 @@ class AIServerModule {
|
|
|
92
83
|
const filePath = this.filePath || (await (0, files_1.getTempFilePath)(FILE_NAME));
|
|
93
84
|
await (0, files_1.writeJSONFile)(filePath, {
|
|
94
85
|
api: this.api,
|
|
95
|
-
token: this.token,
|
|
96
86
|
});
|
|
97
87
|
}
|
|
98
88
|
get isReady() {
|
|
99
|
-
return this.api !== ''
|
|
89
|
+
return this.api !== '';
|
|
100
90
|
}
|
|
101
91
|
}
|
|
102
92
|
exports.default = AIServerModule;
|