@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.
Files changed (75) hide show
  1. package/README.md +19 -19
  2. package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/decorate.js +1 -1
  3. package/dist/_virtual/{_@oxc-project_runtime@0.150.0 → _@oxc-project_runtime@0.151.0}/helpers/esm/decorateMetadata.js +1 -1
  4. package/dist/index.js +9 -6
  5. package/dist/nodefony/command/migrateShared.js +17 -1
  6. package/dist/nodefony/command/orm-generate.js +14 -10
  7. package/dist/nodefony/command/orm-migrate-baseline.js +5 -2
  8. package/dist/nodefony/command/orm-reset.js +1 -0
  9. package/dist/nodefony/config/defineModuleConfig.js +23 -7
  10. package/dist/nodefony/entity/userTable.js +4 -1
  11. package/dist/nodefony/registerStores.js +4 -28
  12. package/dist/nodefony/service/DrizzleService.js +42 -16
  13. package/dist/nodefony/src/DrizzleAuditStore.js +14 -2
  14. package/dist/nodefony/src/DrizzleIdempotencyStore.js +14 -2
  15. package/dist/nodefony/src/DrizzleTokenStore.js +13 -1
  16. package/dist/nodefony/src/DrizzleTotpSecretStore.js +13 -1
  17. package/dist/nodefony/src/DrizzleWebAuthnCredentialStore.js +13 -1
  18. package/dist/nodefony/src/DrizzleWebhookStore.js +13 -1
  19. package/dist/nodefony/src/SessionStorage.js +8 -0
  20. package/dist/nodefony/src/connectorTarget.js +1 -1
  21. package/dist/nodefony/src/frameworkConnector.js +29 -0
  22. package/dist/nodefony/src/memoryDatabase.js +13 -0
  23. package/dist/nodefony/src/migrator/DrizzleMigrator.js +3 -3
  24. package/dist/nodefony/src/migrator/adopt.js +1 -1
  25. package/dist/nodefony/src/migrator/appSchema.js +44 -1
  26. package/dist/nodefony/src/migrator/destructive.js +2 -3
  27. package/dist/nodefony/src/migrator/drivers/mysqlDriver.js +1 -1
  28. package/dist/nodefony/src/migrator/drivers/postgresDriver.js +1 -1
  29. package/dist/nodefony/src/migrator/drivers/sqliteDriver.js +1 -0
  30. package/dist/nodefony/src/migrator/explain.js +7 -10
  31. package/dist/nodefony/src/migrator/history.js +25 -2
  32. package/dist/nodefony/src/migrator/kit.js +41 -6
  33. package/dist/nodefony/src/migrator/paths.js +55 -1
  34. package/dist/nodefony/src/migrator/rebuildCopy.js +6 -6
  35. package/dist/nodefony/src/migrator/refusals.js +50 -1
  36. package/dist/nodefony/src/migrator/resolve.js +59 -9
  37. package/dist/nodefony/src/migrator/sources.js +13 -8
  38. package/dist/nodefony/src/orm-core/DrizzleOrm.js +51 -30
  39. package/dist/nodefony/src/orm-core/DrizzleRepository.js +38 -26
  40. package/dist/nodefony/src/queryKit.js +5 -5
  41. package/dist/nodefony/src/safeTarget.js +1 -0
  42. package/dist/types/nodefony/command/migrateShared.d.ts +10 -0
  43. package/dist/types/nodefony/config/defineModuleConfig.d.ts +5 -1
  44. package/dist/types/nodefony/entity/userTable.d.ts +46 -3
  45. package/dist/types/nodefony/registerStores.d.ts +4 -3
  46. package/dist/types/nodefony/src/DrizzleAuditStore.d.ts +6 -0
  47. package/dist/types/nodefony/src/DrizzleIdempotencyStore.d.ts +8 -1
  48. package/dist/types/nodefony/src/DrizzleTokenStore.d.ts +6 -0
  49. package/dist/types/nodefony/src/DrizzleTotpSecretStore.d.ts +6 -0
  50. package/dist/types/nodefony/src/DrizzleUserRepository.d.ts +1 -1
  51. package/dist/types/nodefony/src/DrizzleWebAuthnCredentialStore.d.ts +6 -0
  52. package/dist/types/nodefony/src/DrizzleWebhookStore.d.ts +6 -0
  53. package/dist/types/nodefony/src/SessionStorage.d.ts +6 -0
  54. package/dist/types/nodefony/src/connectorTarget.d.ts +1 -1
  55. package/dist/types/nodefony/src/frameworkConnector.d.ts +24 -0
  56. package/dist/types/nodefony/src/memoryDatabase.d.ts +10 -0
  57. package/dist/types/nodefony/src/migrator/DrizzleMigrator.d.ts +4 -4
  58. package/dist/types/nodefony/src/migrator/appSchema.d.ts +25 -0
  59. package/dist/types/nodefony/src/migrator/destructive.d.ts +1 -1
  60. package/dist/types/nodefony/src/migrator/drivers/index.d.ts +2 -2
  61. package/dist/types/nodefony/src/migrator/explain.d.ts +9 -9
  62. package/dist/types/nodefony/src/migrator/kit.d.ts +15 -0
  63. package/dist/types/nodefony/src/migrator/name.d.ts +1 -1
  64. package/dist/types/nodefony/src/migrator/paths.d.ts +35 -0
  65. package/dist/types/nodefony/src/migrator/refusals.d.ts +36 -1
  66. package/dist/types/nodefony/src/migrator/resolve.d.ts +44 -1
  67. package/dist/types/nodefony/src/migrator/types.d.ts +2 -2
  68. package/dist/types/nodefony/src/orm-core/DrizzleOrm.d.ts +13 -2
  69. package/dist/types/nodefony/src/orm-core/DrizzleRepository.d.ts +1 -1
  70. package/dist/types/nodefony/src/orm-core/ddlPlan.d.ts +2 -2
  71. package/dist/types/nodefony/src/queryKit.d.ts +9 -9
  72. package/dist/types/nodefony/src/safeTarget.d.ts +2 -2
  73. package/docs/index.md +31 -28
  74. package/docs/migrations.md +39 -3
  75. package/package.json +19 -20
@@ -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
- Cinq verbes, et un seul à retenir pour le quotidien du développement.
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:445`) : `/readyz`
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:184`) : une suppression de données est refusée hors
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-alpha.8",
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": "rimraf dist && rolldown -c rolldown.config.ts && tsgo -p tsconfig.declarations.json",
32
- "clean": "rimraf dist",
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.2",
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-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",
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.2",
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.10",
72
+ "drizzle-kit": "0.31.11",
73
73
  "mysql2": "3.24.4",
74
- "nodefony": "^10.0.0-alpha.8",
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-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",
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-alpha.8",
85
+ "nodefony": "^10.0.0-beta.1",
87
86
  "pg": "^8.23.0"
88
87
  },
89
88
  "repository": {