@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.
- package/README.md +32 -0
- 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 +13 -7
- package/dist/nodefony/config/defineModuleConfig.js +4 -3
- package/dist/nodefony/entity/auditEventEntity.js +124 -0
- package/dist/nodefony/entity/idempotencyEntity.js +96 -0
- package/dist/nodefony/entity/sessionEntity.js +1 -1
- package/dist/nodefony/entity/totpSecretEntity.js +103 -0
- package/dist/nodefony/registerStores.js +42 -5
- package/dist/nodefony/service/MongooseService.js +15 -5
- package/dist/nodefony/src/MongooseAuditStore.js +215 -0
- package/dist/nodefony/src/MongooseIdempotencyStore.js +264 -0
- package/dist/nodefony/src/MongooseTokenStore.js +60 -17
- package/dist/nodefony/src/MongooseTotpSecretStore.js +151 -0
- package/dist/nodefony/src/MongooseUserRepository.js +1 -1
- package/dist/nodefony/src/MongooseWebAuthnCredentialStore.js +13 -1
- package/dist/nodefony/src/MongooseWebhookStore.js +14 -2
- package/dist/nodefony/src/SessionStorage.js +8 -0
- package/dist/nodefony/src/orm-core/MongooseOrm.js +68 -22
- package/dist/nodefony/src/orm-core/MongooseRepository.js +147 -25
- package/dist/nodefony/src/orm-core/MongooseTransaction.js +19 -6
- package/dist/nodefony/src/writeCount.js +17 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/nodefony/entity/auditEventEntity.d.ts +76 -0
- package/dist/types/nodefony/entity/idempotencyEntity.d.ts +75 -0
- package/dist/types/nodefony/entity/totpSecretEntity.d.ts +75 -0
- package/dist/types/nodefony/registerStores.d.ts +6 -3
- package/dist/types/nodefony/service/MongooseService.d.ts +2 -2
- package/dist/types/nodefony/src/MongooseAuditStore.d.ts +70 -0
- package/dist/types/nodefony/src/MongooseIdempotencyStore.d.ts +121 -0
- package/dist/types/nodefony/src/MongooseTokenStore.d.ts +8 -1
- package/dist/types/nodefony/src/MongooseTotpSecretStore.d.ts +63 -0
- package/dist/types/nodefony/src/MongooseUserRepository.d.ts +1 -1
- package/dist/types/nodefony/src/MongooseWebAuthnCredentialStore.d.ts +6 -0
- package/dist/types/nodefony/src/MongooseWebhookStore.d.ts +6 -0
- package/dist/types/nodefony/src/SessionStorage.d.ts +6 -0
- package/dist/types/nodefony/src/orm-core/MongooseOrm.d.ts +10 -3
- package/dist/types/nodefony/src/orm-core/MongooseRepository.d.ts +22 -1
- package/dist/types/nodefony/src/orm-core/MongooseTransaction.d.ts +12 -4
- package/dist/types/nodefony/src/writeCount.d.ts +12 -0
- package/docs/configuration.md +27 -27
- package/docs/index.md +133 -82
- package/package.json +23 -19
package/docs/configuration.md
CHANGED
|
@@ -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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
298
|
-
(`MongooseService.#connectOne()` (`MongooseService.ts:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
553
|
-
(`disconnectAll()` (`MongooseService.ts:
|
|
554
|
-
(`getOrm()` (`MongooseService.ts:
|
|
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:
|
|
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:
|
|
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:
|
|
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]
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 |
|