nestgen-cli 0.0.7 → 0.2.1

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 (35) hide show
  1. package/dist/engine/architecture-profile.js +10 -0
  2. package/dist/engine/file-transaction.js +166 -0
  3. package/dist/engine/generated-code.js +26 -0
  4. package/dist/engine/generation-manifest.js +118 -0
  5. package/dist/engine/migration-plan.js +78 -0
  6. package/dist/engine/module-generator.js +157 -0
  7. package/dist/engine/project-config.js +42 -0
  8. package/dist/engine/project-path.js +25 -0
  9. package/dist/engine/project-preflight.js +96 -0
  10. package/dist/engine/resource-generator.js +1153 -0
  11. package/dist/engine/resource-spec.js +287 -0
  12. package/examples/store-api/README.md +76 -0
  13. package/examples/store-api/definitions/customers.resource.json +14 -0
  14. package/examples/store-api/definitions/order-items.resource.json +26 -0
  15. package/examples/store-api/definitions/orders.resource.json +22 -0
  16. package/examples/store-api/definitions/products.resource.json +19 -0
  17. package/examples/store-api/nestgen.example.json +7 -0
  18. package/nestgen.js +700 -86
  19. package/nestjs-generator/features/add_module.sh +68 -24
  20. package/nestjs-generator/features/configure_bootstrap.mjs +42 -0
  21. package/nestjs-generator/features/docker.sh +169 -36
  22. package/nestjs-generator/features/git.sh +4 -2
  23. package/nestjs-generator/features/inject_module_to_app.sh +22 -69
  24. package/nestjs-generator/features/operational_foundation.mjs +210 -0
  25. package/nestjs-generator/features/operations.sh +16 -0
  26. package/nestjs-generator/features/preflight.mjs +13 -0
  27. package/nestjs-generator/features/prisma.sh +48 -8
  28. package/nestjs-generator/features/resource_name.mjs +57 -0
  29. package/nestjs-generator/features/swagger.sh +7 -20
  30. package/nestjs-generator/features/typeorm.sh +68 -7
  31. package/nestjs-generator/features/update_app_module.mjs +146 -0
  32. package/nestjs-generator/features/utils.sh +52 -14
  33. package/nestjs-generator/generate_project.sh +46 -70
  34. package/package.json +63 -31
  35. package/readme.md +298 -120
@@ -1,12 +1,55 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
- # ────── Commande d'installation adaptée au package manager ──────
4
- get_install_cmd() {
5
- local PM=$1
6
- case "$PM" in
7
- yarn) echo "add" ;;
8
- pnpm|npm) echo "install" ;;
9
- *) echo "install" ;;
3
+ NEST_CLI_VERSION="12.0.0"
4
+
5
+ assert_package_manager() {
6
+ local package_manager=$1
7
+ case "$package_manager" in
8
+ npm|pnpm|yarn) assert_command_exists "$package_manager" ;;
9
+ *)
10
+ echo "❌ Package manager non supporté : $package_manager. Valeurs acceptées : npm, pnpm, yarn."
11
+ return 1
12
+ ;;
13
+ esac
14
+ }
15
+
16
+ pm_add() {
17
+ local package_manager=$1
18
+ shift
19
+ case "$package_manager" in
20
+ npm) npm install "$@" ;;
21
+ pnpm) pnpm add "$@" ;;
22
+ yarn) yarn add "$@" ;;
23
+ esac
24
+ }
25
+
26
+ pm_add_dev() {
27
+ local package_manager=$1
28
+ shift
29
+ case "$package_manager" in
30
+ npm) npm install --save-dev "$@" ;;
31
+ pnpm) pnpm add --save-dev "$@" ;;
32
+ yarn) yarn add --dev "$@" ;;
33
+ esac
34
+ }
35
+
36
+ pm_exec() {
37
+ local package_manager=$1
38
+ shift
39
+ case "$package_manager" in
40
+ npm) npm exec -- "$@" ;;
41
+ pnpm) pnpm exec "$@" ;;
42
+ yarn) yarn exec "$@" ;;
43
+ esac
44
+ }
45
+
46
+ nest_new() {
47
+ local package_manager=$1
48
+ local destination=$2
49
+ case "$package_manager" in
50
+ npm) npx --yes "@nestjs/cli@${NEST_CLI_VERSION}" new "$destination" --package-manager npm --skip-git ;;
51
+ pnpm) pnpm dlx "@nestjs/cli@${NEST_CLI_VERSION}" new "$destination" --package-manager pnpm --skip-git ;;
52
+ yarn) yarn dlx "@nestjs/cli@${NEST_CLI_VERSION}" new "$destination" --package-manager yarn --skip-git ;;
10
53
  esac
11
54
  }
12
55
 
