@nodefony/mongoose 10.0.0-alpha.2 → 10.0.0-alpha.4

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.
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.148.0/helpers/esm/decorate.js
1
+ //#region \0@oxc-project+runtime@0.149.0/helpers/esm/decorate.js
2
2
  function __decorate(decorators, target, key, desc) {
3
3
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
4
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -1,4 +1,4 @@
1
- //#region \0@oxc-project+runtime@0.148.0/helpers/esm/decorateMetadata.js
1
+ //#region \0@oxc-project+runtime@0.149.0/helpers/esm/decorateMetadata.js
2
2
  function __decorateMetadata(k, v) {
3
3
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
4
4
  }
package/dist/index.js CHANGED
@@ -12,8 +12,8 @@ import { MongooseTokenStore } from "./nodefony/src/MongooseTokenStore.js";
12
12
  import { MongooseWebAuthnCredentialStore } from "./nodefony/src/MongooseWebAuthnCredentialStore.js";
13
13
  import { MongooseWebhookStore } from "./nodefony/src/MongooseWebhookStore.js";
14
14
  import { FRAMEWORK_CONNECTOR, registerMongooseFrameworkStores } from "./nodefony/registerStores.js";
15
- import __decorateMetadata from "./_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorateMetadata.js";
16
- import __decorate from "./_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorate.js";
15
+ import __decorateMetadata from "./_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorateMetadata.js";
16
+ import __decorate from "./_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
17
17
  import sessionEntity_default, { SESSION_CONNECTOR, sessionSchema as schema } from "./nodefony/entity/sessionEntity.js";
18
18
  import SessionStorage from "./nodefony/src/SessionStorage.js";
19
19
  import { createUserEntity, registerUserEntity, userSchema } from "./nodefony/entity/userEntity.js";
@@ -13,7 +13,7 @@ import { z } from "zod";
13
13
  * (`interfaces/IMongooseConfig.ts`) importent le schéma D'ICI (nœud bas : ce fichier
14
14
  * n'importe que `zod` → pas de cycle).
15
15
  *
16
- * Le type TS est dérivé via `z.infer<>` ({@link MongooseConfig}), et la config est
16
+ * Le type TS est dérivé via `z.infer<>` ({@link IMongooseConfig}), et la config est
17
17
  * validée au boot du Module class (hook `onKernelRegister`, via le builder
18
18
  * {@link defineMongooseConfig}) → plante propre avec messages clairs si la config
19
19
  * est invalide, plutôt qu'un `undefined.x` silencieux en runtime.
@@ -1,4 +1,4 @@
1
- import __decorate from "../../_virtual/_@oxc-project_runtime@0.148.0/helpers/esm/decorate.js";
1
+ import __decorate from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
2
2
  import { entity } from "@nodefony/orm-core";
3
3
  //#region nodefony/entity/sessionEntity.ts
4
4
  /** ORM cible du stockage de session (connecteur par défaut du module). */
@@ -44,7 +44,7 @@ function resolveConnectedOrm(store) {
44
44
  throw new Error(`${store} : ORM "${FRAMEWORK_CONNECTOR}" introuvable — charger @nodefony/mongoose AVANT @nodefony/security dans le manifeste "modules".`);
45
45
  }
46
46
  if (!(orm instanceof MongooseOrm)) throw new Error(`${store} : l'ORM "${FRAMEWORK_CONNECTOR}" n'est pas un MongooseOrm (connecteur homonyme d'un autre driver ?).`);
47
- if (!orm.isConnected()) throw new Error(`${store} : ORM "${FRAMEWORK_CONNECTOR}" non connecté au montage du store (ordre de boot).`);
47
+ if (!orm.isConnected()) throw new Error(`${store} : ORM "${FRAMEWORK_CONNECTOR}" enregistré mais NON CONNECTÉ. Deux causes constatables : soit ce run n'a pas déclaré \`externalServices\` (une commande qui lit ou écrit des données le déclare via CONSOLE_DATA_RUN_PROFILE), soit le store a été demandé avant la connexion (ordre de boot). Un store "auto" n'atteint jamais ce point : seule une demande EXPLICITE le fait.`);
48
48
  return orm;
49
49
  }
