nestcraftx 0.2.5 → 0.3.0

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