@nodefony/mongoose 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 (44) hide show
  1. package/README.md +32 -0
  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 +13 -7
  5. package/dist/nodefony/config/defineModuleConfig.js +4 -3
  6. package/dist/nodefony/entity/auditEventEntity.js +124 -0
  7. package/dist/nodefony/entity/idempotencyEntity.js +96 -0
  8. package/dist/nodefony/entity/sessionEntity.js +1 -1
  9. package/dist/nodefony/entity/totpSecretEntity.js +103 -0
  10. package/dist/nodefony/registerStores.js +42 -5
  11. package/dist/nodefony/service/MongooseService.js +15 -5
  12. package/dist/nodefony/src/MongooseAuditStore.js +215 -0
  13. package/dist/nodefony/src/MongooseIdempotencyStore.js +264 -0
  14. package/dist/nodefony/src/MongooseTokenStore.js +60 -17
  15. package/dist/nodefony/src/MongooseTotpSecretStore.js +151 -0
  16. package/dist/nodefony/src/MongooseUserRepository.js +1 -1
  17. package/dist/nodefony/src/MongooseWebAuthnCredentialStore.js +13 -1
  18. package/dist/nodefony/src/MongooseWebhookStore.js +14 -2
  19. package/dist/nodefony/src/SessionStorage.js +8 -0
  20. package/dist/nodefony/src/orm-core/MongooseOrm.js +68 -22
  21. package/dist/nodefony/src/orm-core/MongooseRepository.js +147 -25
  22. package/dist/nodefony/src/orm-core/MongooseTransaction.js +19 -6
  23. package/dist/nodefony/src/writeCount.js +17 -0
  24. package/dist/types/index.d.ts +9 -0
  25. package/dist/types/nodefony/entity/auditEventEntity.d.ts +76 -0
  26. package/dist/types/nodefony/entity/idempotencyEntity.d.ts +75 -0
  27. package/dist/types/nodefony/entity/totpSecretEntity.d.ts +75 -0
  28. package/dist/types/nodefony/registerStores.d.ts +6 -3
  29. package/dist/types/nodefony/service/MongooseService.d.ts +2 -2
  30. package/dist/types/nodefony/src/MongooseAuditStore.d.ts +70 -0
  31. package/dist/types/nodefony/src/MongooseIdempotencyStore.d.ts +121 -0
  32. package/dist/types/nodefony/src/MongooseTokenStore.d.ts +8 -1
  33. package/dist/types/nodefony/src/MongooseTotpSecretStore.d.ts +63 -0
  34. package/dist/types/nodefony/src/MongooseUserRepository.d.ts +1 -1
  35. package/dist/types/nodefony/src/MongooseWebAuthnCredentialStore.d.ts +6 -0
  36. package/dist/types/nodefony/src/MongooseWebhookStore.d.ts +6 -0
  37. package/dist/types/nodefony/src/SessionStorage.d.ts +6 -0
  38. package/dist/types/nodefony/src/orm-core/MongooseOrm.d.ts +10 -3
  39. package/dist/types/nodefony/src/orm-core/MongooseRepository.d.ts +22 -1
  40. package/dist/types/nodefony/src/orm-core/MongooseTransaction.d.ts +12 -4
  41. package/dist/types/nodefony/src/writeCount.d.ts +12 -0
  42. package/docs/configuration.md +27 -27
  43. package/docs/index.md +133 -82
  44. package/package.json +23 -19
@@ -105,7 +105,7 @@ mêmes noms partout — pour qu'on ne se pose jamais la question de savoir où r
105
105
  | `nodefony/config/config.ts` | **Le QUOI** | Le schéma Zod commenté, source unique des défauts, et le type TS qui en dérive |
106
106
  | `nodefony/config/defineModuleConfig.ts` | **Le COMMENT** | Le builder : valide → applique l'environnement → gèle. Plus le JSON Schema. |
107
107
 
108
- Le schéma (`mongooseConfigSchema` (`config.ts:83`)) porte les valeurs d'usine sous forme de
108
+ Le schéma (`mongooseConfigSchema` (`config.ts:98`)) porte les valeurs d'usine sous forme de
109
109
  `.default(…)`, et chaque champ son `.describe(…)`. Les défauts effectifs du module ne sont pas
110
110
  retapés à la main : ils sont **matérialisés depuis le schéma lui-même**
111
111
  (`mongooseConfigSchema.parse({})` (`config.ts:122`)). Changer un défaut = changer le `.default()`,
