@futurebrand/dev-tools 2.5.1 → 2.5.3

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 (33) hide show
  1. package/dist/commands/ai/add.js +36 -12
  2. package/dist/commands/ai/docs/index.d.ts +3 -0
  3. package/dist/commands/ai/docs/index.js +60 -0
  4. package/dist/commands/ai/docs/modules/generator/index.d.ts +17 -0
  5. package/dist/commands/ai/docs/modules/generator/index.js +88 -0
  6. package/dist/commands/ai/docs/types.d.ts +11 -0
  7. package/dist/commands/ai/docs/types.js +2 -0
  8. package/dist/commands/ai/generate.js +38 -14
  9. package/dist/commands/ai/modules/figma/index.js +7 -16
  10. package/dist/commands/ai/modules/file-manager/index.d.ts +22 -0
  11. package/dist/commands/ai/modules/file-manager/index.js +156 -0
  12. package/dist/commands/ai/modules/file-manager/types.d.ts +4 -0
  13. package/dist/commands/ai/modules/file-manager/types.js +2 -0
  14. package/dist/commands/ai/modules/generator/index.d.ts +7 -4
  15. package/dist/commands/ai/modules/generator/index.js +55 -73
  16. package/dist/commands/ai/modules/generator/types.d.ts +17 -0
  17. package/dist/commands/ai/modules/generator/types.js +2 -0
  18. package/dist/commands/ai/modules/project-adder/index.d.ts +2 -3
  19. package/dist/commands/ai/modules/project-adder/index.js +6 -58
  20. package/dist/commands/ai/modules/state/index.d.ts +3 -0
  21. package/dist/commands/ai/modules/state/index.js +15 -19
  22. package/dist/commands/ai/modules/state/types.d.ts +2 -3
  23. package/dist/modules/ai-server-module/index.d.ts +15 -0
  24. package/dist/modules/ai-server-module/index.js +86 -0
  25. package/dist/modules/ai-server-module/types.d.ts +4 -0
  26. package/dist/modules/ai-server-module/types.js +2 -0
  27. package/dist/modules/parallel/index.d.ts +1 -6
  28. package/dist/modules/parallel/index.js +11 -29
  29. package/dist/types/project.d.ts +1 -0
  30. package/dist/utils/files.d.ts +2 -0
  31. package/dist/utils/files.js +42 -0
  32. package/dist/utils/project.js +25 -5
  33. package/package.json +1 -1
@@ -19,28 +19,52 @@ const addCommand = new commander_1.Command('add')
19
19
  return;
20
20
  }
21
21
  const isAll = options.all === true;
22
- const choices = state.getAvailableBlocksNames({
23
- hidden: isAll ? undefined : false,
24
- generated: true,
25
- });
26
- if (!choices.length) {
27
- console.error('No blocks available to add');
28
- return;
29
- }
30
- const blockQuery = await inquirer_1.default.prompt([
22
+ const projects = state
23
+ .getData()
24
+ .projects.filter((p) => p.type === 'strapi' || p.type === 'next.js');
25
+ const userQuery = await inquirer_1.default.prompt([
26
+ {
27
+ type: 'select',
28
+ name: 'project',
29
+ message: 'Select the project to generate',
30
+ choices: projects.map((p) => ({
31
+ name: `${p.name} (${p.type})`,
32
+ value: p.name,
33
+ })),
34
+ },
31
35
  {
32
36
  type: 'select',
33
37
  name: 'block',
34
38
  message: 'Select the block to add',
35
- choices,
39
+ choices: async ({ project }) => {
40
+ const projectData = projects.find((p) => p.name === project);
41
+ if (!projectData) {
42
+ return [];
43
+ }
44
+ const allBlocks = state.getAvailableBlocks({
45
+ hidden: false,
46
+ });
47
+ const toGenerateBlocks = isAll
48
+ ? allBlocks
49
+ : await state.file.getAvailableBlocksToAdd(allBlocks, projectData);
50
+ if (!toGenerateBlocks.length) {
51
+ throw new Error('No blocks available to generate');
52
+ }
53
+ return toGenerateBlocks.map((block) => block.name).sort();
54
+ },
36
55
  },
37
56
  ]);
38
- const blocksToAdd = blockQuery.block;
57
+ const blocksToAdd = userQuery.block;
39
58
  if (!blocksToAdd) {
40
59
  console.error('No blocks selected');
41
60
  return;
42
61
  }
62
+ const project = projects.find((p) => p.name === userQuery.project);
63
+ if (!project) {
64
+ console.error('No project selected');
65
+ return;
66
+ }
43
67
  const projectAdder = new project_adder_1.default(state);
44
- await projectAdder.addBlock(blocksToAdd);
68
+ await projectAdder.addBlock(blocksToAdd, project);
45
69
  });
