@lenne.tech/nest-server 12.0.0 → 12.1.0

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 (693) hide show
  1. package/.claude/rules/architecture.md +6 -1
  2. package/.claude/rules/better-auth.md +46 -0
  3. package/.claude/rules/configurable-features.md +3 -2
  4. package/.claude/rules/package-management.md +24 -2
  5. package/.claude/rules/persistence.md +100 -0
  6. package/.claude/rules/role-system.md +9 -0
  7. package/.claude/rules/testing.md +116 -18
  8. package/CLAUDE.md +21 -2
  9. package/FRAMEWORK-API.md +6 -4
  10. package/README.md +106 -34
  11. package/dist/core/common/decorators/unified-field.decorator.d.ts +2 -1
  12. package/dist/core/common/decorators/unified-field.decorator.js +4 -1
  13. package/dist/core/common/decorators/unified-field.decorator.js.map +1 -1
  14. package/dist/core/common/filters/mongoose-cast-error.filter.d.ts +7 -5
  15. package/dist/core/common/filters/mongoose-cast-error.filter.js +3 -2
  16. package/dist/core/common/filters/mongoose-cast-error.filter.js.map +1 -1
  17. package/dist/core/common/helpers/db.helper.d.ts +2 -1
  18. package/dist/core/common/helpers/db.helper.js +32 -26
  19. package/dist/core/common/helpers/db.helper.js.map +1 -1
  20. package/dist/core/common/helpers/decorator.helper.d.ts +1 -1
  21. package/dist/core/common/helpers/filter.helper.d.ts +2 -1
  22. package/dist/core/common/helpers/filter.helper.js.map +1 -1
  23. package/dist/core/common/helpers/gridfs.helper.d.ts +4 -4
  24. package/dist/core/common/helpers/gridfs.helper.js +14 -6
  25. package/dist/core/common/helpers/gridfs.helper.js.map +1 -1
  26. package/dist/core/common/helpers/id.helper.d.ts +4 -1
  27. package/dist/core/common/helpers/id.helper.js +10 -4
  28. package/dist/core/common/helpers/id.helper.js.map +1 -1
  29. package/dist/core/common/helpers/model.helper.js +5 -5
  30. package/dist/core/common/helpers/model.helper.js.map +1 -1
  31. package/dist/core/common/helpers/service.helper.js +3 -3
  32. package/dist/core/common/helpers/service.helper.js.map +1 -1
  33. package/dist/core/common/interfaces/server-options.interface.d.ts +18 -2
  34. package/dist/core/common/interfaces/service-options.interface.d.ts +2 -2
  35. package/dist/core/common/models/core-persistence.model.d.ts +1 -2
  36. package/dist/core/common/models/core-persistence.model.js +3 -3
  37. package/dist/core/common/models/core-persistence.model.js.map +1 -1
  38. package/dist/core/common/persistence/core-persistence.lifecycle.d.ts +9 -0
  39. package/dist/core/common/persistence/core-persistence.lifecycle.js +38 -0
  40. package/dist/core/common/persistence/core-persistence.lifecycle.js.map +1 -0
  41. package/dist/core/common/persistence/core-persistence.module.d.ts +9 -0
  42. package/dist/core/common/persistence/core-persistence.module.js +76 -0
  43. package/dist/core/common/persistence/core-persistence.module.js.map +1 -0
  44. package/dist/core/common/persistence/data-source.config.d.ts +33 -0
  45. package/dist/core/common/persistence/data-source.config.js +151 -0
  46. package/dist/core/common/persistence/data-source.config.js.map +1 -0
  47. package/dist/core/common/persistence/data-source.runtime.d.ts +45 -0
  48. package/dist/core/common/persistence/data-source.runtime.js +278 -0
  49. package/dist/core/common/persistence/data-source.runtime.js.map +1 -0
  50. package/dist/core/common/persistence/data-store.interface.d.ts +73 -0
  51. package/dist/core/common/persistence/data-store.interface.js +2 -0
  52. package/dist/core/common/persistence/data-store.interface.js.map +1 -0
  53. package/dist/core/common/persistence/expiry-sweep.d.ts +12 -0
  54. package/dist/core/common/persistence/expiry-sweep.js +55 -0
  55. package/dist/core/common/persistence/expiry-sweep.js.map +1 -0
  56. package/dist/core/common/persistence/id-format.d.ts +3 -0
  57. package/dist/core/common/persistence/id-format.js +21 -0
  58. package/dist/core/common/persistence/id-format.js.map +1 -0
  59. package/dist/core/common/persistence/infrastructure-locks.d.ts +13 -0
  60. package/dist/core/common/persistence/infrastructure-locks.js +35 -0
  61. package/dist/core/common/persistence/infrastructure-locks.js.map +1 -0
  62. package/dist/core/common/persistence/inject-store.decorator.d.ts +1 -0
  63. package/dist/core/common/persistence/inject-store.decorator.js +6 -0
  64. package/dist/core/common/persistence/inject-store.decorator.js.map +1 -0
  65. package/dist/core/common/persistence/lock-store.interface.d.ts +5 -0
  66. package/dist/core/common/persistence/lock-store.interface.js +2 -0
  67. package/dist/core/common/persistence/lock-store.interface.js.map +1 -0
  68. package/dist/core/common/persistence/model-descriptor.interface.d.ts +36 -0
  69. package/dist/core/common/persistence/model-descriptor.interface.js +2 -0
  70. package/dist/core/common/persistence/model-descriptor.interface.js.map +1 -0
  71. package/dist/core/common/persistence/model-metadata.registry.d.ts +14 -0
  72. package/dist/core/common/persistence/model-metadata.registry.js +194 -0
  73. package/dist/core/common/persistence/model-metadata.registry.js.map +1 -0
  74. package/dist/core/common/persistence/mongo/collection-name.d.ts +2 -0
  75. package/dist/core/common/persistence/mongo/collection-name.js +73 -0
  76. package/dist/core/common/persistence/mongo/collection-name.js.map +1 -0
  77. package/dist/core/common/persistence/mongo/declared-schema.view.d.ts +11 -0
  78. package/dist/core/common/persistence/mongo/declared-schema.view.js +292 -0
  79. package/dist/core/common/persistence/mongo/declared-schema.view.js.map +1 -0
  80. package/dist/core/common/persistence/mongo/hex-object-id.d.ts +13 -0
  81. package/dist/core/common/persistence/mongo/hex-object-id.js +54 -0
  82. package/dist/core/common/persistence/mongo/hex-object-id.js.map +1 -0
  83. package/dist/core/common/persistence/mongo/model-declarations.d.ts +35 -0
  84. package/dist/core/common/persistence/mongo/model-declarations.js +80 -0
  85. package/dist/core/common/persistence/mongo/model-declarations.js.map +1 -0
  86. package/dist/core/common/persistence/mongo/mongo-packages.d.ts +15 -0
  87. package/dist/core/common/persistence/mongo/mongo-packages.js +66 -0
  88. package/dist/core/common/persistence/mongo/mongo-packages.js.map +1 -0
  89. package/dist/core/common/persistence/mongo/mongoose-compat.d.ts +22 -0
  90. package/dist/core/common/persistence/mongo/mongoose-compat.js +65 -0
  91. package/dist/core/common/persistence/mongo/mongoose-compat.js.map +1 -0
  92. package/dist/core/common/persistence/mongo/no-mongo-connection.module.d.ts +2 -0
  93. package/dist/core/common/persistence/mongo/no-mongo-connection.module.js +19 -0
  94. package/dist/core/common/persistence/mongo/no-mongo-connection.module.js.map +1 -0
  95. package/dist/core/common/persistence/mongo-lock-store.d.ts +21 -0
  96. package/dist/core/common/persistence/mongo-lock-store.js +72 -0
  97. package/dist/core/common/persistence/mongo-lock-store.js.map +1 -0
  98. package/dist/core/common/persistence/mongoose-data-store.d.ts +33 -0
  99. package/dist/core/common/persistence/mongoose-data-store.js +187 -0
  100. package/dist/core/common/persistence/mongoose-data-store.js.map +1 -0
  101. package/dist/core/common/persistence/neutral-populate.d.ts +6 -0
  102. package/dist/core/common/persistence/neutral-populate.js +72 -0
  103. package/dist/core/common/persistence/neutral-populate.js.map +1 -0
  104. package/dist/core/common/persistence/persisted-model.decorator.d.ts +6 -0
  105. package/dist/core/common/persistence/persisted-model.decorator.js +24 -0
  106. package/dist/core/common/persistence/persisted-model.decorator.js.map +1 -0
  107. package/dist/core/common/persistence/persistence-runtime.registry.d.ts +61 -0
  108. package/dist/core/common/persistence/persistence-runtime.registry.js +47 -0
  109. package/dist/core/common/persistence/persistence-runtime.registry.js.map +1 -0
  110. package/dist/core/common/persistence/persistence.tokens.d.ts +1 -0
  111. package/dist/core/common/persistence/persistence.tokens.js +4 -0
  112. package/dist/core/common/persistence/persistence.tokens.js.map +1 -0
  113. package/dist/core/common/persistence/policies/audit.policy.d.ts +8 -0
  114. package/dist/core/common/persistence/policies/audit.policy.js +37 -0
  115. package/dist/core/common/persistence/policies/audit.policy.js.map +1 -0
  116. package/dist/core/common/persistence/policies/password.policy.d.ts +3 -0
  117. package/dist/core/common/persistence/policies/password.policy.js +46 -0
  118. package/dist/core/common/persistence/policies/password.policy.js.map +1 -0
  119. package/dist/core/common/persistence/policies/role-guard.policy.d.ts +3 -0
  120. package/dist/core/common/persistence/policies/role-guard.policy.js +46 -0
  121. package/dist/core/common/persistence/policies/role-guard.policy.js.map +1 -0
  122. package/dist/core/common/persistence/policies/system-role.policy.d.ts +5 -0
  123. package/dist/core/common/persistence/policies/system-role.policy.js +46 -0
  124. package/dist/core/common/persistence/policies/system-role.policy.js.map +1 -0
  125. package/dist/core/common/persistence/policies/tenant.policy.d.ts +19 -0
  126. package/dist/core/common/persistence/policies/tenant.policy.js +120 -0
  127. package/dist/core/common/persistence/policies/tenant.policy.js.map +1 -0
  128. package/dist/core/common/persistence/routed-model.guard.d.ts +4 -0
  129. package/dist/core/common/persistence/routed-model.guard.js +73 -0
  130. package/dist/core/common/persistence/routed-model.guard.js.map +1 -0
  131. package/dist/core/common/persistence/sql/mysql/mysql-data-store.d.ts +46 -0
  132. package/dist/core/common/persistence/sql/mysql/mysql-data-store.js +350 -0
  133. package/dist/core/common/persistence/sql/mysql/mysql-data-store.js.map +1 -0
  134. package/dist/core/common/persistence/sql/mysql/mysql-executor.d.ts +13 -0
  135. package/dist/core/common/persistence/sql/mysql/mysql-executor.js +194 -0
  136. package/dist/core/common/persistence/sql/mysql/mysql-executor.js.map +1 -0
  137. package/dist/core/common/persistence/sql/mysql/mysql-lock-store.d.ts +11 -0
  138. package/dist/core/common/persistence/sql/mysql/mysql-lock-store.js +55 -0
  139. package/dist/core/common/persistence/sql/mysql/mysql-lock-store.js.map +1 -0
  140. package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.d.ts +36 -0
  141. package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js +288 -0
  142. package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js.map +1 -0
  143. package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.d.ts +19 -0
  144. package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js +328 -0
  145. package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js.map +1 -0
  146. package/dist/core/common/persistence/sql/mysql/mysql-session.d.ts +13 -0
  147. package/dist/core/common/persistence/sql/mysql/mysql-session.js +85 -0
  148. package/dist/core/common/persistence/sql/mysql/mysql-session.js.map +1 -0
  149. package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.d.ts +9 -0
  150. package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.js +264 -0
  151. package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.js.map +1 -0
  152. package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.d.ts +20 -0
  153. package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.js +519 -0
  154. package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.js.map +1 -0
  155. package/dist/core/common/persistence/sql/postgres/postgres-lock-store.d.ts +11 -0
  156. package/dist/core/common/persistence/sql/postgres/postgres-lock-store.js +44 -0
  157. package/dist/core/common/persistence/sql/postgres/postgres-lock-store.js.map +1 -0
  158. package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.d.ts +42 -0
  159. package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js +220 -0
  160. package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js.map +1 -0
  161. package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.d.ts +12 -0
  162. package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js +315 -0
  163. package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js.map +1 -0
  164. package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.d.ts +5 -0
  165. package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.js +225 -0
  166. package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.js.map +1 -0
  167. package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.d.ts +13 -0
  168. package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.js +484 -0
  169. package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.js.map +1 -0
  170. package/dist/core/common/persistence/sql/sql-cast.d.ts +2 -0
  171. package/dist/core/common/persistence/sql/sql-cast.js +194 -0
  172. package/dist/core/common/persistence/sql/sql-cast.js.map +1 -0
  173. package/dist/core/common/persistence/sql/sql-data-store.d.ts +79 -0
  174. package/dist/core/common/persistence/sql/sql-data-store.js +592 -0
  175. package/dist/core/common/persistence/sql/sql-data-store.js.map +1 -0
  176. package/dist/core/common/persistence/sql/sql-dialect.d.ts +20 -0
  177. package/dist/core/common/persistence/sql/sql-dialect.js +38 -0
  178. package/dist/core/common/persistence/sql/sql-dialect.js.map +1 -0
  179. package/dist/core/common/persistence/sql/sql-errors.d.ts +17 -0
  180. package/dist/core/common/persistence/sql/sql-errors.js +25 -0
  181. package/dist/core/common/persistence/sql/sql-errors.js.map +1 -0
  182. package/dist/core/common/persistence/sql/sql-executor.factory.d.ts +11 -0
  183. package/dist/core/common/persistence/sql/sql-executor.factory.js +199 -0
  184. package/dist/core/common/persistence/sql/sql-executor.factory.js.map +1 -0
  185. package/dist/core/common/persistence/sql/sql-executor.interface.d.ts +32 -0
  186. package/dist/core/common/persistence/sql/sql-executor.interface.js +2 -0
  187. package/dist/core/common/persistence/sql/sql-executor.interface.js.map +1 -0
  188. package/dist/core/common/persistence/sql/sql-naming.d.ts +15 -0
  189. package/dist/core/common/persistence/sql/sql-naming.js +90 -0
  190. package/dist/core/common/persistence/sql/sql-naming.js.map +1 -0
  191. package/dist/core/common/persistence/sql/sql-schema.shared.d.ts +25 -0
  192. package/dist/core/common/persistence/sql/sql-schema.shared.js +69 -0
  193. package/dist/core/common/persistence/sql/sql-schema.shared.js.map +1 -0
  194. package/dist/core/common/persistence/sql/sql-session.d.ts +6 -0
  195. package/dist/core/common/persistence/sql/sql-session.js +78 -0
  196. package/dist/core/common/persistence/sql/sql-session.js.map +1 -0
  197. package/dist/core/common/persistence/sql/where-shared.d.ts +18 -0
  198. package/dist/core/common/persistence/sql/where-shared.js +93 -0
  199. package/dist/core/common/persistence/sql/where-shared.js.map +1 -0
  200. package/dist/core/common/persistence/store-guards.d.ts +10 -0
  201. package/dist/core/common/persistence/store-guards.js +49 -0
  202. package/dist/core/common/persistence/store-guards.js.map +1 -0
  203. package/dist/core/common/persistence/store-upsert.d.ts +2 -0
  204. package/dist/core/common/persistence/store-upsert.js +20 -0
  205. package/dist/core/common/persistence/store-upsert.js.map +1 -0
  206. package/dist/core/common/persistence/unavailable-store.d.ts +2 -0
  207. package/dist/core/common/persistence/unavailable-store.js +53 -0
  208. package/dist/core/common/persistence/unavailable-store.js.map +1 -0
  209. package/dist/core/common/persistence/unsupported-capability.error.d.ts +3 -0
  210. package/dist/core/common/persistence/unsupported-capability.error.js +4 -0
  211. package/dist/core/common/persistence/unsupported-capability.error.js.map +1 -0
  212. package/dist/core/common/plugins/mongoose-audit-fields.plugin.js +24 -68
  213. package/dist/core/common/plugins/mongoose-audit-fields.plugin.js.map +1 -1
  214. package/dist/core/common/plugins/mongoose-id.plugin.js +3 -0
  215. package/dist/core/common/plugins/mongoose-id.plugin.js.map +1 -1
  216. package/dist/core/common/plugins/mongoose-password.plugin.d.ts +1 -3
  217. package/dist/core/common/plugins/mongoose-password.plugin.js +2 -45
  218. package/dist/core/common/plugins/mongoose-password.plugin.js.map +1 -1
  219. package/dist/core/common/plugins/mongoose-role-guard.plugin.js +5 -46
  220. package/dist/core/common/plugins/mongoose-role-guard.plugin.js.map +1 -1
  221. package/dist/core/common/plugins/mongoose-system-role.plugin.js +2 -43
  222. package/dist/core/common/plugins/mongoose-system-role.plugin.js.map +1 -1
  223. package/dist/core/common/plugins/mongoose-tenant.plugin.js +10 -70
  224. package/dist/core/common/plugins/mongoose-tenant.plugin.js.map +1 -1
  225. package/dist/core/common/scalars/upload.scalar.js +1 -1
  226. package/dist/core/common/scalars/upload.scalar.js.map +1 -1
  227. package/dist/core/common/services/core-cron-jobs.initializer.js +1 -1
  228. package/dist/core/common/services/core-cron-jobs.initializer.js.map +1 -1
  229. package/dist/core/common/services/core-cron-jobs.service.d.ts +1 -0
  230. package/dist/core/common/services/core-cron-jobs.service.js +23 -14
  231. package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
  232. package/dist/core/common/services/crud.service.d.ts +4 -1
  233. package/dist/core/common/services/crud.service.js +132 -23
  234. package/dist/core/common/services/crud.service.js.map +1 -1
  235. package/dist/core/common/services/model-doc.service.js +1 -1
  236. package/dist/core/common/services/model-doc.service.js.map +1 -1
  237. package/dist/core/common/services/module.service.d.ts +9 -2
  238. package/dist/core/common/services/module.service.js +51 -6
  239. package/dist/core/common/services/module.service.js.map +1 -1
  240. package/dist/core/common/types/field-selection.type.d.ts +1 -1
  241. package/dist/core/common/types/id.type.d.ts +4 -4
  242. package/dist/core/common/types/object-id-like.type.d.ts +3 -0
  243. package/dist/core/common/types/object-id-like.type.js +2 -0
  244. package/dist/core/common/types/object-id-like.type.js.map +1 -0
  245. package/dist/core/common/types/populate-config.type.d.ts +1 -1
  246. package/dist/core/common/types/string-or-object-id.type.d.ts +2 -2
  247. package/dist/core/modules/ai/core-ai.constants.d.ts +4 -0
  248. package/dist/core/modules/ai/core-ai.constants.js +4 -0
  249. package/dist/core/modules/ai/core-ai.constants.js.map +1 -1
  250. package/dist/core/modules/ai/core-ai.module.js +21 -17
  251. package/dist/core/modules/ai/core-ai.module.js.map +1 -1
  252. package/dist/core/modules/ai/models/core-ai-budget-limit.model.d.ts +2 -92
  253. package/dist/core/modules/ai/models/core-ai-budget-limit.model.js +1 -1
  254. package/dist/core/modules/ai/models/core-ai-budget-limit.model.js.map +1 -1
  255. package/dist/core/modules/ai/models/core-ai-connection-preference.model.d.ts +2 -87
  256. package/dist/core/modules/ai/models/core-ai-connection-preference.model.js +1 -1
  257. package/dist/core/modules/ai/models/core-ai-connection-preference.model.js.map +1 -1
  258. package/dist/core/modules/ai/models/core-ai-connection.model.d.ts +2 -177
  259. package/dist/core/modules/ai/models/core-ai-connection.model.js +1 -1
  260. package/dist/core/modules/ai/models/core-ai-connection.model.js.map +1 -1
  261. package/dist/core/modules/ai/models/core-ai-conversation.model.d.ts +2 -92
  262. package/dist/core/modules/ai/models/core-ai-conversation.model.js +3 -4
  263. package/dist/core/modules/ai/models/core-ai-conversation.model.js.map +1 -1
  264. package/dist/core/modules/ai/models/core-ai-interaction.model.d.ts +2 -120
  265. package/dist/core/modules/ai/models/core-ai-interaction.model.js +2 -3
  266. package/dist/core/modules/ai/models/core-ai-interaction.model.js.map +1 -1
  267. package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.d.ts +3 -0
  268. package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.js +21 -0
  269. package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.js.map +1 -0
  270. package/dist/core/modules/ai/models/core-ai-mode.model.d.ts +2 -102
  271. package/dist/core/modules/ai/models/core-ai-mode.model.js +1 -1
  272. package/dist/core/modules/ai/models/core-ai-mode.model.js.map +1 -1
  273. package/dist/core/modules/ai/models/core-ai-prompt-hint.model.d.ts +2 -97
  274. package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js +1 -1
  275. package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js.map +1 -1
  276. package/dist/core/modules/ai/models/core-ai-prompt.model.d.ts +2 -112
  277. package/dist/core/modules/ai/models/core-ai-prompt.model.js +1 -1
  278. package/dist/core/modules/ai/models/core-ai-prompt.model.js.map +1 -1
  279. package/dist/core/modules/ai/models/core-ai-slot.model.d.ts +2 -112
  280. package/dist/core/modules/ai/models/core-ai-slot.model.js +1 -1
  281. package/dist/core/modules/ai/models/core-ai-slot.model.js.map +1 -1
  282. package/dist/core/modules/ai/models/core-ai-tool-grant.model.d.ts +2 -97
  283. package/dist/core/modules/ai/models/core-ai-tool-grant.model.js +1 -1
  284. package/dist/core/modules/ai/models/core-ai-tool-grant.model.js.map +1 -1
  285. package/dist/core/modules/ai/models/core-ai-tool-policy.model.d.ts +2 -103
  286. package/dist/core/modules/ai/models/core-ai-tool-policy.model.js +1 -1
  287. package/dist/core/modules/ai/models/core-ai-tool-policy.model.js.map +1 -1
  288. package/dist/core/modules/ai/services/core-ai-budget.service.d.ts +3 -1
  289. package/dist/core/modules/ai/services/core-ai-budget.service.js +15 -5
  290. package/dist/core/modules/ai/services/core-ai-budget.service.js.map +1 -1
  291. package/dist/core/modules/ai/services/core-ai-connection-preference.service.d.ts +1 -1
  292. package/dist/core/modules/ai/services/core-ai-connection-preference.service.js +6 -10
  293. package/dist/core/modules/ai/services/core-ai-connection-preference.service.js.map +1 -1
  294. package/dist/core/modules/ai/services/core-ai-connection.service.d.ts +1 -1
  295. package/dist/core/modules/ai/services/core-ai-connection.service.js +20 -42
  296. package/dist/core/modules/ai/services/core-ai-connection.service.js.map +1 -1
  297. package/dist/core/modules/ai/services/core-ai-conversation.service.d.ts +1 -1
  298. package/dist/core/modules/ai/services/core-ai-conversation.service.js +28 -29
  299. package/dist/core/modules/ai/services/core-ai-conversation.service.js.map +1 -1
  300. package/dist/core/modules/ai/services/core-ai-interaction.service.d.ts +1 -1
  301. package/dist/core/modules/ai/services/core-ai-interaction.service.js +3 -4
  302. package/dist/core/modules/ai/services/core-ai-interaction.service.js.map +1 -1
  303. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.d.ts +8 -0
  304. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js +70 -18
  305. package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js.map +1 -1
  306. package/dist/core/modules/ai/services/core-ai-mode.service.d.ts +1 -1
  307. package/dist/core/modules/ai/services/core-ai-mode.service.js +3 -7
  308. package/dist/core/modules/ai/services/core-ai-mode.service.js.map +1 -1
  309. package/dist/core/modules/ai/services/core-ai-prompt-hint.service.d.ts +8 -1
  310. package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js +32 -26
  311. package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js.map +1 -1
  312. package/dist/core/modules/ai/services/core-ai-prompt.service.d.ts +1 -1
  313. package/dist/core/modules/ai/services/core-ai-prompt.service.js +10 -13
  314. package/dist/core/modules/ai/services/core-ai-prompt.service.js.map +1 -1
  315. package/dist/core/modules/ai/services/core-ai-slot.service.d.ts +1 -1
  316. package/dist/core/modules/ai/services/core-ai-slot.service.js +14 -25
  317. package/dist/core/modules/ai/services/core-ai-slot.service.js.map +1 -1
  318. package/dist/core/modules/ai/services/core-ai-tool-grant.service.d.ts +1 -1
  319. package/dist/core/modules/ai/services/core-ai-tool-grant.service.js +6 -18
  320. package/dist/core/modules/ai/services/core-ai-tool-grant.service.js.map +1 -1
  321. package/dist/core/modules/ai/services/core-ai-tool-policy.service.d.ts +1 -1
  322. package/dist/core/modules/ai/services/core-ai-tool-policy.service.js +4 -8
  323. package/dist/core/modules/ai/services/core-ai-tool-policy.service.js.map +1 -1
  324. package/dist/core/modules/api-token/core-api-token.model.js +1 -1
  325. package/dist/core/modules/api-token/core-api-token.model.js.map +1 -1
  326. package/dist/core/modules/api-token/core-api-token.module.js +3 -2
  327. package/dist/core/modules/api-token/core-api-token.module.js.map +1 -1
  328. package/dist/core/modules/api-token/core-api-token.service.d.ts +8 -2
  329. package/dist/core/modules/api-token/core-api-token.service.js +106 -39
  330. package/dist/core/modules/api-token/core-api-token.service.js.map +1 -1
  331. package/dist/core/modules/auth/core-auth.module.js +2 -0
  332. package/dist/core/modules/auth/core-auth.module.js.map +1 -1
  333. package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js +1 -2
  334. package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js.map +1 -1
  335. package/dist/core/modules/auth/guards/role-guard.token.d.ts +1 -0
  336. package/dist/core/modules/auth/guards/role-guard.token.js +2 -0
  337. package/dist/core/modules/auth/guards/role-guard.token.js.map +1 -0
  338. package/dist/core/modules/auth/services/core-auth.service.js +4 -2
  339. package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
  340. package/dist/core/modules/better-auth/better-auth-sql.helper.d.ts +6 -0
  341. package/dist/core/modules/better-auth/better-auth-sql.helper.js +113 -0
  342. package/dist/core/modules/better-auth/better-auth-sql.helper.js.map +1 -0
  343. package/dist/core/modules/better-auth/better-auth-token.service.d.ts +3 -1
  344. package/dist/core/modules/better-auth/better-auth-token.service.js +15 -24
  345. package/dist/core/modules/better-auth/better-auth-token.service.js.map +1 -1
  346. package/dist/core/modules/better-auth/better-auth.config.d.ts +7 -0
  347. package/dist/core/modules/better-auth/better-auth.config.js +16 -5
  348. package/dist/core/modules/better-auth/better-auth.config.js.map +1 -1
  349. package/dist/core/modules/better-auth/better-auth.types.d.ts +1 -1
  350. package/dist/core/modules/better-auth/core-better-auth-api.middleware.d.ts +1 -0
  351. package/dist/core/modules/better-auth/core-better-auth-api.middleware.js +6 -1
  352. package/dist/core/modules/better-auth/core-better-auth-api.middleware.js.map +1 -1
  353. package/dist/core/modules/better-auth/core-better-auth-challenge.service.js +30 -15
  354. package/dist/core/modules/better-auth/core-better-auth-challenge.service.js.map +1 -1
  355. package/dist/core/modules/better-auth/core-better-auth-mongo.users.d.ts +10 -0
  356. package/dist/core/modules/better-auth/core-better-auth-mongo.users.js +24 -0
  357. package/dist/core/modules/better-auth/core-better-auth-mongo.users.js.map +1 -0
  358. package/dist/core/modules/better-auth/core-better-auth-sql.registry.d.ts +3 -0
  359. package/dist/core/modules/better-auth/core-better-auth-sql.registry.js +8 -0
  360. package/dist/core/modules/better-auth/core-better-auth-sql.registry.js.map +1 -0
  361. package/dist/core/modules/better-auth/core-better-auth-sql.store.d.ts +71 -0
  362. package/dist/core/modules/better-auth/core-better-auth-sql.store.js +190 -0
  363. package/dist/core/modules/better-auth/core-better-auth-sql.store.js.map +1 -0
  364. package/dist/core/modules/better-auth/core-better-auth-user.mapper.d.ts +24 -1
  365. package/dist/core/modules/better-auth/core-better-auth-user.mapper.js +308 -32
  366. package/dist/core/modules/better-auth/core-better-auth-user.mapper.js.map +1 -1
  367. package/dist/core/modules/better-auth/core-better-auth.module.d.ts +2 -0
  368. package/dist/core/modules/better-auth/core-better-auth.module.js +54 -32
  369. package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
  370. package/dist/core/modules/better-auth/core-better-auth.service.d.ts +7 -2
  371. package/dist/core/modules/better-auth/core-better-auth.service.js +61 -9
  372. package/dist/core/modules/better-auth/core-better-auth.service.js.map +1 -1
  373. package/dist/core/modules/file/core-file-info.model.d.ts +1 -2
  374. package/dist/core/modules/file/core-file-info.model.js +2 -2
  375. package/dist/core/modules/file/core-file-info.model.js.map +1 -1
  376. package/dist/core/modules/file/core-file.service.d.ts +5 -3
  377. package/dist/core/modules/file/core-file.service.js +16 -9
  378. package/dist/core/modules/file/core-file.service.js.map +1 -1
  379. package/dist/core/modules/file/file-metadata.helper.d.ts +1 -1
  380. package/dist/core/modules/file/file-metadata.helper.js +2 -2
  381. package/dist/core/modules/file/file-metadata.helper.js.map +1 -1
  382. package/dist/core/modules/file/file-metadata.models.d.ts +35 -0
  383. package/dist/core/modules/file/file-metadata.models.js +20 -0
  384. package/dist/core/modules/file/file-metadata.models.js.map +1 -0
  385. package/dist/core/modules/file/file-metadata.store.d.ts +6 -0
  386. package/dist/core/modules/file/file-metadata.store.js +77 -0
  387. package/dist/core/modules/file/file-metadata.store.js.map +1 -0
  388. package/dist/core/modules/file/file-storage.helper.d.ts +1 -0
  389. package/dist/core/modules/file/file-storage.helper.js +34 -0
  390. package/dist/core/modules/file/file-storage.helper.js.map +1 -1
  391. package/dist/core/modules/file/filesystem-file.helper.d.ts +1 -1
  392. package/dist/core/modules/file/filesystem-file.helper.js +4 -4
  393. package/dist/core/modules/file/filesystem-file.helper.js.map +1 -1
  394. package/dist/core/modules/file/s3-file.helper.d.ts +1 -1
  395. package/dist/core/modules/file/s3-file.helper.js +5 -5
  396. package/dist/core/modules/file/s3-file.helper.js.map +1 -1
  397. package/dist/core/modules/health-check/core-health-check.module.js +12 -2
  398. package/dist/core/modules/health-check/core-health-check.module.js.map +1 -1
  399. package/dist/core/modules/health-check/core-health-check.service.d.ts +4 -3
  400. package/dist/core/modules/health-check/core-health-check.service.js +26 -5
  401. package/dist/core/modules/health-check/core-health-check.service.js.map +1 -1
  402. package/dist/core/modules/hub/core-hub.controller.d.ts +1 -0
  403. package/dist/core/modules/hub/core-hub.controller.js +10 -0
  404. package/dist/core/modules/hub/core-hub.controller.js.map +1 -1
  405. package/dist/core/modules/hub/core-hub.service.js +1 -1
  406. package/dist/core/modules/hub/core-hub.service.js.map +1 -1
  407. package/dist/core/modules/hub/helpers/hub-client-js.helper.js +23 -0
  408. package/dist/core/modules/hub/helpers/hub-client-js.helper.js.map +1 -1
  409. package/dist/core/modules/hub/hub-action-messages.d.ts +2 -0
  410. package/dist/core/modules/hub/hub-action-messages.js +2 -0
  411. package/dist/core/modules/hub/hub-action-messages.js.map +1 -1
  412. package/dist/core/modules/hub/hub-nav.js +1 -0
  413. package/dist/core/modules/hub/hub-nav.js.map +1 -1
  414. package/dist/core/modules/hub/interfaces/hub-panels.interface.d.ts +17 -1
  415. package/dist/core/modules/hub/services/core-hub-db.service.d.ts +6 -1
  416. package/dist/core/modules/hub/services/core-hub-db.service.js +16 -14
  417. package/dist/core/modules/hub/services/core-hub-db.service.js.map +1 -1
  418. package/dist/core/modules/hub/services/core-hub-migrations.service.d.ts +5 -0
  419. package/dist/core/modules/hub/services/core-hub-migrations.service.js +74 -1
  420. package/dist/core/modules/hub/services/core-hub-migrations.service.js.map +1 -1
  421. package/dist/core/modules/hub/services/core-hub-sources.service.d.ts +2 -1
  422. package/dist/core/modules/hub/services/core-hub-sources.service.js +32 -0
  423. package/dist/core/modules/hub/services/core-hub-sources.service.js.map +1 -1
  424. package/dist/core/modules/hub/services/hub-query-profiler.service.js +1 -1
  425. package/dist/core/modules/hub/services/hub-query-profiler.service.js.map +1 -1
  426. package/dist/core/modules/migrate/cli/migrate-cli.d.ts +2 -0
  427. package/dist/core/modules/migrate/cli/migrate-cli.js +35 -1
  428. package/dist/core/modules/migrate/cli/migrate-cli.js.map +1 -1
  429. package/dist/core/modules/migrate/index.d.ts +3 -0
  430. package/dist/core/modules/migrate/index.js +3 -0
  431. package/dist/core/modules/migrate/index.js.map +1 -1
  432. package/dist/core/modules/migrate/migration-runner.d.ts +2 -2
  433. package/dist/core/modules/migrate/migration-runner.js.map +1 -1
  434. package/dist/core/modules/migrate/migration-state-store.interface.d.ts +16 -0
  435. package/dist/core/modules/migrate/migration-state-store.interface.js +2 -0
  436. package/dist/core/modules/migrate/migration-state-store.interface.js.map +1 -0
  437. package/dist/core/modules/migrate/migration.helper.d.ts +3 -2
  438. package/dist/core/modules/migrate/migration.helper.js +21 -6
  439. package/dist/core/modules/migrate/migration.helper.js.map +1 -1
  440. package/dist/core/modules/migrate/mongo-state-store.d.ts +5 -12
  441. package/dist/core/modules/migrate/mongo-state-store.js +30 -24
  442. package/dist/core/modules/migrate/mongo-state-store.js.map +1 -1
  443. package/dist/core/modules/migrate/sql-migration.helper.d.ts +4 -0
  444. package/dist/core/modules/migrate/sql-migration.helper.js +34 -0
  445. package/dist/core/modules/migrate/sql-migration.helper.js.map +1 -0
  446. package/dist/core/modules/migrate/sql-state-store.d.ts +24 -0
  447. package/dist/core/modules/migrate/sql-state-store.js +129 -0
  448. package/dist/core/modules/migrate/sql-state-store.js.map +1 -0
  449. package/dist/core/modules/system-setup/core-system-setup.service.d.ts +8 -0
  450. package/dist/core/modules/system-setup/core-system-setup.service.js +41 -25
  451. package/dist/core/modules/system-setup/core-system-setup.service.js.map +1 -1
  452. package/dist/core/modules/tenant/core-tenant-member.model.js +1 -1
  453. package/dist/core/modules/tenant/core-tenant-member.model.js.map +1 -1
  454. package/dist/core/modules/tenant/core-tenant-member.store.d.ts +2 -0
  455. package/dist/core/modules/tenant/core-tenant-member.store.js +6 -0
  456. package/dist/core/modules/tenant/core-tenant-member.store.js.map +1 -0
  457. package/dist/core/modules/tenant/core-tenant.guard.d.ts +8 -3
  458. package/dist/core/modules/tenant/core-tenant.guard.js +57 -28
  459. package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -1
  460. package/dist/core/modules/tenant/core-tenant.module.js +3 -2
  461. package/dist/core/modules/tenant/core-tenant.module.js.map +1 -1
  462. package/dist/core/modules/tenant/core-tenant.service.d.ts +3 -1
  463. package/dist/core/modules/tenant/core-tenant.service.js +48 -28
  464. package/dist/core/modules/tenant/core-tenant.service.js.map +1 -1
  465. package/dist/core/modules/tus/core-tus.service.d.ts +1 -1
  466. package/dist/core/modules/tus/core-tus.service.js +8 -7
  467. package/dist/core/modules/tus/core-tus.service.js.map +1 -1
  468. package/dist/core/modules/tus/tus.module.js +1 -1
  469. package/dist/core/modules/tus/tus.module.js.map +1 -1
  470. package/dist/core/modules/user/core-user.model.d.ts +1 -1
  471. package/dist/core/modules/user/core-user.model.js +1 -1
  472. package/dist/core/modules/user/core-user.model.js.map +1 -1
  473. package/dist/core/modules/user/core-user.service.d.ts +3 -1
  474. package/dist/core/modules/user/core-user.service.js +71 -16
  475. package/dist/core/modules/user/core-user.service.js.map +1 -1
  476. package/dist/core.module.js +39 -5
  477. package/dist/core.module.js.map +1 -1
  478. package/dist/index.d.ts +26 -0
  479. package/dist/index.js +26 -0
  480. package/dist/index.js.map +1 -1
  481. package/dist/server/common/models/persistence.model.d.ts +1 -1
  482. package/dist/server/common/models/persistence.model.js +3 -3
  483. package/dist/server/common/models/persistence.model.js.map +1 -1
  484. package/dist/server/modules/file/file-info.model.d.ts +1 -77
  485. package/dist/server/modules/file/file-info.model.js +1 -1
  486. package/dist/server/modules/file/file-info.model.js.map +1 -1
  487. package/dist/server/modules/file/file.service.js +1 -1
  488. package/dist/server/modules/file/file.service.js.map +1 -1
  489. package/dist/server/modules/user/user.model.d.ts +2 -186
  490. package/dist/server/modules/user/user.model.js +4 -5
  491. package/dist/server/modules/user/user.model.js.map +1 -1
  492. package/dist/server/modules/user/user.module.js +4 -3
  493. package/dist/server/modules/user/user.module.js.map +1 -1
  494. package/dist/server/modules/user/user.service.d.ts +1 -1
  495. package/dist/server/modules/user/user.service.js +5 -8
  496. package/dist/server/modules/user/user.service.js.map +1 -1
  497. package/dist/test/test.helper.js +2 -2
  498. package/dist/test/test.helper.js.map +1 -1
  499. package/dist/types/graphql-upload.d.ts +10 -7
  500. package/docs/REQUEST-LIFECYCLE.md +6 -3
  501. package/docs/choosing-a-database.md +107 -0
  502. package/docs/native-driver-security.md +29 -0
  503. package/docs/security-overrides.md +15 -6
  504. package/migration-guides/12.0.x-to-12.1.x.md +255 -0
  505. package/package.json +75 -29
  506. package/src/core/common/decorators/unified-field.decorator.ts +11 -1
  507. package/src/core/common/filters/mongoose-cast-error.filter.ts +12 -6
  508. package/src/core/common/helpers/db.helper.ts +40 -25
  509. package/src/core/common/helpers/decorator.helper.ts +1 -1
  510. package/src/core/common/helpers/filter.helper.ts +2 -1
  511. package/src/core/common/helpers/gridfs.helper.ts +28 -9
  512. package/src/core/common/helpers/id.helper.ts +21 -4
  513. package/src/core/common/helpers/model.helper.ts +5 -6
  514. package/src/core/common/helpers/service.helper.ts +3 -3
  515. package/src/core/common/interfaces/server-options.interface.ts +118 -10
  516. package/src/core/common/interfaces/service-options.interface.ts +2 -2
  517. package/src/core/common/models/core-persistence.model.ts +3 -3
  518. package/src/core/common/persistence/core-persistence.lifecycle.ts +47 -0
  519. package/src/core/common/persistence/core-persistence.module.ts +109 -0
  520. package/src/core/common/persistence/data-source.config.ts +271 -0
  521. package/src/core/common/persistence/data-source.runtime.ts +351 -0
  522. package/src/core/common/persistence/data-store.interface.ts +155 -0
  523. package/src/core/common/persistence/expiry-sweep.ts +105 -0
  524. package/src/core/common/persistence/id-format.ts +43 -0
  525. package/src/core/common/persistence/infrastructure-locks.ts +66 -0
  526. package/src/core/common/persistence/inject-store.decorator.ts +16 -0
  527. package/src/core/common/persistence/lock-store.interface.ts +17 -0
  528. package/src/core/common/persistence/model-descriptor.interface.ts +90 -0
  529. package/src/core/common/persistence/model-metadata.registry.ts +285 -0
  530. package/src/core/common/persistence/mongo/collection-name.ts +87 -0
  531. package/src/core/common/persistence/mongo/declared-schema.view.ts +378 -0
  532. package/src/core/common/persistence/mongo/hex-object-id.ts +75 -0
  533. package/src/core/common/persistence/mongo/model-declarations.ts +135 -0
  534. package/src/core/common/persistence/mongo/mongo-packages.ts +130 -0
  535. package/src/core/common/persistence/mongo/mongoose-compat.ts +129 -0
  536. package/src/core/common/persistence/mongo/no-mongo-connection.module.ts +18 -0
  537. package/src/core/common/persistence/mongo-lock-store.ts +121 -0
  538. package/src/core/common/persistence/mongoose-data-store.ts +232 -0
  539. package/src/core/common/persistence/neutral-populate.ts +98 -0
  540. package/src/core/common/persistence/persisted-model.decorator.ts +61 -0
  541. package/src/core/common/persistence/persistence-runtime.registry.ts +152 -0
  542. package/src/core/common/persistence/persistence.tokens.ts +9 -0
  543. package/src/core/common/persistence/policies/audit.policy.ts +80 -0
  544. package/src/core/common/persistence/policies/password.policy.ts +69 -0
  545. package/src/core/common/persistence/policies/role-guard.policy.ts +74 -0
  546. package/src/core/common/persistence/policies/system-role.policy.ts +90 -0
  547. package/src/core/common/persistence/policies/tenant.policy.ts +245 -0
  548. package/src/core/common/persistence/routed-model.guard.ts +107 -0
  549. package/src/core/common/persistence/sql/mysql/mysql-data-store.ts +503 -0
  550. package/src/core/common/persistence/sql/mysql/mysql-executor.ts +281 -0
  551. package/src/core/common/persistence/sql/mysql/mysql-lock-store.ts +87 -0
  552. package/src/core/common/persistence/sql/mysql/mysql-schema.compiler.ts +424 -0
  553. package/src/core/common/persistence/sql/mysql/mysql-schema.migrator.ts +453 -0
  554. package/src/core/common/persistence/sql/mysql/mysql-session.ts +131 -0
  555. package/src/core/common/persistence/sql/mysql/mysql-update.compiler.ts +379 -0
  556. package/src/core/common/persistence/sql/mysql/mysql-where.compiler.ts +686 -0
  557. package/src/core/common/persistence/sql/postgres/postgres-lock-store.ts +76 -0
  558. package/src/core/common/persistence/sql/postgres/postgres-schema.compiler.ts +328 -0
  559. package/src/core/common/persistence/sql/postgres/postgres-schema.migrator.ts +448 -0
  560. package/src/core/common/persistence/sql/postgres/postgres-update.compiler.ts +310 -0
  561. package/src/core/common/persistence/sql/postgres/postgres-where.compiler.ts +638 -0
  562. package/src/core/common/persistence/sql/sql-cast.ts +227 -0
  563. package/src/core/common/persistence/sql/sql-data-store.ts +762 -0
  564. package/src/core/common/persistence/sql/sql-dialect.ts +85 -0
  565. package/src/core/common/persistence/sql/sql-errors.ts +49 -0
  566. package/src/core/common/persistence/sql/sql-executor.factory.ts +282 -0
  567. package/src/core/common/persistence/sql/sql-executor.interface.ts +57 -0
  568. package/src/core/common/persistence/sql/sql-naming.ts +133 -0
  569. package/src/core/common/persistence/sql/sql-schema.shared.ts +105 -0
  570. package/src/core/common/persistence/sql/sql-session.ts +158 -0
  571. package/src/core/common/persistence/sql/where-shared.ts +118 -0
  572. package/src/core/common/persistence/store-guards.ts +73 -0
  573. package/src/core/common/persistence/store-upsert.ts +36 -0
  574. package/src/core/common/persistence/unavailable-store.ts +63 -0
  575. package/src/core/common/persistence/unsupported-capability.error.ts +7 -0
  576. package/src/core/common/plugins/mongoose-audit-fields.plugin.ts +33 -74
  577. package/src/core/common/plugins/mongoose-id.plugin.ts +9 -0
  578. package/src/core/common/plugins/mongoose-password.plugin.ts +6 -62
  579. package/src/core/common/plugins/mongoose-role-guard.plugin.ts +11 -63
  580. package/src/core/common/plugins/mongoose-system-role.plugin.ts +7 -78
  581. package/src/core/common/plugins/mongoose-tenant.plugin.ts +23 -144
  582. package/src/core/common/scalars/upload.scalar.ts +8 -3
  583. package/src/core/common/services/core-cron-jobs.initializer.ts +1 -1
  584. package/src/core/common/services/core-cron-jobs.service.ts +33 -22
  585. package/src/core/common/services/crud.service.ts +166 -35
  586. package/src/core/common/services/model-doc.service.ts +1 -1
  587. package/src/core/common/services/module.service.ts +78 -6
  588. package/src/core/common/types/field-selection.type.ts +1 -1
  589. package/src/core/common/types/id.type.ts +2 -2
  590. package/src/core/common/types/object-id-like.type.ts +11 -0
  591. package/src/core/common/types/populate-config.type.ts +1 -1
  592. package/src/core/common/types/string-or-object-id.type.ts +2 -2
  593. package/src/core/modules/ai/README.md +15 -2
  594. package/src/core/modules/ai/core-ai.constants.ts +10 -0
  595. package/src/core/modules/ai/core-ai.module.ts +32 -17
  596. package/src/core/modules/ai/models/core-ai-budget-limit.model.ts +2 -2
  597. package/src/core/modules/ai/models/core-ai-connection-preference.model.ts +2 -2
  598. package/src/core/modules/ai/models/core-ai-connection.model.ts +2 -2
  599. package/src/core/modules/ai/models/core-ai-conversation.model.ts +8 -4
  600. package/src/core/modules/ai/models/core-ai-interaction.model.ts +3 -3
  601. package/src/core/modules/ai/models/core-ai-mcp-oauth.models.ts +46 -0
  602. package/src/core/modules/ai/models/core-ai-mode.model.ts +2 -2
  603. package/src/core/modules/ai/models/core-ai-prompt-hint.model.ts +2 -2
  604. package/src/core/modules/ai/models/core-ai-prompt.model.ts +2 -2
  605. package/src/core/modules/ai/models/core-ai-slot.model.ts +2 -2
  606. package/src/core/modules/ai/models/core-ai-tool-grant.model.ts +2 -2
  607. package/src/core/modules/ai/models/core-ai-tool-policy.model.ts +2 -2
  608. package/src/core/modules/ai/services/core-ai-budget.service.ts +22 -4
  609. package/src/core/modules/ai/services/core-ai-connection-preference.service.ts +6 -13
  610. package/src/core/modules/ai/services/core-ai-connection.service.ts +34 -44
  611. package/src/core/modules/ai/services/core-ai-conversation.service.ts +31 -29
  612. package/src/core/modules/ai/services/core-ai-interaction.service.ts +3 -3
  613. package/src/core/modules/ai/services/core-ai-mcp-oauth.service.ts +93 -20
  614. package/src/core/modules/ai/services/core-ai-mode.service.ts +3 -6
  615. package/src/core/modules/ai/services/core-ai-prompt-hint.service.ts +43 -26
  616. package/src/core/modules/ai/services/core-ai-prompt.service.ts +15 -12
  617. package/src/core/modules/ai/services/core-ai-slot.service.ts +20 -24
  618. package/src/core/modules/ai/services/core-ai-tool-grant.service.ts +17 -27
  619. package/src/core/modules/ai/services/core-ai-tool-policy.service.ts +7 -10
  620. package/src/core/modules/api-token/core-api-token.model.ts +1 -1
  621. package/src/core/modules/api-token/core-api-token.module.ts +4 -2
  622. package/src/core/modules/api-token/core-api-token.service.ts +118 -43
  623. package/src/core/modules/auth/core-auth.module.ts +2 -0
  624. package/src/core/modules/auth/guards/legacy-auth-rate-limit.guard.ts +4 -3
  625. package/src/core/modules/auth/guards/role-guard.token.ts +7 -0
  626. package/src/core/modules/auth/services/core-auth.service.ts +16 -2
  627. package/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md +1 -1
  628. package/src/core/modules/better-auth/README.md +10 -1
  629. package/src/core/modules/better-auth/better-auth-sql.helper.ts +191 -0
  630. package/src/core/modules/better-auth/better-auth-token.service.ts +26 -35
  631. package/src/core/modules/better-auth/better-auth.config.ts +43 -7
  632. package/src/core/modules/better-auth/better-auth.types.ts +1 -1
  633. package/src/core/modules/better-auth/core-better-auth-api.middleware.ts +13 -1
  634. package/src/core/modules/better-auth/core-better-auth-challenge.service.ts +36 -18
  635. package/src/core/modules/better-auth/core-better-auth-mongo.users.ts +35 -0
  636. package/src/core/modules/better-auth/core-better-auth-sql.registry.ts +20 -0
  637. package/src/core/modules/better-auth/core-better-auth-sql.store.ts +309 -0
  638. package/src/core/modules/better-auth/core-better-auth-user.mapper.ts +418 -40
  639. package/src/core/modules/better-auth/core-better-auth.module.ts +71 -35
  640. package/src/core/modules/better-auth/core-better-auth.service.ts +81 -12
  641. package/src/core/modules/file/README.md +16 -3
  642. package/src/core/modules/file/core-file-info.model.ts +2 -2
  643. package/src/core/modules/file/core-file.service.ts +27 -18
  644. package/src/core/modules/file/file-metadata.helper.ts +7 -3
  645. package/src/core/modules/file/file-metadata.models.ts +44 -0
  646. package/src/core/modules/file/file-metadata.store.ts +109 -0
  647. package/src/core/modules/file/file-storage.helper.ts +47 -2
  648. package/src/core/modules/file/filesystem-file.helper.ts +11 -8
  649. package/src/core/modules/file/s3-file.helper.ts +11 -7
  650. package/src/core/modules/health-check/core-health-check.module.ts +16 -2
  651. package/src/core/modules/health-check/core-health-check.service.ts +25 -3
  652. package/src/core/modules/hub/README.md +20 -11
  653. package/src/core/modules/hub/core-hub.controller.ts +5 -0
  654. package/src/core/modules/hub/core-hub.service.ts +1 -1
  655. package/src/core/modules/hub/helpers/hub-client-js.helper.ts +23 -0
  656. package/src/core/modules/hub/hub-action-messages.ts +6 -0
  657. package/src/core/modules/hub/hub-nav.ts +1 -0
  658. package/src/core/modules/hub/interfaces/hub-panels.interface.ts +8 -1
  659. package/src/core/modules/hub/services/core-hub-db.service.ts +35 -17
  660. package/src/core/modules/hub/services/core-hub-migrations.service.ts +96 -2
  661. package/src/core/modules/hub/services/core-hub-sources.service.ts +47 -1
  662. package/src/core/modules/hub/services/hub-query-profiler.service.ts +1 -1
  663. package/src/core/modules/migrate/README.md +54 -0
  664. package/src/core/modules/migrate/cli/migrate-cli.ts +44 -3
  665. package/src/core/modules/migrate/index.ts +3 -0
  666. package/src/core/modules/migrate/migration-runner.ts +3 -2
  667. package/src/core/modules/migrate/migration-state-store.interface.ts +24 -0
  668. package/src/core/modules/migrate/migration.helper.ts +35 -10
  669. package/src/core/modules/migrate/mongo-state-store.ts +64 -65
  670. package/src/core/modules/migrate/sql-migration.helper.ts +48 -0
  671. package/src/core/modules/migrate/sql-state-store.ts +198 -0
  672. package/src/core/modules/system-setup/README.md +14 -2
  673. package/src/core/modules/system-setup/core-system-setup.service.ts +77 -45
  674. package/src/core/modules/tenant/README.md +9 -2
  675. package/src/core/modules/tenant/core-tenant-member.model.ts +1 -1
  676. package/src/core/modules/tenant/core-tenant-member.store.ts +13 -0
  677. package/src/core/modules/tenant/core-tenant.guard.ts +77 -24
  678. package/src/core/modules/tenant/core-tenant.module.ts +6 -3
  679. package/src/core/modules/tenant/core-tenant.service.ts +59 -42
  680. package/src/core/modules/tus/core-tus.service.ts +11 -12
  681. package/src/core/modules/tus/tus.module.ts +1 -1
  682. package/src/core/modules/user/core-user.model.ts +2 -2
  683. package/src/core/modules/user/core-user.service.ts +98 -20
  684. package/src/core.module.ts +60 -5
  685. package/src/index.ts +26 -0
  686. package/src/server/common/models/persistence.model.ts +4 -4
  687. package/src/server/modules/file/file-info.model.ts +1 -1
  688. package/src/server/modules/file/file.service.ts +1 -1
  689. package/src/server/modules/user/user.model.ts +10 -5
  690. package/src/server/modules/user/user.module.ts +9 -3
  691. package/src/server/modules/user/user.service.ts +9 -11
  692. package/src/test/test.helper.ts +2 -2
  693. package/src/types/graphql-upload.d.ts +10 -7