@@ -16,11 +59,6 @@ assert_command_exists() {
16
59
  if ! command -v "$CMD" &> /dev/null; then
17
60
  echo "❌ Commande introuvable : $CMD"
18
61
  echo "👉 Installe-la ou vérifie ton PATH"
19
- exit 1
62
+ return 1
20
63
  fi
21
64
  }
22
-
23
- # ────── Formatage ──────
24
- to_pascal_case() {
25
- echo "$1" | sed -E 's/(^|-|_)([a-z])/\U\2/g'
26
- }
@@ -1,9 +1,10 @@
1
- #!/bin/bash
1
+ #!/usr/bin/env bash
2
2
 
3
3
  # ────── INIT ──────
4
- set -e
4
+ set -euo pipefail
5
5
 
6
- FEATURES_PATH="$(dirname "$0")/features"
6
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
+ FEATURES_PATH="$SCRIPT_DIR/features"
7
8
  source "$FEATURES_PATH/utils.sh"
8
9
  source "$FEATURES_PATH/logger.sh"
9
10
 
@@ -19,6 +20,20 @@ debug_log() {
19
20
  fi
20
21
  }
21
22
 
23
+ run_step() {
24
+ local step=$1
25
+ shift
26
+
27
+ log_info "$step"
28
+ if "$@"; then
29
+ return 0
30
+ else
31
+ local status=$?
32
+ log_error "$step a échoué (code $status)."
33
+ exit "$status"
34
+ fi
35
+ }
36
+
22
37
  debug_log "Script lancé avec les arguments : $*"
23
38
  debug_log "Chemin du script courant : $(pwd)"
24
39
  debug_log "Features path : $FEATURES_PATH"
@@ -30,14 +45,8 @@ FULL_PATH="$PROJECT_PATH/$APP_NAME"
30
45
  PM=${PM:-$(read -p "📦 Package manager (npm/yarn/pnpm) : " tmp && echo "$tmp")}
31
46
  ORM=${ORM:-$(read -p "🧠 ORM ? (typeorm/prisma) : " tmp && echo "$tmp")}
32
47
 
33
- INSTALL_CMD=$(get_install_cmd "$PM")
34
- debug_log "Install command : $PM $INSTALL_CMD"
35
-
36
- # ────── Vérification de Nest CLI ──────
37
- if ! command -v nest &> /dev/null; then
38
- log_warn "Nest CLI non installée. Installation avec npm..."
39
- npm install -g @nestjs/cli
40
- fi
48
+ run_step "Vérification du package manager" assert_package_manager "$PM"
49
+ debug_log "Package manager : $PM ; Nest CLI local : $NEST_CLI_VERSION"
41
50
 
42
51
  # ────── Création du projet ──────
43
52
  log_info "Création du projet à $FULL_PATH"
@@ -47,23 +56,19 @@ cd "$FULL_PATH" || {
47
56
  exit 1
48
57
  }
49
58
 
50
- nest new . --package-manager "$PM" --skip-git || {
51
- log_error "Échec de nest new"
52
- exit 1
53
- }
59
+ run_step "Création du projet NestJS" nest_new "$PM" .
54
60
 
55
- log_info "Installation des packages communs..."
56
- $PM $INSTALL_CMD @nestjs/cqrs class-validator class-transformer @nestjs/config
61
+ run_step "Installation des packages communs" pm_add "$PM" @nestjs/cqrs@12 @nestjs/config@4 class-validator@0.14 class-transformer@0.5
57
62
 
58
63
  # ────── ORM SETUP ──────
59
64
  case "$ORM" in
60
65
  typeorm)
61
66
  debug_log "Appel de typeorm.sh"
62
- bash "$FEATURES_PATH/typeorm.sh" "$PM" "$APP_NAME"
67
+ run_step "Configuration de TypeORM" bash "$FEATURES_PATH/typeorm.sh" "$PM" "$APP_NAME"
63
68
  ;;
64
69
  prisma)
65
70
  debug_log "Appel de prisma.sh"
66
- bash "$FEATURES_PATH/prisma.sh" "$PM" "$APP_NAME"
71
+ run_step "Configuration de Prisma" bash "$FEATURES_PATH/prisma.sh" "$PM" "$APP_NAME"
67
72
  ;;
68
73
  *)
69
74
  log_error "❌ ORM non reconnu : $ORM"
@@ -73,62 +78,32 @@ esac
73
78
 
74
79
  # ────── Docker, Swagger, Git ──────
75
80
  WITH_DOCKER=${WITH_DOCKER:-$(read -p "🐳 Activer Docker ? (y/n) : " tmp && echo "$tmp")}
76
- [ "$WITH_DOCKER" = "y" ] && bash "$FEATURES_PATH/docker.sh" "$APP_NAME"
81
+ if [ "$WITH_DOCKER" = "y" ]; then
82
+ run_step "Configuration Docker" bash "$FEATURES_PATH/docker.sh" "$APP_NAME" "$PM"
83
+ fi
77
84
 