46
70
  exports.default = addCommand;
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ declare const generateDOCSCommand: Command;
3
+ export default generateDOCSCommand;
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const files_1 = require("../../../utils/files");
4
+ const project_1 = require("../../../utils/project");
5
+ const commander_1 = require("commander");
6
+ const inquirer_1 = require("inquirer");
7
+ const path = require("path");
8
+ const generator_1 = require("./modules/generator");
9
+ // import { Generator } from './modules/generator'
10
+ // import AIState from './modules/state'
11
+ const generateDOCSCommand = new commander_1.Command('docs')
12
+ .alias('doc')
13
+ .description('Ai Documentation Generate Command')
14
+ .action(async () => {
15
+ let projects = await (0, project_1.getProjects)();
16
+ if (!projects.length) {
17
+ console.error('No projects found');
18
+ return;
19
+ }
20
+ if (projects.length > 0) {
21
+ const projectQuery = await inquirer_1.default.prompt([
22
+ {
23
+ type: 'checkbox',
24
+ name: 'projects',
25
+ message: 'Select the projects to generate documentation for',
26
+ choices: projects.map((project) => project.name),
27
+ },
28
+ ]);
29
+ projects = projects.filter((project) => projectQuery.projects.includes(project.name));
30
+ }
31
+ const generator = new generator_1.default();
32
+ const docs = [];
33
+ for (const project of projects) {
34
+ const categories = await (0, files_1.getDirectoriesInPath)(project.srcPath);
35
+ for (const category of categories) {
36
+ const categoryPath = path.join(project.srcPath, category);
37
+ const docsDirs = await (0, files_1.getDirectoriesInPath)(categoryPath);
38
+ if (!docsDirs.length) {
39
+ continue;
40
+ }
41
+ for (const doc of docsDirs) {
42
+ const docPath = path.join(categoryPath, doc);
43
+ const files = await (0, files_1.getFilesInPath)(docPath);
44
+ if (!files.length) {
45
+ continue;
46
+ }
47
+ docs.push({
48
+ project: project.name,
49
+ name: doc,
50
+ category,
51
+ files,
52
+ projectType: project.type,
53
+ });
54
+ }
55
+ }
56
+ }
57
+ console.log('Generating documentation...');
58
+ await generator.generate(docs);
59
+ });
60
+ exports.default = generateDOCSCommand;
@@ -0,0 +1,17 @@
1
+ import type { IDocumentation } from '../../types';
2
+ export interface IDocGeneratorResponse {
3
+ title: string;
4
+ description: string;
5
+ content: string;
6
+ }
7
+ declare class DocsGenerator {
8
+ private server;
9
+ constructor();
10
+ private generateDOCDocumentation;
11
+ private getDocTempDirectory;
12
+ private saveDocFile;
13
+ private verifyDocAlreadyExists;
14
+ private getDOCFileData;
15
+ generate(docs: IDocumentation[]): Promise<void>;
16
+ }
17
+ export default DocsGenerator;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ai_server_module_1 = require("../../../../../modules/ai-server-module");
4
+ const parallel_1 = require("../../../../../modules/parallel");
5
+ const files_1 = require("../../../../../utils/files");
6
+ const cliProgress = require("cli-progress");
7
+ const fs = require("fs/promises");
8
+ const path = require("path");
9
+ const DOCS_TMP_FOLDER_NAME = 'docs';
10
+ const NUM_OF_PARALLEL_REQUESTS = 5;
11
+ class DocsGenerator {
12
+ server;
13
+ constructor() {
14
+ this.server = new ai_server_module_1.default();
15
+ }
16
+ async generateDOCDocumentation(doc, files) {
17
+ const { result } = await this.server.fetchApi('/generate/docs', {
18
+ method: 'POST',
19
+ body: JSON.stringify({
20
+ ...doc,
21
+ files,
22
+ }),
23
+ });
24
+ if (!result) {
25
+ throw new Error('Failed to generate documentation');
26
+ }
27
+ const fullContent = [
28
+ '---',
29
+ `title: "${result.title}"`,
30
+ `description: "${result.description}"`,
31
+ '---',
32
+ result.content,
33
+ ];
34
+ return fullContent.join('\n');
35
+ }
36
+ async getDocTempDirectory(doc) {
37
+ const projectFolder = doc.project.replace('@futurebrand/', '');
38
+ return (0, files_1.getTempFilePath)(DOCS_TMP_FOLDER_NAME, projectFolder, doc.category);
39
+ }
40
+ async saveDocFile(doc, content) {
41
+ const tempDir = await this.getDocTempDirectory(doc);
42
+ await (0, files_1.verifyAndCreateFolder)(tempDir);
43
+ const filePath = path.join(tempDir, `${doc.name}.md`);
44
+ await fs.writeFile(filePath, content, 'utf-8');
45
+ }
46
+ async verifyDocAlreadyExists(doc) {
47
+ const tempDir = await this.getDocTempDirectory(doc);
48
+ const filePath = path.join(tempDir, `${doc.name}.md`);
49
+ const fileExist = await (0, files_1.verifyPath)(filePath);
50
+ return fileExist;
51
+ }
52
+ async getDOCFileData(doc) {
53
+ const { files: filePaths } = doc;
54
+ const files = [];
55
+ for (const filePath of filePaths) {
56
+ const content = await fs.readFile(filePath, 'utf-8');
57
+ files.push({
58
+ path: filePath,
59
+ content,
60
+ });
61
+ }
62
+ return files;
63
+ }
64
+ async generate(docs) {
65
+ if (!this.server.isReady) {
66
+ await this.server.init();
67
+ }
68
+ const parallel = new parallel_1.default(NUM_OF_PARALLEL_REQUESTS);
69
+ const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.legacy);
70
+ progressBar.start(docs.length, 0);
71
+ for (const doc of docs) {
72
+ parallel.add(async () => {
73
+ const docExists = await this.verifyDocAlreadyExists(doc);
74
+ if (docExists) {
75
+ progressBar.increment();
76
+ return;
77
+ }
78
+ const files = await this.getDOCFileData(doc);
79
+ const content = await this.generateDOCDocumentation(doc, files);
80
+ await this.saveDocFile(doc, content);
81
+ progressBar.increment();
82
+ });
83
+ }
84
+ await parallel.execute();
85
+ progressBar.stop();
86
+ }
87
+ }
88
+ exports.default = DocsGenerator;
@@ -0,0 +1,11 @@
1
+ export interface IDocumentation {
2
+ name: string;
3
+ category: string;
4
+ files: string[];
5
+ project: string;
6
+ projectType: string;
7
+ }
8
+ export interface IFileData {
9
+ path: string;
10
+ content: string;
11
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const commander_1 = require("commander");
4
4
  const inquirer_1 = require("inquirer");
5
+ const docs_1 = require("./docs");
5
6
  const generator_1 = require("./modules/generator");
6
7
  const state_1 = require("./modules/state");
7
8
  const generateCommand = new commander_1.Command('generate')
@@ -17,31 +18,53 @@ const generateCommand = new commander_1.Command('generate')
17
18
  return;
18
19
  }