package/package.json CHANGED
@@ -1,14 +1,20 @@
1
1
  {
2
2
  "name": "@lenne.tech/nest-server",
3
- "version": "12.0.0",
3
+ "version": "12.1.0",
4
4
  "type": "module",
5
- "description": "Modern, fast, powerful Node.js web framework in TypeScript based on Nest with a GraphQL API and a connection to MongoDB (or other databases).",
5
+ "description": "Server framework in TypeScript on top of NestJS: GraphQL and REST APIs on MongoDB, PostgreSQL, MySQL or MariaDB, with authentication, field-level permissions, multi-tenancy and an AI assistant.",
6
6
  "keywords": [
7
7
  "node",
8
8
  "nest",
9
+ "nestjs",
9
10
  "server",
10
11
  "mongodb",
12
+ "postgresql",
13
+ "mysql",
14
+ "mariadb",
11
15
  "graphql",
16
+ "rest",
17
+ "multi-tenancy",
12
18
  "typescript"
13
19
  ],
14
20
  "author": "lenne.Tech <info@lenne.tech> (https://lenne.tech)",
@@ -27,14 +33,16 @@
27
33
  "check": "node scripts/check.mjs",
28
34
  "check:consumer": "node scripts/check-consumer.mjs",
29
35
  "check:esm": "node scripts/check-esm-core.mjs",
30
- "check:fix": "pnpm install && pnpm run spectaql:sync && pnpm audit --fix && pnpm run check:overrides && pnpm peers check && pnpm run format && pnpm run lint:fix && pnpm run typecheck:tests && pnpm run typecheck:vendor && pnpm run check:esm && pnpm run check:swc-tdz && pnpm test && pnpm run build && pnpm run check:manifest && pnpm run check:server-start",
36
+ "check:fix": "pnpm install && pnpm run spectaql:sync && pnpm audit --fix && pnpm run check:overrides && pnpm peers check && pnpm run format && pnpm run lint:fix && pnpm run typecheck:tests && pnpm run typecheck:vendor && pnpm run check:esm && pnpm run check:swc-tdz && pnpm test && pnpm run build && pnpm run check:manifest && pnpm run check:without-mongodb && pnpm run check:server-start",
31
37
  "check:manifest": "node scripts/check-package-manifest.mjs",
32
38
  "check:mutations": "node scripts/check-mutations.mjs",
33
- "check:naf": "pnpm install && pnpm run spectaql:sync && pnpm run check:overrides && pnpm peers check && pnpm run format && pnpm run lint:fix && pnpm run typecheck:tests && pnpm run typecheck:vendor && pnpm run check:esm && pnpm run check:swc-tdz && pnpm test && pnpm run build && pnpm run check:manifest && pnpm run check:server-start",
39
+ "check:naf": "pnpm install && pnpm run spectaql:sync && pnpm run check:overrides && pnpm peers check && pnpm run format && pnpm run lint:fix && pnpm run typecheck:tests && pnpm run typecheck:vendor && pnpm run check:esm && pnpm run check:swc-tdz && pnpm test && pnpm run build && pnpm run check:manifest && pnpm run check:without-mongodb && pnpm run check:server-start",
34
40
  "check:overrides": "node scripts/check-overrides.mjs",
35
- "check:raw": "pnpm install --frozen-lockfile && pnpm run spectaql:sync && pnpm audit && pnpm run check:overrides && pnpm peers check && pnpm run format:check && pnpm run lint && pnpm run typecheck:tests && pnpm run typecheck:vendor && pnpm run check:esm && pnpm run check:swc-tdz && pnpm test && pnpm run build && pnpm run check:manifest && pnpm run check:server-start",
41
+ "check:raw": "pnpm install --frozen-lockfile && pnpm run spectaql:sync && pnpm audit && pnpm run check:overrides && pnpm peers check && pnpm run format:check && pnpm run lint && pnpm run typecheck:tests && pnpm run typecheck:vendor && pnpm run check:esm && pnpm run check:swc-tdz && pnpm test && pnpm run build && pnpm run check:manifest && pnpm run check:without-mongodb && pnpm run check:server-start",
36
42
  "check:server-start": "cross-env NODE_ENV=local node scripts/check-server-start.mjs --entry=dist/main.js --port-env=NSC__PORT --ready=\"Server starte[dt] at\" --path=/",
37
43
  "check:swc-tdz": "nest build -b swc -p tsconfig.swc-tdz.json && node scripts/check-swc-tdz.mjs",
44
+ "check:without-mongodb": "node scripts/check-without-mongodb.mjs --dist",
45
+ "check:without-mongodb:package": "node scripts/check-without-mongodb.mjs --package",
38
46
  "cnaf": "pnpm run check:naf",
39
47
  "docs": "pnpm run docs:ci && node scripts/open.mjs http://127.0.0.1:8080/ ./public/index.html && compodoc -p tsconfig.json -s",
40
48
  "docs:bootstrap": "node extras/update-spectaql-version.mjs && node scripts/run-spectaql.mjs",
@@ -95,16 +103,15 @@
95
103
  "@as-integrations/express5": "1.1.2",
96
104
  "@getbrevo/brevo": "6.2.0",
97
105
  "@modelcontextprotocol/sdk": "1.32.2",
98
- "@nestjs/apollo": "14.0.3",
99
- "@nestjs/common": "12.2.0",
100
- "@nestjs/core": "12.2.0",
101
- "@nestjs/graphql": "14.0.3",
106
+ "@nestjs/apollo": "14.1.1",
107
+ "@nestjs/common": "12.3.2",
108
+ "@nestjs/core": "12.3.2",
109
+ "@nestjs/graphql": "14.1.0",
102
110
  "@nestjs/jwt": "12.0.3",
103
- "@nestjs/mongoose": "12.0.0",
104
111
  "@nestjs/passport": "12.0.0",
105
- "@nestjs/platform-express": "12.2.0",
112
+ "@nestjs/platform-express": "12.3.2",
106
113
  "@nestjs/schedule": "12.0.2",
107
- "@nestjs/swagger": "12.0.4",
114
+ "@nestjs/swagger": "12.0.5",
108
115
  "@nestjs/terminus": "12.1.0",
109
116
  "@tus/file-store": "2.1.1",
110
117
  "@tus/server": "2.4.6",
@@ -121,14 +128,12 @@
121
128
  "graphql": "16.14.2",
122
129
  "graphql-query-complexity": "2.0.0",
123
130
  "graphql-subscriptions": "3.0.0",
124
- "graphql-upload": "15.0.2",
131
+ "graphql-upload": "17.1.0",
125
132
  "graphql-ws": "6.3.0",
126
133
  "jose": "6.2.13",
127
134
  "js-sha256": "1.0.0",
128
135
  "json-to-graphql-query": "2.3.0",
129
136
  "lodash": "4.18.1",
130
- "mongodb": "7.7.0",
131
- "mongoose": "9.11.4",
132
137
  "multer": "2.5.0",
133
138
  "node-mailjet": "6.0.11",
134
139
  "nodemailer": "10.2.1",
@@ -149,11 +154,19 @@
149
154
  "@aws-sdk/s3-request-presigner": ">=3.1045.0 <4",
150
155
  "@better-auth/core": ">=1.7.12 <1.8.0",
151
156
  "@better-auth/passkey": ">=1.7.12 <1.8.0",
157
+ "@nestjs/mongoose": ">=12.0.0 <13",
152
158
  "@swc/core": ">=1.10.0 <2",
153
159
  "@tus/s3-store": ">=2.0.5 <3",
154
160
  "better-auth": ">=1.7.12 <1.8.0",
155
161
  "bullmq": ">=5.16.0 <7",
156
- "ioredis": ">=5.0.0 <7"
162
+ "drizzle-orm": "1.0.0-rc.5",
163
+ "ioredis": ">=5.0.0 <7",
164
+ "kysely": ">=0.29.0 <0.30.0",
165
+ "mongodb": ">=7.7.0 <8",
166
+ "mongoose": ">=9.11.4 <10",
167
+ "mysql2": ">=3.24.6 <4",
168
+ "pg": ">=8.23.0 <9",
169
+ "typeorm": ">=1.1.0 <2"
157
170
  },
