@apc-projects/elysia-cli 0.1.0 → 0.1.2
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/README.md +51 -113
- package/package.json +9 -2
- package/src/commands/add.ts +21 -19
package/README.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# @apc-projects/elysia-cli
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@apc-projects/elysia-cli)
|
|
4
|
+
[](./LICENSE)
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
CLI de scaffolding pour projets **ElysiaJS**. Génère modules, services, models et macros, et branche automatiquement les plugins dans l'application via manipulation d'AST (ts-morph).
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
## Prérequis
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
Bun — le CLI s'exécute avec Bun ; Node / `npx` n'est pas supporté.
|
|
10
11
|
|
|
11
12
|
```bash
|
|
12
13
|
# macOS / Linux
|
|
@@ -16,118 +17,68 @@ curl -fsSL https://bun.sh/install | bash
|
|
|
16
17
|
powershell -c "irm bun.sh/install.ps1 | iex"
|
|
17
18
|
```
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
bun --version
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Stack
|
|
26
|
-
|
|
27
|
-
- **Bun** — runtime (exécute le TypeScript directement, pas de build en dev)
|
|
28
|
-
- **commander** — parsing des commandes
|
|
29
|
-
- **@clack/prompts** — prompts interactifs
|
|
30
|
-
- **chalk** — sortie colorée
|
|
31
|
-
- **ts-morph** — lecture/écriture de l'AST TypeScript (injection du `.use()`)
|
|
32
|
-
|
|
33
|
-
## Installation (dev)
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
bun install
|
|
37
|
-
bun run dev -- --help # exécute src/index.ts directement (aucun build)
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Pour l'utiliser comme binaire global pendant le dev :
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
bun link # dans ce package
|
|
44
|
-
cd ../mon-api-test
|
|
45
|
-
bun link @apc-projects/elysia-cli # dans le projet cible
|
|
46
|
-
elysia-cli --help
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
Le `bin` pointe sur `src/index.ts` (shebang `#!/usr/bin/env bun`) : Bun lit le TS, donc rien à compiler pour l'installer. Un `bun install` du package suffit.
|
|
50
|
-
|
|
51
|
-
## Build standalone (distribution)
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
bun run build # bun build --compile -> dist/elysia-cli
|
|
55
|
-
./dist/elysia-cli --help # exécutable autonome, sans Bun ni Node
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Utilisation sans cloner le dépôt
|
|
59
|
-
|
|
60
|
-
### Via npm (recommandé)
|
|
61
|
-
|
|
62
|
-
Après publication sur npm (`bun publish` / `npm publish` — le package est `@apc-projects/elysia-cli`), on peut l'exécuter sans installation :
|
|
20
|
+
## Installation
|
|
63
21
|
|
|
64
22
|
```bash
|
|
23
|
+
# via npm
|
|
65
24
|
bunx @apc-projects/elysia-cli init mon-api
|
|
66
|
-
bunx @apc-projects/elysia-cli add prisma
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
`bunx` résout le **nom du package** (pas le nom du binaire), d'où `@apc-projects/elysia-cli`. Les dépendances sont installées automatiquement au premier run puis mises en cache.
|
|
70
|
-
|
|
71
|
-
### Via GitHub (sans publier sur npm)
|
|
72
|
-
|
|
73
|
-
Bun sait installer depuis un dépôt Git. En dépendance de projet :
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
bun add github:<owner>/<repo> # ajoute @apc-projects/elysia-cli au projet
|
|
77
|
-
bunx elysia-cli init mon-api # le binaire local est alors résolu
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Ou en global :
|
|
81
25
|
|
|
82
|
-
|
|
83
|
-
bun add -g github:<owner
|
|
26
|
+
# ou depuis GitHub, en global
|
|
27
|
+
bun add -g github:<owner>/elysia-cli
|
|
84
28
|
elysia-cli init mon-api
|
|
85
29
|
```
|
|
86
30
|
|
|
87
|
-
Comme le `bin` pointe sur `src/index.ts` (shebang `#!/usr/bin/env bun`), aucune étape de build n'est requise à l'installation — Bun exécute le TypeScript directement. Assure-toi que `files` inclut `src` (c'est le cas) pour que la source soit bien livrée.
|
|
88
|
-
|
|
89
|
-
> Note : `bunx github:<owner>/<repo>` en une commande n'est pas garanti — passe par `bun add` (projet ou global) pour la voie GitHub. Pour un `bunx <nom>` direct, publie sur npm.
|
|
90
|
-
|
|
91
31
|
## Commandes
|
|
92
32
|
|
|
93
33
|
```bash
|
|
94
|
-
elysia-cli
|
|
34
|
+
elysia-cli init <project> # bun create elysia + structure elysia-cli
|
|
35
|
+
elysia-cli generate module <name> # alias : g
|
|
95
36
|
elysia-cli generate service <name>
|
|
96
37
|
elysia-cli generate model <name>
|
|
97
|
-
elysia-cli macro <name>
|
|
98
|
-
elysia-cli add <plugin>
|
|
99
|
-
elysia-cli init <project-name> # `bun create elysia` + couche elysia-cli
|
|
38
|
+
elysia-cli macro <name> # génère une macro + .use()
|
|
39
|
+
elysia-cli add <plugin> # cors | openapi | jwt | logger | better-auth | prisma
|
|
100
40
|
```
|
|
101
41
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
- `cors`, `jwt` — branchés par `.use(...)` dans l'app entry.
|
|
105
|
-
- `openapi` — branché **uniquement hors production** (`NODE_ENV !== "production"`). Si **better-auth** est présent, le schéma OpenAPI de better-auth est intégré à la doc (`documentation.components` / `documentation.paths`). L'intégration marche dans les deux sens : si tu ajoutes `openapi` puis `better-auth`, ce dernier **re-patche** l'appel `openapi()` existant pour y injecter la doc auth.
|
|
106
|
-
- `logger` — scaffolde le logger applicatif (chalk) dans `src/utils/logger.ts`, injecte les hooks `onBeforeHandle`/`onAfterResponse` **directement dans la chaîne** de `src/index.ts`, et remplace les `console.*` par le `Logger`.
|
|
107
|
-
- `prisma` — Prisma 7. **Demande le provider** (PostgreSQL / MySQL-MariaDB / SQLite) et l'**URL de connexion**, puis scaffolde le client singleton avec le bon driver adapter (`src/db/index.ts`), `prisma/schema.prisma` (provider choisi, sans `url`, + générateur **prismabox** pour les modèles de validation Elysia), `prisma.config.ts` (URL pour Migrate), et ajoute `DATABASE_URL` à `.env.local`. Le client est généré vers un **output custom** (`src/generated/prisma`, Prisma 7) et importé depuis `../generated/prisma/client` dans `src/db/index.ts` — jamais depuis `@prisma/client`. Le dossier `src/generated` est git-ignoré (régénéré via `prebuild`/post-install). `prisma generate` est lancé après install. Ajoute aussi au `package.json` (sans écraser l'existant) les scripts `build`/`start` s'ils manquent, plus `prebuild` (`prisma generate`) et `prestart` (`prisma migrate deploy`). Les paquets (`@prisma/adapter-*`, driver natif) dépendent du provider.
|
|
108
|
-
- `better-auth` — scaffolde `src/lib/auth.ts` **et une macro `auth`** (`src/macros/auth.macro.ts`) qui monte le handler (routes sur `/api/auth`) et expose `user`/`session` aux routes protégées via `{ auth: true }` ; branché par `.use(authMacro)`. **Demande `BETTER_AUTH_URL`** et ajoute `BETTER_AUTH_SECRET` (généré) + `BETTER_AUTH_URL` à `.env.local`. **Si Prisma est présent** (ou ajouté en même temps), l'adapter Prisma est câblé avec le provider détecté depuis le schéma, et les migrations auth sont générées puis appliquées (`@better-auth/cli generate` + `prisma migrate`).
|
|
42
|
+
### Plugins (`add`)
|
|
109
43
|
|
|
110
|
-
|
|
44
|
+
Les dépendances sont installées automatiquement (`--no-install` pour désactiver).
|
|
111
45
|
|
|
112
|
-
|
|
46
|
+
| Plugin | Effet |
|
|
47
|
+
| --- | --- |
|
|
48
|
+
| `cors`, `jwt` | Branchés dans l'app via `.use(...)`. |
|
|
49
|
+
| `openapi` | Monté hors production uniquement. Intègre le schéma OpenAPI de better-auth s'il est présent. |
|
|
50
|
+
| `logger` | Logger applicatif (chalk) dans `src/utils/logger.ts`, hooks de logging des requêtes, et bascule des `console.*` vers `Logger`. |
|
|
51
|
+
| `prisma` | Prisma 7 : client singleton avec driver adapter, `schema.prisma` (+ générateur prismabox), `prisma.config.ts`, `DATABASE_URL` dans `.env.local`, scripts `prebuild`/`prestart`. Provider au choix (PostgreSQL / MySQL-MariaDB / SQLite). |
|
|
52
|
+
| `better-auth` | `src/lib/auth.ts` + macro `auth` (`.use(authMacro)`, routes sur `/api/auth`), secret et URL dans `.env.local`. Câble l'adapter Prisma et les migrations si Prisma est présent. |
|
|
113
53
|
|
|
114
|
-
|
|
54
|
+
## Structure générée
|
|
115
55
|
|
|
116
|
-
|
|
117
|
-
elysia-cli g module user
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
Génère :
|
|
56
|
+
`generate module user` crée un module feature-based, branché dans l'agrégateur `src/modules/index.ts` :
|
|
121
57
|
|
|
122
58
|
```
|
|
123
59
|
src/modules/user/
|
|
124
|
-
user.controller.ts # instance Elysia
|
|
125
|
-
user.service.ts # classe
|
|
126
|
-
user.model.ts #
|
|
60
|
+
user.controller.ts # instance Elysia « user »
|
|
61
|
+
user.service.ts # classe « User »
|
|
62
|
+
user.model.ts # schémas « UserModel » + type TS dérivé
|
|
127
63
|
index.ts # barrel export
|
|
128
64
|
```
|
|
129
65
|
|
|
130
|
-
|
|
66
|
+
Un projet complet (`init` + `prisma`, `better-auth`, `logger`, `openapi`) ressemble à :
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
mon-api/
|
|
70
|
+
prisma/schema.prisma
|
|
71
|
+
prisma.config.ts
|
|
72
|
+
src/
|
|
73
|
+
index.ts # app Elysia (hooks logger, .use(modules), .use(authMacro)…)
|
|
74
|
+
modules/index.ts # agrégateur des modules
|
|
75
|
+
lib/auth.ts # instance better-auth
|
|
76
|
+
macros/auth.macro.ts # macro « auth »
|
|
77
|
+
db/index.ts # client Prisma
|
|
78
|
+
utils/logger.ts
|
|
79
|
+
.env.local # DATABASE_URL, BETTER_AUTH_SECRET, BETTER_AUTH_URL
|
|
80
|
+
elysia-cli.config.json
|
|
81
|
+
```
|
|
131
82
|
|
|
132
83
|
## Configuration
|
|
133
84
|
|
|
@@ -138,32 +89,19 @@ Optionnel — `elysia-cli.config.json` à la racine du projet cible :
|
|
|
138
89
|
"srcDir": "src",
|
|
139
90
|
"modulesDir": "src/modules",
|
|
140
91
|
"appEntry": "src/index.ts",
|
|
141
|
-
"appVariable": "app"
|
|
92
|
+
"appVariable": "app",
|
|
93
|
+
"modulesEntry": "src/modules/index.ts",
|
|
94
|
+
"modulesVariable": "modules"
|
|
142
95
|
}
|
|
143
96
|
```
|
|
144
97
|
|
|
145
|
-
##
|
|
98
|
+
## Développement
|
|
146
99
|
|
|
100
|
+
```bash
|
|
101
|
+
bun install
|
|
102
|
+
bun run dev -- --help # exécute src/index.ts
|
|
103
|
+
bun run build # binaire standalone -> dist/elysia-cli
|
|
147
104
|
```
|
|
148
|
-
src/
|
|
149
|
-
index.ts # entrée commander
|
|
150
|
-
commands/
|
|
151
|
-
generate.ts # generate module/service/model
|
|
152
|
-
add.ts # add <plugin>
|
|
153
|
-
init.ts # init <project>
|
|
154
|
-
utils/
|
|
155
|
-
logger.ts # wrappers chalk + clack
|
|
156
|
-
naming.ts # helpers de casse (pascal, camel, kebab)
|
|
157
|
-
project.ts # chargement du Project ts-morph + config
|
|
158
|
-
inject.ts # injection du .use() dans l'app
|
|
159
|
-
templates.ts # fonctions de génération de contenu
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
> Note : `tsup.config.ts` n'est plus utilisé (build géré par `bun build --compile`) et peut être supprimé.
|
|
163
|
-
|
|
164
|
-
## Étendre
|
|
165
|
-
|
|
166
|
-
Ajoute un générateur : nouvelle fonction dans `templates.ts` + branche-la dans `commands/generate.ts`. Pour un nouveau type d'injection, réutilise `utils/inject.ts` (basé sur ts-morph, donc robuste aux reformats).
|
|
167
105
|
|
|
168
106
|
## Licence
|
|
169
107
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@apc-projects/elysia-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Générateur de scaffolding pour projets ElysiaJS (modules, services, models, plugins).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -10,7 +10,14 @@
|
|
|
10
10
|
"type": "git",
|
|
11
11
|
"url": "git+https://github.com/Segu27/elysia-cli.git"
|
|
12
12
|
},
|
|
13
|
-
"keywords": [
|
|
13
|
+
"keywords": [
|
|
14
|
+
"elysia",
|
|
15
|
+
"elysiajs",
|
|
16
|
+
"cli",
|
|
17
|
+
"scaffolding",
|
|
18
|
+
"bun",
|
|
19
|
+
"generator"
|
|
20
|
+
],
|
|
14
21
|
"bin": {
|
|
15
22
|
"elysia-cli": "./src/index.ts"
|
|
16
23
|
},
|
package/src/commands/add.ts
CHANGED
|
@@ -136,25 +136,7 @@ const PLUGINS: Record<string, Preset> = {
|
|
|
136
136
|
importName: "jwt",
|
|
137
137
|
importFrom: "@elysiajs/jwt",
|
|
138
138
|
}),
|
|
139
|
-
|
|
140
|
-
pkgs: ["chalk"],
|
|
141
|
-
apply: (config) => {
|
|
142
|
-
scaffoldFile(join(config.srcDir, "utils", "logger.ts"), loggerTemplate());
|
|
143
|
-
const project = loadTsProject();
|
|
144
|
-
const app = { entry: config.appEntry, variable: config.appVariable };
|
|
145
|
-
const loggerPath = join(config.srcDir, "utils", "logger");
|
|
146
|
-
appendChain(project, app, loggerHooksSegment(), {
|
|
147
|
-
dedupe: "Logger.app.request",
|
|
148
|
-
ensureImports: [
|
|
149
|
-
{
|
|
150
|
-
names: ["Logger"],
|
|
151
|
-
moduleSpecifier: moduleSpecifierFrom(config.appEntry, loggerPath),
|
|
152
|
-
},
|
|
153
|
-
],
|
|
154
|
-
});
|
|
155
|
-
replaceConsoleWithLogger(project, app, loggerPath);
|
|
156
|
-
},
|
|
157
|
-
},
|
|
139
|
+
|
|
158
140
|
prisma: {
|
|
159
141
|
pkgs: ["@prisma/client"],
|
|
160
142
|
devPkgs: ["prisma", "prismabox", "dotenv"],
|
|
@@ -257,6 +239,7 @@ const PLUGINS: Record<string, Preset> = {
|
|
|
257
239
|
"--name",
|
|
258
240
|
"add-auth",
|
|
259
241
|
]);
|
|
242
|
+
run("prisma generate", "bunx", ["prisma", "generate"]);
|
|
260
243
|
}
|
|
261
244
|
},
|
|
262
245
|
};
|
|
@@ -293,6 +276,25 @@ const PLUGINS: Record<string, Preset> = {
|
|
|
293
276
|
});
|
|
294
277
|
},
|
|
295
278
|
},
|
|
279
|
+
logger: {
|
|
280
|
+
pkgs: ["chalk"],
|
|
281
|
+
apply: (config) => {
|
|
282
|
+
scaffoldFile(join(config.srcDir, "utils", "logger.ts"), loggerTemplate());
|
|
283
|
+
const project = loadTsProject();
|
|
284
|
+
const app = { entry: config.appEntry, variable: config.appVariable };
|
|
285
|
+
const loggerPath = join(config.srcDir, "utils", "logger");
|
|
286
|
+
appendChain(project, app, loggerHooksSegment(), {
|
|
287
|
+
dedupe: "Logger.app.request",
|
|
288
|
+
ensureImports: [
|
|
289
|
+
{
|
|
290
|
+
names: ["Logger"],
|
|
291
|
+
moduleSpecifier: moduleSpecifierFrom(config.appEntry, loggerPath),
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
});
|
|
295
|
+
replaceConsoleWithLogger(project, app, loggerPath);
|
|
296
|
+
},
|
|
297
|
+
},
|
|
296
298
|
};
|
|
297
299
|
|
|
298
300
|
export const PLUGIN_KEYS = Object.keys(PLUGINS);
|