19
20
  const isAll = options.all === true;
20
- const choices = state.getAvailableBlocksNames(isAll
21
- ? {}
22
- : {
23
- hidden: false,
24
- generated: false,
25
- });
26
- if (!choices.length) {
27
- console.error('No blocks available to generate');
28
- return;
29
- }
30
- const blockQuery = await inquirer_1.default.prompt([
21
+ const projects = state
22
+ .getData()
23
+ .projects.filter((p) => p.type === 'strapi' || p.type === 'next.js');
24
+ const userQuery = await inquirer_1.default.prompt([
25
+ {
26
+ type: 'select',
27
+ name: 'project',
28
+ message: 'Select the project to generate',
29
+ choices: projects.map((p) => ({
30
+ name: `${p.name} (${p.type})`,
31
+ value: p.name,
32
+ })),
33
+ },
31
34
  {
32
35
  type: 'checkbox',
33
36
  name: 'blocks',
34
37
  message: 'Select the blocks to generate',
35
- choices,
38
+ choices: async ({ project }) => {
39
+ const projectData = projects.find((p) => p.name === project);
40
+ if (!projectData) {
41
+ return [];
42
+ }
43
+ const allBlocks = state.getAvailableBlocks({
44
+ hidden: false,
45
+ });
46
+ const toGenerateBlocks = isAll
47
+ ? allBlocks
48
+ : await state.file.getAvailableBlocksToGenerate(allBlocks, projectData);
49
+ if (!toGenerateBlocks.length) {
50
+ throw new Error('No blocks available to generate');
51
+ }
52
+ return toGenerateBlocks.map((block) => block.name).sort();
53
+ },
36
54
  },
37
55
  ]);
38
- const blocksToGenerate = blockQuery.blocks;
56
+ const blocksToGenerate = userQuery.blocks;
39
57
  if (!blocksToGenerate.length) {
40
58
  console.error('No blocks selected');
41
59
  return;
42
60
  }
61
+ const project = projects.find((p) => p.name === userQuery.project);
62
+ if (!project) {
63
+ console.error('No project selected');
64
+ return;
65
+ }
43
66
  const generator = new generator_1.Generator(state);
44
- await generator.generateBlocks(blocksToGenerate);
67
+ await generator.generateBlocks(blocksToGenerate, project);
45
68
  });
