@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;YA0BtC,sBAAsB;YAmGtB,eAAe;IAS7B,OAAO,CAAC,eAAe;CAGxB"}
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":"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"}
1
+ {"version":3,"file":"project-extender.js","sourceRoot":"","sources":["../../src/services/project-extender.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diagramers/cli",
3
- "version": "1.0.19",
3
+ "version": "1.0.20",
4
4
  "description": "Diagramers CLI - Command-line tools for managing Diagramers projects",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -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
  }