@nodefony/drizzle 10.0.0-alpha.8 → 10.0.0-beta.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/README.md +19 -19
- package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/decorate.js +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/decorateMetadata.js +1 -1
- package/dist/index.js +9 -6
- package/dist/nodefony/command/migrateShared.js +17 -1
- package/dist/nodefony/command/orm-generate.js +14 -10
- package/dist/nodefony/command/orm-migrate-baseline.js +5 -2
- package/dist/nodefony/command/orm-reset.js +1 -0
- package/dist/nodefony/config/defineModuleConfig.js +23 -7
- package/dist/nodefony/entity/userTable.js +4 -1
- package/dist/nodefony/registerStores.js +4 -28
- package/dist/nodefony/service/DrizzleService.js +42 -16
- package/dist/nodefony/src/DrizzleAuditStore.js +14 -2
- package/dist/nodefony/src/DrizzleIdempotencyStore.js +14 -2
- package/dist/nodefony/src/DrizzleTokenStore.js +13 -1
- package/dist/nodefony/src/DrizzleTotpSecretStore.js +13 -1
- package/dist/nodefony/src/DrizzleWebAuthnCredentialStore.js +13 -1
- package/dist/nodefony/src/DrizzleWebhookStore.js +13 -1
- package/dist/nodefony/src/SessionStorage.js +8 -0
- package/dist/nodefony/src/connectorTarget.js +1 -1
- package/dist/nodefony/src/frameworkConnector.js +29 -0
- package/dist/nodefony/src/memoryDatabase.js +13 -0
- package/dist/nodefony/src/migrator/DrizzleMigrator.js +3 -3
- package/dist/nodefony/src/migrator/adopt.js +1 -1
- package/dist/nodefony/src/migrator/appSchema.js +44 -1
- package/dist/nodefony/src/migrator/destructive.js +2 -3
- package/dist/nodefony/src/migrator/drivers/mysqlDriver.js +1 -1
- package/dist/nodefony/src/migrator/drivers/postgresDriver.js +1 -1
- package/dist/nodefony/src/migrator/drivers/sqliteDriver.js +1 -0
- package/dist/nodefony/src/migrator/explain.js +7 -10
- package/dist/nodefony/src/migrator/history.js +25 -2
- package/dist/nodefony/src/migrator/kit.js +41 -6
- package/dist/nodefony/src/migrator/paths.js +55 -1
- package/dist/nodefony/src/migrator/rebuildCopy.js +6 -6
- package/dist/nodefony/src/migrator/refusals.js +50 -1
- package/dist/nodefony/src/migrator/resolve.js +59 -9
- package/dist/nodefony/src/migrator/sources.js +13 -8
- package/dist/nodefony/src/orm-core/DrizzleOrm.js +51 -30
- package/dist/nodefony/src/orm-core/DrizzleRepository.js +38 -26
- package/dist/nodefony/src/queryKit.js +5 -5
- package/dist/nodefony/src/safeTarget.js +1 -0
- package/dist/types/nodefony/command/migrateShared.d.ts +10 -0
- package/dist/types/nodefony/config/defineModuleConfig.d.ts +5 -1
- package/dist/types/nodefony/entity/userTable.d.ts +46 -3
- package/dist/types/nodefony/registerStores.d.ts +4 -3
- package/dist/types/nodefony/src/DrizzleAuditStore.d.ts +6 -0
- package/dist/types/nodefony/src/DrizzleIdempotencyStore.d.ts +8 -1
- package/dist/types/nodefony/src/DrizzleTokenStore.d.ts +6 -0
- package/dist/types/nodefony/src/DrizzleTotpSecretStore.d.ts +6 -0
- package/dist/types/nodefony/src/DrizzleUserRepository.d.ts +1 -1
- package/dist/types/nodefony/src/DrizzleWebAuthnCredentialStore.d.ts +6 -0
- package/dist/types/nodefony/src/DrizzleWebhookStore.d.ts +6 -0
- package/dist/types/nodefony/src/SessionStorage.d.ts +6 -0
- package/dist/types/nodefony/src/connectorTarget.d.ts +1 -1
- package/dist/types/nodefony/src/frameworkConnector.d.ts +24 -0
- package/dist/types/nodefony/src/memoryDatabase.d.ts +10 -0
- package/dist/types/nodefony/src/migrator/DrizzleMigrator.d.ts +4 -4
- package/dist/types/nodefony/src/migrator/appSchema.d.ts +25 -0
- package/dist/types/nodefony/src/migrator/destructive.d.ts +1 -1
- package/dist/types/nodefony/src/migrator/drivers/index.d.ts +2 -2
- package/dist/types/nodefony/src/migrator/explain.d.ts +9 -9
- package/dist/types/nodefony/src/migrator/kit.d.ts +15 -0
- package/dist/types/nodefony/src/migrator/name.d.ts +1 -1
- package/dist/types/nodefony/src/migrator/paths.d.ts +35 -0
- package/dist/types/nodefony/src/migrator/refusals.d.ts +36 -1
- package/dist/types/nodefony/src/migrator/resolve.d.ts +44 -1
- package/dist/types/nodefony/src/migrator/types.d.ts +2 -2
- package/dist/types/nodefony/src/orm-core/DrizzleOrm.d.ts +13 -2
- package/dist/types/nodefony/src/orm-core/DrizzleRepository.d.ts +1 -1
- package/dist/types/nodefony/src/orm-core/ddlPlan.d.ts +2 -2
- package/dist/types/nodefony/src/queryKit.d.ts +9 -9
- package/dist/types/nodefony/src/safeTarget.d.ts +2 -2
- package/docs/index.md +31 -28
- package/docs/migrations.md +39 -3
- package/package.json +19 -20
package/docs/migrations.md
CHANGED
|
@@ -80,7 +80,7 @@ D'où **trois modes**, un par connecteur, réglés par la clé `ddl` :
|
|
|
80
80
|
|
|
81
81
|
## 🚀 Démarrage rapide
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
Six verbes, et un seul à retenir pour le quotidien du développement.
|
|
84
84
|
|
|
85
85
|
```bash
|
|
86
86
|
# Ce que la base a reçu, ce qui reste, et ce qu'il faut taper. N'écrit rien.
|
|
@@ -117,6 +117,34 @@ Toutes acceptent `--connector <nom>` (défaut : `default`) et `--json`. Le flux
|
|
|
117
117
|
Les migrations du **framework** sont livrées dans le paquet : vous n'avez pas à les produire. Celles
|
|
118
118
|
de votre **application**, vous les écrivez avec `orm:generate` — voir la section suivante.
|
|
119
119
|
|
|
120
|
+
Ces deux familles de migrations appartiennent au **seul connecteur `default`**, celui qui porte les
|
|
121
|
+
briques du framework : le dossier `migrations/<dialecte>` décrit sa base, et aucune autre.
|
|
122
|
+
|
|
123
|
+
Un **connecteur secondaire** (une base d'analyse, la base d'un module, un second PostgreSQL) a ses
|
|
124
|
+
**propres** migrations, dans son sous-dossier :
|
|
125
|
+
|
|
126
|
+
```text
|
|
127
|
+
migrations/
|
|
128
|
+
├── sqlite/ ← connecteur « default » (framework + application)
|
|
129
|
+
└── analytics/
|
|
130
|
+
└── postgres/ ← connecteur « analytics », et lui seul
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
nodefony orm:generate --connector analytics --name init # écrit sous migrations/analytics/<dialecte>
|
|
135
|
+
nodefony orm:migrate --connector analytics # l'applique à la base d'« analytics »
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
Chaque base ne reçoit que son dossier : `default` ne voit pas les migrations d'`analytics`, et
|
|
139
|
+
inversement. `orm:generate --connector analytics` ne décrit que les tables des entités déclarées sur
|
|
140
|
+
ce connecteur (`@entity({ connector: "analytics" })`) ; une table qu'aucune entité ne réclame reste
|
|
141
|
+
à `default`. Tant qu'un secondaire n'a rien versionné, rien ne change : en développement son schéma
|
|
142
|
+
est dérivé du code. Dès son premier fichier, il bascule en `migrate` comme `default`.
|
|
143
|
+
|
|
144
|
+
Un connecteur secondaire ne peut pas s'appeler `sqlite`, `postgres`, `mysql` ni `meta` : son dossier
|
|
145
|
+
serait celui d'un dialecte de `default`. Les commandes qui écriraient une migration le refusent
|
|
146
|
+
(`NF_MIGRATE_SECONDARY_CONNECTOR`) — renommez le connecteur, son nom ne sert qu'à le désigner.
|
|
147
|
+
|
|
120
148
|
Côté configuration, il n'y a rien à écrire pour le cas courant : le mode se résout par
|
|
121
149
|
environnement. Ne le déclarer que pour s'en écarter — un serveur unique qui migre au démarrage :
|
|
122
150
|
|
|
@@ -224,6 +252,14 @@ dépendances de développement (`--omit=dev`, une image de production). Le refus
|
|
|
224
252
|
geste ; il ne parle pas de votre base, qui n'y est pour rien — appliquer des migrations, lui, ne
|
|
225
253
|
réclame aucun outil tiers.
|
|
226
254
|
|
|
255
|
+
Un cinquième tient à la forme d'un fichier d'entité : **un `await` de premier niveau**
|
|
256
|
+
(`NF_GENERATE_TOP_LEVEL_AWAIT`). Votre application est ESM et démarre très bien avec lui, mais
|
|
257
|
+
l'outil qui écrit les migrations relit les fichiers de schéma de son côté, en CommonJS, où cette
|
|
258
|
+
construction n'existe pas. Le refus nomme le fichier et la ligne. Un fichier d'entité **déclare**
|
|
259
|
+
une table : ce qui se décide à l'exécution — choisir une entité selon l'infrastructure, importer
|
|
260
|
+
un module à la demande — se place dans l'`index.ts` du module, dont `@entities([...])` accepte une
|
|
261
|
+
liste calculée.
|
|
262
|
+
|
|
227
263
|
### Une entité qui pointe vers une table du framework
|
|
228
264
|
|
|
229
265
|
Déclarer une référence vers une table du framework (`session`, `audit_event`…) est légitime : ce
|
|
@@ -390,7 +426,7 @@ Trois propriétés en découlent, et elles valent d'être nommées :
|
|
|
390
426
|
- **Rien n'est appliqué deux fois.** L'historique (`nodefony_migrations`, `types.ts:23`) est écrit
|
|
391
427
|
dans la même transaction que le DDL, là où le moteur le permet.
|
|
392
428
|
- **Un pod en retard ne reçoit pas de trafic.** En `none` comme en `migrate`, l'état du schéma est
|
|
393
|
-
publié à la sonde de disponibilité (`#publishReadiness()`, `DrizzleService.ts:
|
|
429
|
+
publié à la sonde de disponibilité (`#publishReadiness()`, `DrizzleService.ts:557`) : `/readyz`
|
|
394
430
|
répond 503, l'orchestrateur sort l'exemplaire du répartiteur de charge, et l'ancien continue de
|
|
395
431
|
servir. `/livez` n'est jamais touché — un schéma en retard n'est pas un processus malade, et le
|
|
396
432
|
redémarrer ne réparerait rien. La vérification est rejouée toutes les 15 secondes : dès que le
|
|
@@ -454,7 +490,7 @@ qui la prend. Un outil qui prétendrait la préparer tout seul inviterait à ne
|
|
|
454
490
|
Ce que l'outil fait à la place, et qui vaut mieux :
|
|
455
491
|
|
|
456
492
|
- **il refuse d'appliquer sans que vous sachiez.** Le SQL en attente est examiné avant la moindre
|
|
457
|
-
écriture (`scanDestructive()`, `destructive.ts:
|
|
493
|
+
écriture (`scanDestructive()`, `destructive.ts:282`) : une suppression de données est refusée hors
|
|
458
494
|
développement, en nommant l'instruction et ce qui disparaît. Il faut `--allow-destructive` pour
|
|
459
495
|
passer outre, et **au démarrage il n'y a aucun drapeau pour lever le refus** — un exemplaire qui
|
|
460
496
|
redémarre ne supprime jamais de colonne de lui-même, parce que personne ne regarde à ce
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nodefony/drizzle",
|
|
3
|
-
"version": "10.0.0-
|
|
3
|
+
"version": "10.0.0-beta.1",
|
|
4
4
|
"description": "Moteur SQL de Nodefony sur Drizzle ORM (SQLite, PostgreSQL, MySQL) : dépôts typés, migrations de schéma et adoption d'une base existante",
|
|
5
5
|
"nodefony": {
|
|
6
6
|
"storeKind": "durable",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
},
|
|
29
29
|
"scripts": {
|
|
30
30
|
"start": "node dist/index.js",
|
|
31
|
-
"build": "
|
|
32
|
-
"clean": "
|
|
31
|
+
"build": "rolldown -c rolldown.config.ts && tsgo -p tsconfig.declarations.json",
|
|
32
|
+
"clean": "node --eval \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
33
33
|
"generate:migrations": "tsx scripts/generate-migrations.ts",
|
|
34
34
|
"check:migrations": "tsx scripts/check-migrations-drift.ts",
|
|
35
35
|
"dev": "rolldown -c rolldown.config.ts --watch",
|
|
@@ -55,35 +55,34 @@
|
|
|
55
55
|
"esm"
|
|
56
56
|
],
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"drizzle-orm": "0.45.
|
|
58
|
+
"drizzle-orm": "0.45.3",
|
|
59
59
|
"tslib": "2.8.1",
|
|
60
60
|
"zod": "^4.6.5"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
|
-
"@nodefony/framework": "^10.0.0-
|
|
64
|
-
"@nodefony/http": "^10.0.0-
|
|
65
|
-
"@nodefony/orm-core": "^10.0.0-
|
|
66
|
-
"@nodefony/security": "^10.0.0-
|
|
67
|
-
"@nodefony/user": "^10.0.0-
|
|
63
|
+
"@nodefony/framework": "^10.0.0-beta.1",
|
|
64
|
+
"@nodefony/http": "^10.0.0-beta.1",
|
|
65
|
+
"@nodefony/orm-core": "^10.0.0-beta.1",
|
|
66
|
+
"@nodefony/security": "^10.0.0-beta.1",
|
|
67
|
+
"@nodefony/user": "^10.0.0-beta.1",
|
|
68
68
|
"@types/better-sqlite3": "9.6.0",
|
|
69
|
-
"@types/node": "26.6.
|
|
69
|
+
"@types/node": "26.6.3",
|
|
70
70
|
"@types/pg": "8.23.1",
|
|
71
71
|
"better-sqlite3": "13.0.3",
|
|
72
|
-
"drizzle-kit": "0.31.
|
|
72
|
+
"drizzle-kit": "0.31.11",
|
|
73
73
|
"mysql2": "3.24.4",
|
|
74
|
-
"nodefony": "^10.0.0-
|
|
75
|
-
"pg": "8.23.0"
|
|
76
|
-
"rimraf": "6.1.3"
|
|
74
|
+
"nodefony": "^10.0.0-beta.1",
|
|
75
|
+
"pg": "8.23.0"
|
|
77
76
|
},
|
|
78
77
|
"peerDependencies": {
|
|
79
|
-
"@nodefony/framework": "^10.0.0-
|
|
80
|
-
"@nodefony/http": "^10.0.0-
|
|
81
|
-
"@nodefony/orm-core": "^10.0.0-
|
|
82
|
-
"@nodefony/security": "^10.0.0-
|
|
83
|
-
"@nodefony/user": "^10.0.0-
|
|
78
|
+
"@nodefony/framework": "^10.0.0-beta.1",
|
|
79
|
+
"@nodefony/http": "^10.0.0-beta.1",
|
|
80
|
+
"@nodefony/orm-core": "^10.0.0-beta.1",
|
|
81
|
+
"@nodefony/security": "^10.0.0-beta.1",
|
|
82
|
+
"@nodefony/user": "^10.0.0-beta.1",
|
|
84
83
|
"better-sqlite3": "^13.0.0",
|
|
85
84
|
"mysql2": "^3.24.0",
|
|
86
|
-
"nodefony": "^10.0.0-
|
|
85
|
+
"nodefony": "^10.0.0-beta.1",
|
|
87
86
|
"pg": "^8.23.0"
|
|
88
87
|
},
|
|
89
88
|
"repository": {
|