46
69
  const generateStyleCommand = new commander_1.Command('styles')
47
70
  .alias('style')
@@ -72,4 +95,5 @@ const generateChecklistCommand = new commander_1.Command('checklist')
72
95
  });
73
96
  generateCommand.addCommand(generateStyleCommand);
74
97
  generateCommand.addCommand(generateChecklistCommand);
98
+ generateCommand.addCommand(docs_1.default);
75
99
  exports.default = generateCommand;
@@ -1,6 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const path = require("node:path");
4
3
  const files_1 = require("../../../../utils/files");
5
4
  const inquirer_1 = require("inquirer");
6
5
  const generator_1 = require("../generator");
@@ -25,24 +24,16 @@ class FigmaModule {
25
24
  async getDefaultCheckedBlocks(blocks) {
26
25
  const data = this.state.getData();
27
26
  const defaultBlocks = [];
28
- const currentBlocks = data.blocks;
29
27
  const nextProject = data.projects.find((project) => project.type === 'next.js');
30
28
  for (const block of blocks) {
31
- const inCurrentBlocks = currentBlocks.find((b) => b.name === block.name);
32
- if (inCurrentBlocks) {
33
- block.hidden = inCurrentBlocks.hidden;
34
- block.generated = inCurrentBlocks.generated;
29
+ const tempFolder = await (0, files_1.getTempFilePath)(generator_1.GENERATOR_FOLDER_NAME, block.name);
30
+ if (await (0, files_1.verifyPath)(tempFolder)) {
31
+ continue;
35
32
  }
36
- else {
37
- const tempFolder = await (0, files_1.getTempFilePath)(generator_1.GENERATOR_FOLDER_NAME, block.name);
38
- if (await (0, files_1.verifyPath)(tempFolder)) {
39
- block.generated = true;
40
- }
41
- if (nextProject) {
42
- const blockFolder = path.join(nextProject.path, 'layouts', 'blocks', block.name);
43
- if (await (0, files_1.verifyPath)(blockFolder)) {
44
- block.hidden = true;
45
- }
33
+ if (nextProject) {
34
+ const alreadyExist = await this.state.file.verifyBlockAlreadyExists(nextProject, block.name);
35
+ if (alreadyExist) {
36
+ continue;
46
37
  }
47
38
  }
48
39
  if (!block.hidden) {
@@ -0,0 +1,22 @@
1
+ import type { IProject } from '../../../../types/project';
2
+ import type { IBlockData } from '../state/types';
3
+ export declare const GENERATOR_FOLDER_NAME = "generated-blocks";
4
+ export declare const GENERATOR_STRAPI_FILE_NAME = "strapi.json";
5
+ export declare const GENERATOR_NEXTJS_FILE_NAME = "nextjs.tsx";
6
+ declare class FileManager {
7
+ private getBlockTempPath;
8
+ private getBlockTempFilePath;
9
+ private getStrapiFolders;
10
+ private getNextjsBlockFolder;
11
+ private getBlockPath;
12
+ verifyBlockAlreadyGenerated(blockName: string, project: IProject): Promise<boolean>;
13
+ verifyBlockAlreadyExists(project: IProject, blockName: string): Promise<boolean>;
14
+ getAvailableBlocksToGenerate(blocks: IBlockData[], project: IProject): Promise<IBlockData[]>;
15
+ getAvailableBlocksToAdd(blocks: IBlockData[], project: IProject): Promise<IBlockData[]>;
16
+ createBlockTempFolder(blockName: string): Promise<void>;
17
+ saveGeneratedBlock(blockName: string, project: IProject, content: any): Promise<void>;
18
+ loadGeneratedBlock(blockName: string, project: IProject): Promise<string>;
19
+ addNextBlockToProject(blockName: string, project: IProject): Promise<void>;
20
+ addStrapiBlockToProject(blockName: string, project: IProject): Promise<void>;
21
+ }
22
+ export default FileManager;
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GENERATOR_NEXTJS_FILE_NAME = exports.GENERATOR_STRAPI_FILE_NAME = exports.GENERATOR_FOLDER_NAME = void 0;
4
+ const fs = require("node:fs/promises");
5
+ const path = require("node:path");
6
+ const files_1 = require("../../../../utils/files");
7
+ exports.GENERATOR_FOLDER_NAME = 'generated-blocks';
8
+ exports.GENERATOR_STRAPI_FILE_NAME = 'strapi.json';
9
+ exports.GENERATOR_NEXTJS_FILE_NAME = 'nextjs.tsx';
10
+ class FileManager {
11
+ async getBlockTempPath(blockName) {
12
+ const tempFolder = await (0, files_1.getTempFilePath)(exports.GENERATOR_FOLDER_NAME, blockName);
13
+ await (0, files_1.verifyAndCreateFolder)(tempFolder);
14
+ return tempFolder;
15
+ }
16
+ async getBlockTempFilePath(project, blockName) {
17
+ const tempFolder = await this.getBlockTempPath(blockName);
18
+ const projectType = typeof project === 'string' ? project : project.type;
19
+ if (projectType === 'strapi') {
20
+ return path.join(tempFolder, exports.GENERATOR_STRAPI_FILE_NAME);
21
+ }
22
+ if (projectType === 'next.js') {
23
+ return path.join(tempFolder, exports.GENERATOR_NEXTJS_FILE_NAME);
24
+ }
25
+ throw new Error(`Unsupported project type: ${projectType}`);
26
+ }
27
+ getStrapiFolders(project) {
28
+ if (project.type !== 'strapi') {
29
+ throw new Error('Project is not a Strapi project');
30
+ }
31
+ const srcPath = project.srcPath || path.join(project.path, 'src');
32
+ const componentsFolder = path.join(srcPath, 'components');
33
+ const blocksFolder = path.join(componentsFolder, 'blocks');
34
+ const blocksAssetsFolder = path.join(componentsFolder, 'blocks-assets');
35
+ return {
36
+ blocks: blocksFolder,
37
+ assets: blocksAssetsFolder,
38
+ };
39
+ }
40
+ getNextjsBlockFolder(project, blockName) {
41
+ if (project.type !== 'next.js') {
42
+ throw new Error('Project is not a Next.js project');
43
+ }
44
+ const blockFolder = path.join(project.srcPath || project.path, 'layouts', 'blocks', blockName);
45
+ return blockFolder;
46
+ }
47
+ getBlockPath(project, blockName) {
48
+ if (project.type === 'strapi') {
49
+ const folders = this.getStrapiFolders(project);
50
+ const jsonName = blockName.replace('block-', '');
51
+ return path.join(folders.blocks, `${jsonName}.json`);
52
+ }
53
+ if (project.type === 'next.js') {
54
+ const blockFolder = this.getNextjsBlockFolder(project, blockName);
55
+ return path.join(blockFolder, `${blockName}.tsx`);
56
+ }
57
+ throw new Error(`Unsupported project type: ${project.type}`);
58
+ }
59
+ async verifyBlockAlreadyGenerated(blockName, project) {
60
+ const blockPath = await this.getBlockTempFilePath(project, blockName);
61
+ return await (0, files_1.verifyPath)(blockPath);
62
+ }
63
+ async verifyBlockAlreadyExists(project, blockName) {
64
+ const blockPath = this.getBlockPath(project, blockName);
65
+ return await (0, files_1.verifyPath)(blockPath);
66
+ }
67
+ async getAvailableBlocksToGenerate(blocks, project) {
68
+ const toGenerateBlocks = [];
69
+ for (const block of blocks) {
70
+ const alreadyExists = await this.verifyBlockAlreadyExists(project, block.name);
71
+ if (alreadyExists) {
72
+ continue;
73
+ }
74
+ const alreadyGenerated = await this.verifyBlockAlreadyGenerated(block.name, project);
75
+ if (alreadyGenerated) {
76
+ continue;
77
+ }
78
+ toGenerateBlocks.push(block);
79
+ }
80
+ return toGenerateBlocks;
81
+ }
82
+ async getAvailableBlocksToAdd(blocks, project) {
83
+ const toAddBlocks = [];
84
+ for (const block of blocks) {
85
+ const alreadyExists = await this.verifyBlockAlreadyExists(project, block.name);
86
+ if (alreadyExists) {
87
+ continue;
88
+ }
89
+ const alreadyGenerated = await this.verifyBlockAlreadyGenerated(block.name, project);
90
+ if (alreadyGenerated) {
91
+ toAddBlocks.push(block);
92
+ }
93
+ }
94
+ return toAddBlocks;
95
+ }
96
+ async createBlockTempFolder(blockName) {
97
+ const tempFolder = await this.getBlockTempPath(blockName);
98
+ await (0, files_1.verifyAndCreateFolder)(tempFolder);
99
+ }
100
+ async saveGeneratedBlock(blockName, project, content) {
101
+ const blockPath = await this.getBlockTempFilePath(project, blockName);
102
+ const stringContent = typeof content === 'string' ? content : JSON.stringify(content, null, 2);
103
+ await fs.writeFile(blockPath, stringContent);
104
+ }
105
+ async loadGeneratedBlock(blockName, project) {
106
+ const blockPath = await this.getBlockTempFilePath(project, blockName);
107
+ if (!(await (0, files_1.verifyPath)(blockPath))) {
108
+ throw new Error(`Generated block not found: ${blockPath}`);
109
+ }
110
+ return (0, files_1.loadFile)(blockPath);
111
+ }
112
+ async addNextBlockToProject(blockName, project) {
113
+ if (project.type !== 'next.js') {
114
+ throw new Error('Project is not a Next.js project');
115
+ }
116
+ const generatedPath = await this.getBlockTempFilePath(project, blockName);
117
+ if (!(await (0, files_1.verifyPath)(generatedPath))) {
118
+ throw new Error(`Generated block not found: ${generatedPath}`);
119
+ }
120
+ const content = await (0, files_1.loadFile)(generatedPath);
121
+ const blockFolder = this.getNextjsBlockFolder(project, blockName);
122
+ await (0, files_1.verifyAndCreateFolder)(blockFolder);
123
+ const mainFilePath = path.join(blockFolder, `${blockName}.tsx`);
124
+ const indexFilePath = path.join(blockFolder, 'index.ts');
125
+ const indexContent = `export { default } from './${blockName}'
126
+ `;
127
+ await fs.writeFile(mainFilePath, content);
128
+ await fs.writeFile(indexFilePath, indexContent);
129
+ }
130
+ async addStrapiBlockToProject(blockName, project) {
131
+ if (project.type !== 'strapi') {
132
+ throw new Error('Project is not a Strapi project');
133
+ }
134
+ const generatedPath = await this.getBlockTempFilePath(project, blockName);
135
+ if (!(await (0, files_1.verifyPath)(generatedPath))) {
136
+ throw new Error(`Generated block not found: ${generatedPath}`);
137
+ }
138
+ const content = await (0, files_1.loadFile)(generatedPath);
139
+ const blockData = JSON.parse(content);
140
+ const folders = this.getStrapiFolders(project);
141
+ await (0, files_1.verifyAndCreateFolder)(folders.blocks);
142
+ await (0, files_1.verifyAndCreateFolder)(folders.assets);
143
+ const blockNameClean = blockName.replace('block-', '');
144
+ const blockFilePath = path.join(folders.blocks, `${blockNameClean}.json`);
145
+ await fs.writeFile(blockFilePath, JSON.stringify(blockData.block, null, 2));
146
+ for (const asset of blockData.assets || []) {
147
+ const name = asset.info?.name;
148
+ if (!name) {
149
+ throw new Error(`Asset name is missing for block: ${blockName}`);
150
+ }
151
+ const assetFilePath = path.join(folders.assets, `${name}.json`);
152
+ await fs.writeFile(assetFilePath, JSON.stringify(asset, null, 2));
153
+ }
154
+ }
155
+ }
156
+ exports.default = FileManager;
@@ -0,0 +1,4 @@
1
+ export interface IStrapiFolders {
2
+ blocks: string;
3
+ assets: string;
4
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +1,6 @@
1
1
  import type { IProject } from '../../../../types/project';
2
2
  import type AIState from '../state';
3
+ import type { IStrapiGenerateResponse } from './types';
3
4
  export declare const GENERATOR_FOLDER_NAME = "generated-blocks";
4
5
  export declare const GENERATOR_STRAPI_FILE_NAME = "strapi.json";
5
6
  export declare const GENERATOR_NEXTJS_FILE_NAME = "nextjs.tsx";
@@ -7,11 +8,13 @@ export declare class Generator {
7
8
  private state;
8
9
  constructor(state: AIState);
9
10
  private get data();
10
- private generateNextBlock;
11
- private generateStrapiBlock;
11
+ private fetchNextBlock;
12
+ private fetchStrapiBlock;
12
13
  loadProjectCSS(nextProject?: IProject): Promise<string | null>;
13
- generateBlock(blockName: string, strapiProject: IProject | null | undefined, nextProject: IProject | null | undefined, styles: string | null | undefined, onGenerateCallback: () => void): Promise<void>;
14
- generateBlocks(blockNames: string[]): Promise<void>;
14
+ private generateStrapiBlock;
15
+ private generateNextBlock;
16
+ generateBlock(blockName: string, project: IProject): Promise<IStrapiGenerateResponse | undefined>;
17
+ generateBlocks(blockNames: string[], project: IProject): Promise<void>;
15
18
  generateStyles(): Promise<void>;
16
19
  generateChecklist(): Promise<void>;
17
20
  }