diff --git a/package.json b/package.json index 94895ab7..922f28a9 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ }, "peerDependencies": { "@trpc/server": "^11.1.0", - "zod": "^4.0.0", + "zod": "^3.25.0 || ^4.0.0", "zod-openapi": "^5.0.1" }, "dependencies": { diff --git a/src/adapters/node-http/core.ts b/src/adapters/node-http/core.ts index a2774540..2d0f8ec0 100644 --- a/src/adapters/node-http/core.ts +++ b/src/adapters/node-http/core.ts @@ -5,7 +5,8 @@ import { type NodeHTTPResponse, } from '@trpc/server/adapters/node-http'; import { getErrorShape, TRPCRequestInfo } from '@trpc/server/unstable-core-do-not-import'; -import { ZodArray, ZodError, ZodTypeAny } from 'zod'; +import { ZodArray } from 'zod/v4'; +import type { ZodError } from 'zod/v4'; import { NodeHTTPRequest } from '../../types'; import { generateOpenApiDocument } from '../../generator'; import { diff --git a/src/generator/index.ts b/src/generator/index.ts index df389ab8..92edf23d 100644 --- a/src/generator/index.ts +++ b/src/generator/index.ts @@ -1,5 +1,5 @@ import { ZodOpenApiObject, ZodOpenApiPathsObject, createDocument } from 'zod-openapi'; -import { ZodSchema } from 'zod'; +import type { ZodSchema } from 'zod/v4'; import { OpenApiMeta, diff --git a/src/generator/schema.ts b/src/generator/schema.ts index a278ccc2..7930b005 100644 --- a/src/generator/schema.ts +++ b/src/generator/schema.ts @@ -1,5 +1,6 @@ import { TRPCError } from '@trpc/server'; -import { ZodObject, ZodAny, z } from 'zod'; +import { z } from 'zod/v4'; +import type { ZodObject, ZodAny } from 'zod/v4'; import { ZodOpenApiContentObject, ZodOpenApiParameters, diff --git a/src/types.ts b/src/types.ts index bc8cf0b7..3ba293af 100644 --- a/src/types.ts +++ b/src/types.ts @@ -7,7 +7,7 @@ import type { RouterRecord, } from '@trpc/server/unstable-core-do-not-import'; import { IncomingMessage } from 'http'; -import type { ZodObject } from 'zod'; +import type { ZodObject } from 'zod/v4'; import type { $ZodIssue } from 'zod/v4/core'; export { type OpenAPIObject, type SecuritySchemeObject } from 'openapi3-ts/oas31'; diff --git a/src/utils/procedure.ts b/src/utils/procedure.ts index 0568640f..1ba78da5 100644 --- a/src/utils/procedure.ts +++ b/src/utils/procedure.ts @@ -1,5 +1,6 @@ import { TRPCProcedureType } from '@trpc/server'; -import { ZodObject, z } from 'zod'; +import { z } from 'zod/v4'; +import type { ZodObject } from 'zod/v4'; import { OpenApiMeta, OpenApiProcedure, OpenApiProcedureRecord } from '../types'; diff --git a/src/utils/zod.ts b/src/utils/zod.ts index ae58f180..7e553316 100644 --- a/src/utils/zod.ts +++ b/src/utils/zod.ts @@ -1,4 +1,5 @@ -import { ZodObject, ZodRawShape, ZodType, z } from 'zod'; +import { z } from 'zod/v4'; +import type { ZodObject, ZodRawShape, ZodType } from 'zod/v4'; import type { $ZodType, $ZodTypes } from 'zod/v4/core'; import type { $ZodTypeDef } from 'zod/v4/core/schemas'; diff --git a/test/adapters/express.test.ts b/test/adapters/express.test.ts index cd7a8ba4..abbaa295 100644 --- a/test/adapters/express.test.ts +++ b/test/adapters/express.test.ts @@ -1,7 +1,7 @@ import { initTRPC } from '@trpc/server'; import express from 'express'; import fetch from 'node-fetch'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { CreateOpenApiExpressMiddlewareOptions, diff --git a/test/adapters/fastify.test.ts b/test/adapters/fastify.test.ts index 2fb4cd46..15b67483 100644 --- a/test/adapters/fastify.test.ts +++ b/test/adapters/fastify.test.ts @@ -1,7 +1,7 @@ import { initTRPC } from '@trpc/server'; import fastify from 'fastify'; import fetch from 'node-fetch'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { CreateOpenApiFastifyPluginOptions, diff --git a/test/adapters/fetch.test.ts b/test/adapters/fetch.test.ts index e103cada..c309ff91 100644 --- a/test/adapters/fetch.test.ts +++ b/test/adapters/fetch.test.ts @@ -1,7 +1,7 @@ import { TRPCError, initTRPC } from '@trpc/server'; import fetch from 'node-fetch'; import superjson from 'superjson'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { CreateOpenApiFetchHandlerOptions, diff --git a/test/adapters/koa.test.ts b/test/adapters/koa.test.ts index 1c1ce410..f79eb622 100644 --- a/test/adapters/koa.test.ts +++ b/test/adapters/koa.test.ts @@ -1,7 +1,7 @@ import { initTRPC } from '@trpc/server'; import Koa from 'koa'; import fetch from 'node-fetch'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { CreateOpenApiKoaMiddlewareOptions, diff --git a/test/adapters/next.test.ts b/test/adapters/next.test.ts index e02b350a..b5f3e939 100644 --- a/test/adapters/next.test.ts +++ b/test/adapters/next.test.ts @@ -3,7 +3,7 @@ import { NextApiRequest, NextApiResponse } from 'next'; import { IncomingHttpHeaders, IncomingMessage } from 'http'; import { NextApiRequestCookies, NextApiRequestQuery } from 'next/dist/server/api-utils'; import { Socket } from 'net'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { CreateOpenApiNextHandlerOptions, diff --git a/test/adapters/nuxt.test.ts b/test/adapters/nuxt.test.ts index 40c5d728..c4db5356 100644 --- a/test/adapters/nuxt.test.ts +++ b/test/adapters/nuxt.test.ts @@ -2,7 +2,7 @@ import { initTRPC } from '@trpc/server'; import { H3Event } from 'h3'; import httpMocks, { RequestMethod } from 'node-mocks-http'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { CreateOpenApiNuxtHandlerOptions, diff --git a/test/adapters/standalone.test.ts b/test/adapters/standalone.test.ts index 0903c387..9c9bcecb 100644 --- a/test/adapters/standalone.test.ts +++ b/test/adapters/standalone.test.ts @@ -4,7 +4,7 @@ import { createHTTPHandler } from '@trpc/server/adapters/standalone'; import { Server } from 'http'; import fetch from 'node-fetch'; import superjson from 'superjson'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { CreateOpenApiHttpHandlerOptions, diff --git a/test/generator.test.ts b/test/generator.test.ts index cd22eeb8..c5576530 100644 --- a/test/generator.test.ts +++ b/test/generator.test.ts @@ -1,6 +1,6 @@ import { initTRPC } from '@trpc/server'; import { observable } from '@trpc/server/observable'; -import { z } from 'zod'; +import { z } from 'zod/v4'; import { GenerateOpenApiDocumentOptions, OpenApiMeta, generateOpenApiDocument } from '../src'; import * as zodUtils from '../src/utils/zod'; @@ -3165,7 +3165,12 @@ describe('generator', () => { .input( z .object({ name: z.string() }) - .meta({ examples: { Lily: { name: 'Lily' }, John: { name: 'John' } } }), + // zod-openapi v5 types `meta.examples` as `unknown[]`, but its runtime + // still accepts the v3-style named-record form used here (and emits it + // through to the output schema verbatim — see snapshot below). + .meta({ + examples: { Lily: { name: 'Lily' }, John: { name: 'John' } } as unknown as unknown[], + }), ) .output(z.object({ output: z.string() })) .mutation(({ input }) => ({