158
171
  "peerDependenciesMeta": {
159
172
  "@aws-sdk/client-s3": {
@@ -171,6 +184,9 @@
171
184
  "@better-auth/passkey": {
172
185
  "optional": false
173
186
  },
187
+ "@nestjs/mongoose": {
188
+ "optional": true
189
+ },
174
190
  "@swc/core": {
175
191
  "optional": true
176
192
  },
@@ -183,21 +199,43 @@
183
199
  "bullmq": {
184
200
  "optional": true
185
201
  },
202
+ "drizzle-orm": {
203
+ "optional": true
204
+ },
186
205
  "ioredis": {
187
206
  "optional": true
207
+ },
208
+ "kysely": {
209
+ "optional": true
210
+ },
211
+ "mongodb": {
212
+ "optional": true
213
+ },
214
+ "mongoose": {
215
+ "optional": true
216
+ },
217
+ "mysql2": {
218
+ "optional": true
219
+ },
220
+ "pg": {
221
+ "optional": true
222
+ },
223
+ "typeorm": {
224
+ "optional": true
188
225
  }
189
226
  },
190
227
  "devDependencies": {
191
- "@aws-sdk/client-s3": "3.1156.0",
192
- "@aws-sdk/lib-storage": "3.1156.0",
193
- "@aws-sdk/s3-request-presigner": "3.1156.0",
194
- "@better-auth/core": "1.7.13",
195
- "@better-auth/passkey": "1.7.13",
228
+ "@aws-sdk/client-s3": "3.1158.0",
229
+ "@aws-sdk/lib-storage": "3.1158.0",
230
+ "@aws-sdk/s3-request-presigner": "3.1158.0",
231
+ "@better-auth/core": "1.7.14",
232
+ "@better-auth/passkey": "1.7.14",
196
233
  "@compodoc/compodoc": "2.0.0",
197
- "@nestjs/cli": "12.0.10",
198
- "@nestjs/schematics": "12.0.10",
199
- "@nestjs/testing": "12.2.0",
200
- "@swc/cli": "0.8.1",
234
+ "@nestjs/cli": "12.0.11",
235
+ "@nestjs/mongoose": "12.0.0",
236
+ "@nestjs/schematics": "12.0.12",
237
+ "@nestjs/testing": "12.3.2",
238
+ "@swc/cli": "0.8.2",
201
239
  "@swc/core": "1.16.20",
202
240
  "@tus/s3-store": "2.0.9",
203
241
  "@types/compression": "1.8.1",
@@ -208,20 +246,28 @@
208
246
  "@types/multer": "2.3.0",
209
247
  "@types/node": "26.6.5",
210
248
  "@types/passport": "1.0.17",
249
+ "@types/pg": "8.23.1",
211
250
  "@vitest/coverage-v8": "5.0.5",
212
- "better-auth": "1.7.13",
213
- "bullmq": "6.4.2",
251
+ "better-auth": "1.7.14",
252
+ "bullmq": "6.5.0",
214
253
  "cross-env": "10.1.0",
254
+ "drizzle-orm": "1.0.0-rc.5",
215
255
  "ioredis": "6.0.0",
256
+ "kysely": "0.29.7",
257
+ "mongodb": "7.7.0",
258
+ "mongoose": "9.11.4",
259
+ "mysql2": "3.24.6",
216
260
  "nodemon": "3.1.14",
217
261
  "otpauth": "9.5.2",
218
- "oxfmt": "0.74.0",
219
- "oxlint": "1.89.0",
262
+ "oxfmt": "0.75.0",
263
+ "oxlint": "1.90.0",
220
264
  "oxlint-tsgolint": "7.0.2005",
265
+ "pg": "8.23.1",
221
266
  "rimraf": "6.1.3",
222
267
  "smtp-server": "3.21.1",
223
268
  "tsx": "4.23.15",
224
269
  "tus-js-client": "4.3.1",
270
+ "typeorm": "1.1.2",
225
271
  "typescript": "6.0.3",
226
272
  "unplugin-swc": "2.0.0",
227
273
  "vite": "8.3.4",
@@ -1,5 +1,6 @@
1
1
  import { Field, FieldOptions, HideField, TypeMetadataStorage } from '@nestjs/graphql';
2
- import { Prop, PropOptions } from '@nestjs/mongoose';
2
+ import type { PropOptions } from '@nestjs/mongoose';
3
+ import { Prop } from '../persistence/mongo/mongoose-compat.js';
3
4
  import { ApiHideProperty, ApiProperty, ApiPropertyOptions } from '@nestjs/swagger';
4
5
  import { Type } from 'class-transformer';
5
6
  import {
@@ -178,6 +179,11 @@ export interface UnifiedFieldOptions {
178
179
  isOptional?: boolean;
179
180
  /** Whether to apply Mongoose @Prop decorator. Optional, used for database models. Default: false */
180
181
  mongoose?: boolean | PropOptions;
182
+ /**
183
+ * Previous name of a persisted field. A SQL data store renames the column instead of adding a new, empty one;
184
+ * MongoDB is not affected (its documents keep the old key until a migration moves it). Needs `mongoose`.
185
+ */
186
+ renamedFrom?: string;
181
187
  /** Restricted roles */
182
188
  roles?: RestrictedType | RoleEnum | RoleEnum[];
183
189
  /** Options for swagger api documentation */
@@ -563,6 +569,10 @@ export function UnifiedField(opts: UnifiedFieldOptions = {}): PropertyDecorator
563
569
  propOptions.type = [baseType];
564
570
  }
565
571
 
572
+ if (opts.renamedFrom && typeof propOptions === 'object' && !Array.isArray(propOptions)) {
573
+ propOptions.renamedFrom = opts.renamedFrom;
574
+ }
575
+
566
576
  Prop(propOptions)(target, propertyKey);
567
577
  }
568
578
  };
@@ -8,9 +8,11 @@ import {
8
8
  Logger,
9
9
  NotFoundException,
10
10
  } from '@nestjs/common';
11
- import { Error as MongooseError } from 'mongoose';
11
+ import type { Error as MongooseError } from 'mongoose';
12
12
 
13
13
  import { ErrorCode } from '../../modules/error-code/error-codes.js';
14
+ import { optionalMongoPackages } from '../persistence/mongo/mongo-packages.js';
15
+ import { QueryCastError } from '../persistence/sql/sql-errors.js';
14
16
 
15
17
  import type { GqlContextType } from '@nestjs/graphql';
16
18
  import type { Request, Response } from 'express';
@@ -221,7 +223,11 @@ export function classifyGraphQlCastError(value: unknown, args: unknown): CastErr
221
223
  * - a `BSONError` from `new Types.ObjectId(bad)` in service code carries no value to classify; such code
222
224
  * should check the id itself (see `CoreFileService.isMalformedFileId()`).
223
225
  */
224
- @Catch(MongooseError.CastError)
226
+ /** A cast failure from either store: Mongoose's `CastError`, or the SQL store's `QueryCastError` (same rules, same fields) */
227
+ export type CastFailure = MongooseError.CastError | QueryCastError;
228
+
229
+ // Mongoose's CastError only where Mongoose is installed: a project on PostgreSQL alone raises QueryCastError only
230
+ @Catch(...[optionalMongoPackages()?.mongoose.Error.CastError, QueryCastError].filter((type) => !!type))
225
231
  export class MongooseCastErrorFilter implements ExceptionFilter {
226
232
  protected static readonly logger = new Logger('MongooseCastErrorFilter');
227
233
 
@@ -231,7 +237,7 @@ export class MongooseCastErrorFilter implements ExceptionFilter {
231
237
  */
232
238
  protected static readonly unknownErrorLogger = new Logger('ExceptionsHandler');
233
239
 
234
- catch(exception: MongooseError.CastError, host: ArgumentsHost): HttpException | undefined {
240
+ catch(exception: CastFailure, host: ArgumentsHost): HttpException | undefined {
235
241
  const type = host.getType<GqlContextType>();
236
242
  if (type === 'graphql') {
237
243
  return this.catchGraphQl(exception, host);
@@ -247,7 +253,7 @@ export class MongooseCastErrorFilter implements ExceptionFilter {
247
253
  * GraphQL: the returned exception becomes the field error. Returning nothing hands the error back to
248
254
  * Nest's external exception handler, which logs and rethrows it — what happened before this filter.
249
255
  */
250
- protected catchGraphQl(exception: MongooseError.CastError, host: ArgumentsHost): HttpException | undefined {
256
+ protected catchGraphQl(exception: CastFailure, host: ArgumentsHost): HttpException | undefined {
251
257
  const origin = classifyGraphQlCastError(exception.value, host.getArgByIndex(1));
252
258
  if (origin === 'server') {
253
259
  return undefined;
@@ -259,7 +265,7 @@ export class MongooseCastErrorFilter implements ExceptionFilter {
259
265
  * REST: a filter that matched must answer the request itself — Nest does not fall back to its own
260
266
  * handler afterwards.
261
267
  */
262
- protected catchHttp(exception: MongooseError.CastError, host: ArgumentsHost): void {
268
+ protected catchHttp(exception: CastFailure, host: ArgumentsHost): void {
263
269
  const ctx = host.switchToHttp();
264
270
  const response = ctx.getResponse<Response>();
265
271
  const origin = classifyHttpCastError(exception.value, ctx.getRequest<Request>());
@@ -280,7 +286,7 @@ export class MongooseCastErrorFilter implements ExceptionFilter {
280
286
  * The client error a request-supplied cast failure is answered with. The Mongoose message stays in
281
287
  * the server log (debug level): it names the model, which is none of the client's business.
282
288
  */
283
- protected toHttpException(exception: MongooseError.CastError, origin: 'identifier' | 'input'): HttpException {
289
+ protected toHttpException(exception: CastFailure, origin: 'identifier' | 'input'): HttpException {
284
290
  MongooseCastErrorFilter.logger.debug(
285
291
  `Cast failed on a value from the request (${origin === 'identifier' ? 404 : 400}): ${exception.message}`,
286
292
  );
@@ -1,13 +1,16 @@
1
1
  import { FieldNode, GraphQLResolveInfo, SelectionNode } from 'graphql';
2
- import { Document, Model, PopulateOptions, Query, Types } from 'mongoose';
2
+ import type { Document, Model, PopulateOptions, Query } from 'mongoose';
3
3
 
4
4
  import { ResolveSelector } from '../interfaces/resolve-selector.interface.js';
5
5
  import { CoreModel } from '../models/core-model.model.js';
6
+ import { isWellFormedId } from '../persistence/id-format.js';
6
7
  import { FieldSelection } from '../types/field-selection.type.js';
7
8
  import { IdsType } from '../types/ids.type.js';
8
9
  import { StringOrObjectId } from '../types/string-or-object-id.type.js';
9
10
  import { equalIds, getObjectIds, getStringIds } from './id.helper.js';
10
11
  import { removePropertiesDeep } from './input.helper.js';
12
+ import { isMongooseQuery } from '../persistence/mongo/mongoose-compat.js';
13
+ import { isObjectIdLike } from './id.helper.js';
11
14
 
12
15
  /**
13
16
  * The ID helpers moved to `./id.helper` and are re-exported here so every existing import path keeps
@@ -67,10 +70,10 @@ export function addIds(
67
70
  if (
68
71
  result.length &&
69
72
  convert === 'auto' &&
70
- ((result[0] instanceof Types.ObjectId && !(ids instanceof Types.ObjectId)) ||
73
+ ((isObjectIdLike(result[0]) && !isObjectIdLike(ids)) ||
71
74
  (typeof result[0] === 'string' && typeof ids !== 'string'))
72
75
  ) {
73
- const converted = result[0] instanceof Types.ObjectId ? getObjectIds(ids) : getStringIds(ids);
76
+ const converted = isObjectIdLike(result[0]) ? getObjectIds(ids) : getStringIds(ids);
74
77
  result.push(...(converted as any));
75
78
  } else {
76
79
  // Add ID
@@ -100,7 +103,7 @@ export function checkStringIds(ids: string | string[]): boolean {
100
103
  }
101
104
  try {
102
105
  for (const id of ids) {
103
- if (typeof id !== 'string' || id.length !== 24 || !Types.ObjectId.isValid(id)) {
106
+ if (typeof id !== 'string' || !isWellFormedId(id)) {
104
107
  return false;
105
108
  }
106
109
  }
@@ -310,7 +313,7 @@ export function objectIdsToStrings(element: any, prepared: WeakMap<any, any> = n
310
313
  }
311
314
 
312
315
  // ObjectId to string
313
- if (element instanceof Types.ObjectId) {
316
+ if (isObjectIdLike(element)) {
314
317
  return element.toHexString();
315
318
  }
316
319
 
@@ -339,6 +342,32 @@ export function objectIdsToStrings(element: any, prepared: WeakMap<any, any> = n
339
342
  /**
340
343
  * Set populates, execute and map result
341
344
  */
345
+ /**
346
+ * A field selection (populate paths, GraphQL selection nodes or resolve info) as populate options — the form both
347
+ * Mongoose populate and the neutral populate of the SQL store read.
348
+ */
349
+ export function toPopulateOptions(populate: FieldSelection): PopulateOptions[] {
350
+ if (!populate) {
351
+ return [];
352
+ }
353
+ if (
354
+ Array.isArray(populate) &&
355
+ (typeof (populate as string[])[0] === 'string' || typeof (populate as PopulateOptions[])[0]?.path === 'string')
356
+ ) {
357
+ return populate as PopulateOptions[];
358
+ }
359
+ if (Array.isArray(populate) && typeof (populate as SelectionNode[])[0]?.kind === 'string') {
360
+ return getPopulatOptionsFromSelections(populate as SelectionNode[]);
361
+ }
362
+ if ((populate as ResolveSelector).info) {
363
+ return getPopulateOptions((populate as ResolveSelector).info, (populate as ResolveSelector).select);
364
+ }
365
+ if (typeof populate === 'string' || (populate as PopulateOptions).path) {
366
+ return [populate as PopulateOptions];
367
+ }
368
+ return [];
369
+ }
370
+
342
371
  export async function popAndMap<T extends CoreModel>(
343
372
  queryOrDocument: Document | Document[] | Query<any, any>,
344
373
  populate: FieldSelection,
@@ -349,26 +378,12 @@ export async function popAndMap<T extends CoreModel>(
349
378
  },
350
379
  ): Promise<T | T[]> {
351
380
  let result;
352
- let populateOptions: PopulateOptions[] = [];
381
+ const populateOptions = toPopulateOptions(populate);
353
382
  const ignoreSelections = options?.ignoreSelections;
354
- if (populate) {
355
- if (
356
- Array.isArray(populate) &&
357
- (typeof (populate as string[])[0] === 'string' || typeof (populate as PopulateOptions[])[0]?.path === 'string')
358
- ) {
359
- populateOptions = populate as PopulateOptions[];
360
- } else if (Array.isArray(populate) && typeof (populate as SelectionNode[])[0]?.kind === 'string') {
361
- populateOptions = getPopulatOptionsFromSelections(populate as SelectionNode[]);
362
- } else if ((populate as ResolveSelector).info) {
363
- populateOptions = getPopulateOptions((populate as ResolveSelector).info, (populate as ResolveSelector).select);
364
- } else if (typeof populate === 'string' || (populate as PopulateOptions).path) {
365
- populateOptions = [populate as PopulateOptions];
366
- }
367
- }
368
- if (queryOrDocument instanceof Query) {
383
+ if (isMongooseQuery(queryOrDocument)) {
369
384
  // Get result
370
385
  result = await setPopulates(queryOrDocument, populateOptions, mongooseModel);
371
- if (result instanceof Query) {
386
+ if (isMongooseQuery(result)) {
372
387
  result = await result.exec();
373
388
  }
374
389
 
@@ -473,7 +488,7 @@ export function removeUnresolvedReferences<T = any>(
473
488
 
474
489
  // populatedOptions is a string — leaf operation, no deep recursion risk
475
490
  if (typeof populatedOptions === 'string') {
476
- if (!['_id', 'id'].includes(populatedOptions) && populated[populatedOptions] instanceof Types.ObjectId) {
491
+ if (!['_id', 'id'].includes(populatedOptions) && isObjectIdLike(populated[populatedOptions])) {
477
492
  populated[populatedOptions] = null;
478
493
  }
479
494
  return populated;
@@ -482,7 +497,7 @@ export function removeUnresolvedReferences<T = any>(
482
497
  // populatedOptions is a PopulateOptions object
483
498
  if (populatedOptions.path) {
484
499
  const key = populatedOptions.path;
485
- if (!['_id', 'id'].includes(key) && populated[key] instanceof Types.ObjectId) {
500
+ if (!['_id', 'id'].includes(key) && isObjectIdLike(populated[key])) {
486
501
  populated[key] = null;
487
502
  } else if (populatedOptions.populate) {
488
503
  // Prevent circular reference loops when descending into nested populates
@@ -527,7 +542,7 @@ export async function setPopulates<T = Document | Query<any, any>>(
527
542
  }
528
543
 
529
544
  // Query => Chaining
530
- if (queryOrDocument instanceof Query) {
545
+ if (isMongooseQuery(queryOrDocument)) {
531
546
  for (const populateOption of populateOptions) {
532
547
  queryOrDocument = (queryOrDocument as any).populate(populateOption);
533
548
  }
@@ -1,6 +1,6 @@
1
1
  import { ExecutionContext } from '@nestjs/common';
2
2
  import { GqlContextType, GqlExecutionContext } from '@nestjs/graphql';
3
- import { PopulateOptions } from 'mongoose';
3
+ import type { PopulateOptions } from 'mongoose';
4
4
 
5
5
  import { getPopulateOptions } from './db.helper.js';
6
6
  import { removePropertiesDeep } from './input.helper.js';
@@ -1,4 +1,5 @@
1
- import { QueryFilter, QueryOptions } from 'mongoose';
1
+ import type { QueryFilter } from 'mongoose';
2
+ import type { QueryOptions } from 'mongoose';
2
3
 
3
4
  import { FilterArgs } from '../args/filter.args.js';
4
5
  import { ComparisonOperatorEnum } from '../enums/comparison-operator.enum.js';
@@ -1,8 +1,8 @@
1
- import { mongo, Types } from 'mongoose';
1
+ import type { mongo, Types } from 'mongoose';
2
2
  import { Readable } from 'stream';
3
+ import { newObjectId } from '../persistence/mongo/mongoose-compat.js';
3
4
 
4
5
  // Use Mongoose's MongoDB types to avoid BSON version conflicts
5
- const ObjectId = Types.ObjectId;
6
6
 
7
7
  /**
8
8
  * GridFS File Info interface matching the structure from GridFS
@@ -166,7 +166,7 @@ export class GridFSHelper {
166
166
  let downloadStream: GridFSBucketReadStream;
167
167
 
168
168
  if (options._id) {
169
- const objectId = typeof options._id === 'string' ? new ObjectId(options._id) : options._id;
169
+ const objectId = typeof options._id === 'string' ? newObjectId(options._id) : options._id;
170
170
  downloadStream = bucket.openDownloadStream(objectId);
171
171
  } else if (options.filename) {
172
172
  downloadStream = bucket.openDownloadStreamByName(options.filename);
@@ -191,8 +191,15 @@ export class GridFSHelper {
191
191
  /**
192
192
  * Find file metadata by ID
193
193
  */
194
- static async findFileById(bucket: GridFSBucket, id: string | Types.ObjectId): Promise<GridFSFileInfo | null> {
195
- const objectId = typeof id === 'string' ? new ObjectId(id) : id;
194
+ static async findFileById(
195
+ bucket: GridFSBucket | undefined,
196
+ id: string | Types.ObjectId,
197
+ ): Promise<GridFSFileInfo | null> {
198
+ // No bucket without MongoDB: a GridFS read finds nothing there, as for an empty bucket
199
+ if (!bucket) {
200
+ return null;
201
+ }
202
+ const objectId = typeof id === 'string' ? newObjectId(id) : id;
196
203
  const files = await bucket.find({ _id: objectId }).toArray();
197
204
  return files.length > 0 ? GridFSHelper.normalizeFileInfo(files[0]) : null;
198
205
  }
@@ -213,7 +220,11 @@ export class GridFSHelper {
213
220
  * and only corrects the document describing them. `_id` breaks the tie, so two files written in
214
221
  * the same millisecond still order totally.
215
222
  */
216
- static async findFileByName(bucket: GridFSBucket, filename: string): Promise<GridFSFileInfo | null> {
223
+ static async findFileByName(bucket: GridFSBucket | undefined, filename: string): Promise<GridFSFileInfo | null> {
224
+ // No bucket without MongoDB: a GridFS read finds nothing there, as for an empty bucket
225
+ if (!bucket) {
226
+ return null;
227
+ }
217
228
  // `uploadDate` FIRST: MongoDB applies sort keys in document order, so leading with `_id` would
218
229
  // make the tie-break the primary key and could disagree with the driver's own by-name revision
219
230
  // order (which sorts on `uploadDate` alone).
@@ -237,7 +248,15 @@ export class GridFSHelper {
237
248
  * pre-switch files on any other. That is exactly the "switching drivers is
238
249
  * forward-only, no migration" promise failing for one field.
239
250
  */
240
- static async findFiles(bucket: GridFSBucket, filter: any = {}, options: any = {}): Promise<GridFSFileInfo[]> {
251
+ static async findFiles(
252
+ bucket: GridFSBucket | undefined,
253
+ filter: any = {},
254
+ options: any = {},
255
+ ): Promise<GridFSFileInfo[]> {
256
+ // No bucket without MongoDB: a GridFS read finds nothing there, as for an empty bucket
257
+ if (!bucket) {
258
+ return [];
259
+ }
241
260
  const query = GridFSHelper.mapContentTypeKeys(filter);
242
261
  const findOptions =
243
262
  options && options.sort ? { ...options, sort: GridFSHelper.mapContentTypeKeys(options.sort) } : options;
@@ -274,7 +293,7 @@ export class GridFSHelper {
274
293
  * Delete a file from GridFS
275
294
  */
276
295
  static async deleteFile(bucket: GridFSBucket, id: string | Types.ObjectId): Promise<void> {
277
- const objectId = typeof id === 'string' ? new ObjectId(id) : id;
296
+ const objectId = typeof id === 'string' ? newObjectId(id) : id;
278
297
  await bucket.delete(objectId);
279
298
  }
280
299
 
@@ -282,7 +301,7 @@ export class GridFSHelper {
282
301
  * Open download stream by ID
283
302
  */
284
303
  static openDownloadStream(bucket: GridFSBucket, id: string | Types.ObjectId): GridFSBucketReadStream {
285
- const objectId = typeof id === 'string' ? new ObjectId(id) : id;
304
+ const objectId = typeof id === 'string' ? newObjectId(id) : id;
286
305
  return bucket.openDownloadStream(objectId);
287
306
  }
288
307
 
@@ -29,9 +29,23 @@
29
29
  * See .claude/rules/architecture.md → "DI Token Placement (SWC-Safe)".
30
30
  */
31
31
  import _ from 'lodash';
32
- import { Types } from 'mongoose';
32
+ import type { Types } from 'mongoose';
33
33
 
34
34
  import { IdsType } from '../types/ids.type.js';
35
+ import { newObjectId } from '../persistence/mongo/mongoose-compat.js';
36
+
37
+ /**
38
+ * Whether a value is an ObjectId, recognised by bson's own type tag instead of by class identity, so
39
+ * an ObjectId from a second installed copy of bson counts too. A mongoose `Types.ObjectId` is one.
40
+ */
41
+ export function isObjectIdLike(value: unknown): value is { toHexString(): string } {
42
+ return (
43
+ !!value &&
44
+ typeof value === 'object' &&
45
+ (value as { _bsontype?: unknown })._bsontype === 'ObjectId' &&
46
+ typeof (value as { toHexString?: unknown }).toHexString === 'function'
47
+ );
48
+ }
35
49
 
36
50
  /**
37
51
  * Checks if all IDs are equal
@@ -96,9 +110,9 @@ export function getObjectIds(ids: any[]): Types.ObjectId[];
96
110
  export function getObjectIds(ids: any): Types.ObjectId;
97
111
  export function getObjectIds<T extends any | any[]>(ids: T): Types.ObjectId | Types.ObjectId[] {
98
112
  if (Array.isArray(ids)) {
99
- return ids.map((id) => new Types.ObjectId(getStringId(id)));
113
+ return ids.map((id) => newObjectId(getStringId(id)));
100
114
  }
101
- return new Types.ObjectId(getStringId(ids));
115
+ return newObjectId(getStringId(ids));
102
116
  }
103
117
 
104
118
  /**
@@ -175,7 +189,10 @@ function getStringId(element: any): string {
175
189
 
176
190
  // Object handling
177
191
  if (typeof element === 'object') {
178
- if (element instanceof Types.ObjectId) {
192
+ // By bson type tag rather than `instanceof Types.ObjectId`: an ObjectId from another bson copy
193
+ // fails `instanceof`, and its `id` bytes are a plain Uint8Array outside Node — the branch below
194
+ // would then stringify the bytes ("101,31,0,…") instead of returning the hex id.
195
+ if (isObjectIdLike(element)) {
179
196
  return element.toHexString();
180
197
  }
181
198
 
@@ -1,6 +1,5 @@
1
- import { Types } from 'mongoose';
2
-
3
1
  import { clone, plainToInstanceClean } from './input.helper.js';
2
+ import { isObjectIdLike } from './id.helper.js';
4
3
 
5
4
  /**
6
5
  * Helper class for models
@@ -135,7 +134,7 @@ export function mapClasses<T = Record<string, any>>(
135
134
  for (const item of value) {
136
135
  if (item instanceof targetClass) {
137
136
  arr.push(item);
138
- } else if (item instanceof Types.ObjectId) {
137
+ } else if (isObjectIdLike(item)) {
139
138
  config.objectIdsToString ? arr.push(item.toHexString()) : arr.push(item);
140
139
  } else if (typeof item === 'object') {
141
140
  if (targetClass.map) {
@@ -150,7 +149,7 @@ export function mapClasses<T = Record<string, any>>(
150
149
  target[prop] = arr as any;
151
150
 
152
151
  // Process ObjectId
153
- } else if (value instanceof Types.ObjectId) {
152
+ } else if (isObjectIdLike(value)) {
154
153
  target[prop] = config.objectIdsToString ? value.toHexString() : value;
155
154
 
156
155
  // Process object
@@ -222,7 +221,7 @@ export async function mapClassesAsync<T = Record<string, any>>(
222
221
  for (const item of value) {
223
222
  if (item instanceof targetClass) {
224
223
  arr.push(item);
225
- } else if (item instanceof Types.ObjectId) {
224
+ } else if (isObjectIdLike(item)) {
226
225
  config.objectIdsToString ? arr.push(item.toHexString()) : arr.push(item);
227
226
  } else if (typeof item === 'object') {
228
227
  if (targetClass.map) {
@@ -237,7 +236,7 @@ export async function mapClassesAsync<T = Record<string, any>>(
237
236
  target[prop] = arr as any;
238
237
 
239
238
  // Process ObjectId
240
- } else if (value instanceof Types.ObjectId) {
239
+ } else if (isObjectIdLike(value)) {
241
240
  target[prop] = config.objectIdsToString ? value.toHexString() : value;
242
241
 
243
242
  // Process object
@@ -1,7 +1,6 @@
1
1
  import bcrypt from 'bcrypt';
2
2
  import { sha256 } from 'js-sha256';
3
3
  import _ from 'lodash';
4
- import { Types } from 'mongoose';
5
4
 
6
5
  import { RoleEnum } from '../enums/role.enum.js';
7
6
  import { accessDeniedException } from '../exceptions/access-denied.exception.js';
@@ -12,6 +11,7 @@ import { ServiceOptions } from '../interfaces/service-options.interface.js';
12
11
  import { ConfigService } from '../services/config.service.js';
13
12
  import { getStringIds } from './db.helper.js';
14
13
  import { clone, plainToInstanceClean, processDeep } from './input.helper.js';
14
+ import { isObjectIdLike } from './id.helper.js';
15
15
 
16
16
  // Secret field names for recursive removal in prepareOutput — allocated once, never change.
17
17
  // Only fields that are NEVER needed internally (hashed passwords, one-time tokens).
@@ -136,7 +136,7 @@ export async function prepareInput<T = any>(
136
136
  input = processDeep(
137
137
  input,
138
138
  (property) => {
139
- if (property instanceof Types.ObjectId) {
139
+ if (isObjectIdLike(property)) {
140
140
  property = getStringIds(property);
141
141
  }
142
142
  return property;
@@ -272,7 +272,7 @@ export async function prepareOutput<T = { [key: string]: any; map: (...args: any
272
272
  output = processDeep(
273
273
  output,
274
274
  (property) => {
275
- if (doObjectIds && property instanceof Types.ObjectId) {
275
+ if (doObjectIds && isObjectIdLike(property)) {
276
276
  return property.toHexString();
277
277
  }
278
278
  if (doSecrets && property && typeof property === 'object' && !Array.isArray(property)) {