@@ -134,11 +134,11 @@ qui collisionnerait à l'import). Trois écarts réels, tous **assumés et véri
134
134
  Ce n'est pas de la fantaisie : les entités sont indexées par `(connecteur, nom)` dans un registre
135
135
  **global au processus**, donc deux drivers avec le même nom de connecteur feraient collision sur
136
136
  leurs entités `session` homonymes. Un nom distinct règle le problème par construction
137
- (`FRAMEWORK_CONNECTOR` (`registerStores.ts:49`)).
137
+ (`FRAMEWORK_CONNECTOR` (`registerStores.ts:77`)).
138
138
  2. **Mongoose expose deux variables dédiées** (`MONGODB_URI`, `NF_MONGODB_DEBUG`) là où Drizzle ne lit
139
139
  que l'infra déclarée. C'est un héritage de convention du driver Mongo, conservé parce qu'il est
140
140
  universellement connu — mais l'infra déclarée reste le chemin recommandé.
141
- 3. **`options` n'est pas re-modélisé** (`options` (`config.ts:71`)) : c'est un dictionnaire libre
141
+ 3. **`options` n'est pas re-modélisé** (`options` (`config.ts:86`)) : c'est un dictionnaire libre
142
142
  passé tel quel à Mongoose. Re-décrire les dizaines de `ConnectOptions` en Zod produirait une
143
143
  deuxième vérité, condamnée à diverger de la bibliothèque à chaque version. Le prix à payer est
144
144
  assumé : une faute de frappe dans `options` n'est pas attrapée par Zod, elle l'est par Mongoose
