diff --git a/api/package.json b/api/package.json index 3abdbc83e6..2c87b76421 100644 --- a/api/package.json +++ b/api/package.json @@ -53,7 +53,7 @@ "@node-saml/passport-saml": "^5.1.0", "@smithy/node-http-handler": "^4.4.5", "ai-tokenizer": "^1.0.6", - "axios": "^1.15.0", + "axios": "^1.16.0", "bcryptjs": "^2.4.3", "compression": "^1.8.1", "connect-redis": "^8.1.0", @@ -65,7 +65,7 @@ "eventsource": "^3.0.2", "express": "^5.2.1", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^8.3.0", + "express-rate-limit": "^8.5.1", "express-session": "^1.18.2", "express-static-gzip": "^2.2.0", "file-type": "^21.3.2", @@ -88,7 +88,7 @@ "memorystore": "^1.6.7", "mime": "^3.0.0", "module-alias": "^2.2.3", - "mongoose": "^8.12.1", + "mongoose": "^8.23.1", "multer": "^2.1.1", "nanoid": "^3.3.7", "node-fetch": "^2.7.0", diff --git a/config/translations/tsconfig.json b/config/translations/tsconfig.json index 13b0ff6c88..e56fadd965 100644 --- a/config/translations/tsconfig.json +++ b/config/translations/tsconfig.json @@ -3,7 +3,7 @@ "noImplicitAny": false, "outDir": "./dist", "strict": true, - "moduleResolution": "node", + "moduleResolution": "bundler", "esModuleInterop": true, "target": "es6", "module": "esnext", diff --git a/package-lock.json b/package-lock.json index 47f48370bf..372022c632 100644 --- a/package-lock.json +++ b/package-lock.json @@ -68,7 +68,7 @@ "@node-saml/passport-saml": "^5.1.0", "@smithy/node-http-handler": "^4.4.5", "ai-tokenizer": "^1.0.6", - "axios": "^1.15.0", + "axios": "^1.16.0", "bcryptjs": "^2.4.3", "compression": "^1.8.1", "connect-redis": "^8.1.0", @@ -80,7 +80,7 @@ "eventsource": "^3.0.2", "express": "^5.2.1", "express-mongo-sanitize": "^2.2.0", - "express-rate-limit": "^8.3.0", + "express-rate-limit": "^8.5.1", "express-session": "^1.18.2", "express-static-gzip": "^2.2.0", "file-type": "^21.3.2", @@ -103,7 +103,7 @@ "memorystore": "^1.6.7", "mime": "^3.0.0", "module-alias": "^2.2.3", - "mongoose": "^8.12.1", + "mongoose": "^8.23.1", "multer": "^2.1.1", "nanoid": "^3.3.7", "node-fetch": "^2.7.0", @@ -27346,12 +27346,12 @@ } }, "node_modules/express-rate-limit": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.3.0.tgz", - "integrity": "sha512-KJzBawY6fB9FiZGdE/0aftepZ91YlaGIrV8vgblRM3J8X+dHx/aiowJWwkx6LIGyuqGiANsjSwwrbb8mifOJ4Q==", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.5.1.tgz", + "integrity": "sha512-5O6KYmyJEpuPJV5hNTXKbAHWRqrzyu+OI3vUnSd2kXFubIVpG7ezpgxQy76Zo5GQZtrQBg86hF+CM/NX+cioiQ==", "license": "MIT", "dependencies": { - "ip-address": "10.1.0" + "ip-address": "^10.2.0" }, "engines": { "node": ">= 16" @@ -29031,9 +29031,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/hono": { - "version": "4.12.14", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.14.tgz", - "integrity": "sha512-am5zfg3yu6sqn5yjKBNqhnTX7Cv+m00ox+7jbaKkrLMRJ4rAdldd1xPd/JzbBWspqaQv6RSTrgFN95EsfhC+7w==", + "version": "4.12.18", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.18.tgz", + "integrity": "sha512-RWzP96k/yv0PQfyXnWjs6zot20TqfpfsNXhOnev8d1InAxubW93L11/oNUc3tQqn2G0bSdAOBpX+2uDFHV7kdQ==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -29525,9 +29525,9 @@ } }, "node_modules/ip-address": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", - "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz", + "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==", "license": "MIT", "engines": { "node": ">= 12" @@ -34580,14 +34580,14 @@ } }, "node_modules/mongodb": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.14.2.tgz", - "integrity": "sha512-kMEHNo0F3P6QKDq17zcDuPeaywK/YaJVCEQRzPF3TOM/Bl9MFg64YE5Tu7ifj37qZJMhwU1tl2Ioivws5gRG5Q==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.20.0.tgz", + "integrity": "sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ==", "license": "Apache-2.0", "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.3", - "mongodb-connection-string-url": "^3.0.0" + "@mongodb-js/saslprep": "^1.3.0", + "bson": "^6.10.4", + "mongodb-connection-string-url": "^3.0.2" }, "engines": { "node": ">=16.20.1" @@ -34598,7 +34598,7 @@ "gcp-metadata": "^5.2.0", "kerberos": "^2.0.1", "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", + "snappy": "^7.3.2", "socks": "^2.7.1" }, "peerDependenciesMeta": { @@ -34755,14 +34755,14 @@ } }, "node_modules/mongoose": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.12.1.tgz", - "integrity": "sha512-UW22y8QFVYmrb36hm8cGncfn4ARc/XsYWQwRTaj0gxtQk1rDuhzDO1eBantS+hTTatfAIS96LlRCJrcNHvW5+Q==", + "version": "8.23.1", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.23.1.tgz", + "integrity": "sha512-gHSPD8qEwRmiXapK17hEnFWZdcFENMegHTcw5XIIg2+7R8eXQvdwSiMpD/A2oG8tKzFLLHyRXd8/eaDPAVwZgQ==", "license": "MIT", "dependencies": { - "bson": "^6.10.3", + "bson": "^6.10.4", "kareem": "2.6.3", - "mongodb": "~6.14.0", + "mongodb": "~6.20.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", @@ -44684,7 +44684,7 @@ "@modelcontextprotocol/sdk": "^1.29.0", "@smithy/node-http-handler": "^4.4.5", "ai-tokenizer": "^1.0.6", - "axios": "^1.15.0", + "axios": "^1.16.0", "connect-redis": "^8.1.0", "eventsource": "^3.0.2", "express": "^5.1.0", @@ -44703,7 +44703,7 @@ "mammoth": "^1.11.0", "mathjs": "^15.2.0", "memorystore": "^1.6.7", - "mongoose": "^8.12.1", + "mongoose": "^8.23.1", "node-fetch": "2.7.0", "pdfjs-dist": "^5.4.624", "rate-limit-redis": "^4.2.0", @@ -46430,7 +46430,7 @@ "version": "0.8.501", "license": "ISC", "dependencies": { - "axios": "^1.15.0", + "axios": "^1.16.0", "dayjs": "^1.11.13", "js-yaml": "^4.1.1", "zod": "^3.22.4" @@ -46537,7 +46537,7 @@ "librechat-data-provider": "*", "lodash": "^4.17.23", "meilisearch": "^0.38.0", - "mongoose": "^8.12.1", + "mongoose": "^8.23.1", "nanoid": "^3.3.7", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0" diff --git a/package.json b/package.json index 6d42aa97b6..d20b8e3f45 100644 --- a/package.json +++ b/package.json @@ -168,7 +168,7 @@ "ajv": "6.14.0" }, "underscore": "1.13.8", - "hono": "^4.12.4", + "hono": "^4.12.18", "@hono/node-server": "^1.19.10", "monaco-editor": { "dompurify": "3.4.0" diff --git a/packages/api/package.json b/packages/api/package.json index fffc3e5d4f..c5cee5f7bf 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -103,7 +103,7 @@ "@modelcontextprotocol/sdk": "^1.29.0", "@smithy/node-http-handler": "^4.4.5", "ai-tokenizer": "^1.0.6", - "axios": "^1.15.0", + "axios": "^1.16.0", "connect-redis": "^8.1.0", "eventsource": "^3.0.2", "express": "^5.1.0", @@ -122,7 +122,7 @@ "mammoth": "^1.11.0", "mathjs": "^15.2.0", "memorystore": "^1.6.7", - "mongoose": "^8.12.1", + "mongoose": "^8.23.1", "node-fetch": "2.7.0", "pdfjs-dist": "^5.4.624", "rate-limit-redis": "^4.2.0", diff --git a/packages/api/src/apiKeys/permissions.ts b/packages/api/src/apiKeys/permissions.ts index 4055f88920..3d8a05b3b9 100644 --- a/packages/api/src/apiKeys/permissions.ts +++ b/packages/api/src/apiKeys/permissions.ts @@ -23,7 +23,7 @@ export interface Principal { export interface EnricherDependencies { aggregateAclEntries: (pipeline: PipelineStage[]) => Promise[]>; bulkWriteAclEntries: ( - ops: AnyBulkWriteOperation[], + ops: AnyBulkWriteOperation[], options?: Record, ) => Promise; findRoleByIdentifier: ( diff --git a/packages/api/src/middleware/balance.spec.ts b/packages/api/src/middleware/balance.spec.ts index fe995d9f6b..8badd2e106 100644 --- a/packages/api/src/middleware/balance.spec.ts +++ b/packages/api/src/middleware/balance.spec.ts @@ -15,15 +15,14 @@ jest.mock('@librechat/data-schemas', () => ({ let mongoServer: MongoMemoryServer; let Balance: mongoose.Model; -const findBalanceByUser = (userId: string) => - Balance.findOne({ user: userId }).lean() as Promise; +const findBalanceByUser = (userId: string) => Balance.findOne({ user: userId }).lean(); const upsertBalanceFields = (userId: string, fields: IBalanceUpdate) => Balance.findOneAndUpdate( { user: userId }, { $set: fields }, { upsert: true, new: true }, - ).lean() as Promise; + ).lean(); beforeAll(async () => { mongoServer = await MongoMemoryServer.create(); diff --git a/packages/api/src/middleware/capabilities.integration.spec.ts b/packages/api/src/middleware/capabilities.integration.spec.ts index dee1f446e6..cde5926b0b 100644 --- a/packages/api/src/middleware/capabilities.integration.spec.ts +++ b/packages/api/src/middleware/capabilities.integration.spec.ts @@ -28,6 +28,17 @@ jest.mock('@librechat/data-schemas', () => ({ let mongoServer: MongoMemoryServer; let methods: AllMethods; +const mockGetUserPrincipals = () => + jest.fn, Parameters>( + methods.getUserPrincipals, + ); + +const mockHasCapabilityForPrincipals = () => + jest.fn< + ReturnType, + Parameters + >(methods.hasCapabilityForPrincipals); + beforeAll(async () => { mongoServer = await MongoMemoryServer.create(); await mongoose.connect(mongoServer.getUri()); @@ -229,7 +240,7 @@ describe('capabilities integration (real MongoDB)', () => { describe('AsyncLocalStorage per-request caching', () => { it('caches getUserPrincipals within a single request context', async () => { await methods.seedSystemGrants(); - const getUserPrincipals = jest.fn(methods.getUserPrincipals); + const getUserPrincipals = mockGetUserPrincipals(); const { hasCapability } = generateCapabilityCheck({ getUserPrincipals, @@ -247,7 +258,7 @@ describe('capabilities integration (real MongoDB)', () => { it('caches capability results within a single request context', async () => { await methods.seedSystemGrants(); - const hasCapabilityForPrincipals = jest.fn(methods.hasCapabilityForPrincipals); + const hasCapabilityForPrincipals = mockHasCapabilityForPrincipals(); const { hasCapability } = generateCapabilityCheck({ getUserPrincipals: methods.getUserPrincipals, @@ -262,14 +273,16 @@ describe('capabilities integration (real MongoDB)', () => { }); const accessAdminCalls = hasCapabilityForPrincipals.mock.calls.filter( - (args) => args[0].capability === SystemCapabilities.ACCESS_ADMIN, + (args) => + (args[0] as { capability: SystemCapability }).capability === + SystemCapabilities.ACCESS_ADMIN, ); expect(accessAdminCalls).toHaveLength(1); }); it('does NOT share cache across separate request contexts', async () => { await methods.seedSystemGrants(); - const getUserPrincipals = jest.fn(methods.getUserPrincipals); + const getUserPrincipals = mockGetUserPrincipals(); const { hasCapability } = generateCapabilityCheck({ getUserPrincipals, @@ -325,7 +338,7 @@ describe('capabilities integration (real MongoDB)', () => { it('falls through to DB when outside request context (no ALS)', async () => { await methods.seedSystemGrants(); - const getUserPrincipals = jest.fn(methods.getUserPrincipals); + const getUserPrincipals = mockGetUserPrincipals(); const { hasCapability } = generateCapabilityCheck({ getUserPrincipals, @@ -339,7 +352,7 @@ describe('capabilities integration (real MongoDB)', () => { }); it('caches false results correctly (negative caching)', async () => { - const hasCapabilityForPrincipals = jest.fn(methods.hasCapabilityForPrincipals); + const hasCapabilityForPrincipals = mockHasCapabilityForPrincipals(); const { hasCapability } = generateCapabilityCheck({ getUserPrincipals: methods.getUserPrincipals, @@ -354,14 +367,16 @@ describe('capabilities integration (real MongoDB)', () => { }); const manageUserCalls = hasCapabilityForPrincipals.mock.calls.filter( - (args) => args[0].capability === SystemCapabilities.MANAGE_USERS, + (args) => + (args[0] as { capability: SystemCapability }).capability === + SystemCapabilities.MANAGE_USERS, ); expect(manageUserCalls).toHaveLength(1); }); it('uses separate principal cache keys for different users in same context', async () => { await methods.seedSystemGrants(); - const getUserPrincipals = jest.fn(methods.getUserPrincipals); + const getUserPrincipals = mockGetUserPrincipals(); const { hasCapability } = generateCapabilityCheck({ getUserPrincipals, @@ -378,7 +393,7 @@ describe('capabilities integration (real MongoDB)', () => { it('uses separate principal cache keys for different tenantIds (same user)', async () => { await methods.seedSystemGrants(); - const getUserPrincipals = jest.fn(methods.getUserPrincipals); + const getUserPrincipals = mockGetUserPrincipals(); const { hasCapability } = generateCapabilityCheck({ getUserPrincipals, @@ -465,8 +480,8 @@ describe('capabilities integration (real MongoDB)', () => { it('every DB call executes (no caching) when ALS context is missing', async () => { await methods.seedSystemGrants(); - const getUserPrincipals = jest.fn(methods.getUserPrincipals); - const hasCapabilityForPrincipals = jest.fn(methods.hasCapabilityForPrincipals); + const getUserPrincipals = mockGetUserPrincipals(); + const hasCapabilityForPrincipals = mockHasCapabilityForPrincipals(); const { hasCapability } = generateCapabilityCheck({ getUserPrincipals, @@ -485,7 +500,7 @@ describe('capabilities integration (real MongoDB)', () => { it('nested capabilityContextMiddleware creates an independent inner context', async () => { await methods.seedSystemGrants(); - const getUserPrincipals = jest.fn(methods.getUserPrincipals); + const getUserPrincipals = mockGetUserPrincipals(); const { hasCapability } = generateCapabilityCheck({ getUserPrincipals, @@ -581,7 +596,7 @@ describe('capabilities integration (real MongoDB)', () => { capability: SystemCapabilities.READ_AGENTS, }); - const getUserPrincipals = jest.fn(methods.getUserPrincipals); + const getUserPrincipals = mockGetUserPrincipals(); const { hasCapability } = generateCapabilityCheck({ getUserPrincipals, diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 12512cb1fe..f3e4a5bb0a 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -6,7 +6,7 @@ "noImplicitAny": true, "outDir": "./types", "target": "es2015", - "moduleResolution": "node", + "moduleResolution": "bundler", "allowSyntheticDefaultImports": true, "lib": ["es2017", "dom", "ES2021.String", "ES2021.WeakRef"], "allowJs": true, diff --git a/packages/client/tsconfig.json b/packages/client/tsconfig.json index bcead085e3..e15bc2ab53 100644 --- a/packages/client/tsconfig.json +++ b/packages/client/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "ES2020", "module": "ESNext", - "moduleResolution": "node", + "moduleResolution": "bundler", "jsx": "react-jsx", "jsxImportSource": "react", "declaration": true, diff --git a/packages/data-provider/package.json b/packages/data-provider/package.json index a9535a1134..446a4cd97b 100644 --- a/packages/data-provider/package.json +++ b/packages/data-provider/package.json @@ -43,7 +43,7 @@ }, "homepage": "https://librechat.ai", "dependencies": { - "axios": "^1.15.0", + "axios": "^1.16.0", "dayjs": "^1.11.13", "js-yaml": "^4.1.1", "zod": "^3.22.4" diff --git a/packages/data-provider/react-query/package-lock.json b/packages/data-provider/react-query/package-lock.json index 1173e29d45..6653102f4f 100644 --- a/packages/data-provider/react-query/package-lock.json +++ b/packages/data-provider/react-query/package-lock.json @@ -6,7 +6,7 @@ "": { "name": "librechat-data-provider/react-query", "dependencies": { - "axios": "^1.15.0" + "axios": "^1.16.0" } }, "node_modules/asynckit": { @@ -16,12 +16,12 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", - "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.11", + "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } @@ -120,9 +120,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.11", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", - "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", diff --git a/packages/data-provider/react-query/package.json b/packages/data-provider/react-query/package.json index 66d0e129cb..b426c6386a 100644 --- a/packages/data-provider/react-query/package.json +++ b/packages/data-provider/react-query/package.json @@ -5,6 +5,6 @@ "module": "./index.es.js", "types": "../dist/types/react-query/index.d.ts", "dependencies": { - "axios": "^1.15.0" + "axios": "^1.16.0" } } diff --git a/packages/data-provider/tsconfig.json b/packages/data-provider/tsconfig.json index bd5c95c16a..b8ed29eb2a 100644 --- a/packages/data-provider/tsconfig.json +++ b/packages/data-provider/tsconfig.json @@ -6,7 +6,7 @@ "noImplicitAny": true, "outDir": "./types", "target": "es5", - "moduleResolution": "node", + "moduleResolution": "bundler", "allowSyntheticDefaultImports": true, "lib": ["es2017", "dom", "ES2021.String"], "allowJs": true, diff --git a/packages/data-schemas/package.json b/packages/data-schemas/package.json index 750af04ce1..7be9d5b890 100644 --- a/packages/data-schemas/package.json +++ b/packages/data-schemas/package.json @@ -69,7 +69,7 @@ "librechat-data-provider": "*", "lodash": "^4.17.23", "meilisearch": "^0.38.0", - "mongoose": "^8.12.1", + "mongoose": "^8.23.1", "nanoid": "^3.3.7", "winston": "^3.17.0", "winston-daily-rotate-file": "^5.0.0" diff --git a/packages/data-schemas/src/methods/accessRole.ts b/packages/data-schemas/src/methods/accessRole.ts index 71cbba0c76..654912978d 100644 --- a/packages/data-schemas/src/methods/accessRole.ts +++ b/packages/data-schemas/src/methods/accessRole.ts @@ -11,7 +11,7 @@ export function createAccessRoleMethods(mongoose: typeof import('mongoose')) { */ async function findRoleById(roleId: string | Types.ObjectId): Promise { const AccessRole = mongoose.models.AccessRole as Model; - return await AccessRole.findById(roleId).lean(); + return await AccessRole.findById(roleId).lean(); } /** @@ -23,7 +23,7 @@ export function createAccessRoleMethods(mongoose: typeof import('mongoose')) { accessRoleId: string | Types.ObjectId, ): Promise { const AccessRole = mongoose.models.AccessRole as Model; - return await AccessRole.findOne({ accessRoleId }).lean(); + return await AccessRole.findOne({ accessRoleId }).lean(); } /** @@ -33,7 +33,7 @@ export function createAccessRoleMethods(mongoose: typeof import('mongoose')) { */ async function findRolesByResourceType(resourceType: string): Promise { const AccessRole = mongoose.models.AccessRole as Model; - return await AccessRole.find({ resourceType }).lean(); + return await AccessRole.find({ resourceType }).lean(); } /** @@ -47,7 +47,7 @@ export function createAccessRoleMethods(mongoose: typeof import('mongoose')) { permBits: PermissionBits | RoleBits, ): Promise { const AccessRole = mongoose.models.AccessRole as Model; - return await AccessRole.findOne({ resourceType, permBits }).lean(); + return await AccessRole.findOne({ resourceType, permBits }).lean(); } /** @@ -75,7 +75,7 @@ export function createAccessRoleMethods(mongoose: typeof import('mongoose')) { { accessRoleId }, { $set: updateData }, { new: true }, - ).lean(); + ).lean(); } /** @@ -94,7 +94,7 @@ export function createAccessRoleMethods(mongoose: typeof import('mongoose')) { */ async function getAllRoles(): Promise { const AccessRole = mongoose.models.AccessRole as Model; - return await AccessRole.find().lean(); + return await AccessRole.find().lean(); } /** @@ -218,9 +218,11 @@ export function createAccessRoleMethods(mongoose: typeof import('mongoose')) { { accessRoleId: role.accessRoleId }, { $setOnInsert: role }, { upsert: true, new: true }, - ).lean(); + ).lean(); - result[role.accessRoleId] = upsertedRole; + if (upsertedRole) { + result[role.accessRoleId] = upsertedRole; + } } return result; @@ -237,13 +239,15 @@ export function createAccessRoleMethods(mongoose: typeof import('mongoose')) { permBits: PermissionBits | RoleBits, ): Promise { const AccessRole = mongoose.models.AccessRole as Model; - const exactMatch = await AccessRole.findOne({ resourceType, permBits }).lean(); + const exactMatch = await AccessRole.findOne({ resourceType, permBits }).lean(); if (exactMatch) { return exactMatch; } /** If no exact match, the closest role without exceeding permissions */ - const roles = await AccessRole.find({ resourceType }).sort({ permBits: -1 }).lean(); + const roles = await AccessRole.find({ resourceType }) + .sort({ permBits: -1 }) + .lean(); return roles.find((role) => (role.permBits & permBits) === role.permBits) || null; } diff --git a/packages/data-schemas/src/methods/aclEntry.ts b/packages/data-schemas/src/methods/aclEntry.ts index c44b2453f2..0f2bef8d35 100644 --- a/packages/data-schemas/src/methods/aclEntry.ts +++ b/packages/data-schemas/src/methods/aclEntry.ts @@ -93,7 +93,7 @@ export function createAclEntryMethods(mongoose: typeof import('mongoose')) { if (resourceType) { query.resourceType = resourceType; } - return await AclEntry.find(query).lean(); + return await AclEntry.find(query).lean(); } /** @@ -107,7 +107,7 @@ export function createAclEntryMethods(mongoose: typeof import('mongoose')) { resourceId: string | Types.ObjectId, ): Promise { const AclEntry = mongoose.models.AclEntry as Model; - return await AclEntry.find({ resourceType, resourceId }).lean(); + return await AclEntry.find({ resourceType, resourceId }).lean(); } /** @@ -132,7 +132,7 @@ export function createAclEntryMethods(mongoose: typeof import('mongoose')) { $or: principalsQuery, resourceType, resourceId, - }).lean(); + }).lean(); } /** diff --git a/packages/data-schemas/src/methods/action.ts b/packages/data-schemas/src/methods/action.ts index 9467ad6a76..3dc5a2c87a 100644 --- a/packages/data-schemas/src/methods/action.ts +++ b/packages/data-schemas/src/methods/action.ts @@ -14,11 +14,7 @@ export function createActionMethods(mongoose: typeof import('mongoose')) { ): Promise { const Action = mongoose.models.Action as Model; const options = { new: true, upsert: true }; - return (await Action.findOneAndUpdate( - searchParams, - updateData, - options, - ).lean()) as IAction | null; + return await Action.findOneAndUpdate(searchParams, updateData, options).lean(); } /** @@ -29,7 +25,7 @@ export function createActionMethods(mongoose: typeof import('mongoose')) { includeSensitive = false, ): Promise { const Action = mongoose.models.Action as Model; - const actions = (await Action.find(searchParams).lean()) as IAction[]; + const actions = await Action.find(searchParams).lean(); if (!includeSensitive) { for (let i = 0; i < actions.length; i++) { @@ -54,7 +50,7 @@ export function createActionMethods(mongoose: typeof import('mongoose')) { */ async function deleteAction(searchParams: FilterQuery): Promise { const Action = mongoose.models.Action as Model; - return (await Action.findOneAndDelete(searchParams).lean()) as IAction | null; + return await Action.findOneAndDelete(searchParams).lean(); } /** diff --git a/packages/data-schemas/src/methods/agent.ts b/packages/data-schemas/src/methods/agent.ts index 0ca518262b..833f0b9f63 100644 --- a/packages/data-schemas/src/methods/agent.ts +++ b/packages/data-schemas/src/methods/agent.ts @@ -271,7 +271,7 @@ export function createAgentMethods(mongoose: typeof import('mongoose'), deps: Ag */ async function getAgent(searchParameter: FilterQuery): Promise { const Agent = mongoose.models.Agent as Model; - return (await Agent.findOne(searchParameter).lean()) as IAgent | null; + return await Agent.findOne(searchParameter).lean(); } /** @@ -279,7 +279,7 @@ export function createAgentMethods(mongoose: typeof import('mongoose'), deps: Ag */ async function getAgents(searchParameter: FilterQuery): Promise { const Agent = mongoose.models.Agent as Model; - return (await Agent.find(searchParameter).lean()) as IAgent[]; + return await Agent.find(searchParameter).lean(); } /** @@ -780,9 +780,13 @@ export function createAgentMethods(mongoose: typeof import('mongoose'), deps: Ag delete revertToVersion.author; delete revertToVersion.updatedBy; - return (await Agent.findOneAndUpdate(searchParameter, revertToVersion, { + const revertedAgent = await Agent.findOneAndUpdate(searchParameter, revertToVersion, { new: true, - }).lean()) as IAgent; + }).lean(); + if (!revertedAgent) { + throw new Error('Agent not found'); + } + return revertedAgent; } /** diff --git a/packages/data-schemas/src/methods/agentCategory.ts b/packages/data-schemas/src/methods/agentCategory.ts index baf33207aa..0a71d777db 100644 --- a/packages/data-schemas/src/methods/agentCategory.ts +++ b/packages/data-schemas/src/methods/agentCategory.ts @@ -9,7 +9,9 @@ export function createAgentCategoryMethods(mongoose: typeof import('mongoose')) */ async function getActiveCategories(): Promise { const AgentCategory = mongoose.models.AgentCategory as Model; - return await AgentCategory.find({ isActive: true }).sort({ order: 1, label: 1 }).lean(); + return await AgentCategory.find({ isActive: true }) + .sort({ order: 1, label: 1 }) + .lean(); } /** @@ -85,7 +87,7 @@ export function createAgentCategoryMethods(mongoose: typeof import('mongoose')) */ async function findCategoryByValue(value: string): Promise { const AgentCategory = mongoose.models.AgentCategory as Model; - return await AgentCategory.findOne({ value }).lean(); + return await AgentCategory.findOne({ value }).lean(); } /** @@ -114,7 +116,7 @@ export function createAgentCategoryMethods(mongoose: typeof import('mongoose')) { value }, { $set: updateData }, { new: true, runValidators: true }, - ).lean(); + ).lean(); } /** @@ -135,7 +137,7 @@ export function createAgentCategoryMethods(mongoose: typeof import('mongoose')) */ async function findCategoryById(id: string | Types.ObjectId): Promise { const AgentCategory = mongoose.models.AgentCategory as Model; - return await AgentCategory.findById(id).lean(); + return await AgentCategory.findById(id).lean(); } /** @@ -144,7 +146,7 @@ export function createAgentCategoryMethods(mongoose: typeof import('mongoose')) */ async function getAllCategories(): Promise { const AgentCategory = mongoose.models.AgentCategory as Model; - return await AgentCategory.find({}).sort({ order: 1, label: 1 }).lean(); + return await AgentCategory.find({}).sort({ order: 1, label: 1 }).lean(); } /** diff --git a/packages/data-schemas/src/methods/assistant.ts b/packages/data-schemas/src/methods/assistant.ts index 79133d4237..798acb688c 100644 --- a/packages/data-schemas/src/methods/assistant.ts +++ b/packages/data-schemas/src/methods/assistant.ts @@ -12,11 +12,7 @@ export function createAssistantMethods(mongoose: typeof import('mongoose')) { ): Promise { const Assistant = mongoose.models.Assistant as Model; const options = { new: true, upsert: true }; - return (await Assistant.findOneAndUpdate( - searchParams, - updateData, - options, - ).lean()) as IAssistant | null; + return await Assistant.findOneAndUpdate(searchParams, updateData, options).lean(); } /** @@ -24,7 +20,7 @@ export function createAssistantMethods(mongoose: typeof import('mongoose')) { */ async function getAssistant(searchParams: FilterQuery): Promise { const Assistant = mongoose.models.Assistant as Model; - return (await Assistant.findOne(searchParams).lean()) as IAssistant | null; + return await Assistant.findOne(searchParams).lean(); } /** @@ -37,7 +33,7 @@ export function createAssistantMethods(mongoose: typeof import('mongoose')) { const Assistant = mongoose.models.Assistant as Model; const query = Assistant.find(searchParams); - return (await (select ? query.select(select) : query).lean()) as IAssistant[]; + return await (select ? query.select(select) : query).lean(); } /** diff --git a/packages/data-schemas/src/methods/config.ts b/packages/data-schemas/src/methods/config.ts index 42047d216f..68deed3ae0 100644 --- a/packages/data-schemas/src/methods/config.ts +++ b/packages/data-schemas/src/methods/config.ts @@ -22,7 +22,7 @@ export function createConfigMethods(mongoose: typeof import('mongoose')) { } return await Config.findOne(filter) .session(session ?? null) - .lean(); + .lean(); } async function listAllConfigs( @@ -37,7 +37,7 @@ export function createConfigMethods(mongoose: typeof import('mongoose')) { return await Config.find(where) .sort({ priority: 1 }) .session(session ?? null) - .lean(); + .lean(); } async function getApplicableConfigs( @@ -70,7 +70,7 @@ export function createConfigMethods(mongoose: typeof import('mongoose')) { }) .sort({ priority: 1 }) .session(session ?? null) - .lean(); + .lean(); } async function upsertConfig( diff --git a/packages/data-schemas/src/methods/conversation.spec.ts b/packages/data-schemas/src/methods/conversation.spec.ts index cf9071815f..0b6e0857cd 100644 --- a/packages/data-schemas/src/methods/conversation.spec.ts +++ b/packages/data-schemas/src/methods/conversation.spec.ts @@ -680,7 +680,7 @@ describe('Conversation Operations', () => { createdAt, updatedAt, }); - return Conversation.findOne({ conversationId }).lean(); + return Conversation.findOne({ conversationId }).lean(); }; it('should not skip conversations at page boundaries', async () => { diff --git a/packages/data-schemas/src/methods/conversation.ts b/packages/data-schemas/src/methods/conversation.ts index 63d2f71396..f02ea8dbe0 100644 --- a/packages/data-schemas/src/methods/conversation.ts +++ b/packages/data-schemas/src/methods/conversation.ts @@ -71,7 +71,10 @@ export function createConversationMethods( async function searchConversation(conversationId: string) { try { const Conversation = mongoose.models.Conversation as Model; - return await Conversation.findOne({ conversationId }, 'conversationId user').lean(); + return await Conversation.findOne( + { conversationId }, + 'conversationId user', + ).lean(); } catch (error) { logger.error('[searchConversation] Error searching conversation', error); throw new Error('Error searching conversation'); @@ -84,7 +87,7 @@ export function createConversationMethods( async function getConvo(user: string, conversationId: string) { try { const Conversation = mongoose.models.Conversation as Model; - return await Conversation.findOne({ user, conversationId }).lean(); + return await Conversation.findOne({ user, conversationId }).lean(); } catch (error) { logger.error('[getConvo] Error getting single conversation', error); throw new Error('Error getting single conversation'); @@ -130,8 +133,7 @@ export function createConversationMethods( try { const Conversation = mongoose.models.Conversation as Model; return ( - ((await Conversation.findOne({ conversationId }, 'files').lean()) as IConversation | null) - ?.files ?? [] + (await Conversation.findOne({ conversationId }, 'files').lean())?.files ?? [] ); } catch (error) { logger.error('[getConvoFiles] Error getting conversation files', error); @@ -381,16 +383,21 @@ export function createConversationMethods( ) .sort(sortObj) .limit(limit + 1) - .lean(); + .lean(); let nextCursor: string | null = null; if (convos.length > limit) { convos.pop(); - const lastReturned = convos[convos.length - 1] as Record; - const primaryValue = lastReturned[finalSortBy]; + const lastReturned = convos[convos.length - 1]; + let primaryValue: string | Date | undefined = lastReturned.updatedAt; + if (finalSortBy === 'title') { + primaryValue = lastReturned.title; + } else if (finalSortBy === 'createdAt') { + primaryValue = lastReturned.createdAt; + } const primaryStr = - finalSortBy === 'title' ? primaryValue : (primaryValue as Date).toISOString(); - const secondaryStr = (lastReturned.updatedAt as Date).toISOString(); + finalSortBy === 'title' ? primaryValue : new Date(primaryValue ?? 0).toISOString(); + const secondaryStr = new Date(lastReturned.updatedAt ?? 0).toISOString(); const composite = { primary: primaryStr, secondary: secondaryStr }; nextCursor = Buffer.from(JSON.stringify(composite)).toString('base64'); } @@ -423,7 +430,7 @@ export function createConversationMethods( user, conversationId: { $in: conversationIds }, $or: [{ expiredAt: { $exists: false } }, { expiredAt: null }], - }).lean(); + }).lean(); results.sort( (a, b) => new Date(b.updatedAt ?? 0).getTime() - new Date(a.updatedAt ?? 0).getTime(), diff --git a/packages/data-schemas/src/methods/file.ts b/packages/data-schemas/src/methods/file.ts index a09770d675..61beee5b17 100644 --- a/packages/data-schemas/src/methods/file.ts +++ b/packages/data-schemas/src/methods/file.ts @@ -17,7 +17,7 @@ export function createFileMethods(mongoose: typeof import('mongoose')) { options: Record = {}, ): Promise { const File = mongoose.models.File as Model; - return File.findOne({ file_id, ...options }).lean(); + return File.findOne({ file_id, ...options }).lean(); } /** Select fields for query projection - 0 to exclude, 1 to include */ @@ -44,7 +44,7 @@ export function createFileMethods(mongoose: typeof import('mongoose')) { } else { query.select({ text: 0 }); } - return await query.sort(sortOptions).lean(); + return await query.sort(sortOptions).lean(); } /** @@ -198,13 +198,13 @@ export function createFileMethods(mongoose: typeof import('mongoose')) { }, { $setOnInsert: insertData }, { upsert: true, new: true }, - ).lean(); + ).lean(); if (!result) { throw new Error( `[claimCodeFile] Failed to claim file "${data.filename}" for conversation ${data.conversationId}`, ); } - return result as IMongoFile; + return result; } /** @@ -230,7 +230,7 @@ export function createFileMethods(mongoose: typeof import('mongoose')) { return File.findOneAndUpdate({ file_id: data.file_id }, fileData, { new: true, upsert: true, - }).lean(); + }).lean(); } /** @@ -263,7 +263,7 @@ export function createFileMethods(mongoose: typeof import('mongoose')) { const query: FilterQuery = extraFilter ? { file_id, ...extraFilter } : { file_id }; return File.findOneAndUpdate(query, updateOperation, { new: true, - }).lean(); + }).lean(); } /** @@ -283,7 +283,7 @@ export function createFileMethods(mongoose: typeof import('mongoose')) { }; return File.findOneAndUpdate({ file_id }, updateOperation, { new: true, - }).lean(); + }).lean(); } /** @@ -293,7 +293,7 @@ export function createFileMethods(mongoose: typeof import('mongoose')) { */ async function deleteFile(file_id: string): Promise { const File = mongoose.models.File as Model; - return File.findOneAndDelete({ file_id }).lean(); + return File.findOneAndDelete({ file_id }).lean(); } /** @@ -303,7 +303,7 @@ export function createFileMethods(mongoose: typeof import('mongoose')) { */ async function deleteFileByFilter(filter: FilterQuery): Promise { const File = mongoose.models.File as Model; - return File.findOneAndDelete(filter).lean(); + return File.findOneAndDelete(filter).lean(); } /** diff --git a/packages/data-schemas/src/methods/mcpServer.ts b/packages/data-schemas/src/methods/mcpServer.ts index e85421fea2..4851e2c566 100644 --- a/packages/data-schemas/src/methods/mcpServer.ts +++ b/packages/data-schemas/src/methods/mcpServer.ts @@ -58,7 +58,7 @@ export function createMCPServerMethods(mongoose: typeof import('mongoose')) { serverName: { $regex: `^${escapedBaseName}(-\\d+)?$` }, }) .select('serverName') - .lean(); + .lean>(); if (existing.length === 0) { return baseName; @@ -139,7 +139,7 @@ export function createMCPServerMethods(mongoose: typeof import('mongoose')) { */ async function findMCPServerByServerName(serverName: string): Promise { const MCPServer = mongoose.models.MCPServer as Model; - return await MCPServer.findOne({ serverName }).lean(); + return await MCPServer.findOne({ serverName }).lean(); } /** @@ -151,7 +151,7 @@ export function createMCPServerMethods(mongoose: typeof import('mongoose')) { _id: string | Types.ObjectId, ): Promise { const MCPServer = mongoose.models.MCPServer as Model; - return await MCPServer.findById(_id).lean(); + return await MCPServer.findById(_id).lean(); } /** @@ -163,7 +163,9 @@ export function createMCPServerMethods(mongoose: typeof import('mongoose')) { authorId: string | Types.ObjectId, ): Promise { const MCPServer = mongoose.models.MCPServer as Model; - return await MCPServer.find({ author: authorId }).sort({ updatedAt: -1 }).lean(); + return await MCPServer.find({ author: authorId }) + .sort({ updatedAt: -1 }) + .lean(); } /** @@ -229,7 +231,9 @@ export function createMCPServerMethods(mongoose: typeof import('mongoose')) { if (normalizedLimit === null) { // No pagination - return all matching servers - const servers = await MCPServer.find(baseQuery).sort({ updatedAt: -1, _id: 1 }).lean(); + const servers = await MCPServer.find(baseQuery) + .sort({ updatedAt: -1, _id: 1 }) + .lean(); return { data: servers, @@ -242,7 +246,7 @@ export function createMCPServerMethods(mongoose: typeof import('mongoose')) { const servers = await MCPServer.find(baseQuery) .sort({ updatedAt: -1, _id: 1 }) .limit(normalizedLimit + 1) - .lean(); + .lean(); const hasMore = servers.length > normalizedLimit; const data = hasMore ? servers.slice(0, normalizedLimit) : servers; @@ -280,7 +284,7 @@ export function createMCPServerMethods(mongoose: typeof import('mongoose')) { { serverName }, { $set: updateData }, { new: true, runValidators: true }, - ).lean(); + ).lean(); } /** @@ -290,7 +294,7 @@ export function createMCPServerMethods(mongoose: typeof import('mongoose')) { */ async function deleteMCPServer(serverName: string): Promise { const MCPServer = mongoose.models.MCPServer as Model; - return await MCPServer.findOneAndDelete({ serverName }).lean(); + return await MCPServer.findOneAndDelete({ serverName }).lean(); } /** @@ -305,7 +309,9 @@ export function createMCPServerMethods(mongoose: typeof import('mongoose')) { return { data: [] }; } const MCPServer = mongoose.models.MCPServer as Model; - const servers = await MCPServer.find({ serverName: { $in: names } }).lean(); + const servers = await MCPServer.find({ serverName: { $in: names } }).lean< + MCPServerDocument[] + >(); return { data: servers }; } diff --git a/packages/data-schemas/src/methods/message.spec.ts b/packages/data-schemas/src/methods/message.spec.ts index dfa34c0eec..14fe28596d 100644 --- a/packages/data-schemas/src/methods/message.spec.ts +++ b/packages/data-schemas/src/methods/message.spec.ts @@ -626,7 +626,7 @@ describe('Message Operations', () => { createdAt, updatedAt: createdAt, }); - return Message.findOne({ messageId }).lean(); + return Message.findOne({ messageId }).lean(); }; /** diff --git a/packages/data-schemas/src/methods/message.ts b/packages/data-schemas/src/methods/message.ts index 2e638b6bfb..b4b5038ca8 100644 --- a/packages/data-schemas/src/methods/message.ts +++ b/packages/data-schemas/src/methods/message.ts @@ -276,7 +276,7 @@ export function createMessageMethods(mongoose: typeof import('mongoose')): Messa ) { try { const Message = mongoose.models.Message as Model; - const message = await Message.findOne({ messageId, user: userId }).lean(); + const message = await Message.findOne({ messageId, user: userId }).lean(); if (message) { const query = Message.find({ conversationId, user: userId }); @@ -298,10 +298,10 @@ export function createMessageMethods(mongoose: typeof import('mongoose')): Messa try { const Message = mongoose.models.Message as Model; if (select) { - return await Message.find(filter).select(select).sort({ createdAt: 1 }).lean(); + return await Message.find(filter).select(select).sort({ createdAt: 1 }).lean(); } - return await Message.find(filter).sort({ createdAt: 1 }).lean(); + return await Message.find(filter).sort({ createdAt: 1 }).lean(); } catch (err) { logger.error('Error getting messages:', err); throw err; @@ -314,7 +314,7 @@ export function createMessageMethods(mongoose: typeof import('mongoose')): Messa async function getMessage({ user, messageId }: { user: string; messageId: string }) { try { const Message = mongoose.models.Message as Model; - return await Message.findOne({ user, messageId }).lean(); + return await Message.findOne({ user, messageId }).lean(); } catch (err) { logger.error('Error getting message:', err); throw err; @@ -355,13 +355,15 @@ export function createMessageMethods(mongoose: typeof import('mongoose')): Messa const messages = await Message.find(queryFilter) .sort({ [sortField]: sortOrder }) .limit(limit + 1) - .lean(); + .lean(); let nextCursor: string | null = null; if (messages.length > limit) { messages.pop(); - const last = messages[messages.length - 1] as Record; - nextCursor = String(last[sortField] ?? ''); + const last = messages[messages.length - 1]; + const cursorValue = + sortField === 'createdAt' ? last.createdAt : last[sortField as keyof IMessage]; + nextCursor = String(cursorValue ?? ''); } return { messages, nextCursor }; } diff --git a/packages/data-schemas/src/methods/pluginAuth.ts b/packages/data-schemas/src/methods/pluginAuth.ts index 9f79552a80..e95e3123be 100644 --- a/packages/data-schemas/src/methods/pluginAuth.ts +++ b/packages/data-schemas/src/methods/pluginAuth.ts @@ -23,7 +23,7 @@ export function createPluginAuthMethods(mongoose: typeof import('mongoose')) { userId, authField, ...(pluginKey && { pluginKey }), - }).lean(); + }).lean(); } catch (error) { throw new Error( `Failed to find plugin auth: ${error instanceof Error ? error.message : 'Unknown error'}`, @@ -47,7 +47,7 @@ export function createPluginAuthMethods(mongoose: typeof import('mongoose')) { return await PluginAuth.find({ userId, pluginKey: { $in: pluginKeys }, - }).lean(); + }).lean(); } catch (error) { throw new Error( `Failed to find plugin auths: ${error instanceof Error ? error.message : 'Unknown error'}`, @@ -66,14 +66,18 @@ export function createPluginAuthMethods(mongoose: typeof import('mongoose')) { }: UpdatePluginAuthParams): Promise { try { const PluginAuth: Model = mongoose.models.PluginAuth; - const existingAuth = await PluginAuth.findOne({ userId, pluginKey, authField }).lean(); + const existingAuth = await PluginAuth.findOne({ + userId, + pluginKey, + authField, + }).lean(); if (existingAuth) { return await PluginAuth.findOneAndUpdate( { userId, pluginKey, authField }, { $set: { value } }, { new: true, upsert: true }, - ).lean(); + ).lean(); } else { const newPluginAuth = await new PluginAuth({ userId, diff --git a/packages/data-schemas/src/methods/role.ts b/packages/data-schemas/src/methods/role.ts index e84b91420a..f0ffdb1700 100644 --- a/packages/data-schemas/src/methods/role.ts +++ b/packages/data-schemas/src/methods/role.ts @@ -146,7 +146,13 @@ export function createRoleMethods(mongoose: typeof import('mongoose'), deps: Rol const targetName = updates.name ?? roleName; throw new RoleConflictError(`Role "${targetName}" already exists`); } - throw new Error(`Failed to update role: ${(error as Error).message}`, { cause: error }); + const updateError = new Error( + `Failed to update role: ${(error as Error).message}`, + ) as Error & { + cause?: unknown; + }; + updateError.cause = error; + throw updateError; } } @@ -487,7 +493,7 @@ export function createRoleMethods(mongoose: typeof import('mongoose'), deps: Rol .sort({ _id: 1 }) .skip(offset) .limit(limit) - .lean(); + .lean(); } async function countUsersByRole(roleName: string): Promise { diff --git a/packages/data-schemas/src/methods/systemGrant.ts b/packages/data-schemas/src/methods/systemGrant.ts index 5b31619706..2e8eea80cf 100644 --- a/packages/data-schemas/src/methods/systemGrant.ts +++ b/packages/data-schemas/src/methods/systemGrant.ts @@ -278,7 +278,7 @@ export function createSystemGrantMethods(mongoose: typeof import('mongoose')) { ...tenantCondition(tenantId), }; - return await SystemGrant.find(filter).lean(); + return await SystemGrant.find(filter).lean(); } const GRANTS_DEFAULT_LIMIT = 50; @@ -302,7 +302,7 @@ export function createSystemGrantMethods(mongoose: typeof import('mongoose')) { .sort({ principalType: 1, capability: 1 }) .skip(offset) .limit(limit) - .lean(); + .lean(); } async function countGrants(options?: { @@ -346,7 +346,7 @@ export function createSystemGrantMethods(mongoose: typeof import('mongoose')) { ...tenantCondition(tenantId), }; - return await SystemGrant.find(filter).lean(); + return await SystemGrant.find(filter).lean(); } /** diff --git a/packages/data-schemas/src/methods/transaction.ts b/packages/data-schemas/src/methods/transaction.ts index 66c34b7e00..b71e111a79 100644 --- a/packages/data-schemas/src/methods/transaction.ts +++ b/packages/data-schemas/src/methods/transaction.ts @@ -188,9 +188,9 @@ export function createTransactionMethods( let lastError: Error | null = null; for (let attempt = 1; attempt <= maxRetries; attempt++) { - let currentBalanceDoc; + let currentBalanceDoc: IBalance | null; try { - currentBalanceDoc = await Balance.findOne({ user }).lean(); + currentBalanceDoc = await Balance.findOne({ user }).lean(); const currentCredits = currentBalanceDoc ? currentBalanceDoc.tokenCredits : 0; const potentialNewCredits = currentCredits + incrementValue; const newCredits = Math.max(0, potentialNewCredits); @@ -208,7 +208,7 @@ export function createTransactionMethods( { user, tokenCredits: currentCredits }, updatePayload, { new: true }, - ).lean(); + ).lean(); if (updatedBalance) { return updatedBalance; @@ -219,7 +219,7 @@ export function createTransactionMethods( updatedBalance = await Balance.findOneAndUpdate({ user }, updatePayload, { upsert: true, new: true, - }).lean(); + }).lean(); if (updatedBalance) { return updatedBalance; @@ -384,7 +384,7 @@ export function createTransactionMethods( /** Retrieves a user's balance record. */ async function findBalanceByUser(user: string): Promise { const Balance = mongoose.models.Balance as Model; - return Balance.findOne({ user }).lean(); + return Balance.findOne({ user }).lean(); } /** Upserts balance fields for a user. */ @@ -393,7 +393,11 @@ export function createTransactionMethods( fields: IBalanceUpdate, ): Promise { const Balance = mongoose.models.Balance as Model; - return Balance.findOneAndUpdate({ user }, { $set: fields }, { upsert: true, new: true }).lean(); + return Balance.findOneAndUpdate( + { user }, + { $set: fields }, + { upsert: true, new: true }, + ).lean(); } /** Deletes transactions matching a filter. */ diff --git a/packages/data-schemas/src/methods/user.ts b/packages/data-schemas/src/methods/user.ts index 8e3b632292..d7aa3f90c9 100644 --- a/packages/data-schemas/src/methods/user.ts +++ b/packages/data-schemas/src/methods/user.ts @@ -42,7 +42,7 @@ export function createUserMethods(mongoose: typeof import('mongoose')) { if (fieldsToSelect) { query.select(fieldsToSelect); } - return await query.lean(); + return await query.lean(); } async function findUsers( @@ -65,7 +65,7 @@ export function createUserMethods(mongoose: typeof import('mongoose')) { if (options?.limit != null && options.limit > 0) { query.limit(options.limit); } - return (await query.lean()) as IUser[]; + return await query.lean(); } /** @@ -148,10 +148,10 @@ export function createUserMethods(mongoose: typeof import('mongoose')) { $set: updateData, $unset: { expiresAt: '' }, // Remove the expiresAt field to prevent TTL }; - return (await User.findByIdAndUpdate(userId, updateOperation, { + return await User.findByIdAndUpdate(userId, updateOperation, { new: true, runValidators: true, - }).lean()) as IUser | null; + }).lean(); } /** @@ -166,7 +166,7 @@ export function createUserMethods(mongoose: typeof import('mongoose')) { if (fieldsToSelect) { query.select(fieldsToSelect); } - return (await query.lean()) as IUser | null; + return await query.lean(); } /** @@ -233,10 +233,10 @@ export function createUserMethods(mongoose: typeof import('mongoose')) { }, }; - return (await User.findByIdAndUpdate(userId, updateOperation, { + return await User.findByIdAndUpdate(userId, updateOperation, { new: true, runValidators: true, - }).lean()) as IUser | null; + }).lean(); } /** @@ -270,14 +270,16 @@ export function createUserMethods(mongoose: typeof import('mongoose')) { query.select(fieldsToSelect); } - const users = await query.lean(); + const users = await query.lean(); // Score results by relevance const exactRegex = new RegExp(`^${searchPattern.trim()}$`, 'i'); const startsWithPattern = searchPattern.trim().toLowerCase(); const scoredUsers = users.map((user) => { - const searchableFields = [user.name, user.email, user.username].filter(Boolean); + const searchableFields = [user.name, user.email, user.username].filter( + (field): field is string => typeof field === 'string' && field.length > 0, + ); let maxScore = 0; for (const field of searchableFields) { diff --git a/packages/data-schemas/src/methods/userGroup.ts b/packages/data-schemas/src/methods/userGroup.ts index b337fb667b..5e7db57b62 100644 --- a/packages/data-schemas/src/methods/userGroup.ts +++ b/packages/data-schemas/src/methods/userGroup.ts @@ -23,7 +23,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { if (session) { query.session(session); } - return await query.lean(); + return await query.lean(); } /** @@ -45,7 +45,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { if (session) { query.session(session); } - return await query.lean(); + return await query.lean(); } /** @@ -68,7 +68,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { if (session) { query.session(session); } - return await query.lean(); + return await query.lean(); } /** @@ -99,7 +99,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { if (session) { dbQuery.session(session); } - return await dbQuery.lean(); + return await dbQuery.lean(); } /** @@ -119,7 +119,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { if (session) { userQuery.session(session); } - const user = (await userQuery.lean()) as { idOnTheSource?: string } | null; + const user = await userQuery.lean<{ idOnTheSource?: string }>(); if (!user) { return []; @@ -131,7 +131,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { if (session) { query.session(session); } - return await query.lean(); + return await query.lean(); } /** @@ -190,10 +190,10 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { const options = { new: true, ...(session ? { session } : {}) }; - const user = (await User.findById(userId, 'idOnTheSource', options).lean()) as { + const user = await User.findById(userId, 'idOnTheSource', options).lean<{ idOnTheSource?: string; _id: Types.ObjectId; - } | null; + }>(); if (!user) { throw new Error(`User not found: ${userId}`); } @@ -203,7 +203,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { groupId, { $addToSet: { memberIds: userIdOnTheSource } }, options, - ).lean(); + ).lean(); return { user: user as IUser, group: updatedGroup }; } @@ -228,10 +228,10 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { const options = { new: true, ...(session ? { session } : {}) }; - const user = (await User.findById(userId, 'idOnTheSource', options).lean()) as { + const user = await User.findById(userId, 'idOnTheSource', options).lean<{ idOnTheSource?: string; _id: Types.ObjectId; - } | null; + }>(); if (!user) { throw new Error(`User not found: ${userId}`); } @@ -241,7 +241,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { groupId, { $pullAll: { memberIds: [userIdOnTheSource] } }, options, - ).lean(); + ).lean(); return { user: user as IUser, group: updatedGroup }; } @@ -305,7 +305,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { if (session) { query.session(session); } - const user = await query.lean(); + const user = await query.lean(); userRole = user?.role; } @@ -349,7 +349,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { if (session) { query.session(session); } - const user = (await query.lean()) as { idOnTheSource?: string; _id: Types.ObjectId } | null; + const user = await query.lean<{ idOnTheSource?: string; _id: Types.ObjectId }>(); if (!user) { throw new Error(`User not found: ${userId}`); @@ -396,10 +396,12 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { if (session) { groupsQuery.session(session); } - const existingGroups = (await groupsQuery.lean()) as Array<{ - _id: Types.ObjectId; - idOnTheSource?: string; - }>; + const existingGroups = await groupsQuery.lean< + Array<{ + _id: Types.ObjectId; + idOnTheSource?: string; + }> + >(); for (const group of existingGroups) { if (group.idOnTheSource && !entraIdMap.has(group.idOnTheSource)) { @@ -414,7 +416,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { if (session) { userQuery.session(session); } - const updatedUser = await userQuery.lean(); + const updatedUser = await userQuery.lean(); if (!updatedUser) { throw new Error(`User not found after update: ${userId}`); @@ -568,7 +570,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { } promises.push( - userQuery.lean().then((users) => + userQuery.lean().then((users) => users.map((user) => { const userWithId = user as IUser & { idOnTheSource?: string }; return transformUserToTPrincipalSearchResult({ @@ -607,7 +609,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { } promises.push( - roleQuery.lean().then((roles) => + roleQuery.lean>().then((roles) => roles.map((role) => ({ /** Role name as ID */ id: role.name, @@ -650,7 +652,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { if (session) { query.session(session); } - return query.lean(); + return query.lean(); } /** @@ -665,7 +667,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { ): Promise { const Group = mongoose.models.Group as Model; const options = { new: true, ...(session ? { session } : {}) }; - return Group.findByIdAndUpdate(groupId, { $set: data }, options).lean(); + return Group.findByIdAndUpdate(groupId, { $set: data }, options).lean(); } /** @@ -722,7 +724,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { .skip(offset) .limit(limit) .session(session ?? null) - .lean(); + .lean(); } /** @@ -750,7 +752,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { ): Promise { const Group = mongoose.models.Group as Model; const options = session ? { session } : {}; - return await Group.findByIdAndDelete(groupId, options).lean(); + return await Group.findByIdAndDelete(groupId, options).lean(); } /** @@ -771,7 +773,7 @@ export function createUserGroupMethods(mongoose: typeof import('mongoose')) { groupId, { $pull: { memberIds: memberId } }, options, - ).lean(); + ).lean(); } return { diff --git a/packages/data-schemas/tsconfig.json b/packages/data-schemas/tsconfig.json index cf3f8f740f..e5790a6cf8 100644 --- a/packages/data-schemas/tsconfig.json +++ b/packages/data-schemas/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "target": "ES2019", "module": "ESNext", - "moduleResolution": "node", + "moduleResolution": "bundler", "declaration": false, "noEmit": true, "strict": true,