diff --git a/.circleci/config.yml b/.circleci/config.yml index 4cab416ca23..5466270eb49 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -165,22 +165,6 @@ jobs: name: Integration tests command: npm run test:integration - codechecks_benchmarks: - working_directory: ~/nest - docker: - - image: cimg/node:<< pipeline.parameters.maintenance-node-version >> - steps: - - checkout - - *restore-cache - - *install-deps - - *build-packages - - run: - name: Install native wrk - command: .circleci/install-wrk.sh - - run: - name: Run codechecks with benchmarks - command: yarn codechecks:benchmarks - samples: working_directory: ~/nest docker: @@ -220,6 +204,3 @@ workflows: - samples: requires: - build - - codechecks_benchmarks: - requires: - - build diff --git a/eslint.config.mjs b/eslint.config.mjs index b651263d2c8..864ec20579a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -38,6 +38,7 @@ export default tseslint.config( '@typescript-eslint/no-unused-expressions': 'off', '@typescript-eslint/no-require-imports': 'off', '@typescript-eslint/no-unused-vars': 'off', + '@typescript-eslint/no-non-null-asserted-optional-chain': 'warn', "@typescript-eslint/no-misused-promises": [ "error", { diff --git a/integration/docker-compose.yml b/integration/docker-compose.yml index 8c37aabc23a..340a5c579a2 100644 --- a/integration/docker-compose.yml +++ b/integration/docker-compose.yml @@ -51,7 +51,7 @@ services: zookeeper: container_name: test-zookeeper hostname: zookeeper - image: confluentinc/cp-zookeeper:7.9.1 + image: confluentinc/cp-zookeeper:7.9.2 ports: - "2181:2181" environment: @@ -60,7 +60,7 @@ services: kafka: container_name: test-kafka hostname: kafka - image: confluentinc/cp-kafka:7.9.1 + image: confluentinc/cp-kafka:8.0.0 depends_on: - zookeeper ports: diff --git a/integration/hello-world/e2e/fastify-middleware-before-init.spec.ts b/integration/hello-world/e2e/fastify-middleware-before-init.spec.ts new file mode 100644 index 00000000000..cf22878852e --- /dev/null +++ b/integration/hello-world/e2e/fastify-middleware-before-init.spec.ts @@ -0,0 +1,135 @@ +import { + Controller, + Get, + Injectable, + MiddlewareConsumer, + Module, + NestModule, +} from '@nestjs/common'; +import { + FastifyAdapter, + NestFastifyApplication, +} from '@nestjs/platform-fastify'; +import { Test } from '@nestjs/testing'; +import { expect } from 'chai'; + +describe('Middleware before init (FastifyAdapter)', () => { + let app: NestFastifyApplication; + + @Injectable() + class TestService { + getData(): string { + return 'test_data'; + } + } + + @Controller() + class TestController { + constructor(private readonly testService: TestService) {} + + @Get('test') + test() { + return { data: this.testService.getData() }; + } + + @Get('health') + health() { + return { status: 'ok' }; + } + } + + @Module({ + controllers: [TestController], + providers: [TestService], + }) + class TestModule implements NestModule { + configure(consumer: MiddlewareConsumer) { + consumer + .apply((req, res, next) => { + res.setHeader('x-middleware', 'applied'); + next(); + }) + .forRoutes('*'); + } + } + + describe('should queue middleware when registered before init', () => { + beforeEach(async () => { + const module = await Test.createTestingModule({ + imports: [TestModule], + }).compile(); + + app = module.createNestApplication( + new FastifyAdapter(), + ); + + // Register middleware before init - should be queued + app.use((req, res, next) => { + res.setHeader('x-global-middleware', 'applied'); + next(); + }); + + // Now init the app - queued middleware should be registered + await app.init(); + await app.getHttpAdapter().getInstance().ready(); + }); + + it('should apply queued middleware after init', () => { + return app + .inject({ + method: 'GET', + url: '/test', + }) + .then(({ statusCode, payload, headers }) => { + expect(statusCode).to.equal(200); + expect(JSON.parse(payload)).to.deep.equal({ data: 'test_data' }); + // Verify both module-level and global middleware were applied + expect(headers['x-middleware']).to.equal('applied'); + expect(headers['x-global-middleware']).to.equal('applied'); + }); + }); + + afterEach(async () => { + await app.close(); + }); + }); + + describe('should work when app is initialized before middleware registration', () => { + beforeEach(async () => { + const module = await Test.createTestingModule({ + imports: [TestModule], + }).compile(); + + app = module.createNestApplication( + new FastifyAdapter(), + ); + + // Initialize app first + await app.init(); + + // Now middleware registration should work + app.use((req, res, next) => { + res.setHeader('x-global-middleware', 'applied'); + next(); + }); + + await app.getHttpAdapter().getInstance().ready(); + }); + + it('should register middleware successfully after init', () => { + return app + .inject({ + method: 'GET', + url: '/test', + }) + .then(({ statusCode, payload }) => { + expect(statusCode).to.equal(200); + expect(JSON.parse(payload)).to.deep.equal({ data: 'test_data' }); + }); + }); + + afterEach(async () => { + await app.close(); + }); + }); +}); diff --git a/integration/injector/e2e/many-global-modules.spec.ts b/integration/injector/e2e/many-global-modules.spec.ts new file mode 100644 index 00000000000..887d60d4e8c --- /dev/null +++ b/integration/injector/e2e/many-global-modules.spec.ts @@ -0,0 +1,130 @@ +import { Test } from '@nestjs/testing'; +import { expect } from 'chai'; +import * as sinon from 'sinon'; +import { Global, Inject, Injectable, Module, Scope } from '@nestjs/common'; + +@Global() +@Module({}) +export class GlobalModule1 {} + +@Global() +@Module({}) +export class GlobalModule2 {} + +@Global() +@Module({}) +export class GlobalModule3 {} + +@Global() +@Module({}) +export class GlobalModule4 {} + +@Global() +@Module({}) +export class GlobalModule5 {} + +@Global() +@Module({}) +export class GlobalModule6 {} + +@Global() +@Module({}) +export class GlobalModule7 {} + +@Global() +@Module({}) +export class GlobalModule8 {} + +@Global() +@Module({}) +export class GlobalModule9 {} + +@Global() +@Module({}) +export class GlobalModule10 {} + +@Injectable() +class TransientProvider {} + +@Injectable() +class RequestProvider {} + +@Injectable() +export class Dependant { + constructor( + private readonly transientProvider: TransientProvider, + + @Inject(RequestProvider) + private readonly requestProvider: RequestProvider, + ) {} + + public checkDependencies() { + expect(this.transientProvider).to.be.instanceOf(TransientProvider); + expect(this.requestProvider).to.be.instanceOf(RequestProvider); + } +} + +@Global() +@Module({ + providers: [ + { + provide: TransientProvider, + scope: Scope.TRANSIENT, + useClass: TransientProvider, + }, + { + provide: Dependant, + scope: Scope.DEFAULT, + useClass: Dependant, + }, + ], +}) +export class GlobalModuleWithTransientProviderAndDependant {} + +@Global() +@Module({ + providers: [ + { + provide: RequestProvider, + scope: Scope.REQUEST, + useFactory: () => { + return new RequestProvider(); + }, + }, + ], + exports: [RequestProvider], +}) +export class GlobalModuleWithRequestProvider {} + +@Module({ + imports: [ + GlobalModule1, + GlobalModule2, + GlobalModule3, + GlobalModule4, + GlobalModule5, + GlobalModule6, + GlobalModule7, + GlobalModule8, + GlobalModule9, + GlobalModule10, + GlobalModuleWithTransientProviderAndDependant, + GlobalModuleWithRequestProvider, + ], +}) +export class AppModule {} + +describe('Many global modules', () => { + it('should inject request-scoped useFactory provider and transient-scoped useClass provider from different modules', async () => { + const moduleBuilder = Test.createTestingModule({ + imports: [AppModule], + }); + const moduleRef = await moduleBuilder.compile(); + + const dependant = await moduleRef.resolve(Dependant); + const checkDependenciesSpy = sinon.spy(dependant, 'checkDependencies'); + dependant.checkDependencies(); + + expect(checkDependenciesSpy.called).to.be.true; + }); +}); diff --git a/integration/inspector/e2e/fixtures/post-init-graph.json b/integration/inspector/e2e/fixtures/post-init-graph.json index be476d57e32..14739d76a7c 100644 --- a/integration/inspector/e2e/fixtures/post-init-graph.json +++ b/integration/inspector/e2e/fixtures/post-init-graph.json @@ -2197,22 +2197,6 @@ }, "id": "1976848738" }, - "-2105726668": { - "source": "-1803759743", - "target": "1010833816", - "metadata": { - "type": "class-to-class", - "sourceModuleName": "PropertiesModule", - "sourceClassName": "PropertiesService", - "targetClassName": "token", - "sourceClassToken": "PropertiesService", - "targetClassToken": "token", - "targetModuleName": "PropertiesModule", - "keyOrIndex": "token", - "injectionType": "property" - }, - "id": "-2105726668" - }, "-21463590": { "source": "-1378706112", "target": "1004276345", @@ -2229,6 +2213,22 @@ }, "id": "-21463590" }, + "-2105726668": { + "source": "-1803759743", + "target": "1010833816", + "metadata": { + "type": "class-to-class", + "sourceModuleName": "PropertiesModule", + "sourceClassName": "PropertiesService", + "targetClassName": "token", + "sourceClassToken": "PropertiesService", + "targetClassToken": "token", + "targetModuleName": "PropertiesModule", + "keyOrIndex": "token", + "injectionType": "property" + }, + "id": "-2105726668" + }, "-1657371464": { "source": "-1673986099", "target": "1919157847", diff --git a/lerna.json b/lerna.json index 1bc39a67ef7..af54c3e38d0 100644 --- a/lerna.json +++ b/lerna.json @@ -3,5 +3,5 @@ "packages": [ "packages/*" ], - "version": "11.1.3" + "version": "11.1.4" } diff --git a/package-lock.json b/package-lock.json index fe1ce4deae7..b70ff03f1c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "@commitlint/cli": "19.8.1", "@commitlint/config-angular": "19.8.1", "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@fastify/cors": "11.0.1", "@fastify/formbody": "8.0.2", "@fastify/middie": "9.0.3", @@ -53,13 +53,13 @@ "@types/bytes": "3.1.5", "@types/chai": "4.3.20", "@types/chai-as-promised": "7.1.8", - "@types/cors": "2.8.18", + "@types/cors": "2.8.19", "@types/eslint__js": "8.42.3", - "@types/express": "5.0.2", + "@types/express": "5.0.3", "@types/gulp": "4.0.17", - "@types/http-errors": "2.0.4", + "@types/http-errors": "2.0.5", "@types/mocha": "10.0.10", - "@types/node": "22.15.30", + "@types/node": "24.0.14", "@types/sinon": "17.0.4", "@types/supertest": "6.0.3", "@types/ws": "8.18.1", @@ -68,25 +68,25 @@ "artillery": "2.0.23", "body-parser": "2.2.0", "bytes": "3.1.2", - "cache-manager": "6.4.3", + "cache-manager": "7.0.1", "cache-manager-redis-store": "3.0.1", "chai": "4.5.0", "chai-as-promised": "7.1.2", "clang-format": "1.8.0", - "concurrently": "9.1.2", - "conventional-changelog": "7.0.2", - "core-js": "3.42.0", + "concurrently": "9.2.0", + "conventional-changelog": "7.1.1", + "core-js": "3.44.0", "coveralls": "3.1.1", "delete-empty": "3.0.0", "engine.io-client": "6.6.3", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-import": "2.31.0", - "eslint-plugin-prettier": "5.4.1", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-prettier": "5.5.1", "eventsource": "4.0.0", "fancy-log": "2.0.0", - "fastify": "5.3.3", - "globals": "16.2.0", + "fastify": "5.4.0", + "globals": "16.3.0", "graphql": "16.11.0", "graphql-subscriptions": "3.0.0", "graphql-tools": "9.0.18", @@ -105,31 +105,31 @@ "lerna": "2.11.0", "lerna-changelog": "2.2.0", "light-my-request": "6.6.0", - "lint-staged": "16.1.0", + "lint-staged": "16.1.2", "markdown-table": "2.0.0", - "mocha": "11.5.0", - "mongoose": "8.15.1", - "mqtt": "5.13.1", + "mocha": "11.7.1", + "mongoose": "8.16.3", + "mqtt": "5.13.2", "multer": "2.0.1", - "mysql2": "3.14.1", + "mysql2": "3.14.2", "nats": "2.29.3", "nodemon": "3.1.10", "nyc": "14.1.1", - "prettier": "3.5.3", - "redis": "5.5.5", + "prettier": "3.6.2", + "redis": "5.6.0", "rxjs-compat": "6.6.7", - "sinon": "20.0.0", + "sinon": "21.0.0", "sinon-chai": "3.7.0", "socket.io-client": "4.8.1", "subscriptions-transport-ws": "0.11.0", - "supertest": "7.1.1", - "ts-morph": "25.0.1", + "supertest": "7.1.3", + "ts-morph": "26.0.0", "ts-node": "10.9.2", - "typeorm": "0.3.24", - "typescript": "5.7.3", - "typescript-eslint": "8.33.1", + "typeorm": "0.3.25", + "typescript": "5.8.3", + "typescript-eslint": "8.37.0", "wrk": "1.2.1", - "ws": "8.18.2" + "ws": "8.18.3" }, "engines": { "node": ">= 20" @@ -4652,12 +4652,14 @@ } }, "node_modules/@conventional-changelog/git-client": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.2.0.tgz", - "integrity": "sha512-pi7zipe40jaf0GBmC0COO7jh1m1U2ZZ0LRbt19ydVleZ5pfwy3yGb+Tl40irqJz69+UqmE9+ZjaJc7j46Jhqng==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.5.1.tgz", + "integrity": "sha512-lAw7iA5oTPWOLjiweb7DlGEMDEvzqzLLa6aWOly2FSZ64IwLE8T458rC+o+WvI31Doz6joM7X2DoNog7mX8r4A==", "dev": true, "license": "MIT", "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.1.0", "semver": "^7.5.2" }, "engines": { @@ -4755,11 +4757,10 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", @@ -4770,9 +4771,9 @@ } }, "node_modules/@eslint/config-array/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "dependencies": { "ms": "^2.1.3" @@ -4793,11 +4794,10 @@ "dev": true }, "node_modules/@eslint/config-helpers": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.1.tgz", - "integrity": "sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", + "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -4953,9 +4953,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", - "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", + "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", "dev": true, "license": "MIT", "engines": { @@ -4970,7 +4970,6 @@ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -6022,6 +6021,29 @@ "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", "dev": true }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -6338,9 +6360,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz", + "integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==", "dev": true, "license": "MIT", "peer": true, @@ -6350,9 +6372,9 @@ } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "dev": true, "license": "MIT", "peer": true, @@ -6418,7 +6440,6 @@ "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.0.3.tgz", "integrity": "sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==", "dev": true, - "license": "MIT", "dependencies": { "buffer": "^6.0.3" } @@ -6442,7 +6463,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -6510,14 +6530,16 @@ } }, "node_modules/@nestjs/common": { - "version": "11.0.16", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.0.16.tgz", - "integrity": "sha512-agvuQ8su4aZ+PVxAmY89odG1eR97HEQvxPmTMdDqyvDWzNerl7WQhUEd+j4/UyNWcF1or1UVcrtPj52x+eUSsA==", + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.3.tgz", + "integrity": "sha512-ogEK+GriWodIwCw6buQ1rpcH4Kx+G7YQ9EwuPySI3rS05pSdtQ++UhucjusSI9apNidv+QURBztJkRecwwJQXg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { + "file-type": "21.0.0", "iterare": "1.2.1", + "load-esm": "1.0.2", "tslib": "2.8.1", "uid": "2.0.2" }, @@ -6526,9 +6548,8 @@ "url": "https://opencollective.com/nest" }, "peerDependencies": { - "class-transformer": "*", - "class-validator": "*", - "file-type": "^20.4.1", + "class-transformer": ">=0.4.1", + "class-validator": ">=0.13.2", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, @@ -6542,9 +6563,9 @@ } }, "node_modules/@nestjs/core": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.0.3.tgz", - "integrity": "sha512-6UoVHpwa23HJxMNtuTXQCiqx/NHTG3lRBRgnZ8EDHTjgaNnR7P+xBS68zN3gLH7rBIrhhQ5Q1hVs7WswRxrw7Q==", + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-11.1.3.tgz", + "integrity": "sha512-5lTni0TCh8x7bXETRD57pQFnKnEg1T6M+VLE7wAmyQRIecKQU+2inRGZD+A4v2DC1I04eA0WffP0GKLxjOKlzw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -8541,22 +8562,22 @@ "dev": true }, "node_modules/@redis/bloom": { - "version": "5.5.5", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.5.5.tgz", - "integrity": "sha512-M0GDmw8k0EOFoSpmMjhFUADk/apoano97fLSpT81opgmkkDtBB9iB6l6husxnzK5t2qNz/o0+OCVG9g6lEEwKw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.6.0.tgz", + "integrity": "sha512-l13/d6BaZDJzogzZJEphIeZ8J0hpQpjkMiozomTm6nJiMNYkoPsNOBOOQua4QsG0fFjyPmLMDJFPAp5FBQtTXg==", "dev": true, "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.5.5" + "@redis/client": "^5.6.0" } }, "node_modules/@redis/client": { - "version": "5.5.5", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.5.5.tgz", - "integrity": "sha512-1Dv/CVdMNLw0mlROSnmpp4MQu+6YIJX0YR0h3g2hnPdLvk6L7TcRcrUj7BQFGSeZD2MxklAUO+rp09ITUqE5Og==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.6.0.tgz", + "integrity": "sha512-wmP9kCFElCSr4MM4+1E4VckDuN4wLtiXSM/J0rKVQppajxQhowci89RGZr2OdLualowb8SRJ/R6OjsXrn9ZNFA==", "dev": true, "license": "MIT", "dependencies": { @@ -8567,42 +8588,42 @@ } }, "node_modules/@redis/json": { - "version": "5.5.5", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.5.5.tgz", - "integrity": "sha512-Nq8wHjOhwuhD05YPWFPL9RyT3K1VdT37TKvqbhykZA2MWQgjjhLn5i1/6zZ+1b0Zc/Sr9E0eK9J8txk6YJR6EA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.6.0.tgz", + "integrity": "sha512-YQN9ZqaSDpdLfJqwzcF4WeuJMGru/h4WsV7GeeNtXsSeyQjHTyDxrd48xXfRRJGv7HitA7zGnzdHplNeKOgrZA==", "dev": true, "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.5.5" + "@redis/client": "^5.6.0" } }, "node_modules/@redis/search": { - "version": "5.5.5", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.5.5.tgz", - "integrity": "sha512-xM/DKrRhbsMS2QQF5bBPjR7P/QEjWWZDUr92r+UOwkZjvc/kmy0tp7h8zkxBo2jtSF99vkk2mwMzn6fQ8d60aQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.6.0.tgz", + "integrity": "sha512-sLgQl92EyMVNHtri5K8Q0j2xt9c0cO9HYurXz667Un4xeUYR+B/Dw5lLG35yqO7VvVxb9amHJo9sAWumkKZYwA==", "dev": true, "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.5.5" + "@redis/client": "^5.6.0" } }, "node_modules/@redis/time-series": { - "version": "5.5.5", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.5.5.tgz", - "integrity": "sha512-2ifwV75Fv/uVX4n0zqvgqIlIInHZtVj+afjcbXPBD2GhG2AeVfkitTz1bMnGnNDA78sWRYooK42OWH9yqujjyQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.6.0.tgz", + "integrity": "sha512-tXABmN1vu4aTNL3WI4Iolpvx/5jgil2Bs31ozvKblT+jkUoRkk8ykmYo9Pv/Mp7Gk6/Qkr/2rMgVminrt/4BBQ==", "dev": true, "license": "MIT", "engines": { "node": ">= 18" }, "peerDependencies": { - "@redis/client": "^5.5.5" + "@redis/client": "^5.6.0" } }, "node_modules/@rtsao/scc": { @@ -8712,6 +8733,73 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/@simple-libs/child-process-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.0.tgz", + "integrity": "sha512-yUjZwZS8An/un6iyC0/HJMbWyEvp8y3RSW5DnxgfVXdDs9OLdulWMPs2EQLZkulsxCm3JohkB3JbyVsfeondkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.0.0", + "@types/node": "^22.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/child-process-utils/node_modules/@types/node": { + "version": "22.15.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.32.tgz", + "integrity": "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@simple-libs/child-process-utils/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@simple-libs/stream-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.1.0.tgz", + "integrity": "sha512-6rsHTjodIn/t90lv5snQjRPVtOosM7Vp0AKdrObymq45ojlgVwnpAqdc+0OBBrpEiy31zZ6/TKeIVqV1HwvnuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^22.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/stream-utils/node_modules/@types/node": { + "version": "22.15.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.32.tgz", + "integrity": "sha512-3jigKqgSjsH6gYZv2nEsqdXfZqIFGAV36XYYjf9KGZ3PSG+IhLecqPnI310RvjutyMwifE2hhhNEklOUrvx/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@simple-libs/stream-utils/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -10732,38 +10820,28 @@ } }, "node_modules/@ts-morph/common": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.26.0.tgz", - "integrity": "sha512-/RmKAtctStXqM5nECMQ46duT74Hoig/DBzhWXGHcodlDNrgRbsbwwHqSKFNbca6z9Xt/CUWMeXOsC9QEN1+rqw==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.27.0.tgz", + "integrity": "sha512-Wf29UqxWDpc+i61k3oIOzcUfQt79PIT9y/MWfAGlrkjg6lBC1hwDECLXPVJAhWjiGbfBCxZd65F/LIZF3+jeJQ==", "dev": true, "license": "MIT", "dependencies": { - "fast-glob": "^3.3.2", - "minimatch": "^9.0.4", + "fast-glob": "^3.3.3", + "minimatch": "^10.0.1", "path-browserify": "^1.0.1" } }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@isaacs/brace-expansion": "^5.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -10902,7 +10980,8 @@ "version": "4.3.20", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/chai-as-promised": { "version": "7.1.8", @@ -10944,9 +11023,9 @@ "dev": true }, "node_modules/@types/cors": { - "version": "2.8.18", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.18.tgz", - "integrity": "sha512-nX3d0sxJW41CqQvfOzVG1NCTXfFDrDWIghCZncpHeWlVFd81zxB/DLhg7avFg6eHLCRX7ckBmoIIcqa++upvJA==", + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", "license": "MIT", "dependencies": { "@types/node": "*" @@ -10986,9 +11065,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -10999,9 +11078,9 @@ "dev": true }, "node_modules/@types/express": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.2.tgz", - "integrity": "sha512-BtjL3ZwbCQriyb0DGw+Rt12qAXPiBTPs815lsUvtt1Grk0vLRMZNMUZ741d5rjk+UQOxfDiBZ3dxpX00vSkK3g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", + "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", "dev": true, "license": "MIT", "dependencies": { @@ -11102,10 +11181,11 @@ "license": "MIT" }, "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", @@ -11162,12 +11242,12 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.15.30", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.30.tgz", - "integrity": "sha512-6Q7lr06bEHdlfplU6YRbgG1SFBdlsfNC4/lX+SkhiTs0cpJkOElmWls8PxDFv4yY/xKb8Y6SO0OmSX4wgqTZbA==", + "version": "24.0.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz", + "integrity": "sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "undici-types": "~7.8.0" } }, "node_modules/@types/node-fetch": { @@ -11371,17 +11451,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.33.1.tgz", - "integrity": "sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.37.0.tgz", + "integrity": "sha512-jsuVWeIkb6ggzB+wPCsR4e6loj+rM72ohW6IBn2C+5NCvfUVY8s33iFPySSVXqtm5Hu29Ne/9bnA0JmyLmgenA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.33.1", - "@typescript-eslint/type-utils": "8.33.1", - "@typescript-eslint/utils": "8.33.1", - "@typescript-eslint/visitor-keys": "8.33.1", + "@typescript-eslint/scope-manager": "8.37.0", + "@typescript-eslint/type-utils": "8.37.0", + "@typescript-eslint/utils": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -11395,7 +11475,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.33.1", + "@typescript-eslint/parser": "^8.37.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } @@ -11411,16 +11491,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.33.1.tgz", - "integrity": "sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.37.0.tgz", + "integrity": "sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.33.1", - "@typescript-eslint/types": "8.33.1", - "@typescript-eslint/typescript-estree": "8.33.1", - "@typescript-eslint/visitor-keys": "8.33.1", + "@typescript-eslint/scope-manager": "8.37.0", + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0", "debug": "^4.3.4" }, "engines": { @@ -11461,14 +11541,14 @@ "license": "MIT" }, "node_modules/@typescript-eslint/project-service": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.33.1.tgz", - "integrity": "sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.37.0.tgz", + "integrity": "sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.33.1", - "@typescript-eslint/types": "^8.33.1", + "@typescript-eslint/tsconfig-utils": "^8.37.0", + "@typescript-eslint/types": "^8.37.0", "debug": "^4.3.4" }, "engines": { @@ -11508,14 +11588,14 @@ "license": "MIT" }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.33.1.tgz", - "integrity": "sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.37.0.tgz", + "integrity": "sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.33.1", - "@typescript-eslint/visitor-keys": "8.33.1" + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -11526,9 +11606,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.33.1.tgz", - "integrity": "sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.37.0.tgz", + "integrity": "sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==", "dev": true, "license": "MIT", "engines": { @@ -11543,14 +11623,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.33.1.tgz", - "integrity": "sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.37.0.tgz", + "integrity": "sha512-SPkXWIkVZxhgwSwVq9rqj/4VFo7MnWwVaRNznfQDc/xPYHjXnPfLWn+4L6FF1cAz6e7dsqBeMawgl7QjUMj4Ow==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.33.1", - "@typescript-eslint/utils": "8.33.1", + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0", + "@typescript-eslint/utils": "8.37.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -11592,9 +11673,9 @@ "license": "MIT" }, "node_modules/@typescript-eslint/types": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.33.1.tgz", - "integrity": "sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.37.0.tgz", + "integrity": "sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==", "dev": true, "license": "MIT", "engines": { @@ -11606,16 +11687,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.33.1.tgz", - "integrity": "sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.37.0.tgz", + "integrity": "sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.33.1", - "@typescript-eslint/tsconfig-utils": "8.33.1", - "@typescript-eslint/types": "8.33.1", - "@typescript-eslint/visitor-keys": "8.33.1", + "@typescript-eslint/project-service": "8.37.0", + "@typescript-eslint/tsconfig-utils": "8.37.0", + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/visitor-keys": "8.37.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -11635,9 +11716,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { @@ -11699,16 +11780,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.33.1.tgz", - "integrity": "sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.37.0.tgz", + "integrity": "sha512-TSFvkIW6gGjN2p6zbXo20FzCABbyUAuq6tBvNRGsKdsSQ6a7rnV6ADfZ7f4iI3lIiXc4F4WWvtUfDw9CJ9pO5A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.33.1", - "@typescript-eslint/types": "8.33.1", - "@typescript-eslint/typescript-estree": "8.33.1" + "@typescript-eslint/scope-manager": "8.37.0", + "@typescript-eslint/types": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -11723,14 +11804,14 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.33.1.tgz", - "integrity": "sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.37.0.tgz", + "integrity": "sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.33.1", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.37.0", + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -12038,10 +12119,11 @@ } }, "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -12049,6 +12131,20 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -12602,13 +12698,14 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" @@ -12659,17 +12756,20 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -12716,17 +12816,19 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -12736,15 +12838,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12754,15 +12857,16 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12772,19 +12876,19 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" @@ -13479,6 +13583,7 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -13538,6 +13643,16 @@ } ] }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/async-hook-domain": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-4.0.1.tgz", @@ -14140,9 +14255,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "dev": true, "funding": [ { @@ -14161,10 +14276,10 @@ "license": "MIT", "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -14174,9 +14289,9 @@ } }, "node_modules/bson": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.3.tgz", - "integrity": "sha512-MTxGsqgYTwfshYWTRdmZRC+M7FnG1b4y7RO7p2k3X24Wq0yv1m77Wsj0BzlPzd/IowgESfsruQCUToa7vbOpPQ==", + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-6.10.4.tgz", + "integrity": "sha512-WIsKqkSC0ABoBJuT1LEX+2HEvNmNKKgnTAyd0fL8qzK4SH2i9NXg+t08YtdZp/V9IZ33cxe3iV4yM0qg8lMQng==", "dev": true, "license": "Apache-2.0", "engines": { @@ -14489,13 +14604,12 @@ } }, "node_modules/cache-manager": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-6.4.3.tgz", - "integrity": "sha512-VV5eq/QQ5rIVix7/aICO4JyvSeEv9eIQuKL5iFwgM2BrcYoE0A/D1mNsAHJAsB0WEbNdBlKkn6Tjz6fKzh/cKQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-7.0.1.tgz", + "integrity": "sha512-Hd7FOyTtwhwLgkKeKQWEw6Ixj63VKuUWYwkGgL6g6Q7eISW6uxci5+DtUXlqI0gtbLCPPdhL1+HP9Zht27DbrA==", "dev": true, - "license": "MIT", "dependencies": { - "keyv": "^5.3.3" + "keyv": "^5.3.4" } }, "node_modules/cache-manager-redis-store": { @@ -14594,11 +14708,10 @@ } }, "node_modules/cache-manager/node_modules/keyv": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.3.tgz", - "integrity": "sha512-Rwu4+nXI9fqcxiEHtbkvoes2X+QfkTRo1TMkPfwzipGsJlJO/z69vqB4FNl9xJ3xCpAcbkvmEabZfPzrwN3+gQ==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.3.4.tgz", + "integrity": "sha512-ypEvQvInNpUe+u+w8BIcPkQvEqXquyyibWE/1NB5T2BTzIpS5cGEV1LZskDzPSTvNAaT4+5FutvzlvnkxOSKlw==", "dev": true, - "license": "MIT", "dependencies": { "@keyv/serialize": "^1.0.3" } @@ -14686,16 +14799,16 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -14775,9 +14888,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001695", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", - "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "version": "1.0.30001727", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz", + "integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==", "dev": true, "funding": [ { @@ -14832,6 +14945,7 @@ "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -15763,10 +15877,11 @@ } }, "node_modules/concurrently": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.2.tgz", - "integrity": "sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz", + "integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "lodash": "^4.17.21", @@ -15829,18 +15944,18 @@ } }, "node_modules/conventional-changelog": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-7.0.2.tgz", - "integrity": "sha512-dz38xbKg2Nzd2zoPY1PXPq7skbN1tdx402OkcirIE44LetmoWODmt4h/6AwtQb6+ZHjbmMfW6Jxt4dyGt5P8cw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-7.1.1.tgz", + "integrity": "sha512-rlqa8Lgh8YzT3Akruk05DR79j5gN9NCglHtJZwpi6vxVeaoagz+84UAtKQj/sT+RsfGaZkt3cdFCjcN6yjr5sw==", "dev": true, "license": "MIT", "dependencies": { - "@conventional-changelog/git-client": "^2.2.0", + "@conventional-changelog/git-client": "^2.5.1", "@types/normalize-package-data": "^2.4.4", "conventional-changelog-preset-loader": "^5.0.0", - "conventional-changelog-writer": "^8.1.0", - "conventional-commits-parser": "^6.1.0", - "fd-package-json": "^1.2.0", + "conventional-changelog-writer": "^8.2.0", + "conventional-commits-parser": "^6.2.0", + "fd-package-json": "^2.0.0", "meow": "^13.0.0", "normalize-package-data": "^7.0.0" }, @@ -16419,9 +16534,9 @@ } }, "node_modules/conventional-changelog-writer": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.1.0.tgz", - "integrity": "sha512-dpC440QnORNCO81XYuRRFOLCsjKj4W7tMkUIn3lR6F/FAaJcWLi7iCj6IcEvSQY2zw6VUgwUKd5DEHKEWrpmEQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.2.0.tgz", + "integrity": "sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw==", "dev": true, "license": "MIT", "dependencies": { @@ -16535,9 +16650,9 @@ } }, "node_modules/conventional-commits-parser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.1.0.tgz", - "integrity": "sha512-5nxDo7TwKB5InYBl4ZC//1g9GRwB/F3TXOGR9hgUjMGfvSP4Vu5NkpNro2+1+TIEy1vwxApl5ircECr2ri5JIw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.0.tgz", + "integrity": "sha512-uLnoLeIW4XaoFtH37qEcg/SXMJmKF4vi7V0H2rnPueg+VEtFGA/asSCNTcq4M/GQ6QmlzchAEtOoDTtKqWeHag==", "dev": true, "license": "MIT", "dependencies": { @@ -17185,9 +17300,9 @@ } }, "node_modules/core-js": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.42.0.tgz", - "integrity": "sha512-Sz4PP4ZA+Rq4II21qkNqOEDTDrCvcANId3xpIgB34NDkWc3UduWj2dqEtN9yZIq8Dk3HyPI33x9sqqU5C8sr0g==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.44.0.tgz", + "integrity": "sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -17535,14 +17650,15 @@ } }, "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -17552,29 +17668,31 @@ } }, "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" + "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, @@ -17726,6 +17844,7 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dev": true, + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -18503,9 +18622,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.84", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", - "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", + "version": "1.5.185", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.185.tgz", + "integrity": "sha512-dYOZfUk57hSMPePoIQ1fZWl1Fkj+OshhEVuPacNKWzC1efe56OsHY3l/jCfiAgIICOU3VgOIdoq7ahg7r7n6MQ==", "dev": true, "license": "ISC", "peer": true @@ -18722,10 +18841,11 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -18791,57 +18911,66 @@ } }, "node_modules/es-abstract": { - "version": "1.23.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", - "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", "dev": true, + "license": "MIT", "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", + "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.3", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" }, "engines": { "node": ">= 0.4" @@ -18868,9 +18997,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", "dev": true, "license": "MIT", "peer": true @@ -18904,23 +19033,28 @@ } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, + "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" @@ -19044,19 +19178,19 @@ } }, "node_modules/eslint": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", - "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", + "version": "9.31.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", + "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.14.0", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.0", + "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", @@ -19068,9 +19202,9 @@ "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -19147,10 +19281,11 @@ "dev": true }, "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -19168,6 +19303,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } @@ -19176,32 +19312,34 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, + "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { @@ -19272,11 +19410,10 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.4.1.tgz", - "integrity": "sha512-9dF+KuU/Ilkq27A8idRP7N2DH8iUR6qXcjF3FR2wETY21PZdBrIjwCau8oboyGj9b7etWmTGEeM8e7oOed6ZWg==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.1.tgz", + "integrity": "sha512-dobTkHT6XaEVOo8IO90Q4DOSxnm3Y151QxPJlM/vKC0bVy+d6cVWQZLlFiuZPP0wS6vZwSKeJgKkcS+KfMBlRw==", "dev": true, - "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" @@ -19303,9 +19440,9 @@ } }, "node_modules/eslint-scope": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", - "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -19320,10 +19457,11 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -19331,6 +19469,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/@eslint/core": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", + "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -19395,15 +19546,15 @@ } }, "node_modules/eslint/node_modules/espree": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", - "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.14.0", + "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.0" + "eslint-visitor-keys": "^4.2.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -20321,9 +20472,9 @@ } }, "node_modules/fastify": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.3.3.tgz", - "integrity": "sha512-nCBiBCw9q6jPx+JJNVgO8JVnTXeUyrGcyTKPQikRkA/PanrFcOIo4R+ZnLeOLPZPGgzjomqfVarzE0kYx7qWiQ==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-5.4.0.tgz", + "integrity": "sha512-I4dVlUe+WNQAhKSyv15w+dwUh2EPiEl4X2lGYMmNSgF83WzTMAPKGdWEv5tPsCQOb+SOZwz8Vlta2vF+OeDgRw==", "dev": true, "funding": [ { @@ -20417,13 +20568,23 @@ } }, "node_modules/fd-package-json": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-1.2.0.tgz", - "integrity": "sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-2.0.0.tgz", + "integrity": "sha512-jKmm9YtsNXN789RS/0mSzOC1NUq9mkVd65vbSSVsKdjGvYXBuE4oWe2QOEoFeRmJg+lPuZxpmrfFclNhoRMneQ==", "dev": true, "license": "MIT", "dependencies": { - "walk-up-path": "^3.0.1" + "walk-up-path": "^4.0.0" + } + }, + "node_modules/fd-package-json/node_modules/walk-up-path": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-4.0.0.tgz", + "integrity": "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" } }, "node_modules/fflate": { @@ -20869,12 +21030,19 @@ } }, "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", "dev": true, + "license": "MIT", "dependencies": { - "is-callable": "^1.1.3" + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/for-in": { @@ -21165,15 +21333,18 @@ "license": "ISC" }, "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -21187,6 +21358,7 @@ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -21536,14 +21708,15 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -21852,9 +22025,9 @@ "license": "ISC" }, "node_modules/globals": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", - "integrity": "sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==", + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.3.0.tgz", + "integrity": "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==", "dev": true, "license": "MIT", "engines": { @@ -22095,21 +22268,6 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/graphql-ws": { - "version": "5.16.2", - "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-5.16.2.tgz", - "integrity": "sha512-E1uccsZxt/96jH/OwmLPuXMACILs76pKF2i3W861LpKBCYtGIyPQGtWLuBLkND4ox1KHns70e83PS4te50nvPQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "graphql": ">=0.11 <=16" - } - }, "node_modules/gulp": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.1.tgz", @@ -23965,10 +24123,14 @@ } }, "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -24016,10 +24178,14 @@ } }, "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -25050,14 +25216,15 @@ } }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" + "hasown": "^2.0.2", + "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -25214,13 +25381,15 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" @@ -25235,13 +25404,37 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -25260,13 +25453,14 @@ } }, "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -25323,10 +25517,11 @@ } }, "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, @@ -25350,11 +25545,14 @@ } }, "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, + "license": "MIT", "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { @@ -25365,12 +25563,14 @@ } }, "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -25461,6 +25661,22 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-finite": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", @@ -25534,6 +25750,19 @@ "tslib": "^2.0.3" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -25565,12 +25794,14 @@ } }, "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -25646,13 +25877,16 @@ } }, "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -25697,13 +25931,27 @@ "node": ">=0.10.0" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7" + "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -25722,12 +25970,14 @@ } }, "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -25743,12 +25993,15 @@ "dev": true }, "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -25771,12 +26024,13 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -25858,13 +26112,47 @@ "node": ">=0.10.0" } }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -27842,9 +28130,9 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.0.tgz", - "integrity": "sha512-HkpQh69XHxgCjObjejBT3s2ILwNjFx8M3nw+tJ/ssBauDlIpkx2RpqWSi1fBgkXLSSXnbR3iEq1NkVtpvV+FLQ==", + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.2.tgz", + "integrity": "sha512-sQKw2Si2g9KUZNY3XNvRuDq4UJqpHwF0/FQzZR2M7I5MvtpWvibikCjUVJzZdGE0ByurEl3KQNvsGetd1ty1/Q==", "dev": true, "license": "MIT", "dependencies": { @@ -28774,6 +29062,7 @@ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dev": true, + "license": "MIT", "dependencies": { "get-func-name": "^2.0.1" } @@ -29508,11 +29797,10 @@ } }, "node_modules/mocha": { - "version": "11.5.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.5.0.tgz", - "integrity": "sha512-VKDjhy6LMTKm0WgNEdlY77YVsD49LZnPSXJAaPNL9NRYQADxvORsyG1DIQY6v53BKTnlNbEE2MbVCDbnxr4K3w==", + "version": "11.7.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.1.tgz", + "integrity": "sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A==", "dev": true, - "license": "MIT", "dependencies": { "browser-stdout": "^1.3.1", "chokidar": "^4.0.1", @@ -29530,7 +29818,7 @@ "serialize-javascript": "^6.0.2", "strip-json-comments": "^3.1.1", "supports-color": "^8.1.1", - "workerpool": "^6.5.1", + "workerpool": "^9.2.0", "yargs": "^17.7.2", "yargs-parser": "^21.1.1", "yargs-unparser": "^2.0.0" @@ -29854,14 +30142,14 @@ } }, "node_modules/mongodb": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.16.0.tgz", - "integrity": "sha512-D1PNcdT0y4Grhou5Zi/qgipZOYeWrhLEpk33n3nm6LGtz61jvO88WlrWCK/bigMjpnOdAUKKQwsGIl0NtWMyYw==", + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.17.0.tgz", + "integrity": "sha512-neerUzg/8U26cgruLysKEjJvoNSXhyID3RvzvdcpsIi2COYM3FS3o9nlH7fxFtefTb942dX3W9i37oPfCVj4wA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@mongodb-js/saslprep": "^1.1.9", - "bson": "^6.10.3", + "bson": "^6.10.4", "mongodb-connection-string-url": "^3.0.0" }, "engines": { @@ -29949,15 +30237,15 @@ } }, "node_modules/mongoose": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.15.1.tgz", - "integrity": "sha512-RhQ4DzmBi5BNGcS0w4u1vdMRIKcteXTCNzDt1j7XRcdWYBz1MjMjulBhPaeC5jBCHOD1yinuOFTTSOWLLGexWw==", + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.16.3.tgz", + "integrity": "sha512-p2JOsRQG7j0vXhLpsWw5Slm2VnDeJK8sRyqSyegk5jQujuP9BTOZ1Di9VX/0lYfBhZ2DpAExi51QTd4pIqSgig==", "dev": true, "license": "MIT", "dependencies": { - "bson": "^6.10.3", + "bson": "^6.10.4", "kareem": "2.6.3", - "mongodb": "~6.16.0", + "mongodb": "~6.17.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", @@ -29988,12 +30276,14 @@ } }, "node_modules/mqtt": { - "version": "5.13.1", - "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.13.1.tgz", - "integrity": "sha512-g+4G+ma0UeL3Pgu1y1si2NHb4VLIEUCtF789WrG99lLG0XZyoab2EJoy58YgGSg/1yFdthDBH0+4llsZZD/vug==", + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.13.2.tgz", + "integrity": "sha512-21E15qjFMNEddowGtLiMw4wXfzZxd3Iv+q+zC+tJSmY0flEreNgov+8SKrYcapA+pjClaqj+IgJW0jsJsHkmVQ==", "dev": true, "license": "MIT", "dependencies": { + "@types/readable-stream": "^4.0.18", + "@types/ws": "^8.18.1", "commist": "^3.2.0", "concat-stream": "^2.0.0", "debug": "^4.4.0", @@ -30359,9 +30649,9 @@ } }, "node_modules/mysql2": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.1.tgz", - "integrity": "sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.2.tgz", + "integrity": "sha512-YD6mZMeoypmheHT6b2BrVmQFvouEpRICuvPIREulx2OvP1xAxxeqkMQqZSTBefv0PiOBKGYFa2zQtY+gf/4eQw==", "dev": true, "license": "MIT", "dependencies": { @@ -31730,9 +32020,10 @@ } }, "node_modules/object-inspect": { - "version": "1.13.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", - "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -31762,14 +32053,17 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -31874,12 +32168,14 @@ } }, "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, @@ -32203,6 +32499,24 @@ "node": ">=0.10.0" } }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -32698,6 +33012,7 @@ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -33152,11 +33467,10 @@ } }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, @@ -34049,17 +34363,17 @@ } }, "node_modules/redis": { - "version": "5.5.5", - "resolved": "https://registry.npmjs.org/redis/-/redis-5.5.5.tgz", - "integrity": "sha512-x7vpciikEY7nptGzQrE5I+/pvwFZJDadPk/uEoyGSg/pZ2m/CX2n5EhSgUh+S5T7Gz3uKM6YzWcXEu3ioAsdFQ==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-5.6.0.tgz", + "integrity": "sha512-0x3pM3SlYA5azdNwO8qgfMBzoOqSqr9M+sd1hojbcn0ZDM5zsmKeMM+zpTp6LIY+mbQomIc/RTTQKuBzr8QKzQ==", "dev": true, "license": "MIT", "dependencies": { - "@redis/bloom": "5.5.5", - "@redis/client": "5.5.5", - "@redis/json": "5.5.5", - "@redis/search": "5.5.5", - "@redis/time-series": "5.5.5" + "@redis/bloom": "5.6.0", + "@redis/client": "5.6.0", + "@redis/json": "5.6.0", + "@redis/search": "5.6.0", + "@redis/time-series": "5.6.0" }, "engines": { "node": ">= 18" @@ -34091,6 +34405,29 @@ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==" }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -34123,14 +34460,17 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "set-function-name": "^2.0.2" }, "engines": { @@ -34820,14 +35160,16 @@ "dev": true }, "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { @@ -34841,7 +35183,8 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/safe-buffer": { "version": "5.2.1", @@ -34862,6 +35205,30 @@ } ] }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", @@ -34872,14 +35239,15 @@ } }, "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", + "call-bound": "^1.0.2", "es-errors": "^1.3.0", - "is-regex": "^1.1.4" + "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -34970,16 +35338,17 @@ } }, "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 10.13.0" @@ -34989,43 +35358,25 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/schema-utils/node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "ajv": "^8.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peer": true, "peerDependencies": { - "ajv": "^6.9.1" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/secure-json-parse": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-3.0.2.tgz", @@ -35199,6 +35550,7 @@ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -35209,6 +35561,21 @@ "node": ">= 0.4" } }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -35432,9 +35799,9 @@ } }, "node_modules/sinon": { - "version": "20.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-20.0.0.tgz", - "integrity": "sha512-+FXOAbdnj94AQIxH0w1v8gzNxkawVvNqE3jUzRLptR71Oykeu2RrQXXl/VQjKay+Qnh73fDt/oDfMo6xMeDQbQ==", + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-21.0.0.tgz", + "integrity": "sha512-TOgRcwFPbfGtpqvZw+hyqJDvqfapr1qUlOizROIk4bBLjlsjlB00Pg6wMFXNtJRpu+eCZuVOaLatG7M8105kAw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -36290,6 +36657,20 @@ "node": ">=0.10.0" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/stoppable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", @@ -36485,15 +36866,19 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -36503,15 +36888,20 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -36764,9 +37154,9 @@ } }, "node_modules/superagent": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.1.tgz", - "integrity": "sha512-O+PCv11lgTNJUzy49teNAWLjBZfc+A1enOwTpLlH6/rsvKcTwcdTT8m9azGkVqM7HBl5jpyZ7KTPhHweokBcdg==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.2.tgz", + "integrity": "sha512-vWMq11OwWCC84pQaFPzF/VO3BrjkCeewuvJgt1jfV0499Z1QSAWN4EqfMM5WlFDDX9/oP8JjlDKpblrmEoyu4Q==", "dev": true, "license": "MIT", "dependencies": { @@ -36785,9 +37175,9 @@ } }, "node_modules/superagent/node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", "dev": true, "license": "MIT", "dependencies": { @@ -36823,14 +37213,14 @@ "license": "MIT" }, "node_modules/supertest": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.1.tgz", - "integrity": "sha512-aI59HBTlG9e2wTjxGJV+DygfNLgnWbGdZxiA/sgrnNNikIW8lbDvCtF6RnhZoJ82nU7qv7ZLjrvWqCEm52fAmw==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.3.tgz", + "integrity": "sha512-ORY0gPa6ojmg/C74P/bDoS21WL6FMXq5I8mawkEz30/zkwdu0gOeqstFy316vHG6OKxqQ+IbGneRemHI8WraEw==", "dev": true, "license": "MIT", "dependencies": { "methods": "^1.1.2", - "superagent": "^10.2.1" + "superagent": "^10.2.2" }, "engines": { "node": ">=14.18.0" @@ -37361,15 +37751,15 @@ "dev": true }, "node_modules/terser": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", - "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", "dev": true, "license": "BSD-2-Clause", "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -37381,9 +37771,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", "dev": true, "license": "MIT", "peer": true, @@ -37417,9 +37807,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", "dev": true, "license": "MIT", "peer": true, @@ -37428,46 +37818,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/terser-webpack-plugin/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -37920,13 +38270,13 @@ } }, "node_modules/ts-morph": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-25.0.1.tgz", - "integrity": "sha512-QJEiTdnz1YjrB3JFhd626gX4rKHDLSjSVMvGGG4v7ONc3RBwa0Eei98G9AT9uNFDMtV54JyuXsFeC+OH0n6bXQ==", + "version": "26.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-26.0.0.tgz", + "integrity": "sha512-ztMO++owQnz8c/gIENcM9XfCEzgoGphTv+nKpYNM1bgsdOVC/jRZuEBf6N+mLLDNg68Kl+GgUZfOySaRiG1/Ug==", "dev": true, "license": "MIT", "dependencies": { - "@ts-morph/common": "~0.26.0", + "@ts-morph/common": "~0.27.0", "code-block-writer": "^13.0.3" } }, @@ -38268,30 +38618,32 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bound": "^1.0.3", "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -38301,17 +38653,19 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" @@ -38321,17 +38675,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" @@ -38347,9 +38702,9 @@ "dev": true }, "node_modules/typeorm": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.24.tgz", - "integrity": "sha512-4IrHG7A0tY8l5gEGXfW56VOMfUVWEkWlH/h5wmcyZ+V8oCiLj7iTPp0lEjMEZVrxEkGSdP9ErgTKHKXQApl/oA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.25.tgz", + "integrity": "sha512-fTKDFzWXKwAaBdEMU4k661seZewbNYET4r1J/z3Jwf+eAvlzMVpTLKAVcAzg75WwQk7GDmtsmkZ5MfkmXCiFWg==", "dev": true, "license": "MIT", "dependencies": { @@ -38576,9 +38931,9 @@ "license": "MIT" }, "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -38590,15 +38945,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.33.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.33.1.tgz", - "integrity": "sha512-AgRnV4sKkWOiZ0Kjbnf5ytTJXMUZQ0qhSVdQtDNYLPLnjsATEYhaO94GlRQwi4t4gO8FfjM6NnikHeKjUm8D7A==", + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.37.0.tgz", + "integrity": "sha512-TnbEjzkE9EmcO0Q2zM+GE8NQLItNAJpMmED1BdgoBMYNdqMhzlbqfdSwiRlAzEK2pA9UzVW0gzaaIzXWg2BjfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.33.1", - "@typescript-eslint/parser": "8.33.1", - "@typescript-eslint/utils": "8.33.1" + "@typescript-eslint/eslint-plugin": "8.37.0", + "@typescript-eslint/parser": "8.37.0", + "@typescript-eslint/typescript-estree": "8.37.0", + "@typescript-eslint/utils": "8.37.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -38649,15 +39005,19 @@ } }, "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", + "call-bound": "^1.0.3", "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -38713,9 +39073,9 @@ } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "license": "MIT" }, "node_modules/unicorn-magic": { @@ -38897,9 +39257,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { @@ -39384,9 +39744,9 @@ "license": "ISC" }, "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", "dev": true, "license": "MIT", "peer": true, @@ -39414,22 +39774,24 @@ "dev": true }, "node_modules/webpack": { - "version": "5.97.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", - "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "version": "5.100.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.100.2.tgz", + "integrity": "sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", + "enhanced-resolve": "^5.17.2", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -39439,11 +39801,11 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", + "terser-webpack-plugin": "^5.3.11", "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -39462,9 +39824,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", "dev": true, "license": "MIT", "peer": true, @@ -39556,16 +39918,74 @@ } }, "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, + "license": "MIT", "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -39578,15 +39998,18 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -39667,10 +40090,11 @@ } }, "node_modules/workerpool": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", - "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", - "dev": true + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.2.tgz", + "integrity": "sha512-Xz4Nm9c+LiBHhDR5bDLnNzmj6+5F+cyEAWPMkbs2awq/dYazR/efelZzUAjB/y3kNHL+uzkHvxVVpaOfGCPV7A==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -39763,11 +40187,10 @@ "dev": true }, "node_modules/ws": { - "version": "8.18.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz", - "integrity": "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" }, diff --git a/package.json b/package.json index 4680841e41e..271bc725a4f 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,7 @@ "@commitlint/cli": "19.8.1", "@commitlint/config-angular": "19.8.1", "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@fastify/cors": "11.0.1", "@fastify/formbody": "8.0.2", "@fastify/middie": "9.0.3", @@ -102,13 +102,13 @@ "@types/bytes": "3.1.5", "@types/chai": "4.3.20", "@types/chai-as-promised": "7.1.8", - "@types/cors": "2.8.18", + "@types/cors": "2.8.19", "@types/eslint__js": "8.42.3", - "@types/express": "5.0.2", + "@types/express": "5.0.3", "@types/gulp": "4.0.17", - "@types/http-errors": "2.0.4", + "@types/http-errors": "2.0.5", "@types/mocha": "10.0.10", - "@types/node": "22.15.30", + "@types/node": "24.0.14", "@types/sinon": "17.0.4", "@types/supertest": "6.0.3", "@types/ws": "8.18.1", @@ -117,25 +117,25 @@ "artillery": "2.0.23", "body-parser": "2.2.0", "bytes": "3.1.2", - "cache-manager": "6.4.3", + "cache-manager": "7.0.1", "cache-manager-redis-store": "3.0.1", "chai": "4.5.0", "chai-as-promised": "7.1.2", "clang-format": "1.8.0", - "concurrently": "9.1.2", - "conventional-changelog": "7.0.2", - "core-js": "3.42.0", + "concurrently": "9.2.0", + "conventional-changelog": "7.1.1", + "core-js": "3.44.0", "coveralls": "3.1.1", "delete-empty": "3.0.0", "engine.io-client": "6.6.3", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-import": "2.31.0", - "eslint-plugin-prettier": "5.4.1", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-prettier": "5.5.1", "eventsource": "4.0.0", "fancy-log": "2.0.0", - "fastify": "5.3.3", - "globals": "16.2.0", + "fastify": "5.4.0", + "globals": "16.3.0", "graphql": "16.11.0", "graphql-subscriptions": "3.0.0", "graphql-tools": "9.0.18", @@ -154,31 +154,31 @@ "lerna": "2.11.0", "lerna-changelog": "2.2.0", "light-my-request": "6.6.0", - "lint-staged": "16.1.0", + "lint-staged": "16.1.2", "markdown-table": "2.0.0", - "mocha": "11.5.0", - "mongoose": "8.15.1", - "mqtt": "5.13.1", + "mocha": "11.7.1", + "mongoose": "8.16.3", + "mqtt": "5.13.2", "multer": "2.0.1", - "mysql2": "3.14.1", + "mysql2": "3.14.2", "nats": "2.29.3", "nodemon": "3.1.10", "nyc": "14.1.1", - "prettier": "3.5.3", - "redis": "5.5.5", + "prettier": "3.6.2", + "redis": "5.6.0", "rxjs-compat": "6.6.7", - "sinon": "20.0.0", + "sinon": "21.0.0", "sinon-chai": "3.7.0", "socket.io-client": "4.8.1", "subscriptions-transport-ws": "0.11.0", - "supertest": "7.1.1", - "ts-morph": "25.0.1", + "supertest": "7.1.3", + "ts-morph": "26.0.0", "ts-node": "10.9.2", - "typeorm": "0.3.24", - "typescript": "5.7.3", - "typescript-eslint": "8.33.1", + "typeorm": "0.3.25", + "typescript": "5.8.3", + "typescript-eslint": "8.37.0", "wrk": "1.2.1", - "ws": "8.18.2" + "ws": "8.18.3" }, "engines": { "node": ">= 20" diff --git a/packages/common/decorators/core/dependencies.decorator.ts b/packages/common/decorators/core/dependencies.decorator.ts index 99a60008c88..c08a33a283b 100644 --- a/packages/common/decorators/core/dependencies.decorator.ts +++ b/packages/common/decorators/core/dependencies.decorator.ts @@ -4,7 +4,9 @@ export function flatten = any>( arr: T, ): T extends Array ? R : never { const flat = ([] as any[]).concat(...arr); - return flat.some(Array.isArray) ? flatten(flat) : flat; + return flat.some(Array.isArray) + ? flatten(flat) + : (flat as T extends Array ? R : never); } /** diff --git a/packages/common/interfaces/nest-application-context-options.interface.ts b/packages/common/interfaces/nest-application-context-options.interface.ts index db661d95382..63a9b793a8a 100644 --- a/packages/common/interfaces/nest-application-context-options.interface.ts +++ b/packages/common/interfaces/nest-application-context-options.interface.ts @@ -53,4 +53,18 @@ export class NestApplicationContextOptions { * @default 'reference' */ moduleIdGeneratorAlgorithm?: 'deep-hash' | 'reference'; + + /** + * Instrument the application context. + * This option allows you to add custom instrumentation to the application context. + */ + instrument?: { + /** + * Function that decorates each instance created by the application context. + * This function can be used to add custom properties or methods to the instance. + * @param instance The instance to decorate. + * @returns The decorated instance. + */ + instanceDecorator: (instance: unknown) => unknown; + }; } diff --git a/packages/common/package.json b/packages/common/package.json index 016cf2dd547..59d837d0d3f 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@nestjs/common", - "version": "11.1.3", + "version": "11.1.4", "description": "Nest - modern, fast, powerful node.js web framework (@common)", "author": "Kamil Mysliwiec", "homepage": "https://nestjs.com", diff --git a/packages/common/services/console-logger.service.ts b/packages/common/services/console-logger.service.ts index 37f33aafdff..ca86200f901 100644 --- a/packages/common/services/console-logger.service.ts +++ b/packages/common/services/console-logger.service.ts @@ -71,7 +71,7 @@ export interface ConsoleLoggerOptions { */ sorted?: boolean | ((a: string, b: string) => number); /** - * Specifies the number of times to recurse while formatting object. T + * Specifies the number of times to recurse while formatting object. * This is useful for inspecting large objects. To recurse up to the maximum call stack size pass Infinity or null. * Ignored when `json` is enabled, colors are disabled, and `compact` is set to true as it produces a parseable JSON output. * @default 5 @@ -346,6 +346,23 @@ export class ConsoleLogger implements LoggerService { writeStreamType?: 'stdout' | 'stderr'; errorStack?: unknown; }, + ) { + const logObject = this.getJsonLogObject(message, options); + const formattedMessage = + !this.options.colors && this.inspectOptions.compact === true + ? JSON.stringify(logObject, this.stringifyReplacer) + : inspect(logObject, this.inspectOptions); + process[options.writeStreamType ?? 'stdout'].write(`${formattedMessage}\n`); + } + + protected getJsonLogObject( + message: unknown, + options: { + context: string; + logLevel: LogLevel; + writeStreamType?: 'stdout' | 'stderr'; + errorStack?: unknown; + }, ) { type JsonLogObject = { level: LogLevel; @@ -370,12 +387,7 @@ export class ConsoleLogger implements LoggerService { if (options.errorStack) { logObject.stack = options.errorStack; } - - const formattedMessage = - !this.options.colors && this.inspectOptions.compact === true - ? JSON.stringify(logObject, this.stringifyReplacer) - : inspect(logObject, this.inspectOptions); - process[options.writeStreamType ?? 'stdout'].write(`${formattedMessage}\n`); + return logObject; } protected formatPid(pid: number) { diff --git a/packages/core/adapters/http-adapter.ts b/packages/core/adapters/http-adapter.ts index 39d1bb6c6d5..08cc7abec86 100644 --- a/packages/core/adapters/http-adapter.ts +++ b/packages/core/adapters/http-adapter.ts @@ -12,6 +12,9 @@ export abstract class AbstractHttpAdapter< > implements HttpServer { protected httpServer: TServer; + protected onRouteTriggered: + | ((requestMethod: RequestMethod, path: string) => void) + | undefined; constructor(protected instance?: any) {} @@ -143,6 +146,20 @@ export abstract class AbstractHttpAdapter< return path; } + public setOnRouteTriggered( + onRouteTriggered: (requestMethod: RequestMethod, path: string) => void, + ) { + this.onRouteTriggered = onRouteTriggered; + } + + public getOnRouteTriggered() { + return this.onRouteTriggered; + } + + public setOnRequestHook(onRequestHook: Function): void {} + + public setOnResponseHook(onResponseHook: Function): void {} + abstract close(); abstract initHttpServer(options: NestApplicationOptions); abstract useStaticAssets(...args: any[]); diff --git a/packages/core/guards/guards-consumer.ts b/packages/core/guards/guards-consumer.ts index 7f3c717e2de..c1960bb9f35 100644 --- a/packages/core/guards/guards-consumer.ts +++ b/packages/core/guards/guards-consumer.ts @@ -20,6 +20,12 @@ export class GuardsConsumer { for (const guard of guards) { const result = guard.canActivate(context); + if (typeof result === 'boolean') { + if (!result) { + return false; + } + continue; + } if (await this.pickResult(result)) { continue; } diff --git a/packages/core/helpers/barrier.ts b/packages/core/helpers/barrier.ts new file mode 100644 index 00000000000..c1c77d3343a --- /dev/null +++ b/packages/core/helpers/barrier.ts @@ -0,0 +1,51 @@ +/** + * A simple barrier to synchronize flow of multiple async operations. + */ +export class Barrier { + private currentCount: number; + private targetCount: number; + private promise: Promise; + private resolve: () => void; + + constructor(targetCount: number) { + this.currentCount = 0; + this.targetCount = targetCount; + + this.promise = new Promise(resolve => { + this.resolve = resolve; + }); + } + + /** + * Signal that a participant has reached the barrier. + * + * The barrier will be resolved once `targetCount` participants have reached it. + */ + public signal(): void { + this.currentCount += 1; + if (this.currentCount === this.targetCount) { + this.resolve(); + } + } + + /** + * Wait for the barrier to be resolved. + * + * @returns A promise that resolves when the barrier is resolved. + */ + public async wait(): Promise { + return this.promise; + } + + /** + * Signal that a participant has reached the barrier and wait for the barrier to be resolved. + * + * The barrier will be resolved once `targetCount` participants have reached it. + * + * @returns A promise that resolves when the barrier is resolved. + */ + public async signalAndWait(): Promise { + this.signal(); + return this.wait(); + } +} diff --git a/packages/core/helpers/http-adapter-host.ts b/packages/core/helpers/http-adapter-host.ts index 652a8084fe5..4a17b463b7c 100644 --- a/packages/core/helpers/http-adapter-host.ts +++ b/packages/core/helpers/http-adapter-host.ts @@ -1,4 +1,4 @@ -import { Observable, Subject } from 'rxjs'; +import { Observable, ReplaySubject, Subject } from 'rxjs'; import { AbstractHttpAdapter } from '../adapters/http-adapter'; /** @@ -18,6 +18,7 @@ export class HttpAdapterHost< > { private _httpAdapter?: T; private _listen$ = new Subject(); + private _init$ = new ReplaySubject(); private isListening = false; /** @@ -27,6 +28,9 @@ export class HttpAdapterHost< */ set httpAdapter(httpAdapter: T) { this._httpAdapter = httpAdapter; + + this._init$.next(); + this._init$.complete(); } /** @@ -47,6 +51,14 @@ export class HttpAdapterHost< return this._listen$.asObservable(); } + /** + * Observable that allows to subscribe to the `init` event. + * This event is emitted when the HTTP application is initialized. + */ + get init$(): Observable { + return this._init$.asObservable(); + } + /** * Sets the listening state of the application. */ diff --git a/packages/core/injector/container.ts b/packages/core/injector/container.ts index 4a259a271c0..555e90a5efd 100644 --- a/packages/core/injector/container.ts +++ b/packages/core/injector/container.ts @@ -67,6 +67,10 @@ export class NestContainer { return this._applicationConfig; } + get contextOptions(): NestApplicationContextOptions | undefined { + return this._contextOptions; + } + public setHttpAdapter(httpAdapter: any) { this.internalProvidersStorage.httpAdapter = httpAdapter; diff --git a/packages/core/injector/injector.ts b/packages/core/injector/injector.ts index d6b5d78a28a..4cf37e2afd0 100644 --- a/packages/core/injector/injector.ts +++ b/packages/core/injector/injector.ts @@ -42,6 +42,7 @@ import { } from './instance-wrapper'; import { Module } from './module'; import { SettlementSignal } from './settlement-signal'; +import { Barrier } from '../helpers/barrier'; /** * The type of an injectable dependency @@ -84,8 +85,26 @@ export interface InjectorDependencyContext { export class Injector { private logger: LoggerService = new Logger('InjectorLogger'); + private readonly instanceDecorator: (target: unknown) => unknown = ( + target: unknown, + ) => target; - constructor(private readonly options?: { preview: boolean }) {} + constructor( + private readonly options?: { + /** + * Whether to enable preview mode. + */ + preview: boolean; + /** + * Function to decorate a freshly created instance. + */ + instanceDecorator?: (target: unknown) => unknown; + }, + ) { + if (options?.instanceDecorator) { + this.instanceDecorator = options.instanceDecorator; + } + } public loadPrototype( { token }: InstanceWrapper, @@ -295,10 +314,16 @@ export class Injector { ? this.getFactoryProviderDependencies(wrapper) : this.getClassDependencies(wrapper); + const paramBarrier = new Barrier(dependencies.length); let isResolved = true; const resolveParam = async (param: unknown, index: number) => { try { if (this.isInquirer(param, parentInquirer)) { + /* + * Signal the barrier to make sure other dependencies do not get stuck waiting forever. + */ + paramBarrier.signal(); + return parentInquirer && parentInquirer.instance; } if (inquirer?.isTransient && parentInquirer) { @@ -314,15 +339,36 @@ export class Injector { inquirer, index, ); - const instanceHost = paramWrapper.getInstanceByContextId( - this.getContextId(contextId, paramWrapper), + + /* + * Ensure that all instance wrappers are resolved at this point before we continue. + * Otherwise the staticity of `wrapper`'s dependency tree may be evaluated incorrectly + * and result in undefined / null injection. + */ + await paramBarrier.signalAndWait(); + + const paramWrapperWithInstance = await this.resolveComponentHost( + moduleRef, + paramWrapper, + contextId, + inquirer, + ); + const instanceHost = paramWrapperWithInstance.getInstanceByContextId( + this.getContextId(contextId, paramWrapperWithInstance), inquirerId, ); - if (!instanceHost.isResolved && !paramWrapper.forwardRef) { + if (!instanceHost.isResolved && !paramWrapperWithInstance.forwardRef) { isResolved = false; } return instanceHost?.instance; } catch (err) { + /* + * Signal the barrier to make sure other dependencies do not get stuck waiting forever. We + * do not care if this occurs after `Barrier.signalAndWait()` is called in the `try` block + * because the barrier will always have been resolved by then. + */ + paramBarrier.signal(); + const isOptional = optionalDependenciesIds.includes(index); if (!isOptional) { throw err; @@ -422,7 +468,7 @@ export class Injector { ); } const token = this.resolveParamToken(wrapper, param); - return this.resolveComponentInstance( + return this.resolveComponentWrapper( moduleRef, token, dependencyContext, @@ -444,7 +490,7 @@ export class Injector { return param; } - public async resolveComponentInstance( + public async resolveComponentWrapper( moduleRef: Module, token: InjectionToken, dependencyContext: InjectorDependencyContext, @@ -456,7 +502,7 @@ export class Injector { this.printResolvingDependenciesLog(token, inquirer); this.printLookingForProviderLog(token, moduleRef); const providers = moduleRef.providers; - const instanceWrapper = await this.lookupComponent( + return this.lookupComponent( providers, moduleRef, { ...dependencyContext, name: token }, @@ -465,13 +511,6 @@ export class Injector { inquirer, keyOrIndex, ); - - return this.resolveComponentHost( - moduleRef, - instanceWrapper, - contextId, - inquirer, - ); } public async resolveComponentHost( @@ -671,6 +710,7 @@ export class Injector { return this.loadPropertiesMetadata(metadata, contextId, inquirer); } const properties = this.reflectProperties(wrapper.metatype as Type); + const propertyBarrier = new Barrier(properties.length); const instances = await Promise.all( properties.map(async (item: PropertyDependency) => { try { @@ -679,6 +719,11 @@ export class Injector { name: item.name as Function | string | symbol, }; if (this.isInquirer(item.name, parentInquirer)) { + /* + * Signal the barrier to make sure other dependencies do not get stuck waiting forever. + */ + propertyBarrier.signal(); + return parentInquirer && parentInquirer.instance; } const paramWrapper = await this.resolveSingleParam( @@ -690,16 +735,37 @@ export class Injector { inquirer, item.key, ); - if (!paramWrapper) { + + /* + * Ensure that all instance wrappers are resolved at this point before we continue. + * Otherwise the staticity of `wrapper`'s dependency tree may be evaluated incorrectly + * and result in undefined / null injection. + */ + await propertyBarrier.signalAndWait(); + + const paramWrapperWithInstance = await this.resolveComponentHost( + moduleRef, + paramWrapper, + contextId, + inquirer, + ); + if (!paramWrapperWithInstance) { return undefined; } const inquirerId = this.getInquirerId(inquirer); - const instanceHost = paramWrapper.getInstanceByContextId( - this.getContextId(contextId, paramWrapper), + const instanceHost = paramWrapperWithInstance.getInstanceByContextId( + this.getContextId(contextId, paramWrapperWithInstance), inquirerId, ); return instanceHost.instance; } catch (err) { + /* + * Signal the barrier to make sure other dependencies do not get stuck waiting forever. We + * do not care if this occurs after `Barrier.signalAndWait()` is called in the `try` block + * because the barrier will always have been resolved by then. + */ + propertyBarrier.signal(); + if (!item.isOptional) { throw err; } @@ -768,11 +834,14 @@ export class Injector { new (metatype as Type)(...instances), ) : new (metatype as Type)(...instances); + + instanceHost.instance = this.instanceDecorator(instanceHost.instance); } else if (isInContext) { const factoryReturnValue = (targetMetatype.metatype as any as Function)( ...instances, ); instanceHost.instance = await factoryReturnValue; + instanceHost.instance = this.instanceDecorator(instanceHost.instance); } instanceHost.isResolved = true; return instanceHost.instance; diff --git a/packages/core/injector/internal-core-module/internal-core-module-factory.ts b/packages/core/injector/internal-core-module/internal-core-module-factory.ts index e0727d18ed5..9c3533049c0 100644 --- a/packages/core/injector/internal-core-module/internal-core-module-factory.ts +++ b/packages/core/injector/internal-core-module/internal-core-module-factory.ts @@ -27,7 +27,11 @@ export class InternalCoreModuleFactory { const logger = new Logger(LazyModuleLoader.name, { timestamp: false, }); - const injector = new Injector(); + const injector = new Injector({ + preview: container.contextOptions?.preview!, + instanceDecorator: + container.contextOptions?.instrument?.instanceDecorator, + }); const instanceLoader = new InstanceLoader( container, injector, diff --git a/packages/core/injector/module-ref.ts b/packages/core/injector/module-ref.ts index 85de4b47891..6dd3544181f 100644 --- a/packages/core/injector/module-ref.ts +++ b/packages/core/injector/module-ref.ts @@ -23,7 +23,7 @@ export interface ModuleRefGetOrResolveOpts { } export abstract class ModuleRef extends AbstractInstanceResolver { - protected readonly injector = new Injector(); + protected readonly injector: Injector; private _instanceLinksHost: InstanceLinksHost; protected get instanceLinksHost() { @@ -35,6 +35,12 @@ export abstract class ModuleRef extends AbstractInstanceResolver { constructor(protected readonly container: NestContainer) { super(); + + this.injector = new Injector({ + preview: container.contextOptions?.preview!, + instanceDecorator: + container.contextOptions?.instrument?.instanceDecorator, + }); } /** diff --git a/packages/core/injector/module.ts b/packages/core/injector/module.ts index 5ab3c2914a7..c9dd10a937c 100644 --- a/packages/core/injector/module.ts +++ b/packages/core/injector/module.ts @@ -384,13 +384,16 @@ export class Module { enhancerSubtype?: EnhancerSubtype, ) { const { useValue: value, provide: providerToken } = provider; + + const instanceDecorator = + this.container.contextOptions?.instrument?.instanceDecorator; collection.set( providerToken, new InstanceWrapper({ token: providerToken, name: (providerToken as Function)?.name || providerToken, metatype: null!, - instance: value, + instance: instanceDecorator ? instanceDecorator(value) : value, isResolved: true, async: value instanceof Promise, host: this, @@ -554,7 +557,9 @@ export class Module { return this._injectables.has(token); } - public getProviderByKey(name: InjectionToken): InstanceWrapper { + public getProviderByKey( + name: InjectionToken, + ): InstanceWrapper { return this._providers.get(name) as InstanceWrapper; } diff --git a/packages/core/injector/modules-container.ts b/packages/core/injector/modules-container.ts index 31777bec20a..c2316f5cb98 100644 --- a/packages/core/injector/modules-container.ts +++ b/packages/core/injector/modules-container.ts @@ -1,14 +1,41 @@ +import { Observable, ReplaySubject } from 'rxjs'; import { uid } from 'uid'; import { Module } from './module'; export class ModulesContainer extends Map { private readonly _applicationId = uid(21); + private readonly _rpcTargetRegistry$ = new ReplaySubject(); + /** + * Unique identifier of the application instance. + */ get applicationId(): string { return this._applicationId; } + /** + * Retrieves a module by its identifier. + * @param id The identifier of the module to retrieve. + * @returns The module instance if found, otherwise undefined. + */ public getById(id: string): Module | undefined { return Array.from(this.values()).find(moduleRef => moduleRef.id === id); } + + /** + * Returns the RPC target registry as an observable. + * This registry contains all RPC targets registered in the application. + * @returns An observable that emits the RPC target registry. + */ + public getRpcTargetRegistry(): Observable { + return this._rpcTargetRegistry$.asObservable(); + } + + /** + * Adds an RPC target to the registry. + * @param target The RPC target to add. + */ + public addRpcTarget(target: T): void { + this._rpcTargetRegistry$.next(target); + } } diff --git a/packages/core/nest-application.ts b/packages/core/nest-application.ts index 63f58b669e5..ab8021320ba 100644 --- a/packages/core/nest-application.ts +++ b/packages/core/nest-application.ts @@ -81,7 +81,10 @@ export class NestApplication this.selectContextModule(); this.registerHttpServer(); - this.injector = new Injector({ preview: this.appOptions.preview! }); + this.injector = new Injector({ + preview: this.appOptions.preview!, + instanceDecorator: appOptions.instrument?.instanceDecorator, + }); this.middlewareModule = new MiddlewareModule(); this.routesResolver = new RoutesResolver( this.container, @@ -452,6 +455,7 @@ export class NestApplication this.httpAdapter.setViewEngine(engineOrOptions); return this; } + private host(): string | undefined { const address = this.httpServer.address(); if (isString(address)) { diff --git a/packages/core/nest-factory.ts b/packages/core/nest-factory.ts index a2fad51b329..3cc157d9e29 100644 --- a/packages/core/nest-factory.ts +++ b/packages/core/nest-factory.ts @@ -209,7 +209,10 @@ export class NestFactoryStatic { ? UuidFactoryMode.Deterministic : UuidFactoryMode.Random; - const injector = new Injector({ preview: options.preview! }); + const injector = new Injector({ + preview: options.preview!, + instanceDecorator: options.instrument?.instanceDecorator, + }); const instanceLoader = new InstanceLoader( container, injector, diff --git a/packages/core/package.json b/packages/core/package.json index 31356e624ab..0a9a2b108c0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nestjs/core", - "version": "11.1.3", + "version": "11.1.4", "description": "Nest - modern, fast, powerful node.js web framework (@core)", "author": "Kamil Mysliwiec", "license": "MIT", @@ -39,7 +39,7 @@ "uid": "2.0.2" }, "devDependencies": { - "@nestjs/common": "11.1.3" + "@nestjs/common": "11.1.4" }, "peerDependencies": { "@nestjs/common": "^11.0.0", diff --git a/packages/core/repl/native-functions/get-relp-fn.ts b/packages/core/repl/native-functions/get-repl-fn.ts similarity index 100% rename from packages/core/repl/native-functions/get-relp-fn.ts rename to packages/core/repl/native-functions/get-repl-fn.ts diff --git a/packages/core/repl/native-functions/index.ts b/packages/core/repl/native-functions/index.ts index 8799e685d0c..b552bc502f5 100644 --- a/packages/core/repl/native-functions/index.ts +++ b/packages/core/repl/native-functions/index.ts @@ -1,5 +1,5 @@ export * from './help-repl-fn'; -export * from './get-relp-fn'; +export * from './get-repl-fn'; export * from './resolve-repl-fn'; export * from './select-relp-fn'; export * from './debug-repl-fn'; diff --git a/packages/core/router/router-explorer.ts b/packages/core/router/router-explorer.ts index a4333a89cea..c90ae5378c6 100644 --- a/packages/core/router/router-explorer.ts +++ b/packages/core/router/router-explorer.ts @@ -101,14 +101,14 @@ export class RouterExplorer { public explore( instanceWrapper: InstanceWrapper, moduleKey: string, - applicationRef: T, + httpAdapterRef: T, host: string | RegExp | Array, routePathMetadata: RoutePathMetadata, ) { const { instance } = instanceWrapper; const routerPaths = this.pathsExplorer.scanForPaths(instance); this.applyPathsToRouterProxy( - applicationRef, + httpAdapterRef, routerPaths, instanceWrapper, moduleKey, @@ -234,7 +234,17 @@ export class RouterExplorer { const normalizedPath = router.normalizePath ? router.normalizePath(path) : path; - routerMethodRef(normalizedPath, routeHandler); + + const httpAdapter = this.container.getHttpAdapterRef(); + const onRouteTriggered = httpAdapter.getOnRouteTriggered?.(); + if (onRouteTriggered) { + routerMethodRef(normalizedPath, (...args: unknown[]) => { + onRouteTriggered(requestMethod, path); + return routeHandler(...args); + }); + } else { + routerMethodRef(normalizedPath, routeHandler); + } this.graphInspector.insertEntrypointDefinition( entrypointDefinition, diff --git a/packages/core/router/utils/flatten-route-paths.util.ts b/packages/core/router/utils/flatten-route-paths.util.ts index fe0cff258a3..473e19b8192 100644 --- a/packages/core/router/utils/flatten-route-paths.util.ts +++ b/packages/core/router/utils/flatten-route-paths.util.ts @@ -14,7 +14,7 @@ export function flattenRoutePaths(routes: Routes) { if (item.children) { const childrenRef = item.children as Routes; childrenRef.forEach(child => { - if (!isString(child) && child.path) { + if (!isString(child) && isString(child.path)) { child.path = normalizePath( normalizePath(item.path) + normalizePath(child.path), ); diff --git a/packages/core/test/guards/guards-consumer.spec.ts b/packages/core/test/guards/guards-consumer.spec.ts index 8ab3049ca04..516ca0b00a0 100644 --- a/packages/core/test/guards/guards-consumer.spec.ts +++ b/packages/core/test/guards/guards-consumer.spec.ts @@ -1,6 +1,7 @@ import { expect } from 'chai'; import { of } from 'rxjs'; import { GuardsConsumer } from '../../guards/guards-consumer'; +import { AsyncLocalStorage } from 'async_hooks'; describe('GuardsConsumer', () => { let consumer: GuardsConsumer; @@ -44,6 +45,34 @@ describe('GuardsConsumer', () => { expect(canActivate).to.be.true; }); }); + describe('when sync guards initialize AsyncLocalStorages', () => { + it('should keep local storages accessible', async () => { + const storage1 = new AsyncLocalStorage(); + const storage2 = new AsyncLocalStorage(); + const canActivate = await consumer.tryActivate( + [ + { + canActivate: () => { + storage1.enterWith(1); + return true; + }, + }, + { + canActivate: () => { + storage2.enterWith(2); + return true; + }, + }, + ], + [], + { constructor: null }, + null!, + ); + expect(canActivate).to.be.true; + expect(storage1.getStore()).to.equal(1); + expect(storage2.getStore()).to.equal(2); + }); + }); }); }); describe('pickResult', () => { diff --git a/packages/core/test/helpers/barrier.spec.ts b/packages/core/test/helpers/barrier.spec.ts new file mode 100644 index 00000000000..e7eefe2a2b2 --- /dev/null +++ b/packages/core/test/helpers/barrier.spec.ts @@ -0,0 +1,93 @@ +import { expect } from 'chai'; +import { Barrier } from '../../../core/helpers/barrier'; +import * as sinon from 'sinon'; +import * as chai from 'chai'; +import * as chaiAsPromised from 'chai-as-promised'; +import { setTimeout } from 'timers/promises'; +chai.use(chaiAsPromised); + +describe('Barrier', () => { + const targetCount = 3; + let barrier: Barrier; + let barrierResolveSpy: sinon.SinonSpy; + + beforeEach(() => { + barrier = new Barrier(targetCount); + barrierResolveSpy = sinon.spy(barrier, 'resolve'); + }); + + afterEach(() => { + // resolve any promises that may still be waiting in the background + (barrier).resolve(); + }); + + describe('signal', () => { + it('should resolve the barrier when target count is reached', async () => { + for (let i = 0; i < targetCount; i++) { + barrier.signal(); + } + + expect(barrierResolveSpy.called).to.be.true; + }); + + it('should not resolve the barrier when target count is not reached', async () => { + for (let i = 0; i < targetCount - 1; i++) { + barrier.signal(); + } + + expect(barrierResolveSpy.called).to.be.false; + expect((barrier).currentCount).to.be.equal(targetCount - 1); + }); + }); + + describe('wait', () => { + it('should resolve when target count is reached', async () => { + const waitPromise = barrier.wait(); + + for (let i = 0; i < targetCount; i++) { + barrier.signal(); + } + + expect(waitPromise).to.be.fulfilled; + }); + + it('should not resolve when target count is not reached', async () => { + const waitPromise = barrier.wait(); + + for (let i = 0; i < targetCount - 1; i++) { + barrier.signal(); + } + + expect(waitPromise).not.to.be.fulfilled; + }); + }); + + describe('signalAndWait', () => { + it('should resolve when target count is reached', async () => { + const promise = Promise.all( + Array.from({ length: targetCount }, () => barrier.signalAndWait()), + ); + + // wait for the promise to be resolved + await promise; + + expect(promise).to.be.fulfilled; + expect(barrierResolveSpy.called).to.be.true; + }); + + it('should not resolve when target count is not reached', async () => { + const promise = Promise.all( + Array.from({ length: targetCount - 1 }, () => barrier.signalAndWait()), + ); + + /* + * Give the promise some time to work. We cannot await the promise because the test case would + * get stuck. + */ + await setTimeout(5); + + expect(promise).not.to.be.fulfilled; + expect(barrierResolveSpy.called).to.be.false; + }); + }); +}); diff --git a/packages/core/test/injector/injector.spec.ts b/packages/core/test/injector/injector.spec.ts index 3b28e14fa3e..0aaab3f3cb8 100644 --- a/packages/core/test/injector/injector.spec.ts +++ b/packages/core/test/injector/injector.spec.ts @@ -545,7 +545,7 @@ describe('Injector', () => { }); }); - describe('resolveComponentInstance', () => { + describe('resolveComponentHost', () => { let module: any; beforeEach(() => { module = { @@ -560,16 +560,8 @@ describe('Injector', () => { const loadStub = sinon .stub(injector, 'loadProvider') .callsFake(() => null!); - sinon - .stub(injector, 'lookupComponent') - .returns(Promise.resolve(wrapper)); - await injector.resolveComponentInstance( - module, - '', - { index: 0, dependencies: [] }, - wrapper, - ); + await injector.resolveComponentHost(module, wrapper); expect(loadStub.called).to.be.true; }); it('should not call loadProvider (isResolved)', async () => { @@ -578,16 +570,7 @@ describe('Injector', () => { .stub(injector, 'loadProvider') .callsFake(() => null!); - sinon - .stub(injector, 'lookupComponent') - .returns(Promise.resolve(wrapper)); - - await injector.resolveComponentInstance( - module, - '', - { index: 0, dependencies: [] }, - wrapper, - ); + await injector.resolveComponentHost(module, wrapper); expect(loadStub.called).to.be.false; }); it('should not call loadProvider (forwardRef)', async () => { @@ -599,16 +582,7 @@ describe('Injector', () => { .stub(injector, 'loadProvider') .callsFake(() => null!); - sinon - .stub(injector, 'lookupComponent') - .returns(Promise.resolve(wrapper)); - - await injector.resolveComponentInstance( - module, - '', - { index: 0, dependencies: [] }, - wrapper, - ); + await injector.resolveComponentHost(module, wrapper); expect(loadStub.called).to.be.false; }); }); @@ -624,16 +598,8 @@ describe('Injector', () => { async: true, instance, }); - sinon - .stub(injector, 'lookupComponent') - .returns(Promise.resolve(wrapper)); - const result = await injector.resolveComponentInstance( - module, - '', - { index: 0, dependencies: [] }, - wrapper, - ); + const result = await injector.resolveComponentHost(module, wrapper); expect(result.instance).to.be.true; }); }); diff --git a/packages/core/test/pipes/pipes-consumer.spec.ts b/packages/core/test/pipes/pipes-consumer.spec.ts index 08771997ca2..bae8d33899d 100644 --- a/packages/core/test/pipes/pipes-consumer.spec.ts +++ b/packages/core/test/pipes/pipes-consumer.spec.ts @@ -15,7 +15,7 @@ describe('PipesConsumer', () => { beforeEach(() => { value = 0; data = null; - (metatype = {}), (type = RouteParamtypes.QUERY); + ((metatype = {}), (type = RouteParamtypes.QUERY)); stringifiedType = 'query'; transforms = [ createPipe(sinon.stub().callsFake(val => val + 1)), diff --git a/packages/core/test/router/utils/flat-routes.spec.ts b/packages/core/test/router/utils/flat-routes.spec.ts index fa0f13904f8..8900afe541e 100644 --- a/packages/core/test/router/utils/flat-routes.spec.ts +++ b/packages/core/test/router/utils/flat-routes.spec.ts @@ -17,6 +17,12 @@ describe('flattenRoutePaths', () => { @Module({}) class ChildModule4 {} @Module({}) + class ChildModule5 {} + @Module({}) + class ChildModule6 {} + @Module({}) + class ChildParentPathModule {} + @Module({}) class ParentChildModule {} @Module({}) class ChildChildModule2 {} @@ -70,6 +76,25 @@ describe('flattenRoutePaths', () => { ChildModule4, ], }, + { + path: 'child3', + children: [ + { + path: '', + module: ChildModule5, + children: [{ path: 'child', module: ChildParentPathModule }], + }, + ], + }, + { + path: 'child4', + children: [ + { + path: '/', + module: ChildModule6, + }, + ], + }, ], }, { path: '/v1', children: [AuthModule, CatsModule, DogsModule] }, @@ -91,6 +116,9 @@ describe('flattenRoutePaths', () => { }, { path: '/parent/child2', module: ChildModule4 }, { path: '/parent/child2/child', module: ChildModule3 }, + { path: '/parent/child3', module: ChildModule5 }, + { path: '/parent/child3/child', module: ChildParentPathModule }, + { path: '/parent/child4', module: ChildModule6 }, { path: '/v1', module: AuthModule }, { path: '/v1', module: CatsModule }, { path: '/v1', module: DogsModule }, diff --git a/packages/microservices/constants.ts b/packages/microservices/constants.ts index 8344cf1c238..dc4ec1cad4d 100644 --- a/packages/microservices/constants.ts +++ b/packages/microservices/constants.ts @@ -14,13 +14,16 @@ export const KAFKA_DEFAULT_GROUP = 'nestjs-group'; export const MQTT_SEPARATOR = '/'; export const MQTT_WILDCARD_SINGLE = '+'; export const MQTT_WILDCARD_ALL = '#'; -export const RQM_DEFAULT_QUEUE = 'default'; +export const RQM_DEFAULT_QUEUE = ''; export const RQM_DEFAULT_PREFETCH_COUNT = 0; export const RQM_DEFAULT_IS_GLOBAL_PREFETCH_COUNT = false; export const RQM_DEFAULT_QUEUE_OPTIONS = {}; export const RQM_DEFAULT_NOACK = true; export const RQM_DEFAULT_PERSISTENT = false; export const RQM_DEFAULT_NO_ASSERT = false; +export const RMQ_SEPARATOR = '.'; +export const RMQ_WILDCARD_SINGLE = '*'; +export const RMQ_WILDCARD_ALL = '#'; export const ECONNREFUSED = 'ECONNREFUSED'; export const CONN_ERR = 'CONN_ERR'; diff --git a/packages/microservices/microservices-module.ts b/packages/microservices/microservices-module.ts index fe56e509256..52deabf03b0 100644 --- a/packages/microservices/microservices-module.ts +++ b/packages/microservices/microservices-module.ts @@ -50,7 +50,11 @@ export class MicroservicesModule< new InterceptorsConsumer(), ); - const injector = new Injector(); + const injector = new Injector({ + preview: container.contextOptions?.preview!, + instanceDecorator: + container.contextOptions?.instrument?.instanceDecorator, + }); this.listenersController = new ListenersController( this.clientsContainer, contextCreator, diff --git a/packages/microservices/nest-microservice.ts b/packages/microservices/nest-microservice.ts index 41488265e35..3c0fabf994d 100644 --- a/packages/microservices/nest-microservice.ts +++ b/packages/microservices/nest-microservice.ts @@ -64,7 +64,10 @@ export class NestMicroservice ) { super(container, config); - this.injector = new Injector({ preview: config.preview! }); + this.injector = new Injector({ + preview: config.preview!, + instanceDecorator: config.instrument?.instanceDecorator, + }); this.microservicesModule.register( container, this.graphInspector, @@ -73,6 +76,9 @@ export class NestMicroservice ); this.createServer(config); this.selectContextModule(); + + const modulesContainer = this.container.getModules(); + modulesContainer.addRpcTarget(this.serverInstance); } public createServer(config: CompleteMicroserviceOptions) { diff --git a/packages/microservices/package.json b/packages/microservices/package.json index fa7c1a495b1..e7c52ea7027 100644 --- a/packages/microservices/package.json +++ b/packages/microservices/package.json @@ -1,6 +1,6 @@ { "name": "@nestjs/microservices", - "version": "11.1.3", + "version": "11.1.4", "description": "Nest - modern, fast, powerful node.js web framework (@microservices)", "author": "Kamil Mysliwiec", "license": "MIT", @@ -22,8 +22,8 @@ "tslib": "2.8.1" }, "devDependencies": { - "@nestjs/common": "11.1.3", - "@nestjs/core": "11.1.3" + "@nestjs/common": "11.1.4", + "@nestjs/core": "11.1.4" }, "peerDependencies": { "@grpc/grpc-js": "*", diff --git a/packages/microservices/server/server-grpc.ts b/packages/microservices/server/server-grpc.ts index 08d500aeb17..67e56f434d3 100644 --- a/packages/microservices/server/server-grpc.ts +++ b/packages/microservices/server/server-grpc.ts @@ -180,6 +180,11 @@ export class ServerGrpc extends Server { if (!methodHandler) { continue; } + + Object.defineProperty(methodHandler, 'name', { + value: methodName, + writable: false, + }); service[methodName] = this.createServiceMethod( methodHandler, grpcService.prototype[methodName], @@ -263,19 +268,36 @@ export class ServerGrpc extends Server { public createUnaryServiceMethod(methodHandler: Function): Function { return async (call: GrpcCall, callback: Function) => { - const handler = methodHandler(call.request, call.metadata, call); - this.transformToObservable(await handler).subscribe({ - next: async data => callback(null, await data), - error: (err: any) => callback(err), - }); + return this.onProcessingStartHook( + this.transportId, + { ...call, operationId: methodHandler.name } as any, + async () => { + const handler = methodHandler(call.request, call.metadata, call); + this.transformToObservable(await handler).subscribe({ + next: async data => callback(null, await data), + error: (err: any) => callback(err), + complete: () => { + this.onProcessingEndHook?.(this.transportId, call.request); + }, + }); + }, + ); }; } public createStreamServiceMethod(methodHandler: Function): Function { return async (call: GrpcCall, callback: Function) => { - const handler = methodHandler(call.request, call.metadata, call); - const result$ = this.transformToObservable(await handler); - await this.writeObservableToGrpc(result$, call); + return this.onProcessingStartHook( + this.transportId, + { ...call, operationId: methodHandler.name } as any, + async () => { + const handler = methodHandler(call.request, call.metadata, call); + const result$ = this.transformToObservable(await handler); + await this.writeObservableToGrpc(result$, call); + + this.onProcessingEndHook?.(this.transportId, call.request); + }, + ); }; } @@ -406,52 +428,62 @@ export class ServerGrpc extends Server { call: GrpcCall, callback: (err: unknown, value: unknown) => void, ) => { - // Needs to be a Proxy in order to buffer messages that come before handler is executed - // This could happen if handler has any async guards or interceptors registered that would delay - // the execution. - const { subject, next, error, complete, cleanup } = - this.bufferUntilDrained(); - call.on('data', (m: any) => next(m)); - call.on('error', (e: any) => { - // Check if error means that stream ended on other end - const isCancelledError = String(e).toLowerCase().indexOf('cancelled'); - - if (isCancelledError) { - call.end(); - return; - } - // If another error then just pass it along - error(e); - }); - call.on('end', () => { - complete(); - cleanup(); - }); + return this.onProcessingStartHook( + this.transportId, + { ...call, operationId: methodHandler.name } as any, + async () => { + // Needs to be a Proxy in order to buffer messages that come before handler is executed + // This could happen if handler has any async guards or interceptors registered that would delay + // the execution. + const { subject, next, error, complete, cleanup } = + this.bufferUntilDrained(); + call.on('data', (m: any) => next(m)); + call.on('error', (e: any) => { + // Check if error means that stream ended on other end + const isCancelledError = String(e) + .toLowerCase() + .indexOf('cancelled'); + + if (isCancelledError) { + call.end(); + return; + } + // If another error then just pass it along + error(e); + }); + call.on('end', () => { + complete(); + cleanup(); - const handler = methodHandler( - subject.asObservable(), - call.metadata, - call, - ); - const res = this.transformToObservable(await handler); - if (isResponseStream) { - await this.writeObservableToGrpc(res, call); - } else { - const response = await lastValueFrom( - res.pipe( - takeUntil(fromEvent(call as any, CANCELLED_EVENT)), - catchError(err => { - callback(err, null); - return EMPTY; - }), - defaultIfEmpty(undefined), - ), - ); + this.onProcessingEndHook?.(this.transportId, call.request); + }); - if (!isUndefined(response)) { - callback(null, response); - } - } + const handler = methodHandler( + subject.asObservable(), + call.metadata, + call, + ); + const res = this.transformToObservable(await handler); + if (isResponseStream) { + await this.writeObservableToGrpc(res, call); + } else { + const response = await lastValueFrom( + res.pipe( + takeUntil(fromEvent(call as any, CANCELLED_EVENT)), + catchError(err => { + callback(err, null); + return EMPTY; + }), + defaultIfEmpty(undefined), + ), + ); + + if (!isUndefined(response)) { + callback(null, response); + } + } + }, + ); }; } @@ -463,15 +495,25 @@ export class ServerGrpc extends Server { call: GrpcCall, callback: (err: unknown, value: unknown) => void, ) => { - let handlerStream: Observable; - if (isResponseStream) { - handlerStream = this.transformToObservable(await methodHandler(call)); - } else { - handlerStream = this.transformToObservable( - await methodHandler(call, callback), - ); - } - await lastValueFrom(handlerStream); + return this.onProcessingStartHook( + this.transportId, + { ...call, operationId: methodHandler.name } as any, + async () => { + let handlerStream: Observable; + if (isResponseStream) { + handlerStream = this.transformToObservable( + await methodHandler(call), + ); + } else { + handlerStream = this.transformToObservable( + await methodHandler(call, callback), + ); + } + await lastValueFrom(handlerStream).finally(() => { + this.onProcessingEndHook?.(this.transportId, call.request); + }); + }, + ); }; } diff --git a/packages/microservices/server/server-kafka.ts b/packages/microservices/server/server-kafka.ts index 0afd19ab666..939096e6443 100644 --- a/packages/microservices/server/server-kafka.ts +++ b/packages/microservices/server/server-kafka.ts @@ -187,9 +187,16 @@ export class ServerKafka extends Server { replyTopic: string, replyPartition: string, correlationId: string, + context: KafkaContext, ): (data: any) => Promise { return (data: any) => - this.sendMessage(data, replyTopic, replyPartition, correlationId); + this.sendMessage( + data, + replyTopic, + replyPartition, + correlationId, + context, + ); } public async handleMessage(payload: EachMessagePayload) { @@ -225,6 +232,7 @@ export class ServerKafka extends Server { replyTopic, replyPartition, correlationId, + kafkaContext, ); if (!handler) { @@ -233,15 +241,20 @@ export class ServerKafka extends Server { err: NO_MESSAGE_HANDLER, }); } - - const response$ = this.transformToObservable( - handler(packet.data, kafkaContext), + return this.onProcessingStartHook( + this.transportId, + kafkaContext, + async () => { + const response$ = this.transformToObservable( + handler(packet.data, kafkaContext), + ); + + const replayStream$ = new ReplaySubject(); + await this.combineStreamsAndThrowIfRetriable(response$, replayStream$); + + this.send(replayStream$, publish); + }, ); - - const replayStream$ = new ReplaySubject(); - await this.combineStreamsAndThrowIfRetriable(response$, replayStream$); - - this.send(replayStream$, publish); } public unwrap(): T { @@ -293,6 +306,7 @@ export class ServerKafka extends Server { replyTopic: string, replyPartition: string | undefined | null, correlationId: string, + context: KafkaContext, ): Promise { const outgoingMessage = await this.serializer.serialize(message.response); this.assignReplyPartition(replyPartition, outgoingMessage); @@ -307,7 +321,9 @@ export class ServerKafka extends Server { }, this.options.send || {}, ); - return this.producer!.send(replyMessage); + return this.producer!.send(replyMessage).finally(() => { + this.onProcessingEndHook?.(this.transportId, context); + }); } public assignIsDisposedHeader( @@ -362,10 +378,14 @@ export class ServerKafka extends Server { if (!handler) { return this.logger.error(NO_EVENT_HANDLER`${pattern}`); } - const resultOrStream = await handler(packet.data, context); - if (isObservable(resultOrStream)) { - await lastValueFrom(resultOrStream); - } + + return this.onProcessingStartHook(this.transportId, context, async () => { + const resultOrStream = await handler(packet.data, context); + if (isObservable(resultOrStream)) { + await lastValueFrom(resultOrStream); + this.onProcessingEndHook?.(this.transportId, context); + } + }); } protected initializeSerializer(options: KafkaOptions['options']) { diff --git a/packages/microservices/server/server-mqtt.ts b/packages/microservices/server/server-mqtt.ts index dee0760e8d3..99e4d2b9469 100644 --- a/packages/microservices/server/server-mqtt.ts +++ b/packages/microservices/server/server-mqtt.ts @@ -129,7 +129,7 @@ export class ServerMqtt extends Server { } const publish = this.getPublisher( pub, - channel, + mqttContext, (packet as IncomingRequest).id, ); const handler = this.getHandlerByPattern(channel); @@ -143,13 +143,23 @@ export class ServerMqtt extends Server { }; return publish(noHandlerPacket); } - const response$ = this.transformToObservable( - await handler(packet.data, mqttContext), + return this.onProcessingStartHook( + this.transportId, + mqttContext, + async () => { + const response$ = this.transformToObservable( + await handler(packet.data, mqttContext), + ); + response$ && this.send(response$, publish); + }, ); - response$ && this.send(response$, publish); } - public getPublisher(client: MqttClient, pattern: any, id: string): any { + public getPublisher( + client: MqttClient, + context: MqttContext, + id: string, + ): any { return (response: any) => { Object.assign(response, { id }); @@ -161,8 +171,10 @@ export class ServerMqtt extends Server { const outgoingResponse: string | Buffer = this.serializer.serialize(response); + + this.onProcessingEndHook?.(this.transportId, context); return client.publish( - this.getReplyPattern(pattern), + this.getReplyPattern(context.getTopic()), outgoingResponse, options, ); diff --git a/packages/microservices/server/server-nats.ts b/packages/microservices/server/server-nats.ts index 31c8c28c310..fe4dbbce1f7 100644 --- a/packages/microservices/server/server-nats.ts +++ b/packages/microservices/server/server-nats.ts @@ -153,7 +153,11 @@ export class ServerNats< if (isUndefined((message as IncomingRequest).id)) { return this.handleEvent(channel, message, natsCtx); } - const publish = this.getPublisher(natsMsg, (message as IncomingRequest).id); + const publish = this.getPublisher( + natsMsg, + (message as IncomingRequest).id, + natsCtx, + ); const handler = this.getHandlerByPattern(channel); if (!handler) { const status = 'error'; @@ -164,18 +168,22 @@ export class ServerNats< }; return publish(noHandlerPacket); } - const response$ = this.transformToObservable( - await handler(message.data, natsCtx), - ); - response$ && this.send(response$, publish); + return this.onProcessingStartHook(this.transportId, natsCtx, async () => { + const response$ = this.transformToObservable( + await handler(message.data, natsCtx), + ); + response$ && this.send(response$, publish); + }); } - public getPublisher(natsMsg: NatsMsg, id: string) { + public getPublisher(natsMsg: NatsMsg, id: string, ctx: NatsContext) { if (natsMsg.reply) { return (response: any) => { Object.assign(response, { id }); const outgoingResponse: NatsRecord = this.serializer.serialize(response); + + this.onProcessingEndHook?.(this.transportId, ctx); return natsMsg.respond(outgoingResponse.data, { headers: outgoingResponse.headers, }); diff --git a/packages/microservices/server/server-redis.ts b/packages/microservices/server/server-redis.ts index 9b5d7b5e1e8..10bf9c1cd1f 100644 --- a/packages/microservices/server/server-redis.ts +++ b/packages/microservices/server/server-redis.ts @@ -145,6 +145,7 @@ export class ServerRedis extends Server { pub, channel, (packet as IncomingRequest).id, + redisCtx, ); const handler = this.getHandlerByPattern(channel); @@ -157,17 +158,24 @@ export class ServerRedis extends Server { }; return publish(noHandlerPacket); } - const response$ = this.transformToObservable( - await handler(packet.data, redisCtx), + return this.onProcessingStartHook?.( + this.transportId, + redisCtx, + async () => { + const response$ = this.transformToObservable( + await handler(packet.data, redisCtx), + ); + response$ && this.send(response$, publish); + }, ); - response$ && this.send(response$, publish); } - public getPublisher(pub: Redis, pattern: any, id: string) { + public getPublisher(pub: Redis, pattern: any, id: string, ctx: RedisContext) { return (response: any) => { Object.assign(response, { id }); const outgoingResponse = this.serializer.serialize(response); + this.onProcessingEndHook?.(this.transportId, ctx); return pub.publish( this.getReplyPattern(pattern), JSON.stringify(outgoingResponse), diff --git a/packages/microservices/server/server-rmq.ts b/packages/microservices/server/server-rmq.ts index 4e37c59e7fa..39a90f14485 100644 --- a/packages/microservices/server/server-rmq.ts +++ b/packages/microservices/server/server-rmq.ts @@ -8,6 +8,9 @@ import { CONNECTION_FAILED_MESSAGE, DISCONNECTED_RMQ_MESSAGE, NO_MESSAGE_HANDLER, + RMQ_SEPARATOR, + RMQ_WILDCARD_ALL, + RMQ_WILDCARD_SINGLE, RQM_DEFAULT_IS_GLOBAL_PREFETCH_COUNT, RQM_DEFAULT_NOACK, RQM_DEFAULT_NO_ASSERT, @@ -63,7 +66,7 @@ export class ServerRMQ extends Server { protected readonly queue: string; protected readonly noAck: boolean; protected readonly queueOptions: any; - protected readonly wildcardHandlers = new Map(); + protected readonly wildcardHandlers = new Map(); protected pendingEventListeners: Array<{ event: keyof RmqEvents; callback: RmqEvents[keyof RmqEvents]; @@ -289,16 +292,28 @@ export class ServerRMQ extends Server { noHandlerPacket, properties.replyTo, properties.correlationId, + rmqContext, ); } - const response$ = this.transformToObservable( - await handler(packet.data, rmqContext), - ); + return this.onProcessingStartHook( + this.transportId, + rmqContext, + async () => { + const response$ = this.transformToObservable( + await handler(packet.data, rmqContext), + ); - const publish = (data: T) => - this.sendMessage(data, properties.replyTo, properties.correlationId); + const publish = (data: T) => + this.sendMessage( + data, + properties.replyTo, + properties.correlationId, + rmqContext, + ); - response$ && this.send(response$, publish); + response$ && this.send(response$, publish); + }, + ); } public async handleEvent( @@ -318,6 +333,7 @@ export class ServerRMQ extends Server { message: T, replyTo: any, correlationId: string, + context: RmqContext, ): void { const outgoingResponse = this.serializer.serialize( message as unknown as OutgoingResponse, @@ -327,6 +343,8 @@ export class ServerRMQ extends Server { const buffer = Buffer.from(JSON.stringify(outgoingResponse)); const sendOptions = { correlationId, ...options }; + + this.onProcessingEndHook?.(this.transportId, context); this.channel!.sendToQueue(replyTo, buffer, sendOptions); } @@ -365,8 +383,8 @@ export class ServerRMQ extends Server { if (this.wildcardHandlers.size === 0) { return null; } - for (const [regex, handler] of this.wildcardHandlers) { - if (regex.test(pattern)) { + for (const [wildcardPattern, handler] of this.wildcardHandlers) { + if (this.matchRmqPattern(wildcardPattern, pattern)) { return handler; } } @@ -392,20 +410,46 @@ export class ServerRMQ extends Server { const handlers = this.getHandlers(); handlers.forEach((handler, pattern) => { - const regex = this.convertRoutingKeyToRegex(pattern); - if (regex) { - this.wildcardHandlers.set(regex, handler); + if ( + pattern.includes(RMQ_WILDCARD_ALL) || + pattern.includes(RMQ_WILDCARD_SINGLE) + ) { + this.wildcardHandlers.set(pattern, handler); } }); } - private convertRoutingKeyToRegex(routingKey: string): RegExp | undefined { - if (!routingKey.includes('#') && !routingKey.includes('*')) { - return; + private matchRmqPattern(pattern: string, routingKey: string): boolean { + if (!routingKey) { + return pattern === RMQ_WILDCARD_ALL; + } + + const patternSegments = pattern.split(RMQ_SEPARATOR); + const routingKeySegments = routingKey.split(RMQ_SEPARATOR); + + const patternSegmentsLength = patternSegments.length; + const routingKeySegmentsLength = routingKeySegments.length; + const lastIndex = patternSegmentsLength - 1; + + for (const [i, currentPattern] of patternSegments.entries()) { + const currentRoutingKey = routingKeySegments[i]; + + if (!currentRoutingKey && !currentPattern) { + continue; + } + if (!currentRoutingKey && currentPattern !== RMQ_WILDCARD_ALL) { + return false; + } + if (currentPattern === RMQ_WILDCARD_ALL) { + return i === lastIndex; + } + if ( + currentPattern !== RMQ_WILDCARD_SINGLE && + currentPattern !== currentRoutingKey + ) { + return false; + } } - let regexPattern = routingKey.replace(/\\/g, '\\\\').replace(/\./g, '\\.'); - regexPattern = regexPattern.replace(/\*/g, '[^.]+'); - regexPattern = regexPattern.replace(/#/g, '.*'); - return new RegExp(`^${regexPattern}$`); + return patternSegmentsLength === routingKeySegmentsLength; } } diff --git a/packages/microservices/server/server-tcp.ts b/packages/microservices/server/server-tcp.ts index f52f2c68664..acca2511d81 100644 --- a/packages/microservices/server/server-tcp.ts +++ b/packages/microservices/server/server-tcp.ts @@ -105,18 +105,26 @@ export class ServerTCP extends Server { }); return socket.sendMessage(noHandlerPacket); } - const response$ = this.transformToObservable( - await handler(packet.data, tcpContext), - ); - - response$ && - this.send(response$, data => { - Object.assign(data, { id: (packet as IncomingRequest).id }); - const outgoingResponse = this.serializer.serialize( - data as WritePacket & PacketId, + return this.onProcessingStartHook( + this.transportId, + tcpContext, + async () => { + const response$ = this.transformToObservable( + await handler(packet.data, tcpContext), ); - socket.sendMessage(outgoingResponse); - }); + + response$ && + this.send(response$, data => { + Object.assign(data, { id: (packet as IncomingRequest).id }); + const outgoingResponse = this.serializer.serialize( + data as WritePacket & PacketId, + ); + + this.onProcessingEndHook?.(this.transportId, tcpContext); + socket.sendMessage(outgoingResponse); + }); + }, + ); } public handleClose(): undefined | number | NodeJS.Timer { diff --git a/packages/microservices/server/server.ts b/packages/microservices/server/server.ts index 6969ffb6247..10b9e72445b 100644 --- a/packages/microservices/server/server.ts +++ b/packages/microservices/server/server.ts @@ -57,16 +57,21 @@ export abstract class Server< protected readonly logger: LoggerService = new Logger(Server.name); protected serializer: ConsumerSerializer; protected deserializer: ConsumerDeserializer; + protected onProcessingStartHook: ( + transportId: Transport | symbol, + context: BaseRpcContext, + done: () => Promise, + ) => void = ( + transportId: Transport | symbol, + context: BaseRpcContext, + done: () => Promise, + ) => done(); + protected onProcessingEndHook: ( + transportId: Transport | symbol, + context: BaseRpcContext, + ) => void; protected _status$ = new ReplaySubject(1); - /** - * Sets the transport identifier. - * @param transportId Unique transport identifier. - */ - public setTransportId(transportId: Transport | symbol): void { - this.transportId = transportId; - } - /** * Returns an observable that emits status changes. */ @@ -83,6 +88,7 @@ export abstract class Server< EventKey extends keyof EventsMap = keyof EventsMap, EventCallback extends EventsMap[EventKey] = EventsMap[EventKey], >(event: EventKey, callback: EventCallback): any; + /** * Returns an instance of the underlying server/broker instance, * or a group of servers if there are more than one. @@ -94,11 +100,42 @@ export abstract class Server< * @param callback Function to be called upon initialization */ public abstract listen(callback: (...optionalParams: unknown[]) => any): any; + /** * Method called when server is being terminated. */ public abstract close(): any; + /** + * Sets the transport identifier. + * @param transportId Unique transport identifier. + */ + public setTransportId(transportId: Transport | symbol): void { + this.transportId = transportId; + } + + /** + * Sets a hook that will be called when processing starts. + */ + public setOnProcessingStartHook( + hook: ( + transportId: Transport | symbol, + context: unknown, + done: () => Promise, + ) => void, + ): void { + this.onProcessingStartHook = hook; + } + + /** + * Sets a hook that will be called when processing ends. + */ + public setOnProcessingEndHook( + hook: (transportId: Transport | symbol, context: unknown) => void, + ): void { + this.onProcessingEndHook = hook; + } + public addHandler( pattern: any, callback: MessageHandler, @@ -177,14 +214,25 @@ export abstract class Server< if (!handler) { return this.logger.error(NO_EVENT_HANDLER`${pattern}`); } - const resultOrStream = await handler(packet.data, context); - if (isObservable(resultOrStream)) { - const connectableSource = connectable(resultOrStream, { - connector: () => new Subject(), - resetOnDisconnect: false, - }); - connectableSource.connect(); - } + return this.onProcessingStartHook(this.transportId!, context, async () => { + const resultOrStream = await handler(packet.data, context); + if (isObservable(resultOrStream)) { + const connectableSource = connectable( + resultOrStream.pipe( + finalize(() => + this.onProcessingEndHook?.(this.transportId!, context), + ), + ), + { + connector: () => new Subject(), + resetOnDisconnect: false, + }, + ); + connectableSource.connect(); + } else { + this.onProcessingEndHook?.(this.transportId!, context); + } + }); } public transformToObservable( diff --git a/packages/microservices/test/nest-microservice.spec.ts b/packages/microservices/test/nest-microservice.spec.ts index 1ee8277167a..804f1452234 100644 --- a/packages/microservices/test/nest-microservice.spec.ts +++ b/packages/microservices/test/nest-microservice.spec.ts @@ -1,11 +1,11 @@ -import { NestMicroservice } from '@nestjs/microservices/nest-microservice'; -import { Server, ServerTCP } from '@nestjs/microservices/server'; -import { GraphInspector } from '@nestjs/core/inspector/graph-inspector'; import { ApplicationConfig } from '@nestjs/core/application-config'; +import { GraphInspector } from '@nestjs/core/inspector/graph-inspector'; import { Transport } from '@nestjs/microservices/enums'; +import { AsyncMicroserviceOptions } from '@nestjs/microservices/interfaces'; +import { NestMicroservice } from '@nestjs/microservices/nest-microservice'; +import { Server, ServerTCP } from '@nestjs/microservices/server'; import { expect } from 'chai'; import * as sinon from 'sinon'; -import { AsyncMicroserviceOptions } from '@nestjs/microservices/interfaces'; const createMockGraphInspector = (): GraphInspector => ({ @@ -23,7 +23,10 @@ const createMockAppConfig = (): ApplicationConfig => const mockContainer = { getModuleCompiler: sinon.stub(), - getModules: () => new Map(), + getModules: () => + Object.assign(new Map(), { + addRpcTarget: sinon.spy(), + }), get: () => null, getHttpAdapterHost: () => undefined, } as any; diff --git a/packages/microservices/test/server/server-kafka.spec.ts b/packages/microservices/test/server/server-kafka.spec.ts index 5878e33be95..855299200cf 100644 --- a/packages/microservices/test/server/server-kafka.spec.ts +++ b/packages/microservices/test/server/server-kafka.spec.ts @@ -2,6 +2,7 @@ import { Logger } from '@nestjs/common'; import { AssertionError, expect } from 'chai'; import * as sinon from 'sinon'; import { NO_MESSAGE_HANDLER } from '../../constants'; +import { KafkaContext } from '../../ctx-host'; import { KafkaHeaders } from '../../enums'; import { EachMessagePayload, @@ -273,6 +274,7 @@ describe('ServerKafka', () => { }); describe('getPublisher', () => { + const context = new KafkaContext([] as any); let sendMessageStub: sinon.SinonStub; let publisher; @@ -281,15 +283,16 @@ describe('ServerKafka', () => { replyTopic, replyPartition, correlationId, + context, ); sendMessageStub = sinon .stub(server, 'sendMessage') .callsFake(async () => []); }); it(`should return function`, () => { - expect(typeof server.getPublisher(null!, null!, correlationId)).to.be.eql( - 'function', - ); + expect( + typeof server.getPublisher(null!, null!, correlationId, context), + ).to.be.eql('function'); }); it(`should call "publish" with expected arguments`, () => { const data = { @@ -411,10 +414,11 @@ describe('ServerKafka', () => { }); describe('sendMessage', () => { + const context = new KafkaContext([] as any); let sendSpy: sinon.SinonSpy; beforeEach(() => { - sendSpy = sinon.spy(); + sendSpy = sinon.stub().callsFake(() => Promise.resolve()); sinon.stub(server as any, 'producer').value({ send: sendSpy, }); @@ -429,6 +433,7 @@ describe('ServerKafka', () => { replyTopic, replyPartition, correlationId, + context, ); expect( @@ -455,6 +460,7 @@ describe('ServerKafka', () => { replyTopic, undefined, correlationId, + context, ); expect( @@ -480,6 +486,7 @@ describe('ServerKafka', () => { replyTopic, replyPartition, correlationId, + context, ); expect( @@ -507,6 +514,7 @@ describe('ServerKafka', () => { replyTopic, replyPartition, correlationId, + context, ); expect( diff --git a/packages/microservices/test/server/server-mqtt.spec.ts b/packages/microservices/test/server/server-mqtt.spec.ts index aa601021d66..9d0ea357fda 100644 --- a/packages/microservices/test/server/server-mqtt.spec.ts +++ b/packages/microservices/test/server/server-mqtt.spec.ts @@ -1,6 +1,7 @@ import { expect } from 'chai'; import * as sinon from 'sinon'; import { NO_MESSAGE_HANDLER } from '../../constants'; +import { MqttContext } from '../../ctx-host'; import { BaseRpcContext } from '../../ctx-host/base-rpc.context'; import { ServerMqtt } from '../../server/server-mqtt'; import { objectToMap } from './utils/object-to-map'; @@ -167,16 +168,19 @@ describe('ServerMqtt', () => { const id = '1'; const pattern = 'test'; + const context = new MqttContext([pattern, {}]); beforeEach(() => { publisherSpy = sinon.spy(); pub = { publish: publisherSpy, }; - publisher = server.getPublisher(pub, pattern, id); + publisher = server.getPublisher(pub, context, id); }); it(`should return function`, () => { - expect(typeof server.getPublisher(null, null, id)).to.be.eql('function'); + expect(typeof server.getPublisher(null, context, id)).to.be.eql( + 'function', + ); }); it(`should call "publish" with expected arguments`, () => { const respond = 'test'; diff --git a/packages/microservices/test/server/server-nats.spec.ts b/packages/microservices/test/server/server-nats.spec.ts index ef5a62800ad..47cf398455b 100644 --- a/packages/microservices/test/server/server-nats.spec.ts +++ b/packages/microservices/test/server/server-nats.spec.ts @@ -222,6 +222,7 @@ describe('ServerNats', () => { }); }); describe('getPublisher', () => { + const context = new NatsContext([] as any); const id = '1'; it(`should return function`, () => { @@ -231,7 +232,9 @@ describe('ServerNats', () => { sid: +id, respond: sinon.spy(), }; - expect(typeof server.getPublisher(natsMsg, id)).to.be.eql('function'); + expect(typeof server.getPublisher(natsMsg, id, context)).to.be.eql( + 'function', + ); }); it(`should call "respond" when reply topic provided`, () => { const replyTo = 'test'; @@ -242,7 +245,7 @@ describe('ServerNats', () => { respond: sinon.spy(), reply: replyTo, }; - const publisher = server.getPublisher(natsMsg, id); + const publisher = server.getPublisher(natsMsg, id, context); const respond = 'test'; publisher({ respond, id }); @@ -258,7 +261,7 @@ describe('ServerNats', () => { sid: +id, respond: sinon.spy(), }; - const publisher = server.getPublisher(natsMsg, id); + const publisher = server.getPublisher(natsMsg, id, context); const respond = 'test'; publisher({ respond, id }); diff --git a/packages/microservices/test/server/server-redis.spec.ts b/packages/microservices/test/server/server-redis.spec.ts index 428692f5304..402cf87bb9b 100644 --- a/packages/microservices/test/server/server-redis.spec.ts +++ b/packages/microservices/test/server/server-redis.spec.ts @@ -1,6 +1,7 @@ import { expect } from 'chai'; import * as sinon from 'sinon'; import { NO_MESSAGE_HANDLER } from '../../constants'; +import { RedisContext } from '../../ctx-host'; import { BaseRpcContext } from '../../ctx-host/base-rpc.context'; import { ServerRedis } from '../../server/server-redis'; import { objectToMap } from './utils/object-to-map'; @@ -172,16 +173,19 @@ describe('ServerRedis', () => { const id = '1'; const pattern = 'test'; + const context = new RedisContext([] as any); beforeEach(() => { publisherSpy = sinon.spy(); pub = { publish: publisherSpy, }; - publisher = server.getPublisher(pub, pattern, id); + publisher = server.getPublisher(pub, pattern, id, context); }); it(`should return function`, () => { - expect(typeof server.getPublisher(null, null, id)).to.be.eql('function'); + expect(typeof server.getPublisher(null, null, id, context)).to.be.eql( + 'function', + ); }); it(`should call "publish" with expected arguments`, () => { const respond = 'test'; diff --git a/packages/microservices/test/server/server-rmq.spec.ts b/packages/microservices/test/server/server-rmq.spec.ts index 5daa8717ffd..d3fa260551b 100644 --- a/packages/microservices/test/server/server-rmq.spec.ts +++ b/packages/microservices/test/server/server-rmq.spec.ts @@ -231,6 +231,8 @@ describe('ServerRMQ', () => { }); describe('sendMessage', () => { + const context = new RmqContext([] as any); + let channel: any; beforeEach(() => { @@ -245,7 +247,7 @@ describe('ServerRMQ', () => { const replyTo = 'test'; const correlationId = '0'; - server.sendMessage(message, replyTo, correlationId); + server.sendMessage(message, replyTo, correlationId, context); expect( channel.sendToQueue.calledWith( replyTo, @@ -306,4 +308,128 @@ describe('ServerRMQ', () => { expect(nack.calledWith(message, false, false)).not.to.be.true; }); }); + + describe('matchRmqPattern', () => { + let matchRmqPattern: (pattern: string, routingKey: string) => boolean; + + beforeEach(() => { + matchRmqPattern = untypedServer.matchRmqPattern.bind(untypedServer); + }); + + describe('exact matches', () => { + it('should match identical patterns', () => { + expect(matchRmqPattern('user.created', 'user.created')).to.be.true; + expect(matchRmqPattern('order.updated', 'order.updated')).to.be.true; + }); + + it('should not match different patterns', () => { + expect(matchRmqPattern('user.created', 'user.updated')).to.be.false; + expect(matchRmqPattern('order.created', 'user.created')).to.be.false; + }); + + it('should handle patterns with $ character (original issue)', () => { + expect( + matchRmqPattern('$internal.plugin.status', '$internal.plugin.status'), + ).to.be.true; + expect( + matchRmqPattern( + '$internal.plugin.0.status', + '$internal.plugin.0.status', + ), + ).to.be.true; + expect(matchRmqPattern('user.$special.event', 'user.$special.event')).to + .be.true; + }); + }); + + describe('single wildcard (*)', () => { + it('should match single segments', () => { + expect(matchRmqPattern('user.*', 'user.created')).to.be.true; + expect(matchRmqPattern('user.*', 'user.updated')).to.be.true; + expect(matchRmqPattern('*.created', 'user.created')).to.be.true; + expect(matchRmqPattern('*.created', 'order.created')).to.be.true; + }); + + it('should not match when segment counts differ', () => { + expect(matchRmqPattern('user.*', 'user.profile.created')).to.be.false; + expect(matchRmqPattern('*.created', 'user.profile.created')).to.be + .false; + }); + + it('should handle patterns with $ and *', () => { + expect( + matchRmqPattern( + '$internal.plugin.*.status', + '$internal.plugin.0.status', + ), + ).to.be.true; + expect( + matchRmqPattern( + '$internal.plugin.*.status', + '$internal.plugin.1.status', + ), + ).to.be.true; + expect(matchRmqPattern('$internal.*.status', '$internal.plugin.status')) + .to.be.true; + }); + + it('should handle multiple * wildcards', () => { + expect(matchRmqPattern('*.*.created', 'user.profile.created')).to.be + .true; + expect(matchRmqPattern('*.*.created', 'order.item.created')).to.be.true; + expect(matchRmqPattern('*.*.created', 'user.created')).to.be.false; + }); + }); + + describe('catch all wildcard (#)', () => { + it('should match when # is at the end', () => { + expect(matchRmqPattern('user.#', 'user.created')).to.be.true; + expect(matchRmqPattern('user.#', 'user.profile.created')).to.be.true; + expect(matchRmqPattern('user.#', 'user.profile.details.updated')).to.be + .true; + }); + + it('should handle patterns with $ and #', () => { + expect(matchRmqPattern('$internal.#', '$internal.plugin.status')).to.be + .true; + expect(matchRmqPattern('$internal.#', '$internal.plugin.0.status')).to + .be.true; + expect( + matchRmqPattern('$internal.plugin.#', '$internal.plugin.0.status'), + ).to.be.true; + }); + + it('should handle # at the beginning', () => { + expect(matchRmqPattern('#', 'user.created')).to.be.true; + expect(matchRmqPattern('#', 'user.profile.created')).to.be.true; + expect(matchRmqPattern('#', 'created')).to.be.true; + }); + }); + + describe('edge cases', () => { + it('should handle empty routing key', () => { + expect(matchRmqPattern('user.created', '')).to.be.false; + expect(matchRmqPattern('*', '')).to.be.false; + expect(matchRmqPattern('#', '')).to.be.true; + }); + + it('should handle single segments', () => { + expect(matchRmqPattern('user', 'user')).to.be.true; + expect(matchRmqPattern('*', 'user')).to.be.true; + expect(matchRmqPattern('#', 'user')).to.be.true; + }); + + it('should handle complex $ patterns that previously failed', () => { + expect( + matchRmqPattern( + '$exchange.*.routing.#', + '$exchange.topic.routing.key.test', + ), + ).to.be.true; + expect(matchRmqPattern('$sys.#', '$sys.broker.clients')).to.be.true; + expect(matchRmqPattern('$SYS.#', '$SYS.broker.load.messages.received')) + .to.be.true; + }); + }); + }); }); diff --git a/packages/platform-express/adapters/express-adapter.ts b/packages/platform-express/adapters/express-adapter.ts index 7339d81caef..454396ba076 100644 --- a/packages/platform-express/adapters/express-adapter.ts +++ b/packages/platform-express/adapters/express-adapter.ts @@ -54,9 +54,50 @@ export class ExpressAdapter extends AbstractHttpAdapter< private readonly routerMethodFactory = new RouterMethodFactory(); private readonly logger = new Logger(ExpressAdapter.name); private readonly openConnections = new Set(); + private onRequestHook?: ( + req: express.Request, + res: express.Response, + done: () => void, + ) => Promise | void; + private onResponseHook?: ( + req: express.Request, + res: express.Response, + ) => Promise | void; constructor(instance?: any) { super(instance || express()); + this.instance!.use((req, res, next) => { + if (this.onResponseHook) { + res.on('finish', () => { + void this.onResponseHook!.apply(this, [req, res]); + }); + } + + if (this.onRequestHook) { + void this.onRequestHook.apply(this, [req, res, next]); + } else { + next(); + } + }); + } + + public setOnRequestHook( + onRequestHook: ( + req: express.Request, + res: express.Response, + done: () => void, + ) => Promise | void, + ) { + this.onRequestHook = onRequestHook; + } + + public setOnResponseHook( + onResponseHook: ( + req: express.Request, + res: express.Response, + ) => Promise | void, + ) { + this.onResponseHook = onResponseHook; } public reply(response: any, body: any, statusCode?: number) { diff --git a/packages/platform-express/package.json b/packages/platform-express/package.json index 99986219ce4..c3042ef5007 100644 --- a/packages/platform-express/package.json +++ b/packages/platform-express/package.json @@ -1,6 +1,6 @@ { "name": "@nestjs/platform-express", - "version": "11.1.3", + "version": "11.1.4", "description": "Nest - modern, fast, powerful node.js web framework (@platform-express)", "author": "Kamil Mysliwiec", "license": "MIT", @@ -25,8 +25,8 @@ "tslib": "2.8.1" }, "devDependencies": { - "@nestjs/common": "11.1.3", - "@nestjs/core": "11.1.3" + "@nestjs/common": "11.1.4", + "@nestjs/core": "11.1.4" }, "peerDependencies": { "@nestjs/common": "^11.0.0", diff --git a/packages/platform-express/test/adapters/express-adapter.spec.ts b/packages/platform-express/test/adapters/express-adapter.spec.ts index 8970e117f9c..622b9e7aee9 100644 --- a/packages/platform-express/test/adapters/express-adapter.spec.ts +++ b/packages/platform-express/test/adapters/express-adapter.spec.ts @@ -19,6 +19,7 @@ describe('ExpressAdapter', () => { .returns(urlencodedInstance); const useSpy = sinon.spy(expressInstance, 'use'); const expressAdapter = new ExpressAdapter(expressInstance); + useSpy.resetHistory(); expressAdapter.registerParserMiddleware(); @@ -37,6 +38,7 @@ describe('ExpressAdapter', () => { expressInstance.use(function urlencodedParser() {}); const useSpy = sinon.spy(expressInstance, 'use'); const expressAdapter = new ExpressAdapter(expressInstance); + useSpy.resetHistory(); expressAdapter.registerParserMiddleware(); diff --git a/packages/platform-fastify/adapters/fastify-adapter.ts b/packages/platform-fastify/adapters/fastify-adapter.ts index 370a4e4c26f..8961208ab58 100644 --- a/packages/platform-fastify/adapters/fastify-adapter.ts +++ b/packages/platform-fastify/adapters/fastify-adapter.ts @@ -53,6 +53,7 @@ import { parse as querystringParse } from 'fast-querystring'; import { FASTIFY_ROUTE_CONFIG_METADATA, FASTIFY_ROUTE_CONSTRAINTS_METADATA, + FASTIFY_ROUTE_SCHEMA_METADATA, } from '../constants'; import { NestFastifyBodyParserOptions } from '../interfaces'; import { @@ -145,7 +146,18 @@ export class FastifyAdapter< protected _pathPrefix?: string; private _isParserRegistered: boolean; + private onRequestHook?: ( + request: TRequest, + reply: TReply, + done: (err?: Error) => void, + ) => void | Promise; + private onResponseHook?: ( + request: TRequest, + reply: TReply, + done: (err?: Error) => void, + ) => void | Promise; private isMiddieRegistered: boolean; + private pendingMiddlewares: Array<{ args: any[] }> = []; private versioningOptions?: VersioningOptions; private readonly versionConstraint = { name: 'version', @@ -249,6 +261,42 @@ export class FastifyAdapter< if ((instanceOrOptions as FastifyAdapterBaseOptions)?.skipMiddie) { this.isMiddieRegistered = true; } + + this.instance.addHook('onRequest', (request, reply, done) => { + if (this.onRequestHook) { + this.onRequestHook(request as TRequest, reply as TReply, done); + } else { + done(); + } + }); + + this.instance.addHook('onResponse', (request, reply, done) => { + if (this.onResponseHook) { + this.onResponseHook(request as TRequest, reply as TReply, done); + } else { + done(); + } + }); + } + + public setOnRequestHook( + hook: ( + request: TRequest, + reply: TReply, + done: (err?: Error) => void, + ) => void | Promise, + ) { + this.onRequestHook = hook; + } + + public setOnResponseHook( + hook: ( + request: TRequest, + reply: TReply, + done: (err?: Error) => void, + ) => void | Promise, + ) { + this.onResponseHook = hook; } public async init() { @@ -256,6 +304,14 @@ export class FastifyAdapter< return; } await this.registerMiddie(); + + // Register any pending middlewares that were added before init + if (this.pendingMiddlewares.length > 0) { + for (const { args } of this.pendingMiddlewares) { + (this.instance.use as any)(...args); + } + this.pendingMiddlewares = []; + } } public listen(port: string | number, callback?: () => void): void; @@ -670,6 +726,16 @@ export class FastifyAdapter< return 'fastify'; } + public use(...args: any[]) { + // Fastify requires @fastify/middie plugin to be registered before middleware can be used. + // If middie is not registered yet, we queue the middleware and register it later during init. + if (!this.isMiddieRegistered) { + this.pendingMiddlewares.push({ args }); + return this; + } + return (this.instance.use as any)(...args); + } + protected registerWithPrefix( factory: | FastifyPluginCallback @@ -752,9 +818,14 @@ export class FastifyAdapter< handlerRef, ); + const routeSchema = Reflect.getMetadata( + FASTIFY_ROUTE_SCHEMA_METADATA, + handlerRef, + ); + const hasConfig = !isUndefined(routeConfig); const hasConstraints = !isUndefined(routeConstraints); - + const hasSchema = !isUndefined(routeSchema); const routeToInject: RouteOptions & RouteShorthandOptions = { method: routerMethodKey, @@ -766,7 +837,7 @@ export class FastifyAdapter< this.instance.addHttpMethod(routerMethodKey, { hasBody: true }); } - if (isVersioned || hasConstraints || hasConfig) { + if (isVersioned || hasConstraints || hasConfig || hasSchema) { const isPathAndRouteTuple = args.length === 2; if (isPathAndRouteTuple) { const constraints = { @@ -783,6 +854,9 @@ export class FastifyAdapter< ...routeConfig, }, }), + ...(hasSchema && { + schema: routeSchema, + }), }; const routeToInjectWithOptions = { ...routeToInject, ...options }; diff --git a/packages/platform-fastify/constants.ts b/packages/platform-fastify/constants.ts index 2f00d8077f5..616f83bc942 100644 --- a/packages/platform-fastify/constants.ts +++ b/packages/platform-fastify/constants.ts @@ -1,3 +1,4 @@ export const FASTIFY_ROUTE_CONFIG_METADATA = '__fastify_route_config__'; export const FASTIFY_ROUTE_CONSTRAINTS_METADATA = '__fastify_route_constraints__'; +export const FASTIFY_ROUTE_SCHEMA_METADATA = '__fastify_route_schema__'; diff --git a/packages/platform-fastify/decorators/index.ts b/packages/platform-fastify/decorators/index.ts index 67cc9d3d817..fce3ca1f746 100644 --- a/packages/platform-fastify/decorators/index.ts +++ b/packages/platform-fastify/decorators/index.ts @@ -1,2 +1,3 @@ export * from './route-config.decorator'; export * from './route-constraints.decorator'; +export * from './route-schema.decorator'; diff --git a/packages/platform-fastify/decorators/route-schema.decorator.ts b/packages/platform-fastify/decorators/route-schema.decorator.ts new file mode 100644 index 00000000000..de22c46caf4 --- /dev/null +++ b/packages/platform-fastify/decorators/route-schema.decorator.ts @@ -0,0 +1,15 @@ +import { SetMetadata } from '@nestjs/common'; +import { FASTIFY_ROUTE_SCHEMA_METADATA } from '../constants'; +import { FastifySchema } from 'fastify'; + +/** + * @publicApi + * Allows setting the schema for the route. Schema is an object that can contain the following properties: + * - body: JsonSchema + * - querystring or query: JsonSchema + * - params: JsonSchema + * - response: Record + * @param schema See {@link https://fastify.dev/docs/latest/Reference/Routes/#routes-options} + */ +export const RouteSchema = (schema: FastifySchema) => + SetMetadata(FASTIFY_ROUTE_SCHEMA_METADATA, schema); diff --git a/packages/platform-fastify/package.json b/packages/platform-fastify/package.json index 3028e8c689e..1898651f245 100644 --- a/packages/platform-fastify/package.json +++ b/packages/platform-fastify/package.json @@ -1,6 +1,6 @@ { "name": "@nestjs/platform-fastify", - "version": "11.1.3", + "version": "11.1.4", "description": "Nest - modern, fast, powerful node.js web framework (@platform-fastify)", "author": "Kamil Mysliwiec", "license": "MIT", @@ -22,7 +22,7 @@ "@fastify/formbody": "8.0.2", "@fastify/middie": "9.0.3", "fast-querystring": "1.1.2", - "fastify": "5.3.3", + "fastify": "5.4.0", "light-my-request": "6.6.0", "path-to-regexp": "8.2.0", "tslib": "2.8.1" diff --git a/packages/platform-fastify/test/decorators/router-schema.decorator.spec.ts b/packages/platform-fastify/test/decorators/router-schema.decorator.spec.ts new file mode 100644 index 00000000000..22ff3471cb6 --- /dev/null +++ b/packages/platform-fastify/test/decorators/router-schema.decorator.spec.ts @@ -0,0 +1,17 @@ +import { expect } from 'chai'; +import { FASTIFY_ROUTE_SCHEMA_METADATA } from '../../constants'; +import { RouteSchema } from '../../decorators/route-schema.decorator'; + +describe('@RouteSchema', () => { + const routeSchema = { body: 'testValue' }; + class Test { + config; + @RouteSchema(routeSchema) + public static test() {} + } + + it('should enhance method with expected fastify route schema', () => { + const path = Reflect.getMetadata(FASTIFY_ROUTE_SCHEMA_METADATA, Test.test); + expect(path).to.be.eql(routeSchema); + }); +}); diff --git a/packages/platform-socket.io/package.json b/packages/platform-socket.io/package.json index b06e3ec8dff..61b94bb6a3e 100644 --- a/packages/platform-socket.io/package.json +++ b/packages/platform-socket.io/package.json @@ -1,6 +1,6 @@ { "name": "@nestjs/platform-socket.io", - "version": "11.1.3", + "version": "11.1.4", "description": "Nest - modern, fast, powerful node.js web framework (@platform-socket.io)", "author": "Kamil Mysliwiec", "license": "MIT", diff --git a/packages/platform-ws/package.json b/packages/platform-ws/package.json index 55d35b3667a..4d6164d7d37 100644 --- a/packages/platform-ws/package.json +++ b/packages/platform-ws/package.json @@ -1,6 +1,6 @@ { "name": "@nestjs/platform-ws", - "version": "11.1.3", + "version": "11.1.4", "description": "Nest - modern, fast, powerful node.js web framework (@platform-ws)", "author": "Kamil Mysliwiec", "license": "MIT", @@ -19,7 +19,7 @@ }, "dependencies": { "tslib": "2.8.1", - "ws": "8.18.2" + "ws": "8.18.3" }, "peerDependencies": { "@nestjs/common": "^11.0.0", diff --git a/packages/testing/package.json b/packages/testing/package.json index 514065c552c..769fce94043 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@nestjs/testing", - "version": "11.1.3", + "version": "11.1.4", "description": "Nest - modern, fast, powerful node.js web framework (@testing)", "author": "Kamil Mysliwiec", "license": "MIT", diff --git a/packages/testing/testing-injector.ts b/packages/testing/testing-injector.ts index 603544801c9..c5a783196b5 100644 --- a/packages/testing/testing-injector.ts +++ b/packages/testing/testing-injector.ts @@ -23,7 +23,7 @@ export class TestingInjector extends Injector { this.container = container; } - public async resolveComponentInstance( + public async resolveComponentWrapper( moduleRef: Module, name: any, dependencyContext: InjectorDependencyContext, @@ -33,7 +33,7 @@ export class TestingInjector extends Injector { keyOrIndex?: string | number, ): Promise { try { - const existingProviderWrapper = await super.resolveComponentInstance( + const existingProviderWrapper = await super.resolveComponentWrapper( moduleRef, name, dependencyContext, @@ -44,39 +44,72 @@ export class TestingInjector extends Injector { ); return existingProviderWrapper; } catch (err) { - if (this.mocker) { - const mockedInstance = this.mocker(name); - if (!mockedInstance) { - throw err; - } - const newWrapper = new InstanceWrapper({ - name, - isAlias: false, - scope: wrapper.scope, - instance: mockedInstance, - isResolved: true, - host: moduleRef, - metatype: wrapper.metatype, - }); - const internalCoreModule = this.container.getInternalCoreModuleRef(); - if (!internalCoreModule) { - throw new Error( - 'Expected to have internal core module reference at this point.', - ); - } + return this.mockWrapper(err, moduleRef, name, wrapper); + } + } - internalCoreModule.addCustomProvider( - { - provide: name, - useValue: mockedInstance, - }, - internalCoreModule.providers, - ); - internalCoreModule.addExportedProviderOrModule(name); - return newWrapper; - } else { - throw err; - } + public async resolveComponentHost( + moduleRef: Module, + instanceWrapper: InstanceWrapper, + contextId = STATIC_CONTEXT, + inquirer?: InstanceWrapper, + ): Promise { + try { + const existingProviderWrapper = await super.resolveComponentHost( + moduleRef, + instanceWrapper, + contextId, + inquirer, + ); + return existingProviderWrapper; + } catch (err) { + return this.mockWrapper( + err, + moduleRef, + instanceWrapper.name, + instanceWrapper, + ); } } + + private async mockWrapper( + err: Error, + moduleRef: Module, + name: any, + wrapper: InstanceWrapper, + ): Promise { + if (!this.mocker) { + throw err; + } + + const mockedInstance = this.mocker(name); + if (!mockedInstance) { + throw err; + } + const newWrapper = new InstanceWrapper({ + name, + isAlias: false, + scope: wrapper.scope, + instance: mockedInstance, + isResolved: true, + host: moduleRef, + metatype: wrapper.metatype, + }); + const internalCoreModule = this.container.getInternalCoreModuleRef(); + if (!internalCoreModule) { + throw new Error( + 'Expected to have internal core module reference at this point.', + ); + } + + internalCoreModule.addCustomProvider( + { + provide: name, + useValue: mockedInstance, + }, + internalCoreModule.providers, + ); + internalCoreModule.addExportedProviderOrModule(name); + return newWrapper; + } } diff --git a/packages/websockets/package.json b/packages/websockets/package.json index 54f418c27e6..e837e14cad6 100644 --- a/packages/websockets/package.json +++ b/packages/websockets/package.json @@ -1,6 +1,6 @@ { "name": "@nestjs/websockets", - "version": "11.1.3", + "version": "11.1.4", "description": "Nest - modern, fast, powerful node.js web framework (@websockets)", "author": "Kamil Mysliwiec", "license": "MIT", @@ -18,8 +18,8 @@ "tslib": "2.8.1" }, "devDependencies": { - "@nestjs/common": "11.1.3", - "@nestjs/core": "11.1.3" + "@nestjs/common": "11.1.4", + "@nestjs/core": "11.1.4" }, "peerDependencies": { "@nestjs/common": "^11.0.0", diff --git a/packages/websockets/web-sockets-controller.ts b/packages/websockets/web-sockets-controller.ts index 09677f4d871..bcacf245f2a 100644 --- a/packages/websockets/web-sockets-controller.ts +++ b/packages/websockets/web-sockets-controller.ts @@ -176,7 +176,6 @@ export class WebSocketsController { const adapter = this.config.getIoAdapter(); const handlers = subscribersMap.map(({ callback, message }) => ({ message, - callback: callback.bind(instance, client), })); adapter.bindMessageHandlers(client, handlers, data => diff --git a/sample/01-cats-app/package.json b/sample/01-cats-app/package.json index a8852b24223..4a9c0360825 100644 --- a/sample/01-cats-app/package.json +++ b/sample/01-cats-app/package.json @@ -19,9 +19,9 @@ "test:e2e": "jest --config ./e2e/jest-e2e.json" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "class-transformer": "0.5.1", "class-validator": "0.14.2", "reflect-metadata": "0.2.2", @@ -30,26 +30,26 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/02-gateways/package.json b/sample/02-gateways/package.json index 8b77b814e82..9e5ebea6180 100644 --- a/sample/02-gateways/package.json +++ b/sample/02-gateways/package.json @@ -19,11 +19,11 @@ "test:e2e": "jest --config ./e2e/jest-e2e.json" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", - "@nestjs/platform-socket.io": "11.1.2", - "@nestjs/websockets": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", + "@nestjs/platform-socket.io": "11.1.3", + "@nestjs/websockets": "11.1.3", "@socket.io/redis-adapter": "8.3.0", "class-transformer": "0.5.1", "class-validator": "0.14.2", @@ -34,28 +34,28 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "@types/ws": "8.5.13", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "redis": "5.5.5", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "redis": "5.6.0", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/03-microservices/package.json b/sample/03-microservices/package.json index 84f963e2e1a..5e1a4c3ed0f 100644 --- a/sample/03-microservices/package.json +++ b/sample/03-microservices/package.json @@ -19,10 +19,10 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/microservices": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/microservices": "11.1.3", + "@nestjs/platform-express": "11.1.3", "class-transformer": "0.5.1", "class-validator": "0.14.2", "reflect-metadata": "0.2.2", @@ -31,25 +31,25 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", + "@nestjs/testing": "11.1.3", "@types/amqplib": "0.10.7", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/04-grpc/package.json b/sample/04-grpc/package.json index eeb5c941aad..a9a9a98ed83 100644 --- a/sample/04-grpc/package.json +++ b/sample/04-grpc/package.json @@ -21,10 +21,10 @@ "dependencies": { "@grpc/grpc-js": "1.13.4", "@grpc/reflection": "1.0.4", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/microservices": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/microservices": "11.1.3", + "@nestjs/platform-express": "11.1.3", "class-transformer": "0.5.1", "class-validator": "0.14.2", "reflect-metadata": "0.2.2", @@ -33,24 +33,24 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/05-sql-typeorm/package.json b/sample/05-sql-typeorm/package.json index 060a726ae4f..4dd35ba2e1c 100644 --- a/sample/05-sql-typeorm/package.json +++ b/sample/05-sql-typeorm/package.json @@ -19,38 +19,38 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "@nestjs/typeorm": "11.0.0", - "mysql2": "3.14.1", + "mysql2": "3.14.2", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2", - "typeorm": "0.3.24" + "typeorm": "0.3.25" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/06-mongoose/package.json b/sample/06-mongoose/package.json index 3f8cde5921e..856528383f4 100644 --- a/sample/06-mongoose/package.json +++ b/sample/06-mongoose/package.json @@ -19,37 +19,37 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/mongoose": "11.0.3", - "@nestjs/platform-express": "11.1.2", - "mongoose": "8.15.1", + "@nestjs/platform-express": "11.1.3", + "mongoose": "8.16.3", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/07-sequelize/package.json b/sample/07-sequelize/package.json index 9b696d99d37..b1ca0cc5084 100644 --- a/sample/07-sequelize/package.json +++ b/sample/07-sequelize/package.json @@ -19,11 +19,11 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "@nestjs/sequelize": "11.0.0", - "mysql2": "3.14.1", + "mysql2": "3.14.2", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2", @@ -33,26 +33,26 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/08-webpack/package.json b/sample/08-webpack/package.json index 67165599436..4fffd0d2fc3 100644 --- a/sample/08-webpack/package.json +++ b/sample/08-webpack/package.json @@ -12,28 +12,28 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "reflect-metadata": "0.2.2", "rxjs": "7.8.2", "typescript": "5.7.3" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@types/node": "22.15.29", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "@types/node": "22.16.3", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "start-server-webpack-plugin": "2.2.5", "ts-loader": "9.5.2", "ts-node": "10.9.2", - "webpack": "5.99.9", + "webpack": "5.100.2", "webpack-cli": "6.0.1", "webpack-node-externals": "3.0.0", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/09-babel-example/package.json b/sample/09-babel-example/package.json index eb25c72e9ea..7f18c2d88cf 100644 --- a/sample/09-babel-example/package.json +++ b/sample/09-babel-example/package.json @@ -13,28 +13,28 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", - "@nestjs/microservices": "11.1.2", - "@nestjs/websockets": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", + "@nestjs/microservices": "11.1.3", + "@nestjs/websockets": "11.1.3", "reflect-metadata": "0.2.2", "rxjs": "7.8.2" }, "devDependencies": { - "@babel/cli": "7.27.2", - "@babel/core": "7.27.4", - "@babel/node": "7.27.1", - "@babel/plugin-proposal-decorators": "7.27.1", - "@babel/plugin-transform-runtime": "7.27.4", - "@babel/preset-env": "7.27.2", + "@babel/cli": "7.28.0", + "@babel/core": "7.28.0", + "@babel/node": "7.28.0", + "@babel/plugin-proposal-decorators": "7.28.0", + "@babel/plugin-transform-runtime": "7.28.0", + "@babel/preset-env": "7.28.0", "@babel/register": "7.27.1", "@babel/runtime": "7.27.6", - "@nestjs/testing": "11.1.2", + "@nestjs/testing": "11.1.3", "jest": "29.7.0", "nodemon": "3.1.10", - "prettier": "3.5.3", - "supertest": "7.1.1" + "prettier": "3.6.2", + "supertest": "7.1.3" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/10-fastify/package.json b/sample/10-fastify/package.json index 4b1b2a6e07d..1c97226e1ab 100644 --- a/sample/10-fastify/package.json +++ b/sample/10-fastify/package.json @@ -19,9 +19,9 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-fastify": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-fastify": "11.1.3", "class-transformer": "0.5.1", "class-validator": "0.14.2", "reflect-metadata": "0.2.2", @@ -30,23 +30,23 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/11-swagger/package.json b/sample/11-swagger/package.json index f9e83f85246..c5aa41c97b6 100644 --- a/sample/11-swagger/package.json +++ b/sample/11-swagger/package.json @@ -19,9 +19,9 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "@nestjs/swagger": "11.2.0", "class-transformer": "0.5.1", "class-validator": "0.14.2", @@ -31,24 +31,24 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/12-graphql-schema-first/package.json b/sample/12-graphql-schema-first/package.json index 2c428beb2da..75b3aa1b008 100644 --- a/sample/12-graphql-schema-first/package.json +++ b/sample/12-graphql-schema-first/package.json @@ -22,10 +22,10 @@ "@apollo/server": "4.12.2", "@graphql-tools/utils": "10.8.6", "@nestjs/apollo": "13.1.0", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/graphql": "13.1.0", - "@nestjs/platform-express": "11.1.2", + "@nestjs/platform-express": "11.1.3", "class-transformer": "0.5.1", "class-validator": "0.14.2", "graphql": "16.10.0", @@ -36,27 +36,27 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", - "ts-morph": "25.0.1", + "ts-morph": "26.0.0", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/13-mongo-typeorm/package.json b/sample/13-mongo-typeorm/package.json index 67f44252175..7cab4773742 100644 --- a/sample/13-mongo-typeorm/package.json +++ b/sample/13-mongo-typeorm/package.json @@ -19,38 +19,38 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "@nestjs/typeorm": "11.0.0", "mongodb": "6.17.0", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2", - "typeorm": "0.3.24" + "typeorm": "0.3.25" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/14-mongoose-base/package.json b/sample/14-mongoose-base/package.json index 5e547d29d5c..07b3775229c 100644 --- a/sample/14-mongoose-base/package.json +++ b/sample/14-mongoose-base/package.json @@ -19,36 +19,36 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", - "mongoose": "8.15.1", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", + "mongoose": "8.16.3", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/15-mvc/package.json b/sample/15-mvc/package.json index 293876d67ff..0e84ef47bbc 100644 --- a/sample/15-mvc/package.json +++ b/sample/15-mvc/package.json @@ -19,9 +19,9 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "hbs": "4.2.0", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", @@ -29,24 +29,24 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/16-gateways-ws/package.json b/sample/16-gateways-ws/package.json index cdd14fd8ff2..0ddf61035d9 100644 --- a/sample/16-gateways-ws/package.json +++ b/sample/16-gateways-ws/package.json @@ -19,11 +19,11 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", - "@nestjs/platform-ws": "11.1.2", - "@nestjs/websockets": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", + "@nestjs/platform-ws": "11.1.3", + "@nestjs/websockets": "11.1.3", "class-transformer": "0.5.1", "class-validator": "0.14.2", "rimraf": "6.0.1", @@ -34,24 +34,24 @@ "devDependencies": { "@types/ws": "8.5.13", "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/17-mvc-fastify/package.json b/sample/17-mvc-fastify/package.json index a5f7d3cefec..cc4188ea84f 100644 --- a/sample/17-mvc-fastify/package.json +++ b/sample/17-mvc-fastify/package.json @@ -19,9 +19,9 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-fastify": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-fastify": "11.1.3", "@fastify/static": "8.2.0", "handlebars": "4.7.8", "@fastify/view": "11.1.0", @@ -31,24 +31,24 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/18-context/package.json b/sample/18-context/package.json index 77e0b9466a2..b4d3d2dc566 100644 --- a/sample/18-context/package.json +++ b/sample/18-context/package.json @@ -19,30 +19,30 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/19-auth-jwt/package.json b/sample/19-auth-jwt/package.json index ff33ba4fe29..a0f8c58c59f 100644 --- a/sample/19-auth-jwt/package.json +++ b/sample/19-auth-jwt/package.json @@ -20,37 +20,37 @@ "test:e2e": "jest --config ./e2e/jest-e2e.json" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/jwt": "11.0.0", "@nestjs/passport": "11.0.5", - "@nestjs/platform-express": "11.1.2", + "@nestjs/platform-express": "11.1.3", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/20-cache/package.json b/sample/20-cache/package.json index 3c09a6e9358..c3c97d62d3f 100644 --- a/sample/20-cache/package.json +++ b/sample/20-cache/package.json @@ -20,10 +20,10 @@ }, "dependencies": { "@nestjs/cache-manager": "3.0.1", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", - "cache-manager": "6.4.3", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", + "cache-manager": "7.0.1", "class-transformer": "0.5.1", "class-validator": "0.14.2", "reflect-metadata": "0.2.2", @@ -31,26 +31,26 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-import": "2.31.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/21-serializer/package.json b/sample/21-serializer/package.json index 5c3065bf4ca..4e58740d0c6 100644 --- a/sample/21-serializer/package.json +++ b/sample/21-serializer/package.json @@ -19,9 +19,9 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "class-transformer": "0.5.1", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", @@ -29,26 +29,26 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-import": "2.31.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/22-graphql-prisma/package.json b/sample/22-graphql-prisma/package.json index 88bb663a9a9..59943abc885 100644 --- a/sample/22-graphql-prisma/package.json +++ b/sample/22-graphql-prisma/package.json @@ -22,11 +22,11 @@ "dependencies": { "@apollo/server": "4.12.2", "@nestjs/apollo": "13.1.0", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/graphql": "13.1.0", - "@nestjs/platform-express": "11.1.2", - "@prisma/client": "6.9.0", + "@nestjs/platform-express": "11.1.3", + "@prisma/client": "6.12.0", "class-transformer": "0.5.1", "class-validator": "0.14.2", "graphql": "16.10.0", @@ -37,30 +37,30 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "@typescript-eslint/eslint-plugin": "8.33.1", - "@typescript-eslint/parser": "8.33.1", - "eslint": "9.28.0", + "@typescript-eslint/eslint-plugin": "8.37.0", + "@typescript-eslint/parser": "8.37.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-import": "2.31.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", + "prettier": "3.6.2", "prisma": "^6.2.1", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", - "ts-morph": "25.0.1", + "ts-morph": "26.0.0", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/23-graphql-code-first/package.json b/sample/23-graphql-code-first/package.json index f1c0fa0aed7..4787d04b793 100644 --- a/sample/23-graphql-code-first/package.json +++ b/sample/23-graphql-code-first/package.json @@ -21,10 +21,10 @@ "dependencies": { "@apollo/server": "4.12.2", "@nestjs/apollo": "13.1.0", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/graphql": "13.1.0", - "@nestjs/platform-express": "11.1.2", + "@nestjs/platform-express": "11.1.3", "class-transformer": "0.5.1", "class-validator": "0.14.2", "graphql": "16.10.0", @@ -35,25 +35,25 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "eslint-plugin-import": "2.31.0", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "eslint-plugin-import": "2.32.0", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/24-serve-static/package.json b/sample/24-serve-static/package.json index 19e2876a7bf..7eded939ba9 100644 --- a/sample/24-serve-static/package.json +++ b/sample/24-serve-static/package.json @@ -19,10 +19,10 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/serve-static": "5.0.3", - "@nestjs/platform-express": "11.1.2", + "@nestjs/platform-express": "11.1.3", "class-transformer": "0.5.1", "class-validator": "0.14.2", "reflect-metadata": "0.2.2", @@ -31,24 +31,24 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } } diff --git a/sample/25-dynamic-modules/package.json b/sample/25-dynamic-modules/package.json index c23053eae1d..2bfb494204a 100644 --- a/sample/25-dynamic-modules/package.json +++ b/sample/25-dynamic-modules/package.json @@ -19,36 +19,36 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", - "dotenv": "16.5.0", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", + "dotenv": "17.2.0", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-import": "2.31.0", + "eslint-plugin-import": "2.32.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/26-queues/package.json b/sample/26-queues/package.json index 2322abce991..36e11c9bd4f 100644 --- a/sample/26-queues/package.json +++ b/sample/26-queues/package.json @@ -20,38 +20,38 @@ }, "dependencies": { "@nestjs/bull": "11.0.2", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "bull": "4.16.5", - "dotenv": "16.5.0", + "dotenv": "17.2.0", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", + "@nestjs/testing": "11.1.3", "@types/bull": "4.10.4", - "@types/express": "5.0.2", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-import": "2.31.0", + "eslint-plugin-import": "2.32.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/27-scheduling/package.json b/sample/27-scheduling/package.json index fc966bd5cce..9dbc420510e 100644 --- a/sample/27-scheduling/package.json +++ b/sample/27-scheduling/package.json @@ -19,38 +19,38 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "@nestjs/schedule": "6.0.0", - "dotenv": "16.5.0", + "dotenv": "17.2.0", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", + "@nestjs/testing": "11.1.3", "@types/bull": "4.10.4", - "@types/express": "5.0.2", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-import": "2.31.0", + "eslint-plugin-import": "2.32.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/28-sse/package.json b/sample/28-sse/package.json index 2fa3ee9433e..fd14cb06679 100644 --- a/sample/28-sse/package.json +++ b/sample/28-sse/package.json @@ -19,37 +19,37 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-import": "2.31.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/29-file-upload/package.json b/sample/29-file-upload/package.json index 69ad37d5259..b020f92b807 100644 --- a/sample/29-file-upload/package.json +++ b/sample/29-file-upload/package.json @@ -19,9 +19,9 @@ "test:e2e": "NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" jest --config ./e2e/jest-e2e.json" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", - "@nestjs/platform-express": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", + "@nestjs/platform-express": "11.1.3", "class-transformer": "0.5.1", "class-validator": "0.14.2", "reflect-metadata": "0.2.2", @@ -30,29 +30,29 @@ }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/multer": "1.4.12", - "@types/node": "22.15.29", + "@types/multer": "2.0.0", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-import": "2.31.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint-plugin-import": "2.32.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/30-event-emitter/package.json b/sample/30-event-emitter/package.json index 0bb59aa5dbe..13a36d7e701 100644 --- a/sample/30-event-emitter/package.json +++ b/sample/30-event-emitter/package.json @@ -19,36 +19,36 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/event-emitter": "3.0.1", - "@nestjs/platform-express": "11.1.2", + "@nestjs/platform-express": "11.1.3", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/31-graphql-federation-code-first/gateway/package.json b/sample/31-graphql-federation-code-first/gateway/package.json index bc7e4cfe6e3..3a8a2eea6ab 100644 --- a/sample/31-graphql-federation-code-first/gateway/package.json +++ b/sample/31-graphql-federation-code-first/gateway/package.json @@ -19,43 +19,43 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@apollo/gateway": "2.11.0", + "@apollo/gateway": "2.11.2", "@apollo/server": "4.12.2", "@nestjs/apollo": "13.1.0", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/graphql": "13.1.0", - "@nestjs/platform-express": "11.1.2", + "@nestjs/platform-express": "11.1.3", "graphql": "16.10.0", "graphql-tools": "9.0.18", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2", - "ts-morph": "25.0.1" + "ts-morph": "26.0.0" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1", - "webpack": "5.99.9" + "typescript-eslint": "8.37.0", + "webpack": "5.100.2" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/31-graphql-federation-code-first/posts-application/package.json b/sample/31-graphql-federation-code-first/posts-application/package.json index 8b8cb97964a..6340c9cb71a 100644 --- a/sample/31-graphql-federation-code-first/posts-application/package.json +++ b/sample/31-graphql-federation-code-first/posts-application/package.json @@ -20,43 +20,43 @@ }, "dependencies": { "@apollo/federation": "0.38.1", - "@apollo/gateway": "2.11.0", + "@apollo/gateway": "2.11.2", "@apollo/server": "4.12.2", - "@apollo/subgraph": "2.11.0", + "@apollo/subgraph": "2.11.2", "@nestjs/apollo": "13.1.0", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/graphql": "13.1.0", - "@nestjs/platform-express": "11.1.2", + "@nestjs/platform-express": "11.1.3", "graphql": "16.10.0", "graphql-tools": "9.0.18", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2", - "ts-morph": "25.0.1" + "ts-morph": "26.0.0" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-prettier": "5.4.1", + "eslint-plugin-prettier": "5.5.1", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/31-graphql-federation-code-first/users-application/package.json b/sample/31-graphql-federation-code-first/users-application/package.json index e499ba4f1a9..945c1dc1143 100644 --- a/sample/31-graphql-federation-code-first/users-application/package.json +++ b/sample/31-graphql-federation-code-first/users-application/package.json @@ -19,45 +19,45 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@apollo/gateway": "2.11.0", + "@apollo/gateway": "2.11.2", "@apollo/server": "4.12.2", - "@apollo/subgraph": "2.11.0", + "@apollo/subgraph": "2.11.2", "@nestjs/apollo": "13.1.0", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/graphql": "13.1.0", - "@nestjs/platform-express": "11.1.2", + "@nestjs/platform-express": "11.1.3", "graphql": "16.10.0", "graphql-tools": "9.0.18", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2", - "ts-morph": "25.0.1" + "ts-morph": "26.0.0" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "webpack": "5.99.9", - "typescript-eslint": "8.33.1" + "webpack": "5.100.2", + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/32-graphql-federation-schema-first/gateway/package.json b/sample/32-graphql-federation-schema-first/gateway/package.json index eab63720914..266d3e5e286 100644 --- a/sample/32-graphql-federation-schema-first/gateway/package.json +++ b/sample/32-graphql-federation-schema-first/gateway/package.json @@ -21,43 +21,43 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@apollo/gateway": "2.11.0", + "@apollo/gateway": "2.11.2", "@apollo/server": "^4.11.3", "@nestjs/apollo": "13.1.0", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/graphql": "13.1.0", - "@nestjs/platform-express": "11.1.2", + "@nestjs/platform-express": "11.1.3", "graphql": "16.10.0", "graphql-tools": "9.0.18", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2", - "ts-morph": "25.0.1" + "ts-morph": "26.0.0" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/32-graphql-federation-schema-first/posts-application/package.json b/sample/32-graphql-federation-schema-first/posts-application/package.json index 046e4471234..baa4e3ff95a 100644 --- a/sample/32-graphql-federation-schema-first/posts-application/package.json +++ b/sample/32-graphql-federation-schema-first/posts-application/package.json @@ -21,44 +21,44 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@apollo/gateway": "2.11.0", + "@apollo/gateway": "2.11.2", "@apollo/server": "^4.11.3", - "@apollo/subgraph": "2.11.0", + "@apollo/subgraph": "2.11.2", "@nestjs/apollo": "13.1.0", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/graphql": "13.1.0", - "@nestjs/platform-express": "11.1.2", + "@nestjs/platform-express": "11.1.3", "graphql": "16.10.0", "graphql-tools": "9.0.18", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2", - "ts-morph": "25.0.1" + "ts-morph": "26.0.0" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/32-graphql-federation-schema-first/users-application/package.json b/sample/32-graphql-federation-schema-first/users-application/package.json index 79c46264572..a027f0957e0 100644 --- a/sample/32-graphql-federation-schema-first/users-application/package.json +++ b/sample/32-graphql-federation-schema-first/users-application/package.json @@ -20,43 +20,43 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@apollo/gateway": "2.11.0", + "@apollo/gateway": "2.11.2", "@apollo/server": "^4.11.3", - "@apollo/subgraph": "2.11.0", + "@apollo/subgraph": "2.11.2", "@nestjs/apollo": "13.1.0", - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/graphql": "13.1.0", - "@nestjs/platform-express": "11.1.2", + "@nestjs/platform-express": "11.1.3", "graphql": "16.10.0", "graphql-tools": "9.0.18", "reflect-metadata": "0.2.2", "rimraf": "6.0.1", "rxjs": "7.8.2", - "ts-morph": "25.0.1" + "ts-morph": "26.0.0" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", "@types/jest": "29.5.14", - "@types/node": "22.15.29", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", - "eslint": "9.28.0", + "eslint": "9.31.0", "eslint-config-prettier": "10.1.5", - "eslint-plugin-prettier": "5.4.1", + "eslint-plugin-prettier": "5.5.1", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" }, "jest": { "moduleFileExtensions": [ diff --git a/sample/33-graphql-mercurius/package.json b/sample/33-graphql-mercurius/package.json index fad0c9e8fea..16feb2206a8 100644 --- a/sample/33-graphql-mercurius/package.json +++ b/sample/33-graphql-mercurius/package.json @@ -19,38 +19,38 @@ "test:e2e": "echo 'No e2e tests implemented yet.'" }, "dependencies": { - "@nestjs/common": "11.1.2", - "@nestjs/core": "11.1.2", + "@nestjs/common": "11.1.3", + "@nestjs/core": "11.1.3", "@nestjs/graphql": "13.1.0", "@nestjs/mercurius": "13.1.0", - "@nestjs/platform-fastify": "11.1.2", + "@nestjs/platform-fastify": "11.1.3", "class-transformer": "0.5.1", "class-validator": "0.14.2", "graphql": "16.10.0", - "mercurius": "16.1.0", + "mercurius": "16.2.0", "reflect-metadata": "0.2.2", "rxjs": "7.8.2" }, "devDependencies": { "@eslint/eslintrc": "3.3.1", - "@eslint/js": "9.28.0", + "@eslint/js": "9.31.0", "@nestjs/cli": "11.0.7", "@nestjs/schematics": "11.0.5", - "@nestjs/testing": "11.1.2", - "@types/express": "5.0.2", - "@types/node": "22.15.29", + "@nestjs/testing": "11.1.3", + "@types/express": "5.0.3", + "@types/node": "22.16.3", "@types/supertest": "6.0.3", "jest": "29.7.0", - "prettier": "3.5.3", - "supertest": "7.1.1", - "ts-jest": "29.3.4", + "prettier": "3.6.2", + "supertest": "7.1.3", + "ts-jest": "29.4.0", "ts-loader": "9.5.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", - "eslint": "9.28.0", - "eslint-plugin-prettier": "5.4.1", - "globals": "16.2.0", + "eslint": "9.31.0", + "eslint-plugin-prettier": "5.5.1", + "globals": "16.3.0", "typescript": "5.7.3", - "typescript-eslint": "8.33.1" + "typescript-eslint": "8.37.0" } }