@nodefony/drizzle 10.0.0-alpha.6 → 10.0.0-alpha.8
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 +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.149.0 → _@oxc-project_runtime@0.150.0}/helpers/esm/decorate.js +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.149.0 → _@oxc-project_runtime@0.150.0}/helpers/esm/decorateMetadata.js +1 -1
- package/dist/index.js +4 -3
- package/dist/nodefony/command/orm-generate.js +70 -6
- package/dist/nodefony/service/DrizzleService.js +2 -2
- package/dist/nodefony/src/migrator/DrizzleMigrator.js +17 -1
- package/dist/nodefony/src/migrator/destructive.js +78 -19
- package/dist/nodefony/src/migrator/explain.js +42 -1
- package/dist/nodefony/src/migrator/kit.js +5 -0
- package/dist/nodefony/src/migrator/resolve.js +74 -4
- package/dist/nodefony/src/orm-core/DrizzleOrm.js +121 -21
- package/dist/nodefony/src/orm-core/ddlPlan.js +95 -0
- package/dist/nodefony/src/orm-core/index.js +2 -1
- package/dist/nodefony/src/orm-core/seedRow.js +65 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/nodefony/command/orm-generate.d.ts +12 -0
- package/dist/types/nodefony/src/migrator/destructive.d.ts +36 -0
- package/dist/types/nodefony/src/migrator/explain.d.ts +19 -0
- package/dist/types/nodefony/src/migrator/resolve.d.ts +54 -1
- package/dist/types/nodefony/src/orm-core/ddlPlan.d.ts +96 -0
- package/dist/types/nodefony/src/orm-core/index.d.ts +1 -0
- package/dist/types/nodefony/src/orm-core/seedRow.d.ts +23 -0
- package/docs/migrations.md +30 -1
- package/package.json +15 -15
|
@@ -9,3 +9,4 @@ export type { DrizzleOrmOptions } from "./DrizzleOrm.js";
|
|
|
9
9
|
export { DrizzleRepository } from "./DrizzleRepository.js";
|
|
10
10
|
export type { DrizzleDb, DrizzleTable, DrizzleColumn, DrizzleResolvedRelation, } from "./DrizzleRepository.js";
|
|
11
11
|
export { DrizzleTransaction } from "./DrizzleTransaction.js";
|
|
12
|
+
export { seedEntityRow } from "./seedRow.js";
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { IEntity } from "@nodefony/orm-core";
|
|
2
|
+
import type { DrizzleOrm } from "./DrizzleOrm.js";
|
|
3
|
+
/**
|
|
4
|
+
* Insère une ligne minimale dans la table d'une entité, et rend son identifiant.
|
|
5
|
+
*
|
|
6
|
+
* Destiné aux **tests** : dès qu'une entité porte une relation (`author:ref:Author`),
|
|
7
|
+
* sa colonne est une vraie clé étrangère, et la base REFUSE un identifiant
|
|
8
|
+
* inventé. La ligne parente doit donc exister avant toute insertion — et c'est
|
|
9
|
+
* la seule façon d'éprouver la contrainte au lieu de la contourner (débrancher
|
|
10
|
+
* `foreign_keys` rendrait le test vert sans rien prouver).
|
|
11
|
+
*
|
|
12
|
+
* Ce qui est rempli : les colonnes **obligatoires sans valeur par défaut**, avec
|
|
13
|
+
* une valeur du type que Drizzle déclare. Le reste est laissé au schéma — une
|
|
14
|
+
* clé primaire auto-générée, un horodatage, un défaut applicatif se posent seuls.
|
|
15
|
+
*
|
|
16
|
+
* @param orm - la connexion sur laquelle semer.
|
|
17
|
+
* @param entity - l'entité cible ; son `schema` est la table Drizzle.
|
|
18
|
+
* @returns l'identifiant de la ligne créée, à poser dans la colonne qui la désigne.
|
|
19
|
+
* @throws Si la cible porte elle-même une clé étrangère obligatoire — le semis à
|
|
20
|
+
* un seul étage ne sait pas la satisfaire, et le message le dit plutôt que de
|
|
21
|
+
* laisser remonter un « FOREIGN KEY constraint failed » sans contexte.
|
|
22
|
+
*/
|
|
23
|
+
export declare function seedEntityRow(orm: DrizzleOrm, entity: IEntity): Promise<string | number>;
|
package/docs/migrations.md
CHANGED
|
@@ -162,6 +162,34 @@ Le dialecte est celui de votre connecteur : vos entités sont du Drizzle **natif
|
|
|
162
162
|
un moteur. C'est ce qui vous laisse toute la puissance du moteur dans une entité — et ce qui fait
|
|
163
163
|
qu'une migration vaut pour lui seul.
|
|
164
164
|
|
|
165
|
+
### En développement : écrire et appliquer d'un seul geste — `--apply`
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
nodefony orm:generate --name ajout_du_titre --apply
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Vous éditez votre entité, vous tapez **une** commande, la colonne est en base. C'est le geste
|
|
172
|
+
quotidien du développement, et il ne vous demande pas de retenir un second verbe.
|
|
173
|
+
|
|
174
|
+
`--apply` n'invente rien : il **enchaîne `orm:migrate`**. Toutes ses gardes valent donc à
|
|
175
|
+
l'identique — une migration qui supprime des données reste refusée sans `--allow-destructive`, le
|
|
176
|
+
verrou est pris, l'historique est écrit. En sortie machine (`--json`), un seul document est produit,
|
|
177
|
+
celui de l'application : c'est lui qui porte le verdict.
|
|
178
|
+
|
|
179
|
+
> **Le drapeau n'existe qu'en développement**, et aucun autre drapeau ne le déverrouille. Écrire une
|
|
180
|
+
> migration et l'appliquer dans le même souffle suppose qu'on relit le SQL produit entre les deux —
|
|
181
|
+
> ce que personne ne fait sur un serveur. Ailleurs, la migration a été écrite, relue et versionnée
|
|
182
|
+
> ailleurs : c'est `orm:migrate` qui l'applique, et lui seul.
|
|
183
|
+
|
|
184
|
+
> **Et le mode de schéma bascule tout seul.** Dès que votre application versionne sa première
|
|
185
|
+
> migration, le démarrage cesse de dériver les tables depuis le code (`ddl: "auto"`) et applique vos
|
|
186
|
+
> migrations (`ddl: "migrate"`) — même en développement. Deux fabricants du même schéma ne
|
|
187
|
+
> s'accordent pas : le DDL dérivé pose une unicité **collée à la colonne** (`content text NOT NULL
|
|
188
|
+
UNIQUE`), le générateur de migrations raisonne sur un **index nommé** (`messages_content_unique`),
|
|
189
|
+
> et la première migration qui tente de retirer la seconde échoue sur un objet qui n'a jamais existé.
|
|
190
|
+
> Un `ddl` écrit dans votre configuration gagne toujours ; et sous `NODE_ENV=test`, rien ne change
|
|
191
|
+
> (une suite lance un exemplaire par worker, et ses bases partent vides).
|
|
192
|
+
|
|
165
193
|
### Ce que la commande refuse, et pourquoi c'est une bonne nouvelle
|
|
166
194
|
|
|
167
195
|
**Une migration est immuable dès qu'une base l'a reçue.** Une migration à laquelle il manque une
|
|
@@ -201,7 +229,8 @@ réclame aucun outil tiers.
|
|
|
201
229
|
Déclarer une référence vers une table du framework (`session`, `audit_event`…) est légitime : ce
|
|
202
230
|
qui est refusé, c'est de **ré-exporter** cette table depuis vos fichiers. Les tables du framework
|
|
203
231
|
sont exclues du plan de votre application — elles ont leurs propres migrations, appliquées avant les
|
|
204
|
-
vôtres.
|
|
232
|
+
vôtres. La contrainte, elle, est bien écrite dans votre migration : elle désigne une table que le
|
|
233
|
+
framework a déjà créée.
|
|
205
234
|
|
|
206
235
|
> [!IMPORTANT]
|
|
207
236
|
> **`User` n'en fait PAS partie.** L'identité est du domaine : la table `User` appartient à votre
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nodefony/drizzle",
|
|
3
|
-
"version": "10.0.0-alpha.
|
|
3
|
+
"version": "10.0.0-alpha.8",
|
|
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",
|
|
@@ -57,33 +57,33 @@
|
|
|
57
57
|
"dependencies": {
|
|
58
58
|
"drizzle-orm": "0.45.2",
|
|
59
59
|
"tslib": "2.8.1",
|
|
60
|
-
"zod": "^4.6.
|
|
60
|
+
"zod": "^4.6.5"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
|
-
"@nodefony/framework": "^10.0.0-alpha.
|
|
64
|
-
"@nodefony/http": "^10.0.0-alpha.
|
|
65
|
-
"@nodefony/orm-core": "^10.0.0-alpha.
|
|
66
|
-
"@nodefony/security": "^10.0.0-alpha.
|
|
67
|
-
"@nodefony/user": "^10.0.0-alpha.
|
|
63
|
+
"@nodefony/framework": "^10.0.0-alpha.8",
|
|
64
|
+
"@nodefony/http": "^10.0.0-alpha.8",
|
|
65
|
+
"@nodefony/orm-core": "^10.0.0-alpha.8",
|
|
66
|
+
"@nodefony/security": "^10.0.0-alpha.8",
|
|
67
|
+
"@nodefony/user": "^10.0.0-alpha.8",
|
|
68
68
|
"@types/better-sqlite3": "9.6.0",
|
|
69
|
-
"@types/node": "26.
|
|
69
|
+
"@types/node": "26.6.2",
|
|
70
70
|
"@types/pg": "8.23.1",
|
|
71
71
|
"better-sqlite3": "13.0.3",
|
|
72
72
|
"drizzle-kit": "0.31.10",
|
|
73
73
|
"mysql2": "3.24.4",
|
|
74
|
-
"nodefony": "^10.0.0-alpha.
|
|
74
|
+
"nodefony": "^10.0.0-alpha.8",
|
|
75
75
|
"pg": "8.23.0",
|
|
76
76
|
"rimraf": "6.1.3"
|
|
77
77
|
},
|
|
78
78
|
"peerDependencies": {
|
|
79
|
-
"@nodefony/framework": "^10.0.0-alpha.
|
|
80
|
-
"@nodefony/http": "^10.0.0-alpha.
|
|
81
|
-
"@nodefony/orm-core": "^10.0.0-alpha.
|
|
82
|
-
"@nodefony/security": "^10.0.0-alpha.
|
|
83
|
-
"@nodefony/user": "^10.0.0-alpha.
|
|
79
|
+
"@nodefony/framework": "^10.0.0-alpha.8",
|
|
80
|
+
"@nodefony/http": "^10.0.0-alpha.8",
|
|
81
|
+
"@nodefony/orm-core": "^10.0.0-alpha.8",
|
|
82
|
+
"@nodefony/security": "^10.0.0-alpha.8",
|
|
83
|
+
"@nodefony/user": "^10.0.0-alpha.8",
|
|
84
84
|
"better-sqlite3": "^13.0.0",
|
|
85
85
|
"mysql2": "^3.24.0",
|
|
86
|
-
"nodefony": "^10.0.0-alpha.
|
|
86
|
+
"nodefony": "^10.0.0-alpha.8",
|
|
87
87
|
"pg": "^8.23.0"
|
|
88
88
|
},
|
|
89
89
|
"repository": {
|