@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.
- package/.claude/rules/architecture.md +6 -1
- package/.claude/rules/better-auth.md +46 -0
- package/.claude/rules/configurable-features.md +3 -2
- package/.claude/rules/package-management.md +24 -2
- package/.claude/rules/persistence.md +100 -0
- package/.claude/rules/role-system.md +9 -0
- package/.claude/rules/testing.md +116 -18
- package/CLAUDE.md +21 -2
- package/FRAMEWORK-API.md +6 -4
- package/README.md +106 -34
- package/dist/core/common/decorators/unified-field.decorator.d.ts +2 -1
- package/dist/core/common/decorators/unified-field.decorator.js +4 -1
- package/dist/core/common/decorators/unified-field.decorator.js.map +1 -1
- package/dist/core/common/filters/mongoose-cast-error.filter.d.ts +7 -5
- package/dist/core/common/filters/mongoose-cast-error.filter.js +3 -2
- package/dist/core/common/filters/mongoose-cast-error.filter.js.map +1 -1
- package/dist/core/common/helpers/db.helper.d.ts +2 -1
- package/dist/core/common/helpers/db.helper.js +32 -26
- package/dist/core/common/helpers/db.helper.js.map +1 -1
- package/dist/core/common/helpers/decorator.helper.d.ts +1 -1
- package/dist/core/common/helpers/filter.helper.d.ts +2 -1
- package/dist/core/common/helpers/filter.helper.js.map +1 -1
- package/dist/core/common/helpers/gridfs.helper.d.ts +4 -4
- package/dist/core/common/helpers/gridfs.helper.js +14 -6
- package/dist/core/common/helpers/gridfs.helper.js.map +1 -1
- package/dist/core/common/helpers/id.helper.d.ts +4 -1
- package/dist/core/common/helpers/id.helper.js +10 -4
- package/dist/core/common/helpers/id.helper.js.map +1 -1
- package/dist/core/common/helpers/model.helper.js +5 -5
- package/dist/core/common/helpers/model.helper.js.map +1 -1
- package/dist/core/common/helpers/service.helper.js +3 -3
- package/dist/core/common/helpers/service.helper.js.map +1 -1
- package/dist/core/common/interfaces/server-options.interface.d.ts +18 -2
- package/dist/core/common/interfaces/service-options.interface.d.ts +2 -2
- package/dist/core/common/models/core-persistence.model.d.ts +1 -2
- package/dist/core/common/models/core-persistence.model.js +3 -3
- package/dist/core/common/models/core-persistence.model.js.map +1 -1
- package/dist/core/common/persistence/core-persistence.lifecycle.d.ts +9 -0
- package/dist/core/common/persistence/core-persistence.lifecycle.js +38 -0
- package/dist/core/common/persistence/core-persistence.lifecycle.js.map +1 -0
- package/dist/core/common/persistence/core-persistence.module.d.ts +9 -0
- package/dist/core/common/persistence/core-persistence.module.js +76 -0
- package/dist/core/common/persistence/core-persistence.module.js.map +1 -0
- package/dist/core/common/persistence/data-source.config.d.ts +33 -0
- package/dist/core/common/persistence/data-source.config.js +151 -0
- package/dist/core/common/persistence/data-source.config.js.map +1 -0
- package/dist/core/common/persistence/data-source.runtime.d.ts +45 -0
- package/dist/core/common/persistence/data-source.runtime.js +278 -0
- package/dist/core/common/persistence/data-source.runtime.js.map +1 -0
- package/dist/core/common/persistence/data-store.interface.d.ts +73 -0
- package/dist/core/common/persistence/data-store.interface.js +2 -0
- package/dist/core/common/persistence/data-store.interface.js.map +1 -0
- package/dist/core/common/persistence/expiry-sweep.d.ts +12 -0
- package/dist/core/common/persistence/expiry-sweep.js +55 -0
- package/dist/core/common/persistence/expiry-sweep.js.map +1 -0
- package/dist/core/common/persistence/id-format.d.ts +3 -0
- package/dist/core/common/persistence/id-format.js +21 -0
- package/dist/core/common/persistence/id-format.js.map +1 -0
- package/dist/core/common/persistence/infrastructure-locks.d.ts +13 -0
- package/dist/core/common/persistence/infrastructure-locks.js +35 -0
- package/dist/core/common/persistence/infrastructure-locks.js.map +1 -0
- package/dist/core/common/persistence/inject-store.decorator.d.ts +1 -0
- package/dist/core/common/persistence/inject-store.decorator.js +6 -0
- package/dist/core/common/persistence/inject-store.decorator.js.map +1 -0
- package/dist/core/common/persistence/lock-store.interface.d.ts +5 -0
- package/dist/core/common/persistence/lock-store.interface.js +2 -0
- package/dist/core/common/persistence/lock-store.interface.js.map +1 -0
- package/dist/core/common/persistence/model-descriptor.interface.d.ts +36 -0
- package/dist/core/common/persistence/model-descriptor.interface.js +2 -0
- package/dist/core/common/persistence/model-descriptor.interface.js.map +1 -0
- package/dist/core/common/persistence/model-metadata.registry.d.ts +14 -0
- package/dist/core/common/persistence/model-metadata.registry.js +194 -0
- package/dist/core/common/persistence/model-metadata.registry.js.map +1 -0
- package/dist/core/common/persistence/mongo/collection-name.d.ts +2 -0
- package/dist/core/common/persistence/mongo/collection-name.js +73 -0
- package/dist/core/common/persistence/mongo/collection-name.js.map +1 -0
- package/dist/core/common/persistence/mongo/declared-schema.view.d.ts +11 -0
- package/dist/core/common/persistence/mongo/declared-schema.view.js +292 -0
- package/dist/core/common/persistence/mongo/declared-schema.view.js.map +1 -0
- package/dist/core/common/persistence/mongo/hex-object-id.d.ts +13 -0
- package/dist/core/common/persistence/mongo/hex-object-id.js +54 -0
- package/dist/core/common/persistence/mongo/hex-object-id.js.map +1 -0
- package/dist/core/common/persistence/mongo/model-declarations.d.ts +35 -0
- package/dist/core/common/persistence/mongo/model-declarations.js +80 -0
- package/dist/core/common/persistence/mongo/model-declarations.js.map +1 -0
- package/dist/core/common/persistence/mongo/mongo-packages.d.ts +15 -0
- package/dist/core/common/persistence/mongo/mongo-packages.js +66 -0
- package/dist/core/common/persistence/mongo/mongo-packages.js.map +1 -0
- package/dist/core/common/persistence/mongo/mongoose-compat.d.ts +22 -0
- package/dist/core/common/persistence/mongo/mongoose-compat.js +65 -0
- package/dist/core/common/persistence/mongo/mongoose-compat.js.map +1 -0
- package/dist/core/common/persistence/mongo/no-mongo-connection.module.d.ts +2 -0
- package/dist/core/common/persistence/mongo/no-mongo-connection.module.js +19 -0
- package/dist/core/common/persistence/mongo/no-mongo-connection.module.js.map +1 -0
- package/dist/core/common/persistence/mongo-lock-store.d.ts +21 -0
- package/dist/core/common/persistence/mongo-lock-store.js +72 -0
- package/dist/core/common/persistence/mongo-lock-store.js.map +1 -0
- package/dist/core/common/persistence/mongoose-data-store.d.ts +33 -0
- package/dist/core/common/persistence/mongoose-data-store.js +187 -0
- package/dist/core/common/persistence/mongoose-data-store.js.map +1 -0
- package/dist/core/common/persistence/neutral-populate.d.ts +6 -0
- package/dist/core/common/persistence/neutral-populate.js +72 -0
- package/dist/core/common/persistence/neutral-populate.js.map +1 -0
- package/dist/core/common/persistence/persisted-model.decorator.d.ts +6 -0
- package/dist/core/common/persistence/persisted-model.decorator.js +24 -0
- package/dist/core/common/persistence/persisted-model.decorator.js.map +1 -0
- package/dist/core/common/persistence/persistence-runtime.registry.d.ts +61 -0
- package/dist/core/common/persistence/persistence-runtime.registry.js +47 -0
- package/dist/core/common/persistence/persistence-runtime.registry.js.map +1 -0
- package/dist/core/common/persistence/persistence.tokens.d.ts +1 -0
- package/dist/core/common/persistence/persistence.tokens.js +4 -0
- package/dist/core/common/persistence/persistence.tokens.js.map +1 -0
- package/dist/core/common/persistence/policies/audit.policy.d.ts +8 -0
- package/dist/core/common/persistence/policies/audit.policy.js +37 -0
- package/dist/core/common/persistence/policies/audit.policy.js.map +1 -0
- package/dist/core/common/persistence/policies/password.policy.d.ts +3 -0
- package/dist/core/common/persistence/policies/password.policy.js +46 -0
- package/dist/core/common/persistence/policies/password.policy.js.map +1 -0
- package/dist/core/common/persistence/policies/role-guard.policy.d.ts +3 -0
- package/dist/core/common/persistence/policies/role-guard.policy.js +46 -0
- package/dist/core/common/persistence/policies/role-guard.policy.js.map +1 -0
- package/dist/core/common/persistence/policies/system-role.policy.d.ts +5 -0
- package/dist/core/common/persistence/policies/system-role.policy.js +46 -0
- package/dist/core/common/persistence/policies/system-role.policy.js.map +1 -0
- package/dist/core/common/persistence/policies/tenant.policy.d.ts +19 -0
- package/dist/core/common/persistence/policies/tenant.policy.js +120 -0
- package/dist/core/common/persistence/policies/tenant.policy.js.map +1 -0
- package/dist/core/common/persistence/routed-model.guard.d.ts +4 -0
- package/dist/core/common/persistence/routed-model.guard.js +73 -0
- package/dist/core/common/persistence/routed-model.guard.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.d.ts +46 -0
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.js +350 -0
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-executor.d.ts +13 -0
- package/dist/core/common/persistence/sql/mysql/mysql-executor.js +194 -0
- package/dist/core/common/persistence/sql/mysql/mysql-executor.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-lock-store.d.ts +11 -0
- package/dist/core/common/persistence/sql/mysql/mysql-lock-store.js +55 -0
- package/dist/core/common/persistence/sql/mysql/mysql-lock-store.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.d.ts +36 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js +288 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.d.ts +19 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js +328 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-session.d.ts +13 -0
- package/dist/core/common/persistence/sql/mysql/mysql-session.js +85 -0
- package/dist/core/common/persistence/sql/mysql/mysql-session.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.d.ts +9 -0
- package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.js +264 -0
- package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.d.ts +20 -0
- package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.js +519 -0
- package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/postgres/postgres-lock-store.d.ts +11 -0
- package/dist/core/common/persistence/sql/postgres/postgres-lock-store.js +44 -0
- package/dist/core/common/persistence/sql/postgres/postgres-lock-store.js.map +1 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.d.ts +42 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js +220 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.d.ts +12 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js +315 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js.map +1 -0
- package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.d.ts +5 -0
- package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.js +225 -0
- package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.d.ts +13 -0
- package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.js +484 -0
- package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-cast.d.ts +2 -0
- package/dist/core/common/persistence/sql/sql-cast.js +194 -0
- package/dist/core/common/persistence/sql/sql-cast.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-data-store.d.ts +79 -0
- package/dist/core/common/persistence/sql/sql-data-store.js +592 -0
- package/dist/core/common/persistence/sql/sql-data-store.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-dialect.d.ts +20 -0
- package/dist/core/common/persistence/sql/sql-dialect.js +38 -0
- package/dist/core/common/persistence/sql/sql-dialect.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-errors.d.ts +17 -0
- package/dist/core/common/persistence/sql/sql-errors.js +25 -0
- package/dist/core/common/persistence/sql/sql-errors.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-executor.factory.d.ts +11 -0
- package/dist/core/common/persistence/sql/sql-executor.factory.js +199 -0
- package/dist/core/common/persistence/sql/sql-executor.factory.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-executor.interface.d.ts +32 -0
- package/dist/core/common/persistence/sql/sql-executor.interface.js +2 -0
- package/dist/core/common/persistence/sql/sql-executor.interface.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-naming.d.ts +15 -0
- package/dist/core/common/persistence/sql/sql-naming.js +90 -0
- package/dist/core/common/persistence/sql/sql-naming.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-schema.shared.d.ts +25 -0
- package/dist/core/common/persistence/sql/sql-schema.shared.js +69 -0
- package/dist/core/common/persistence/sql/sql-schema.shared.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-session.d.ts +6 -0
- package/dist/core/common/persistence/sql/sql-session.js +78 -0
- package/dist/core/common/persistence/sql/sql-session.js.map +1 -0
- package/dist/core/common/persistence/sql/where-shared.d.ts +18 -0
- package/dist/core/common/persistence/sql/where-shared.js +93 -0
- package/dist/core/common/persistence/sql/where-shared.js.map +1 -0
- package/dist/core/common/persistence/store-guards.d.ts +10 -0
- package/dist/core/common/persistence/store-guards.js +49 -0
- package/dist/core/common/persistence/store-guards.js.map +1 -0
- package/dist/core/common/persistence/store-upsert.d.ts +2 -0
- package/dist/core/common/persistence/store-upsert.js +20 -0
- package/dist/core/common/persistence/store-upsert.js.map +1 -0
- package/dist/core/common/persistence/unavailable-store.d.ts +2 -0
- package/dist/core/common/persistence/unavailable-store.js +53 -0
- package/dist/core/common/persistence/unavailable-store.js.map +1 -0
- package/dist/core/common/persistence/unsupported-capability.error.d.ts +3 -0
- package/dist/core/common/persistence/unsupported-capability.error.js +4 -0
- package/dist/core/common/persistence/unsupported-capability.error.js.map +1 -0
- package/dist/core/common/plugins/mongoose-audit-fields.plugin.js +24 -68
- package/dist/core/common/plugins/mongoose-audit-fields.plugin.js.map +1 -1
- package/dist/core/common/plugins/mongoose-id.plugin.js +3 -0
- package/dist/core/common/plugins/mongoose-id.plugin.js.map +1 -1
- package/dist/core/common/plugins/mongoose-password.plugin.d.ts +1 -3
- package/dist/core/common/plugins/mongoose-password.plugin.js +2 -45
- package/dist/core/common/plugins/mongoose-password.plugin.js.map +1 -1
- package/dist/core/common/plugins/mongoose-role-guard.plugin.js +5 -46
- package/dist/core/common/plugins/mongoose-role-guard.plugin.js.map +1 -1
- package/dist/core/common/plugins/mongoose-system-role.plugin.js +2 -43
- package/dist/core/common/plugins/mongoose-system-role.plugin.js.map +1 -1
- package/dist/core/common/plugins/mongoose-tenant.plugin.js +10 -70
- package/dist/core/common/plugins/mongoose-tenant.plugin.js.map +1 -1
- package/dist/core/common/scalars/upload.scalar.js +1 -1
- package/dist/core/common/scalars/upload.scalar.js.map +1 -1
- package/dist/core/common/services/core-cron-jobs.initializer.js +1 -1
- package/dist/core/common/services/core-cron-jobs.initializer.js.map +1 -1
- package/dist/core/common/services/core-cron-jobs.service.d.ts +1 -0
- package/dist/core/common/services/core-cron-jobs.service.js +23 -14
- package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
- package/dist/core/common/services/crud.service.d.ts +4 -1
- package/dist/core/common/services/crud.service.js +132 -23
- package/dist/core/common/services/crud.service.js.map +1 -1
- package/dist/core/common/services/model-doc.service.js +1 -1
- package/dist/core/common/services/model-doc.service.js.map +1 -1
- package/dist/core/common/services/module.service.d.ts +9 -2
- package/dist/core/common/services/module.service.js +51 -6
- package/dist/core/common/services/module.service.js.map +1 -1
- package/dist/core/common/types/field-selection.type.d.ts +1 -1
- package/dist/core/common/types/id.type.d.ts +4 -4
- package/dist/core/common/types/object-id-like.type.d.ts +3 -0
- package/dist/core/common/types/object-id-like.type.js +2 -0
- package/dist/core/common/types/object-id-like.type.js.map +1 -0
- package/dist/core/common/types/populate-config.type.d.ts +1 -1
- package/dist/core/common/types/string-or-object-id.type.d.ts +2 -2
- package/dist/core/modules/ai/core-ai.constants.d.ts +4 -0
- package/dist/core/modules/ai/core-ai.constants.js +4 -0
- package/dist/core/modules/ai/core-ai.constants.js.map +1 -1
- package/dist/core/modules/ai/core-ai.module.js +21 -17
- package/dist/core/modules/ai/core-ai.module.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-budget-limit.model.d.ts +2 -92
- package/dist/core/modules/ai/models/core-ai-budget-limit.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-budget-limit.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-connection-preference.model.d.ts +2 -87
- package/dist/core/modules/ai/models/core-ai-connection-preference.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-connection-preference.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-connection.model.d.ts +2 -177
- package/dist/core/modules/ai/models/core-ai-connection.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-connection.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-conversation.model.d.ts +2 -92
- package/dist/core/modules/ai/models/core-ai-conversation.model.js +3 -4
- package/dist/core/modules/ai/models/core-ai-conversation.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-interaction.model.d.ts +2 -120
- package/dist/core/modules/ai/models/core-ai-interaction.model.js +2 -3
- package/dist/core/modules/ai/models/core-ai-interaction.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.d.ts +3 -0
- package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.js +21 -0
- package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-mode.model.d.ts +2 -102
- package/dist/core/modules/ai/models/core-ai-mode.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-mode.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-prompt-hint.model.d.ts +2 -97
- package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-prompt.model.d.ts +2 -112
- package/dist/core/modules/ai/models/core-ai-prompt.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-prompt.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-slot.model.d.ts +2 -112
- package/dist/core/modules/ai/models/core-ai-slot.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-slot.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-tool-grant.model.d.ts +2 -97
- package/dist/core/modules/ai/models/core-ai-tool-grant.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-tool-grant.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-tool-policy.model.d.ts +2 -103
- package/dist/core/modules/ai/models/core-ai-tool-policy.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-tool-policy.model.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-budget.service.d.ts +3 -1
- package/dist/core/modules/ai/services/core-ai-budget.service.js +15 -5
- package/dist/core/modules/ai/services/core-ai-budget.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-connection-preference.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-connection-preference.service.js +6 -10
- package/dist/core/modules/ai/services/core-ai-connection-preference.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-connection.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-connection.service.js +20 -42
- package/dist/core/modules/ai/services/core-ai-connection.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-conversation.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-conversation.service.js +28 -29
- package/dist/core/modules/ai/services/core-ai-conversation.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-interaction.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-interaction.service.js +3 -4
- package/dist/core/modules/ai/services/core-ai-interaction.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.d.ts +8 -0
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js +70 -18
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-mode.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-mode.service.js +3 -7
- package/dist/core/modules/ai/services/core-ai-mode.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-prompt-hint.service.d.ts +8 -1
- package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js +32 -26
- package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-prompt.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-prompt.service.js +10 -13
- package/dist/core/modules/ai/services/core-ai-prompt.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-slot.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-slot.service.js +14 -25
- package/dist/core/modules/ai/services/core-ai-slot.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-tool-grant.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-tool-grant.service.js +6 -18
- package/dist/core/modules/ai/services/core-ai-tool-grant.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-tool-policy.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-tool-policy.service.js +4 -8
- package/dist/core/modules/ai/services/core-ai-tool-policy.service.js.map +1 -1
- package/dist/core/modules/api-token/core-api-token.model.js +1 -1
- package/dist/core/modules/api-token/core-api-token.model.js.map +1 -1
- package/dist/core/modules/api-token/core-api-token.module.js +3 -2
- package/dist/core/modules/api-token/core-api-token.module.js.map +1 -1
- package/dist/core/modules/api-token/core-api-token.service.d.ts +8 -2
- package/dist/core/modules/api-token/core-api-token.service.js +106 -39
- package/dist/core/modules/api-token/core-api-token.service.js.map +1 -1
- package/dist/core/modules/auth/core-auth.module.js +2 -0
- package/dist/core/modules/auth/core-auth.module.js.map +1 -1
- package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js +1 -2
- package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js.map +1 -1
- package/dist/core/modules/auth/guards/role-guard.token.d.ts +1 -0
- package/dist/core/modules/auth/guards/role-guard.token.js +2 -0
- package/dist/core/modules/auth/guards/role-guard.token.js.map +1 -0
- package/dist/core/modules/auth/services/core-auth.service.js +4 -2
- package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth-sql.helper.d.ts +6 -0
- package/dist/core/modules/better-auth/better-auth-sql.helper.js +113 -0
- package/dist/core/modules/better-auth/better-auth-sql.helper.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth-token.service.d.ts +3 -1
- package/dist/core/modules/better-auth/better-auth-token.service.js +15 -24
- package/dist/core/modules/better-auth/better-auth-token.service.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth.config.d.ts +7 -0
- package/dist/core/modules/better-auth/better-auth.config.js +16 -5
- package/dist/core/modules/better-auth/better-auth.config.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth.types.d.ts +1 -1
- package/dist/core/modules/better-auth/core-better-auth-api.middleware.d.ts +1 -0
- package/dist/core/modules/better-auth/core-better-auth-api.middleware.js +6 -1
- package/dist/core/modules/better-auth/core-better-auth-api.middleware.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-challenge.service.js +30 -15
- package/dist/core/modules/better-auth/core-better-auth-challenge.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-mongo.users.d.ts +10 -0
- package/dist/core/modules/better-auth/core-better-auth-mongo.users.js +24 -0
- package/dist/core/modules/better-auth/core-better-auth-mongo.users.js.map +1 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.registry.d.ts +3 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.registry.js +8 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.registry.js.map +1 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.store.d.ts +71 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.store.js +190 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.store.js.map +1 -0
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.d.ts +24 -1
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.js +308 -32
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.module.d.ts +2 -0
- package/dist/core/modules/better-auth/core-better-auth.module.js +54 -32
- package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.service.d.ts +7 -2
- package/dist/core/modules/better-auth/core-better-auth.service.js +61 -9
- package/dist/core/modules/better-auth/core-better-auth.service.js.map +1 -1
- package/dist/core/modules/file/core-file-info.model.d.ts +1 -2
- package/dist/core/modules/file/core-file-info.model.js +2 -2
- package/dist/core/modules/file/core-file-info.model.js.map +1 -1
- package/dist/core/modules/file/core-file.service.d.ts +5 -3
- package/dist/core/modules/file/core-file.service.js +16 -9
- package/dist/core/modules/file/core-file.service.js.map +1 -1
- package/dist/core/modules/file/file-metadata.helper.d.ts +1 -1
- package/dist/core/modules/file/file-metadata.helper.js +2 -2
- package/dist/core/modules/file/file-metadata.helper.js.map +1 -1
- package/dist/core/modules/file/file-metadata.models.d.ts +35 -0
- package/dist/core/modules/file/file-metadata.models.js +20 -0
- package/dist/core/modules/file/file-metadata.models.js.map +1 -0
- package/dist/core/modules/file/file-metadata.store.d.ts +6 -0
- package/dist/core/modules/file/file-metadata.store.js +77 -0
- package/dist/core/modules/file/file-metadata.store.js.map +1 -0
- package/dist/core/modules/file/file-storage.helper.d.ts +1 -0
- package/dist/core/modules/file/file-storage.helper.js +34 -0
- package/dist/core/modules/file/file-storage.helper.js.map +1 -1
- package/dist/core/modules/file/filesystem-file.helper.d.ts +1 -1
- package/dist/core/modules/file/filesystem-file.helper.js +4 -4
- package/dist/core/modules/file/filesystem-file.helper.js.map +1 -1
- package/dist/core/modules/file/s3-file.helper.d.ts +1 -1
- package/dist/core/modules/file/s3-file.helper.js +5 -5
- package/dist/core/modules/file/s3-file.helper.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.module.js +12 -2
- package/dist/core/modules/health-check/core-health-check.module.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.service.d.ts +4 -3
- package/dist/core/modules/health-check/core-health-check.service.js +26 -5
- package/dist/core/modules/health-check/core-health-check.service.js.map +1 -1
- package/dist/core/modules/hub/core-hub.controller.d.ts +1 -0
- package/dist/core/modules/hub/core-hub.controller.js +10 -0
- package/dist/core/modules/hub/core-hub.controller.js.map +1 -1
- package/dist/core/modules/hub/core-hub.service.js +1 -1
- package/dist/core/modules/hub/core-hub.service.js.map +1 -1
- package/dist/core/modules/hub/helpers/hub-client-js.helper.js +23 -0
- package/dist/core/modules/hub/helpers/hub-client-js.helper.js.map +1 -1
- package/dist/core/modules/hub/hub-action-messages.d.ts +2 -0
- package/dist/core/modules/hub/hub-action-messages.js +2 -0
- package/dist/core/modules/hub/hub-action-messages.js.map +1 -1
- package/dist/core/modules/hub/hub-nav.js +1 -0
- package/dist/core/modules/hub/hub-nav.js.map +1 -1
- package/dist/core/modules/hub/interfaces/hub-panels.interface.d.ts +17 -1
- package/dist/core/modules/hub/services/core-hub-db.service.d.ts +6 -1
- package/dist/core/modules/hub/services/core-hub-db.service.js +16 -14
- package/dist/core/modules/hub/services/core-hub-db.service.js.map +1 -1
- package/dist/core/modules/hub/services/core-hub-migrations.service.d.ts +5 -0
- package/dist/core/modules/hub/services/core-hub-migrations.service.js +74 -1
- package/dist/core/modules/hub/services/core-hub-migrations.service.js.map +1 -1
- package/dist/core/modules/hub/services/core-hub-sources.service.d.ts +2 -1
- package/dist/core/modules/hub/services/core-hub-sources.service.js +32 -0
- package/dist/core/modules/hub/services/core-hub-sources.service.js.map +1 -1
- package/dist/core/modules/hub/services/hub-query-profiler.service.js +1 -1
- package/dist/core/modules/hub/services/hub-query-profiler.service.js.map +1 -1
- package/dist/core/modules/migrate/cli/migrate-cli.d.ts +2 -0
- package/dist/core/modules/migrate/cli/migrate-cli.js +35 -1
- package/dist/core/modules/migrate/cli/migrate-cli.js.map +1 -1
- package/dist/core/modules/migrate/index.d.ts +3 -0
- package/dist/core/modules/migrate/index.js +3 -0
- package/dist/core/modules/migrate/index.js.map +1 -1
- package/dist/core/modules/migrate/migration-runner.d.ts +2 -2
- package/dist/core/modules/migrate/migration-runner.js.map +1 -1
- package/dist/core/modules/migrate/migration-state-store.interface.d.ts +16 -0
- package/dist/core/modules/migrate/migration-state-store.interface.js +2 -0
- package/dist/core/modules/migrate/migration-state-store.interface.js.map +1 -0
- package/dist/core/modules/migrate/migration.helper.d.ts +3 -2
- package/dist/core/modules/migrate/migration.helper.js +21 -6
- package/dist/core/modules/migrate/migration.helper.js.map +1 -1
- package/dist/core/modules/migrate/mongo-state-store.d.ts +5 -12
- package/dist/core/modules/migrate/mongo-state-store.js +30 -24
- package/dist/core/modules/migrate/mongo-state-store.js.map +1 -1
- package/dist/core/modules/migrate/sql-migration.helper.d.ts +4 -0
- package/dist/core/modules/migrate/sql-migration.helper.js +34 -0
- package/dist/core/modules/migrate/sql-migration.helper.js.map +1 -0
- package/dist/core/modules/migrate/sql-state-store.d.ts +24 -0
- package/dist/core/modules/migrate/sql-state-store.js +129 -0
- package/dist/core/modules/migrate/sql-state-store.js.map +1 -0
- package/dist/core/modules/system-setup/core-system-setup.service.d.ts +8 -0
- package/dist/core/modules/system-setup/core-system-setup.service.js +41 -25
- package/dist/core/modules/system-setup/core-system-setup.service.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant-member.model.js +1 -1
- package/dist/core/modules/tenant/core-tenant-member.model.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant-member.store.d.ts +2 -0
- package/dist/core/modules/tenant/core-tenant-member.store.js +6 -0
- package/dist/core/modules/tenant/core-tenant-member.store.js.map +1 -0
- package/dist/core/modules/tenant/core-tenant.guard.d.ts +8 -3
- package/dist/core/modules/tenant/core-tenant.guard.js +57 -28
- package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant.module.js +3 -2
- package/dist/core/modules/tenant/core-tenant.module.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant.service.d.ts +3 -1
- package/dist/core/modules/tenant/core-tenant.service.js +48 -28
- package/dist/core/modules/tenant/core-tenant.service.js.map +1 -1
- package/dist/core/modules/tus/core-tus.service.d.ts +1 -1
- package/dist/core/modules/tus/core-tus.service.js +8 -7
- package/dist/core/modules/tus/core-tus.service.js.map +1 -1
- package/dist/core/modules/tus/tus.module.js +1 -1
- package/dist/core/modules/tus/tus.module.js.map +1 -1
- package/dist/core/modules/user/core-user.model.d.ts +1 -1
- package/dist/core/modules/user/core-user.model.js +1 -1
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/core-user.service.d.ts +3 -1
- package/dist/core/modules/user/core-user.service.js +71 -16
- package/dist/core/modules/user/core-user.service.js.map +1 -1
- package/dist/core.module.js +39 -5
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +26 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -1
- package/dist/server/common/models/persistence.model.d.ts +1 -1
- package/dist/server/common/models/persistence.model.js +3 -3
- package/dist/server/common/models/persistence.model.js.map +1 -1
- package/dist/server/modules/file/file-info.model.d.ts +1 -77
- package/dist/server/modules/file/file-info.model.js +1 -1
- package/dist/server/modules/file/file-info.model.js.map +1 -1
- package/dist/server/modules/file/file.service.js +1 -1
- package/dist/server/modules/file/file.service.js.map +1 -1
- package/dist/server/modules/user/user.model.d.ts +2 -186
- package/dist/server/modules/user/user.model.js +4 -5
- package/dist/server/modules/user/user.model.js.map +1 -1
- package/dist/server/modules/user/user.module.js +4 -3
- package/dist/server/modules/user/user.module.js.map +1 -1
- package/dist/server/modules/user/user.service.d.ts +1 -1
- package/dist/server/modules/user/user.service.js +5 -8
- package/dist/server/modules/user/user.service.js.map +1 -1
- package/dist/test/test.helper.js +2 -2
- package/dist/test/test.helper.js.map +1 -1
- package/dist/types/graphql-upload.d.ts +10 -7
- package/docs/REQUEST-LIFECYCLE.md +6 -3
- package/docs/choosing-a-database.md +107 -0
- package/docs/native-driver-security.md +29 -0
- package/docs/security-overrides.md +15 -6
- package/migration-guides/12.0.x-to-12.1.x.md +255 -0
- package/package.json +75 -29
- package/src/core/common/decorators/unified-field.decorator.ts +11 -1
- package/src/core/common/filters/mongoose-cast-error.filter.ts +12 -6
- package/src/core/common/helpers/db.helper.ts +40 -25
- package/src/core/common/helpers/decorator.helper.ts +1 -1
- package/src/core/common/helpers/filter.helper.ts +2 -1
- package/src/core/common/helpers/gridfs.helper.ts +28 -9
- package/src/core/common/helpers/id.helper.ts +21 -4
- package/src/core/common/helpers/model.helper.ts +5 -6
- package/src/core/common/helpers/service.helper.ts +3 -3
- package/src/core/common/interfaces/server-options.interface.ts +118 -10
- package/src/core/common/interfaces/service-options.interface.ts +2 -2
- package/src/core/common/models/core-persistence.model.ts +3 -3
- package/src/core/common/persistence/core-persistence.lifecycle.ts +47 -0
- package/src/core/common/persistence/core-persistence.module.ts +109 -0
- package/src/core/common/persistence/data-source.config.ts +271 -0
- package/src/core/common/persistence/data-source.runtime.ts +351 -0
- package/src/core/common/persistence/data-store.interface.ts +155 -0
- package/src/core/common/persistence/expiry-sweep.ts +105 -0
- package/src/core/common/persistence/id-format.ts +43 -0
- package/src/core/common/persistence/infrastructure-locks.ts +66 -0
- package/src/core/common/persistence/inject-store.decorator.ts +16 -0
- package/src/core/common/persistence/lock-store.interface.ts +17 -0
- package/src/core/common/persistence/model-descriptor.interface.ts +90 -0
- package/src/core/common/persistence/model-metadata.registry.ts +285 -0
- package/src/core/common/persistence/mongo/collection-name.ts +87 -0
- package/src/core/common/persistence/mongo/declared-schema.view.ts +378 -0
- package/src/core/common/persistence/mongo/hex-object-id.ts +75 -0
- package/src/core/common/persistence/mongo/model-declarations.ts +135 -0
- package/src/core/common/persistence/mongo/mongo-packages.ts +130 -0
- package/src/core/common/persistence/mongo/mongoose-compat.ts +129 -0
- package/src/core/common/persistence/mongo/no-mongo-connection.module.ts +18 -0
- package/src/core/common/persistence/mongo-lock-store.ts +121 -0
- package/src/core/common/persistence/mongoose-data-store.ts +232 -0
- package/src/core/common/persistence/neutral-populate.ts +98 -0
- package/src/core/common/persistence/persisted-model.decorator.ts +61 -0
- package/src/core/common/persistence/persistence-runtime.registry.ts +152 -0
- package/src/core/common/persistence/persistence.tokens.ts +9 -0
- package/src/core/common/persistence/policies/audit.policy.ts +80 -0
- package/src/core/common/persistence/policies/password.policy.ts +69 -0
- package/src/core/common/persistence/policies/role-guard.policy.ts +74 -0
- package/src/core/common/persistence/policies/system-role.policy.ts +90 -0
- package/src/core/common/persistence/policies/tenant.policy.ts +245 -0
- package/src/core/common/persistence/routed-model.guard.ts +107 -0
- package/src/core/common/persistence/sql/mysql/mysql-data-store.ts +503 -0
- package/src/core/common/persistence/sql/mysql/mysql-executor.ts +281 -0
- package/src/core/common/persistence/sql/mysql/mysql-lock-store.ts +87 -0
- package/src/core/common/persistence/sql/mysql/mysql-schema.compiler.ts +424 -0
- package/src/core/common/persistence/sql/mysql/mysql-schema.migrator.ts +453 -0
- package/src/core/common/persistence/sql/mysql/mysql-session.ts +131 -0
- package/src/core/common/persistence/sql/mysql/mysql-update.compiler.ts +379 -0
- package/src/core/common/persistence/sql/mysql/mysql-where.compiler.ts +686 -0
- package/src/core/common/persistence/sql/postgres/postgres-lock-store.ts +76 -0
- package/src/core/common/persistence/sql/postgres/postgres-schema.compiler.ts +328 -0
- package/src/core/common/persistence/sql/postgres/postgres-schema.migrator.ts +448 -0
- package/src/core/common/persistence/sql/postgres/postgres-update.compiler.ts +310 -0
- package/src/core/common/persistence/sql/postgres/postgres-where.compiler.ts +638 -0
- package/src/core/common/persistence/sql/sql-cast.ts +227 -0
- package/src/core/common/persistence/sql/sql-data-store.ts +762 -0
- package/src/core/common/persistence/sql/sql-dialect.ts +85 -0
- package/src/core/common/persistence/sql/sql-errors.ts +49 -0
- package/src/core/common/persistence/sql/sql-executor.factory.ts +282 -0
- package/src/core/common/persistence/sql/sql-executor.interface.ts +57 -0
- package/src/core/common/persistence/sql/sql-naming.ts +133 -0
- package/src/core/common/persistence/sql/sql-schema.shared.ts +105 -0
- package/src/core/common/persistence/sql/sql-session.ts +158 -0
- package/src/core/common/persistence/sql/where-shared.ts +118 -0
- package/src/core/common/persistence/store-guards.ts +73 -0
- package/src/core/common/persistence/store-upsert.ts +36 -0
- package/src/core/common/persistence/unavailable-store.ts +63 -0
- package/src/core/common/persistence/unsupported-capability.error.ts +7 -0
- package/src/core/common/plugins/mongoose-audit-fields.plugin.ts +33 -74
- package/src/core/common/plugins/mongoose-id.plugin.ts +9 -0
- package/src/core/common/plugins/mongoose-password.plugin.ts +6 -62
- package/src/core/common/plugins/mongoose-role-guard.plugin.ts +11 -63
- package/src/core/common/plugins/mongoose-system-role.plugin.ts +7 -78
- package/src/core/common/plugins/mongoose-tenant.plugin.ts +23 -144
- package/src/core/common/scalars/upload.scalar.ts +8 -3
- package/src/core/common/services/core-cron-jobs.initializer.ts +1 -1
- package/src/core/common/services/core-cron-jobs.service.ts +33 -22
- package/src/core/common/services/crud.service.ts +166 -35
- package/src/core/common/services/model-doc.service.ts +1 -1
- package/src/core/common/services/module.service.ts +78 -6
- package/src/core/common/types/field-selection.type.ts +1 -1
- package/src/core/common/types/id.type.ts +2 -2
- package/src/core/common/types/object-id-like.type.ts +11 -0
- package/src/core/common/types/populate-config.type.ts +1 -1
- package/src/core/common/types/string-or-object-id.type.ts +2 -2
- package/src/core/modules/ai/README.md +15 -2
- package/src/core/modules/ai/core-ai.constants.ts +10 -0
- package/src/core/modules/ai/core-ai.module.ts +32 -17
- package/src/core/modules/ai/models/core-ai-budget-limit.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-connection-preference.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-connection.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-conversation.model.ts +8 -4
- package/src/core/modules/ai/models/core-ai-interaction.model.ts +3 -3
- package/src/core/modules/ai/models/core-ai-mcp-oauth.models.ts +46 -0
- package/src/core/modules/ai/models/core-ai-mode.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-prompt-hint.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-prompt.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-slot.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-tool-grant.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-tool-policy.model.ts +2 -2
- package/src/core/modules/ai/services/core-ai-budget.service.ts +22 -4
- package/src/core/modules/ai/services/core-ai-connection-preference.service.ts +6 -13
- package/src/core/modules/ai/services/core-ai-connection.service.ts +34 -44
- package/src/core/modules/ai/services/core-ai-conversation.service.ts +31 -29
- package/src/core/modules/ai/services/core-ai-interaction.service.ts +3 -3
- package/src/core/modules/ai/services/core-ai-mcp-oauth.service.ts +93 -20
- package/src/core/modules/ai/services/core-ai-mode.service.ts +3 -6
- package/src/core/modules/ai/services/core-ai-prompt-hint.service.ts +43 -26
- package/src/core/modules/ai/services/core-ai-prompt.service.ts +15 -12
- package/src/core/modules/ai/services/core-ai-slot.service.ts +20 -24
- package/src/core/modules/ai/services/core-ai-tool-grant.service.ts +17 -27
- package/src/core/modules/ai/services/core-ai-tool-policy.service.ts +7 -10
- package/src/core/modules/api-token/core-api-token.model.ts +1 -1
- package/src/core/modules/api-token/core-api-token.module.ts +4 -2
- package/src/core/modules/api-token/core-api-token.service.ts +118 -43
- package/src/core/modules/auth/core-auth.module.ts +2 -0
- package/src/core/modules/auth/guards/legacy-auth-rate-limit.guard.ts +4 -3
- package/src/core/modules/auth/guards/role-guard.token.ts +7 -0
- package/src/core/modules/auth/services/core-auth.service.ts +16 -2
- package/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md +1 -1
- package/src/core/modules/better-auth/README.md +10 -1
- package/src/core/modules/better-auth/better-auth-sql.helper.ts +191 -0
- package/src/core/modules/better-auth/better-auth-token.service.ts +26 -35
- package/src/core/modules/better-auth/better-auth.config.ts +43 -7
- package/src/core/modules/better-auth/better-auth.types.ts +1 -1
- package/src/core/modules/better-auth/core-better-auth-api.middleware.ts +13 -1
- package/src/core/modules/better-auth/core-better-auth-challenge.service.ts +36 -18
- package/src/core/modules/better-auth/core-better-auth-mongo.users.ts +35 -0
- package/src/core/modules/better-auth/core-better-auth-sql.registry.ts +20 -0
- package/src/core/modules/better-auth/core-better-auth-sql.store.ts +309 -0
- package/src/core/modules/better-auth/core-better-auth-user.mapper.ts +418 -40
- package/src/core/modules/better-auth/core-better-auth.module.ts +71 -35
- package/src/core/modules/better-auth/core-better-auth.service.ts +81 -12
- package/src/core/modules/file/README.md +16 -3
- package/src/core/modules/file/core-file-info.model.ts +2 -2
- package/src/core/modules/file/core-file.service.ts +27 -18
- package/src/core/modules/file/file-metadata.helper.ts +7 -3
- package/src/core/modules/file/file-metadata.models.ts +44 -0
- package/src/core/modules/file/file-metadata.store.ts +109 -0
- package/src/core/modules/file/file-storage.helper.ts +47 -2
- package/src/core/modules/file/filesystem-file.helper.ts +11 -8
- package/src/core/modules/file/s3-file.helper.ts +11 -7
- package/src/core/modules/health-check/core-health-check.module.ts +16 -2
- package/src/core/modules/health-check/core-health-check.service.ts +25 -3
- package/src/core/modules/hub/README.md +20 -11
- package/src/core/modules/hub/core-hub.controller.ts +5 -0
- package/src/core/modules/hub/core-hub.service.ts +1 -1
- package/src/core/modules/hub/helpers/hub-client-js.helper.ts +23 -0
- package/src/core/modules/hub/hub-action-messages.ts +6 -0
- package/src/core/modules/hub/hub-nav.ts +1 -0
- package/src/core/modules/hub/interfaces/hub-panels.interface.ts +8 -1
- package/src/core/modules/hub/services/core-hub-db.service.ts +35 -17
- package/src/core/modules/hub/services/core-hub-migrations.service.ts +96 -2
- package/src/core/modules/hub/services/core-hub-sources.service.ts +47 -1
- package/src/core/modules/hub/services/hub-query-profiler.service.ts +1 -1
- package/src/core/modules/migrate/README.md +54 -0
- package/src/core/modules/migrate/cli/migrate-cli.ts +44 -3
- package/src/core/modules/migrate/index.ts +3 -0
- package/src/core/modules/migrate/migration-runner.ts +3 -2
- package/src/core/modules/migrate/migration-state-store.interface.ts +24 -0
- package/src/core/modules/migrate/migration.helper.ts +35 -10
- package/src/core/modules/migrate/mongo-state-store.ts +64 -65
- package/src/core/modules/migrate/sql-migration.helper.ts +48 -0
- package/src/core/modules/migrate/sql-state-store.ts +198 -0
- package/src/core/modules/system-setup/README.md +14 -2
- package/src/core/modules/system-setup/core-system-setup.service.ts +77 -45
- package/src/core/modules/tenant/README.md +9 -2
- package/src/core/modules/tenant/core-tenant-member.model.ts +1 -1
- package/src/core/modules/tenant/core-tenant-member.store.ts +13 -0
- package/src/core/modules/tenant/core-tenant.guard.ts +77 -24
- package/src/core/modules/tenant/core-tenant.module.ts +6 -3
- package/src/core/modules/tenant/core-tenant.service.ts +59 -42
- package/src/core/modules/tus/core-tus.service.ts +11 -12
- package/src/core/modules/tus/tus.module.ts +1 -1
- package/src/core/modules/user/core-user.model.ts +2 -2
- package/src/core/modules/user/core-user.service.ts +98 -20
- package/src/core.module.ts +60 -5
- package/src/index.ts +26 -0
- package/src/server/common/models/persistence.model.ts +4 -4
- package/src/server/modules/file/file-info.model.ts +1 -1
- package/src/server/modules/file/file.service.ts +1 -1
- package/src/server/modules/user/user.model.ts +10 -5
- package/src/server/modules/user/user.module.ts +9 -3
- package/src/server/modules/user/user.service.ts +9 -11
- package/src/test/test.helper.ts +2 -2
- 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.
|
|
3
|
+
"version": "12.1.0",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "
|
|
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.
|
|
99
|
-
"@nestjs/common": "12.2
|
|
100
|
-
"@nestjs/core": "12.2
|
|
101
|
-
"@nestjs/graphql": "14.0
|
|
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
|
|
112
|
+
"@nestjs/platform-express": "12.3.2",
|
|
106
113
|
"@nestjs/schedule": "12.0.2",
|
|
107
|
-
"@nestjs/swagger": "12.0.
|
|
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": "
|
|
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
|
-
"
|
|
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.
|
|
192
|
-
"@aws-sdk/lib-storage": "3.
|
|
193
|
-
"@aws-sdk/s3-request-presigner": "3.
|
|
194
|
-
"@better-auth/core": "1.7.
|
|
195
|
-
"@better-auth/passkey": "1.7.
|
|
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.
|
|
198
|
-
"@nestjs/
|
|
199
|
-
"@nestjs/
|
|
200
|
-
"@
|
|
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.
|
|
213
|
-
"bullmq": "6.
|
|
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.
|
|
219
|
-
"oxlint": "1.
|
|
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 {
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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]
|
|
73
|
+
((isObjectIdLike(result[0]) && !isObjectIdLike(ids)) ||
|
|
71
74
|
(typeof result[0] === 'string' && typeof ids !== 'string'))
|
|
72
75
|
) {
|
|
73
|
-
const converted = result[0]
|
|
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' ||
|
|
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
|
|
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
|
-
|
|
381
|
+
const populateOptions = toPopulateOptions(populate);
|
|
353
382
|
const ignoreSelections = options?.ignoreSelections;
|
|
354
|
-
if (
|
|
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
|
|
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]
|
|
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]
|
|
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
|
|
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
|
|
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' ?
|
|
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(
|
|
195
|
-
|
|
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(
|
|
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' ?
|
|
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' ?
|
|
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) =>
|
|
113
|
+
return ids.map((id) => newObjectId(getStringId(id)));
|
|
100
114
|
}
|
|
101
|
-
return
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
275
|
+
if (doObjectIds && isObjectIdLike(property)) {
|
|
276
276
|
return property.toHexString();
|
|
277
277
|
}
|
|
278
278
|
if (doSecrets && property && typeof property === 'object' && !Array.isArray(property)) {
|