@diagramers/cli 1.0.19 → 1.0.20
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.
@@ -10,6 +10,10 @@ export declare class ProjectExtender {
|
|
10
10
|
addFeature(featureName: string): Promise<void>;
|
11
11
|
private createFeatureStructure;
|
12
12
|
private addDependencies;
|
13
|
+
private updateMainConfiguration;
|
14
|
+
private updateServerFile;
|
15
|
+
private updateRoutesIndex;
|
16
|
+
private updatePackageJson;
|
13
17
|
private capitalizeFirst;
|
14
18
|
}
|
15
19
|
//# sourceMappingURL=project-extender.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"project-extender.d.ts","sourceRoot":"","sources":["../../src/services/project-extender.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CA8Bd;IAEI,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAc7B,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
1
|
+
{"version":3,"file":"project-extender.d.ts","sourceRoot":"","sources":["../../src/services/project-extender.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CA8Bd;IAEI,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAc7B,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YA8BtC,sBAAsB;YAmGtB,eAAe;YASf,uBAAuB;YAevB,gBAAgB;YAkDhB,iBAAiB;YAqCjB,iBAAiB;IA4B/B,OAAO,CAAC,eAAe;CAGxB"}
|
@@ -103,7 +103,10 @@ class ProjectExtender {
|
|
103
103
|
if (feature.dependencies && feature.dependencies.length > 0) {
|
104
104
|
await this.addDependencies(feature.dependencies);
|
105
105
|
}
|
106
|
+
// Update main configuration to use the extended feature
|
107
|
+
await this.updateMainConfiguration(projectPath, feature);
|
106
108
|
console.log(chalk_1.default.green(`✅ Feature '${featureName}' added successfully!`));
|
109
|
+
console.log(chalk_1.default.blue(`📝 Main configuration updated to include ${featureName} feature`));
|
107
110
|
}
|
108
111
|
async createFeatureStructure(projectPath, feature) {
|
109
112
|
const featurePath = path.join(projectPath, 'src', 'features', feature.name);
|
@@ -199,6 +202,111 @@ export interface ${this.capitalizeFirst(feature.name)}Data {
|
|
199
202
|
console.log(chalk_1.default.yellow(`Would install: ${dependencies.join(', ')}`));
|
200
203
|
console.log(chalk_1.default.gray('Run: npm install ' + dependencies.join(' ') + ' to install dependencies'));
|
201
204
|
}
|
205
|
+
async updateMainConfiguration(projectPath, feature) {
|
206
|
+
console.log(chalk_1.default.blue(`📝 Updating main configuration for ${feature.name} feature...`));
|
207
|
+
// Update main server file to include the feature
|
208
|
+
await this.updateServerFile(projectPath, feature);
|
209
|
+
// Update routes index to include feature routes
|
210
|
+
await this.updateRoutesIndex(projectPath, feature);
|
211
|
+
// Update package.json scripts if needed
|
212
|
+
await this.updatePackageJson(projectPath, feature);
|
213
|
+
console.log(chalk_1.default.green(`✅ Main configuration updated for ${feature.name} feature`));
|
214
|
+
}
|
215
|
+
async updateServerFile(projectPath, feature) {
|
216
|
+
const serverFiles = [
|
217
|
+
'src/server/index.ts',
|
218
|
+
'main.ts',
|
219
|
+
'src/index.ts',
|
220
|
+
'lib/main.js'
|
221
|
+
];
|
222
|
+
for (const serverFile of serverFiles) {
|
223
|
+
const filePath = path.join(projectPath, serverFile);
|
224
|
+
if (await fs.pathExists(filePath)) {
|
225
|
+
let content = await fs.readFile(filePath, 'utf8');
|
226
|
+
// Add import for the feature
|
227
|
+
const importStatement = `import { ${this.capitalizeFirst(feature.name)}Feature } from './features/${feature.name}/${feature.name}';`;
|
228
|
+
if (!content.includes(importStatement)) {
|
229
|
+
// Find the last import statement and add after it
|
230
|
+
const importRegex = /import.*from.*['"];?\s*$/gm;
|
231
|
+
const matches = [...content.matchAll(importRegex)];
|
232
|
+
if (matches.length > 0) {
|
233
|
+
const lastImport = matches[matches.length - 1];
|
234
|
+
const insertIndex = lastImport.index + lastImport[0].length;
|
235
|
+
content = content.slice(0, insertIndex) + '\n' + importStatement + content.slice(insertIndex);
|
236
|
+
}
|
237
|
+
}
|
238
|
+
// Add feature initialization
|
239
|
+
const featureInit = `// Initialize ${feature.name} feature
|
240
|
+
const ${feature.name}Feature = new ${this.capitalizeFirst(feature.name)}Feature();
|
241
|
+
app.use('/api/${feature.name}', ${feature.name}Feature.getRouter());`;
|
242
|
+
if (!content.includes(featureInit)) {
|
243
|
+
// Find where routes are registered and add after
|
244
|
+
const routeRegex = /app\.use\(.*\);?\s*$/gm;
|
245
|
+
const matches = [...content.matchAll(routeRegex)];
|
246
|
+
if (matches.length > 0) {
|
247
|
+
const lastRoute = matches[matches.length - 1];
|
248
|
+
const insertIndex = lastRoute.index + lastRoute[0].length;
|
249
|
+
content = content.slice(0, insertIndex) + '\n' + featureInit + content.slice(insertIndex);
|
250
|
+
}
|
251
|
+
}
|
252
|
+
await fs.writeFile(filePath, content);
|
253
|
+
console.log(chalk_1.default.green(` ✅ Updated ${serverFile}`));
|
254
|
+
break; // Only update the first found server file
|
255
|
+
}
|
256
|
+
}
|
257
|
+
}
|
258
|
+
async updateRoutesIndex(projectPath, feature) {
|
259
|
+
const routesIndexPath = path.join(projectPath, 'src/routes/index.ts');
|
260
|
+
if (await fs.pathExists(routesIndexPath)) {
|
261
|
+
let content = await fs.readFile(routesIndexPath, 'utf8');
|
262
|
+
// Add import for feature routes
|
263
|
+
const importStatement = `import ${feature.name}Routes from '../features/${feature.name}/routes';`;
|
264
|
+
if (!content.includes(importStatement)) {
|
265
|
+
const importRegex = /import.*from.*['"];?\s*$/gm;
|
266
|
+
const matches = [...content.matchAll(importRegex)];
|
267
|
+
if (matches.length > 0) {
|
268
|
+
const lastImport = matches[matches.length - 1];
|
269
|
+
const insertIndex = lastImport.index + lastImport[0].length;
|
270
|
+
content = content.slice(0, insertIndex) + '\n' + importStatement + content.slice(insertIndex);
|
271
|
+
}
|
272
|
+
}
|
273
|
+
// Add route registration
|
274
|
+
const routeRegistration = `app.use('/api/${feature.name}', ${feature.name}Routes);`;
|
275
|
+
if (!content.includes(routeRegistration)) {
|
276
|
+
const routeRegex = /app\.use\(.*\);?\s*$/gm;
|
277
|
+
const matches = [...content.matchAll(routeRegex)];
|
278
|
+
if (matches.length > 0) {
|
279
|
+
const lastRoute = matches[matches.length - 1];
|
280
|
+
const insertIndex = lastRoute.index + lastRoute[0].length;
|
281
|
+
content = content.slice(0, insertIndex) + '\n' + routeRegistration + content.slice(insertIndex);
|
282
|
+
}
|
283
|
+
}
|
284
|
+
await fs.writeFile(routesIndexPath, content);
|
285
|
+
console.log(chalk_1.default.green(` ✅ Updated routes/index.ts`));
|
286
|
+
}
|
287
|
+
}
|
288
|
+
async updatePackageJson(projectPath, feature) {
|
289
|
+
const packageJsonPath = path.join(projectPath, 'package.json');
|
290
|
+
if (await fs.pathExists(packageJsonPath)) {
|
291
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'));
|
292
|
+
// Add feature-specific scripts if needed
|
293
|
+
if (!packageJson.scripts) {
|
294
|
+
packageJson.scripts = {};
|
295
|
+
}
|
296
|
+
// Add feature-specific scripts
|
297
|
+
const featureScripts = {
|
298
|
+
[`test:${feature.name}`]: `npm test -- --grep "${feature.name}"`,
|
299
|
+
[`build:${feature.name}`]: `npm run build && echo "Built with ${feature.name} feature"`
|
300
|
+
};
|
301
|
+
for (const [scriptName, scriptCommand] of Object.entries(featureScripts)) {
|
302
|
+
if (!packageJson.scripts[scriptName]) {
|
303
|
+
packageJson.scripts[scriptName] = scriptCommand;
|
304
|
+
}
|
305
|
+
}
|
306
|
+
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
307
|
+
console.log(chalk_1.default.green(` ✅ Updated package.json with ${feature.name} scripts`));
|
308
|
+
}
|
309
|
+
}
|
202
310
|
capitalizeFirst(str) {
|
203
311
|
return str.charAt(0).toUpperCase() + str.slice(1);
|
204
312
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"project-extender.js","sourceRoot":"","sources":["../../src/services/project-extender.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAC/B,2CAA6B;AAC7B,kDAA0B;AAS1B,MAAa,eAAe;IAA5B;QACU,aAAQ,GAAc;YAC5B;gBACE,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,gCAAgC;gBAC7C,KAAK,EAAE,CAAC,wBAAwB,CAAC;gBACjC,YAAY,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC;aAC3C;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,2BAA2B;gBACxC,KAAK,EAAE,CAAC,yBAAyB,CAAC;gBAClC,YAAY,EAAE,CAAC,YAAY,EAAE,YAAY,CAAC;aAC3C;YACD;gBACE,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,mCAAmC;gBAChD,KAAK,EAAE,CAAC,0BAA0B,CAAC;gBACnC,YAAY,EAAE,CAAC,WAAW,CAAC;aAC5B;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,WAAW,EAAE,uBAAuB;gBACpC,KAAK,EAAE,CAAC,wBAAwB,CAAC;gBACjC,YAAY,EAAE,CAAC,WAAW,CAAC;aAC5B;YACD;gBACE,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,sBAAsB;gBACnC,KAAK,EAAE,CAAC,yBAAyB,CAAC;aACnC;SACF,CAAC;
|
1
|
+
{"version":3,"file":"project-extender.js","sourceRoot":"","sources":["../../src/services/project-extender.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -79,7 +79,11 @@ export class ProjectExtender {
|
|
79
79
|
await this.addDependencies(feature.dependencies);
|
80
80
|
}
|
81
81
|
|
82
|
+
// Update main configuration to use the extended feature
|
83
|
+
await this.updateMainConfiguration(projectPath, feature);
|
84
|
+
|
82
85
|
console.log(chalk.green(`✅ Feature '${featureName}' added successfully!`));
|
86
|
+
console.log(chalk.blue(`📝 Main configuration updated to include ${featureName} feature`));
|
83
87
|
}
|
84
88
|
|
85
89
|
private async createFeatureStructure(projectPath: string, feature: Feature): Promise<void> {
|
@@ -190,6 +194,136 @@ export interface ${this.capitalizeFirst(feature.name)}Data {
|
|
190
194
|
console.log(chalk.gray('Run: npm install ' + dependencies.join(' ') + ' to install dependencies'));
|
191
195
|
}
|
192
196
|
|
197
|
+
private async updateMainConfiguration(projectPath: string, feature: Feature): Promise<void> {
|
198
|
+
console.log(chalk.blue(`📝 Updating main configuration for ${feature.name} feature...`));
|
199
|
+
|
200
|
+
// Update main server file to include the feature
|
201
|
+
await this.updateServerFile(projectPath, feature);
|
202
|
+
|
203
|
+
// Update routes index to include feature routes
|
204
|
+
await this.updateRoutesIndex(projectPath, feature);
|
205
|
+
|
206
|
+
// Update package.json scripts if needed
|
207
|
+
await this.updatePackageJson(projectPath, feature);
|
208
|
+
|
209
|
+
console.log(chalk.green(`✅ Main configuration updated for ${feature.name} feature`));
|
210
|
+
}
|
211
|
+
|
212
|
+
private async updateServerFile(projectPath: string, feature: Feature): Promise<void> {
|
213
|
+
const serverFiles = [
|
214
|
+
'src/server/index.ts',
|
215
|
+
'main.ts',
|
216
|
+
'src/index.ts',
|
217
|
+
'lib/main.js'
|
218
|
+
];
|
219
|
+
|
220
|
+
for (const serverFile of serverFiles) {
|
221
|
+
const filePath = path.join(projectPath, serverFile);
|
222
|
+
if (await fs.pathExists(filePath)) {
|
223
|
+
let content = await fs.readFile(filePath, 'utf8');
|
224
|
+
|
225
|
+
// Add import for the feature
|
226
|
+
const importStatement = `import { ${this.capitalizeFirst(feature.name)}Feature } from './features/${feature.name}/${feature.name}';`;
|
227
|
+
|
228
|
+
if (!content.includes(importStatement)) {
|
229
|
+
// Find the last import statement and add after it
|
230
|
+
const importRegex = /import.*from.*['"];?\s*$/gm;
|
231
|
+
const matches = [...content.matchAll(importRegex)];
|
232
|
+
if (matches.length > 0) {
|
233
|
+
const lastImport = matches[matches.length - 1];
|
234
|
+
const insertIndex = lastImport.index! + lastImport[0].length;
|
235
|
+
content = content.slice(0, insertIndex) + '\n' + importStatement + content.slice(insertIndex);
|
236
|
+
}
|
237
|
+
}
|
238
|
+
|
239
|
+
// Add feature initialization
|
240
|
+
const featureInit = `// Initialize ${feature.name} feature
|
241
|
+
const ${feature.name}Feature = new ${this.capitalizeFirst(feature.name)}Feature();
|
242
|
+
app.use('/api/${feature.name}', ${feature.name}Feature.getRouter());`;
|
243
|
+
|
244
|
+
if (!content.includes(featureInit)) {
|
245
|
+
// Find where routes are registered and add after
|
246
|
+
const routeRegex = /app\.use\(.*\);?\s*$/gm;
|
247
|
+
const matches = [...content.matchAll(routeRegex)];
|
248
|
+
if (matches.length > 0) {
|
249
|
+
const lastRoute = matches[matches.length - 1];
|
250
|
+
const insertIndex = lastRoute.index! + lastRoute[0].length;
|
251
|
+
content = content.slice(0, insertIndex) + '\n' + featureInit + content.slice(insertIndex);
|
252
|
+
}
|
253
|
+
}
|
254
|
+
|
255
|
+
await fs.writeFile(filePath, content);
|
256
|
+
console.log(chalk.green(` ✅ Updated ${serverFile}`));
|
257
|
+
break; // Only update the first found server file
|
258
|
+
}
|
259
|
+
}
|
260
|
+
}
|
261
|
+
|
262
|
+
private async updateRoutesIndex(projectPath: string, feature: Feature): Promise<void> {
|
263
|
+
const routesIndexPath = path.join(projectPath, 'src/routes/index.ts');
|
264
|
+
|
265
|
+
if (await fs.pathExists(routesIndexPath)) {
|
266
|
+
let content = await fs.readFile(routesIndexPath, 'utf8');
|
267
|
+
|
268
|
+
// Add import for feature routes
|
269
|
+
const importStatement = `import ${feature.name}Routes from '../features/${feature.name}/routes';`;
|
270
|
+
|
271
|
+
if (!content.includes(importStatement)) {
|
272
|
+
const importRegex = /import.*from.*['"];?\s*$/gm;
|
273
|
+
const matches = [...content.matchAll(importRegex)];
|
274
|
+
if (matches.length > 0) {
|
275
|
+
const lastImport = matches[matches.length - 1];
|
276
|
+
const insertIndex = lastImport.index! + lastImport[0].length;
|
277
|
+
content = content.slice(0, insertIndex) + '\n' + importStatement + content.slice(insertIndex);
|
278
|
+
}
|
279
|
+
}
|
280
|
+
|
281
|
+
// Add route registration
|
282
|
+
const routeRegistration = `app.use('/api/${feature.name}', ${feature.name}Routes);`;
|
283
|
+
|
284
|
+
if (!content.includes(routeRegistration)) {
|
285
|
+
const routeRegex = /app\.use\(.*\);?\s*$/gm;
|
286
|
+
const matches = [...content.matchAll(routeRegex)];
|
287
|
+
if (matches.length > 0) {
|
288
|
+
const lastRoute = matches[matches.length - 1];
|
289
|
+
const insertIndex = lastRoute.index! + lastRoute[0].length;
|
290
|
+
content = content.slice(0, insertIndex) + '\n' + routeRegistration + content.slice(insertIndex);
|
291
|
+
}
|
292
|
+
}
|
293
|
+
|
294
|
+
await fs.writeFile(routesIndexPath, content);
|
295
|
+
console.log(chalk.green(` ✅ Updated routes/index.ts`));
|
296
|
+
}
|
297
|
+
}
|
298
|
+
|
299
|
+
private async updatePackageJson(projectPath: string, feature: Feature): Promise<void> {
|
300
|
+
const packageJsonPath = path.join(projectPath, 'package.json');
|
301
|
+
|
302
|
+
if (await fs.pathExists(packageJsonPath)) {
|
303
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'));
|
304
|
+
|
305
|
+
// Add feature-specific scripts if needed
|
306
|
+
if (!packageJson.scripts) {
|
307
|
+
packageJson.scripts = {};
|
308
|
+
}
|
309
|
+
|
310
|
+
// Add feature-specific scripts
|
311
|
+
const featureScripts = {
|
312
|
+
[`test:${feature.name}`]: `npm test -- --grep "${feature.name}"`,
|
313
|
+
[`build:${feature.name}`]: `npm run build && echo "Built with ${feature.name} feature"`
|
314
|
+
};
|
315
|
+
|
316
|
+
for (const [scriptName, scriptCommand] of Object.entries(featureScripts)) {
|
317
|
+
if (!packageJson.scripts[scriptName]) {
|
318
|
+
packageJson.scripts[scriptName] = scriptCommand;
|
319
|
+
}
|
320
|
+
}
|
321
|
+
|
322
|
+
await fs.writeFile(packageJsonPath, JSON.stringify(packageJson, null, 2));
|
323
|
+
console.log(chalk.green(` ✅ Updated package.json with ${feature.name} scripts`));
|
324
|
+
}
|
325
|
+
}
|
326
|
+
|
193
327
|
private capitalizeFirst(str: string): string {
|
194
328
|
return str.charAt(0).toUpperCase() + str.slice(1);
|
195
329
|
}
|