nestcraftx 0.2.5 → 0.2.6

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 (40) hide show
  1. package/CLI_USAGE.fr.md +331 -331
  2. package/CLI_USAGE.md +364 -364
  3. package/LICENSE +21 -21
  4. package/bin/nestcraft.js +84 -64
  5. package/commands/demo.js +333 -330
  6. package/commands/generate.js +93 -0
  7. package/commands/generateConf.js +91 -0
  8. package/commands/info.js +48 -48
  9. package/commands/new.js +338 -335
  10. package/commands/start.js +19 -19
  11. package/commands/test.js +7 -7
  12. package/package.json +1 -1
  13. package/utils/cliParser.js +133 -76
  14. package/utils/colors.js +62 -62
  15. package/utils/configs/configureDocker.js +120 -120
  16. package/utils/configs/setupCleanArchitecture.js +15 -13
  17. package/utils/configs/setupLightArchitecture.js +15 -9
  18. package/utils/file-utils/saveProjectConfig.js +36 -0
  19. package/utils/fullModeInput.js +607 -607
  20. package/utils/generators/application/dtoUpdater.js +54 -0
  21. package/utils/generators/cleanModuleGenerator.js +475 -0
  22. package/utils/generators/database/setupDatabase.js +31 -0
  23. package/utils/generators/domain/entityUpdater.js +78 -0
  24. package/utils/generators/infrastructure/mapperUpdater.js +65 -0
  25. package/utils/generators/lightModuleGenerator.js +131 -0
  26. package/utils/generators/relation/relation.engine.js +64 -0
  27. package/utils/interactive/askEntityInputs.js +165 -0
  28. package/utils/loggers/logError.js +7 -7
  29. package/utils/loggers/logInfo.js +7 -7
  30. package/utils/loggers/logSuccess.js +7 -7
  31. package/utils/loggers/logWarning.js +7 -7
  32. package/utils/setups/orms/typeOrmSetup.js +630 -630
  33. package/utils/setups/setupAuth.js +28 -15
  34. package/utils/setups/setupDatabase.js +75 -75
  35. package/utils/setups/setupPrisma.js +802 -630
  36. package/utils/shell.js +32 -32
  37. package/utils/spinner.js +57 -57
  38. package/utils/systemCheck.js +124 -124
  39. package/utils/userInput.js +421 -421
  40. package/utils/utils.js +27 -27
