nestcraftx 0.2.4 → 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 (63) hide show
  1. package/.gitattributes +6 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +33 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
  4. package/.github/ISSUE_TEMPLATE/pull_request_template.md +24 -0
  5. package/CHANGELOG.fr.md +97 -97
  6. package/CHANGELOG.md +98 -98
  7. package/CLI_USAGE.fr.md +331 -331
  8. package/CLI_USAGE.md +364 -364
  9. package/DEMO.fr.md +292 -292
  10. package/DEMO.md +294 -294
  11. package/LICENSE +21 -21
  12. package/MIGRATION_GUIDE.fr.md +127 -127
  13. package/MIGRATION_GUIDE.md +124 -124
  14. package/QUICK_START.fr.md +152 -152
  15. package/QUICK_START.md +169 -169
  16. package/README.fr.md +653 -659
  17. package/SECURITY.md +10 -0
  18. package/bin/nestcraft.js +84 -64
  19. package/commands/demo.js +333 -330
  20. package/commands/generate.js +93 -0
  21. package/commands/generateConf.js +91 -0
  22. package/commands/help.js +78 -78
  23. package/commands/info.js +48 -48
  24. package/commands/new.js +338 -335
  25. package/commands/start.js +19 -19
  26. package/commands/test.js +7 -7
  27. package/package.json +41 -41
  28. package/readme.md +638 -643
  29. package/utils/cliParser.js +133 -76
  30. package/utils/colors.js +62 -62
  31. package/utils/configs/configureDocker.js +120 -120
  32. package/utils/configs/setupCleanArchitecture.js +563 -557
  33. package/utils/configs/setupLightArchitecture.js +701 -660
  34. package/utils/envGenerator.js +122 -122
  35. package/utils/file-utils/packageJsonUtils.js +49 -55
  36. package/utils/file-utils/saveProjectConfig.js +36 -0
  37. package/utils/fullModeInput.js +607 -607
  38. package/utils/generators/application/dtoUpdater.js +54 -0
  39. package/utils/generators/cleanModuleGenerator.js +475 -0
  40. package/utils/generators/database/setupDatabase.js +31 -0
  41. package/utils/generators/domain/entityUpdater.js +78 -0
  42. package/utils/generators/infrastructure/mapperUpdater.js +65 -0
  43. package/utils/generators/lightModuleGenerator.js +131 -0
  44. package/utils/generators/relation/relation.engine.js +64 -0
  45. package/utils/interactive/askEntityInputs.js +165 -0
  46. package/utils/lightModeInput.js +460 -460
  47. package/utils/loggers/logError.js +7 -7
  48. package/utils/loggers/logInfo.js +7 -7
  49. package/utils/loggers/logSuccess.js +7 -7
  50. package/utils/loggers/logWarning.js +7 -7
  51. package/utils/setups/orms/typeOrmSetup.js +630 -630
  52. package/utils/setups/projectSetup.js +46 -46
  53. package/utils/setups/setupAuth.js +973 -926
  54. package/utils/setups/setupDatabase.js +75 -75
  55. package/utils/setups/setupLogger.js +69 -59
  56. package/utils/setups/setupMongoose.js +377 -432
  57. package/utils/setups/setupPrisma.js +802 -630
  58. package/utils/setups/setupSwagger.js +97 -88
  59. package/utils/shell.js +32 -32
  60. package/utils/spinner.js +57 -57
  61. package/utils/systemCheck.js +124 -124
  62. package/utils/userInput.js +421 -421
  63. package/utils/utils.js +2197 -1762
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;