@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.
@@ -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>;
@@ -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. Pour une vraie clé étrangère SQL, écrivez une migration libre.
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.6",
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.1"
60
+ "zod": "^4.6.5"
61
61
  },
62
62
  "devDependencies": {
63
- "@nodefony/framework": "^10.0.0-alpha.6",
64
- "@nodefony/http": "^10.0.0-alpha.6",
65
- "@nodefony/orm-core": "^10.0.0-alpha.6",
66
- "@nodefony/security": "^10.0.0-alpha.6",
67
- "@nodefony/user": "^10.0.0-alpha.6",
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.5.1",
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.6",
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.6",
80
- "@nodefony/http": "^10.0.0-alpha.6",
81
- "@nodefony/orm-core": "^10.0.0-alpha.6",
82
- "@nodefony/security": "^10.0.0-alpha.6",
83
- "@nodefony/user": "^10.0.0-alpha.6",
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.6",
86
+ "nodefony": "^10.0.0-alpha.8",
87
87
  "pg": "^8.23.0"
88
88
  },
89
89
  "repository": {