78
85
  WITH_SWAGGER=${WITH_SWAGGER:-$(read -p "📚 Activer Swagger ? (y/n) : " tmp && echo "$tmp")}
79
- [ "$WITH_SWAGGER" = "y" ] && bash "$FEATURES_PATH/swagger.sh" "$PM"
80
-
81
- WITH_GIT=${WITH_GIT:-$(read -p "🔃 Initialiser Git ? (y/n) : " tmp && echo "$tmp")}
82
- [ "$WITH_GIT" = "y" ] && bash "$FEATURES_PATH/git.sh"
83
-
84
- # ────── Modules à générer ──────
85
- MODULES=${MODULES:-$(read -p "👤 Modules à générer (séparés par espaces) : " tmp && echo "$tmp")}
86
- for MODULE in $MODULES; do
87
- debug_log "Génération du module $MODULE"
88
- bash "$FEATURES_PATH/add_module.sh" "$MODULE" "$ORM"
89
- done
90
-
91
- # ────── Injection dans app.module.ts ──────
92
- APP_MODULE="src/app.module.ts"
86
+ if [ "$WITH_SWAGGER" = "y" ]; then
87
+ run_step "Configuration Swagger" bash "$FEATURES_PATH/swagger.sh" "$PM"
88
+ fi
93
89
 
94
- # CqrsModule
95
- if ! grep -q "CqrsModule" "$APP_MODULE"; then
96
- sed -i '' "1i\\
97
- import { CqrsModule } from '@nestjs/cqrs';
98
- " "$APP_MODULE"
99
- sed -i '' "s|imports: \[|imports: [CqrsModule, |" "$APP_MODULE"
100
- echo "✅ CqrsModule injecté"
90
+ WITH_OPERATIONS=${WITH_OPERATIONS:-$(read -p "🩺 Activer le socle d’exploitation ? (y/n) : " tmp && echo "$tmp")}
91
+ if [ "$WITH_OPERATIONS" = "y" ]; then
92
+ run_step "Configuration du socle d’exploitation" bash "$FEATURES_PATH/operations.sh" "$ORM"
101
93
  fi
102
94
 
103
- # TypeOrmModule
104
- if [ "$ORM" = "typeorm" ]; then
105
- if ! grep -q "TypeOrmModule" "$APP_MODULE"; then
106
- sed -i '' "1i\\
107
- import { TypeOrmModule } from '@nestjs/typeorm';
108
- " "$APP_MODULE"
109
- echo "✅ Import de TypeOrmModule ajouté"
110
- fi
95
+ run_step "Configuration du bootstrap Nest" node "$FEATURES_PATH/configure_bootstrap.mjs" src/main.ts "$WITH_SWAGGER" "$WITH_OPERATIONS"
111
96
 
112
- if ! grep -q "TypeOrmModule.forRoot" "$APP_MODULE"; then
113
- sed -i '' -E 's/(imports: \[[^]]*)(])/\1\
114
- TypeOrmModule.forRoot({\
115
- type: '\''postgres'\'',\
116
- host: '\''localhost'\'',\
117
- port: 5432,\
118
- username: '\''postgres'\'',\
119
- password: '\''postgres'\'',\
120
- database: '\''appdb'\'',\
121
- synchronize: true,\
122
- autoLoadEntities: true,\
123
- }), \2/g' "$APP_MODULE"
124
- echo "✅ TypeOrmModule.forRoot injecté"
125
- fi
97
+ WITH_GIT=${WITH_GIT:-$(read -p "🔃 Initialiser Git ? (y/n) : " tmp && echo "$tmp")}
98
+ if [ "$WITH_GIT" = "y" ]; then
99
+ run_step "Initialisation Git" bash "$FEATURES_PATH/git.sh"
126
100
  fi
127
101
 
128
- # Modules générés
102
+ # ────── Modules à générer ──────
103
+ MODULES=${MODULES-$(read -p "👤 Modules à générer (séparés par espaces) : " tmp && echo "$tmp")}
129
104
  for MODULE in $MODULES; do
130
- debug_log "Injection de $MODULE dans app.module.ts"
131
- bash "$FEATURES_PATH/inject_module_to_app.sh" "$MODULE" "$ORM"
105
+ debug_log "Génération du module $MODULE"
106
+ run_step "Génération du module $MODULE" bash "$FEATURES_PATH/add_module.sh" "$MODULE" "$ORM"
132
107
  done
133
108
 
134
109
  # ────── Résumé final ──────
@@ -137,7 +112,8 @@ log_success "✅ Projet NestJS \"$APP_NAME\" généré avec succès 🎉"
137
112
  echo "📁 Localisation : $FULL_PATH"
138
113
  echo "📦 Package manager : $PM"
