From e88d40c8f5c30e4637214d252129949ab36f4f92 Mon Sep 17 00:00:00 2001 From: unnoq Date: Mon, 14 Jul 2025 16:26:40 +0700 Subject: [PATCH] feat(zod): promote zod4 converter to stable --- README.md | 2 +- apps/content/docs/openapi/getting-started.md | 4 +--- .../docs/openapi/openapi-specification.md | 2 +- .../docs/openapi/plugins/openapi-reference.md | 4 +--- .../src/smart-coercion-plugin.test.ts | 2 +- packages/openapi/src/openapi-generator.test.ts | 2 +- packages/zod/README.md | 2 +- .../zod/src/zod4/converter.components.test.ts | 2 +- packages/zod/src/zod4/converter.test.ts | 2 +- packages/zod/src/zod4/converter.ts | 18 +++++++++--------- packages/zod/tests/shared.ts | 2 +- playgrounds/astro/src/pages/api/[...rest].ts | 2 +- playgrounds/contract-first/src/main.ts | 2 +- .../nest/src/reference/reference.service.ts | 2 +- .../next/src/app/api/[[...rest]]/route.ts | 2 +- playgrounds/nuxt/server/routes/api/[...].ts | 2 +- .../solid-start/src/routes/api/[...rest].ts | 2 +- .../src/routes/api/[...rest]/+server.ts | 2 +- playgrounds/tanstack-start/src/routes/api/$.ts | 2 +- 19 files changed, 27 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index a04ce9534..9e47eca5a 100644 --- a/README.md +++ b/README.md @@ -177,7 +177,7 @@ This is a quick overview of how to use oRPC. For more details, please refer to t ```ts import { OpenAPIGenerator } from '@orpc/openapi' - import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '@orpc/zod/zod4' + import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' const generator = new OpenAPIGenerator({ schemaConverters: [new ZodToJsonSchemaConverter()] diff --git a/apps/content/docs/openapi/getting-started.md b/apps/content/docs/openapi/getting-started.md index bf4dab6ed..7846876f0 100644 --- a/apps/content/docs/openapi/getting-started.md +++ b/apps/content/docs/openapi/getting-started.md @@ -171,9 +171,7 @@ Just a small tweak makes your oRPC API OpenAPI-compliant! ```ts twoslash import { OpenAPIGenerator } from '@orpc/openapi' -import { - experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter -} from '@orpc/zod/zod4' +import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' import { router } from './shared/planet' const generator = new OpenAPIGenerator({ diff --git a/apps/content/docs/openapi/openapi-specification.md b/apps/content/docs/openapi/openapi-specification.md index dead4d350..ab2880b01 100644 --- a/apps/content/docs/openapi/openapi-specification.md +++ b/apps/content/docs/openapi/openapi-specification.md @@ -72,7 +72,7 @@ import { ZodToJsonSchemaConverter } from '@orpc/zod' // <-- zod v3 import { - experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter + ZodToJsonSchemaConverter } from '@orpc/zod/zod4' // <-- zod v4 import { experimental_ValibotToJsonSchemaConverter as ValibotToJsonSchemaConverter diff --git a/apps/content/docs/openapi/plugins/openapi-reference.md b/apps/content/docs/openapi/plugins/openapi-reference.md index 89c69a39c..07721765c 100644 --- a/apps/content/docs/openapi/plugins/openapi-reference.md +++ b/apps/content/docs/openapi/plugins/openapi-reference.md @@ -14,9 +14,7 @@ This plugin relies on the [OpenAPI Generator](/docs/openapi/openapi-specificatio ## Setup ```ts -import { - experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter -} from '@orpc/zod/zod4' +import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' import { OpenAPIReferencePlugin } from '@orpc/openapi/plugins' const handler = new OpenAPIHandler(router, { diff --git a/packages/json-schema/src/smart-coercion-plugin.test.ts b/packages/json-schema/src/smart-coercion-plugin.test.ts index 33ba307aa..092d53e4d 100644 --- a/packages/json-schema/src/smart-coercion-plugin.test.ts +++ b/packages/json-schema/src/smart-coercion-plugin.test.ts @@ -1,5 +1,5 @@ import * as z from 'zod' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '../../zod/src/zod4' +import { ZodToJsonSchemaConverter } from '../../zod/src/zod4' import { experimental_SmartCoercionPlugin as SmartCoercionPlugin } from './smart-coercion-plugin' describe('smartCoercionPlugin', () => { diff --git a/packages/openapi/src/openapi-generator.test.ts b/packages/openapi/src/openapi-generator.test.ts index 2d1e992a6..9b9c82dbc 100644 --- a/packages/openapi/src/openapi-generator.test.ts +++ b/packages/openapi/src/openapi-generator.test.ts @@ -1,7 +1,7 @@ import type { AnyContractProcedure } from '@orpc/contract' import { eventIterator, oc } from '@orpc/contract' import * as z from 'zod' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '../../zod/src/zod4' +import { ZodToJsonSchemaConverter } from '../../zod/src/zod4' import { customOpenAPIOperation } from './openapi-custom' import { OpenAPIGenerator } from './openapi-generator' diff --git a/packages/zod/README.md b/packages/zod/README.md index 09a7dd072..50b2febc2 100644 --- a/packages/zod/README.md +++ b/packages/zod/README.md @@ -86,7 +86,7 @@ const Example = z.object({ ```ts import { OpenAPIGenerator } from '@orpc/openapi' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '@orpc/zod/zod4' +import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' const openAPIGenerator = new OpenAPIGenerator({ schemaConverters: [new ZodToJsonSchemaConverter()], diff --git a/packages/zod/src/zod4/converter.components.test.ts b/packages/zod/src/zod4/converter.components.test.ts index 74bf14aab..9d5d068f0 100644 --- a/packages/zod/src/zod4/converter.components.test.ts +++ b/packages/zod/src/zod4/converter.components.test.ts @@ -1,5 +1,5 @@ import { z } from 'zod/v4' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from './converter' +import { ZodToJsonSchemaConverter } from './converter' const User = z.object({ id: z.string(), diff --git a/packages/zod/src/zod4/converter.test.ts b/packages/zod/src/zod4/converter.test.ts index 28e160b07..c16c3110f 100644 --- a/packages/zod/src/zod4/converter.test.ts +++ b/packages/zod/src/zod4/converter.test.ts @@ -1,7 +1,7 @@ import * as z from 'zod/v4' import * as zm from 'zod/v4-mini' import { - experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter, + ZodToJsonSchemaConverter, } from './converter' describe('zodToJsonSchemaConverter', () => { diff --git a/packages/zod/src/zod4/converter.ts b/packages/zod/src/zod4/converter.ts index 7e94af590..175ff6aee 100644 --- a/packages/zod/src/zod4/converter.ts +++ b/packages/zod/src/zod4/converter.ts @@ -39,7 +39,7 @@ import { experimental_JSON_SCHEMA_REGISTRY as JSON_SCHEMA_REGISTRY, } from './registries' -export interface experimental_ZodToJsonSchemaConverterOptions { +export interface ZodToJsonSchemaConverterOptions { /** * Max depth of lazy type. * @@ -85,15 +85,15 @@ export interface experimental_ZodToJsonSchemaConverterOptions { >[] } -export class experimental_ZodToJsonSchemaConverter implements ConditionalSchemaConverter { - private readonly maxLazyDepth: Exclude - private readonly maxStructureDepth: Exclude - private readonly anyJsonSchema: Exclude - private readonly unsupportedJsonSchema: Exclude - private readonly undefinedJsonSchema: Exclude - private readonly interceptors: Exclude +export class ZodToJsonSchemaConverter implements ConditionalSchemaConverter { + private readonly maxLazyDepth: Exclude + private readonly maxStructureDepth: Exclude + private readonly anyJsonSchema: Exclude + private readonly unsupportedJsonSchema: Exclude + private readonly undefinedJsonSchema: Exclude + private readonly interceptors: Exclude - constructor(options: experimental_ZodToJsonSchemaConverterOptions = {}) { + constructor(options: ZodToJsonSchemaConverterOptions = {}) { this.maxLazyDepth = options.maxLazyDepth ?? 2 this.maxStructureDepth = options.maxStructureDepth ?? 10 this.anyJsonSchema = options.anyJsonSchema ?? {} diff --git a/packages/zod/tests/shared.ts b/packages/zod/tests/shared.ts index 6faa84218..f8fa4c354 100644 --- a/packages/zod/tests/shared.ts +++ b/packages/zod/tests/shared.ts @@ -2,7 +2,7 @@ import type { AnySchema } from '@orpc/contract' import type { JSONSchema } from '@orpc/openapi' import { experimental_ZodSmartCoercionPlugin as ZodSmartCoercionPlugin, - experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter, + ZodToJsonSchemaConverter, } from '../src/zod4' export interface SchemaConverterTestCase { diff --git a/playgrounds/astro/src/pages/api/[...rest].ts b/playgrounds/astro/src/pages/api/[...rest].ts index a052fadd2..2e49d8bd8 100644 --- a/playgrounds/astro/src/pages/api/[...rest].ts +++ b/playgrounds/astro/src/pages/api/[...rest].ts @@ -1,7 +1,7 @@ import '../../polyfill' import { OpenAPIHandler } from '@orpc/openapi/fetch' import { onError } from '@orpc/server' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '@orpc/zod/zod4' +import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' import { experimental_SmartCoercionPlugin as SmartCoercionPlugin } from '@orpc/json-schema' import { OpenAPIReferencePlugin } from '@orpc/openapi/plugins' import { router } from '../../router' diff --git a/playgrounds/contract-first/src/main.ts b/playgrounds/contract-first/src/main.ts index 3cd2ef81c..630bdc86f 100644 --- a/playgrounds/contract-first/src/main.ts +++ b/playgrounds/contract-first/src/main.ts @@ -2,7 +2,7 @@ import { createServer } from 'node:http' import { OpenAPIHandler } from '@orpc/openapi/node' import { onError } from '@orpc/server' import { RPCHandler } from '@orpc/server/node' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '@orpc/zod/zod4' +import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' import { experimental_SmartCoercionPlugin as SmartCoercionPlugin } from '@orpc/json-schema' import { router } from './router' import { OpenAPIReferencePlugin } from '@orpc/openapi/plugins' diff --git a/playgrounds/nest/src/reference/reference.service.ts b/playgrounds/nest/src/reference/reference.service.ts index d86124be0..b519dbcf0 100644 --- a/playgrounds/nest/src/reference/reference.service.ts +++ b/playgrounds/nest/src/reference/reference.service.ts @@ -1,5 +1,5 @@ import { OpenAPIGenerator } from '@orpc/openapi' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '@orpc/zod/zod4' +import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' import { contract } from 'src/contract' import { CredentialSchema, TokenSchema } from 'src/schemas/auth' import { NewPlanetSchema, PlanetSchema, UpdatePlanetSchema } from 'src/schemas/planet' diff --git a/playgrounds/next/src/app/api/[[...rest]]/route.ts b/playgrounds/next/src/app/api/[[...rest]]/route.ts index 50334df10..44de38448 100644 --- a/playgrounds/next/src/app/api/[[...rest]]/route.ts +++ b/playgrounds/next/src/app/api/[[...rest]]/route.ts @@ -1,7 +1,7 @@ import { router } from '@/router' import { OpenAPIHandler } from '@orpc/openapi/fetch' import { onError } from '@orpc/server' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '@orpc/zod/zod4' +import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' import { experimental_SmartCoercionPlugin as SmartCoercionPlugin } from '@orpc/json-schema' import { OpenAPIReferencePlugin } from '@orpc/openapi/plugins' import '../../../polyfill' diff --git a/playgrounds/nuxt/server/routes/api/[...].ts b/playgrounds/nuxt/server/routes/api/[...].ts index c3aae8ea3..4fc23ba77 100644 --- a/playgrounds/nuxt/server/routes/api/[...].ts +++ b/playgrounds/nuxt/server/routes/api/[...].ts @@ -1,6 +1,6 @@ import { OpenAPIHandler } from '@orpc/openapi/node' import { onError } from '@orpc/server' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '@orpc/zod/zod4' +import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' import { experimental_SmartCoercionPlugin as SmartCoercionPlugin } from '@orpc/json-schema' import { router } from '~/server/router' import { OpenAPIReferencePlugin } from '@orpc/openapi/plugins' diff --git a/playgrounds/solid-start/src/routes/api/[...rest].ts b/playgrounds/solid-start/src/routes/api/[...rest].ts index cb80fdb92..574225f55 100644 --- a/playgrounds/solid-start/src/routes/api/[...rest].ts +++ b/playgrounds/solid-start/src/routes/api/[...rest].ts @@ -1,7 +1,7 @@ import type { APIEvent } from '@solidjs/start/server' import { OpenAPIHandler } from '@orpc/openapi/fetch' import { router } from '~/router' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '@orpc/zod/zod4' +import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' import { experimental_SmartCoercionPlugin as SmartCoercionPlugin } from '@orpc/json-schema' import { onError } from '@orpc/server' import { OpenAPIReferencePlugin } from '@orpc/openapi/plugins' diff --git a/playgrounds/svelte-kit/src/routes/api/[...rest]/+server.ts b/playgrounds/svelte-kit/src/routes/api/[...rest]/+server.ts index b12e99bbb..b1f237c33 100644 --- a/playgrounds/svelte-kit/src/routes/api/[...rest]/+server.ts +++ b/playgrounds/svelte-kit/src/routes/api/[...rest]/+server.ts @@ -2,7 +2,7 @@ import { OpenAPIHandler } from '@orpc/openapi/fetch' import { router } from '../../../router' import { onError } from '@orpc/server' import type { RequestHandler } from '@sveltejs/kit' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '@orpc/zod/zod4' +import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' import { experimental_SmartCoercionPlugin as SmartCoercionPlugin } from '@orpc/json-schema' import { OpenAPIReferencePlugin } from '@orpc/openapi/plugins' import '../../../polyfill' diff --git a/playgrounds/tanstack-start/src/routes/api/$.ts b/playgrounds/tanstack-start/src/routes/api/$.ts index a2ce65951..fa20eca6e 100644 --- a/playgrounds/tanstack-start/src/routes/api/$.ts +++ b/playgrounds/tanstack-start/src/routes/api/$.ts @@ -1,7 +1,7 @@ import '~/polyfill' import { OpenAPIHandler } from '@orpc/openapi/fetch' -import { experimental_ZodToJsonSchemaConverter as ZodToJsonSchemaConverter } from '@orpc/zod/zod4' +import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4' import { experimental_SmartCoercionPlugin as SmartCoercionPlugin } from '@orpc/json-schema' import { createServerFileRoute } from '@tanstack/react-start/server' import { router } from '~/router/index'