{"_id":"@astratra/store-mongo","_rev":"5-12284e1432cc70f73715b1c1171bb639","name":"@astratra/store-mongo","dist-tags":{"latest":"1.1.0"},"versions":{"0.1.0":{"name":"@astratra/store-mongo","version":"0.1.0","keywords":["astratra","mongodb","mongoose","saas"],"license":"MIT","_id":"@astratra/store-mongo@0.1.0","maintainers":[{"name":"emch99","email":"emchkongo@gmail.com"}],"dist":{"shasum":"ab9ba01efefd819c27fb3d263b689d55862c1b6d","tarball":"https://registry.npmjs.org/@astratra/store-mongo/-/store-mongo-0.1.0.tgz","fileCount":5,"integrity":"sha512-xuwrUHSbj9gpHiEXoCUA5og29y/r03pIz6D0kljcygDAFjrNX7ElqEhn6vR4vvJYOGKLOumfJp9RdzQkFpngEA==","signatures":[{"sig":"MEQCIFq0NvtGpwhnKPZjh8lgg3hMZ93X74JBc/tMIE3h2cXTAiByoHQatRA9+sWtwUBYdVXWNWQ4XoPEUPI3lLuq3/XfRw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12677},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testTimeout":60000},"main":"src/index.js","type":"commonjs","types":"src/index.d.ts","gitHead":"1e576a2e512d525705894c42f7269882b6a09a7f","scripts":{"test":"jest"},"_npmUser":{"name":"emch99","email":"emchkongo@gmail.com"},"_npmVersion":"11.5.1","description":"MongoDB/Mongoose persistence adapters for Astratra SaaS stores.","directories":{},"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.4.2","mongoose":"^8.17.0","mongodb-memory-server":"^10.2.0"},"peerDependencies":{"mongoose":">=8"},"peerDependenciesMeta":{"mongoose":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/store-mongo_0.1.0_1786200648895_0.440255216835556","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@astratra/store-mongo","version":"1.0.0","keywords":["astratra","mongodb","mongoose","saas"],"license":"MIT","_id":"@astratra/store-mongo@1.0.0","maintainers":[{"name":"emch99","email":"emchkongo@gmail.com"}],"dist":{"shasum":"352738d95f74cdf747cdd5ed25961298d3eebbd6","tarball":"https://registry.npmjs.org/@astratra/store-mongo/-/store-mongo-1.0.0.tgz","fileCount":5,"integrity":"sha512-Ix8n7GXa8ZkxEFXgNW/qoyl3gkdPhqLprvK8ZLuupdJ7cKiyqia+zHRD1CCL5bORE0XYk8Meo5alycUDz8OEuw==","signatures":[{"sig":"MEYCIQDmCbfSd+F5DkHiLXKnCYsg1jROcTJnyek2Ohg3b87sZgIhAJHJek2lz4cmhCJPLT45bDWavzlU70iDnNDrgDjqKVaB","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12677},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testTimeout":60000},"main":"src/index.js","type":"commonjs","types":"src/index.d.ts","gitHead":"e4ba5847cd3342fd9398c867592b762f852a8ef8","scripts":{"test":"jest"},"_npmUser":{"name":"emch99","email":"emchkongo@gmail.com"},"_npmVersion":"11.13.0","description":"MongoDB/Mongoose persistence adapters for Astratra SaaS stores.","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.4.2","mongoose":"^8.17.0","mongodb-memory-server":"^10.2.0"},"peerDependencies":{"mongoose":">=8"},"peerDependenciesMeta":{"mongoose":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/store-mongo_1.0.0_1786210224795_0.669931931782245","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@astratra/store-mongo","version":"1.0.1","keywords":["astratra","mongodb","mongoose","saas"],"license":"MIT","_id":"@astratra/store-mongo@1.0.1","maintainers":[{"name":"emch99","email":"emchkongo@gmail.com"}],"dist":{"shasum":"56a7f5437c807ee92748acda1c019820b6a00483","tarball":"https://registry.npmjs.org/@astratra/store-mongo/-/store-mongo-1.0.1.tgz","fileCount":5,"integrity":"sha512-QfnY0S+PuGscKymdsM5Fz5Zx5/unbx2BwAdiz71nvLrTsdUu9LfacHffpGCdZbxmQ2eTrtxxA/9F7bqvGczErg==","signatures":[{"sig":"MEUCIQCKc94PxrtUI66M4aTZ1MxCd6Y0s9pW3Md2rkm5xwxYjwIgan7XvOymrnqLllc9WYW/gq44BKXs4z2R24zenvCelas=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13630},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testTimeout":60000},"main":"src/index.js","type":"commonjs","types":"src/index.d.ts","gitHead":"84e6d3922bbfd6bba1a1fa386a44c6c83e733ade","scripts":{"test":"jest"},"_npmUser":{"name":"emch99","email":"emchkongo@gmail.com"},"_npmVersion":"11.5.1","description":"MongoDB/Mongoose persistence adapters for Astratra SaaS stores.","directories":{},"_nodeVersion":"22.18.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.4.2","mongoose":"^8.17.0","mongodb-memory-server":"^10.2.0"},"peerDependencies":{"mongoose":">=8"},"peerDependenciesMeta":{"mongoose":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/store-mongo_1.0.1_1786212766844_0.04837204114228344","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@astratra/store-mongo","version":"1.0.2","keywords":["astratra","mongodb","mongoose","saas"],"license":"MIT","_id":"@astratra/store-mongo@1.0.2","maintainers":[{"name":"emch99","email":"emchkongo@gmail.com"}],"dist":{"shasum":"e2f9a7d463efc285c518c06aac2124134ef3cf99","tarball":"https://registry.npmjs.org/@astratra/store-mongo/-/store-mongo-1.0.2.tgz","fileCount":5,"integrity":"sha512-EZkzAUpY7k/vQ8TbNPj8omm1+aVgzyjZLVMd20aRUuUyrOxqGpWPG26zAII4brg+/YJXtkszyxWA9HxmH/Hhpg==","signatures":[{"sig":"MEQCICOMcLt0FthApjnXDP6/Hom0xiHrSe2qfws2kdnGPQWYAiBXrsxRHWk6t2Y+zQyGtlqN/G4xfB6sZANxiA2GCpH6PA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13669},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testTimeout":60000},"main":"src/index.js","type":"commonjs","types":"src/index.d.ts","engines":{"node":">=20"},"gitHead":"c0f1cf78836764168bbbeabdebb1574f2ec68543","scripts":{"test":"jest"},"_npmUser":{"name":"emch99","email":"emchkongo@gmail.com"},"_npmVersion":"11.13.0","description":"MongoDB/Mongoose persistence adapters for Astratra SaaS stores.","directories":{},"_nodeVersion":"24.16.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.4.2","mongoose":"^8.17.0","mongodb-memory-server":"^10.2.0"},"peerDependencies":{"mongoose":">=8"},"peerDependenciesMeta":{"mongoose":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/store-mongo_1.0.2_1786297904756_0.36573957675055","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@astratra/store-mongo","version":"1.1.0","description":"MongoDB/Mongoose persistence adapters for Astratra SaaS stores.","engines":{"node":">=20"},"main":"src/index.js","types":"src/index.d.ts","type":"commonjs","scripts":{"test":"jest"},"jest":{"testMatch":["**/__tests__/**/*.test.js"],"testTimeout":60000},"keywords":["astratra","mongodb","mongoose","saas"],"license":"MIT","publishConfig":{"access":"public"},"peerDependencies":{"mongoose":">=8"},"peerDependenciesMeta":{"mongoose":{"optional":true}},"devDependencies":{"jest":"30.4.2","mongodb-memory-server":"^10.2.0","mongoose":"^8.17.0"},"gitHead":"530705b0609c79552379ded37365aaac5b712707","_id":"@astratra/store-mongo@1.1.0","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-5276wsMUxGl/X1txpETsgObVhwDaJNYshIP25ScNfimJAft8HWE+fQSwb4TVPImS7F43aUqwUyIyotQoknC3yw==","shasum":"30cbabc624e0a9c2a2add01ec9a800f338a67e7e","tarball":"https://registry.npmjs.org/@astratra/store-mongo/-/store-mongo-1.1.0.tgz","fileCount":6,"unpackedSize":18608,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHkkb4V4zUy6ZuxJPQ5ZNTuUGsFLmoDP2cLQ24nm+VJiAiEA4WnUHkuPVkRXE2qKsLiyIGHKGoQ6t7daGeewKZN6pf8="}]},"_npmUser":{"name":"emch99","email":"emchkongo@gmail.com"},"directories":{},"maintainers":[{"name":"emch99","email":"emchkongo@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/store-mongo_1.1.0_1786739929237_0.11407404605351434"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-08T14:50:48.745Z","modified":"2026-08-14T20:38:49.523Z","0.1.0":"2026-08-08T14:50:49.042Z","1.0.0":"2026-08-08T17:30:24.952Z","1.0.1":"2026-08-08T18:12:46.978Z","1.0.2":"2026-08-09T17:51:44.910Z","1.1.0":"2026-08-14T20:38:49.377Z"},"license":"MIT","keywords":["astratra","mongodb","mongoose","saas"],"description":"MongoDB/Mongoose persistence adapters for Astratra SaaS stores.","maintainers":[{"name":"emch99","email":"emchkongo@gmail.com"}],"readme":"# @astratra/store-mongo\n\nAdapters MongoDB/Mongoose reels pour les stores `usersStore` et\n`settingsStore` attendus par `@astratra/saas-kit`.\n\nLe package ne change pas `saas-kit` : il fournit juste une implémentation\npersistante du même contrat que les stores mémoire de développement.\n\n## Installation\n\n```bash\nnpm install @astratra/store-mongo mongoose\n```\n\n`mongoose` est une dependance peer optionnelle du package. En pratique, une\napplication qui utilise déjà MongoDB garde sa propre dépendance et sa propre\nconnexion.\n\n## Utilisateurs\n\n```js\nconst mongoose = require('mongoose');\nconst { createMongoUsersStore } = require('@astratra/store-mongo');\n\nawait mongoose.connect(process.env.MONGODB_URI);\n\nconst usersStore = createMongoUsersStore({\n  connection: mongoose.connection,\n  collection: 'app_users'\n});\n```\n\nLe schema est volontairement permissif : `email` et `role` sont connus, mais\n`strict: false` laisse passer les champs métier de l'application consommatrice\ncomme `name`, `avatar`, `tenantId` ou `clinicId`.\n\nPar défaut, `email` a un index unique. Pour désactiver cette contrainte :\n\n```js\nconst usersStore = createMongoUsersStore({\n  connection: mongoose.connection,\n  uniqueEmail: false\n});\n```\n\n## Parametres\n\n```js\nconst { createMongoSettingsStore } = require('@astratra/store-mongo');\n\nconst settingsStore = createMongoSettingsStore({\n  connection: mongoose.connection,\n  collection: 'app_settings'\n});\n\nawait settingsStore.set('timezone', 'Europe/Paris');\nconst allSettings = await settingsStore.getAll();\n```\n\n`settingsStore` stocke chaque réglage sous forme `{ key, value }`, avec\n`value` en `Schema.Types.Mixed`.\n\n## Avec `@astratra/saas-kit`\n\n```js\nconst { createSaasApp } = require('@astratra/saas-kit');\nconst {\n  createMongoSettingsStore,\n  createMongoUsersStore\n} = require('@astratra/store-mongo');\n\nconst app = createSaasApp({\n  usersStore: createMongoUsersStore({ connection: mongoose.connection }),\n  settingsStore: createMongoSettingsStore({ connection: mongoose.connection }),\n  notify,\n  verifyPassword\n});\n```\n\nLes méthodes retournent des objets JavaScript simples via Mongoose `.lean()`\nou `.toObject()`, jamais des documents Mongoose vivants.\n\n## Migrations\n\nPas un DSL, pas de CLI, pas de diff de schéma — un runner minimal et\nhonnête : tu lui donnes du code brut dans l'ordre (création d'index,\nbackfill, reformage de documents), il applique une seule fois chaque\nmigration non encore vue, suivi par `id` dans une collection dédiée.\n\n```js\nconst { createMongoMigrationRunner } = require('@astratra/store-mongo');\n\nconst runner = createMongoMigrationRunner({ connection });\n\nawait runner.run([\n  { id: '2026-01-01-index-role', up: (conn) => conn.collection('app_users').createIndex({ role: 1 }) }\n]);\n```\n\nRejoue `run()` avec la même liste (plus les nouvelles migrations ajoutées\nau fil du temps) à chaque déploiement. MongoDB n'a pas de transactions\ninter-collections sur un déploiement standalone — contrairement au runner\nPostgres, celui-ci n'enveloppe **pas** chaque migration dans une transaction.\nÉcris des migrations sûres à marquer comme appliquées même si une étape\nintermédiaire de la même `up` échoue, ou utilise un replica set + session\nsi tu as besoin d'atomicité. Pas de `down()` : un rollback de schéma se fait\nvia une nouvelle migration qui défait l'ancienne.\n\n## Cycle de vie de connexion\n\nChemin recommandé : passer une `connection` déjà ouverte par l'application.\nDans ce mode, l'adapter ne ferme pas MongoDB.\n\n```js\nconst usersStore = createMongoUsersStore({ connection: mongoose.connection });\nawait usersStore.disconnect(); // no-op pour une connexion injectée\n```\n\nPour un script ou un petit service autonome, l'adapter peut ouvrir sa propre\nconnexion avec `uri`. Dans ce cas, `disconnect()` ferme cette connexion.\n\n```js\nconst usersStore = createMongoUsersStore({\n  uri: process.env.MONGODB_URI\n});\n\n// ...\nawait usersStore.disconnect();\n```\n\n## Tests\n\n```bash\nnpm test --workspace @astratra/store-mongo\n```\n\nLes tests utilisent `mongodb-memory-server`, donc aucune instance MongoDB\nexterne n'est requise. Au premier lancement, le binaire MongoDB peut être\ntéléchargé par `mongodb-memory-server`.\n","readmeFilename":"README.md"}