From ba2fff9d7ef24519f88742dc8342424a2dc646fb Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 28 Oct 2026 12:53:21 +0000 Subject: [PATCH] feat(nest): support NestJS 12.3 node adapter Test @Implement against the official `@nestjs/platform-node` adapter alongside Express and Fastify (routing, params, response encoding, streaming cancellation, error handling, request limits, QUERY method). No runtime change is needed: the adapter hands over plain Node.js request/response objects and matches Express' body parsing and wildcard params. - add `@nestjs/platform-node` as an optional peer and dev dependency - bump NestJS dev dependencies to ^12.3.2 (package and playground) - include node request/response types in the interceptor's unions - mention the node adapter in docs and JSDoc Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VVaw7T6Psvs18kC5bRXJ2C --- apps/content/docs/integrations/nest.mdx | 2 +- packages/nest/package.json | 15 +- packages/nest/src/implement.test.ts | 45 ++-- packages/nest/src/implement.ts | 9 +- packages/nest/src/module.ts | 2 +- playgrounds/nest/package.json | 8 +- pnpm-lock.yaml | 294 ++++++++++++++++++++---- 7 files changed, 295 insertions(+), 80 deletions(-) diff --git a/apps/content/docs/integrations/nest.mdx b/apps/content/docs/integrations/nest.mdx index 1e8b3cf7c1..e33ceb39e4 100644 --- a/apps/content/docs/integrations/nest.mdx +++ b/apps/content/docs/integrations/nest.mdx @@ -286,7 +286,7 @@ export class AppModule {} ### `toNestStandardLazyRequest` option -By default, `@orpc/nest` supports the Express and Fastify adapters. If you use another adapter, you may need to customize how a NestJS request is converted into a standard request (including additional params). For details, see [Standard Server](https://github.com/middleapi/standard-server#request-and-response-types). +By default, `@orpc/nest` supports the Express, Fastify, and Node (`@nestjs/platform-node`, NestJS v12.3+) adapters. If you use another adapter, you may need to customize how a NestJS request is converted into a standard request (including additional params). For details, see [Standard Server](https://github.com/middleapi/standard-server#request-and-response-types). ```ts import { NestStandardLazyRequest } from '@orpc/nest' diff --git a/packages/nest/package.json b/packages/nest/package.json index 8dcaddcb31..013b548ccb 100644 --- a/packages/nest/package.json +++ b/packages/nest/package.json @@ -49,11 +49,15 @@ "peerDependencies": { "@nestjs/common": ">=11.1.27", "@nestjs/core": ">=11.1.27", + "@nestjs/platform-node": ">=12.3.0", "express": ">=5.2.1", "fastify": ">=5.8.5", "rxjs": ">=7.8.2" }, "peerDependenciesMeta": { + "@nestjs/platform-node": { + "optional": true + }, "express": { "optional": true }, @@ -72,11 +76,12 @@ }, "devDependencies": { "@fastify/cookie": "^11.1.3", - "@nestjs/common": "^12.1.3", - "@nestjs/core": "^12.1.3", - "@nestjs/platform-express": "^12.1.3", - "@nestjs/platform-fastify": "^12.1.3", - "@nestjs/testing": "^12.1.3", + "@nestjs/common": "^12.3.2", + "@nestjs/core": "^12.3.2", + "@nestjs/platform-express": "^12.3.2", + "@nestjs/platform-fastify": "^12.3.2", + "@nestjs/platform-node": "^12.3.2", + "@nestjs/testing": "^12.3.2", "@types/express": "^5.0.6", "express": "^5.3.0", "fastify": "^5.12.7", diff --git a/packages/nest/src/implement.test.ts b/packages/nest/src/implement.test.ts index 53e9877a02..6e41dc1d12 100644 --- a/packages/nest/src/implement.test.ts +++ b/packages/nest/src/implement.test.ts @@ -9,6 +9,7 @@ import FastifyCookie from '@fastify/cookie' import { Controller, HttpException, Req, Res, SetMetadata, StreamableFile, UseGuards, UseInterceptors } from '@nestjs/common' import { Reflector } from '@nestjs/core' import { FastifyAdapter } from '@nestjs/platform-fastify' +import { NodeAdapter } from '@nestjs/platform-node' import { Test } from '@nestjs/testing' import { meta, oc } from '@orpc/contract' import { openapi } from '@orpc/openapi' @@ -82,7 +83,10 @@ describe('requirements', () => { } }) - it('should support the QUERY HTTP method when QueryMethod is available (NestJS 11.2+)', async () => { + it.each([ + ['express adapter', undefined], + ['node adapter', new NodeAdapter()], + ] as const)('should support the QUERY HTTP method when QueryMethod is available (NestJS 11.2+) with %s', async (_, adapter) => { const contract = oc .meta(openapi({ path: '/query-route', @@ -102,7 +106,7 @@ describe('requirements', () => { controllers: [QueryController], }).compile() - const app = moduleRef.createNestApplication() + const app = moduleRef.createNestApplication(adapter as any) await app.init() await app.listen(0) @@ -374,6 +378,7 @@ describe('routing', () => { describe.each([ ['express adapter', undefined], ['fastify adapter', new FastifyAdapter()], + ['node adapter', new NodeAdapter()], ] as const)('with %s', async (_, adapter) => { const moduleRef = await Test.createTestingModule({ controllers: [Controller], @@ -382,7 +387,7 @@ describe('routing', () => { const app = moduleRef.createNestApplication(adapter as any) await app.init() - if (adapter) { + if (adapter instanceof FastifyAdapter) { await app.getHttpAdapter().getInstance().ready() } @@ -455,6 +460,7 @@ describe('routing', () => { describe.each([ ['express adapter', undefined], ['fastify adapter', new FastifyAdapter()], + ['node adapter', new NodeAdapter()], ] as const)('params edge cases with %s', async (_, adapter) => { const contract = { staticPath: oc.meta(openapi({ @@ -528,7 +534,7 @@ describe('routing', () => { const app = moduleRef.createNestApplication(adapter as any) await app.init() - if (adapter) { + if (adapter instanceof FastifyAdapter) { await app.getHttpAdapter().getInstance().ready() } @@ -604,6 +610,7 @@ describe('response status, headers and body should follow standard-server', () = describe.each([ ['express adapter', undefined], ['fastify adapter', new FastifyAdapter()], + ['node adapter', new NodeAdapter()], ] as const)('with %s', async (_, adapter) => { const routingInterceptor = vi.fn(({ next }) => next()) const moduleRef = await Test.createTestingModule({ @@ -630,6 +637,9 @@ describe('response status, headers and body should follow standard-server', () = const httpServer = app.getHttpServer() + // express and fastify append a charset to a content-type set by the response, the node adapter sends it as is + const charset = adapter instanceof NodeAdapter ? '' : '; charset=utf-8' + it('should response with output status', async () => { handler .mockResolvedValueOnce({ status: 202 }) @@ -685,7 +695,7 @@ describe('response status, headers and body should follow standard-server', () = await expect(supertest(httpServer).post('/response')).resolves.toSatisfy((res) => { expect(res.statusCode).toEqual(200) expect(res.headers['standard-server']).toBeUndefined() - expect(res.headers['content-type']).toEqual('application/json; charset=utf-8') + expect(res.headers['content-type']).toEqual(`application/json${charset}`) expect(res.text).toEqual('"string"') return true @@ -695,7 +705,7 @@ describe('response status, headers and body should follow standard-server', () = await expect(supertest(httpServer).post('/response')).resolves.toSatisfy((res) => { expect(res.statusCode).toEqual(200) expect(res.headers['standard-server']).toBeUndefined() - expect(res.headers['content-type']).toEqual('application/json; charset=utf-8') + expect(res.headers['content-type']).toEqual(`application/json${charset}`) expect(res.text).toEqual('null') return true @@ -705,7 +715,7 @@ describe('response status, headers and body should follow standard-server', () = await expect(supertest(httpServer).post('/response')).resolves.toSatisfy((res) => { expect(res.statusCode).toEqual(200) expect(res.headers['standard-server']).toBeUndefined() - expect(res.headers['content-type']).toEqual('application/json; charset=utf-8') + expect(res.headers['content-type']).toEqual(`application/json${charset}`) expect(res.text).toEqual('true') // do not stringify if possible @@ -718,7 +728,7 @@ describe('response status, headers and body should follow standard-server', () = await expect(supertest(httpServer).post('/response')).resolves.toSatisfy((res) => { expect(res.statusCode).toEqual(200) expect(res.headers['standard-server']).toBeUndefined() - expect(res.headers['content-type']).toEqual('application/json; charset=utf-8') + expect(res.headers['content-type']).toEqual(`application/json${charset}`) expect(res.text).toEqual('123') // do not stringify if possible @@ -731,7 +741,7 @@ describe('response status, headers and body should follow standard-server', () = await expect(supertest(httpServer).post('/response')).resolves.toSatisfy((res) => { expect(res.statusCode).toEqual(200) expect(res.headers['standard-server']).toBeUndefined() - expect(res.headers['content-type']).toEqual('application/json; charset=utf-8') + expect(res.headers['content-type']).toEqual(`application/json${charset}`) expect(res.text).toEqual('[1,2,3]') // do not stringify if possible @@ -744,7 +754,7 @@ describe('response status, headers and body should follow standard-server', () = await expect(supertest(httpServer).post('/response')).resolves.toSatisfy((res) => { expect(res.statusCode).toEqual(200) expect(res.headers['standard-server']).toBeUndefined() - expect(res.headers['content-type']).toEqual('application/json; charset=utf-8') + expect(res.headers['content-type']).toEqual(`application/json${charset}`) expect(res.text).toEqual('{"a":1,"b":2}') // do not stringify if possible @@ -972,7 +982,7 @@ describe('response status, headers and body should follow standard-server', () = { name: 'JSON with a JSON content-type', response: () => ({ headers: { ...headers, 'content-type': 'application/json' }, body: { a: 1 } }), - expected: { 'standard-server': undefined, 'content-type': 'application/json; charset=utf-8', 'content-length': '7' }, + expected: { 'standard-server': undefined, 'content-type': `application/json${charset}`, 'content-length': '7' }, text: '{"a":1}', }, { @@ -1081,6 +1091,7 @@ describe('error handling', () => { describe.each([ ['express adapter', undefined], ['fastify adapter', new FastifyAdapter()], + ['node adapter', new NodeAdapter()], ] as const)('with %s', async (_, adapter) => { const routingInterceptor = vi.fn(({ next }) => next()) const moduleRef = await Test.createTestingModule({ @@ -1105,12 +1116,15 @@ describe('error handling', () => { }()) await app.init() - if (adapter) { + if (adapter instanceof FastifyAdapter) { await app.getHttpAdapter().getInstance().ready() } const httpServer = app.getHttpServer() + // express and fastify append a charset to a content-type set by the response, the node adapter sends it as is + const charset = adapter instanceof NodeAdapter ? '' : '; charset=utf-8' + it('should throw HttpException for regular errors', async () => { const error = new ORPCError('NOT_FOUND', { data: 'test data' }) handler.mockRejectedValueOnce(error) @@ -1147,7 +1161,7 @@ describe('error handling', () => { { name: 'with', headers: { 'content-type': 'application/problem+json' }, - expected: { 'standard-server': 'json', 'content-type': 'application/problem+json; charset=utf-8' }, + expected: { 'standard-server': 'json', 'content-type': `application/problem+json${charset}` }, }, ])('should respect or override response headers of HttpException $name a content-type', async ({ headers, expected }) => { routingInterceptor.mockResolvedValueOnce({ @@ -1204,7 +1218,7 @@ describe('error handling', () => { await expect(supertest(httpServer).post('/error')).resolves.toSatisfy((res) => { expect(res.statusCode).toEqual(502) expect(res.text).toEqual('"text"') - expect(res.headers['content-type']).toEqual('application/json; charset=utf-8') + expect(res.headers['content-type']).toEqual(`application/json${charset}`) return true }) @@ -1789,6 +1803,7 @@ describe('compatibility', () => { describe.each([ ['express adapter', undefined], ['fastify adapter', new FastifyAdapter()], + ['node adapter', new NodeAdapter()], ] as const)('with %s', async (_, adapter) => { const moduleRef = await Test.createTestingModule({ controllers: [ImplController], @@ -1802,7 +1817,7 @@ describe('compatibility', () => { const app = moduleRef.createNestApplication(adapter as any) await app.init() - if (adapter) { + if (adapter instanceof FastifyAdapter) { await app.getHttpAdapter().getInstance().ready() } diff --git a/packages/nest/src/implement.ts b/packages/nest/src/implement.ts index 488a0d708f..52629acc76 100644 --- a/packages/nest/src/implement.ts +++ b/packages/nest/src/implement.ts @@ -1,4 +1,5 @@ import type { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common' +import type { NodeRequest, NodeResponse } from '@nestjs/platform-node' import type { AnyProcedureContract, RouterContract } from '@orpc/contract' import type { AnyProcedure, Context, ContractedRouter, DefaultInitialContext } from '@orpc/server' import type { ResolvedStandardHandlerHandleOptions, StandardHandlerCodec, StandardHandlerCodecResolvedProcedure } from '@orpc/server/standard' @@ -174,7 +175,7 @@ export class ImplementInterceptor implements NestInterceptor { this.codec = new NestHandlerCodec(this.config) this.handler = new StandardHandler(this.codec, this.config) - this.toNestStandardLazyRequest = this.config.toNestStandardLazyRequest ?? ((req: ExpressRequest | FastifyRequest, res: ExpressResponse | FastifyReply) => { + this.toNestStandardLazyRequest = this.config.toNestStandardLazyRequest ?? ((req: ExpressRequest | FastifyRequest | NodeRequest, res: ExpressResponse | FastifyReply | NodeResponse) => { const standardRequest: NestStandardLazyRequest = toStandardLazyRequest( 'raw' in req ? req.raw : req, 'raw' in res ? res.raw : res, @@ -202,8 +203,8 @@ export class ImplementInterceptor implements NestInterceptor { `) } - const req: ExpressRequest | FastifyRequest = ctx.switchToHttp().getRequest() - const res: ExpressResponse | FastifyReply = ctx.switchToHttp().getResponse() + const req: ExpressRequest | FastifyRequest | NodeRequest = ctx.switchToHttp().getRequest() + const res: ExpressResponse | FastifyReply | NodeResponse = ctx.switchToHttp().getResponse() const standardRequest = this.toNestStandardLazyRequest(req, res) @@ -384,7 +385,7 @@ function toORPCOpenAPIParams(contract: AnyProcedureContract, params: NestStandar // NullProtoObj prevents prototype injection when a param is named like `__proto__` const orpcParams: Record = new NullProtoObj() - // express use `path` while fastify use `*` for rest matching + // express and node use `path` while fastify uses `*` for rest matching const restKey = Object.hasOwn(params, '*') ? '*' : 'path' for (const [key, value] of Object.entries(params)) { diff --git a/packages/nest/src/module.ts b/packages/nest/src/module.ts index db22641442..1680b02fc3 100644 --- a/packages/nest/src/module.ts +++ b/packages/nest/src/module.ts @@ -32,7 +32,7 @@ export type ORPCModuleConfig & { /** * Customize how to convert NestJS `req` and `res` to {@link NestStandardLazyRequest}. - * You might need to define this if you are not using express or fastify adapters. + * You might need to define this if you are not using the express, fastify or node adapters. */ toNestStandardLazyRequest?: ((req: any, res: any) => NestStandardLazyRequest) | undefined diff --git a/playgrounds/nest/package.json b/playgrounds/nest/package.json index 092ac14c4e..0e2a176803 100644 --- a/playgrounds/nest/package.json +++ b/playgrounds/nest/package.json @@ -12,11 +12,11 @@ }, "devDependencies": { "@nestjs/cli": "^12.0.8", - "@nestjs/common": "^12.1.3", - "@nestjs/core": "^12.1.3", - "@nestjs/platform-express": "^12.1.3", + "@nestjs/common": "^12.3.2", + "@nestjs/core": "^12.3.2", + "@nestjs/platform-express": "^12.3.2", "@nestjs/schematics": "^12.0.7", - "@nestjs/testing": "^12.1.3", + "@nestjs/testing": "^12.3.2", "@opentelemetry/api": "^1.9.1", "@opentelemetry/exporter-trace-otlp-http": "^0.223.0", "@opentelemetry/instrumentation": "^0.223.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f55523e499..f35226edac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -789,20 +789,23 @@ importers: specifier: ^11.1.3 version: 11.1.3 '@nestjs/common': - specifier: ^12.1.3 - version: 12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) + specifier: ^12.3.2 + version: 12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) '@nestjs/core': - specifier: ^12.1.3 - version: 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + specifier: ^12.3.2 + version: 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.3.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/platform-express': - specifier: ^12.1.3 - version: 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)(supports-color@10.2.2) + specifier: ^12.3.2 + version: 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2)(supports-color@10.2.2) '@nestjs/platform-fastify': - specifier: ^12.1.3 - version: 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3) + specifier: ^12.3.2 + version: 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2) + '@nestjs/platform-node': + specifier: ^12.3.2 + version: 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2)(supports-color@10.2.2) '@nestjs/testing': - specifier: ^12.1.3 - version: 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)(@nestjs/platform-express@12.1.3) + specifier: ^12.3.2 + version: 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2)(@nestjs/platform-express@12.3.2) '@types/express': specifier: ^5.0.6 version: 5.0.6 @@ -1350,20 +1353,20 @@ importers: specifier: ^12.0.8 version: 12.0.8(@swc/core@1.16.18(@swc/helpers@0.5.23))(@types/node@26.6.5)(fork-ts-checker-webpack-plugin@9.1.0(typescript@6.0.3)(webpack@5.106.2(@swc/core@1.16.18(@swc/helpers@0.5.23))(cssnano@7.1.9(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)))(prettier@3.9.6)(ts-loader@9.6.2(typescript@6.0.3)(webpack@5.106.2(@swc/core@1.16.18(@swc/helpers@0.5.23))(cssnano@7.1.9(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)))(tsconfig-paths-webpack-plugin@4.2.0)(webpack-node-externals@3.0.0)(webpack@5.106.2(@swc/core@1.16.18(@swc/helpers@0.5.23))(cssnano@7.1.9(postcss@8.5.26))(csso@5.0.5)(esbuild@0.28.2)(lightningcss@1.33.0)(postcss@8.5.26)) '@nestjs/common': - specifier: ^12.1.3 - version: 12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) + specifier: ^12.3.2 + version: 12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) '@nestjs/core': - specifier: ^12.1.3 - version: 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + specifier: ^12.3.2 + version: 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.3.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/platform-express': - specifier: ^12.1.3 - version: 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)(supports-color@10.2.2) + specifier: ^12.3.2 + version: 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2)(supports-color@10.2.2) '@nestjs/schematics': specifier: ^12.0.7 version: 12.0.7(chokidar@5.0.0)(prettier@3.9.6)(typescript@6.0.3) '@nestjs/testing': - specifier: ^12.1.3 - version: 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)(@nestjs/platform-express@12.1.3) + specifier: ^12.3.2 + version: 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2)(@nestjs/platform-express@12.3.2) '@opentelemetry/api': specifier: ^1.9.1 version: 1.9.1 @@ -2728,6 +2731,9 @@ packages: '@fastify/cors@11.3.1': resolution: {integrity: sha512-gZXNzd6FLHzOIfvoK4+Az3Wko2V6Y0MIsLxpyo4AEYl7a9q1JBPwPaxLea4nkr++8FCiJiPpYYo6E02uZW0dqw==} + '@fastify/deepmerge@3.2.4': + resolution: {integrity: sha512-kc8GQq5gX9RRhw0rov3DMrN8wS8yRlxJRdDzsYwwdBV/wazuVgc/1K7CKL90tlvu3RlHan6Y0R0aE3nJtBz2eQ==} + '@fastify/error@4.2.0': resolution: {integrity: sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ==} @@ -2743,12 +2749,15 @@ packages: '@fastify/merge-json-schemas@0.2.1': resolution: {integrity: sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A==} - '@fastify/middie@9.3.5': - resolution: {integrity: sha512-oY1Yp/UfwS/qcmSV4PgOEqlTxHytRWSjl5MB07hDhlKfecAwJ4TQ7zBxdX2AWAuq+xbfPXM7EgH7EwOIQ2fSPA==} + '@fastify/middie@9.3.6': + resolution: {integrity: sha512-Uvl+1tDXriJsNv3GvC7IDKFVOvNGnsXp+YC6hxKKeMK/00L3NWzmNftI02nHz0xU0VPQlUbESHuGsUNIfn6CVQ==} '@fastify/proxy-addr@5.1.0': resolution: {integrity: sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw==} + '@fastify/proxy-addr@5.1.2': + resolution: {integrity: sha512-uqB4QsgVoro0XDC+DIftIMGXHdBPn+lK6Ek3xXAIxPMCJfqxnbtyEoMCm2KPUVOuIosd7Cyw9HawEqMFM/UA+g==} + '@floating-ui/core@1.8.0': resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==} @@ -3343,6 +3352,19 @@ packages: class-validator: optional: true + '@nestjs/common@12.3.2': + resolution: {integrity: sha512-XPNu75rXiDBuQ/EECiA0urFJ7bAycA1/xTrKnKct5vEF7A5FE0LyOem/EhRZI0Cq1xAGPDuTB89sFMqeSPWjzQ==} + peerDependencies: + class-transformer: '>=0.4.1' + class-validator: '>=0.13.2' + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + '@nestjs/core@12.1.3': resolution: {integrity: sha512-uHv2LPVewOnt5ZxSsDI11Vku9Gt1mdL0OWy/JOfXH1D5pV/HaPRGfreHPfYsO/bsyvZxdWVqFfAaFxvop6mFhw==} engines: {node: '>= 20'} @@ -3361,14 +3383,32 @@ packages: '@nestjs/websockets': optional: true - '@nestjs/platform-express@12.1.3': - resolution: {integrity: sha512-3C9tjF2VJOTAjl4ATZXksMFIbH4dwyX5EyZA+9SK3CreFr8FwOSMyha+YgAMSKECLlOIBhHUeYmTwT761iKlOQ==} + '@nestjs/core@12.3.2': + resolution: {integrity: sha512-lCDN5iC4BoG9k5Sk/tG2EF4VAtoZABFjN4e0nk9xKK3ytD4eSMc9ma1Y092t/navenlf3roTtCDUZ/RIHzYjCw==} + engines: {node: '>= 20'} + peerDependencies: + '@nestjs/common': ^12.0.0 + '@nestjs/microservices': ^12.0.0 + '@nestjs/platform-express': ^12.0.0 + '@nestjs/websockets': ^12.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + + '@nestjs/platform-express@12.3.2': + resolution: {integrity: sha512-wbe1zd6xWLW8qI6t3RP3SqqQnp32pVAfXKqttcp/geL5ys6xw6c/HkASXLNvwlf7IzMLxnpqANtHHwcF4waqRA==} peerDependencies: '@nestjs/common': ^12.0.0 '@nestjs/core': ^12.0.0 - '@nestjs/platform-fastify@12.1.3': - resolution: {integrity: sha512-EsuTZWif+siVW2MUQd/hL7R+iGbdQZODxcz9Opo6vfjJ9ncN1ta4FPYJ7DFsQrafNk5VKXsfpRIDpNBvusl6cg==} + '@nestjs/platform-fastify@12.3.2': + resolution: {integrity: sha512-/zca9SXmyB5OrnQf+wrWslT5uYcu8LKsTjhW4TKxfmxHssbyzKRHv6Uo2a9KBPKNlTWh+UvtlUkz1YRD3ityZQ==} peerDependencies: '@fastify/multipart': ^10.1.0 '@fastify/static': ^10.1.2 @@ -3383,6 +3423,12 @@ packages: '@fastify/view': optional: true + '@nestjs/platform-node@12.3.2': + resolution: {integrity: sha512-woyG5CMX5E0PXiXk5RvObQ8GddG2WXVA9kjgf10c2lmEnSv16D8QarMmf8mKOOa460JPAWoC3Ycmd12zOFWJPg==} + peerDependencies: + '@nestjs/common': ^12.0.0 + '@nestjs/core': ^12.0.0 + '@nestjs/schematics@12.0.7': resolution: {integrity: sha512-zSzJVhsmn/m+vp28sRneq1N+GcNwzHOEfFpm6llOeZTPYnAN6UVpzSAaA2+AYqZtAgo3HB+eTOzkbwQVyBlb4g==} engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} @@ -3393,8 +3439,8 @@ packages: prettier: optional: true - '@nestjs/testing@12.1.3': - resolution: {integrity: sha512-bs+lebFzObxZC9kf7j2+46RGZ2yNXpHvc1NHWglJaQOhaWDAm7lblTwYygwwKlTu6ttlOfxi/9f8zlCexd/G+w==} + '@nestjs/testing@12.3.2': + resolution: {integrity: sha512-l1m+uHTp4hJ1K+Gw8ENrLSj2TxZlKVre7aoluUdxMHCodK2kZnpjvD8H8Oh460hj/Z6PDJ/m9r6t8NIK6OyDxA==} peerDependencies: '@nestjs/common': ^12.0.0 '@nestjs/core': ^12.0.0 @@ -5793,6 +5839,10 @@ packages: resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} engines: {node: '>=18'} + '@tokenizer/inflate@0.5.2': + resolution: {integrity: sha512-3AZIuReWQ7i916s/UWAzy4V4k2wrkAZLW2sTi448W3w7Hz5uoc+Y7h+cnwzr0cwrwf3PsC5xKsH8MOl0NRltlg==} + engines: {node: '>=18'} + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -8428,6 +8478,10 @@ packages: resolution: {integrity: sha512-sEB0oStmeLGtpmSAD88RDNuLsvhv4iC3u0lE25CUvfCULvj49xoQ3l3K525Vn+ZzsZ6DOLajQCV6RmhwwhqiJg==} engines: {node: '>=22'} + file-type@22.2.0: + resolution: {integrity: sha512-XmEVJsRpQMVYC+sWFW+FKAVo2P7/lPctDdWH4UQ1r6oxhdrTobnowdM3z+ZJ93a4J8D3yDpxX0bEvRuFev0vUQ==} + engines: {node: '>=22'} + file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -8442,6 +8496,10 @@ packages: resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} engines: {node: '>= 18.0.0'} + find-my-way@9.10.0: + resolution: {integrity: sha512-eru+uCPQ2g+nLBkf84MHP/KyNNMar0BDy0j+i8Fb72GF9/YHBZ58q7FODUtfVV7XU9nfRUHXSmaM8NmZcIbZ4Q==} + engines: {node: '>=20'} + find-my-way@9.9.0: resolution: {integrity: sha512-sJsgZ1sQH2UDuowPuMKg8az7Qc8F0jnj+SKkFWU/+T0xcFlgV5skgXOGUqmQzOdmW6ALA7AhJINWx3qFBkbLHA==} engines: {node: '>=20'} @@ -9381,6 +9439,9 @@ packages: light-my-request@6.6.0: resolution: {integrity: sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A==} + light-my-request@6.8.0: + resolution: {integrity: sha512-5Q8PjoSEdtGIB8fikZsTem5vgRo4F2mR6vUKTDW/H1g6MtAt8e3duQbg/QxL5yzg6BZhor2KOUm3hhWMWLTZwg==} + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -9995,8 +10056,8 @@ packages: muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} - multer@2.4.0: - resolution: {integrity: sha512-7dqa0ZcFfzbefdTuIkzOSMvZWC0J7FLqBOjJUZvDCXShIURWKxAyTT1wHhnE5q19c7jOJf43IYYKjBmZVZmvhg==} + multer@2.5.0: + resolution: {integrity: sha512-BsqOzYGVq49JcW2IzoSAxeKYRevb+dGGPPWleOR8Lrlk4igwxu1/9pwSXlByhCb7MVZDrNJFC0IBP5/O5nLYRw==} engines: {node: '>= 10.16.0'} mute-stream@3.0.0: @@ -10777,6 +10838,10 @@ packages: resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} + qs@6.16.0: + resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==} + engines: {node: '>=0.6'} + qs@6.16.1: resolution: {integrity: sha512-5Px6J7rfHBAGUhNQ3es4YzcOdBBw0SDcVtThJml4RdnKw4tKs2epA0kPZ+K8X+WiHktT93RHVcQ/3ym5aTCgtg==} engines: {node: '>=0.6'} @@ -11569,6 +11634,10 @@ packages: resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} engines: {node: '>=18'} + strtok3@10.6.3: + resolution: {integrity: sha512-MD8mENgyXMr2mDaDfzP3RWYDSyYQxIIou7HhCiCJiBekrsoDtUG0id3vYnjDfY9ndOEbazFXe13Qw6u/1AB8ew==} + engines: {node: '>=18'} + style-mod@4.1.3: resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} @@ -11992,6 +12061,10 @@ packages: resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} engines: {node: '>=18'} + uint8array-extras@1.6.0: + resolution: {integrity: sha512-8iAasVS4wUx0gPLjH8Xtz2PeDzTSiy8QiLGu2DT3X5GU+egFEQhpnbtkehbAwjvDcxIERmCYcysiODFmE3Ud0Q==} + engines: {node: '>=18'} + ultrahtml@1.7.0: resolution: {integrity: sha512-2xRd0VHoAQE4M+vF/DvFFB7pUV0ZxTW1TLi7lHQWnF/Sb5TPeEUV/l+hxcNnGO00ZXGnR0voCMmYRKQf+rvJ2g==} @@ -13970,6 +14043,8 @@ snapshots: fastify-plugin: 6.0.0 toad-cache: 3.7.4 + '@fastify/deepmerge@3.2.4': {} + '@fastify/error@4.2.0': {} '@fastify/fast-json-stringify-compiler@5.1.0': @@ -13987,7 +14062,7 @@ snapshots: dependencies: dequal: 2.0.3 - '@fastify/middie@9.3.5': + '@fastify/middie@9.3.6': dependencies: '@fastify/error': 4.2.0 fastify-plugin: 6.0.0 @@ -14000,6 +14075,11 @@ snapshots: '@fastify/forwarded': 3.0.2 ipaddr.js: 2.5.0 + '@fastify/proxy-addr@5.1.2': + dependencies: + '@fastify/forwarded': 3.0.2 + ipaddr.js: 2.5.0 + '@floating-ui/core@1.8.0': dependencies: '@floating-ui/utils': 0.2.12 @@ -14607,8 +14687,22 @@ snapshots: uid: 2.0.2 transitivePeerDependencies: - supports-color + optional: true - '@nestjs/core@12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2)': + '@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2)': + dependencies: + '@standard-schema/spec': 1.1.0 + file-type: 22.2.0(supports-color@10.2.2) + iterare: 1.2.1 + load-esm: 1.0.3 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + transitivePeerDependencies: + - supports-color + + '@nestjs/core@12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.3.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: '@nestjs/common': 12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) fast-safe-stringify: 2.1.1 @@ -14619,34 +14713,86 @@ snapshots: tslib: 2.8.1 uid: 2.0.2 optionalDependencies: - '@nestjs/platform-express': 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)(supports-color@10.2.2) + '@nestjs/platform-express': 12.3.2(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)(supports-color@10.2.2) + optional: true + + '@nestjs/core@12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.3.2)(reflect-metadata@0.2.2)(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) + fast-safe-stringify: 2.1.1 + iterare: 1.2.1 + path-to-regexp: 8.4.2 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + optionalDependencies: + '@nestjs/platform-express': 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2)(supports-color@10.2.2) - '@nestjs/platform-express@12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)(supports-color@10.2.2)': + '@nestjs/platform-express@12.3.2(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)(supports-color@10.2.2)': dependencies: '@nestjs/common': 12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) - '@nestjs/core': 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.3.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) cors: 2.8.6 - express: 5.2.1(supports-color@10.2.2) - multer: 2.4.0 + express: 5.3.0(supports-color@10.2.2) + multer: 2.5.0 path-to-regexp: 8.4.2 tslib: 2.8.1 transitivePeerDependencies: - supports-color + optional: true - '@nestjs/platform-fastify@12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)': + '@nestjs/platform-express@12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2)(supports-color@10.2.2)': + dependencies: + '@nestjs/common': 12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) + '@nestjs/core': 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.3.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + cors: 2.8.6 + express: 5.3.0(supports-color@10.2.2) + multer: 2.5.0 + path-to-regexp: 8.4.2 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@nestjs/platform-fastify@12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2)': dependencies: '@fastify/cors': 11.3.1 '@fastify/formbody': 9.0.1 - '@fastify/middie': 9.3.5 - '@nestjs/common': 12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) - '@nestjs/core': 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@fastify/middie': 9.3.6 + '@nestjs/common': 12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) + '@nestjs/core': 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.3.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) fast-querystring: 1.1.2 - fastify: 5.12.5 - find-my-way: 9.9.0 - light-my-request: 6.6.0 + fastify: 5.12.7 + find-my-way: 9.10.0 + light-my-request: 6.8.0 path-to-regexp: 8.4.2 tslib: 2.8.1 + '@nestjs/platform-node@12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2)(supports-color@10.2.2)': + dependencies: + '@fastify/proxy-addr': 5.1.2 + '@nestjs/common': 12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) + '@nestjs/core': 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.3.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) + content-type: 2.1.0 + cookie: 0.7.2 + cookie-signature: 1.2.2 + cors: 2.8.6 + encodeurl: 2.0.0 + fast-querystring: 1.1.2 + find-my-way: 9.10.0 + mime-types: 3.0.2 + multer: 2.5.0 + on-finished: 2.4.1 + path-to-regexp: 8.4.2 + qs: 6.16.0 + secure-json-parse: 4.1.0 + send: 1.2.1(supports-color@10.2.2) + serve-static: 2.2.1(supports-color@10.2.2) + tslib: 2.8.1 + type-is: 2.1.0 + transitivePeerDependencies: + - supports-color + '@nestjs/schematics@12.0.7(chokidar@5.0.0)(prettier@3.9.6)(typescript@6.0.3)': dependencies: '@angular-devkit/core': 22.2.2(chokidar@5.0.0) @@ -14660,13 +14806,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/testing@12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)(@nestjs/platform-express@12.1.3)': + '@nestjs/testing@12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2)(@nestjs/platform-express@12.3.2)': dependencies: - '@nestjs/common': 12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) - '@nestjs/core': 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/common': 12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) + '@nestjs/core': 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.3.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) tslib: 2.8.1 optionalDependencies: - '@nestjs/platform-express': 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)(supports-color@10.2.2) + '@nestjs/platform-express': 12.3.2(@nestjs/common@12.3.2(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.3.2)(supports-color@10.2.2) '@next/env@16.4.1': {} @@ -17515,6 +17661,15 @@ snapshots: token-types: 6.1.2 transitivePeerDependencies: - supports-color + optional: true + + '@tokenizer/inflate@0.5.2(supports-color@10.2.2)': + dependencies: + debug: 4.4.3(supports-color@10.2.2) + strtok3: 10.6.3 + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color '@tokenizer/token@0.3.0': {} @@ -19474,7 +19629,8 @@ snapshots: consola@3.4.2: {} - content-disposition@1.1.0: {} + content-disposition@1.1.0: + optional: true content-disposition@2.0.1: {} @@ -20609,7 +20765,7 @@ snapshots: evlog@2.32.0(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/core@12.1.3)(@orpc/server@packages+server)(ai@7.0.141(zod@4.6.7))(express@5.2.1(supports-color@10.2.2))(fastify@5.12.5)(h3@1.15.11)(hono@4.13.5)(next@16.4.1(@babel/core@7.29.7(supports-color@10.2.2))(@opentelemetry/api@1.9.1)(@types/node@26.6.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.3.1(react@19.3.1))(react@19.3.1))(ofetch@1.5.1)(react@19.3.1)(vite@8.3.4(@types/node@26.6.5)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.51.1)(yaml@2.9.0)): optionalDependencies: '@nestjs/common': 12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2) - '@nestjs/core': 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.1.3)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 12.1.3(@nestjs/common@12.1.3(reflect-metadata@0.2.2)(rxjs@7.8.2)(supports-color@10.2.2))(@nestjs/platform-express@12.3.2)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@orpc/server': link:packages/server ai: 7.0.141(zod@4.6.7) express: 5.2.1(supports-color@10.2.2) @@ -20678,6 +20834,7 @@ snapshots: vary: 1.1.2 transitivePeerDependencies: - supports-color + optional: true express@5.3.0(supports-color@10.2.2): dependencies: @@ -20797,6 +20954,7 @@ snapshots: secure-json-parse: 4.1.0 semver: 7.8.5 toad-cache: 3.7.4 + optional: true fastify@5.12.7: dependencies: @@ -20849,6 +21007,16 @@ snapshots: uint8array-extras: 1.5.0 transitivePeerDependencies: - supports-color + optional: true + + file-type@22.2.0(supports-color@10.2.2): + dependencies: + '@tokenizer/inflate': 0.5.2(supports-color@10.2.2) + strtok3: 10.6.3 + token-types: 6.1.2 + uint8array-extras: 1.6.0 + transitivePeerDependencies: + - supports-color file-uri-to-path@1.0.0: {} @@ -20871,6 +21039,12 @@ snapshots: transitivePeerDependencies: - supports-color + find-my-way@9.10.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 5.1.1 + find-my-way@9.9.0: dependencies: fast-deep-equal: 3.1.3 @@ -21925,6 +22099,13 @@ snapshots: process-warning: 4.0.1 set-cookie-parser: 2.7.2 + light-my-request@6.8.0: + dependencies: + '@fastify/deepmerge': 3.2.4 + cookie: 2.0.1 + process-warning: 5.1.0 + set-cookie-parser: 3.1.2 + lightningcss-android-arm64@1.32.0: optional: true @@ -22716,7 +22897,7 @@ snapshots: muggle-string@0.4.1: {} - multer@2.4.0: + multer@2.5.0: dependencies: append-field: 1.0.0 busboy: 1.6.0 @@ -23544,6 +23725,11 @@ snapshots: es-define-property: 1.0.1 side-channel: 1.1.1 + qs@6.16.0: + dependencies: + es-define-property: 1.0.1 + side-channel: 1.1.1 + qs@6.16.1: dependencies: es-define-property: 1.0.1 @@ -24523,6 +24709,11 @@ snapshots: strtok3@10.3.5: dependencies: '@tokenizer/token': 0.3.0 + optional: true + + strtok3@10.6.3: + dependencies: + '@tokenizer/token': 0.3.0 style-mod@4.1.3: {} @@ -25039,7 +25230,10 @@ snapshots: dependencies: '@lukeed/csprng': 1.1.0 - uint8array-extras@1.5.0: {} + uint8array-extras@1.5.0: + optional: true + + uint8array-extras@1.6.0: {} ultrahtml@1.7.0: {}