@@ -232,7 +232,7 @@ export default defineConfig(() => ({
232
232
  ```
233
233
 
234
234
  Si `NF_DATABASE_URL` pointe déjà sur du `mongodb://`, tu peux laisser **tous** ces champs sur leur
235
- défaut `auto` : la résolution suit l'infra déclarée (`resolveAutoStore()` (`infra.ts:241`)) et
235
+ défaut `auto` : la résolution suit l'infra déclarée (`resolveAutoStore()` (`infra.ts:297`)) et
236
236
  journalise sa raison. Détail dans le hub, section
237
237
  [Ce qui se passe quand tu ne choisis rien](./index.md#ce-qui-se-passe-quand-tu-ne-choisis-rien).
238
238
 
@@ -260,14 +260,14 @@ Et six champs par connecteur :
260
260
 
261
261
  ### `connectors` — une ou plusieurs bases
262
262
 
263
- Chaque entrée de `connectors` (`config.ts:93`) devient une **connexion isolée** ouverte au démarrage,
263
+ Chaque entrée de `connectors` (`config.ts:108`) devient une **connexion isolée** ouverte au démarrage,
264
264
  puis un ORM inscrit sous ce nom. Deux entrées = deux connexions, deux ORM, deux jeux d'entités : c'est
265
265
  ainsi qu'une application lit une base métier et écrit dans une base d'archives sans les mélanger.
266
266
 
267
267
  L'adresse se donne de deux façons, jamais les deux à la fois utilement :
268
268
 
269
269
  - **En pièces détachées** — `host`, `port`, `dbname` : lisible, adapté au développement. Le service
270
- les assemble en `mongodb://hôte:port/base` (`MongooseService.buildUri()` (`MongooseService.ts:94`)).
270
+ les assemble en `mongodb://hôte:port/base` (`MongooseService.buildUri()` (`MongooseService.ts:117`)).
271
271
  - **En une URI** — `uri` (`config.ts:41`) : la seule forme capable d'exprimer un replica set, un
272
272
  `mongodb+srv`, des options de requête. **Dès qu'`uri` est présent, les trois autres champs ne sont
273
273
  plus lus du tout.**
@@ -287,15 +287,15 @@ publique** de ton application : le changer déplace des entités.
287
287
 
288
288
  > [!WARNING]
289
289
  > Le connecteur nommé `nodefony` a un statut particulier : c'est **lui** qui porte le schéma du
290
- > framework (`FRAMEWORK_CONNECTOR` (`registerStores.ts:49`)) et le stockage de session
290
+ > framework (`FRAMEWORK_CONNECTOR` (`registerStores.ts:77`)) et le stockage de session
291
291
  > (`SESSION_CONNECTOR` (`sessionEntity.ts:5`)). Le renommer ou le supprimer sans le remplacer casse
292
292
  > les stores framework — ils cherchent un ORM `nodefony` connecté et échouent franchement s'il manque
293
- > (`resolveConnectedOrm()` (`registerStores.ts:64`)).
293
+ > (`resolveConnectedOrm()` (`registerStores.ts:92`)).
294
294
 
295
295
  ### `options` — ce que Mongoose sait faire et Nodefony ne re-décrit pas
296
296
 
297
- `options` (`config.ts:71`) est transmis tel quel au driver
298
- (`MongooseService.#connectOne()` (`MongooseService.ts:87`)). On y met tout ce qui touche au
297
+ `options` (`config.ts:86`) est transmis tel quel au driver
298
+ (`MongooseService.#connectOne()` (`MongooseService.ts:156`)). On y met tout ce qui touche au
299
299
  **transport** plutôt qu'à l'adresse : taille du pool, délais, TLS, identifiants séparés.
300
300
 
301
301
  ```typescript
@@ -320,7 +320,7 @@ description des options du driver.
320
320
 
321
321
  ### `debug` — voir passer les requêtes
322
322
 
323
- `debug` (`config.ts:85`) active la trace intégrée de Mongoose (`connectAll()` (`MongooseService.ts:81`)).
323
+ `debug` (`config.ts:100`) active la trace intégrée de Mongoose (`connectAll()` (`MongooseService.ts:104`)).
324
324
  Chaque opération part sur la sortie standard, avec sa collection, son filtre et ses champs.
325
325
 
326
326
  C'est un **réglage de processus, pas de connecteur** : il vaut pour toutes les connexions à la fois.
@@ -330,7 +330,7 @@ détaillée dans la section [Observabilité](#-observabilité--studio).
330
330
 
331
331
  ### `frameworkEntities` — le module pose-t-il le schéma du framework ?
332
332
 
333
- C'est le champ le plus discret et le plus structurant (`frameworkEntities` (`config.ts:102`)). Sur son
333
+ C'est le champ le plus discret et le plus structurant (`frameworkEntities` (`config.ts:117`)). Sur son
334
334
  défaut `true`, le module fait deux choses de plus qu'ouvrir des connexions, dès son enregistrement et
335
335
  **avant** que la connexion ne s'ouvre (`Mongoose.onKernelRegister()` (`mongoose/index.ts:65`)) :
336
336
 
@@ -338,7 +338,7 @@ défaut `true`, le module fait deux choses de plus qu'ouvrir des connexions, dè
338
338
  pour que leurs modèles soient compilés au moment de la connexion ;
339
339
  2. il **enregistre les fabriques** correspondantes dans les registres de `@nodefony/security`, ce qui
340
340
  rend le nom `"mongoose"` sélectionnable dans `tokenStore`, `passkeys`, `webhooks`
341
- (`registerMongooseFrameworkStores()` (`registerStores.ts:94`)).
341
+ (`registerMongooseFrameworkStores()` (`registerStores.ts:126`)).
342
342
 
343
343
  Le passer à `false` transforme le module en **pur driver de données** : tes entités à toi, rien
344
344
  d'autre. Les stores framework Mongo deviennent alors introuvables — les sélectionner échoue
@@ -395,7 +395,7 @@ Trois précisions qui évitent les mauvaises surprises :
395
395
  ### L'override générique du framework
396
396
 
397
397
  Toute clé de config d'un module se surcharge par `NF__<MODULE>__<CHEMIN>`, le double tiret bas
398
- séparant les niveaux (`parseNfEnvOverrides()` (`envOverride.ts:80`)). Le segment de module est le nom
398
+ séparant les niveaux (`parseNfEnvOverrides()` (`envOverride.ts:92`)). Le segment de module est le nom
399
399
  court : `MONGOOSE`.
400
400
 
401
401
  ```bash
@@ -405,7 +405,7 @@ NF__MONGOOSE__CONNECTORS__NODEFONY__DBNAME=recette # champ imbriqué
405
405
  NF__MONGOOSE__CONNECTORS__NODEFONY__PORT=27018 # coercé en nombre
406
406
  ```
407
407
 
408
- Ces overrides sont posés **avant** la validation Zod (`Kernel.applyEnvConfigOverrides()` (`Kernel.ts:1708`)) :
408
+ Ces overrides sont posés **avant** la validation Zod (`Kernel.applyEnvConfigOverrides()` (`Kernel.ts:1895`)) :
409
409
  une valeur aberrante est donc rejetée comme si tu l'avais écrite dans ton fichier. C'est voulu — un
410
410
  réglage d'environnement invalide doit casser aussi fort qu'un réglage de code.
411
411
 
@@ -436,7 +436,7 @@ De la plus faible à la plus forte priorité :
436
436
 
437
437
  1. **Les défauts du schéma** — `localhost:27017/nodefony`, `debug: false`, `frameworkEntities: true`.
438
438
  2. **Ta config d'app** — `use("@nodefony/mongoose", { … })`, fusionnée en profondeur sous les défauts
439
- (`Kernel.loadModulesFromManifest()` (`Kernel.ts:1600`)).
439
+ (`Kernel.loadModulesFromManifest()` (`Kernel.ts:1714`)).
440
440
  3. **Un override venu d'un autre module** — la clé `module-mongoose` dans la config d'un module tiers.
441
441
  4. **`NF__MONGOOSE__…`** — l'override générique d'environnement.
442
442
  5. **La validation Zod** — types, bornes, défauts des champs restés absents.
@@ -549,9 +549,9 @@ use("@nodefony/mongoose", {
549
549
  ```
550
550
 
551
551
  Les deux connexions s'ouvrent en série au démarrage, dans l'ordre de déclaration
552
- (`connectAll()` (`MongooseService.ts:81`)), et se ferment toutes à l'arrêt
553
- (`disconnectAll()` (`MongooseService.ts:181`)). Un service peut demander l'une ou l'autre par son nom
554
- (`getOrm()` (`MongooseService.ts:189`)), mais l'usage courant reste le registre d'ORM.
552
+ (`connectAll()` (`MongooseService.ts:104`)), et se ferment toutes à l'arrêt
553
+ (`disconnectAll()` (`MongooseService.ts:210`)). Un service peut demander l'une ou l'autre par son nom
554
+ (`getOrm()` (`MongooseService.ts:218`)), mais l'usage courant reste le registre d'ORM.
555
555
 
556
556
  ## 🔐 Le secret de connexion
557
557
 
@@ -561,14 +561,14 @@ données d'un coup. La règle est donc sans nuance.
561
561
  - **Jamais dans le dépôt.** Ni dans `nodefony.config.ts`, ni dans un fichier d'exemple, ni « juste
562
562
  pour le développement ». Le secret arrive par `MONGODB_URI` ou `NF_DATABASE_URL`.
563
563
  - **Ni dans les journaux, ni dans Studio.** L'URI est systématiquement nettoyée de tout
564
- `utilisateur:motdepasse@` avant d'être affichée (`MongooseOrm.safeTarget()` (`MongooseOrm.ts:595`)),
564
+ `utilisateur:motdepasse@` avant d'être affichée (`MongooseOrm.safeTarget()` (`MongooseOrm.ts:688`)),
565
565
  y compris pour les URI multi-hôtes que l'analyseur d'URL standard ne sait pas découper. C'est cette
566
566
  cible nettoyée que voit le plan d'administration
567
- (`MongooseOrm.describeConnection()` (`MongooseOrm.ts:583`)) et le message de connexion au démarrage.
567
+ (`MongooseOrm.describeConnection()` (`MongooseOrm.ts:676`)) et le message de connexion au démarrage.
568
568
  - **Les identifiants passés par `options`** (`user`, `pass`) suivent la même règle : ils viennent de
569
569
  l'environnement, pas du fichier. Le framework rédige d'ailleurs la valeur de tout override
570
570
  d'environnement dont le chemin ressemble à un secret, avant de le journaliser
571
- (`pathLooksSecret()` (`envOverride.ts:375`)).
571
+ (`pathLooksSecret()` (`envOverride.ts:417`)).
572
572
 
573
573
  > [!TIP]
574
574
  > Vérifie ta redaction en une commande : démarre l'application et lis la ligne de connexion. Elle doit
@@ -653,7 +653,7 @@ Un port hors bornes, un type erroné, un champ vide : le démarrage s'arrête av
653
653
  le champ**, pas une pile d'appels.
654
654
 
655
655
  ```
656
- [@nodefony/mongoose] Invalid config: connectors.x.port: Too small: expected number to be >=1
656
+ [@nodefony/mongoose] configuration invalide — connectors.x.port : Too small: expected number to be >=1
657
657
  ```
658
658
 
659
659
  Le message est assemblé à partir des remontées de validation, chemin de champ compris
@@ -665,7 +665,7 @@ coûteux à diagnostiquer qu'un serveur qui refuse de démarrer.
665
665
 
666
666
  Le cas courant : la config est parfaite, mais Mongo n'est pas joignable — conteneur pas encore prêt,
667
667
  réseau coupé, identifiants périmés. Le comportement **dépend de l'environnement**, arbitré par la
668
- politique de boot du cœur (`Kernel.isBootErrorFatal()` (`Kernel.ts:2843`)) :
668
+ politique de boot du cœur (`Kernel.isBootErrorFatal()` (`Kernel.ts:3221`)) :
669
669
 
670
670
  | Environnement | Ce qui se passe |
671
671
  | ------------------- | -------------------------------------------------------------------------------------- |
@@ -688,7 +688,7 @@ tomber pour le relancer, et c'est le modèle cloud-native que le framework appli
688
688
 
689
689
  À l'arrêt, les connexions se ferment alors que des requêtes peuvent encore être en vol. Le stockage de
690
690
  session **dégrade gracieusement** plutôt que de lever une exception
691
- (`SessionStorage.#repo()` (`SessionStorage.ts:45`)) : une session non persistée le temps de l'arrêt
691
+ (`SessionStorage.#repo()` (`SessionStorage.ts:66`)) : une session non persistée le temps de l'arrêt
692
692
  vaut mieux qu'une erreur 500 et un rejet non capturé. À l'inverse, une entité absente sur un ORM
693
693
  **connecté** est une vraie erreur de configuration : celle-là est levée sans ménagement.
694
694
 
@@ -697,7 +697,7 @@ vaut mieux qu'une erreur 500 et un rejet non capturé. À l'inverse, une entité
697
697
  La configuration ne se contente pas d'être validée : elle se **montre**.
698
698
 
699
699
  - Le module publie son schéma en JSON Schema (`Mongoose.configSchema()` (`mongoose/index.ts:55`) →
700
- `mongooseConfigJsonSchema()` (`defineModuleConfig.ts:72`)). C'est ce qui permet à Studio d'afficher
700
+ `mongooseConfigJsonSchema()` (`defineModuleConfig.ts:78`)). C'est ce qui permet à Studio d'afficher
701
701
  chaque clé avec son type, son défaut et son texte d'aide — sans qu'une seule ligne de description
702
702
  soit recopiée quelque part.
703
703
  - L'écran `/nodefony/config` montre la configuration **effective** après toutes les couches, et la
@@ -718,7 +718,7 @@ frontière du plan d'administration.
718
718
  | `NF_DATABASE_URL` est bien posée, Mongo n'est pas utilisé | L'URL est de famille SQL : elle appartient à `@nodefony/drizzle` | Une URL `mongodb://`/`mongodb+srv://`, ou passer par `MONGODB_URI` |
719
719
  | Le démarrage échoue sur le schéma de l'URL | Schéma inconnu (`mongo://`, faute de frappe) — refus délibéré, jamais de repli | Corriger le schéma : `mongodb://` ou `mongodb+srv://` |
720
720
  | `Transaction numbers are only allowed on a replica set…` | Serveur isolé : pas de transactions | Un replica set, même à un nœud (`?replicaSet=rs0&directConnection=true`) |
721
- | `ORM "nodefony" introuvable` au montage d'un store | `@nodefony/security` chargé **avant** `@nodefony/mongoose` | Placer le driver **avant** dans `modules` (`resolveConnectedOrm()` (`registerStores.ts:64`)) |
721
+ | `ORM "nodefony" introuvable` au montage d'un store | `@nodefony/security` chargé **avant** `@nodefony/mongoose` | Placer le driver **avant** dans `modules` (`resolveConnectedOrm()` (`registerStores.ts:92`)) |
722
722
  | Le store `mongoose` est introuvable pour les jetons | `frameworkEntities: false` — le module est en mode données seules | Repasser à `true`, ou choisir un backend qui porte la brique |
723
723
  | `session: { store: "mongoose" }` marche malgré `frameworkEntities: false` | Attendu : la session s'enregistre à l'import, pas via ce champ | Rien à corriger — voir l'avertissement de la section `frameworkEntities` |
724
724
  | Une option de `options` n'a aucun effet | Elle n'est pas validée par Zod ; Mongoose l'a ignorée ou refusée | Vérifier son nom exact dans les `ConnectOptions` de la version de Mongoose installée |