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.
- package/dist/engine/architecture-profile.js +10 -0
- package/dist/engine/file-transaction.js +166 -0
- package/dist/engine/generated-code.js +26 -0
- package/dist/engine/generation-manifest.js +118 -0
- package/dist/engine/migration-plan.js +78 -0
- package/dist/engine/module-generator.js +157 -0
- package/dist/engine/project-config.js +42 -0
- package/dist/engine/project-path.js +25 -0
- package/dist/engine/project-preflight.js +96 -0
- package/dist/engine/resource-generator.js +1153 -0
- package/dist/engine/resource-spec.js +287 -0
- package/examples/store-api/README.md +76 -0
- package/examples/store-api/definitions/customers.resource.json +14 -0
- package/examples/store-api/definitions/order-items.resource.json +26 -0
- package/examples/store-api/definitions/orders.resource.json +22 -0
- package/examples/store-api/definitions/products.resource.json +19 -0
- package/examples/store-api/nestgen.example.json +7 -0
- package/nestgen.js +700 -86
- package/nestjs-generator/features/add_module.sh +68 -24
- package/nestjs-generator/features/configure_bootstrap.mjs +42 -0
- package/nestjs-generator/features/docker.sh +169 -36
- package/nestjs-generator/features/git.sh +4 -2
- package/nestjs-generator/features/inject_module_to_app.sh +22 -69
- package/nestjs-generator/features/operational_foundation.mjs +210 -0
- package/nestjs-generator/features/operations.sh +16 -0
- package/nestjs-generator/features/preflight.mjs +13 -0
- package/nestjs-generator/features/prisma.sh +48 -8
- package/nestjs-generator/features/resource_name.mjs +57 -0
- package/nestjs-generator/features/swagger.sh +7 -20
- package/nestjs-generator/features/typeorm.sh +68 -7
- package/nestjs-generator/features/update_app_module.mjs +146 -0
- package/nestjs-generator/features/utils.sh +52 -14
- package/nestjs-generator/generate_project.sh +46 -70
- package/package.json +63 -31
- package/readme.md +298 -120
|
@@ -1,12 +1,55 @@
|
|
|
1
|
-
#!/bin/bash
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
pnpm|
|
|
9
|
-
*)
|
|
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
|
-
|
|
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 -
|
|
4
|
+
set -euo pipefail
|
|
5
5
|
|
|
6
|
-
|
|
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
|
-
|
|
34
|
-
debug_log "
|
|
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
|
-
|
|
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
|
-
|
|
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" ]
|
|
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" ]
|
|
80
|
-
|
|
81
|
-
|
|
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
|
-
|
|
95
|
-
if
|
|
96
|
-
|
|
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
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
|
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 "
|
|
131
|
-
bash "$FEATURES_PATH/
|
|
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" ]
|
|
141
|
-
[ "$WITH_SWAGGER" = "y" ]
|
|
142
|
-
[ "$
|
|
143
|
-
[
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
"
|
|
31
|
-
|
|
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
|
}
|