139
114
  echo "🧠 ORM : $ORM"
140
- [ "$WITH_DOCKER" = "y" ] && echo "🐳 Docker activé"
141
- [ "$WITH_SWAGGER" = "y" ] && echo "📚 Swagger activé"
142
- [ "$WITH_GIT" = "y" ] && echo "🔃 Git initialisé"
143
- [ -n "$MODULES" ] && echo "📦 Modules générés : $MODULES"
115
+ if [ "$WITH_DOCKER" = "y" ]; then echo "🐳 Docker activé"; fi
116
+ if [ "$WITH_SWAGGER" = "y" ]; then echo "📚 Swagger activé"; fi
117
+ if [ "$WITH_OPERATIONS" = "y" ]; then echo "🩺 Socle d’exploitation activé"; fi
118
+ if [ "$WITH_GIT" = "y" ]; then echo "🔃 Git initialisé"; fi
119
+ if [ -n "$MODULES" ]; then echo "📦 Modules générés : $MODULES"; fi
package/package.json CHANGED
@@ -1,33 +1,65 @@
1
1
  {
2
- "name": "nestgen-cli",
3
- "version": "0.0.7",
4
- "description": "NestGen CLI — Générateur modulaire NestJS (DDD, CQRS, Hexagonal)",
5
- "files": [
6
- "nestgen.js",
7
- "nestjs-generator"
8
- ],
9
- "bin": {
10
- "nestgen": "nestgen.js"
11
- },
12
- "author": "Aristide kamara bakarykamara52@gmail.com",
13
- "license": "MIT",
14
- "keywords": [
15
- "nestjs",
16
- "cli",
17
- "ddd",
18
- "cqrs",
19
- "scaffold",
20
- "generator",
21
- "hexagonal"
22
- ],
23
- "repository": {
24
- "type": "git",
25
- "url": "https://github.com/el-hack/nestgen-cli.git"
26
- },
27
- "type": "module",
28
- "licenses": "MIT",
29
- "dependencies": {
30
- "chalk": "^5.3.0",
31
- "inquirer": "^9.0.0"
32
- }
2
+ "name": "nestgen-cli",
3
+ "version": "0.2.1",
4
+ "description": "NestGen CLI — Générateur modulaire NestJS (DDD, CQRS, Hexagonal)",
5
+ "files": [
6
+ "dist",
7
+ "examples",
8
+ "nestgen.js",
9
+ "nestjs-generator"
10
+ ],
11
+ "bin": {
12
+ "nestgen": "nestgen.js"
13
+ },
14
+ "author": "Aristide kamara bakarykamara52@gmail.com",
15
+ "license": "MIT",
16
+ "keywords": [
17
+ "nestjs",
18
+ "cli",
19
+ "ddd",
20
+ "cqrs",
21
+ "scaffold",
22
+ "generator",
23
+ "hexagonal"
24
+ ],
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "https://github.com/el-hack/nestgen-cli.git"
28
+ },
29
+ "type": "module",
30
+ "engines": {
31
+ "node": ">=24.15.0 <27"
32
+ },
33
+ "packageManager": "npm@11.0.0",
34
+ "scripts": {
35
+ "build": "tsc -p tsconfig.json",
36
+ "check": "npm run typecheck && eslint .",
37
+ "format": "prettier --write .",
38
+ "format:check": "prettier --check .",
39
+ "prepack": "npm run build && npm run check && npm run docs:check && npm run landing:check && npm run format:check && npm test && npm run test:example",
40
+ "test": "node --test",
41
+ "test:package": "node scripts/package-smoke.mjs",
42
+ "test:package-manager": "node scripts/package-manager-lockfile-integration.mjs",
43
+ "test:prisma": "node scripts/prisma-integration.mjs",
44
+ "test:docker": "node scripts/docker-config-integration.mjs",
45
+ "test:example": "node scripts/example-store-api-integration.mjs",
46
+ "test:typeorm": "node scripts/typeorm-http-integration.mjs",
47
+ "release:verify": "node scripts/release-verify.mjs",
48
+ "release:verify-remote": "node scripts/release-verify-remote.mjs",
49
+ "docs:check": "node scripts/docs-contract.mjs",
50
+ "landing:check": "node scripts/landing-contract.mjs",
51
+ "typecheck": "tsc -p tsconfig.json --noEmit"
52
+ },
53
+ "licenses": "MIT",
54
+ "dependencies": {
55
+ "chalk": "^5.3.0",
56
+ "inquirer": "^9.0.0",
57
+ "prettier": "^3.9.9",
58
+ "typescript": "^5.9.3"
59
+ },
60
+ "devDependencies": {
61
+ "@eslint/js": "^9.39.5",
62
+ "@types/node": "^24.19.0",
63
+ "eslint": "^9.39.5"
64
+ }
33
65
  }