50
50
  /**
@@ -1,7 +1,7 @@
1
1
  import { MongooseOrm } from "../src/orm-core/MongooseOrm.js";
2
2
  import mongoose from "mongoose";
3
- import { Service } from "nodefony";
4
- import { queryFlowMonitor, resolveOrmFlowEnabled } from "@nodefony/orm-core";
3
+ import { Service, runNeedsExternalServices } from "nodefony";
4
+ import { diagnoseConnectionFailure, parseConnectionTarget, queryFlowMonitor, resolveOrmFlowEnabled } from "@nodefony/orm-core";
5
5
  //#region nodefony/service/MongooseService.ts
6
6
  const serviceName = "mongoose";
7
7
  /**
@@ -25,10 +25,7 @@ var MongooseService = class MongooseService extends Service {
25
25
  this.module = module;
26
26
  this.module.hookKernel("onBoot", async () => {
27
27
  queryFlowMonitor.setEnabled(resolveOrmFlowEnabled(this.kernel));
28
- await this.connectAll().catch((e) => {
29
- this.log(e, "ERROR");
30
- throw e;
31
- });
28
+ await this.connectAll(runNeedsExternalServices(this.kernel));
32
29
  });
33
30
  this.kernel?.once("onTerminate", async () => {
34
31
  await this.disconnectAll().catch(() => {});
@@ -38,12 +35,18 @@ var MongooseService = class MongooseService extends Service {
38
35
  #config() {
39
36
  return this.module.config;
40
37
  }
41
- /** Connecte tous les connecteurs déclarés en config (validée Zod). */
42
- async connectAll() {
38
+ /**
39
+ * Connecte tous les connecteurs déclarés en config (validée Zod).
40
+ *
41
+ * @param connect - `false` pour ENREGISTRER les ORM sans ouvrir de connexion
42
+ * (boot d'un run qui n'a pas déclaré `externalServices`). Défaut `true` :
43
+ * un appel direct est un ordre.
44
+ */
45
+ async connectAll(connect = true) {
43
46
  const config = this.#config();
44
47
  if (config?.debug) mongoose.set("debug", true);
45
48
  const connectors = config?.connectors ?? {};
46
- for (const [name, cfg] of Object.entries(connectors)) await this.#connectOne(name, cfg);
49
+ for (const [name, cfg] of Object.entries(connectors)) await this.#connectOne(name, cfg, connect);
47
50
  }
48
51
  /** Assemble l'URI de connexion à partir de la config (`uri` ou composants). */
49
52
  static buildUri(cfg) {
@@ -74,10 +77,21 @@ var MongooseService = class MongooseService extends Service {
74
77
  };
75
78
  }
76
79
  /** Connecte un connecteur (URI + options d'auth/pool). */
77
- async #connectOne(name, cfg) {
80
+ async #connectOne(name, cfg, connect = true) {
78
81
  const uri = MongooseService.buildUri(cfg);
79
82
  const orm = new MongooseOrm(name, uri, MongooseService.buildConnectOptions(cfg));
80
- await orm.connect();
83
+ if (!connect) {
84
+ this.#orms.set(name, orm);
85
+ this.log(`Mongoose « ${name} » enregistré SANS connexion (${orm.safeTarget()}) — ce run n'a pas déclaré \`externalServices\`.`, "DEBUG");
86
+ return;
87
+ }
88
+ try {
89
+ await orm.connect();
90
+ } catch (e) {
91
+ const diagnosis = diagnoseConnectionFailure(e, parseConnectionTarget(uri));
92
+ const cause = e instanceof Error ? e.message : String(e);
93
+ throw new Error(`Mongoose : le connecteur "${name}" (${orm.safeTarget()}) n'a pas pu se connecter — ${diagnosis.explanation} Cause : ${cause}`, { cause: e });
94
+ }
81
95
  this.#orms.set(name, orm);
82
96
  this.log(`Mongoose ORM "${name}" connected (${orm.safeTarget()})`, "INFO");
83
97
  }