package/commands/demo.js CHANGED
@@ -1,330 +1,333 @@
1
- const inquirer = require("inquirer");
2
- const { logInfo } = require("../utils/loggers/logInfo");
3
- const { logSuccess } = require("../utils/loggers/logSuccess");
4
- const { createProject } = require("../utils/setups/projectSetup");
5
- const {
6
- setupCleanArchitecture,
7
- } = require("../utils/configs/setupCleanArchitecture");
8
- const {
9
- setupLightArchitecture,
10
- } = require("../utils/configs/setupLightArchitecture");
11
- const { setupAuth } = require("../utils/setups/setupAuth");
12
- const { setupSwagger } = require("../utils/setups/setupSwagger");
13
- const { setupDatabase } = require("../utils/setups/setupDatabase");
14
- const { configureDocker } = require("../utils/configs/configureDocker");
15
- const { generateEnvFile, writeEnvFile } = require("../utils/envGenerator");
16
- const { setupBootstrapLogger } = require("../utils/setups/setupLogger");
17
- const actualInquirer = inquirer.default || inquirer;
18
-
19
- async function demoCommand(flags = {}) {
20
- console.log("\n🎯 Generating demonstration project...\n");
21
- logInfo('Configuring "blog-demo" project');
22
-
23
- // Prépare les questions à poser uniquement si le flag n'est pas passé
24
- const questions = [];
25
- if (flags.light === undefined) {
26
- questions.push({
27
- type: "confirm",
28
- name: "light",
29
- message: "LIGHT Mode (Simplified MVP)?",
30
- default: false,
31
- });
32
- }
33
- if (flags.docker === undefined) {
34
- questions.push({
35
- type: "confirm",
36
- name: "docker",
37
- message: "Enable Docker?",
38
- default: true,
39
- });
40
- }
41
- if (flags.auth === undefined) {
42
- questions.push({
43
- type: "confirm",
44
- name: "auth",
45
- message: "Enable JWT Auth?",
46
- default: true,
47
- });
48
- }
49
- if (flags.swagger === undefined) {
50
- questions.push({
51
- type: "confirm",
52
- name: "swagger",
53
- message: "Enable Swagger UI?",
54
- default: true,
55
- });
56
- }
57
- if (flags.orm === undefined) {
58
- questions.push({
59
- type: "list",
60
- name: "orm",
61
- message: "Choose ORM / Database?",
62
- choices: [
63
- { name: "Prisma (PostgreSQL)", value: "prisma" },
64
- { name: "TypeORM (PostgreSQL)", value: "typeorm" },
65
- { name: "Mongoose (MongoDB)", value: "mongoose" },
66
- ],
67
- default: "prisma",
68
- });
69
- }
70
-
71
- if (flags.packageManager === undefined) {
72
- questions.push({
73
- type: "list",
74
- name: "packageManager",
75
- message: "Choose the package manager for the project?",
76
- choices: [
77
- { name: "npm", value: "npm" },
78
- { name: "yarn", value: "yarn" },
79
- { name: "pnpm", value: "pnpm" },
80
- ],
81
- default: "npm",
82
- });
83
- }
84
-
85
- // Pose uniquement les questions nécessaires
86
- const answers =
87
- questions.length > 0 ? await actualInquirer.prompt(questions) : {};
88
-
89
- // Fusionne les réponses interactives et les flags (flags prioritaire)
90
- const options = { ...answers, ...flags };
91
- const packageManager = options.packageManager || "npm";
92
- const isLight = !!options.light;
93
- const useDocker = !!options.docker;
94
- const useAuth = !!options.auth;
95
- const useSwagger = !!options.swagger;
96
- const orm = options.orm || "prisma";
97
-
98
- let selectedDB = "postgresql";
99
- let dbConfig = {};
100
-
101
- if (orm === "prisma") {
102
- selectedDB = "postgresql";
103
- dbConfig = {
104
- orm: "prisma",
105
- POSTGRES_USER: "postgres",
106
- POSTGRES_PASSWORD: "postgres",
107
- POSTGRES_DB: "blog_demo",
108
- POSTGRES_HOST: "localhost",
109
- POSTGRES_PORT: "5432",
110
- };
111
- } else if (orm === "typeorm") {
112
- selectedDB = "postgresql";
113
- dbConfig = {
114
- orm: "typeorm",
115
- POSTGRES_USER: "postgres",
116
- POSTGRES_PASSWORD: "postgres",
117
- POSTGRES_DB: "blog_demo",
118
- POSTGRES_HOST: "localhost",
119
- POSTGRES_PORT: "5432",
120
- };
121
- } else if (orm === "mongoose") {
122
- selectedDB = "mongodb";
123
- dbConfig = {
124
- orm: "mongoose",
125
- MONGO_URI: "mongodb://localhost:27017/blog_demo",
126
- MONGO_DB: "blog_demo",
127
- MONGO_HOST: "localhost",
128
- MONGO_PORT: "27017",
129
- };
130
- }
131
-
132
- let entitiesData = { entities: [], relations: [] };
133
-
134
- entitiesData = {
135
- entities: [
136
- {
137
- name: "user",
138
- fields: [
139
- { name: "email", type: "string" },
140
- { name: "password", type: "string" },
141
- { name: "username", type: "string" },
142
- { name: "role", type: "Role" },
143
- { name: "isActive", type: "boolean" },
144
- ],
145
- },
146
- {
147
- name: "post",
148
- fields: [
149
- { name: "title", type: "string" },
150
- { name: "content", type: "string" },
151
- { name: "published", type: "boolean" },
152
- { name: "userId", type: "string" },
153
- ],
154
- },
155
- {
156
- name: "comment",
157
- fields: [
158
- { name: "content", type: "string" },
159
- { name: "postId", type: "string" },
160
- { name: "userId", type: "string" },
161
- ],
162
- },
163
- ],
164
- relations: [
165
- { from: "user", to: "post", type: "1-n" },
166
- { from: "post", to: "comment", type: "1-n" },
167
- { from: "user", to: "comment", type: "1-n" },
168
- ],
169
- };
170
-
171
- if (useAuth) {
172
- // 1. Entité Session
173
- entitiesData.entities.push({
174
- name: "session",
175
- fields: [
176
- { name: "refreshToken", type: "string" },
177
- { name: "userId", type: "string" },
178
- { name: "expiresAt", type: "Date" },
179
- { name: "createdAt", type: "Date", default: "now" },
180
- ],
181
- });
182
-
183
- // 3. relation user & session
184
- entitiesData.relations.push({
185
- from: "user",
186
- to: "session",
187
- type: "1-n",
188
- });
189
- }
190
-
191
- const demoInputs = {
192
- projectName: "blog-demo",
193
- useDocker,
194
- useAuth,
195
- useSwagger,
196
- swaggerInputs: {
197
- title: "Blog Demo API",
198
- description:
199
- "Demonstration API created with NestCraftX - Blog management with users and posts",
200
- version: "1.0.0",
201
- endpoint: "api/docs",
202
- },
203
- packageManager: packageManager,
204
- mode: isLight ? "light" : "full",
205
- isDemo: true,
206
- entitiesData: entitiesData,
207
- selectedDB,
208
- dbConfig,
209
- };
210
-
211
- await createProject(demoInputs);
212
-
213
- if (isLight) {
214
- await setupLightArchitecture(demoInputs);
215
- } else {
216
- await setupCleanArchitecture(demoInputs);
217
- }
218
-
219
- if (useAuth) {
220
- await setupAuth(demoInputs);
221
- }
222
-
223
- if (useSwagger) {
224
- await setupSwagger(demoInputs.swaggerInputs);
225
- } else {
226
- await setupBootstrapLogger();
227
- }
228
-
229
- if (useDocker) {
230
- await configureDocker(demoInputs);
231
- }
232
-
233
- await setupDatabase(demoInputs);
234
-
235
- const envContent = await generateEnvFile(demoInputs);
236
- writeEnvFile(envContent);
237
-
238
- console.log("\n" + "=".repeat(60));
239
- logSuccess("Demonstration project created successfully!");
240
- console.log("=".repeat(60));
241
-
242
- console.log('\nProject "blog-demo" configured with:');
243
- console.log(" ✅ 3 Entities: User, Post, Comment");
244
- console.log(" ✅ Entity Relationships");
245
- if (useAuth) console.log(" Integrated JWT Auth");
246
- if (useSwagger) console.log(" ✅ Swagger UI enabled");
247
- if (useDocker) console.log(" ✅ Docker & Docker Compose");
248
- console.log(
249
- orm === "prisma"
250
- ? " ✅ Prisma ORM (PostgreSQL) configured"
251
- : orm === "typeorm"
252
- ? " ✅ TypeORM (PostgreSQL) configured"
253
- : " ✅ Mongoose (MongoDB) configured"
254
- );
255
- console.log(
256
- isLight
257
- ? " ✅ LIGHT Structure (Simplified MVP)"
258
- : " ✅ Complete Clean Architecture"
259
- );
260
-
261
- console.log("\n🚀 To get started:");
262
- console.log(" 1- cd blog-demo");
263
-
264
- // Instructions spécifiques selon le moteur choisi
265
- const pm = demoInputs.packageManager;
266
- const run = pm === "yarn" ? "" : "run "; // yarn n'a pas besoin de 'run'
267
- if (orm === "prisma" || orm === "typeorm") {
268
- console.log(
269
- "\n 2- Create a PostgreSQL database with the name specified in the .env (default 'blog_demo')."
270
- );
271
- console.log(" Example (psql) : createdb blog_demo");
272
- console.log(
273
- "\n 3- Open the generated .env file and replace the values with your actual connection details:"
274
- );
275
- console.log(" POSTGRES_USER=<your_user>");
276
- console.log(" POSTGRES_PASSWORD=<your_password>");
277
- console.log(" POSTGRES_DB=blog_demo");
278
- console.log(" POSTGRES_HOST=localhost");
279
- console.log(" POSTGRES_PORT=5432");
280
- console.log("\n 4- Run migrations and seeds:");
281
- if (orm === "prisma") {
282
- console.log(` npx prisma migrate reset`);
283
- console.log(` npx prisma migrate dev`);
284
- console.log(` npx prisma db seed`);
285
- } else {
286
- console.log(` ${pm} ${run}typeorm:migration:run`);
287
- console.log(` ${pm} ${run}typeorm:seed`);
288
- }
289
- } else if (orm === "mongoose") {
290
- console.log("\n 2- MongoDB: You can use either a local server or Docker.");
291
- console.log(
292
- " By default, the project uses: MONGO_URI=mongodb://localhost:27017/blog_demo"
293
- );
294
- console.log(
295
- " The database will be created automatically upon first write operation."
296
- );
297
- console.log(
298
- "\n 3- Open the generated .env file and replace the MONGO_URI variable if necessary:"
299
- );
300
- console.log(
301
- " MONGO_URI=mongodb://<user>:<password>@localhost:27017/blog_demo"
302
- );
303
- console.log("\n 4- Run the seed script (if present):");
304
- console.log(` ${pm} ${run}seed`);
305
- }
306
-
307
- console.log("\n 5- Run the project:");
308
- console.log(` ${demoInputs.packageManager} run start:dev`);
309
- if (useSwagger)
310
- console.log(" 6- Open Swagger UI : http://localhost:3000/api/docs");
311
-
312
- console.log("\n📚 Main Endpoints:");
313
- if (useAuth) {
314
- console.log(" • /auth/register → Create an account");
315
- console.log(" /auth/login → Log in");
316
- }
317
- console.log(" • /users Manage users");
318
- console.log(" • /posts Manage posts");
319
- console.log(" • /comments → Manage comments");
320
-
321
- console.log("\n💡 Tip:");
322
- console.log(
323
- " Modify the .env file to connect your own database (Postgres or Mongo)."
324
- );
325
- console.log(
326
- " Once configured and migrated/seeded, the project is ready to run immediately! 🚀\n"
327
- );
328
- }
329
-
330
- module.exports = demoCommand;
1
+ const inquirer = require("inquirer");
2
+ const { logInfo } = require("../utils/loggers/logInfo");
3
+ const { logSuccess } = require("../utils/loggers/logSuccess");
4
+ const { createProject } = require("../utils/setups/projectSetup");
5
+ const {
6
+ setupCleanArchitecture,
7
+ } = require("../utils/configs/setupCleanArchitecture");
8
+ const {
9
+ setupLightArchitecture,
10
+ } = require("../utils/configs/setupLightArchitecture");
11
+ const { setupAuth } = require("../utils/setups/setupAuth");
12
+ const { setupSwagger } = require("../utils/setups/setupSwagger");
13
+ const { setupDatabase } = require("../utils/setups/setupDatabase");
14
+ const { configureDocker } = require("../utils/configs/configureDocker");
15
+ const { generateEnvFile, writeEnvFile } = require("../utils/envGenerator");
16
+ const { setupBootstrapLogger } = require("../utils/setups/setupLogger");
17
+ const { saveProjectConfig } = require("../utils/file-utils/saveProjectConfig");
18
+ const actualInquirer = inquirer.default || inquirer;
19
+
20
+ async function demoCommand(flags = {}) {
21
+ console.log("\n🎯 Generating demonstration project...\n");
22
+ logInfo('Configuring "blog-demo" project');
23
+
24
+ // Prépare les questions à poser uniquement si le flag n'est pas passé
25
+ const questions = [];
26
+ if (flags.light === undefined) {
27
+ questions.push({
28
+ type: "confirm",
29
+ name: "light",
30
+ message: "LIGHT Mode (Simplified MVP)?",
31
+ default: false,
32
+ });
33
+ }
34
+ if (flags.docker === undefined) {
35
+ questions.push({
36
+ type: "confirm",
37
+ name: "docker",
38
+ message: "Enable Docker?",
39
+ default: true,
40
+ });
41
+ }
42
+ if (flags.auth === undefined) {
43
+ questions.push({
44
+ type: "confirm",
45
+ name: "auth",
46
+ message: "Enable JWT Auth?",
47
+ default: true,
48
+ });
49
+ }
50
+ if (flags.swagger === undefined) {
51
+ questions.push({
52
+ type: "confirm",
53
+ name: "swagger",
54
+ message: "Enable Swagger UI?",
55
+ default: true,
56
+ });
57
+ }
58
+ if (flags.orm === undefined) {
59
+ questions.push({
60
+ type: "list",
61
+ name: "orm",
62
+ message: "Choose ORM / Database?",
63
+ choices: [
64
+ { name: "Prisma (PostgreSQL)", value: "prisma" },
65
+ { name: "TypeORM (PostgreSQL)", value: "typeorm" },
66
+ { name: "Mongoose (MongoDB)", value: "mongoose" },
67
+ ],
68
+ default: "prisma",
69
+ });
70
+ }
71
+
72
+ if (flags.packageManager === undefined) {
73
+ questions.push({
74
+ type: "list",
75
+ name: "packageManager",
76
+ message: "Choose the package manager for the project?",
77
+ choices: [
78
+ { name: "npm", value: "npm" },
79
+ { name: "yarn", value: "yarn" },
80
+ { name: "pnpm", value: "pnpm" },
81
+ ],
82
+ default: "npm",
83
+ });
84
+ }
85
+
86
+ // Pose uniquement les questions nécessaires
87
+ const answers =
88
+ questions.length > 0 ? await actualInquirer.prompt(questions) : {};
89
+
90
+ // Fusionne les réponses interactives et les flags (flags prioritaire)
91
+ const options = { ...answers, ...flags };
92
+ const packageManager = options.packageManager || "npm";
93
+ const isLight = !!options.light;
94
+ const useDocker = !!options.docker;
95
+ const useAuth = !!options.auth;
96
+ const useSwagger = !!options.swagger;
97
+ const orm = options.orm || "prisma";
98
+
99
+ let selectedDB = "postgresql";
100
+ let dbConfig = {};
101
+
102
+ if (orm === "prisma") {
103
+ selectedDB = "postgresql";
104
+ dbConfig = {
105
+ orm: "prisma",
106
+ POSTGRES_USER: "postgres",
107
+ POSTGRES_PASSWORD: "postgres",
108
+ POSTGRES_DB: "blog_demo",
109
+ POSTGRES_HOST: "localhost",
110
+ POSTGRES_PORT: "5432",
111
+ };
112
+ } else if (orm === "typeorm") {
113
+ selectedDB = "postgresql";
114
+ dbConfig = {
115
+ orm: "typeorm",
116
+ POSTGRES_USER: "postgres",
117
+ POSTGRES_PASSWORD: "postgres",
118
+ POSTGRES_DB: "blog_demo",
119
+ POSTGRES_HOST: "localhost",
120
+ POSTGRES_PORT: "5432",
121
+ };
122
+ } else if (orm === "mongoose") {
123
+ selectedDB = "mongodb";
124
+ dbConfig = {
125
+ orm: "mongoose",
126
+ MONGO_URI: "mongodb://localhost:27017/blog_demo",
127
+ MONGO_DB: "blog_demo",
128
+ MONGO_HOST: "localhost",
129
+ MONGO_PORT: "27017",
130
+ };
131
+ }
132
+
133
+ let entitiesData = { entities: [], relations: [] };
134
+
135
+ entitiesData = {
136
+ entities: [
137
+ {
138
+ name: "user",
139
+ fields: [
140
+ { name: "email", type: "string" },
141
+ { name: "password", type: "string" },
142
+ { name: "username", type: "string" },
143
+ { name: "role", type: "Role" },
144
+ { name: "isActive", type: "boolean" },
145
+ ],
146
+ },
147
+ {
148
+ name: "post",
149
+ fields: [
150
+ { name: "title", type: "string" },
151
+ { name: "content", type: "string" },
152
+ { name: "published", type: "boolean" },
153
+ { name: "userId", type: "string" },
154
+ ],
155
+ },
156
+ {
157
+ name: "comment",
158
+ fields: [
159
+ { name: "content", type: "string" },
160
+ { name: "postId", type: "string" },
161
+ { name: "userId", type: "string" },
162
+ ],
163
+ },
164
+ ],
165
+ relations: [
166
+ { from: "user", to: "post", type: "1-n" },
167
+ { from: "post", to: "comment", type: "1-n" },
168
+ { from: "user", to: "comment", type: "1-n" },
169
+ ],
170
+ };
171
+
172
+ if (useAuth) {
173
+ // 1. Entité Session
174
+ entitiesData.entities.push({
175
+ name: "session",
176
+ fields: [
177
+ { name: "refreshToken", type: "string" },
178
+ { name: "userId", type: "string" },
179
+ { name: "expiresAt", type: "Date" },
180
+ { name: "createdAt", type: "Date", default: "now" },
181
+ ],
182
+ });
183
+
184
+ // 3. relation user & session
185
+ entitiesData.relations.push({
186
+ from: "user",
187
+ to: "session",
188
+ type: "1-n",
189
+ });
190
+ }
191
+
192
+ const demoInputs = {
193
+ projectName: "blog-demo",
194
+ useDocker,
195
+ useAuth,
196
+ useSwagger,
197
+ swaggerInputs: {
198
+ title: "Blog Demo API",
199
+ description:
200
+ "Demonstration API created with NestCraftX - Blog management with users and posts",
201
+ version: "1.0.0",
202
+ endpoint: "api/docs",
203
+ },
204
+ packageManager: packageManager,
205
+ mode: isLight ? "light" : "full",
206
+ isDemo: true,
207
+ entitiesData: entitiesData,
208
+ selectedDB,
209
+ dbConfig,
210
+ };
211
+
212
+ await createProject(demoInputs);
213
+
214
+ if (isLight) {
215
+ await setupLightArchitecture(demoInputs);
216
+ } else {
217
+ await setupCleanArchitecture(demoInputs);
218
+ }
219
+
220
+ if (useAuth) {
221
+ await setupAuth(demoInputs);
222
+ }
223
+
224
+ if (useSwagger) {
225
+ await setupSwagger(demoInputs.swaggerInputs);
226
+ } else {
227
+ await setupBootstrapLogger();
228
+ }
229
+
230
+ if (useDocker) {
231
+ await configureDocker(demoInputs);
232
+ }
233
+
234
+ await setupDatabase(demoInputs);
235
+
236
+ const envContent = await generateEnvFile(demoInputs);
237
+ writeEnvFile(envContent);
238
+
239
+ await saveProjectConfig(demoInputs);
240
+
241
+ console.log("\n" + "=".repeat(60));
242
+ logSuccess("Demonstration project created successfully!");
243
+ console.log("=".repeat(60));
244
+
245
+ console.log('\nProject "blog-demo" configured with:');
246
+ console.log(" ✅ 3 Entities: User, Post, Comment");
247
+ console.log(" ✅ Entity Relationships");
248
+ if (useAuth) console.log(" ✅ Integrated JWT Auth");
249
+ if (useSwagger) console.log(" ✅ Swagger UI enabled");
250
+ if (useDocker) console.log(" ✅ Docker & Docker Compose");
251
+ console.log(
252
+ orm === "prisma"
253
+ ? " ✅ Prisma ORM (PostgreSQL) configured"
254
+ : orm === "typeorm"
255
+ ? " ✅ TypeORM (PostgreSQL) configured"
256
+ : " ✅ Mongoose (MongoDB) configured",
257
+ );
258
+ console.log(
259
+ isLight
260
+ ? " ✅ LIGHT Structure (Simplified MVP)"
261
+ : " Complete Clean Architecture",
262
+ );
263
+
264
+ console.log("\n🚀 To get started:");
265
+ console.log(" 1- cd blog-demo");
266
+
267
+ // Instructions spécifiques selon le moteur choisi
268
+ const pm = demoInputs.packageManager;
269
+ const run = pm === "yarn" ? "" : "run "; // yarn n'a pas besoin de 'run'
270
+ if (orm === "prisma" || orm === "typeorm") {
271
+ console.log(
272
+ "\n 2- Create a PostgreSQL database with the name specified in the .env (default 'blog_demo').",
273
+ );
274
+ console.log(" Example (psql) : createdb blog_demo");
275
+ console.log(
276
+ "\n 3- Open the generated .env file and replace the values with your actual connection details:",
277
+ );
278
+ console.log(" POSTGRES_USER=<your_user>");
279
+ console.log(" POSTGRES_PASSWORD=<your_password>");
280
+ console.log(" POSTGRES_DB=blog_demo");
281
+ console.log(" POSTGRES_HOST=localhost");
282
+ console.log(" POSTGRES_PORT=5432");
283
+ console.log("\n 4- Run migrations and seeds:");
284
+ if (orm === "prisma") {
285
+ console.log(` npx prisma migrate reset`);
286
+ console.log(` npx prisma migrate dev`);
287
+ console.log(` npx prisma db seed`);
288
+ } else {
289
+ console.log(` ${pm} ${run}typeorm:migration:run`);
290
+ console.log(` ${pm} ${run}typeorm:seed`);
291
+ }
292
+ } else if (orm === "mongoose") {
293
+ console.log("\n 2- MongoDB: You can use either a local server or Docker.");
294
+ console.log(
295
+ " By default, the project uses: MONGO_URI=mongodb://localhost:27017/blog_demo",
296
+ );
297
+ console.log(
298
+ " The database will be created automatically upon first write operation.",
299
+ );
300
+ console.log(
301
+ "\n 3- Open the generated .env file and replace the MONGO_URI variable if necessary:",
302
+ );
303
+ console.log(
304
+ " MONGO_URI=mongodb://<user>:<password>@localhost:27017/blog_demo",
305
+ );
306
+ console.log("\n 4- Run the seed script (if present):");
307
+ console.log(` ${pm} ${run}seed`);
308
+ }
309
+
310
+ console.log("\n 5- Run the project:");
311
+ console.log(` ${demoInputs.packageManager} run start:dev`);
312
+ if (useSwagger)
313
+ console.log(" 6- Open Swagger UI : http://localhost:3000/api/docs");
314
+
315
+ console.log("\n📚 Main Endpoints:");
316
+ if (useAuth) {
317
+ console.log(" • /auth/register Create an account");
318
+ console.log(" • /auth/login Log in");
319
+ }
320
+ console.log(" • /users → Manage users");
321
+ console.log(" /posts → Manage posts");
322
+ console.log(" • /comments → Manage comments");
323
+
324
+ console.log("\n💡 Tip:");
325
+ console.log(
326
+ " Modify the .env file to connect your own database (Postgres or Mongo).",
327
+ );
328
+ console.log(
329
+ " Once configured and migrated/seeded, the project is ready to run immediately! 🚀\n",
330
+ );
331
+ }
332
+
333
+ module.exports = demoCommand;