@@ -51,7 +51,7 @@ declare class Mongoose extends Module<IMongooseConfig> {
51
51
  export default Mongoose;
52
52
  export { mongoose, MongooseService };
53
53
  export { defineMongooseConfig, mongooseConfigJsonSchema };
54
- export { mongooseConfigSchema, type MongooseConfig, } from "./nodefony/config/config.js";
54
+ export { mongooseConfigSchema } from "./nodefony/config/config.js";
55
55
  export type { IMongooseConfig, IMongooseConfigInput, IMongooseConnectorConfig, } from "./nodefony/interfaces/IMongooseConfig.js";
56
56
  export { default as SessionStorage } from "./nodefony/src/SessionStorage.js";
57
57
  export { default as SessionEntity, sessionSchema, SESSION_CONNECTOR, } from "./nodefony/entity/sessionEntity.js";
@@ -12,10 +12,10 @@ export declare const mongooseConfigSchema: z.ZodObject<{
12
12
  frameworkEntities: z.ZodDefault<z.ZodBoolean>;
13
13
  }, z.core.$strict>;
14
14
  /** Type de sortie (config normalisée + défauts appliqués). */
15
- export type MongooseConfig = z.infer<typeof mongooseConfigSchema>;
15
+ export type IMongooseConfig = z.infer<typeof mongooseConfigSchema>;
16
16
  /**
17
17
  * Défauts du module, matérialisés depuis le schéma (source unique). Toujours
18
18
  * valides par construction ; passés au `super(..., config)` du Module class.
19
19
  */
20
- declare const config: MongooseConfig;
20
+ declare const config: IMongooseConfig;
21
21
  export default config;
@@ -19,8 +19,14 @@ declare class MongooseService extends Service {
19
19
  #private;
20
20
  module: Module;
21
21
  constructor(module: Module);
22
- /** Connecte tous les connecteurs déclarés en config (validée Zod). */
23
- connectAll(): Promise<void>;
22
+ /**
23
+ * Connecte tous les connecteurs déclarés en config (validée Zod).
24
+ *
25
+ * @param connect - `false` pour ENREGISTRER les ORM sans ouvrir de connexion
26
+ * (boot d'un run qui n'a pas déclaré `externalServices`). Défaut `true` :
27
+ * un appel direct est un ordre.
28
+ */
29
+ connectAll(connect?: boolean): Promise<void>;
24
30
  /** Assemble l'URI de connexion à partir de la config (`uri` ou composants). */
25
31
  static buildUri(cfg: IMongooseConnectorConfig): string;
26
32
  /**
@@ -109,7 +109,7 @@ Le schéma (`mongooseConfigSchema` (`config.ts:83`)) porte les valeurs d'usine s
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()`,
112
- et nulle part ailleurs. Le type TypeScript suit le même chemin : `MongooseConfig` (`config.ts:116`)
112
+ et nulle part ailleurs. Le type TypeScript suit le même chemin : `IMongooseConfig` (`config.ts:131`)
113
113
  est **inféré** du schéma, jamais redéclaré.
114
114
 
115
115
  Le builder (`defineMongooseConfig()` (`defineModuleConfig.ts:61`)) tient en trois gestes — valider,
@@ -267,7 +267,7 @@ ainsi qu'une application lit une base métier et écrit dans une base d'archives
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:76`)).
270
+ les assemble en `mongodb://hôte:port/base` (`MongooseService.buildUri()` (`MongooseService.ts:94`)).
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.**
@@ -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:63`)).
323
+ `debug` (`config.ts:85`) active la trace intégrée de Mongoose (`connectAll()` (`MongooseService.ts:81`)).
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.
@@ -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:1600`)) :
408
+ Ces overrides sont posés **avant** la validation Zod (`Kernel.applyEnvConfigOverrides()` (`Kernel.ts:1708`)) :
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:1150`)).
439
+ (`Kernel.loadModulesFromManifest()` (`Kernel.ts:1600`)).
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:63`)), et se ferment toutes à l'arrêt
553
- (`disconnectAll()` (`MongooseService.ts:134`)). Un service peut demander l'une ou l'autre par son nom
554
- (`getOrm()` (`MongooseService.ts:142`)), mais l'usage courant reste le registre d'ORM.
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.
555
555
 
556
556
  ## 🔐 Le secret de connexion
557
557
 
@@ -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:2665`)) :
668
+ politique de boot du cœur (`Kernel.isBootErrorFatal()` (`Kernel.ts:2757`)) :
669
669
 
670
670
  | Environnement | Ce qui se passe |
671
671
  | ------------------- | -------------------------------------------------------------------------------------- |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nodefony/mongoose",
3
- "version": "10.0.0-alpha.2",
3
+ "version": "10.0.0-alpha.4",
4
4
  "description": "Moteur MongoDB de Nodefony sur Mongoose : dépôts typés conformes au contrat orm-core",
5
5
  "nodefony": {
6
6
  "storeKind": "durable",
@@ -52,22 +52,22 @@
52
52
  "zod": "^4.4.3"
53
53
  },
54
54
  "devDependencies": {
55
- "@nodefony/http": "^10.0.0-alpha.2",
56
- "@nodefony/orm-core": "^10.0.0-alpha.2",
57
- "@nodefony/security": "^10.0.0-alpha.2",
58
- "@nodefony/user": "^10.0.0-alpha.2",
55
+ "@nodefony/http": "^10.0.0-alpha.4",
56
+ "@nodefony/orm-core": "^10.0.0-alpha.4",
57
+ "@nodefony/security": "^10.0.0-alpha.4",
58
+ "@nodefony/user": "^10.0.0-alpha.4",
59
59
  "@types/node": "26.4.1",
60
60
  "mongodb-memory-server": "11.2.0",
61
- "nodefony": "^10.0.0-alpha.2",
61
+ "nodefony": "^10.0.0-alpha.4",
62
62
  "rimraf": "6.1.3",
63
63
  "vitest": "5.0.0"
64
64
  },
65
65
  "peerDependencies": {
66
- "@nodefony/http": "^10.0.0-alpha.2",
67
- "@nodefony/orm-core": "^10.0.0-alpha.2",
68
- "@nodefony/security": "^10.0.0-alpha.2",
69
- "@nodefony/user": "^10.0.0-alpha.2",
70
- "nodefony": "^10.0.0-alpha.2"
66
+ "@nodefony/http": "^10.0.0-alpha.4",
67
+ "@nodefony/orm-core": "^10.0.0-alpha.4",
68
+ "@nodefony/security": "^10.0.0-alpha.4",
69
+ "@nodefony/user": "^10.0.0-alpha.4",
70
+ "nodefony": "^10.0.0-alpha.4"
71
71
  },
72
72
  "repository": {
73
73
  "type": "git",