From bfd9c4512f595716f637c1e87e454baba97149a6 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sun, 25 Jan 2026 21:07:28 +0800 Subject: [PATCH 01/23] feat(openapi-ts): add orpc plugin for generating oRPC contracts --- packages/openapi-ts/src/plugins/config.ts | 4 + .../openapi-ts/src/plugins/orpc/config.ts | 95 ++++++ packages/openapi-ts/src/plugins/orpc/index.ts | 2 + .../openapi-ts/src/plugins/orpc/plugin.ts | 274 ++++++++++++++++++ .../openapi-ts/src/plugins/orpc/types.d.ts | 55 ++++ packages/openapi-ts/src/plugins/types.d.ts | 1 + 6 files changed, 431 insertions(+) create mode 100644 packages/openapi-ts/src/plugins/orpc/config.ts create mode 100644 packages/openapi-ts/src/plugins/orpc/index.ts create mode 100644 packages/openapi-ts/src/plugins/orpc/plugin.ts create mode 100644 packages/openapi-ts/src/plugins/orpc/types.d.ts diff --git a/packages/openapi-ts/src/plugins/config.ts b/packages/openapi-ts/src/plugins/config.ts index 865d810af..decdd994c 100644 --- a/packages/openapi-ts/src/plugins/config.ts +++ b/packages/openapi-ts/src/plugins/config.ts @@ -41,6 +41,8 @@ import type { ArktypePlugin } from '~/plugins/arktype'; import { defaultConfig as arktype } from '~/plugins/arktype'; import type { FastifyPlugin } from '~/plugins/fastify'; import { defaultConfig as fastify } from '~/plugins/fastify'; +import type { OrpcPlugin } from '~/plugins/orpc'; +import { defaultConfig as orpc } from '~/plugins/orpc'; import type { SwrPlugin } from '~/plugins/swr'; import { defaultConfig as swr } from '~/plugins/swr'; import type { PluginNames } from '~/plugins/types'; @@ -71,6 +73,7 @@ export interface PluginConfigMap { '@tanstack/vue-query': TanStackVueQueryPlugin['Types']; arktype: ArktypePlugin['Types']; fastify: FastifyPlugin['Types']; + orpc: OrpcPlugin['Types']; swr: SwrPlugin['Types']; valibot: ValibotPlugin['Types']; zod: ZodPlugin['Types']; @@ -100,6 +103,7 @@ export const defaultPluginConfigs: { '@tanstack/vue-query': tanStackVueQuery, arktype, fastify, + orpc, swr, valibot, zod, diff --git a/packages/openapi-ts/src/plugins/orpc/config.ts b/packages/openapi-ts/src/plugins/orpc/config.ts new file mode 100644 index 000000000..3f9505bad --- /dev/null +++ b/packages/openapi-ts/src/plugins/orpc/config.ts @@ -0,0 +1,95 @@ +import type { IR } from '~/ir/types'; +import { definePluginConfig } from '~/plugins/shared/utils/config'; + +import { handler } from './plugin'; +import type { OrpcPlugin } from './types'; + +function capitalizeFirst(str: string): string { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +// Convert kebab-case to camelCase: "chat-messages" → "chatMessages" +function toCamelCase(str: string): string { + return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()); +} + +// Default: extract first path segment and convert to camelCase +// "/chat-messages/{id}" → "chatMessages" +function defaultGroupKeyBuilder(operation: IR.OperationObject): string { + const segment = operation.path.split('/').filter(Boolean)[0] || 'common'; + return toCamelCase(segment); +} + +// Build patterns from segment name (camelCase group key) +// "chatMessages" → ["ChatMessages", "ChatMessage"] +function buildGroupPatterns(groupKey: string): string[] { + const patterns: string[] = []; + const pascalKey = capitalizeFirst(groupKey); + patterns.push(pascalKey); + + // Singular form: "ChatMessages" → "ChatMessage" + if (pascalKey.endsWith('s') && !pascalKey.endsWith('ss')) { + patterns.push(pascalKey.slice(0, -1)); + } + + return patterns; +} + +// Default: simplify operationId by removing redundant group-based patterns +// e.g., "sendChatMessage" with groupKey "chatMessages" → "send" +// e.g., "getConversationsList" with groupKey "conversations" → "getList" +function defaultOperationKeyBuilder( + operationId: string, + groupKey: string, +): string { + const patternsToRemove = buildGroupPatterns(groupKey); + + let simplified = operationId; + + // Remove patterns iteratively + for (const pattern of patternsToRemove) { + const regex = new RegExp(pattern, 'g'); + const result = simplified.replace(regex, ''); + if (result !== simplified && result.length > 0) { + simplified = result; + } + } + + // Ensure first char is lowercase + simplified = simplified.charAt(0).toLowerCase() + simplified.slice(1); + + // Handle edge cases where we end up with just HTTP method or too short + if (!simplified || simplified.length < 2) { + return operationId.charAt(0).toLowerCase() + operationId.slice(1); + } + + return simplified; +} + +export const defaultConfig: OrpcPlugin['Config'] = { + config: { + contractNameBuilder: (id: string) => `${id}Contract`, + defaultTag: 'default', + exportFromIndex: false, + groupKeyBuilder: defaultGroupKeyBuilder, + operationKeyBuilder: defaultOperationKeyBuilder, + output: 'orpc', + }, + dependencies: ['@hey-api/typescript', 'zod'], + handler, + name: 'orpc', + resolveConfig: (plugin) => { + plugin.config.output ??= 'orpc'; + plugin.config.exportFromIndex ??= false; + plugin.config.contractNameBuilder ??= (id: string) => `${id}Contract`; + plugin.config.defaultTag ??= 'default'; + plugin.config.groupKeyBuilder ??= defaultGroupKeyBuilder; + plugin.config.operationKeyBuilder ??= defaultOperationKeyBuilder; + }, + tags: ['client'], +}; + +/** + * Type helper for oRPC plugin, returns {@link Plugin.Config} object + */ +export const defineConfig = definePluginConfig(defaultConfig); diff --git a/packages/openapi-ts/src/plugins/orpc/index.ts b/packages/openapi-ts/src/plugins/orpc/index.ts new file mode 100644 index 000000000..ad57b7794 --- /dev/null +++ b/packages/openapi-ts/src/plugins/orpc/index.ts @@ -0,0 +1,2 @@ +export { defaultConfig, defineConfig } from './config'; +export type { OrpcPlugin } from './types'; diff --git a/packages/openapi-ts/src/plugins/orpc/plugin.ts b/packages/openapi-ts/src/plugins/orpc/plugin.ts new file mode 100644 index 000000000..f0d70119c --- /dev/null +++ b/packages/openapi-ts/src/plugins/orpc/plugin.ts @@ -0,0 +1,274 @@ +import type { IR } from '~/ir/types'; +import { $ } from '~/ts-dsl'; + +import type { OrpcPlugin } from './types'; + +function hasInput(operation: IR.OperationObject): boolean { + const hasPathParams = Boolean( + operation.parameters?.path && + Object.keys(operation.parameters.path).length > 0, + ); + const hasQueryParams = Boolean( + operation.parameters?.query && + Object.keys(operation.parameters.query).length > 0, + ); + const hasHeaderParams = Boolean( + operation.parameters?.header && + Object.keys(operation.parameters.header).length > 0, + ); + const hasBody = Boolean(operation.body); + return hasPathParams || hasQueryParams || hasHeaderParams || hasBody; +} + +function getSuccessResponse( + operation: IR.OperationObject, +): { hasOutput: true; statusCode: number } | { hasOutput: false } { + if (operation.responses) { + for (const [statusCode, response] of Object.entries(operation.responses)) { + const statusCodeNumber = Number.parseInt(statusCode, 10); + if ( + statusCodeNumber >= 200 && + statusCodeNumber <= 399 && + response?.mediaType && + response?.schema + ) { + return { hasOutput: true, statusCode: statusCodeNumber }; + } + } + } + return { hasOutput: false }; +} + +function getTags(operation: IR.OperationObject, defaultTag: string): string[] { + return operation.tags && operation.tags.length > 0 + ? [...operation.tags] + : [defaultTag]; +} + +export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { + const { + contractNameBuilder, + defaultTag, + groupKeyBuilder, + operationKeyBuilder, + } = plugin.config; + + const operations: IR.OperationObject[] = []; + + // Collect all operations using hey-api's forEach + plugin.forEach('operation', (event) => { + operations.push(event.operation); + }); + + // Register external symbols for imports + const symbolOc = plugin.symbol('oc', { + exported: false, + external: '@orpc/contract', + }); + const symbolZ = plugin.external('zod.z'); + + // Create base contract symbol + const baseSymbol = plugin.symbol('base', { + exported: true, + meta: { + category: 'contract', + resource: 'base', + tool: 'orpc', + }, + }); + + const baseNode = $.const(baseSymbol) + .export() + .assign( + $(symbolOc) + .attr('$route') + .call( + $.object() + .prop('inputStructure', $.literal('detailed')) + .prop('outputStructure', $.literal('detailed')), + ), + ); + plugin.node(baseNode); + + // Create contract for each operation + // Store symbols for later use in contracts object + const contractSymbols: Record> = {}; + + for (const op of operations) { + const contractName = contractNameBuilder(op.id); + const tags = getTags(op, defaultTag); + const successResponse = getSuccessResponse(op); + + const contractSymbol = plugin.symbol(contractName, { + exported: true, + meta: { + category: 'contract', + path: ['paths', op.path, op.method], + resource: 'operation', + resourceId: op.id, + role: 'contract', + tags, + tool: 'orpc', + }, + }); + contractSymbols[op.id] = contractSymbol; + + // Build the route config object following Route interface order: + // method, path, operationId, summary, description, deprecated, tags, successStatus, successDescription + const method = op.method.toUpperCase(); + const routeConfig = $.object() + .prop('method', $.literal(method)) + .prop('path', $.literal(op.path as string)); + + if (op.operationId) { + routeConfig.prop('operationId', $.literal(op.operationId)); + } + if (op.summary) { + routeConfig.prop('summary', $.literal(op.summary)); + } + if (op.description) { + routeConfig.prop('description', $.literal(op.description)); + } + if (op.deprecated) { + routeConfig.prop('deprecated', $.literal(true)); + } + if (tags.length > 0) { + routeConfig.prop('tags', $.fromValue(tags)); + } + if (successResponse.hasOutput) { + if (successResponse.statusCode !== 200) { + routeConfig.prop( + 'successStatus', + $.literal(successResponse.statusCode), + ); + } + // TODO: Add successDescription from OpenAPI description if available + // routeConfig.prop('successDescription', $.literal('OK')); + } + + // Build the call chain: base.route({...}).input(...).output(...) + let expression = $(baseSymbol).attr('route').call(routeConfig); + + // .input(zodDataSchema) if has input + if (hasInput(op)) { + // Reference zod schema symbol dynamically from zod plugin + const zodDataSymbol = plugin.referenceSymbol({ + category: 'schema', + resource: 'operation', + resourceId: op.id, + role: 'data', + tool: 'zod', + }); + expression = expression.attr('input').call($(zodDataSymbol)); + } + + // .output(z.object({ body: zodResponseSchema, status: z.literal(200) })) if has output (detailed outputStructure) + if (successResponse.hasOutput) { + // Reference zod response schema symbol dynamically from zod plugin + const zodResponseSymbol = plugin.referenceSymbol({ + category: 'schema', + resource: 'operation', + resourceId: op.id, + role: 'responses', + tool: 'zod', + }); + const outputObject = $.object().prop('body', $(zodResponseSymbol)); + + // Add status code if available + if (successResponse.statusCode) { + outputObject.prop( + 'status', + $(symbolZ) + .attr('literal') + .call($.literal(successResponse.statusCode)), + ); + } + + expression = expression + .attr('output') + .call($(symbolZ).attr('object').call(outputObject)); + } + + const contractNode = $.const(contractSymbol) + .export() + .$if(op.summary || op.description || op.deprecated, (node) => { + const docLines: string[] = []; + if (op.summary) { + docLines.push(op.summary); + } + if (op.description && op.description !== op.summary) { + if (op.summary) { + docLines.push(''); + } + docLines.push(op.description); + } + if (op.deprecated) { + if (docLines.length > 0) { + docLines.push(''); + } + docLines.push('@deprecated'); + } + return node.doc(docLines); + }) + .assign(expression); + + plugin.node(contractNode); + } + + // Create contracts object export grouped by API path segment (in separate router file) + const contractsSymbol = plugin.symbol('router', { + exported: true, + meta: { + category: 'contract', + resource: 'router', + tool: 'orpc', + }, + }); + + // Group operations by group key + const operationsByGroup = new Map(); + for (const op of operations) { + const groupKey = groupKeyBuilder(op); + if (!operationsByGroup.has(groupKey)) { + operationsByGroup.set(groupKey, []); + } + operationsByGroup.get(groupKey)!.push(op); + } + + // Build nested contracts object + const contractsObject = $.object(); + for (const [groupKey, groupOps] of operationsByGroup) { + const groupObject = $.object(); + + for (const op of groupOps) { + const contractSymbol = contractSymbols[op.id]; + if (contractSymbol) { + const key = operationKeyBuilder(op.id, groupKey); + groupObject.prop(key, $(contractSymbol)); + } + } + + contractsObject.prop(groupKey, groupObject); + } + + const contractsNode = $.const(contractsSymbol) + .export() + .assign(contractsObject); + plugin.node(contractsNode); + + // Create type export: export type Router = typeof router (in separate router file) + const routerTypeSymbol = plugin.symbol('Router', { + exported: true, + meta: { + category: 'type', + resource: 'router', + tool: 'orpc', + }, + }); + + const routerTypeNode = $.type + .alias(routerTypeSymbol) + .export() + .type($.type.query($(contractsSymbol))); + plugin.node(routerTypeNode); +}; diff --git a/packages/openapi-ts/src/plugins/orpc/types.d.ts b/packages/openapi-ts/src/plugins/orpc/types.d.ts new file mode 100644 index 000000000..6cf671bd2 --- /dev/null +++ b/packages/openapi-ts/src/plugins/orpc/types.d.ts @@ -0,0 +1,55 @@ +import type { IR } from '~/ir/types'; +import type { DefinePlugin, Plugin } from '~/plugins'; + +export type UserConfig = Plugin.Name<'orpc'> & + Plugin.Hooks & { + /** + * Custom naming function for contract symbols. + * + * @default (id) => `${id}Contract` + */ + contractNameBuilder?: (operationId: string) => string; + /** + * Default tag name for operations without tags. + * + * @default 'default' + */ + defaultTag?: string; + /** + * Whether exports should be re-exported in the index file. + * + * @default false + */ + exportFromIndex?: boolean; + /** + * Custom function to extract group key for router grouping. + * Receives the full IR.OperationObject. + * + * @default extracts first path segment as camelCase + */ + groupKeyBuilder?: (operation: IR.OperationObject) => string; + /** + * Custom function to generate operation key within a group. + * + * @default (operationId, groupKey) => simplified operationId + */ + operationKeyBuilder?: (operationId: string, groupKey: string) => string; + /** + * Name of the generated file. + * + * @default 'orpc' + */ + output?: string; + }; + +export type Config = Plugin.Name<'orpc'> & + Plugin.Hooks & { + contractNameBuilder: (operationId: string) => string; + defaultTag: string; + exportFromIndex: boolean; + groupKeyBuilder: (operation: IR.OperationObject) => string; + operationKeyBuilder: (operationId: string, groupKey: string) => string; + output: string; + }; + +export type OrpcPlugin = DefinePlugin; diff --git a/packages/openapi-ts/src/plugins/types.d.ts b/packages/openapi-ts/src/plugins/types.d.ts index 972d77863..fc2df2276 100644 --- a/packages/openapi-ts/src/plugins/types.d.ts +++ b/packages/openapi-ts/src/plugins/types.d.ts @@ -32,6 +32,7 @@ export type PluginNames = | '@tanstack/svelte-query' | '@tanstack/vue-query' | 'fastify' + | 'orpc' | 'swr'; export type AnyPluginName = PluginNames | (string & {}); From c8f5f34fa283e46dfe40d41fba3e1ec73d1298d5 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sun, 25 Jan 2026 21:24:50 +0800 Subject: [PATCH 02/23] add test --- packages/openapi-ts-tests/main/package.json | 1 + .../plugins/zod/custom-contract-name/index.ts | 3 + .../zod/custom-contract-name/orpc.gen.ts | 59 +++ .../zod/custom-contract-name/types.gen.ts | 101 ++++ .../zod/custom-contract-name/zod.gen.ts | 69 +++ .../plugins/zod/custom-group-key/index.ts | 3 + .../plugins/zod/custom-group-key/orpc.gen.ts | 56 +++ .../plugins/zod/custom-group-key/types.gen.ts | 101 ++++ .../plugins/zod/custom-group-key/zod.gen.ts | 69 +++ .../2.0.x/plugins/zod/default/index.ts | 3 + .../2.0.x/plugins/zod/default/orpc.gen.ts | 59 +++ .../2.0.x/plugins/zod/default/types.gen.ts | 101 ++++ .../2.0.x/plugins/zod/default/zod.gen.ts | 69 +++ .../plugins/zod/custom-contract-name/index.ts | 3 + .../zod/custom-contract-name/orpc.gen.ts | 59 +++ .../zod/custom-contract-name/types.gen.ts | 101 ++++ .../zod/custom-contract-name/zod.gen.ts | 69 +++ .../plugins/zod/custom-group-key/index.ts | 3 + .../plugins/zod/custom-group-key/orpc.gen.ts | 56 +++ .../plugins/zod/custom-group-key/types.gen.ts | 101 ++++ .../plugins/zod/custom-group-key/zod.gen.ts | 69 +++ .../3.0.x/plugins/zod/default/index.ts | 3 + .../3.0.x/plugins/zod/default/orpc.gen.ts | 59 +++ .../3.0.x/plugins/zod/default/types.gen.ts | 101 ++++ .../3.0.x/plugins/zod/default/zod.gen.ts | 69 +++ .../plugins/zod/custom-contract-name/index.ts | 3 + .../zod/custom-contract-name/orpc.gen.ts | 59 +++ .../zod/custom-contract-name/types.gen.ts | 101 ++++ .../zod/custom-contract-name/zod.gen.ts | 69 +++ .../plugins/zod/custom-group-key/index.ts | 3 + .../plugins/zod/custom-group-key/orpc.gen.ts | 56 +++ .../plugins/zod/custom-group-key/types.gen.ts | 101 ++++ .../plugins/zod/custom-group-key/zod.gen.ts | 69 +++ .../3.1.x/plugins/zod/default/index.ts | 3 + .../3.1.x/plugins/zod/default/orpc.gen.ts | 59 +++ .../3.1.x/plugins/zod/default/types.gen.ts | 101 ++++ .../3.1.x/plugins/zod/default/zod.gen.ts | 69 +++ .../main/test/plugins.test.ts | 37 ++ pnpm-lock.yaml | 436 ++++++------------ 39 files changed, 2260 insertions(+), 293 deletions(-) create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/zod.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/zod.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/zod.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/zod.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/zod.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/zod.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/zod.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/zod.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/zod.gen.ts diff --git a/packages/openapi-ts-tests/main/package.json b/packages/openapi-ts-tests/main/package.json index 0805fd27c..7b500b01e 100644 --- a/packages/openapi-ts-tests/main/package.json +++ b/packages/openapi-ts-tests/main/package.json @@ -30,6 +30,7 @@ "@hey-api/codegen-core": "workspace:*", "@hey-api/custom-client": "workspace:*", "@hey-api/openapi-ts": "workspace:*", + "@orpc/contract": "1.13.4", "@pinia/colada": "0.19.1", "@tanstack/angular-query-experimental": "5.73.3", "@tanstack/react-query": "5.73.3", diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts new file mode 100644 index 000000000..f24104a62 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooRpc = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostRpc = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutRpc = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarRpc = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostRpc = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutRpc = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const router = { foo: { + get: getFooRpc, + fooPost: fooPostRpc, + fooPut: fooPutRpc, + getBar: getFooBarRpc, + fooBarPost: fooBarPostRpc, + fooBarPut: fooBarPutRpc + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/types.gen.ts new file mode 100644 index 000000000..9844839de --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: string; +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts new file mode 100644 index 000000000..501302c0c --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts @@ -0,0 +1,56 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const router = { + get: { getFoo: getFooContract, getFooBar: getFooBarContract }, + post: { foo: fooPostContract, fooBar: fooBarPostContract }, + put: { foo: fooPutContract, fooBar: fooBarPutContract } +}; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/types.gen.ts new file mode 100644 index 000000000..9844839de --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: string; +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts new file mode 100644 index 000000000..f0284f5af --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const router = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/types.gen.ts new file mode 100644 index 000000000..9844839de --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: string; +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts new file mode 100644 index 000000000..f24104a62 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooRpc = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostRpc = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutRpc = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarRpc = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostRpc = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutRpc = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const router = { foo: { + get: getFooRpc, + fooPost: fooPostRpc, + fooPut: fooPutRpc, + getBar: getFooBarRpc, + fooBarPost: fooBarPostRpc, + fooBarPut: fooBarPutRpc + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/types.gen.ts new file mode 100644 index 000000000..836288372 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: `${string}://${string}` | (string & {}); +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts new file mode 100644 index 000000000..501302c0c --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts @@ -0,0 +1,56 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const router = { + get: { getFoo: getFooContract, getFooBar: getFooBarContract }, + post: { foo: fooPostContract, fooBar: fooBarPostContract }, + put: { foo: fooPutContract, fooBar: fooBarPutContract } +}; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/types.gen.ts new file mode 100644 index 000000000..836288372 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: `${string}://${string}` | (string & {}); +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts new file mode 100644 index 000000000..f0284f5af --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const router = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/types.gen.ts new file mode 100644 index 000000000..836288372 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: `${string}://${string}` | (string & {}); +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts new file mode 100644 index 000000000..f24104a62 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooRpc = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostRpc = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutRpc = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarRpc = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostRpc = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutRpc = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const router = { foo: { + get: getFooRpc, + fooPost: fooPostRpc, + fooPut: fooPutRpc, + getBar: getFooBarRpc, + fooBarPost: fooBarPostRpc, + fooBarPut: fooBarPutRpc + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/types.gen.ts new file mode 100644 index 000000000..836288372 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: `${string}://${string}` | (string & {}); +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts new file mode 100644 index 000000000..501302c0c --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts @@ -0,0 +1,56 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const router = { + get: { getFoo: getFooContract, getFooBar: getFooBarContract }, + post: { foo: fooPostContract, fooBar: fooBarPostContract }, + put: { foo: fooPutContract, fooBar: fooBarPutContract } +}; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/types.gen.ts new file mode 100644 index 000000000..836288372 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: `${string}://${string}` | (string & {}); +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts new file mode 100644 index 000000000..f0284f5af --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const router = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/types.gen.ts new file mode 100644 index 000000000..836288372 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: `${string}://${string}` | (string & {}); +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/plugins.test.ts b/packages/openapi-ts-tests/main/test/plugins.test.ts index 68363a50d..980a54b14 100644 --- a/packages/openapi-ts-tests/main/test/plugins.test.ts +++ b/packages/openapi-ts-tests/main/test/plugins.test.ts @@ -566,6 +566,43 @@ for (const version of versions) { }), description: 'generate Angular requests and resources (class)', }, + { + config: createConfig({ + input: 'sdk-instance.yaml', + output: 'default', + plugins: ['zod', 'orpc'], + }), + description: 'generate oRPC contracts with Zod schemas', + }, + { + config: createConfig({ + input: 'sdk-instance.yaml', + output: 'custom-contract-name', + plugins: [ + 'zod', + { + contractNameBuilder: (id: string) => `${id}Rpc`, + name: 'orpc', + }, + ], + }), + description: + 'generate oRPC contracts with custom contract name builder', + }, + { + config: createConfig({ + input: 'sdk-instance.yaml', + output: 'custom-group-key', + plugins: [ + 'zod', + { + groupKeyBuilder: (operation) => operation.method, + name: 'orpc', + }, + ], + }), + description: 'generate oRPC contracts with custom group key builder', + }, ]; it.each(scenarios)('$description', async ({ config }) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06327f09d..adc44d431 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -153,7 +153,7 @@ importers: version: 2.1.29 nuxt: specifier: 3.14.1592 - version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.55.1)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) + version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.55.1)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) swr: specifier: 2.3.8 version: 2.3.8(react@19.0.0) @@ -1461,7 +1461,7 @@ importers: version: 1.14.2 nuxt: specifier: 3.14.1592 - version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.55.1)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) + version: 3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.55.1)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) ofetch: specifier: 1.5.1 version: 1.5.1 @@ -1531,6 +1531,9 @@ importers: '@hey-api/openapi-ts': specifier: workspace:* version: link:../../openapi-ts + '@orpc/contract': + specifier: 1.13.4 + version: 1.13.4 '@pinia/colada': specifier: 0.19.1 version: 0.19.1(pinia@3.0.3(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) @@ -5117,6 +5120,29 @@ packages: '@opencode-ai/sdk@1.0.221': resolution: {integrity: sha512-midJuagLLYTQ5GzAyYn66W0f8VesB2PU17iYYUk5nqgvb8c9fXPG4ri/hGvTazge0crwEJXf4Ko1ybWAwVtwpg==} + '@orpc/client@1.13.4': + resolution: {integrity: sha512-s13GPMeoooJc5Th2EaYT5HMFtWG8S03DUVytYfJv8pIhP87RYKl94w52A36denH6r/B4LaAgBeC9nTAOslK+Og==} + + '@orpc/contract@1.13.4': + resolution: {integrity: sha512-TIxyaF67uOlihCRcasjHZxguZpbqfNK7aMrDLnhoufmQBE4OKvguNzmrOFHgsuM0OXoopX0Nuhun1ccaxKP10A==} + + '@orpc/shared@1.13.4': + resolution: {integrity: sha512-TYt9rLG/BUkNQBeQ6C1tEiHS/Seb8OojHgj9GlvqyjHJhMZx5qjsIyTW6RqLPZJ4U2vgK6x4Her36+tlFCKJug==} + peerDependencies: + '@opentelemetry/api': '>=1.9.0' + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + + '@orpc/standard-server-fetch@1.13.4': + resolution: {integrity: sha512-/zmKwnuxfAXbppJpgr1CMnQX3ptPlYcDzLz1TaVzz9VG/Xg58Ov3YhabS2Oi1utLVhy5t4kaCppUducAvoKN+A==} + + '@orpc/standard-server-peer@1.13.4': + resolution: {integrity: sha512-UfqnTLqevjCKUk4cmImOG8cQUwANpV1dp9e9u2O1ki6BRBsg/zlXFg6G2N6wP0zr9ayIiO1d2qJdH55yl/1BNw==} + + '@orpc/standard-server@1.13.4': + resolution: {integrity: sha512-ZOzgfVp6XUg+wVYw+gqesfRfGPtQbnBIrIiSnFMtZF+6ncmFJeF2Shc4RI2Guqc0Qz25juy8Ogo4tX3YqysOcg==} + '@oxc-project/types@0.103.0': resolution: {integrity: sha512-bkiYX5kaXWwUessFRSoXFkGIQTmc6dLGdxuRTrC+h8PSnIdZyuXHHlLAeTmOue5Br/a0/a7dHH0Gca6eXn9MKg==} @@ -6522,6 +6548,9 @@ packages: '@stackblitz/sdk@1.11.0': resolution: {integrity: sha512-DFQGANNkEZRzFk1/rDP6TcFdM82ycHE+zfl9C/M/jXlH68jiqHWHFMQURLELoD8koxvu/eW5uhg94NSAZlYrUQ==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + '@sveltejs/adapter-auto@4.0.0': resolution: {integrity: sha512-kmuYSQdD2AwThymQF0haQhM8rE5rhutQXG4LNbnbShwhMO4qQGnKaaTy+88DuNSuoQDi58+thpq8XpHc1+oEKQ==} peerDependencies: @@ -11403,6 +11432,9 @@ packages: zod: optional: true + openapi-types@12.1.3: + resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -12113,6 +12145,10 @@ packages: quote-unquote@1.0.0: resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + radash@12.1.1: + resolution: {integrity: sha512-h36JMxKRqrAxVD8201FrCpyeNuUY9Y5zZwujr20fFO77tpUtGa6EZzfKw/3WaiBX95fq7+MpsuMLNdSnORAwSA==} + engines: {node: '>=14.18.0'} + radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} @@ -13064,6 +13100,10 @@ packages: tabbable@6.3.0: resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tailwindcss@3.4.14: resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==} engines: {node: '>=14.0.0'} @@ -13374,6 +13414,10 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-fest@5.4.1: + resolution: {integrity: sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ==} + engines: {node: '>=20'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -14659,7 +14703,7 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) - '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0)) + '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0) '@angular-devkit/core': 19.2.0(chokidar@4.0.3) '@angular/build': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/platform-server@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.0(@angular/animations@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))))(@angular/ssr@19.2.15(5c03da8199d2fcdf9ff93b70f9349edd))(@types/node@22.10.5)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.8.3)))(terser@5.39.0)(typescript@5.8.3)(yaml@2.8.2) '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3) @@ -14673,11 +14717,11 @@ snapshots: '@babel/preset-env': 7.26.9(@babel/core@7.26.9) '@babel/runtime': 7.26.9 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)) + '@ngtools/webpack': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(typescript@5.8.3)(webpack@5.98.0) '@vitejs/plugin-basic-ssl': 1.2.0(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) ansi-colors: 4.1.3 autoprefixer: 10.4.20(postcss@8.5.2) - babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0(esbuild@0.25.0)) + babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0) browserslist: 4.25.4 copy-webpack-plugin: 12.0.2(webpack@5.98.0) css-loader: 7.1.2(webpack@5.98.0) @@ -14697,7 +14741,7 @@ snapshots: picomatch: 4.0.2 piscina: 4.8.0 postcss: 8.5.2 - postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)) + postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0) resolve-url-loader: 5.0.0 rxjs: 7.8.1 sass: 1.85.0 @@ -14747,7 +14791,7 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) - '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0)) + '@angular-devkit/build-webpack': 0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0) '@angular-devkit/core': 19.2.0(chokidar@4.0.3) '@angular/build': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/platform-server@19.2.0(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@19.2.0(@angular/animations@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1))))(@angular/ssr@19.2.15(5c03da8199d2fcdf9ff93b70f9349edd))(@types/node@22.10.5)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.8.3)))(terser@5.39.0)(typescript@5.8.3)(yaml@2.8.2) '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3) @@ -14761,11 +14805,11 @@ snapshots: '@babel/preset-env': 7.26.9(@babel/core@7.26.9) '@babel/runtime': 7.26.9 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)) + '@ngtools/webpack': 19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(typescript@5.8.3)(webpack@5.98.0) '@vitejs/plugin-basic-ssl': 1.2.0(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) ansi-colors: 4.1.3 autoprefixer: 10.4.20(postcss@8.5.2) - babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0(esbuild@0.25.0)) + babel-loader: 9.2.1(@babel/core@7.26.9)(webpack@5.98.0) browserslist: 4.25.4 copy-webpack-plugin: 12.0.2(webpack@5.98.0) css-loader: 7.1.2(webpack@5.98.0) @@ -14785,7 +14829,7 @@ snapshots: picomatch: 4.0.2 piscina: 4.8.0 postcss: 8.5.2 - postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)) + postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0) resolve-url-loader: 5.0.0 rxjs: 7.8.1 sass: 1.85.0 @@ -14873,7 +14917,7 @@ snapshots: picomatch: 4.0.2 piscina: 4.8.0 postcss: 8.5.2 - postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)) + postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0) resolve-url-loader: 5.0.0 rxjs: 7.8.1 sass: 1.85.0 @@ -14923,7 +14967,7 @@ snapshots: dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.1902.19(chokidar@4.0.3) - '@angular-devkit/build-webpack': 0.1902.19(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.98.0))(webpack@5.98.0) + '@angular-devkit/build-webpack': 0.1902.19(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.4)) '@angular-devkit/core': 19.2.19(chokidar@4.0.3) '@angular/build': 19.2.19(@angular/compiler-cli@19.2.17(@angular/compiler@19.2.17)(typescript@5.9.3))(@angular/compiler@19.2.17)(@angular/platform-server@19.2.0(@angular/common@19.2.17(@angular/core@19.2.17(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/compiler@19.2.17)(@angular/core@19.2.17(rxjs@7.8.2)(zone.js@0.16.0))(@angular/platform-browser@19.2.17(@angular/animations@19.2.17(@angular/common@19.2.17(@angular/core@19.2.17(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@19.2.17(rxjs@7.8.2)(zone.js@0.16.0)))(@angular/common@19.2.17(@angular/core@19.2.17(rxjs@7.8.2)(zone.js@0.16.0))(rxjs@7.8.2))(@angular/core@19.2.17(rxjs@7.8.2)(zone.js@0.16.0))))(@types/node@22.10.5)(chokidar@4.0.3)(jiti@2.6.1)(karma@6.4.4)(less@4.2.2)(postcss@8.5.2)(tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.9.3)))(terser@5.39.0)(typescript@5.9.3)(yaml@2.8.2) '@angular/compiler-cli': 19.2.17(@angular/compiler@19.2.17)(typescript@5.9.3) @@ -14937,7 +14981,7 @@ snapshots: '@babel/preset-env': 7.26.9(@babel/core@7.26.10) '@babel/runtime': 7.26.10 '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 19.2.19(@angular/compiler-cli@19.2.17(@angular/compiler@19.2.17)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.98.0) + '@ngtools/webpack': 19.2.19(@angular/compiler-cli@19.2.17(@angular/compiler@19.2.17)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.98.0(esbuild@0.25.4)) '@vitejs/plugin-basic-ssl': 1.2.0(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2)) ansi-colors: 4.1.3 autoprefixer: 10.4.20(postcss@8.5.2) @@ -14961,7 +15005,7 @@ snapshots: picomatch: 4.0.2 piscina: 4.8.0 postcss: 8.5.2 - postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.9.3)(webpack@5.98.0) + postcss-loader: 8.1.1(postcss@8.5.2)(typescript@5.9.3)(webpack@5.98.0(esbuild@0.25.4)) resolve-url-loader: 5.0.0 rxjs: 7.8.1 sass: 1.85.0 @@ -15006,11 +15050,11 @@ snapshots: - webpack-cli - yaml - '@angular-devkit/build-webpack@0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.0))': + '@angular-devkit/build-webpack@0.1902.0(chokidar@4.0.3)(webpack-dev-server@5.2.0(webpack@5.98.0))(webpack@5.98.0)': dependencies: '@angular-devkit/architect': 0.1902.0(chokidar@4.0.3) rxjs: 7.8.1 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) webpack-dev-server: 5.2.0(webpack@5.98.0) transitivePeerDependencies: - chokidar @@ -15019,16 +15063,16 @@ snapshots: dependencies: '@angular-devkit/architect': 0.1902.15(chokidar@4.0.3) rxjs: 7.8.1 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) webpack-dev-server: 5.2.2(webpack@5.98.0) transitivePeerDependencies: - chokidar - '@angular-devkit/build-webpack@0.1902.19(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.98.0))(webpack@5.98.0)': + '@angular-devkit/build-webpack@0.1902.19(chokidar@4.0.3)(webpack-dev-server@5.2.2(webpack@5.98.0))(webpack@5.98.0(esbuild@0.25.4))': dependencies: '@angular-devkit/architect': 0.1902.19(chokidar@4.0.3) rxjs: 7.8.1 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) webpack-dev-server: 5.2.2(webpack@5.98.0) transitivePeerDependencies: - chokidar @@ -18587,23 +18631,23 @@ snapshots: '@next/swc-win32-x64-msvc@15.2.4': optional: true - '@ngtools/webpack@19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0))': + '@ngtools/webpack@19.2.0(@angular/compiler-cli@19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3))(typescript@5.8.3)(webpack@5.98.0)': dependencies: '@angular/compiler-cli': 19.2.0(@angular/compiler@19.2.0(@angular/core@19.2.0(rxjs@7.8.2)(zone.js@0.15.1)))(typescript@5.8.3) typescript: 5.8.3 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) '@ngtools/webpack@19.2.15(@angular/compiler-cli@19.2.14(@angular/compiler@19.2.14)(typescript@5.8.3))(typescript@5.8.3)(webpack@5.98.0)': dependencies: '@angular/compiler-cli': 19.2.14(@angular/compiler@19.2.14)(typescript@5.8.3) typescript: 5.8.3 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) - '@ngtools/webpack@19.2.19(@angular/compiler-cli@19.2.17(@angular/compiler@19.2.17)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.98.0)': + '@ngtools/webpack@19.2.19(@angular/compiler-cli@19.2.17(@angular/compiler@19.2.17)(typescript@5.9.3))(typescript@5.9.3)(webpack@5.98.0(esbuild@0.25.4))': dependencies: '@angular/compiler-cli': 19.2.17(@angular/compiler@19.2.17)(typescript@5.9.3) typescript: 5.9.3 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) '@nodelib/fs.scandir@2.1.5': dependencies: @@ -18700,16 +18744,6 @@ snapshots: - magicast - supports-color - '@nuxt/devtools-kit@1.7.0(magicast@0.3.5)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))': - dependencies: - '@nuxt/kit': 3.15.4(magicast@0.3.5) - '@nuxt/schema': 3.16.2 - execa: 7.2.0 - vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) - transitivePeerDependencies: - - magicast - - supports-color - '@nuxt/devtools-wizard@1.7.0': dependencies: consola: 3.4.2 @@ -18864,53 +18898,6 @@ snapshots: - utf-8-validate - vue - '@nuxt/devtools@1.7.0(rollup@4.55.1)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': - dependencies: - '@antfu/utils': 0.7.10 - '@nuxt/devtools-kit': 1.7.0(magicast@0.3.5)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) - '@nuxt/devtools-wizard': 1.7.0 - '@nuxt/kit': 3.15.4(magicast@0.3.5) - '@vue/devtools-core': 7.6.8(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) - '@vue/devtools-kit': 7.6.8 - birpc: 0.2.19 - consola: 3.4.2 - cronstrue: 2.59.0 - destr: 2.0.5 - error-stack-parser-es: 0.1.5 - execa: 7.2.0 - fast-npm-meta: 0.2.2 - flatted: 3.3.3 - get-port-please: 3.2.0 - hookable: 5.5.3 - image-meta: 0.2.1 - is-installed-globally: 1.0.0 - launch-editor: 2.11.1 - local-pkg: 0.5.1 - magicast: 0.3.5 - nypm: 0.4.1 - ohash: 1.1.6 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.3.1 - rc9: 2.1.2 - scule: 1.3.0 - semver: 7.7.3 - simple-git: 3.28.0 - sirv: 3.0.2 - tinyglobby: 0.2.15 - unimport: 3.14.6(rollup@4.55.1) - vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) - vite-plugin-inspect: 0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.55.1)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) - vite-plugin-vue-inspector: 5.3.2(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) - which: 3.0.1 - ws: 8.18.3 - transitivePeerDependencies: - - bufferutil - - rollup - - supports-color - - utf-8-validate - - vue - '@nuxt/kit@3.14.1592(magicast@0.3.5)(rollup@3.29.5)': dependencies: '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@3.29.5) @@ -19320,6 +19307,49 @@ snapshots: '@opencode-ai/sdk@1.0.221': {} + '@orpc/client@1.13.4': + dependencies: + '@orpc/shared': 1.13.4 + '@orpc/standard-server': 1.13.4 + '@orpc/standard-server-fetch': 1.13.4 + '@orpc/standard-server-peer': 1.13.4 + transitivePeerDependencies: + - '@opentelemetry/api' + + '@orpc/contract@1.13.4': + dependencies: + '@orpc/client': 1.13.4 + '@orpc/shared': 1.13.4 + '@standard-schema/spec': 1.1.0 + openapi-types: 12.1.3 + transitivePeerDependencies: + - '@opentelemetry/api' + + '@orpc/shared@1.13.4': + dependencies: + radash: 12.1.1 + type-fest: 5.4.1 + + '@orpc/standard-server-fetch@1.13.4': + dependencies: + '@orpc/shared': 1.13.4 + '@orpc/standard-server': 1.13.4 + transitivePeerDependencies: + - '@opentelemetry/api' + + '@orpc/standard-server-peer@1.13.4': + dependencies: + '@orpc/shared': 1.13.4 + '@orpc/standard-server': 1.13.4 + transitivePeerDependencies: + - '@opentelemetry/api' + + '@orpc/standard-server@1.13.4': + dependencies: + '@orpc/shared': 1.13.4 + transitivePeerDependencies: + - '@opentelemetry/api' + '@oxc-project/types@0.103.0': {} '@parcel/watcher-android-arm64@2.5.1': @@ -20610,6 +20640,8 @@ snapshots: '@stackblitz/sdk@1.11.0': {} + '@standard-schema/spec@1.1.0': {} + '@sveltejs/adapter-auto@4.0.0(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)))(svelte@5.19.9)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)))': dependencies: '@sveltejs/kit': 2.17.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.9)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)))(svelte@5.19.9)(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) @@ -21645,18 +21677,6 @@ snapshots: transitivePeerDependencies: - vite - '@vue/devtools-core@7.6.8(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3))': - dependencies: - '@vue/devtools-kit': 7.7.7 - '@vue/devtools-shared': 7.7.7 - mitt: 3.0.1 - nanoid: 5.1.5 - pathe: 1.1.2 - vite-hot-client: 0.2.4(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)) - vue: 3.5.25(typescript@5.9.3) - transitivePeerDependencies: - - vite - '@vue/devtools-core@8.0.2(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.13(typescript@5.8.3))': dependencies: '@vue/devtools-kit': 8.0.2 @@ -22312,14 +22332,14 @@ snapshots: '@babel/core': 7.26.10 find-cache-dir: 4.0.0 schema-utils: 4.3.2 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) - babel-loader@9.2.1(@babel/core@7.26.9)(webpack@5.98.0(esbuild@0.25.0)): + babel-loader@9.2.1(@babel/core@7.26.9)(webpack@5.98.0): dependencies: '@babel/core': 7.26.9 find-cache-dir: 4.0.0 schema-utils: 4.3.2 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.26.10): dependencies: @@ -22895,7 +22915,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.3.2 serialize-javascript: 6.0.2 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) core-js-compat@3.45.1: dependencies: @@ -22968,7 +22988,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) css-select@5.2.2: dependencies: @@ -25590,7 +25610,7 @@ snapshots: dependencies: less: 4.2.2 optionalDependencies: - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) less@4.2.2: dependencies: @@ -25615,7 +25635,7 @@ snapshots: dependencies: webpack-sources: 3.3.3 optionalDependencies: - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) light-my-request@6.6.0: dependencies: @@ -26162,7 +26182,7 @@ snapshots: dependencies: schema-utils: 4.3.2 tapable: 2.2.3 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) minimalistic-assert@1.0.1: {} @@ -26937,127 +26957,6 @@ snapshots: unhead: 1.11.20 unimport: 3.14.6(rollup@4.55.1) unplugin: 1.16.1 - unplugin-vue-router: 0.10.9(rollup@4.55.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) - unstorage: 1.17.0(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) - untyped: 1.5.2 - vue: 3.5.25(typescript@5.9.3) - vue-bundle-renderer: 2.1.2 - vue-devtools-stub: 0.1.0 - vue-router: 4.5.0(vue@3.5.25(typescript@5.9.3)) - optionalDependencies: - '@parcel/watcher': 2.5.1 - '@types/node': 22.10.5 - transitivePeerDependencies: - - '@azure/app-configuration' - - '@azure/cosmos' - - '@azure/data-tables' - - '@azure/identity' - - '@azure/keyvault-secrets' - - '@azure/storage-blob' - - '@biomejs/biome' - - '@capacitor/preferences' - - '@deno/kv' - - '@electric-sql/pglite' - - '@libsql/client' - - '@netlify/blobs' - - '@planetscale/database' - - '@upstash/redis' - - '@vercel/blob' - - '@vercel/functions' - - '@vercel/kv' - - aws4fetch - - better-sqlite3 - - bufferutil - - db0 - - drizzle-orm - - encoding - - eslint - - idb-keyval - - ioredis - - less - - lightningcss - - magicast - - meow - - mysql2 - - optionator - - rolldown - - rollup - - sass - - sass-embedded - - sqlite3 - - stylelint - - stylus - - sugarss - - supports-color - - terser - - typescript - - uploadthing - - utf-8-validate - - vite - - vls - - vti - - vue-tsc - - xml2js - - nuxt@3.14.1592(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.1)(@types/node@22.10.5)(db0@0.3.2)(encoding@0.1.13)(eslint@9.39.1(jiti@2.6.1))(ioredis@5.7.0)(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.55.1)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): - dependencies: - '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 1.7.0(rollup@4.55.1)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2))(vue@3.5.25(typescript@5.9.3)) - '@nuxt/kit': 3.14.1592(magicast@0.3.5)(rollup@4.55.1) - '@nuxt/schema': 3.14.1592(magicast@0.3.5)(rollup@4.55.1) - '@nuxt/telemetry': 2.6.6(magicast@0.3.5) - '@nuxt/vite-builder': 3.14.1592(@types/node@22.10.5)(eslint@9.39.1(jiti@2.6.1))(less@4.2.2)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.57)(rollup@4.55.1)(sass@1.85.0)(terser@5.43.1)(typescript@5.9.3)(vue@3.5.25(typescript@5.9.3)) - '@unhead/dom': 1.11.20 - '@unhead/shared': 1.11.20 - '@unhead/ssr': 1.11.20 - '@unhead/vue': 1.11.20(vue@3.5.25(typescript@5.9.3)) - '@vue/shared': 3.5.25 - acorn: 8.14.0 - c12: 2.0.1(magicast@0.3.5) - chokidar: 4.0.3 - compatx: 0.1.8 - consola: 3.4.2 - cookie-es: 1.2.2 - defu: 6.1.4 - destr: 2.0.5 - devalue: 5.3.2 - errx: 0.1.0 - esbuild: 0.24.2 - escape-string-regexp: 5.0.0 - estree-walker: 3.0.3 - globby: 14.1.0 - h3: 1.15.4 - hookable: 5.5.3 - ignore: 6.0.2 - impound: 0.2.2(rollup@4.55.1) - jiti: 2.6.1 - klona: 2.0.6 - knitwork: 1.3.0 - magic-string: 0.30.21 - mlly: 1.8.0 - nanotar: 0.1.1 - nitropack: 2.12.4(@netlify/blobs@9.1.2)(encoding@0.1.13)(rolldown@1.0.0-beta.57) - nuxi: 3.28.0 - nypm: 0.3.12 - ofetch: 1.5.1 - ohash: 1.1.6 - pathe: 1.1.2 - perfect-debounce: 1.0.0 - pkg-types: 1.3.1 - radix3: 1.1.2 - scule: 1.3.0 - semver: 7.7.3 - std-env: 3.10.0 - strip-literal: 2.1.1 - tinyglobby: 0.2.10 - ufo: 1.6.1 - ultrahtml: 1.6.0 - uncrypto: 0.1.3 - unctx: 2.4.1 - unenv: 1.10.0 - unhead: 1.11.20 - unimport: 3.14.6(rollup@4.55.1) - unplugin: 1.16.1 unplugin-vue-router: 0.10.9(rollup@4.55.1)(vue-router@4.5.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)) unstorage: 1.17.0(@netlify/blobs@9.1.2)(db0@0.3.2)(ioredis@5.7.0) untyped: 1.5.2 @@ -27295,6 +27194,8 @@ snapshots: ws: 8.18.3 zod: 3.25.3 + openapi-types@12.1.3: {} + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -27666,25 +27567,25 @@ snapshots: ts-node: 10.9.2(@types/node@22.10.5)(typescript@5.9.3) optional: true - postcss-loader@8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0(esbuild@0.25.0)): + postcss-loader@8.1.1(postcss@8.5.2)(typescript@5.8.3)(webpack@5.98.0): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.7 postcss: 8.5.2 semver: 7.7.3 optionalDependencies: - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) transitivePeerDependencies: - typescript - postcss-loader@8.1.1(postcss@8.5.2)(typescript@5.9.3)(webpack@5.98.0): + postcss-loader@8.1.1(postcss@8.5.2)(typescript@5.9.3)(webpack@5.98.0(esbuild@0.25.4)): dependencies: cosmiconfig: 9.0.0(typescript@5.9.3) jiti: 1.21.7 postcss: 8.5.2 semver: 7.7.3 optionalDependencies: - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) transitivePeerDependencies: - typescript @@ -28008,6 +27909,8 @@ snapshots: quote-unquote@1.0.0: {} + radash@12.1.1: {} + radix3@1.1.2: {} randombytes@2.1.0: @@ -28520,7 +28423,7 @@ snapshots: neo-async: 2.6.2 optionalDependencies: sass: 1.85.0 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) sass@1.85.0: dependencies: @@ -28921,7 +28824,7 @@ snapshots: dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) source-map-support@0.5.21: dependencies: @@ -29249,6 +29152,8 @@ snapshots: tabbable@6.3.0: {} + tagged-tag@1.0.0: {} + tailwindcss@3.4.14(ts-node@10.9.2(@types/node@22.10.5)(typescript@5.8.3)): dependencies: '@alloc/quick-lru': 5.2.0 @@ -29367,7 +29272,7 @@ snapshots: schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) optionalDependencies: esbuild: 0.25.0 @@ -29378,7 +29283,7 @@ snapshots: schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) optionalDependencies: esbuild: 0.25.4 @@ -29637,6 +29542,10 @@ snapshots: type-fest@4.41.0: {} + type-fest@5.4.1: + dependencies: + tagged-tag: 1.0.0 + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -29974,28 +29883,6 @@ snapshots: - rollup - vue - unplugin-vue-router@0.10.9(rollup@4.55.1)(vue-router@4.5.0(vue@3.5.13(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)): - dependencies: - '@babel/types': 7.28.5 - '@rollup/pluginutils': 5.2.0(rollup@4.55.1) - '@vue-macros/common': 1.16.1(vue@3.5.25(typescript@5.9.3)) - ast-walker-scope: 0.6.2 - chokidar: 3.6.0 - fast-glob: 3.3.3 - json5: 2.2.3 - local-pkg: 0.5.1 - magic-string: 0.30.21 - mlly: 1.8.0 - pathe: 1.1.2 - scule: 1.3.0 - unplugin: 2.0.0-beta.1 - yaml: 2.8.2 - optionalDependencies: - vue-router: 4.5.0(vue@3.5.13(typescript@5.9.3)) - transitivePeerDependencies: - - rollup - - vue - unplugin-vue-router@0.10.9(rollup@4.55.1)(vue-router@4.5.0(vue@3.5.25(typescript@5.9.3)))(vue@3.5.25(typescript@5.9.3)): dependencies: '@babel/types': 7.28.5 @@ -30216,10 +30103,6 @@ snapshots: dependencies: vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.39.0)(yaml@2.8.2) - vite-hot-client@0.2.4(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): - dependencies: - vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) - vite-hot-client@2.1.0(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): dependencies: vite: 7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) @@ -30400,24 +30283,6 @@ snapshots: - rollup - supports-color - vite-plugin-inspect@0.8.9(@nuxt/kit@3.15.4(magicast@0.3.5))(rollup@4.55.1)(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): - dependencies: - '@antfu/utils': 0.7.10 - '@rollup/pluginutils': 5.2.0(rollup@4.55.1) - debug: 4.4.3 - error-stack-parser-es: 0.1.5 - fs-extra: 11.3.1 - open: 10.2.0 - perfect-debounce: 1.0.0 - picocolors: 1.1.1 - sirv: 3.0.2 - vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) - optionalDependencies: - '@nuxt/kit': 3.15.4(magicast@0.3.5) - transitivePeerDependencies: - - rollup - - supports-color - vite-plugin-inspect@11.3.3(vite@7.1.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): dependencies: ansis: 4.1.0 @@ -30478,21 +30343,6 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-vue-inspector@5.3.2(vite@7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2)): - dependencies: - '@babel/core': 7.28.3 - '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.3) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.3) - '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.3) - '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.3) - '@vue/compiler-dom': 3.5.25 - kolorist: 1.8.0 - magic-string: 0.30.18 - vite: 7.2.2(@types/node@22.10.5)(jiti@2.6.1)(less@4.2.2)(sass@1.85.0)(terser@5.43.1)(yaml@2.8.2) - transitivePeerDependencies: - - supports-color - vite@5.4.19(@types/node@22.10.5)(less@4.2.2)(sass@1.85.0)(terser@5.39.0): dependencies: esbuild: 0.21.5 @@ -30967,7 +30817,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.2 optionalDependencies: - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) webpack-dev-server@5.2.0(webpack@5.98.0): dependencies: @@ -30999,7 +30849,7 @@ snapshots: webpack-dev-middleware: 7.4.2(webpack@5.98.0) ws: 8.18.3 optionalDependencies: - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) transitivePeerDependencies: - bufferutil - debug @@ -31037,7 +30887,7 @@ snapshots: webpack-dev-middleware: 7.4.2(webpack@5.98.0) ws: 8.18.3 optionalDependencies: - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) transitivePeerDependencies: - bufferutil - debug @@ -31055,7 +30905,7 @@ snapshots: webpack-subresource-integrity@5.1.0(webpack@5.98.0): dependencies: typed-assert: 1.0.9 - webpack: 5.98.0(esbuild@0.25.0) + webpack: 5.98.0(esbuild@0.25.4) webpack-virtual-modules@0.6.2: {} From 9a7b4fe860e14c0ea8878559def339d573aeb74c Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sun, 25 Jan 2026 21:34:25 +0800 Subject: [PATCH 03/23] allow custom router name --- .../plugins/zod/custom-router-name/index.ts | 3 + .../zod/custom-router-name/orpc.gen.ts | 59 ++++++++++ .../zod/custom-router-name/types.gen.ts | 101 ++++++++++++++++++ .../plugins/zod/custom-router-name/zod.gen.ts | 69 ++++++++++++ .../plugins/zod/custom-router-name/index.ts | 3 + .../zod/custom-router-name/orpc.gen.ts | 59 ++++++++++ .../zod/custom-router-name/types.gen.ts | 101 ++++++++++++++++++ .../plugins/zod/custom-router-name/zod.gen.ts | 69 ++++++++++++ .../plugins/zod/custom-router-name/index.ts | 3 + .../zod/custom-router-name/orpc.gen.ts | 59 ++++++++++ .../zod/custom-router-name/types.gen.ts | 101 ++++++++++++++++++ .../plugins/zod/custom-router-name/zod.gen.ts | 69 ++++++++++++ .../main/test/plugins.test.ts | 14 +++ .../openapi-ts/src/plugins/orpc/config.ts | 12 +-- .../openapi-ts/src/plugins/orpc/plugin.ts | 8 +- .../openapi-ts/src/plugins/orpc/types.d.ts | 8 ++ packages/openapi-ts/src/plugins/orpc/utils.ts | 15 +++ 17 files changed, 742 insertions(+), 11 deletions(-) create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/zod.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/zod.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/index.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/types.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/zod.gen.ts create mode 100644 packages/openapi-ts/src/plugins/orpc/utils.ts diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts new file mode 100644 index 000000000..a6ad28404 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const contract = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/types.gen.ts new file mode 100644 index 000000000..9844839de --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: string; +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts new file mode 100644 index 000000000..a6ad28404 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const contract = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/types.gen.ts new file mode 100644 index 000000000..836288372 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: `${string}://${string}` | (string & {}); +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/index.ts new file mode 100644 index 000000000..3c364f4df --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/index.ts @@ -0,0 +1,3 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts new file mode 100644 index 000000000..a6ad28404 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); + +export const contract = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/types.gen.ts new file mode 100644 index 000000000..836288372 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/types.gen.ts @@ -0,0 +1,101 @@ +// This file is auto-generated by @hey-api/openapi-ts + +export type ClientOptions = { + baseUrl: `${string}://${string}` | (string & {}); +}; + +export type GetFooData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type GetFooResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; + +export type FooPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; + +export type FooPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo'; +}; + +export type FooPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; + +export type GetFooBarData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type GetFooBarResponses = { + /** + * OK + */ + 200: string; +}; + +export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; + +export type FooBarPostData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPostResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; + +export type FooBarPutData = { + body?: never; + path?: never; + query?: never; + url: '/foo/bar'; +}; + +export type FooBarPutResponses = { + /** + * OK + */ + 200: string; +}; + +export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/zod.gen.ts new file mode 100644 index 000000000..b3dfa5f90 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/zod.gen.ts @@ -0,0 +1,69 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { z } from 'zod'; + +export const zGetFooData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooResponse = z.string(); + +export const zFooPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPostResponse = z.string(); + +export const zFooPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooPutResponse = z.string(); + +export const zGetFooBarData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zGetFooBarResponse = z.string(); + +export const zFooBarPostData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPostResponse = z.string(); + +export const zFooBarPutData = z.object({ + body: z.optional(z.never()), + path: z.optional(z.never()), + query: z.optional(z.never()) +}); + +/** + * OK + */ +export const zFooBarPutResponse = z.string(); diff --git a/packages/openapi-ts-tests/main/test/plugins.test.ts b/packages/openapi-ts-tests/main/test/plugins.test.ts index 980a54b14..76ea33125 100644 --- a/packages/openapi-ts-tests/main/test/plugins.test.ts +++ b/packages/openapi-ts-tests/main/test/plugins.test.ts @@ -603,6 +603,20 @@ for (const version of versions) { }), description: 'generate oRPC contracts with custom group key builder', }, + { + config: createConfig({ + input: 'sdk-instance.yaml', + output: 'custom-router-name', + plugins: [ + 'zod', + { + name: 'orpc', + routerName: 'contract', + }, + ], + }), + description: 'generate oRPC contracts with custom router name', + }, ]; it.each(scenarios)('$description', async ({ config }) => { diff --git a/packages/openapi-ts/src/plugins/orpc/config.ts b/packages/openapi-ts/src/plugins/orpc/config.ts index 3f9505bad..c353f2621 100644 --- a/packages/openapi-ts/src/plugins/orpc/config.ts +++ b/packages/openapi-ts/src/plugins/orpc/config.ts @@ -3,15 +3,7 @@ import { definePluginConfig } from '~/plugins/shared/utils/config'; import { handler } from './plugin'; import type { OrpcPlugin } from './types'; - -function capitalizeFirst(str: string): string { - return str.charAt(0).toUpperCase() + str.slice(1); -} - -// Convert kebab-case to camelCase: "chat-messages" → "chatMessages" -function toCamelCase(str: string): string { - return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()); -} +import { capitalizeFirst, toCamelCase } from './utils'; // Default: extract first path segment and convert to camelCase // "/chat-messages/{id}" → "chatMessages" @@ -74,6 +66,7 @@ export const defaultConfig: OrpcPlugin['Config'] = { groupKeyBuilder: defaultGroupKeyBuilder, operationKeyBuilder: defaultOperationKeyBuilder, output: 'orpc', + routerName: 'router', }, dependencies: ['@hey-api/typescript', 'zod'], handler, @@ -85,6 +78,7 @@ export const defaultConfig: OrpcPlugin['Config'] = { plugin.config.defaultTag ??= 'default'; plugin.config.groupKeyBuilder ??= defaultGroupKeyBuilder; plugin.config.operationKeyBuilder ??= defaultOperationKeyBuilder; + plugin.config.routerName ??= 'router'; }, tags: ['client'], }; diff --git a/packages/openapi-ts/src/plugins/orpc/plugin.ts b/packages/openapi-ts/src/plugins/orpc/plugin.ts index f0d70119c..0fcf3b180 100644 --- a/packages/openapi-ts/src/plugins/orpc/plugin.ts +++ b/packages/openapi-ts/src/plugins/orpc/plugin.ts @@ -2,6 +2,7 @@ import type { IR } from '~/ir/types'; import { $ } from '~/ts-dsl'; import type { OrpcPlugin } from './types'; +import { capitalizeFirst } from './utils'; function hasInput(operation: IR.OperationObject): boolean { const hasPathParams = Boolean( @@ -51,6 +52,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { defaultTag, groupKeyBuilder, operationKeyBuilder, + routerName, } = plugin.config; const operations: IR.OperationObject[] = []; @@ -216,7 +218,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { } // Create contracts object export grouped by API path segment (in separate router file) - const contractsSymbol = plugin.symbol('router', { + const contractsSymbol = plugin.symbol(routerName, { exported: true, meta: { category: 'contract', @@ -257,7 +259,9 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { plugin.node(contractsNode); // Create type export: export type Router = typeof router (in separate router file) - const routerTypeSymbol = plugin.symbol('Router', { + // Capitalize the router name for the type (e.g., 'router' → 'Router', 'contract' → 'Contract') + const routerTypeName = capitalizeFirst(routerName); + const routerTypeSymbol = plugin.symbol(routerTypeName, { exported: true, meta: { category: 'type', diff --git a/packages/openapi-ts/src/plugins/orpc/types.d.ts b/packages/openapi-ts/src/plugins/orpc/types.d.ts index 6cf671bd2..7ecc5ddc1 100644 --- a/packages/openapi-ts/src/plugins/orpc/types.d.ts +++ b/packages/openapi-ts/src/plugins/orpc/types.d.ts @@ -40,6 +40,13 @@ export type UserConfig = Plugin.Name<'orpc'> & * @default 'orpc' */ output?: string; + /** + * Name of the router export. + * The type export will be the capitalized version (e.g., 'router' → 'Router'). + * + * @default 'router' + */ + routerName?: string; }; export type Config = Plugin.Name<'orpc'> & @@ -50,6 +57,7 @@ export type Config = Plugin.Name<'orpc'> & groupKeyBuilder: (operation: IR.OperationObject) => string; operationKeyBuilder: (operationId: string, groupKey: string) => string; output: string; + routerName: string; }; export type OrpcPlugin = DefinePlugin; diff --git a/packages/openapi-ts/src/plugins/orpc/utils.ts b/packages/openapi-ts/src/plugins/orpc/utils.ts new file mode 100644 index 000000000..2376f743c --- /dev/null +++ b/packages/openapi-ts/src/plugins/orpc/utils.ts @@ -0,0 +1,15 @@ +/** + * Capitalize the first character of a string. + * @example capitalizeFirst('router') // 'Router' + */ +export function capitalizeFirst(str: string): string { + return str.charAt(0).toUpperCase() + str.slice(1); +} + +/** + * Convert kebab-case to camelCase. + * @example toCamelCase('chat-messages') // 'chatMessages' + */ +export function toCamelCase(str: string): string { + return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()); +} From 873ce2ed0e807f7f8a132605023a7548fa3cf40e Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sun, 25 Jan 2026 21:38:20 +0800 Subject: [PATCH 04/23] use ~/utils/naming --- packages/openapi-ts/src/plugins/orpc/config.ts | 6 +++--- packages/openapi-ts/src/plugins/orpc/plugin.ts | 4 ++-- packages/openapi-ts/src/plugins/orpc/utils.ts | 15 --------------- 3 files changed, 5 insertions(+), 20 deletions(-) delete mode 100644 packages/openapi-ts/src/plugins/orpc/utils.ts diff --git a/packages/openapi-ts/src/plugins/orpc/config.ts b/packages/openapi-ts/src/plugins/orpc/config.ts index c353f2621..643721dbc 100644 --- a/packages/openapi-ts/src/plugins/orpc/config.ts +++ b/packages/openapi-ts/src/plugins/orpc/config.ts @@ -1,22 +1,22 @@ import type { IR } from '~/ir/types'; import { definePluginConfig } from '~/plugins/shared/utils/config'; +import { toCase } from '~/utils/naming'; import { handler } from './plugin'; import type { OrpcPlugin } from './types'; -import { capitalizeFirst, toCamelCase } from './utils'; // Default: extract first path segment and convert to camelCase // "/chat-messages/{id}" → "chatMessages" function defaultGroupKeyBuilder(operation: IR.OperationObject): string { const segment = operation.path.split('/').filter(Boolean)[0] || 'common'; - return toCamelCase(segment); + return toCase(segment, 'camelCase'); } // Build patterns from segment name (camelCase group key) // "chatMessages" → ["ChatMessages", "ChatMessage"] function buildGroupPatterns(groupKey: string): string[] { const patterns: string[] = []; - const pascalKey = capitalizeFirst(groupKey); + const pascalKey = toCase(groupKey, 'PascalCase'); patterns.push(pascalKey); // Singular form: "ChatMessages" → "ChatMessage" diff --git a/packages/openapi-ts/src/plugins/orpc/plugin.ts b/packages/openapi-ts/src/plugins/orpc/plugin.ts index 0fcf3b180..a86e1ce43 100644 --- a/packages/openapi-ts/src/plugins/orpc/plugin.ts +++ b/packages/openapi-ts/src/plugins/orpc/plugin.ts @@ -1,8 +1,8 @@ import type { IR } from '~/ir/types'; import { $ } from '~/ts-dsl'; +import { toCase } from '~/utils/naming'; import type { OrpcPlugin } from './types'; -import { capitalizeFirst } from './utils'; function hasInput(operation: IR.OperationObject): boolean { const hasPathParams = Boolean( @@ -260,7 +260,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { // Create type export: export type Router = typeof router (in separate router file) // Capitalize the router name for the type (e.g., 'router' → 'Router', 'contract' → 'Contract') - const routerTypeName = capitalizeFirst(routerName); + const routerTypeName = toCase(routerName, 'PascalCase'); const routerTypeSymbol = plugin.symbol(routerTypeName, { exported: true, meta: { diff --git a/packages/openapi-ts/src/plugins/orpc/utils.ts b/packages/openapi-ts/src/plugins/orpc/utils.ts deleted file mode 100644 index 2376f743c..000000000 --- a/packages/openapi-ts/src/plugins/orpc/utils.ts +++ /dev/null @@ -1,15 +0,0 @@ -/** - * Capitalize the first character of a string. - * @example capitalizeFirst('router') // 'Router' - */ -export function capitalizeFirst(str: string): string { - return str.charAt(0).toUpperCase() + str.slice(1); -} - -/** - * Convert kebab-case to camelCase. - * @example toCamelCase('chat-messages') // 'chatMessages' - */ -export function toCamelCase(str: string): string { - return str.replace(/-([a-z])/g, (_, letter) => letter.toUpperCase()); -} From ce66a00e5186120926704cd8f10f0b0773c07918 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sun, 25 Jan 2026 22:01:50 +0800 Subject: [PATCH 05/23] no default 200 --- .../zod/custom-contract-name/orpc.gen.ts | 12 ++--- .../plugins/zod/custom-group-key/orpc.gen.ts | 12 ++--- .../zod/custom-router-name/orpc.gen.ts | 12 ++--- .../2.0.x/plugins/zod/default/orpc.gen.ts | 12 ++--- .../zod/custom-contract-name/orpc.gen.ts | 12 ++--- .../plugins/zod/custom-group-key/orpc.gen.ts | 12 ++--- .../zod/custom-router-name/orpc.gen.ts | 12 ++--- .../3.0.x/plugins/zod/default/orpc.gen.ts | 12 ++--- .../zod/custom-contract-name/orpc.gen.ts | 12 ++--- .../plugins/zod/custom-group-key/orpc.gen.ts | 12 ++--- .../zod/custom-router-name/orpc.gen.ts | 12 ++--- .../3.1.x/plugins/zod/default/orpc.gen.ts | 12 ++--- .../openapi-ts/src/plugins/orpc/plugin.ts | 52 +++++++++---------- 13 files changed, 98 insertions(+), 98 deletions(-) diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts index f24104a62..b03ac4b01 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooRpc = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostRpc = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutRpc = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarRpc = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostRpc = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutRpc = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const router = { foo: { get: getFooRpc, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts index 501302c0c..14f73c017 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const router = { get: { getFoo: getFooContract, getFooBar: getFooBarContract }, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts index a6ad28404..dec2c4522 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const contract = { foo: { get: getFooContract, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts index f0284f5af..6c850a63d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const router = { foo: { get: getFooContract, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts index f24104a62..b03ac4b01 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooRpc = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostRpc = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutRpc = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarRpc = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostRpc = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutRpc = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const router = { foo: { get: getFooRpc, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts index 501302c0c..14f73c017 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const router = { get: { getFoo: getFooContract, getFooBar: getFooBarContract }, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts index a6ad28404..dec2c4522 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const contract = { foo: { get: getFooContract, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts index f0284f5af..6c850a63d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const router = { foo: { get: getFooContract, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts index f24104a62..b03ac4b01 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooRpc = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostRpc = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutRpc = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarRpc = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostRpc = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutRpc = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const router = { foo: { get: getFooRpc, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts index 501302c0c..14f73c017 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const router = { get: { getFoo: getFooContract, getFooBar: getFooBarContract }, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts index a6ad28404..dec2c4522 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const contract = { foo: { get: getFooContract, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts index f0284f5af..6c850a63d 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts @@ -11,41 +11,41 @@ export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooResponse })); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPostResponse })); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooPutResponse })); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse, status: z.literal(200) })); +}).output(z.object({ body: zGetFooBarResponse })); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPostResponse })); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse, status: z.literal(200) })); +}).output(z.object({ body: zFooBarPutResponse })); export const router = { foo: { get: getFooContract, diff --git a/packages/openapi-ts/src/plugins/orpc/plugin.ts b/packages/openapi-ts/src/plugins/orpc/plugin.ts index a86e1ce43..8660f82ec 100644 --- a/packages/openapi-ts/src/plugins/orpc/plugin.ts +++ b/packages/openapi-ts/src/plugins/orpc/plugin.ts @@ -58,9 +58,13 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { const operations: IR.OperationObject[] = []; // Collect all operations using hey-api's forEach - plugin.forEach('operation', (event) => { - operations.push(event.operation); - }); + plugin.forEach( + 'operation', + (event) => { + operations.push(event.operation); + }, + { order: 'declarations' }, + ); // Register external symbols for imports const symbolOc = plugin.symbol('oc', { @@ -137,15 +141,8 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { if (tags.length > 0) { routeConfig.prop('tags', $.fromValue(tags)); } - if (successResponse.hasOutput) { - if (successResponse.statusCode !== 200) { - routeConfig.prop( - 'successStatus', - $.literal(successResponse.statusCode), - ); - } - // TODO: Add successDescription from OpenAPI description if available - // routeConfig.prop('successDescription', $.literal('OK')); + if (successResponse.hasOutput && successResponse.statusCode !== 200) { + routeConfig.prop('successStatus', $.literal(successResponse.statusCode)); } // Build the call chain: base.route({...}).input(...).output(...) @@ -161,7 +158,9 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { role: 'data', tool: 'zod', }); - expression = expression.attr('input').call($(zodDataSymbol)); + if (zodDataSymbol) { + expression = expression.attr('input').call($(zodDataSymbol)); + } } // .output(z.object({ body: zodResponseSchema, status: z.literal(200) })) if has output (detailed outputStructure) @@ -174,21 +173,22 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { role: 'responses', tool: 'zod', }); - const outputObject = $.object().prop('body', $(zodResponseSymbol)); + if (zodResponseSymbol) { + const outputObject = $.object().prop('body', $(zodResponseSymbol)); - // Add status code if available - if (successResponse.statusCode) { - outputObject.prop( - 'status', - $(symbolZ) - .attr('literal') - .call($.literal(successResponse.statusCode)), - ); - } + if (successResponse.statusCode !== 200) { + outputObject.prop( + 'status', + $(symbolZ) + .attr('literal') + .call($.literal(successResponse.statusCode)), + ); + } - expression = expression - .attr('output') - .call($(symbolZ).attr('object').call(outputObject)); + expression = expression + .attr('output') + .call($(symbolZ).attr('object').call(outputObject)); + } } const contractNode = $.const(contractSymbol) From 0e4915b0398bb829c63df4ab3969a0d7d770ee29 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sun, 25 Jan 2026 22:54:16 +0800 Subject: [PATCH 06/23] rename to @orpc/contract --- .../@orpc/contract.gen.ts | 59 +++++++++++++++++++ .../custom-group-key/@orpc/contract.gen.ts | 56 ++++++++++++++++++ .../custom-router-name/@orpc/contract.gen.ts | 59 +++++++++++++++++++ .../plugins/zod/default/@orpc/contract.gen.ts | 59 +++++++++++++++++++ .../@orpc/contract.gen.ts | 59 +++++++++++++++++++ .../custom-group-key/@orpc/contract.gen.ts | 56 ++++++++++++++++++ .../custom-router-name/@orpc/contract.gen.ts | 59 +++++++++++++++++++ .../plugins/zod/default/@orpc/contract.gen.ts | 59 +++++++++++++++++++ .../@orpc/contract.gen.ts | 59 +++++++++++++++++++ .../custom-group-key/@orpc/contract.gen.ts | 56 ++++++++++++++++++ .../custom-router-name/@orpc/contract.gen.ts | 59 +++++++++++++++++++ .../plugins/zod/default/@orpc/contract.gen.ts | 59 +++++++++++++++++++ .../main/test/plugins.test.ts | 8 +-- .../{orpc => @orpc/contract}/config.ts | 2 +- .../plugins/{orpc => @orpc/contract}/index.ts | 0 .../{orpc => @orpc/contract}/plugin.ts | 8 +-- .../{orpc => @orpc/contract}/types.d.ts | 4 +- packages/openapi-ts/src/plugins/config.ts | 8 +-- packages/openapi-ts/src/plugins/types.d.ts | 2 +- 19 files changed, 715 insertions(+), 16 deletions(-) create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts create mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts rename packages/openapi-ts/src/plugins/{orpc => @orpc/contract}/config.ts (99%) rename packages/openapi-ts/src/plugins/{orpc => @orpc/contract}/index.ts (100%) rename packages/openapi-ts/src/plugins/{orpc => @orpc/contract}/plugin.ts (98%) rename packages/openapi-ts/src/plugins/{orpc => @orpc/contract}/types.d.ts (93%) diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts new file mode 100644 index 000000000..254e8fdcf --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooRpc = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostRpc = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutRpc = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarRpc = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostRpc = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutRpc = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const router = { foo: { + get: getFooRpc, + fooPost: fooPostRpc, + fooPut: fooPutRpc, + getBar: getFooBarRpc, + fooBarPost: fooBarPostRpc, + fooBarPut: fooBarPutRpc + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts new file mode 100644 index 000000000..0d4ee662f --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts @@ -0,0 +1,56 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const router = { + get: { getFoo: getFooContract, getFooBar: getFooBarContract }, + post: { foo: fooPostContract, fooBar: fooBarPostContract }, + put: { foo: fooPutContract, fooBar: fooBarPutContract } +}; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts new file mode 100644 index 000000000..b6af0dd6c --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const contract = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts new file mode 100644 index 000000000..179718453 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const router = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts new file mode 100644 index 000000000..254e8fdcf --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooRpc = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostRpc = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutRpc = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarRpc = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostRpc = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutRpc = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const router = { foo: { + get: getFooRpc, + fooPost: fooPostRpc, + fooPut: fooPutRpc, + getBar: getFooBarRpc, + fooBarPost: fooBarPostRpc, + fooBarPut: fooBarPutRpc + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts new file mode 100644 index 000000000..0d4ee662f --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts @@ -0,0 +1,56 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const router = { + get: { getFoo: getFooContract, getFooBar: getFooBarContract }, + post: { foo: fooPostContract, fooBar: fooBarPostContract }, + put: { foo: fooPutContract, fooBar: fooBarPutContract } +}; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts new file mode 100644 index 000000000..b6af0dd6c --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const contract = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts new file mode 100644 index 000000000..179718453 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const router = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts new file mode 100644 index 000000000..254e8fdcf --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooRpc = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostRpc = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutRpc = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarRpc = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostRpc = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutRpc = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const router = { foo: { + get: getFooRpc, + fooPost: fooPostRpc, + fooPut: fooPutRpc, + getBar: getFooBarRpc, + fooBarPost: fooBarPostRpc, + fooBarPut: fooBarPutRpc + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts new file mode 100644 index 000000000..0d4ee662f --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts @@ -0,0 +1,56 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const router = { + get: { getFoo: getFooContract, getFooBar: getFooBarContract }, + post: { foo: fooPostContract, fooBar: fooBarPostContract }, + put: { foo: fooPutContract, fooBar: fooBarPutContract } +}; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts new file mode 100644 index 000000000..b6af0dd6c --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const contract = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts new file mode 100644 index 000000000..179718453 --- /dev/null +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts @@ -0,0 +1,59 @@ +// This file is auto-generated by @hey-api/openapi-ts + +import { oc } from '@orpc/contract'; +import { z } from 'zod'; + +import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; + +export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); + +export const getFooContract = base.route({ + method: 'GET', + path: '/foo', + tags: ['fooBaz'] +}).output(z.object({ body: zGetFooResponse })); + +export const fooPostContract = base.route({ + method: 'POST', + path: '/foo', + operationId: 'foo.-post', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPostResponse })); + +export const fooPutContract = base.route({ + method: 'PUT', + path: '/foo', + operationId: '/foo/-put/', + tags: ['fooBaz'] +}).output(z.object({ body: zFooPutResponse })); + +export const getFooBarContract = base.route({ + method: 'GET', + path: '/foo/bar', + tags: ['barBaz'] +}).output(z.object({ body: zGetFooBarResponse })); + +export const fooBarPostContract = base.route({ + method: 'POST', + path: '/foo/bar', + operationId: 'foo.bar.post', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPostResponse })); + +export const fooBarPutContract = base.route({ + method: 'PUT', + path: '/foo/bar', + operationId: '/foo/bar/put/', + tags: ['fooBaz', 'barBaz'] +}).output(z.object({ body: zFooBarPutResponse })); + +export const router = { foo: { + get: getFooContract, + fooPost: fooPostContract, + fooPut: fooPutContract, + getBar: getFooBarContract, + fooBarPost: fooBarPostContract, + fooBarPut: fooBarPutContract + } }; + +export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/plugins.test.ts b/packages/openapi-ts-tests/main/test/plugins.test.ts index 76ea33125..2b483d7d7 100644 --- a/packages/openapi-ts-tests/main/test/plugins.test.ts +++ b/packages/openapi-ts-tests/main/test/plugins.test.ts @@ -570,7 +570,7 @@ for (const version of versions) { config: createConfig({ input: 'sdk-instance.yaml', output: 'default', - plugins: ['zod', 'orpc'], + plugins: ['zod', '@orpc/contract'], }), description: 'generate oRPC contracts with Zod schemas', }, @@ -582,7 +582,7 @@ for (const version of versions) { 'zod', { contractNameBuilder: (id: string) => `${id}Rpc`, - name: 'orpc', + name: '@orpc/contract', }, ], }), @@ -597,7 +597,7 @@ for (const version of versions) { 'zod', { groupKeyBuilder: (operation) => operation.method, - name: 'orpc', + name: '@orpc/contract', }, ], }), @@ -610,7 +610,7 @@ for (const version of versions) { plugins: [ 'zod', { - name: 'orpc', + name: '@orpc/contract', routerName: 'contract', }, ], diff --git a/packages/openapi-ts/src/plugins/orpc/config.ts b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts similarity index 99% rename from packages/openapi-ts/src/plugins/orpc/config.ts rename to packages/openapi-ts/src/plugins/@orpc/contract/config.ts index 643721dbc..546d9db21 100644 --- a/packages/openapi-ts/src/plugins/orpc/config.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts @@ -70,7 +70,7 @@ export const defaultConfig: OrpcPlugin['Config'] = { }, dependencies: ['@hey-api/typescript', 'zod'], handler, - name: 'orpc', + name: '@orpc/contract', resolveConfig: (plugin) => { plugin.config.output ??= 'orpc'; plugin.config.exportFromIndex ??= false; diff --git a/packages/openapi-ts/src/plugins/orpc/index.ts b/packages/openapi-ts/src/plugins/@orpc/contract/index.ts similarity index 100% rename from packages/openapi-ts/src/plugins/orpc/index.ts rename to packages/openapi-ts/src/plugins/@orpc/contract/index.ts diff --git a/packages/openapi-ts/src/plugins/orpc/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts similarity index 98% rename from packages/openapi-ts/src/plugins/orpc/plugin.ts rename to packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index 8660f82ec..478f6912c 100644 --- a/packages/openapi-ts/src/plugins/orpc/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -79,7 +79,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { meta: { category: 'contract', resource: 'base', - tool: 'orpc', + tool: '@orpc/contract', }, }); @@ -114,7 +114,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { resourceId: op.id, role: 'contract', tags, - tool: 'orpc', + tool: '@orpc/contract', }, }); contractSymbols[op.id] = contractSymbol; @@ -223,7 +223,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { meta: { category: 'contract', resource: 'router', - tool: 'orpc', + tool: '@orpc/contract', }, }); @@ -266,7 +266,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { meta: { category: 'type', resource: 'router', - tool: 'orpc', + tool: '@orpc/contract', }, }); diff --git a/packages/openapi-ts/src/plugins/orpc/types.d.ts b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts similarity index 93% rename from packages/openapi-ts/src/plugins/orpc/types.d.ts rename to packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts index 7ecc5ddc1..a39d6bfa1 100644 --- a/packages/openapi-ts/src/plugins/orpc/types.d.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts @@ -1,7 +1,7 @@ import type { IR } from '~/ir/types'; import type { DefinePlugin, Plugin } from '~/plugins'; -export type UserConfig = Plugin.Name<'orpc'> & +export type UserConfig = Plugin.Name<'@orpc/contract'> & Plugin.Hooks & { /** * Custom naming function for contract symbols. @@ -49,7 +49,7 @@ export type UserConfig = Plugin.Name<'orpc'> & routerName?: string; }; -export type Config = Plugin.Name<'orpc'> & +export type Config = Plugin.Name<'@orpc/contract'> & Plugin.Hooks & { contractNameBuilder: (operationId: string) => string; defaultTag: string; diff --git a/packages/openapi-ts/src/plugins/config.ts b/packages/openapi-ts/src/plugins/config.ts index decdd994c..a36fb78ff 100644 --- a/packages/openapi-ts/src/plugins/config.ts +++ b/packages/openapi-ts/src/plugins/config.ts @@ -25,6 +25,8 @@ import type { HeyApiTransformersPlugin } from '~/plugins/@hey-api/transformers'; import { defaultConfig as heyApiTransformers } from '~/plugins/@hey-api/transformers'; import type { HeyApiTypeScriptPlugin } from '~/plugins/@hey-api/typescript'; import { defaultConfig as heyApiTypeScript } from '~/plugins/@hey-api/typescript'; +import type { OrpcPlugin } from '~/plugins/@orpc/contract'; +import { defaultConfig as orpcContract } from '~/plugins/@orpc/contract'; import type { PiniaColadaPlugin } from '~/plugins/@pinia/colada'; import { defaultConfig as piniaColada } from '~/plugins/@pinia/colada'; import type { TanStackAngularQueryPlugin } from '~/plugins/@tanstack/angular-query-experimental'; @@ -41,8 +43,6 @@ import type { ArktypePlugin } from '~/plugins/arktype'; import { defaultConfig as arktype } from '~/plugins/arktype'; import type { FastifyPlugin } from '~/plugins/fastify'; import { defaultConfig as fastify } from '~/plugins/fastify'; -import type { OrpcPlugin } from '~/plugins/orpc'; -import { defaultConfig as orpc } from '~/plugins/orpc'; import type { SwrPlugin } from '~/plugins/swr'; import { defaultConfig as swr } from '~/plugins/swr'; import type { PluginNames } from '~/plugins/types'; @@ -65,6 +65,7 @@ export interface PluginConfigMap { '@hey-api/sdk': HeyApiSdkPlugin['Types']; '@hey-api/transformers': HeyApiTransformersPlugin['Types']; '@hey-api/typescript': HeyApiTypeScriptPlugin['Types']; + '@orpc/contract': OrpcPlugin['Types']; '@pinia/colada': PiniaColadaPlugin['Types']; '@tanstack/angular-query-experimental': TanStackAngularQueryPlugin['Types']; '@tanstack/react-query': TanStackReactQueryPlugin['Types']; @@ -73,7 +74,6 @@ export interface PluginConfigMap { '@tanstack/vue-query': TanStackVueQueryPlugin['Types']; arktype: ArktypePlugin['Types']; fastify: FastifyPlugin['Types']; - orpc: OrpcPlugin['Types']; swr: SwrPlugin['Types']; valibot: ValibotPlugin['Types']; zod: ZodPlugin['Types']; @@ -95,6 +95,7 @@ export const defaultPluginConfigs: { '@hey-api/sdk': heyApiSdk, '@hey-api/transformers': heyApiTransformers, '@hey-api/typescript': heyApiTypeScript, + '@orpc/contract': orpcContract, '@pinia/colada': piniaColada, '@tanstack/angular-query-experimental': tanStackAngularQuery, '@tanstack/react-query': tanStackReactQuery, @@ -103,7 +104,6 @@ export const defaultPluginConfigs: { '@tanstack/vue-query': tanStackVueQuery, arktype, fastify, - orpc, swr, valibot, zod, diff --git a/packages/openapi-ts/src/plugins/types.d.ts b/packages/openapi-ts/src/plugins/types.d.ts index fc2df2276..ba3f1f00a 100644 --- a/packages/openapi-ts/src/plugins/types.d.ts +++ b/packages/openapi-ts/src/plugins/types.d.ts @@ -31,8 +31,8 @@ export type PluginNames = | '@tanstack/solid-query' | '@tanstack/svelte-query' | '@tanstack/vue-query' + | '@orpc/contract' | 'fastify' - | 'orpc' | 'swr'; export type AnyPluginName = PluginNames | (string & {}); From 1ad2bc3a37f89651f2fb544c68523af185f4d1e3 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sun, 25 Jan 2026 23:00:33 +0800 Subject: [PATCH 07/23] Update packages/openapi-ts/src/plugins/@orpc/contract/config.ts Co-authored-by: Lubos --- packages/openapi-ts/src/plugins/@orpc/contract/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts index 546d9db21..a57c10f8d 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts @@ -68,7 +68,7 @@ export const defaultConfig: OrpcPlugin['Config'] = { output: 'orpc', routerName: 'router', }, - dependencies: ['@hey-api/typescript', 'zod'], + dependencies: ['zod'], handler, name: '@orpc/contract', resolveConfig: (plugin) => { From 6954c39ae4916b84141b2811dd2e29bf29195696 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sun, 25 Jan 2026 23:11:07 +0800 Subject: [PATCH 08/23] createOperationComment --- .../src/plugins/@orpc/contract/plugin.ts | 22 +++---------------- 1 file changed, 3 insertions(+), 19 deletions(-) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index 478f6912c..c8024fa4a 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -1,4 +1,5 @@ import type { IR } from '~/ir/types'; +import { createOperationComment } from '~/plugins/shared/utils/operation'; import { $ } from '~/ts-dsl'; import { toCase } from '~/utils/naming'; @@ -191,27 +192,10 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { } } + const comments = createOperationComment(op); const contractNode = $.const(contractSymbol) .export() - .$if(op.summary || op.description || op.deprecated, (node) => { - const docLines: string[] = []; - if (op.summary) { - docLines.push(op.summary); - } - if (op.description && op.description !== op.summary) { - if (op.summary) { - docLines.push(''); - } - docLines.push(op.description); - } - if (op.deprecated) { - if (docLines.length > 0) { - docLines.push(''); - } - docLines.push('@deprecated'); - } - return node.doc(docLines); - }) + .$if(comments, (node) => node.doc(comments)) .assign(expression); plugin.node(contractNode); From 6d5e87420ebed3507681d002ba9635e1ae7f0ff4 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sun, 25 Jan 2026 23:14:57 +0800 Subject: [PATCH 09/23] .$if --- .../src/plugins/@orpc/contract/plugin.ts | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index c8024fa4a..a2ccb5c33 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -24,7 +24,9 @@ function hasInput(operation: IR.OperationObject): boolean { function getSuccessResponse( operation: IR.OperationObject, -): { hasOutput: true; statusCode: number } | { hasOutput: false } { +): + | { hasOutput: true; statusCode: number } + | { hasOutput: false; statusCode?: undefined } { if (operation.responses) { for (const [statusCode, response] of Object.entries(operation.responses)) { const statusCodeNumber = Number.parseInt(statusCode, 10); @@ -38,7 +40,7 @@ function getSuccessResponse( } } } - return { hasOutput: false }; + return { hasOutput: false, statusCode: undefined }; } function getTags(operation: IR.OperationObject, defaultTag: string): string[] { @@ -125,26 +127,21 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { const method = op.method.toUpperCase(); const routeConfig = $.object() .prop('method', $.literal(method)) - .prop('path', $.literal(op.path as string)); - - if (op.operationId) { - routeConfig.prop('operationId', $.literal(op.operationId)); - } - if (op.summary) { - routeConfig.prop('summary', $.literal(op.summary)); - } - if (op.description) { - routeConfig.prop('description', $.literal(op.description)); - } - if (op.deprecated) { - routeConfig.prop('deprecated', $.literal(true)); - } - if (tags.length > 0) { - routeConfig.prop('tags', $.fromValue(tags)); - } - if (successResponse.hasOutput && successResponse.statusCode !== 200) { - routeConfig.prop('successStatus', $.literal(successResponse.statusCode)); - } + .prop('path', $.literal(op.path as string)) + .$if(op.operationId, (node) => + node.prop('operationId', $.literal(op.operationId!)), + ) + .$if(op.summary, (node) => node.prop('summary', $.literal(op.summary!))) + .$if(op.description, (node) => + node.prop('description', $.literal(op.description!)), + ) + .$if(op.deprecated, (node) => node.prop('deprecated', $.literal(true))) + .$if(tags.length > 0, (node) => node.prop('tags', $.fromValue(tags))) + .$if( + successResponse.hasOutput && successResponse.statusCode !== 200, + (node) => + node.prop('successStatus', $.literal(successResponse.statusCode!)), + ); // Build the call chain: base.route({...}).input(...).output(...) let expression = $(baseSymbol).attr('route').call(routeConfig); From 2da35f2ec26fe83886d342fc083f2ab689e4c99a Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sun, 25 Jan 2026 23:17:48 +0800 Subject: [PATCH 10/23] remove output option --- packages/openapi-ts/src/plugins/@orpc/contract/config.ts | 2 -- packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts | 6 ------ 2 files changed, 8 deletions(-) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts index a57c10f8d..c49581f8d 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts @@ -65,14 +65,12 @@ export const defaultConfig: OrpcPlugin['Config'] = { exportFromIndex: false, groupKeyBuilder: defaultGroupKeyBuilder, operationKeyBuilder: defaultOperationKeyBuilder, - output: 'orpc', routerName: 'router', }, dependencies: ['zod'], handler, name: '@orpc/contract', resolveConfig: (plugin) => { - plugin.config.output ??= 'orpc'; plugin.config.exportFromIndex ??= false; plugin.config.contractNameBuilder ??= (id: string) => `${id}Contract`; plugin.config.defaultTag ??= 'default'; diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts index a39d6bfa1..221fd3d13 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts @@ -34,12 +34,6 @@ export type UserConfig = Plugin.Name<'@orpc/contract'> & * @default (operationId, groupKey) => simplified operationId */ operationKeyBuilder?: (operationId: string, groupKey: string) => string; - /** - * Name of the generated file. - * - * @default 'orpc' - */ - output?: string; /** * Name of the router export. * The type export will be the capitalized version (e.g., 'router' → 'Router'). From d7108b1bfac9d3e51574d3899197aec9b9466125 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Sun, 25 Jan 2026 23:29:56 +0800 Subject: [PATCH 11/23] support other validator --- .../src/plugins/@orpc/contract/config.ts | 5 ++- .../src/plugins/@orpc/contract/plugin.ts | 38 +++++++++++-------- .../src/plugins/@orpc/contract/types.d.ts | 11 ++++++ 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts index c49581f8d..b565876bc 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts @@ -66,8 +66,8 @@ export const defaultConfig: OrpcPlugin['Config'] = { groupKeyBuilder: defaultGroupKeyBuilder, operationKeyBuilder: defaultOperationKeyBuilder, routerName: 'router', + validator: 'zod', }, - dependencies: ['zod'], handler, name: '@orpc/contract', resolveConfig: (plugin) => { @@ -77,6 +77,9 @@ export const defaultConfig: OrpcPlugin['Config'] = { plugin.config.groupKeyBuilder ??= defaultGroupKeyBuilder; plugin.config.operationKeyBuilder ??= defaultOperationKeyBuilder; plugin.config.routerName ??= 'router'; + + plugin.config.validator ??= 'zod'; + plugin.dependencies.add(plugin.config.validator); }, tags: ['client'], }; diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index a2ccb5c33..83fe59bd5 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -56,6 +56,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { groupKeyBuilder, operationKeyBuilder, routerName, + validator, } = plugin.config; const operations: IR.OperationObject[] = []; @@ -74,7 +75,14 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { exported: false, external: '@orpc/contract', }); - const symbolZ = plugin.external('zod.z'); + const validatorExternalMap = { + arktype: 'type', + valibot: 'v', + zod: 'z', + } as const; + const symbolValidator = plugin.external( + `${validator}.${validatorExternalMap[validator]}`, + ); // Create base contract symbol const baseSymbol = plugin.symbol('base', { @@ -146,38 +154,38 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { // Build the call chain: base.route({...}).input(...).output(...) let expression = $(baseSymbol).attr('route').call(routeConfig); - // .input(zodDataSchema) if has input + // .input(dataSchema) if has input if (hasInput(op)) { - // Reference zod schema symbol dynamically from zod plugin - const zodDataSymbol = plugin.referenceSymbol({ + // Reference schema symbol dynamically from validator plugin + const dataSymbol = plugin.referenceSymbol({ category: 'schema', resource: 'operation', resourceId: op.id, role: 'data', - tool: 'zod', + tool: validator, }); - if (zodDataSymbol) { - expression = expression.attr('input').call($(zodDataSymbol)); + if (dataSymbol) { + expression = expression.attr('input').call($(dataSymbol)); } } - // .output(z.object({ body: zodResponseSchema, status: z.literal(200) })) if has output (detailed outputStructure) + // .output(v.object({ body: responseSchema, status: v.literal(200) })) if has output (detailed outputStructure) if (successResponse.hasOutput) { - // Reference zod response schema symbol dynamically from zod plugin - const zodResponseSymbol = plugin.referenceSymbol({ + // Reference response schema symbol dynamically from validator plugin + const responseSymbol = plugin.referenceSymbol({ category: 'schema', resource: 'operation', resourceId: op.id, role: 'responses', - tool: 'zod', + tool: validator, }); - if (zodResponseSymbol) { - const outputObject = $.object().prop('body', $(zodResponseSymbol)); + if (responseSymbol) { + const outputObject = $.object().prop('body', $(responseSymbol)); if (successResponse.statusCode !== 200) { outputObject.prop( 'status', - $(symbolZ) + $(symbolValidator) .attr('literal') .call($.literal(successResponse.statusCode)), ); @@ -185,7 +193,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { expression = expression .attr('output') - .call($(symbolZ).attr('object').call(outputObject)); + .call($(symbolValidator).attr('object').call(outputObject)); } } diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts index 221fd3d13..5e917002a 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts @@ -1,5 +1,6 @@ import type { IR } from '~/ir/types'; import type { DefinePlugin, Plugin } from '~/plugins'; +import type { PluginValidatorNames } from '~/plugins/types'; export type UserConfig = Plugin.Name<'@orpc/contract'> & Plugin.Hooks & { @@ -41,6 +42,15 @@ export type UserConfig = Plugin.Name<'@orpc/contract'> & * @default 'router' */ routerName?: string; + /** + * Validator plugin to use for input/output schemas. + * + * Ensure you have declared the selected library as a dependency to avoid + * errors. + * + * @default 'zod' + */ + validator?: PluginValidatorNames; }; export type Config = Plugin.Name<'@orpc/contract'> & @@ -52,6 +62,7 @@ export type Config = Plugin.Name<'@orpc/contract'> & operationKeyBuilder: (operationId: string, groupKey: string) => string; output: string; routerName: string; + validator: PluginValidatorNames; }; export type OrpcPlugin = DefinePlugin; From 8d97d23d030d84476dc6a8a5e2db1417b656b032 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:00:20 +0800 Subject: [PATCH 12/23] update test --- .../@orpc/contract.gen.ts | 129 +++++--- .../zod/custom-contract-name/zod.gen.ts | 137 +++++++-- .../custom-group-key/@orpc/contract.gen.ts | 122 ++++++-- .../plugins/zod/custom-group-key/zod.gen.ts | 137 +++++++-- .../custom-router-name/@orpc/contract.gen.ts | 129 +++++--- .../plugins/zod/custom-router-name/zod.gen.ts | 137 +++++++-- .../plugins/zod/default/@orpc/contract.gen.ts | 129 +++++--- .../3.0.x/plugins/zod/default/zod.gen.ts | 137 +++++++-- .../@orpc/contract.gen.ts | 129 +++++--- .../zod/custom-contract-name/zod.gen.ts | 137 +++++++-- .../custom-group-key/@orpc/contract.gen.ts | 122 ++++++-- .../plugins/zod/custom-group-key/zod.gen.ts | 137 +++++++-- .../custom-router-name/@orpc/contract.gen.ts | 129 +++++--- .../plugins/zod/custom-router-name/zod.gen.ts | 137 +++++++-- .../plugins/zod/default/@orpc/contract.gen.ts | 129 +++++--- .../3.1.x/plugins/zod/default/zod.gen.ts | 137 +++++++-- .../main/test/plugins.test.ts | 12 +- specs/3.0.x/orpc-contract.yaml | 285 ++++++++++++++++++ specs/3.1.x/orpc-contract.yaml | 285 ++++++++++++++++++ 19 files changed, 2190 insertions(+), 506 deletions(-) create mode 100644 specs/3.0.x/orpc-contract.yaml create mode 100644 specs/3.1.x/orpc-contract.yaml diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts index 254e8fdcf..2abe7f9f4 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -3,57 +3,110 @@ import { oc } from '@orpc/contract'; import { z } from 'zod'; -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; +import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); -export const getFooRpc = base.route({ +/** + * Get all users + */ +export const getUsersRpc = base.route({ method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); + path: '/users', + operationId: 'getUsers', + summary: 'Get all users', + tags: ['users'] +}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); -export const fooPostRpc = base.route({ +/** + * Create a new user + */ +export const createUserRpc = base.route({ method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); + path: '/users', + operationId: 'createUser', + summary: 'Create a new user', + tags: ['users'], + successStatus: 201 +}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); -export const fooPutRpc = base.route({ +/** + * Delete a user + */ +export const deleteUserRpc = base.route({ + method: 'DELETE', + path: '/users/{userId}', + operationId: 'deleteUser', + summary: 'Delete a user', + tags: ['users'] +}).input(zDeleteUserData); + +/** + * Get a user by ID + */ +export const getUserByIdRpc = base.route({ + method: 'GET', + path: '/users/{userId}', + operationId: 'getUserById', + summary: 'Get a user by ID', + tags: ['users'] +}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); + +/** + * Update a user + */ +export const updateUserRpc = base.route({ method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); + path: '/users/{userId}', + operationId: 'updateUser', + summary: 'Update a user', + tags: ['users'] +}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); -export const getFooBarRpc = base.route({ +/** + * Get all posts + */ +export const getPostsRpc = base.route({ method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); + path: '/posts', + operationId: 'getPosts', + summary: 'Get all posts', + tags: ['posts'] +}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); -export const fooBarPostRpc = base.route({ +/** + * Create a new post + */ +export const createPostRpc = base.route({ method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); + path: '/posts', + operationId: 'createPost', + summary: 'Create a new post', + tags: ['posts'], + successStatus: 201 +}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); -export const fooBarPutRpc = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { foo: { - get: getFooRpc, - fooPost: fooPostRpc, - fooPut: fooPutRpc, - getBar: getFooBarRpc, - fooBarPost: fooBarPostRpc, - fooBarPut: fooBarPutRpc +/** + * Get a post by ID + */ +export const getPostByIdRpc = base.route({ + method: 'GET', + path: '/posts/{postId}', + operationId: 'getPostById', + summary: 'Get a post by ID', + tags: ['posts'] +}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); + +export const router = { users: { + get: getUsersRpc, + create: createUserRpc, + delete: deleteUserRpc, + getById: getUserByIdRpc, + update: updateUserRpc + }, posts: { + get: getPostsRpc, + create: createPostRpc, + getById: getPostByIdRpc } }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/zod.gen.ts index b3dfa5f90..a5d3596f2 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/zod.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/zod.gen.ts @@ -2,68 +2,153 @@ import { z } from 'zod'; -export const zGetFooData = z.object({ +export const zUser = z.object({ + id: z.string(), + email: z.email(), + name: z.string(), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreateUserInput = z.object({ + email: z.email(), + name: z.string(), + password: z.optional(z.string().min(8)) +}); + +export const zUpdateUserInput = z.object({ + email: z.optional(z.email()), + name: z.optional(z.string()) +}); + +export const zPost = z.object({ + id: z.string(), + title: z.string(), + content: z.string(), + authorId: z.string(), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreatePostInput = z.object({ + title: z.string(), + content: z.string(), + status: z.optional(z.enum(['draft', 'published'])) +}); + +export const zGetUsersData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + limit: z.optional(z.int()).default(10), + offset: z.optional(z.int()).default(0) + })) }); /** - * OK + * List of users */ -export const zGetFooResponse = z.string(); +export const zGetUsersResponse = z.array(zUser); -export const zFooPostData = z.object({ - body: z.optional(z.never()), +export const zCreateUserData = z.object({ + body: zCreateUserInput, path: z.optional(z.never()), query: z.optional(z.never()) }); /** - * OK + * User created */ -export const zFooPostResponse = z.string(); +export const zCreateUserResponse = zUser; -export const zFooPutData = z.object({ +export const zDeleteUserData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), - query: z.optional(z.never()) + path: z.object({ + userId: z.string() + }), + query: z.optional(z.never()), + headers: z.optional(z.object({ + 'X-Request-Id': z.optional(z.string()) + })) }); /** - * OK + * User deleted */ -export const zFooPutResponse = z.string(); +export const zDeleteUserResponse = z.void(); -export const zGetFooBarData = z.object({ +export const zGetUserByIdData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User found */ -export const zGetFooBarResponse = z.string(); +export const zGetUserByIdResponse = zUser; -export const zFooBarPostData = z.object({ - body: z.optional(z.never()), - path: z.optional(z.never()), +export const zUpdateUserData = z.object({ + body: zUpdateUserInput, + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User updated */ -export const zFooBarPostResponse = z.string(); +export const zUpdateUserResponse = zUser; -export const zFooBarPutData = z.object({ +export const zGetPostsData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + authorId: z.optional(z.string()), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])) + })) +}); + +/** + * List of posts + */ +export const zGetPostsResponse = z.array(zPost); + +export const zCreatePostData = z.object({ + body: zCreatePostInput, + path: z.optional(z.never()), + query: z.optional(z.never()), + headers: z.object({ + 'X-Author-Id': z.string() + }) +}); + +/** + * Post created + */ +export const zCreatePostResponse = zPost; + +export const zGetPostByIdData = z.object({ + body: z.optional(z.never()), + path: z.object({ + postId: z.string() + }), + query: z.optional(z.object({ + includeComments: z.optional(z.boolean()).default(false) + })) }); /** - * OK + * Post found */ -export const zFooBarPutResponse = z.string(); +export const zGetPostByIdResponse = zPost; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts index 0d4ee662f..a5b99aea1 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts @@ -3,54 +3,110 @@ import { oc } from '@orpc/contract'; import { z } from 'zod'; -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; +import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); -export const getFooContract = base.route({ +/** + * Get all users + */ +export const getUsersContract = base.route({ method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); + path: '/users', + operationId: 'getUsers', + summary: 'Get all users', + tags: ['users'] +}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); -export const fooPostContract = base.route({ +/** + * Create a new user + */ +export const createUserContract = base.route({ method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); + path: '/users', + operationId: 'createUser', + summary: 'Create a new user', + tags: ['users'], + successStatus: 201 +}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); -export const fooPutContract = base.route({ +/** + * Delete a user + */ +export const deleteUserContract = base.route({ + method: 'DELETE', + path: '/users/{userId}', + operationId: 'deleteUser', + summary: 'Delete a user', + tags: ['users'] +}).input(zDeleteUserData); + +/** + * Get a user by ID + */ +export const getUserByIdContract = base.route({ + method: 'GET', + path: '/users/{userId}', + operationId: 'getUserById', + summary: 'Get a user by ID', + tags: ['users'] +}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); + +/** + * Update a user + */ +export const updateUserContract = base.route({ method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); + path: '/users/{userId}', + operationId: 'updateUser', + summary: 'Update a user', + tags: ['users'] +}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); -export const getFooBarContract = base.route({ +/** + * Get all posts + */ +export const getPostsContract = base.route({ method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); + path: '/posts', + operationId: 'getPosts', + summary: 'Get all posts', + tags: ['posts'] +}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); -export const fooBarPostContract = base.route({ +/** + * Create a new post + */ +export const createPostContract = base.route({ method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); + path: '/posts', + operationId: 'createPost', + summary: 'Create a new post', + tags: ['posts'], + successStatus: 201 +}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); +/** + * Get a post by ID + */ +export const getPostByIdContract = base.route({ + method: 'GET', + path: '/posts/{postId}', + operationId: 'getPostById', + summary: 'Get a post by ID', + tags: ['posts'] +}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); export const router = { - get: { getFoo: getFooContract, getFooBar: getFooBarContract }, - post: { foo: fooPostContract, fooBar: fooBarPostContract }, - put: { foo: fooPutContract, fooBar: fooBarPutContract } + get: { + getUsers: getUsersContract, + getUserById: getUserByIdContract, + getPosts: getPostsContract, + getPostById: getPostByIdContract + }, + post: { createUser: createUserContract, create: createPostContract }, + delete: { deleteUser: deleteUserContract }, + put: { updateUser: updateUserContract } }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/zod.gen.ts index b3dfa5f90..a5d3596f2 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/zod.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/zod.gen.ts @@ -2,68 +2,153 @@ import { z } from 'zod'; -export const zGetFooData = z.object({ +export const zUser = z.object({ + id: z.string(), + email: z.email(), + name: z.string(), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreateUserInput = z.object({ + email: z.email(), + name: z.string(), + password: z.optional(z.string().min(8)) +}); + +export const zUpdateUserInput = z.object({ + email: z.optional(z.email()), + name: z.optional(z.string()) +}); + +export const zPost = z.object({ + id: z.string(), + title: z.string(), + content: z.string(), + authorId: z.string(), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreatePostInput = z.object({ + title: z.string(), + content: z.string(), + status: z.optional(z.enum(['draft', 'published'])) +}); + +export const zGetUsersData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + limit: z.optional(z.int()).default(10), + offset: z.optional(z.int()).default(0) + })) }); /** - * OK + * List of users */ -export const zGetFooResponse = z.string(); +export const zGetUsersResponse = z.array(zUser); -export const zFooPostData = z.object({ - body: z.optional(z.never()), +export const zCreateUserData = z.object({ + body: zCreateUserInput, path: z.optional(z.never()), query: z.optional(z.never()) }); /** - * OK + * User created */ -export const zFooPostResponse = z.string(); +export const zCreateUserResponse = zUser; -export const zFooPutData = z.object({ +export const zDeleteUserData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), - query: z.optional(z.never()) + path: z.object({ + userId: z.string() + }), + query: z.optional(z.never()), + headers: z.optional(z.object({ + 'X-Request-Id': z.optional(z.string()) + })) }); /** - * OK + * User deleted */ -export const zFooPutResponse = z.string(); +export const zDeleteUserResponse = z.void(); -export const zGetFooBarData = z.object({ +export const zGetUserByIdData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User found */ -export const zGetFooBarResponse = z.string(); +export const zGetUserByIdResponse = zUser; -export const zFooBarPostData = z.object({ - body: z.optional(z.never()), - path: z.optional(z.never()), +export const zUpdateUserData = z.object({ + body: zUpdateUserInput, + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User updated */ -export const zFooBarPostResponse = z.string(); +export const zUpdateUserResponse = zUser; -export const zFooBarPutData = z.object({ +export const zGetPostsData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + authorId: z.optional(z.string()), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])) + })) +}); + +/** + * List of posts + */ +export const zGetPostsResponse = z.array(zPost); + +export const zCreatePostData = z.object({ + body: zCreatePostInput, + path: z.optional(z.never()), + query: z.optional(z.never()), + headers: z.object({ + 'X-Author-Id': z.string() + }) +}); + +/** + * Post created + */ +export const zCreatePostResponse = zPost; + +export const zGetPostByIdData = z.object({ + body: z.optional(z.never()), + path: z.object({ + postId: z.string() + }), + query: z.optional(z.object({ + includeComments: z.optional(z.boolean()).default(false) + })) }); /** - * OK + * Post found */ -export const zFooBarPutResponse = z.string(); +export const zGetPostByIdResponse = zPost; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts index b6af0dd6c..40379d5f8 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -3,57 +3,110 @@ import { oc } from '@orpc/contract'; import { z } from 'zod'; -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; +import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); -export const getFooContract = base.route({ +/** + * Get all users + */ +export const getUsersContract = base.route({ method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); + path: '/users', + operationId: 'getUsers', + summary: 'Get all users', + tags: ['users'] +}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); -export const fooPostContract = base.route({ +/** + * Create a new user + */ +export const createUserContract = base.route({ method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); + path: '/users', + operationId: 'createUser', + summary: 'Create a new user', + tags: ['users'], + successStatus: 201 +}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); -export const fooPutContract = base.route({ +/** + * Delete a user + */ +export const deleteUserContract = base.route({ + method: 'DELETE', + path: '/users/{userId}', + operationId: 'deleteUser', + summary: 'Delete a user', + tags: ['users'] +}).input(zDeleteUserData); + +/** + * Get a user by ID + */ +export const getUserByIdContract = base.route({ + method: 'GET', + path: '/users/{userId}', + operationId: 'getUserById', + summary: 'Get a user by ID', + tags: ['users'] +}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); + +/** + * Update a user + */ +export const updateUserContract = base.route({ method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); + path: '/users/{userId}', + operationId: 'updateUser', + summary: 'Update a user', + tags: ['users'] +}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); -export const getFooBarContract = base.route({ +/** + * Get all posts + */ +export const getPostsContract = base.route({ method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); + path: '/posts', + operationId: 'getPosts', + summary: 'Get all posts', + tags: ['posts'] +}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); -export const fooBarPostContract = base.route({ +/** + * Create a new post + */ +export const createPostContract = base.route({ method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); + path: '/posts', + operationId: 'createPost', + summary: 'Create a new post', + tags: ['posts'], + successStatus: 201 +}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const contract = { foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract +/** + * Get a post by ID + */ +export const getPostByIdContract = base.route({ + method: 'GET', + path: '/posts/{postId}', + operationId: 'getPostById', + summary: 'Get a post by ID', + tags: ['posts'] +}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); + +export const contract = { users: { + get: getUsersContract, + create: createUserContract, + delete: deleteUserContract, + getById: getUserByIdContract, + update: updateUserContract + }, posts: { + get: getPostsContract, + create: createPostContract, + getById: getPostByIdContract } }; export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/zod.gen.ts index b3dfa5f90..a5d3596f2 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/zod.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/zod.gen.ts @@ -2,68 +2,153 @@ import { z } from 'zod'; -export const zGetFooData = z.object({ +export const zUser = z.object({ + id: z.string(), + email: z.email(), + name: z.string(), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreateUserInput = z.object({ + email: z.email(), + name: z.string(), + password: z.optional(z.string().min(8)) +}); + +export const zUpdateUserInput = z.object({ + email: z.optional(z.email()), + name: z.optional(z.string()) +}); + +export const zPost = z.object({ + id: z.string(), + title: z.string(), + content: z.string(), + authorId: z.string(), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreatePostInput = z.object({ + title: z.string(), + content: z.string(), + status: z.optional(z.enum(['draft', 'published'])) +}); + +export const zGetUsersData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + limit: z.optional(z.int()).default(10), + offset: z.optional(z.int()).default(0) + })) }); /** - * OK + * List of users */ -export const zGetFooResponse = z.string(); +export const zGetUsersResponse = z.array(zUser); -export const zFooPostData = z.object({ - body: z.optional(z.never()), +export const zCreateUserData = z.object({ + body: zCreateUserInput, path: z.optional(z.never()), query: z.optional(z.never()) }); /** - * OK + * User created */ -export const zFooPostResponse = z.string(); +export const zCreateUserResponse = zUser; -export const zFooPutData = z.object({ +export const zDeleteUserData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), - query: z.optional(z.never()) + path: z.object({ + userId: z.string() + }), + query: z.optional(z.never()), + headers: z.optional(z.object({ + 'X-Request-Id': z.optional(z.string()) + })) }); /** - * OK + * User deleted */ -export const zFooPutResponse = z.string(); +export const zDeleteUserResponse = z.void(); -export const zGetFooBarData = z.object({ +export const zGetUserByIdData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User found */ -export const zGetFooBarResponse = z.string(); +export const zGetUserByIdResponse = zUser; -export const zFooBarPostData = z.object({ - body: z.optional(z.never()), - path: z.optional(z.never()), +export const zUpdateUserData = z.object({ + body: zUpdateUserInput, + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User updated */ -export const zFooBarPostResponse = z.string(); +export const zUpdateUserResponse = zUser; -export const zFooBarPutData = z.object({ +export const zGetPostsData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + authorId: z.optional(z.string()), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])) + })) +}); + +/** + * List of posts + */ +export const zGetPostsResponse = z.array(zPost); + +export const zCreatePostData = z.object({ + body: zCreatePostInput, + path: z.optional(z.never()), + query: z.optional(z.never()), + headers: z.object({ + 'X-Author-Id': z.string() + }) +}); + +/** + * Post created + */ +export const zCreatePostResponse = zPost; + +export const zGetPostByIdData = z.object({ + body: z.optional(z.never()), + path: z.object({ + postId: z.string() + }), + query: z.optional(z.object({ + includeComments: z.optional(z.boolean()).default(false) + })) }); /** - * OK + * Post found */ -export const zFooBarPutResponse = z.string(); +export const zGetPostByIdResponse = zPost; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts index 179718453..9f9bc0cce 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts @@ -3,57 +3,110 @@ import { oc } from '@orpc/contract'; import { z } from 'zod'; -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; +import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); -export const getFooContract = base.route({ +/** + * Get all users + */ +export const getUsersContract = base.route({ method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); + path: '/users', + operationId: 'getUsers', + summary: 'Get all users', + tags: ['users'] +}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); -export const fooPostContract = base.route({ +/** + * Create a new user + */ +export const createUserContract = base.route({ method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); + path: '/users', + operationId: 'createUser', + summary: 'Create a new user', + tags: ['users'], + successStatus: 201 +}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); -export const fooPutContract = base.route({ +/** + * Delete a user + */ +export const deleteUserContract = base.route({ + method: 'DELETE', + path: '/users/{userId}', + operationId: 'deleteUser', + summary: 'Delete a user', + tags: ['users'] +}).input(zDeleteUserData); + +/** + * Get a user by ID + */ +export const getUserByIdContract = base.route({ + method: 'GET', + path: '/users/{userId}', + operationId: 'getUserById', + summary: 'Get a user by ID', + tags: ['users'] +}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); + +/** + * Update a user + */ +export const updateUserContract = base.route({ method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); + path: '/users/{userId}', + operationId: 'updateUser', + summary: 'Update a user', + tags: ['users'] +}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); -export const getFooBarContract = base.route({ +/** + * Get all posts + */ +export const getPostsContract = base.route({ method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); + path: '/posts', + operationId: 'getPosts', + summary: 'Get all posts', + tags: ['posts'] +}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); -export const fooBarPostContract = base.route({ +/** + * Create a new post + */ +export const createPostContract = base.route({ method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); + path: '/posts', + operationId: 'createPost', + summary: 'Create a new post', + tags: ['posts'], + successStatus: 201 +}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract +/** + * Get a post by ID + */ +export const getPostByIdContract = base.route({ + method: 'GET', + path: '/posts/{postId}', + operationId: 'getPostById', + summary: 'Get a post by ID', + tags: ['posts'] +}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); + +export const router = { users: { + get: getUsersContract, + create: createUserContract, + delete: deleteUserContract, + getById: getUserByIdContract, + update: updateUserContract + }, posts: { + get: getPostsContract, + create: createPostContract, + getById: getPostByIdContract } }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/zod.gen.ts index b3dfa5f90..a5d3596f2 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/zod.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/zod.gen.ts @@ -2,68 +2,153 @@ import { z } from 'zod'; -export const zGetFooData = z.object({ +export const zUser = z.object({ + id: z.string(), + email: z.email(), + name: z.string(), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreateUserInput = z.object({ + email: z.email(), + name: z.string(), + password: z.optional(z.string().min(8)) +}); + +export const zUpdateUserInput = z.object({ + email: z.optional(z.email()), + name: z.optional(z.string()) +}); + +export const zPost = z.object({ + id: z.string(), + title: z.string(), + content: z.string(), + authorId: z.string(), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreatePostInput = z.object({ + title: z.string(), + content: z.string(), + status: z.optional(z.enum(['draft', 'published'])) +}); + +export const zGetUsersData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + limit: z.optional(z.int()).default(10), + offset: z.optional(z.int()).default(0) + })) }); /** - * OK + * List of users */ -export const zGetFooResponse = z.string(); +export const zGetUsersResponse = z.array(zUser); -export const zFooPostData = z.object({ - body: z.optional(z.never()), +export const zCreateUserData = z.object({ + body: zCreateUserInput, path: z.optional(z.never()), query: z.optional(z.never()) }); /** - * OK + * User created */ -export const zFooPostResponse = z.string(); +export const zCreateUserResponse = zUser; -export const zFooPutData = z.object({ +export const zDeleteUserData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), - query: z.optional(z.never()) + path: z.object({ + userId: z.string() + }), + query: z.optional(z.never()), + headers: z.optional(z.object({ + 'X-Request-Id': z.optional(z.string()) + })) }); /** - * OK + * User deleted */ -export const zFooPutResponse = z.string(); +export const zDeleteUserResponse = z.void(); -export const zGetFooBarData = z.object({ +export const zGetUserByIdData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User found */ -export const zGetFooBarResponse = z.string(); +export const zGetUserByIdResponse = zUser; -export const zFooBarPostData = z.object({ - body: z.optional(z.never()), - path: z.optional(z.never()), +export const zUpdateUserData = z.object({ + body: zUpdateUserInput, + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User updated */ -export const zFooBarPostResponse = z.string(); +export const zUpdateUserResponse = zUser; -export const zFooBarPutData = z.object({ +export const zGetPostsData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + authorId: z.optional(z.string()), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])) + })) +}); + +/** + * List of posts + */ +export const zGetPostsResponse = z.array(zPost); + +export const zCreatePostData = z.object({ + body: zCreatePostInput, + path: z.optional(z.never()), + query: z.optional(z.never()), + headers: z.object({ + 'X-Author-Id': z.string() + }) +}); + +/** + * Post created + */ +export const zCreatePostResponse = zPost; + +export const zGetPostByIdData = z.object({ + body: z.optional(z.never()), + path: z.object({ + postId: z.string() + }), + query: z.optional(z.object({ + includeComments: z.optional(z.boolean()).default(false) + })) }); /** - * OK + * Post found */ -export const zFooBarPutResponse = z.string(); +export const zGetPostByIdResponse = zPost; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts index 254e8fdcf..2abe7f9f4 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -3,57 +3,110 @@ import { oc } from '@orpc/contract'; import { z } from 'zod'; -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; +import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); -export const getFooRpc = base.route({ +/** + * Get all users + */ +export const getUsersRpc = base.route({ method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); + path: '/users', + operationId: 'getUsers', + summary: 'Get all users', + tags: ['users'] +}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); -export const fooPostRpc = base.route({ +/** + * Create a new user + */ +export const createUserRpc = base.route({ method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); + path: '/users', + operationId: 'createUser', + summary: 'Create a new user', + tags: ['users'], + successStatus: 201 +}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); -export const fooPutRpc = base.route({ +/** + * Delete a user + */ +export const deleteUserRpc = base.route({ + method: 'DELETE', + path: '/users/{userId}', + operationId: 'deleteUser', + summary: 'Delete a user', + tags: ['users'] +}).input(zDeleteUserData); + +/** + * Get a user by ID + */ +export const getUserByIdRpc = base.route({ + method: 'GET', + path: '/users/{userId}', + operationId: 'getUserById', + summary: 'Get a user by ID', + tags: ['users'] +}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); + +/** + * Update a user + */ +export const updateUserRpc = base.route({ method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); + path: '/users/{userId}', + operationId: 'updateUser', + summary: 'Update a user', + tags: ['users'] +}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); -export const getFooBarRpc = base.route({ +/** + * Get all posts + */ +export const getPostsRpc = base.route({ method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); + path: '/posts', + operationId: 'getPosts', + summary: 'Get all posts', + tags: ['posts'] +}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); -export const fooBarPostRpc = base.route({ +/** + * Create a new post + */ +export const createPostRpc = base.route({ method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); + path: '/posts', + operationId: 'createPost', + summary: 'Create a new post', + tags: ['posts'], + successStatus: 201 +}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); -export const fooBarPutRpc = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { foo: { - get: getFooRpc, - fooPost: fooPostRpc, - fooPut: fooPutRpc, - getBar: getFooBarRpc, - fooBarPost: fooBarPostRpc, - fooBarPut: fooBarPutRpc +/** + * Get a post by ID + */ +export const getPostByIdRpc = base.route({ + method: 'GET', + path: '/posts/{postId}', + operationId: 'getPostById', + summary: 'Get a post by ID', + tags: ['posts'] +}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); + +export const router = { users: { + get: getUsersRpc, + create: createUserRpc, + delete: deleteUserRpc, + getById: getUserByIdRpc, + update: updateUserRpc + }, posts: { + get: getPostsRpc, + create: createPostRpc, + getById: getPostByIdRpc } }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/zod.gen.ts index b3dfa5f90..a5d3596f2 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/zod.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/zod.gen.ts @@ -2,68 +2,153 @@ import { z } from 'zod'; -export const zGetFooData = z.object({ +export const zUser = z.object({ + id: z.string(), + email: z.email(), + name: z.string(), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreateUserInput = z.object({ + email: z.email(), + name: z.string(), + password: z.optional(z.string().min(8)) +}); + +export const zUpdateUserInput = z.object({ + email: z.optional(z.email()), + name: z.optional(z.string()) +}); + +export const zPost = z.object({ + id: z.string(), + title: z.string(), + content: z.string(), + authorId: z.string(), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreatePostInput = z.object({ + title: z.string(), + content: z.string(), + status: z.optional(z.enum(['draft', 'published'])) +}); + +export const zGetUsersData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + limit: z.optional(z.int()).default(10), + offset: z.optional(z.int()).default(0) + })) }); /** - * OK + * List of users */ -export const zGetFooResponse = z.string(); +export const zGetUsersResponse = z.array(zUser); -export const zFooPostData = z.object({ - body: z.optional(z.never()), +export const zCreateUserData = z.object({ + body: zCreateUserInput, path: z.optional(z.never()), query: z.optional(z.never()) }); /** - * OK + * User created */ -export const zFooPostResponse = z.string(); +export const zCreateUserResponse = zUser; -export const zFooPutData = z.object({ +export const zDeleteUserData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), - query: z.optional(z.never()) + path: z.object({ + userId: z.string() + }), + query: z.optional(z.never()), + headers: z.optional(z.object({ + 'X-Request-Id': z.optional(z.string()) + })) }); /** - * OK + * User deleted */ -export const zFooPutResponse = z.string(); +export const zDeleteUserResponse = z.void(); -export const zGetFooBarData = z.object({ +export const zGetUserByIdData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User found */ -export const zGetFooBarResponse = z.string(); +export const zGetUserByIdResponse = zUser; -export const zFooBarPostData = z.object({ - body: z.optional(z.never()), - path: z.optional(z.never()), +export const zUpdateUserData = z.object({ + body: zUpdateUserInput, + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User updated */ -export const zFooBarPostResponse = z.string(); +export const zUpdateUserResponse = zUser; -export const zFooBarPutData = z.object({ +export const zGetPostsData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + authorId: z.optional(z.string()), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])) + })) +}); + +/** + * List of posts + */ +export const zGetPostsResponse = z.array(zPost); + +export const zCreatePostData = z.object({ + body: zCreatePostInput, + path: z.optional(z.never()), + query: z.optional(z.never()), + headers: z.object({ + 'X-Author-Id': z.string() + }) +}); + +/** + * Post created + */ +export const zCreatePostResponse = zPost; + +export const zGetPostByIdData = z.object({ + body: z.optional(z.never()), + path: z.object({ + postId: z.string() + }), + query: z.optional(z.object({ + includeComments: z.optional(z.boolean()).default(false) + })) }); /** - * OK + * Post found */ -export const zFooBarPutResponse = z.string(); +export const zGetPostByIdResponse = zPost; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts index 0d4ee662f..a5b99aea1 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts @@ -3,54 +3,110 @@ import { oc } from '@orpc/contract'; import { z } from 'zod'; -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; +import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); -export const getFooContract = base.route({ +/** + * Get all users + */ +export const getUsersContract = base.route({ method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); + path: '/users', + operationId: 'getUsers', + summary: 'Get all users', + tags: ['users'] +}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); -export const fooPostContract = base.route({ +/** + * Create a new user + */ +export const createUserContract = base.route({ method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); + path: '/users', + operationId: 'createUser', + summary: 'Create a new user', + tags: ['users'], + successStatus: 201 +}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); -export const fooPutContract = base.route({ +/** + * Delete a user + */ +export const deleteUserContract = base.route({ + method: 'DELETE', + path: '/users/{userId}', + operationId: 'deleteUser', + summary: 'Delete a user', + tags: ['users'] +}).input(zDeleteUserData); + +/** + * Get a user by ID + */ +export const getUserByIdContract = base.route({ + method: 'GET', + path: '/users/{userId}', + operationId: 'getUserById', + summary: 'Get a user by ID', + tags: ['users'] +}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); + +/** + * Update a user + */ +export const updateUserContract = base.route({ method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); + path: '/users/{userId}', + operationId: 'updateUser', + summary: 'Update a user', + tags: ['users'] +}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); -export const getFooBarContract = base.route({ +/** + * Get all posts + */ +export const getPostsContract = base.route({ method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); + path: '/posts', + operationId: 'getPosts', + summary: 'Get all posts', + tags: ['posts'] +}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); -export const fooBarPostContract = base.route({ +/** + * Create a new post + */ +export const createPostContract = base.route({ method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); + path: '/posts', + operationId: 'createPost', + summary: 'Create a new post', + tags: ['posts'], + successStatus: 201 +}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); +/** + * Get a post by ID + */ +export const getPostByIdContract = base.route({ + method: 'GET', + path: '/posts/{postId}', + operationId: 'getPostById', + summary: 'Get a post by ID', + tags: ['posts'] +}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); export const router = { - get: { getFoo: getFooContract, getFooBar: getFooBarContract }, - post: { foo: fooPostContract, fooBar: fooBarPostContract }, - put: { foo: fooPutContract, fooBar: fooBarPutContract } + get: { + getUsers: getUsersContract, + getUserById: getUserByIdContract, + getPosts: getPostsContract, + getPostById: getPostByIdContract + }, + post: { createUser: createUserContract, create: createPostContract }, + delete: { deleteUser: deleteUserContract }, + put: { updateUser: updateUserContract } }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/zod.gen.ts index b3dfa5f90..a5d3596f2 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/zod.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/zod.gen.ts @@ -2,68 +2,153 @@ import { z } from 'zod'; -export const zGetFooData = z.object({ +export const zUser = z.object({ + id: z.string(), + email: z.email(), + name: z.string(), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreateUserInput = z.object({ + email: z.email(), + name: z.string(), + password: z.optional(z.string().min(8)) +}); + +export const zUpdateUserInput = z.object({ + email: z.optional(z.email()), + name: z.optional(z.string()) +}); + +export const zPost = z.object({ + id: z.string(), + title: z.string(), + content: z.string(), + authorId: z.string(), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreatePostInput = z.object({ + title: z.string(), + content: z.string(), + status: z.optional(z.enum(['draft', 'published'])) +}); + +export const zGetUsersData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + limit: z.optional(z.int()).default(10), + offset: z.optional(z.int()).default(0) + })) }); /** - * OK + * List of users */ -export const zGetFooResponse = z.string(); +export const zGetUsersResponse = z.array(zUser); -export const zFooPostData = z.object({ - body: z.optional(z.never()), +export const zCreateUserData = z.object({ + body: zCreateUserInput, path: z.optional(z.never()), query: z.optional(z.never()) }); /** - * OK + * User created */ -export const zFooPostResponse = z.string(); +export const zCreateUserResponse = zUser; -export const zFooPutData = z.object({ +export const zDeleteUserData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), - query: z.optional(z.never()) + path: z.object({ + userId: z.string() + }), + query: z.optional(z.never()), + headers: z.optional(z.object({ + 'X-Request-Id': z.optional(z.string()) + })) }); /** - * OK + * User deleted */ -export const zFooPutResponse = z.string(); +export const zDeleteUserResponse = z.void(); -export const zGetFooBarData = z.object({ +export const zGetUserByIdData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User found */ -export const zGetFooBarResponse = z.string(); +export const zGetUserByIdResponse = zUser; -export const zFooBarPostData = z.object({ - body: z.optional(z.never()), - path: z.optional(z.never()), +export const zUpdateUserData = z.object({ + body: zUpdateUserInput, + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User updated */ -export const zFooBarPostResponse = z.string(); +export const zUpdateUserResponse = zUser; -export const zFooBarPutData = z.object({ +export const zGetPostsData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + authorId: z.optional(z.string()), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])) + })) +}); + +/** + * List of posts + */ +export const zGetPostsResponse = z.array(zPost); + +export const zCreatePostData = z.object({ + body: zCreatePostInput, + path: z.optional(z.never()), + query: z.optional(z.never()), + headers: z.object({ + 'X-Author-Id': z.string() + }) +}); + +/** + * Post created + */ +export const zCreatePostResponse = zPost; + +export const zGetPostByIdData = z.object({ + body: z.optional(z.never()), + path: z.object({ + postId: z.string() + }), + query: z.optional(z.object({ + includeComments: z.optional(z.boolean()).default(false) + })) }); /** - * OK + * Post found */ -export const zFooBarPutResponse = z.string(); +export const zGetPostByIdResponse = zPost; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts index b6af0dd6c..40379d5f8 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -3,57 +3,110 @@ import { oc } from '@orpc/contract'; import { z } from 'zod'; -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; +import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); -export const getFooContract = base.route({ +/** + * Get all users + */ +export const getUsersContract = base.route({ method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); + path: '/users', + operationId: 'getUsers', + summary: 'Get all users', + tags: ['users'] +}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); -export const fooPostContract = base.route({ +/** + * Create a new user + */ +export const createUserContract = base.route({ method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); + path: '/users', + operationId: 'createUser', + summary: 'Create a new user', + tags: ['users'], + successStatus: 201 +}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); -export const fooPutContract = base.route({ +/** + * Delete a user + */ +export const deleteUserContract = base.route({ + method: 'DELETE', + path: '/users/{userId}', + operationId: 'deleteUser', + summary: 'Delete a user', + tags: ['users'] +}).input(zDeleteUserData); + +/** + * Get a user by ID + */ +export const getUserByIdContract = base.route({ + method: 'GET', + path: '/users/{userId}', + operationId: 'getUserById', + summary: 'Get a user by ID', + tags: ['users'] +}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); + +/** + * Update a user + */ +export const updateUserContract = base.route({ method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); + path: '/users/{userId}', + operationId: 'updateUser', + summary: 'Update a user', + tags: ['users'] +}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); -export const getFooBarContract = base.route({ +/** + * Get all posts + */ +export const getPostsContract = base.route({ method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); + path: '/posts', + operationId: 'getPosts', + summary: 'Get all posts', + tags: ['posts'] +}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); -export const fooBarPostContract = base.route({ +/** + * Create a new post + */ +export const createPostContract = base.route({ method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); + path: '/posts', + operationId: 'createPost', + summary: 'Create a new post', + tags: ['posts'], + successStatus: 201 +}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const contract = { foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract +/** + * Get a post by ID + */ +export const getPostByIdContract = base.route({ + method: 'GET', + path: '/posts/{postId}', + operationId: 'getPostById', + summary: 'Get a post by ID', + tags: ['posts'] +}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); + +export const contract = { users: { + get: getUsersContract, + create: createUserContract, + delete: deleteUserContract, + getById: getUserByIdContract, + update: updateUserContract + }, posts: { + get: getPostsContract, + create: createPostContract, + getById: getPostByIdContract } }; export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/zod.gen.ts index b3dfa5f90..a5d3596f2 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/zod.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/zod.gen.ts @@ -2,68 +2,153 @@ import { z } from 'zod'; -export const zGetFooData = z.object({ +export const zUser = z.object({ + id: z.string(), + email: z.email(), + name: z.string(), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreateUserInput = z.object({ + email: z.email(), + name: z.string(), + password: z.optional(z.string().min(8)) +}); + +export const zUpdateUserInput = z.object({ + email: z.optional(z.email()), + name: z.optional(z.string()) +}); + +export const zPost = z.object({ + id: z.string(), + title: z.string(), + content: z.string(), + authorId: z.string(), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreatePostInput = z.object({ + title: z.string(), + content: z.string(), + status: z.optional(z.enum(['draft', 'published'])) +}); + +export const zGetUsersData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + limit: z.optional(z.int()).default(10), + offset: z.optional(z.int()).default(0) + })) }); /** - * OK + * List of users */ -export const zGetFooResponse = z.string(); +export const zGetUsersResponse = z.array(zUser); -export const zFooPostData = z.object({ - body: z.optional(z.never()), +export const zCreateUserData = z.object({ + body: zCreateUserInput, path: z.optional(z.never()), query: z.optional(z.never()) }); /** - * OK + * User created */ -export const zFooPostResponse = z.string(); +export const zCreateUserResponse = zUser; -export const zFooPutData = z.object({ +export const zDeleteUserData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), - query: z.optional(z.never()) + path: z.object({ + userId: z.string() + }), + query: z.optional(z.never()), + headers: z.optional(z.object({ + 'X-Request-Id': z.optional(z.string()) + })) }); /** - * OK + * User deleted */ -export const zFooPutResponse = z.string(); +export const zDeleteUserResponse = z.void(); -export const zGetFooBarData = z.object({ +export const zGetUserByIdData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User found */ -export const zGetFooBarResponse = z.string(); +export const zGetUserByIdResponse = zUser; -export const zFooBarPostData = z.object({ - body: z.optional(z.never()), - path: z.optional(z.never()), +export const zUpdateUserData = z.object({ + body: zUpdateUserInput, + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User updated */ -export const zFooBarPostResponse = z.string(); +export const zUpdateUserResponse = zUser; -export const zFooBarPutData = z.object({ +export const zGetPostsData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + authorId: z.optional(z.string()), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])) + })) +}); + +/** + * List of posts + */ +export const zGetPostsResponse = z.array(zPost); + +export const zCreatePostData = z.object({ + body: zCreatePostInput, + path: z.optional(z.never()), + query: z.optional(z.never()), + headers: z.object({ + 'X-Author-Id': z.string() + }) +}); + +/** + * Post created + */ +export const zCreatePostResponse = zPost; + +export const zGetPostByIdData = z.object({ + body: z.optional(z.never()), + path: z.object({ + postId: z.string() + }), + query: z.optional(z.object({ + includeComments: z.optional(z.boolean()).default(false) + })) }); /** - * OK + * Post found */ -export const zFooBarPutResponse = z.string(); +export const zGetPostByIdResponse = zPost; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts index 179718453..9f9bc0cce 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts @@ -3,57 +3,110 @@ import { oc } from '@orpc/contract'; import { z } from 'zod'; -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; +import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); -export const getFooContract = base.route({ +/** + * Get all users + */ +export const getUsersContract = base.route({ method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); + path: '/users', + operationId: 'getUsers', + summary: 'Get all users', + tags: ['users'] +}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); -export const fooPostContract = base.route({ +/** + * Create a new user + */ +export const createUserContract = base.route({ method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); + path: '/users', + operationId: 'createUser', + summary: 'Create a new user', + tags: ['users'], + successStatus: 201 +}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); -export const fooPutContract = base.route({ +/** + * Delete a user + */ +export const deleteUserContract = base.route({ + method: 'DELETE', + path: '/users/{userId}', + operationId: 'deleteUser', + summary: 'Delete a user', + tags: ['users'] +}).input(zDeleteUserData); + +/** + * Get a user by ID + */ +export const getUserByIdContract = base.route({ + method: 'GET', + path: '/users/{userId}', + operationId: 'getUserById', + summary: 'Get a user by ID', + tags: ['users'] +}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); + +/** + * Update a user + */ +export const updateUserContract = base.route({ method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); + path: '/users/{userId}', + operationId: 'updateUser', + summary: 'Update a user', + tags: ['users'] +}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); -export const getFooBarContract = base.route({ +/** + * Get all posts + */ +export const getPostsContract = base.route({ method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); + path: '/posts', + operationId: 'getPosts', + summary: 'Get all posts', + tags: ['posts'] +}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); -export const fooBarPostContract = base.route({ +/** + * Create a new post + */ +export const createPostContract = base.route({ method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); + path: '/posts', + operationId: 'createPost', + summary: 'Create a new post', + tags: ['posts'], + successStatus: 201 +}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract +/** + * Get a post by ID + */ +export const getPostByIdContract = base.route({ + method: 'GET', + path: '/posts/{postId}', + operationId: 'getPostById', + summary: 'Get a post by ID', + tags: ['posts'] +}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); + +export const router = { users: { + get: getUsersContract, + create: createUserContract, + delete: deleteUserContract, + getById: getUserByIdContract, + update: updateUserContract + }, posts: { + get: getPostsContract, + create: createPostContract, + getById: getPostByIdContract } }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/zod.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/zod.gen.ts index b3dfa5f90..a5d3596f2 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/zod.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/zod.gen.ts @@ -2,68 +2,153 @@ import { z } from 'zod'; -export const zGetFooData = z.object({ +export const zUser = z.object({ + id: z.string(), + email: z.email(), + name: z.string(), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreateUserInput = z.object({ + email: z.email(), + name: z.string(), + password: z.optional(z.string().min(8)) +}); + +export const zUpdateUserInput = z.object({ + email: z.optional(z.email()), + name: z.optional(z.string()) +}); + +export const zPost = z.object({ + id: z.string(), + title: z.string(), + content: z.string(), + authorId: z.string(), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])), + createdAt: z.optional(z.iso.datetime()) +}); + +export const zCreatePostInput = z.object({ + title: z.string(), + content: z.string(), + status: z.optional(z.enum(['draft', 'published'])) +}); + +export const zGetUsersData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + limit: z.optional(z.int()).default(10), + offset: z.optional(z.int()).default(0) + })) }); /** - * OK + * List of users */ -export const zGetFooResponse = z.string(); +export const zGetUsersResponse = z.array(zUser); -export const zFooPostData = z.object({ - body: z.optional(z.never()), +export const zCreateUserData = z.object({ + body: zCreateUserInput, path: z.optional(z.never()), query: z.optional(z.never()) }); /** - * OK + * User created */ -export const zFooPostResponse = z.string(); +export const zCreateUserResponse = zUser; -export const zFooPutData = z.object({ +export const zDeleteUserData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), - query: z.optional(z.never()) + path: z.object({ + userId: z.string() + }), + query: z.optional(z.never()), + headers: z.optional(z.object({ + 'X-Request-Id': z.optional(z.string()) + })) }); /** - * OK + * User deleted */ -export const zFooPutResponse = z.string(); +export const zDeleteUserResponse = z.void(); -export const zGetFooBarData = z.object({ +export const zGetUserByIdData = z.object({ body: z.optional(z.never()), - path: z.optional(z.never()), + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User found */ -export const zGetFooBarResponse = z.string(); +export const zGetUserByIdResponse = zUser; -export const zFooBarPostData = z.object({ - body: z.optional(z.never()), - path: z.optional(z.never()), +export const zUpdateUserData = z.object({ + body: zUpdateUserInput, + path: z.object({ + userId: z.string() + }), query: z.optional(z.never()) }); /** - * OK + * User updated */ -export const zFooBarPostResponse = z.string(); +export const zUpdateUserResponse = zUser; -export const zFooBarPutData = z.object({ +export const zGetPostsData = z.object({ body: z.optional(z.never()), path: z.optional(z.never()), - query: z.optional(z.never()) + query: z.optional(z.object({ + authorId: z.optional(z.string()), + status: z.optional(z.enum([ + 'draft', + 'published', + 'archived' + ])) + })) +}); + +/** + * List of posts + */ +export const zGetPostsResponse = z.array(zPost); + +export const zCreatePostData = z.object({ + body: zCreatePostInput, + path: z.optional(z.never()), + query: z.optional(z.never()), + headers: z.object({ + 'X-Author-Id': z.string() + }) +}); + +/** + * Post created + */ +export const zCreatePostResponse = zPost; + +export const zGetPostByIdData = z.object({ + body: z.optional(z.never()), + path: z.object({ + postId: z.string() + }), + query: z.optional(z.object({ + includeComments: z.optional(z.boolean()).default(false) + })) }); /** - * OK + * Post found */ -export const zFooBarPutResponse = z.string(); +export const zGetPostByIdResponse = zPost; diff --git a/packages/openapi-ts-tests/main/test/plugins.test.ts b/packages/openapi-ts-tests/main/test/plugins.test.ts index 2b483d7d7..b6dd786b8 100644 --- a/packages/openapi-ts-tests/main/test/plugins.test.ts +++ b/packages/openapi-ts-tests/main/test/plugins.test.ts @@ -568,7 +568,8 @@ for (const version of versions) { }, { config: createConfig({ - input: 'sdk-instance.yaml', + input: + version === '2.0.x' ? 'sdk-instance.yaml' : 'orpc-contract.yaml', output: 'default', plugins: ['zod', '@orpc/contract'], }), @@ -576,7 +577,8 @@ for (const version of versions) { }, { config: createConfig({ - input: 'sdk-instance.yaml', + input: + version === '2.0.x' ? 'sdk-instance.yaml' : 'orpc-contract.yaml', output: 'custom-contract-name', plugins: [ 'zod', @@ -591,7 +593,8 @@ for (const version of versions) { }, { config: createConfig({ - input: 'sdk-instance.yaml', + input: + version === '2.0.x' ? 'sdk-instance.yaml' : 'orpc-contract.yaml', output: 'custom-group-key', plugins: [ 'zod', @@ -605,7 +608,8 @@ for (const version of versions) { }, { config: createConfig({ - input: 'sdk-instance.yaml', + input: + version === '2.0.x' ? 'sdk-instance.yaml' : 'orpc-contract.yaml', output: 'custom-router-name', plugins: [ 'zod', diff --git a/specs/3.0.x/orpc-contract.yaml b/specs/3.0.x/orpc-contract.yaml new file mode 100644 index 000000000..bfe768fcc --- /dev/null +++ b/specs/3.0.x/orpc-contract.yaml @@ -0,0 +1,285 @@ +openapi: 3.0.4 +info: + title: OpenAPI 3.0.4 oRPC contract example + version: 1 +paths: + /users: + get: + tags: + - users + operationId: getUsers + summary: Get all users + parameters: + - name: limit + in: query + description: Maximum number of users to return + required: false + schema: + type: integer + default: 10 + - name: offset + in: query + description: Number of users to skip + required: false + schema: + type: integer + default: 0 + responses: + '200': + description: List of users + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + post: + tags: + - users + operationId: createUser + summary: Create a new user + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateUserInput' + responses: + '201': + description: User created + content: + application/json: + schema: + $ref: '#/components/schemas/User' + /users/{userId}: + get: + tags: + - users + operationId: getUserById + summary: Get a user by ID + parameters: + - name: userId + in: path + description: User ID + required: true + schema: + type: string + responses: + '200': + description: User found + content: + application/json: + schema: + $ref: '#/components/schemas/User' + put: + tags: + - users + operationId: updateUser + summary: Update a user + parameters: + - name: userId + in: path + description: User ID + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateUserInput' + responses: + '200': + description: User updated + content: + application/json: + schema: + $ref: '#/components/schemas/User' + delete: + tags: + - users + operationId: deleteUser + summary: Delete a user + parameters: + - name: userId + in: path + description: User ID + required: true + schema: + type: string + - name: X-Request-Id + in: header + description: Request ID for tracing + required: false + schema: + type: string + responses: + '204': + description: User deleted + /posts: + get: + tags: + - posts + operationId: getPosts + summary: Get all posts + parameters: + - name: authorId + in: query + description: Filter by author ID + required: false + schema: + type: string + - name: status + in: query + description: Filter by status + required: false + schema: + type: string + enum: + - draft + - published + - archived + responses: + '200': + description: List of posts + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Post' + post: + tags: + - posts + operationId: createPost + summary: Create a new post + parameters: + - name: X-Author-Id + in: header + description: Author ID + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreatePostInput' + responses: + '201': + description: Post created + content: + application/json: + schema: + $ref: '#/components/schemas/Post' + /posts/{postId}: + get: + tags: + - posts + operationId: getPostById + summary: Get a post by ID + parameters: + - name: postId + in: path + description: Post ID + required: true + schema: + type: string + - name: includeComments + in: query + description: Include comments in response + required: false + schema: + type: boolean + default: false + responses: + '200': + description: Post found + content: + application/json: + schema: + $ref: '#/components/schemas/Post' +components: + schemas: + User: + type: object + required: + - id + - email + - name + properties: + id: + type: string + email: + type: string + format: email + name: + type: string + createdAt: + type: string + format: date-time + CreateUserInput: + type: object + required: + - email + - name + properties: + email: + type: string + format: email + name: + type: string + password: + type: string + minLength: 8 + UpdateUserInput: + type: object + properties: + email: + type: string + format: email + name: + type: string + Post: + type: object + required: + - id + - title + - content + - authorId + properties: + id: + type: string + title: + type: string + content: + type: string + authorId: + type: string + status: + type: string + enum: + - draft + - published + - archived + createdAt: + type: string + format: date-time + CreatePostInput: + type: object + required: + - title + - content + properties: + title: + type: string + content: + type: string + status: + type: string + enum: + - draft + - published + default: draft diff --git a/specs/3.1.x/orpc-contract.yaml b/specs/3.1.x/orpc-contract.yaml new file mode 100644 index 000000000..1ea746152 --- /dev/null +++ b/specs/3.1.x/orpc-contract.yaml @@ -0,0 +1,285 @@ +openapi: 3.1.1 +info: + title: OpenAPI 3.1.1 oRPC contract example + version: 1 +paths: + /users: + get: + tags: + - users + operationId: getUsers + summary: Get all users + parameters: + - name: limit + in: query + description: Maximum number of users to return + required: false + schema: + type: integer + default: 10 + - name: offset + in: query + description: Number of users to skip + required: false + schema: + type: integer + default: 0 + responses: + '200': + description: List of users + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + post: + tags: + - users + operationId: createUser + summary: Create a new user + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreateUserInput' + responses: + '201': + description: User created + content: + application/json: + schema: + $ref: '#/components/schemas/User' + /users/{userId}: + get: + tags: + - users + operationId: getUserById + summary: Get a user by ID + parameters: + - name: userId + in: path + description: User ID + required: true + schema: + type: string + responses: + '200': + description: User found + content: + application/json: + schema: + $ref: '#/components/schemas/User' + put: + tags: + - users + operationId: updateUser + summary: Update a user + parameters: + - name: userId + in: path + description: User ID + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/UpdateUserInput' + responses: + '200': + description: User updated + content: + application/json: + schema: + $ref: '#/components/schemas/User' + delete: + tags: + - users + operationId: deleteUser + summary: Delete a user + parameters: + - name: userId + in: path + description: User ID + required: true + schema: + type: string + - name: X-Request-Id + in: header + description: Request ID for tracing + required: false + schema: + type: string + responses: + '204': + description: User deleted + /posts: + get: + tags: + - posts + operationId: getPosts + summary: Get all posts + parameters: + - name: authorId + in: query + description: Filter by author ID + required: false + schema: + type: string + - name: status + in: query + description: Filter by status + required: false + schema: + type: string + enum: + - draft + - published + - archived + responses: + '200': + description: List of posts + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Post' + post: + tags: + - posts + operationId: createPost + summary: Create a new post + parameters: + - name: X-Author-Id + in: header + description: Author ID + required: true + schema: + type: string + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/CreatePostInput' + responses: + '201': + description: Post created + content: + application/json: + schema: + $ref: '#/components/schemas/Post' + /posts/{postId}: + get: + tags: + - posts + operationId: getPostById + summary: Get a post by ID + parameters: + - name: postId + in: path + description: Post ID + required: true + schema: + type: string + - name: includeComments + in: query + description: Include comments in response + required: false + schema: + type: boolean + default: false + responses: + '200': + description: Post found + content: + application/json: + schema: + $ref: '#/components/schemas/Post' +components: + schemas: + User: + type: object + required: + - id + - email + - name + properties: + id: + type: string + email: + type: string + format: email + name: + type: string + createdAt: + type: string + format: date-time + CreateUserInput: + type: object + required: + - email + - name + properties: + email: + type: string + format: email + name: + type: string + password: + type: string + minLength: 8 + UpdateUserInput: + type: object + properties: + email: + type: string + format: email + name: + type: string + Post: + type: object + required: + - id + - title + - content + - authorId + properties: + id: + type: string + title: + type: string + content: + type: string + authorId: + type: string + status: + type: string + enum: + - draft + - published + - archived + createdAt: + type: string + format: date-time + CreatePostInput: + type: object + required: + - title + - content + properties: + title: + type: string + content: + type: string + status: + type: string + enum: + - draft + - published + default: draft From e7a8baea5f91ee381c0f9cf244364a453ea21f9c Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:01:41 +0800 Subject: [PATCH 13/23] add todo --- packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index 83fe59bd5..948ac7357 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -75,6 +75,8 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { exported: false, external: '@orpc/contract', }); + + // TODO: handle this more correctly const validatorExternalMap = { arktype: 'type', valibot: 'v', From cf15d9b0600039412ad4212f0d316c6c15cf8de1 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:06:26 +0800 Subject: [PATCH 14/23] update test --- .../plugins/zod/custom-contract-name/index.ts | 3 - .../zod/custom-contract-name/orpc.gen.ts | 59 ---------- .../zod/custom-contract-name/types.gen.ts | 101 ------------------ .../plugins/zod/custom-group-key/index.ts | 3 - .../plugins/zod/custom-group-key/orpc.gen.ts | 56 ---------- .../plugins/zod/custom-group-key/types.gen.ts | 101 ------------------ .../plugins/zod/custom-router-name/index.ts | 3 - .../zod/custom-router-name/orpc.gen.ts | 59 ---------- .../zod/custom-router-name/types.gen.ts | 101 ------------------ .../2.0.x/plugins/zod/default/index.ts | 3 - .../2.0.x/plugins/zod/default/orpc.gen.ts | 59 ---------- .../2.0.x/plugins/zod/default/types.gen.ts | 101 ------------------ .../plugins/zod/custom-contract-name/index.ts | 3 - .../zod/custom-contract-name/orpc.gen.ts | 59 ---------- .../zod/custom-contract-name/types.gen.ts | 101 ------------------ .../plugins/zod/custom-group-key/index.ts | 3 - .../plugins/zod/custom-group-key/orpc.gen.ts | 56 ---------- .../plugins/zod/custom-group-key/types.gen.ts | 101 ------------------ .../plugins/zod/custom-router-name/index.ts | 3 - .../zod/custom-router-name/orpc.gen.ts | 59 ---------- .../zod/custom-router-name/types.gen.ts | 101 ------------------ .../3.0.x/plugins/zod/default/index.ts | 3 - .../3.0.x/plugins/zod/default/orpc.gen.ts | 59 ---------- .../3.0.x/plugins/zod/default/types.gen.ts | 101 ------------------ .../plugins/zod/custom-contract-name/index.ts | 3 - .../zod/custom-contract-name/orpc.gen.ts | 59 ---------- .../zod/custom-contract-name/types.gen.ts | 101 ------------------ .../plugins/zod/custom-group-key/index.ts | 3 - .../plugins/zod/custom-group-key/orpc.gen.ts | 56 ---------- .../plugins/zod/custom-group-key/types.gen.ts | 101 ------------------ .../plugins/zod/custom-router-name/index.ts | 3 - .../zod/custom-router-name/orpc.gen.ts | 59 ---------- .../zod/custom-router-name/types.gen.ts | 101 ------------------ .../3.1.x/plugins/zod/default/index.ts | 3 - .../3.1.x/plugins/zod/default/orpc.gen.ts | 59 ---------- .../3.1.x/plugins/zod/default/types.gen.ts | 101 ------------------ 36 files changed, 1947 deletions(-) delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/types.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/types.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/types.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/types.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/types.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/types.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/types.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/types.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/types.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/types.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/types.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/index.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts delete mode 100644 packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/types.gen.ts diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts deleted file mode 100644 index b03ac4b01..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/orpc.gen.ts +++ /dev/null @@ -1,59 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooRpc = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostRpc = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutRpc = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarRpc = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostRpc = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutRpc = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { foo: { - get: getFooRpc, - fooPost: fooPostRpc, - fooPut: fooPutRpc, - getBar: getFooBarRpc, - fooBarPost: fooBarPostRpc, - fooBarPut: fooBarPutRpc - } }; - -export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/types.gen.ts deleted file mode 100644 index 9844839de..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: string; -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts deleted file mode 100644 index 14f73c017..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/orpc.gen.ts +++ /dev/null @@ -1,56 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooContract = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostContract = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutContract = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarContract = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostContract = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { - get: { getFoo: getFooContract, getFooBar: getFooBarContract }, - post: { foo: fooPostContract, fooBar: fooBarPostContract }, - put: { foo: fooPutContract, fooBar: fooBarPutContract } -}; - -export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/types.gen.ts deleted file mode 100644 index 9844839de..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: string; -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts deleted file mode 100644 index dec2c4522..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/orpc.gen.ts +++ /dev/null @@ -1,59 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooContract = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostContract = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutContract = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarContract = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostContract = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const contract = { foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract - } }; - -export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/types.gen.ts deleted file mode 100644 index 9844839de..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: string; -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts deleted file mode 100644 index 6c850a63d..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/orpc.gen.ts +++ /dev/null @@ -1,59 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooContract = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostContract = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutContract = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarContract = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostContract = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract - } }; - -export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/types.gen.ts deleted file mode 100644 index 9844839de..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: string; -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts deleted file mode 100644 index b03ac4b01..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/orpc.gen.ts +++ /dev/null @@ -1,59 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooRpc = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostRpc = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutRpc = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarRpc = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostRpc = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutRpc = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { foo: { - get: getFooRpc, - fooPost: fooPostRpc, - fooPut: fooPutRpc, - getBar: getFooBarRpc, - fooBarPost: fooBarPostRpc, - fooBarPut: fooBarPutRpc - } }; - -export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/types.gen.ts deleted file mode 100644 index 836288372..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: `${string}://${string}` | (string & {}); -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts deleted file mode 100644 index 14f73c017..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/orpc.gen.ts +++ /dev/null @@ -1,56 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooContract = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostContract = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutContract = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarContract = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostContract = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { - get: { getFoo: getFooContract, getFooBar: getFooBarContract }, - post: { foo: fooPostContract, fooBar: fooBarPostContract }, - put: { foo: fooPutContract, fooBar: fooBarPutContract } -}; - -export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/types.gen.ts deleted file mode 100644 index 836288372..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: `${string}://${string}` | (string & {}); -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts deleted file mode 100644 index dec2c4522..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/orpc.gen.ts +++ /dev/null @@ -1,59 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooContract = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostContract = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutContract = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarContract = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostContract = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const contract = { foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract - } }; - -export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/types.gen.ts deleted file mode 100644 index 836288372..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: `${string}://${string}` | (string & {}); -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts deleted file mode 100644 index 6c850a63d..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/orpc.gen.ts +++ /dev/null @@ -1,59 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooContract = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostContract = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutContract = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarContract = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostContract = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract - } }; - -export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/types.gen.ts deleted file mode 100644 index 836288372..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: `${string}://${string}` | (string & {}); -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts deleted file mode 100644 index b03ac4b01..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/orpc.gen.ts +++ /dev/null @@ -1,59 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooRpc = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostRpc = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutRpc = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarRpc = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostRpc = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutRpc = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { foo: { - get: getFooRpc, - fooPost: fooPostRpc, - fooPut: fooPutRpc, - getBar: getFooBarRpc, - fooBarPost: fooBarPostRpc, - fooBarPut: fooBarPutRpc - } }; - -export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/types.gen.ts deleted file mode 100644 index 836288372..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: `${string}://${string}` | (string & {}); -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts deleted file mode 100644 index 14f73c017..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/orpc.gen.ts +++ /dev/null @@ -1,56 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooContract = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostContract = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutContract = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarContract = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostContract = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { - get: { getFoo: getFooContract, getFooBar: getFooBarContract }, - post: { foo: fooPostContract, fooBar: fooBarPostContract }, - put: { foo: fooPutContract, fooBar: fooBarPutContract } -}; - -export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/types.gen.ts deleted file mode 100644 index 836288372..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: `${string}://${string}` | (string & {}); -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts deleted file mode 100644 index dec2c4522..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/orpc.gen.ts +++ /dev/null @@ -1,59 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooContract = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostContract = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutContract = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarContract = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostContract = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const contract = { foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract - } }; - -export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/types.gen.ts deleted file mode 100644 index 836288372..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: `${string}://${string}` | (string & {}); -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/index.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/index.ts deleted file mode 100644 index 3c364f4df..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type { ClientOptions, FooBarPostData, FooBarPostResponse, FooBarPostResponses, FooBarPutData, FooBarPutResponse, FooBarPutResponses, FooPostData, FooPostResponse, FooPostResponses, FooPutData, FooPutResponse, FooPutResponses, GetFooBarData, GetFooBarResponse, GetFooBarResponses, GetFooData, GetFooResponse, GetFooResponses } from './types.gen'; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts deleted file mode 100644 index 6c850a63d..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/orpc.gen.ts +++ /dev/null @@ -1,59 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -import { oc } from '@orpc/contract'; -import { z } from 'zod'; - -import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from './zod.gen'; - -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); - -export const getFooContract = base.route({ - method: 'GET', - path: '/foo', - tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); - -export const fooPostContract = base.route({ - method: 'POST', - path: '/foo', - operationId: 'foo.-post', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); - -export const fooPutContract = base.route({ - method: 'PUT', - path: '/foo', - operationId: '/foo/-put/', - tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); - -export const getFooBarContract = base.route({ - method: 'GET', - path: '/foo/bar', - tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); - -export const fooBarPostContract = base.route({ - method: 'POST', - path: '/foo/bar', - operationId: 'foo.bar.post', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); - -export const fooBarPutContract = base.route({ - method: 'PUT', - path: '/foo/bar', - operationId: '/foo/bar/put/', - tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); - -export const router = { foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract - } }; - -export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/types.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/types.gen.ts deleted file mode 100644 index 836288372..000000000 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/types.gen.ts +++ /dev/null @@ -1,101 +0,0 @@ -// This file is auto-generated by @hey-api/openapi-ts - -export type ClientOptions = { - baseUrl: `${string}://${string}` | (string & {}); -}; - -export type GetFooData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type GetFooResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooResponse = GetFooResponses[keyof GetFooResponses]; - -export type FooPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPostResponse = FooPostResponses[keyof FooPostResponses]; - -export type FooPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo'; -}; - -export type FooPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooPutResponse = FooPutResponses[keyof FooPutResponses]; - -export type GetFooBarData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type GetFooBarResponses = { - /** - * OK - */ - 200: string; -}; - -export type GetFooBarResponse = GetFooBarResponses[keyof GetFooBarResponses]; - -export type FooBarPostData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPostResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPostResponse = FooBarPostResponses[keyof FooBarPostResponses]; - -export type FooBarPutData = { - body?: never; - path?: never; - query?: never; - url: '/foo/bar'; -}; - -export type FooBarPutResponses = { - /** - * OK - */ - 200: string; -}; - -export type FooBarPutResponse = FooBarPutResponses[keyof FooBarPutResponses]; From 255da7d066ae7b407277d84e1cde4679178b12c6 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:10:36 +0800 Subject: [PATCH 15/23] no outputStructure detailed --- .../src/plugins/@orpc/contract/plugin.ts | 34 +++---------------- 1 file changed, 4 insertions(+), 30 deletions(-) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index 948ac7357..bbbf7d878 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -76,16 +76,6 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { external: '@orpc/contract', }); - // TODO: handle this more correctly - const validatorExternalMap = { - arktype: 'type', - valibot: 'v', - zod: 'z', - } as const; - const symbolValidator = plugin.external( - `${validator}.${validatorExternalMap[validator]}`, - ); - // Create base contract symbol const baseSymbol = plugin.symbol('base', { exported: true, @@ -101,11 +91,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { .assign( $(symbolOc) .attr('$route') - .call( - $.object() - .prop('inputStructure', $.literal('detailed')) - .prop('outputStructure', $.literal('detailed')), - ), + .call($.object().prop('inputStructure', $.literal('detailed'))), ); plugin.node(baseNode); @@ -171,7 +157,8 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { } } - // .output(v.object({ body: responseSchema, status: v.literal(200) })) if has output (detailed outputStructure) + // TODO: support outputStructure detailed + // .output(responseSchema) if has output if (successResponse.hasOutput) { // Reference response schema symbol dynamically from validator plugin const responseSymbol = plugin.referenceSymbol({ @@ -182,20 +169,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { tool: validator, }); if (responseSymbol) { - const outputObject = $.object().prop('body', $(responseSymbol)); - - if (successResponse.statusCode !== 200) { - outputObject.prop( - 'status', - $(symbolValidator) - .attr('literal') - .call($.literal(successResponse.statusCode)), - ); - } - - expression = expression - .attr('output') - .call($(symbolValidator).attr('object').call(outputObject)); + expression = expression.attr('output').call($(responseSymbol)); } } From b03c18571d35bddaf8406f77d22c3ce5148e6795 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:11:28 +0800 Subject: [PATCH 16/23] test update --- .../custom-contract-name/@orpc/contract.gen.ts | 15 +++++++-------- .../zod/custom-group-key/@orpc/contract.gen.ts | 15 +++++++-------- .../custom-router-name/@orpc/contract.gen.ts | 15 +++++++-------- .../plugins/zod/default/@orpc/contract.gen.ts | 15 +++++++-------- .../custom-contract-name/@orpc/contract.gen.ts | 17 ++++++++--------- .../zod/custom-group-key/@orpc/contract.gen.ts | 17 ++++++++--------- .../custom-router-name/@orpc/contract.gen.ts | 17 ++++++++--------- .../plugins/zod/default/@orpc/contract.gen.ts | 17 ++++++++--------- .../custom-contract-name/@orpc/contract.gen.ts | 17 ++++++++--------- .../zod/custom-group-key/@orpc/contract.gen.ts | 17 ++++++++--------- .../custom-router-name/@orpc/contract.gen.ts | 17 ++++++++--------- .../plugins/zod/default/@orpc/contract.gen.ts | 17 ++++++++--------- 12 files changed, 92 insertions(+), 104 deletions(-) diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts index 254e8fdcf..f1d4db8ab 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -1,51 +1,50 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); export const getFooRpc = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); +}).output(zGetFooResponse); export const fooPostRpc = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); +}).output(zFooPostResponse); export const fooPutRpc = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); +}).output(zFooPutResponse); export const getFooBarRpc = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); +}).output(zGetFooBarResponse); export const fooBarPostRpc = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); +}).output(zFooBarPostResponse); export const fooBarPutRpc = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); +}).output(zFooBarPutResponse); export const router = { foo: { get: getFooRpc, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts index 0d4ee662f..66da05dce 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts @@ -1,51 +1,50 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); +}).output(zGetFooResponse); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); +}).output(zFooPostResponse); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); +}).output(zFooPutResponse); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); +}).output(zGetFooBarResponse); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); +}).output(zFooBarPostResponse); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); +}).output(zFooBarPutResponse); export const router = { get: { getFoo: getFooContract, getFooBar: getFooBarContract }, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts index b6af0dd6c..623267020 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -1,51 +1,50 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); +}).output(zGetFooResponse); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); +}).output(zFooPostResponse); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); +}).output(zFooPutResponse); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); +}).output(zGetFooBarResponse); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); +}).output(zFooBarPostResponse); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); +}).output(zFooBarPutResponse); export const contract = { foo: { get: getFooContract, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts index 179718453..514efdb2f 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts @@ -1,51 +1,50 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zFooBarPostResponse, zFooBarPutResponse, zFooPostResponse, zFooPutResponse, zGetFooBarResponse, zGetFooResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); export const getFooContract = base.route({ method: 'GET', path: '/foo', tags: ['fooBaz'] -}).output(z.object({ body: zGetFooResponse })); +}).output(zGetFooResponse); export const fooPostContract = base.route({ method: 'POST', path: '/foo', operationId: 'foo.-post', tags: ['fooBaz'] -}).output(z.object({ body: zFooPostResponse })); +}).output(zFooPostResponse); export const fooPutContract = base.route({ method: 'PUT', path: '/foo', operationId: '/foo/-put/', tags: ['fooBaz'] -}).output(z.object({ body: zFooPutResponse })); +}).output(zFooPutResponse); export const getFooBarContract = base.route({ method: 'GET', path: '/foo/bar', tags: ['barBaz'] -}).output(z.object({ body: zGetFooBarResponse })); +}).output(zGetFooBarResponse); export const fooBarPostContract = base.route({ method: 'POST', path: '/foo/bar', operationId: 'foo.bar.post', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPostResponse })); +}).output(zFooBarPostResponse); export const fooBarPutContract = base.route({ method: 'PUT', path: '/foo/bar', operationId: '/foo/bar/put/', tags: ['fooBaz', 'barBaz'] -}).output(z.object({ body: zFooBarPutResponse })); +}).output(zFooBarPutResponse); export const router = { foo: { get: getFooContract, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts index 2abe7f9f4..93465cd45 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -1,11 +1,10 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); /** * Get all users @@ -16,7 +15,7 @@ export const getUsersRpc = base.route({ operationId: 'getUsers', summary: 'Get all users', tags: ['users'] -}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); +}).input(zGetUsersData).output(zGetUsersResponse); /** * Create a new user @@ -28,7 +27,7 @@ export const createUserRpc = base.route({ summary: 'Create a new user', tags: ['users'], successStatus: 201 -}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); +}).input(zCreateUserData).output(zCreateUserResponse); /** * Delete a user @@ -50,7 +49,7 @@ export const getUserByIdRpc = base.route({ operationId: 'getUserById', summary: 'Get a user by ID', tags: ['users'] -}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); +}).input(zGetUserByIdData).output(zGetUserByIdResponse); /** * Update a user @@ -61,7 +60,7 @@ export const updateUserRpc = base.route({ operationId: 'updateUser', summary: 'Update a user', tags: ['users'] -}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); +}).input(zUpdateUserData).output(zUpdateUserResponse); /** * Get all posts @@ -72,7 +71,7 @@ export const getPostsRpc = base.route({ operationId: 'getPosts', summary: 'Get all posts', tags: ['posts'] -}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); +}).input(zGetPostsData).output(zGetPostsResponse); /** * Create a new post @@ -84,7 +83,7 @@ export const createPostRpc = base.route({ summary: 'Create a new post', tags: ['posts'], successStatus: 201 -}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); +}).input(zCreatePostData).output(zCreatePostResponse); /** * Get a post by ID @@ -95,7 +94,7 @@ export const getPostByIdRpc = base.route({ operationId: 'getPostById', summary: 'Get a post by ID', tags: ['posts'] -}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); +}).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { users: { get: getUsersRpc, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts index a5b99aea1..4d1d66ee1 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts @@ -1,11 +1,10 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); /** * Get all users @@ -16,7 +15,7 @@ export const getUsersContract = base.route({ operationId: 'getUsers', summary: 'Get all users', tags: ['users'] -}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); +}).input(zGetUsersData).output(zGetUsersResponse); /** * Create a new user @@ -28,7 +27,7 @@ export const createUserContract = base.route({ summary: 'Create a new user', tags: ['users'], successStatus: 201 -}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); +}).input(zCreateUserData).output(zCreateUserResponse); /** * Delete a user @@ -50,7 +49,7 @@ export const getUserByIdContract = base.route({ operationId: 'getUserById', summary: 'Get a user by ID', tags: ['users'] -}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); +}).input(zGetUserByIdData).output(zGetUserByIdResponse); /** * Update a user @@ -61,7 +60,7 @@ export const updateUserContract = base.route({ operationId: 'updateUser', summary: 'Update a user', tags: ['users'] -}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); +}).input(zUpdateUserData).output(zUpdateUserResponse); /** * Get all posts @@ -72,7 +71,7 @@ export const getPostsContract = base.route({ operationId: 'getPosts', summary: 'Get all posts', tags: ['posts'] -}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); +}).input(zGetPostsData).output(zGetPostsResponse); /** * Create a new post @@ -84,7 +83,7 @@ export const createPostContract = base.route({ summary: 'Create a new post', tags: ['posts'], successStatus: 201 -}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); +}).input(zCreatePostData).output(zCreatePostResponse); /** * Get a post by ID @@ -95,7 +94,7 @@ export const getPostByIdContract = base.route({ operationId: 'getPostById', summary: 'Get a post by ID', tags: ['posts'] -}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); +}).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { get: { diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts index 40379d5f8..9e74e3fec 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -1,11 +1,10 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); /** * Get all users @@ -16,7 +15,7 @@ export const getUsersContract = base.route({ operationId: 'getUsers', summary: 'Get all users', tags: ['users'] -}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); +}).input(zGetUsersData).output(zGetUsersResponse); /** * Create a new user @@ -28,7 +27,7 @@ export const createUserContract = base.route({ summary: 'Create a new user', tags: ['users'], successStatus: 201 -}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); +}).input(zCreateUserData).output(zCreateUserResponse); /** * Delete a user @@ -50,7 +49,7 @@ export const getUserByIdContract = base.route({ operationId: 'getUserById', summary: 'Get a user by ID', tags: ['users'] -}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); +}).input(zGetUserByIdData).output(zGetUserByIdResponse); /** * Update a user @@ -61,7 +60,7 @@ export const updateUserContract = base.route({ operationId: 'updateUser', summary: 'Update a user', tags: ['users'] -}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); +}).input(zUpdateUserData).output(zUpdateUserResponse); /** * Get all posts @@ -72,7 +71,7 @@ export const getPostsContract = base.route({ operationId: 'getPosts', summary: 'Get all posts', tags: ['posts'] -}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); +}).input(zGetPostsData).output(zGetPostsResponse); /** * Create a new post @@ -84,7 +83,7 @@ export const createPostContract = base.route({ summary: 'Create a new post', tags: ['posts'], successStatus: 201 -}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); +}).input(zCreatePostData).output(zCreatePostResponse); /** * Get a post by ID @@ -95,7 +94,7 @@ export const getPostByIdContract = base.route({ operationId: 'getPostById', summary: 'Get a post by ID', tags: ['posts'] -}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); +}).input(zGetPostByIdData).output(zGetPostByIdResponse); export const contract = { users: { get: getUsersContract, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts index 9f9bc0cce..c5ad262bb 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts @@ -1,11 +1,10 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); /** * Get all users @@ -16,7 +15,7 @@ export const getUsersContract = base.route({ operationId: 'getUsers', summary: 'Get all users', tags: ['users'] -}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); +}).input(zGetUsersData).output(zGetUsersResponse); /** * Create a new user @@ -28,7 +27,7 @@ export const createUserContract = base.route({ summary: 'Create a new user', tags: ['users'], successStatus: 201 -}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); +}).input(zCreateUserData).output(zCreateUserResponse); /** * Delete a user @@ -50,7 +49,7 @@ export const getUserByIdContract = base.route({ operationId: 'getUserById', summary: 'Get a user by ID', tags: ['users'] -}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); +}).input(zGetUserByIdData).output(zGetUserByIdResponse); /** * Update a user @@ -61,7 +60,7 @@ export const updateUserContract = base.route({ operationId: 'updateUser', summary: 'Update a user', tags: ['users'] -}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); +}).input(zUpdateUserData).output(zUpdateUserResponse); /** * Get all posts @@ -72,7 +71,7 @@ export const getPostsContract = base.route({ operationId: 'getPosts', summary: 'Get all posts', tags: ['posts'] -}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); +}).input(zGetPostsData).output(zGetPostsResponse); /** * Create a new post @@ -84,7 +83,7 @@ export const createPostContract = base.route({ summary: 'Create a new post', tags: ['posts'], successStatus: 201 -}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); +}).input(zCreatePostData).output(zCreatePostResponse); /** * Get a post by ID @@ -95,7 +94,7 @@ export const getPostByIdContract = base.route({ operationId: 'getPostById', summary: 'Get a post by ID', tags: ['posts'] -}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); +}).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { users: { get: getUsersContract, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts index 2abe7f9f4..93465cd45 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -1,11 +1,10 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); /** * Get all users @@ -16,7 +15,7 @@ export const getUsersRpc = base.route({ operationId: 'getUsers', summary: 'Get all users', tags: ['users'] -}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); +}).input(zGetUsersData).output(zGetUsersResponse); /** * Create a new user @@ -28,7 +27,7 @@ export const createUserRpc = base.route({ summary: 'Create a new user', tags: ['users'], successStatus: 201 -}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); +}).input(zCreateUserData).output(zCreateUserResponse); /** * Delete a user @@ -50,7 +49,7 @@ export const getUserByIdRpc = base.route({ operationId: 'getUserById', summary: 'Get a user by ID', tags: ['users'] -}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); +}).input(zGetUserByIdData).output(zGetUserByIdResponse); /** * Update a user @@ -61,7 +60,7 @@ export const updateUserRpc = base.route({ operationId: 'updateUser', summary: 'Update a user', tags: ['users'] -}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); +}).input(zUpdateUserData).output(zUpdateUserResponse); /** * Get all posts @@ -72,7 +71,7 @@ export const getPostsRpc = base.route({ operationId: 'getPosts', summary: 'Get all posts', tags: ['posts'] -}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); +}).input(zGetPostsData).output(zGetPostsResponse); /** * Create a new post @@ -84,7 +83,7 @@ export const createPostRpc = base.route({ summary: 'Create a new post', tags: ['posts'], successStatus: 201 -}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); +}).input(zCreatePostData).output(zCreatePostResponse); /** * Get a post by ID @@ -95,7 +94,7 @@ export const getPostByIdRpc = base.route({ operationId: 'getPostById', summary: 'Get a post by ID', tags: ['posts'] -}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); +}).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { users: { get: getUsersRpc, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts index a5b99aea1..4d1d66ee1 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts @@ -1,11 +1,10 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); /** * Get all users @@ -16,7 +15,7 @@ export const getUsersContract = base.route({ operationId: 'getUsers', summary: 'Get all users', tags: ['users'] -}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); +}).input(zGetUsersData).output(zGetUsersResponse); /** * Create a new user @@ -28,7 +27,7 @@ export const createUserContract = base.route({ summary: 'Create a new user', tags: ['users'], successStatus: 201 -}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); +}).input(zCreateUserData).output(zCreateUserResponse); /** * Delete a user @@ -50,7 +49,7 @@ export const getUserByIdContract = base.route({ operationId: 'getUserById', summary: 'Get a user by ID', tags: ['users'] -}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); +}).input(zGetUserByIdData).output(zGetUserByIdResponse); /** * Update a user @@ -61,7 +60,7 @@ export const updateUserContract = base.route({ operationId: 'updateUser', summary: 'Update a user', tags: ['users'] -}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); +}).input(zUpdateUserData).output(zUpdateUserResponse); /** * Get all posts @@ -72,7 +71,7 @@ export const getPostsContract = base.route({ operationId: 'getPosts', summary: 'Get all posts', tags: ['posts'] -}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); +}).input(zGetPostsData).output(zGetPostsResponse); /** * Create a new post @@ -84,7 +83,7 @@ export const createPostContract = base.route({ summary: 'Create a new post', tags: ['posts'], successStatus: 201 -}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); +}).input(zCreatePostData).output(zCreatePostResponse); /** * Get a post by ID @@ -95,7 +94,7 @@ export const getPostByIdContract = base.route({ operationId: 'getPostById', summary: 'Get a post by ID', tags: ['posts'] -}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); +}).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { get: { diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts index 40379d5f8..9e74e3fec 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -1,11 +1,10 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); /** * Get all users @@ -16,7 +15,7 @@ export const getUsersContract = base.route({ operationId: 'getUsers', summary: 'Get all users', tags: ['users'] -}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); +}).input(zGetUsersData).output(zGetUsersResponse); /** * Create a new user @@ -28,7 +27,7 @@ export const createUserContract = base.route({ summary: 'Create a new user', tags: ['users'], successStatus: 201 -}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); +}).input(zCreateUserData).output(zCreateUserResponse); /** * Delete a user @@ -50,7 +49,7 @@ export const getUserByIdContract = base.route({ operationId: 'getUserById', summary: 'Get a user by ID', tags: ['users'] -}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); +}).input(zGetUserByIdData).output(zGetUserByIdResponse); /** * Update a user @@ -61,7 +60,7 @@ export const updateUserContract = base.route({ operationId: 'updateUser', summary: 'Update a user', tags: ['users'] -}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); +}).input(zUpdateUserData).output(zUpdateUserResponse); /** * Get all posts @@ -72,7 +71,7 @@ export const getPostsContract = base.route({ operationId: 'getPosts', summary: 'Get all posts', tags: ['posts'] -}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); +}).input(zGetPostsData).output(zGetPostsResponse); /** * Create a new post @@ -84,7 +83,7 @@ export const createPostContract = base.route({ summary: 'Create a new post', tags: ['posts'], successStatus: 201 -}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); +}).input(zCreatePostData).output(zCreatePostResponse); /** * Get a post by ID @@ -95,7 +94,7 @@ export const getPostByIdContract = base.route({ operationId: 'getPostById', summary: 'Get a post by ID', tags: ['posts'] -}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); +}).input(zGetPostByIdData).output(zGetPostByIdResponse); export const contract = { users: { get: getUsersContract, diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts index 9f9bc0cce..c5ad262bb 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts @@ -1,11 +1,10 @@ // This file is auto-generated by @hey-api/openapi-ts import { oc } from '@orpc/contract'; -import { z } from 'zod'; import { zCreatePostData, zCreatePostResponse, zCreateUserData, zCreateUserResponse, zDeleteUserData, zGetPostByIdData, zGetPostByIdResponse, zGetPostsData, zGetPostsResponse, zGetUserByIdData, zGetUserByIdResponse, zGetUsersData, zGetUsersResponse, zUpdateUserData, zUpdateUserResponse } from '../zod.gen'; -export const base = oc.$route({ inputStructure: 'detailed', outputStructure: 'detailed' }); +export const base = oc.$route({ inputStructure: 'detailed' }); /** * Get all users @@ -16,7 +15,7 @@ export const getUsersContract = base.route({ operationId: 'getUsers', summary: 'Get all users', tags: ['users'] -}).input(zGetUsersData).output(z.object({ body: zGetUsersResponse })); +}).input(zGetUsersData).output(zGetUsersResponse); /** * Create a new user @@ -28,7 +27,7 @@ export const createUserContract = base.route({ summary: 'Create a new user', tags: ['users'], successStatus: 201 -}).input(zCreateUserData).output(z.object({ body: zCreateUserResponse, status: z.literal(201) })); +}).input(zCreateUserData).output(zCreateUserResponse); /** * Delete a user @@ -50,7 +49,7 @@ export const getUserByIdContract = base.route({ operationId: 'getUserById', summary: 'Get a user by ID', tags: ['users'] -}).input(zGetUserByIdData).output(z.object({ body: zGetUserByIdResponse })); +}).input(zGetUserByIdData).output(zGetUserByIdResponse); /** * Update a user @@ -61,7 +60,7 @@ export const updateUserContract = base.route({ operationId: 'updateUser', summary: 'Update a user', tags: ['users'] -}).input(zUpdateUserData).output(z.object({ body: zUpdateUserResponse })); +}).input(zUpdateUserData).output(zUpdateUserResponse); /** * Get all posts @@ -72,7 +71,7 @@ export const getPostsContract = base.route({ operationId: 'getPosts', summary: 'Get all posts', tags: ['posts'] -}).input(zGetPostsData).output(z.object({ body: zGetPostsResponse })); +}).input(zGetPostsData).output(zGetPostsResponse); /** * Create a new post @@ -84,7 +83,7 @@ export const createPostContract = base.route({ summary: 'Create a new post', tags: ['posts'], successStatus: 201 -}).input(zCreatePostData).output(z.object({ body: zCreatePostResponse, status: z.literal(201) })); +}).input(zCreatePostData).output(zCreatePostResponse); /** * Get a post by ID @@ -95,7 +94,7 @@ export const getPostByIdContract = base.route({ operationId: 'getPostById', summary: 'Get a post by ID', tags: ['posts'] -}).input(zGetPostByIdData).output(z.object({ body: zGetPostByIdResponse })); +}).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { users: { get: getUsersContract, From 3fff1aa88384ab3f503a80b7c7a676d15be98020 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:24:49 +0800 Subject: [PATCH 17/23] add NamingRule --- .../src/plugins/@orpc/contract/config.ts | 9 +++++--- .../src/plugins/@orpc/contract/plugin.ts | 7 ++++--- .../src/plugins/@orpc/contract/types.d.ts | 21 +++++++++++++++---- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts index b565876bc..3c94831d0 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts @@ -1,6 +1,6 @@ import type { IR } from '~/ir/types'; import { definePluginConfig } from '~/plugins/shared/utils/config'; -import { toCase } from '~/utils/naming'; +import { resolveNaming, toCase } from '~/utils/naming'; import { handler } from './plugin'; import type { OrpcPlugin } from './types'; @@ -65,7 +65,7 @@ export const defaultConfig: OrpcPlugin['Config'] = { exportFromIndex: false, groupKeyBuilder: defaultGroupKeyBuilder, operationKeyBuilder: defaultOperationKeyBuilder, - routerName: 'router', + routerName: { name: 'router' }, validator: 'zod', }, handler, @@ -76,7 +76,10 @@ export const defaultConfig: OrpcPlugin['Config'] = { plugin.config.defaultTag ??= 'default'; plugin.config.groupKeyBuilder ??= defaultGroupKeyBuilder; plugin.config.operationKeyBuilder ??= defaultOperationKeyBuilder; - plugin.config.routerName ??= 'router'; + plugin.config.routerName = resolveNaming(plugin.config.routerName); + if (!plugin.config.routerName.name) { + plugin.config.routerName.name = 'router'; + } plugin.config.validator ??= 'zod'; plugin.dependencies.add(plugin.config.validator); diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index bbbf7d878..9f1ff41fa 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -1,7 +1,7 @@ import type { IR } from '~/ir/types'; import { createOperationComment } from '~/plugins/shared/utils/operation'; import { $ } from '~/ts-dsl'; -import { toCase } from '~/utils/naming'; +import { applyNaming, toCase } from '~/utils/naming'; import type { OrpcPlugin } from './types'; @@ -183,7 +183,8 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { } // Create contracts object export grouped by API path segment (in separate router file) - const contractsSymbol = plugin.symbol(routerName, { + const routerExportName = applyNaming('router', routerName); + const contractsSymbol = plugin.symbol(routerExportName, { exported: true, meta: { category: 'contract', @@ -225,7 +226,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { // Create type export: export type Router = typeof router (in separate router file) // Capitalize the router name for the type (e.g., 'router' → 'Router', 'contract' → 'Contract') - const routerTypeName = toCase(routerName, 'PascalCase'); + const routerTypeName = toCase(routerExportName, 'PascalCase'); const routerTypeSymbol = plugin.symbol(routerTypeName, { exported: true, meta: { diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts index 5e917002a..69fdc0896 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts @@ -1,6 +1,7 @@ import type { IR } from '~/ir/types'; import type { DefinePlugin, Plugin } from '~/plugins'; import type { PluginValidatorNames } from '~/plugins/types'; +import type { NamingConfig, NamingRule } from '~/utils/naming'; export type UserConfig = Plugin.Name<'@orpc/contract'> & Plugin.Hooks & { @@ -36,12 +37,24 @@ export type UserConfig = Plugin.Name<'@orpc/contract'> & */ operationKeyBuilder?: (operationId: string, groupKey: string) => string; /** - * Name of the router export. - * The type export will be the capitalized version (e.g., 'router' → 'Router'). + * Naming rule for the router export. + * The type export will be the PascalCase version (e.g., 'router' → 'Router'). * * @default 'router' + * + * @example + * // Simple string + * routerName: 'contract' + * + * @example + * // Template string + * routerName: '{{name}}Contract' + * + * @example + * // With casing + * routerName: { name: '{{name}}Contract', casing: 'camelCase' } */ - routerName?: string; + routerName?: NamingRule; /** * Validator plugin to use for input/output schemas. * @@ -61,7 +74,7 @@ export type Config = Plugin.Name<'@orpc/contract'> & groupKeyBuilder: (operation: IR.OperationObject) => string; operationKeyBuilder: (operationId: string, groupKey: string) => string; output: string; - routerName: string; + routerName: NamingConfig; validator: PluginValidatorNames; }; From d75091152f9ba88e5541145281da501544ba81a0 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:28:08 +0800 Subject: [PATCH 18/23] Update packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts Co-authored-by: Lubos --- packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index 9f1ff41fa..735e9261a 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -204,7 +204,7 @@ export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { } // Build nested contracts object - const contractsObject = $.object(); + const contractsObject = $.object().pretty(); for (const [groupKey, groupOps] of operationsByGroup) { const groupObject = $.object(); From 4f1f24521a5809bc54831a567ace389f3bf72359 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:29:45 +0800 Subject: [PATCH 19/23] update test --- .../zod/custom-contract-name/@orpc/contract.gen.ts | 6 ++++-- .../plugins/zod/custom-router-name/@orpc/contract.gen.ts | 6 ++++-- .../2.0.x/plugins/zod/default/@orpc/contract.gen.ts | 6 ++++-- .../zod/custom-contract-name/@orpc/contract.gen.ts | 9 ++++++--- .../plugins/zod/custom-router-name/@orpc/contract.gen.ts | 9 ++++++--- .../3.0.x/plugins/zod/default/@orpc/contract.gen.ts | 9 ++++++--- .../zod/custom-contract-name/@orpc/contract.gen.ts | 9 ++++++--- .../plugins/zod/custom-router-name/@orpc/contract.gen.ts | 9 ++++++--- .../3.1.x/plugins/zod/default/@orpc/contract.gen.ts | 9 ++++++--- 9 files changed, 48 insertions(+), 24 deletions(-) diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts index f1d4db8ab..e50db16fb 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -46,13 +46,15 @@ export const fooBarPutRpc = base.route({ tags: ['fooBaz', 'barBaz'] }).output(zFooBarPutResponse); -export const router = { foo: { +export const router = { + foo: { get: getFooRpc, fooPost: fooPostRpc, fooPut: fooPutRpc, getBar: getFooBarRpc, fooBarPost: fooBarPostRpc, fooBarPut: fooBarPutRpc - } }; + } +}; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts index 623267020..5c0a1edb5 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -46,13 +46,15 @@ export const fooBarPutContract = base.route({ tags: ['fooBaz', 'barBaz'] }).output(zFooBarPutResponse); -export const contract = { foo: { +export const contract = { + foo: { get: getFooContract, fooPost: fooPostContract, fooPut: fooPutContract, getBar: getFooBarContract, fooBarPost: fooBarPostContract, fooBarPut: fooBarPutContract - } }; + } +}; export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts index 514efdb2f..39ec128a7 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts @@ -46,13 +46,15 @@ export const fooBarPutContract = base.route({ tags: ['fooBaz', 'barBaz'] }).output(zFooBarPutResponse); -export const router = { foo: { +export const router = { + foo: { get: getFooContract, fooPost: fooPostContract, fooPut: fooPutContract, getBar: getFooBarContract, fooBarPost: fooBarPostContract, fooBarPut: fooBarPutContract - } }; + } +}; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts index 93465cd45..478d4ae0c 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -96,16 +96,19 @@ export const getPostByIdRpc = base.route({ tags: ['posts'] }).input(zGetPostByIdData).output(zGetPostByIdResponse); -export const router = { users: { +export const router = { + users: { get: getUsersRpc, create: createUserRpc, delete: deleteUserRpc, getById: getUserByIdRpc, update: updateUserRpc - }, posts: { + }, + posts: { get: getPostsRpc, create: createPostRpc, getById: getPostByIdRpc - } }; + } +}; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts index 9e74e3fec..8192cd9e4 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -96,16 +96,19 @@ export const getPostByIdContract = base.route({ tags: ['posts'] }).input(zGetPostByIdData).output(zGetPostByIdResponse); -export const contract = { users: { +export const contract = { + users: { get: getUsersContract, create: createUserContract, delete: deleteUserContract, getById: getUserByIdContract, update: updateUserContract - }, posts: { + }, + posts: { get: getPostsContract, create: createPostContract, getById: getPostByIdContract - } }; + } +}; export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts index c5ad262bb..ad0e6c451 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts @@ -96,16 +96,19 @@ export const getPostByIdContract = base.route({ tags: ['posts'] }).input(zGetPostByIdData).output(zGetPostByIdResponse); -export const router = { users: { +export const router = { + users: { get: getUsersContract, create: createUserContract, delete: deleteUserContract, getById: getUserByIdContract, update: updateUserContract - }, posts: { + }, + posts: { get: getPostsContract, create: createPostContract, getById: getPostByIdContract - } }; + } +}; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts index 93465cd45..478d4ae0c 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -96,16 +96,19 @@ export const getPostByIdRpc = base.route({ tags: ['posts'] }).input(zGetPostByIdData).output(zGetPostByIdResponse); -export const router = { users: { +export const router = { + users: { get: getUsersRpc, create: createUserRpc, delete: deleteUserRpc, getById: getUserByIdRpc, update: updateUserRpc - }, posts: { + }, + posts: { get: getPostsRpc, create: createPostRpc, getById: getPostByIdRpc - } }; + } +}; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts index 9e74e3fec..8192cd9e4 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -96,16 +96,19 @@ export const getPostByIdContract = base.route({ tags: ['posts'] }).input(zGetPostByIdData).output(zGetPostByIdResponse); -export const contract = { users: { +export const contract = { + users: { get: getUsersContract, create: createUserContract, delete: deleteUserContract, getById: getUserByIdContract, update: updateUserContract - }, posts: { + }, + posts: { get: getPostsContract, create: createPostContract, getById: getPostByIdContract - } }; + } +}; export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts index c5ad262bb..ad0e6c451 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts @@ -96,16 +96,19 @@ export const getPostByIdContract = base.route({ tags: ['posts'] }).input(zGetPostByIdData).output(zGetPostByIdResponse); -export const router = { users: { +export const router = { + users: { get: getUsersContract, create: createUserContract, delete: deleteUserContract, getById: getUserByIdContract, update: updateUserContract - }, posts: { + }, + posts: { get: getPostsContract, create: createPostContract, getById: getPostByIdContract - } }; + } +}; export type Router = typeof router; From 0c858248f325c6cadba358aedc2aaef0c8358bd8 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:34:13 +0800 Subject: [PATCH 20/23] rename --- packages/openapi-ts/src/plugins/@orpc/contract/config.ts | 4 ++-- packages/openapi-ts/src/plugins/@orpc/contract/index.ts | 2 +- packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts | 4 ++-- packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts | 2 +- packages/openapi-ts/src/plugins/config.ts | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts index 3c94831d0..6dab9d7ca 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts @@ -3,7 +3,7 @@ import { definePluginConfig } from '~/plugins/shared/utils/config'; import { resolveNaming, toCase } from '~/utils/naming'; import { handler } from './plugin'; -import type { OrpcPlugin } from './types'; +import type { OrpcContractPlugin } from './types'; // Default: extract first path segment and convert to camelCase // "/chat-messages/{id}" → "chatMessages" @@ -58,7 +58,7 @@ function defaultOperationKeyBuilder( return simplified; } -export const defaultConfig: OrpcPlugin['Config'] = { +export const defaultConfig: OrpcContractPlugin['Config'] = { config: { contractNameBuilder: (id: string) => `${id}Contract`, defaultTag: 'default', diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/index.ts b/packages/openapi-ts/src/plugins/@orpc/contract/index.ts index ad57b7794..5121ae7cc 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/index.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/index.ts @@ -1,2 +1,2 @@ export { defaultConfig, defineConfig } from './config'; -export type { OrpcPlugin } from './types'; +export type { OrpcContractPlugin } from './types'; diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index 735e9261a..582cd9931 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -3,7 +3,7 @@ import { createOperationComment } from '~/plugins/shared/utils/operation'; import { $ } from '~/ts-dsl'; import { applyNaming, toCase } from '~/utils/naming'; -import type { OrpcPlugin } from './types'; +import type { OrpcContractPlugin } from './types'; function hasInput(operation: IR.OperationObject): boolean { const hasPathParams = Boolean( @@ -49,7 +49,7 @@ function getTags(operation: IR.OperationObject, defaultTag: string): string[] { : [defaultTag]; } -export const handler: OrpcPlugin['Handler'] = ({ plugin }) => { +export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { const { contractNameBuilder, defaultTag, diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts index 69fdc0896..79781d7a2 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts @@ -78,4 +78,4 @@ export type Config = Plugin.Name<'@orpc/contract'> & validator: PluginValidatorNames; }; -export type OrpcPlugin = DefinePlugin; +export type OrpcContractPlugin = DefinePlugin; diff --git a/packages/openapi-ts/src/plugins/config.ts b/packages/openapi-ts/src/plugins/config.ts index a36fb78ff..7d83f853c 100644 --- a/packages/openapi-ts/src/plugins/config.ts +++ b/packages/openapi-ts/src/plugins/config.ts @@ -25,7 +25,7 @@ import type { HeyApiTransformersPlugin } from '~/plugins/@hey-api/transformers'; import { defaultConfig as heyApiTransformers } from '~/plugins/@hey-api/transformers'; import type { HeyApiTypeScriptPlugin } from '~/plugins/@hey-api/typescript'; import { defaultConfig as heyApiTypeScript } from '~/plugins/@hey-api/typescript'; -import type { OrpcPlugin } from '~/plugins/@orpc/contract'; +import type { OrpcContractPlugin } from '~/plugins/@orpc/contract'; import { defaultConfig as orpcContract } from '~/plugins/@orpc/contract'; import type { PiniaColadaPlugin } from '~/plugins/@pinia/colada'; import { defaultConfig as piniaColada } from '~/plugins/@pinia/colada'; @@ -65,7 +65,7 @@ export interface PluginConfigMap { '@hey-api/sdk': HeyApiSdkPlugin['Types']; '@hey-api/transformers': HeyApiTransformersPlugin['Types']; '@hey-api/typescript': HeyApiTypeScriptPlugin['Types']; - '@orpc/contract': OrpcPlugin['Types']; + '@orpc/contract': OrpcContractPlugin['Types']; '@pinia/colada': PiniaColadaPlugin['Types']; '@tanstack/angular-query-experimental': TanStackAngularQueryPlugin['Types']; '@tanstack/react-query': TanStackReactQueryPlugin['Types']; From 9245005013d71b30bda98af5e7bf38cf72172627 Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 00:46:32 +0800 Subject: [PATCH 21/23] clear useless comment --- .../src/plugins/@orpc/contract/plugin.ts | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index 582cd9931..4e563d1e1 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -61,7 +61,6 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { const operations: IR.OperationObject[] = []; - // Collect all operations using hey-api's forEach plugin.forEach( 'operation', (event) => { @@ -70,13 +69,11 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { { order: 'declarations' }, ); - // Register external symbols for imports const symbolOc = plugin.symbol('oc', { exported: false, external: '@orpc/contract', }); - // Create base contract symbol const baseSymbol = plugin.symbol('base', { exported: true, meta: { @@ -95,8 +92,6 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { ); plugin.node(baseNode); - // Create contract for each operation - // Store symbols for later use in contracts object const contractSymbols: Record> = {}; for (const op of operations) { @@ -118,8 +113,6 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { }); contractSymbols[op.id] = contractSymbol; - // Build the route config object following Route interface order: - // method, path, operationId, summary, description, deprecated, tags, successStatus, successDescription const method = op.method.toUpperCase(); const routeConfig = $.object() .prop('method', $.literal(method)) @@ -139,12 +132,9 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { node.prop('successStatus', $.literal(successResponse.statusCode!)), ); - // Build the call chain: base.route({...}).input(...).output(...) let expression = $(baseSymbol).attr('route').call(routeConfig); - // .input(dataSchema) if has input if (hasInput(op)) { - // Reference schema symbol dynamically from validator plugin const dataSymbol = plugin.referenceSymbol({ category: 'schema', resource: 'operation', @@ -157,10 +147,8 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { } } - // TODO: support outputStructure detailed - // .output(responseSchema) if has output if (successResponse.hasOutput) { - // Reference response schema symbol dynamically from validator plugin + // TODO: support outputStructure detailed const responseSymbol = plugin.referenceSymbol({ category: 'schema', resource: 'operation', @@ -182,7 +170,6 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { plugin.node(contractNode); } - // Create contracts object export grouped by API path segment (in separate router file) const routerExportName = applyNaming('router', routerName); const contractsSymbol = plugin.symbol(routerExportName, { exported: true, @@ -193,7 +180,6 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { }, }); - // Group operations by group key const operationsByGroup = new Map(); for (const op of operations) { const groupKey = groupKeyBuilder(op); @@ -203,7 +189,6 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { operationsByGroup.get(groupKey)!.push(op); } - // Build nested contracts object const contractsObject = $.object().pretty(); for (const [groupKey, groupOps] of operationsByGroup) { const groupObject = $.object(); @@ -224,8 +209,6 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { .assign(contractsObject); plugin.node(contractsNode); - // Create type export: export type Router = typeof router (in separate router file) - // Capitalize the router name for the type (e.g., 'router' → 'Router', 'contract' → 'Contract') const routerTypeName = toCase(routerExportName, 'PascalCase'); const routerTypeSymbol = plugin.symbol(routerTypeName, { exported: true, From 206f886ed4ad27e60dfac63af7cc4cada7cef8af Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 01:02:59 +0800 Subject: [PATCH 22/23] update router config --- .../@orpc/contract.gen.ts | 12 +- .../custom-group-key/@orpc/contract.gen.ts | 7 +- .../custom-router-name/@orpc/contract.gen.ts | 12 +- .../plugins/zod/default/@orpc/contract.gen.ts | 12 +- .../@orpc/contract.gen.ts | 20 +-- .../custom-group-key/@orpc/contract.gen.ts | 17 +-- .../custom-router-name/@orpc/contract.gen.ts | 20 +-- .../plugins/zod/default/@orpc/contract.gen.ts | 20 +-- .../@orpc/contract.gen.ts | 20 +-- .../custom-group-key/@orpc/contract.gen.ts | 17 +-- .../custom-router-name/@orpc/contract.gen.ts | 20 +-- .../plugins/zod/default/@orpc/contract.gen.ts | 20 +-- .../src/plugins/@orpc/contract/config.ts | 113 +++++++-------- .../src/plugins/@orpc/contract/plugin.ts | 120 +++++++++++---- .../src/plugins/@orpc/contract/types.d.ts | 137 +++++++++++++++--- 15 files changed, 345 insertions(+), 222 deletions(-) diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts index e50db16fb..3d28a965e 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -47,14 +47,10 @@ export const fooBarPutRpc = base.route({ }).output(zFooBarPutResponse); export const router = { - foo: { - get: getFooRpc, - fooPost: fooPostRpc, - fooPut: fooPutRpc, - getBar: getFooBarRpc, - fooBarPost: fooBarPostRpc, - fooBarPut: fooBarPutRpc - } + getFoo: getFooRpc, + post: fooBarPostRpc, + put: fooBarPutRpc, + getFooBar: getFooBarRpc }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts index 66da05dce..a5d0c632e 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts @@ -47,9 +47,10 @@ export const fooBarPutContract = base.route({ }).output(zFooBarPutResponse); export const router = { - get: { getFoo: getFooContract, getFooBar: getFooBarContract }, - post: { foo: fooPostContract, fooBar: fooBarPostContract }, - put: { foo: fooPutContract, fooBar: fooBarPutContract } + getFoo: getFooContract, + post: fooBarPostContract, + put: fooBarPutContract, + getFooBar: getFooBarContract }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts index 5c0a1edb5..6e763c1f8 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -47,14 +47,10 @@ export const fooBarPutContract = base.route({ }).output(zFooBarPutResponse); export const contract = { - foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract - } + getFoo: getFooContract, + post: fooBarPostContract, + put: fooBarPutContract, + getFooBar: getFooBarContract }; export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts index 39ec128a7..a5d0c632e 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/2.0.x/plugins/zod/default/@orpc/contract.gen.ts @@ -47,14 +47,10 @@ export const fooBarPutContract = base.route({ }).output(zFooBarPutResponse); export const router = { - foo: { - get: getFooContract, - fooPost: fooPostContract, - fooPut: fooPutContract, - getBar: getFooBarContract, - fooBarPost: fooBarPostContract, - fooBarPut: fooBarPutContract - } + getFoo: getFooContract, + post: fooBarPostContract, + put: fooBarPutContract, + getFooBar: getFooBarContract }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts index 478d4ae0c..7df32091a 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -97,18 +97,14 @@ export const getPostByIdRpc = base.route({ }).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { - users: { - get: getUsersRpc, - create: createUserRpc, - delete: deleteUserRpc, - getById: getUserByIdRpc, - update: updateUserRpc - }, - posts: { - get: getPostsRpc, - create: createPostRpc, - getById: getPostByIdRpc - } + getUsers: getUsersRpc, + createUser: createUserRpc, + deleteUser: deleteUserRpc, + getUserById: getUserByIdRpc, + updateUser: updateUserRpc, + getPosts: getPostsRpc, + createPost: createPostRpc, + getPostById: getPostByIdRpc }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts index 4d1d66ee1..8adb5e83c 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts @@ -97,15 +97,14 @@ export const getPostByIdContract = base.route({ }).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { - get: { - getUsers: getUsersContract, - getUserById: getUserByIdContract, - getPosts: getPostsContract, - getPostById: getPostByIdContract - }, - post: { createUser: createUserContract, create: createPostContract }, - delete: { deleteUser: deleteUserContract }, - put: { updateUser: updateUserContract } + getUsers: getUsersContract, + createUser: createUserContract, + deleteUser: deleteUserContract, + getUserById: getUserByIdContract, + updateUser: updateUserContract, + getPosts: getPostsContract, + createPost: createPostContract, + getPostById: getPostByIdContract }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts index 8192cd9e4..e2ae202e6 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -97,18 +97,14 @@ export const getPostByIdContract = base.route({ }).input(zGetPostByIdData).output(zGetPostByIdResponse); export const contract = { - users: { - get: getUsersContract, - create: createUserContract, - delete: deleteUserContract, - getById: getUserByIdContract, - update: updateUserContract - }, - posts: { - get: getPostsContract, - create: createPostContract, - getById: getPostByIdContract - } + getUsers: getUsersContract, + createUser: createUserContract, + deleteUser: deleteUserContract, + getUserById: getUserByIdContract, + updateUser: updateUserContract, + getPosts: getPostsContract, + createPost: createPostContract, + getPostById: getPostByIdContract }; export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts index ad0e6c451..8adb5e83c 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.0.x/plugins/zod/default/@orpc/contract.gen.ts @@ -97,18 +97,14 @@ export const getPostByIdContract = base.route({ }).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { - users: { - get: getUsersContract, - create: createUserContract, - delete: deleteUserContract, - getById: getUserByIdContract, - update: updateUserContract - }, - posts: { - get: getPostsContract, - create: createPostContract, - getById: getPostByIdContract - } + getUsers: getUsersContract, + createUser: createUserContract, + deleteUser: deleteUserContract, + getUserById: getUserByIdContract, + updateUser: updateUserContract, + getPosts: getPostsContract, + createPost: createPostContract, + getPostById: getPostByIdContract }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts index 478d4ae0c..7df32091a 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-contract-name/@orpc/contract.gen.ts @@ -97,18 +97,14 @@ export const getPostByIdRpc = base.route({ }).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { - users: { - get: getUsersRpc, - create: createUserRpc, - delete: deleteUserRpc, - getById: getUserByIdRpc, - update: updateUserRpc - }, - posts: { - get: getPostsRpc, - create: createPostRpc, - getById: getPostByIdRpc - } + getUsers: getUsersRpc, + createUser: createUserRpc, + deleteUser: deleteUserRpc, + getUserById: getUserByIdRpc, + updateUser: updateUserRpc, + getPosts: getPostsRpc, + createPost: createPostRpc, + getPostById: getPostByIdRpc }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts index 4d1d66ee1..8adb5e83c 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-group-key/@orpc/contract.gen.ts @@ -97,15 +97,14 @@ export const getPostByIdContract = base.route({ }).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { - get: { - getUsers: getUsersContract, - getUserById: getUserByIdContract, - getPosts: getPostsContract, - getPostById: getPostByIdContract - }, - post: { createUser: createUserContract, create: createPostContract }, - delete: { deleteUser: deleteUserContract }, - put: { updateUser: updateUserContract } + getUsers: getUsersContract, + createUser: createUserContract, + deleteUser: deleteUserContract, + getUserById: getUserByIdContract, + updateUser: updateUserContract, + getPosts: getPostsContract, + createPost: createPostContract, + getPostById: getPostByIdContract }; export type Router = typeof router; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts index 8192cd9e4..e2ae202e6 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/custom-router-name/@orpc/contract.gen.ts @@ -97,18 +97,14 @@ export const getPostByIdContract = base.route({ }).input(zGetPostByIdData).output(zGetPostByIdResponse); export const contract = { - users: { - get: getUsersContract, - create: createUserContract, - delete: deleteUserContract, - getById: getUserByIdContract, - update: updateUserContract - }, - posts: { - get: getPostsContract, - create: createPostContract, - getById: getPostByIdContract - } + getUsers: getUsersContract, + createUser: createUserContract, + deleteUser: deleteUserContract, + getUserById: getUserByIdContract, + updateUser: updateUserContract, + getPosts: getPostsContract, + createPost: createPostContract, + getPostById: getPostByIdContract }; export type Contract = typeof contract; diff --git a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts index ad0e6c451..8adb5e83c 100644 --- a/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts +++ b/packages/openapi-ts-tests/main/test/__snapshots__/3.1.x/plugins/zod/default/@orpc/contract.gen.ts @@ -97,18 +97,14 @@ export const getPostByIdContract = base.route({ }).input(zGetPostByIdData).output(zGetPostByIdResponse); export const router = { - users: { - get: getUsersContract, - create: createUserContract, - delete: deleteUserContract, - getById: getUserByIdContract, - update: updateUserContract - }, - posts: { - get: getPostsContract, - create: createPostContract, - getById: getPostByIdContract - } + getUsers: getUsersContract, + createUser: createUserContract, + deleteUser: deleteUserContract, + getUserById: getUserByIdContract, + updateUser: updateUserContract, + getPosts: getPostsContract, + createPost: createPostContract, + getPostById: getPostByIdContract }; export type Router = typeof router; diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts index 6dab9d7ca..d9baec31e 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts @@ -1,81 +1,78 @@ -import type { IR } from '~/ir/types'; +import type { OperationsStrategy } from '~/openApi/shared/locations'; import { definePluginConfig } from '~/plugins/shared/utils/config'; -import { resolveNaming, toCase } from '~/utils/naming'; +import type { PluginContext } from '~/plugins/types'; +import { resolveNaming } from '~/utils/naming'; import { handler } from './plugin'; -import type { OrpcContractPlugin } from './types'; +import type { + OrpcContractPlugin, + RouterConfig, + UserRouterConfig, +} from './types'; -// Default: extract first path segment and convert to camelCase -// "/chat-messages/{id}" → "chatMessages" -function defaultGroupKeyBuilder(operation: IR.OperationObject): string { - const segment = operation.path.split('/').filter(Boolean)[0] || 'common'; - return toCase(segment, 'camelCase'); -} - -// Build patterns from segment name (camelCase group key) -// "chatMessages" → ["ChatMessages", "ChatMessage"] -function buildGroupPatterns(groupKey: string): string[] { - const patterns: string[] = []; - const pascalKey = toCase(groupKey, 'PascalCase'); - patterns.push(pascalKey); - - // Singular form: "ChatMessages" → "ChatMessage" - if (pascalKey.endsWith('s') && !pascalKey.endsWith('ss')) { - patterns.push(pascalKey.slice(0, -1)); - } - - return patterns; -} - -// Default: simplify operationId by removing redundant group-based patterns -// e.g., "sendChatMessage" with groupKey "chatMessages" → "send" -// e.g., "getConversationsList" with groupKey "conversations" → "getList" -function defaultOperationKeyBuilder( - operationId: string, - groupKey: string, -): string { - const patternsToRemove = buildGroupPatterns(groupKey); - - let simplified = operationId; - - // Remove patterns iteratively - for (const pattern of patternsToRemove) { - const regex = new RegExp(pattern, 'g'); - const result = simplified.replace(regex, ''); - if (result !== simplified && result.length > 0) { - simplified = result; - } +function resolveRouter( + input: OperationsStrategy | UserRouterConfig | undefined, + context: PluginContext, +): RouterConfig { + if (!input || typeof input === 'string' || typeof input === 'function') { + input = { strategy: input }; } - // Ensure first char is lowercase - simplified = simplified.charAt(0).toLowerCase() + simplified.slice(1); - - // Handle edge cases where we end up with just HTTP method or too short - if (!simplified || simplified.length < 2) { - return operationId.charAt(0).toLowerCase() + operationId.slice(1); - } + const strategy = input.strategy ?? 'flat'; - return simplified; + return context.valueToObject({ + defaultValue: { + nesting: 'operationId', + nestingDelimiters: /[./]/, + strategy, + strategyDefaultTag: 'default', + }, + mappers: { + object(value) { + value.keyName = context.valueToObject({ + defaultValue: { casing: 'camelCase' }, + mappers: { + function: (name) => ({ name }), + string: (name) => ({ name }), + }, + value: value.keyName, + }); + value.segmentName = context.valueToObject({ + defaultValue: { casing: 'camelCase' }, + mappers: { + function: (name) => ({ name }), + string: (name) => ({ name }), + }, + value: value.segmentName, + }); + return value; + }, + }, + value: input, + }) as RouterConfig; } export const defaultConfig: OrpcContractPlugin['Config'] = { config: { contractNameBuilder: (id: string) => `${id}Contract`, - defaultTag: 'default', exportFromIndex: false, - groupKeyBuilder: defaultGroupKeyBuilder, - operationKeyBuilder: defaultOperationKeyBuilder, + router: { + keyName: { casing: 'camelCase' }, + nesting: 'operationId', + nestingDelimiters: /[./]/, + segmentName: { casing: 'camelCase' }, + strategy: 'flat', + strategyDefaultTag: 'default', + }, routerName: { name: 'router' }, validator: 'zod', }, handler, name: '@orpc/contract', - resolveConfig: (plugin) => { + resolveConfig: (plugin, context) => { plugin.config.exportFromIndex ??= false; plugin.config.contractNameBuilder ??= (id: string) => `${id}Contract`; - plugin.config.defaultTag ??= 'default'; - plugin.config.groupKeyBuilder ??= defaultGroupKeyBuilder; - plugin.config.operationKeyBuilder ??= defaultOperationKeyBuilder; + plugin.config.router = resolveRouter(plugin.config.router, context); plugin.config.routerName = resolveNaming(plugin.config.routerName); if (!plugin.config.routerName.name) { plugin.config.routerName.name = 'router'; diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index 4e563d1e1..26d640c9b 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -1,9 +1,13 @@ +import type { NodeName } from '@hey-api/codegen-core'; + import type { IR } from '~/ir/types'; +import { OperationPath, OperationStrategy } from '~/openApi/shared/locations'; import { createOperationComment } from '~/plugins/shared/utils/operation'; import { $ } from '~/ts-dsl'; +import type { ObjectTsDsl } from '~/ts-dsl/expr/object'; import { applyNaming, toCase } from '~/utils/naming'; -import type { OrpcContractPlugin } from './types'; +import type { OrpcContractPlugin, RouterConfig } from './types'; function hasInput(operation: IR.OperationObject): boolean { const hasPathParams = Boolean( @@ -49,15 +53,61 @@ function getTags(operation: IR.OperationObject, defaultTag: string): string[] { : [defaultTag]; } +function getOperationPaths( + operation: IR.OperationObject, + routerConfig: RouterConfig, +): ReadonlyArray> { + const { nesting, nestingDelimiters, strategy, strategyDefaultTag } = + routerConfig; + + // Get path derivation function + let pathFn = OperationPath.id(); + if (typeof nesting === 'function') { + pathFn = nesting; + } else if (nesting === 'operationId') { + pathFn = OperationPath.fromOperationId({ delimiters: nestingDelimiters }); + } + + // Get structure strategy function + let strategyFn; + if (typeof strategy === 'function') { + strategyFn = strategy; + } else if (strategy === 'byTags') { + strategyFn = OperationStrategy.byTags({ + fallback: strategyDefaultTag, + path: pathFn, + }); + } else if (strategy === 'single') { + strategyFn = OperationStrategy.single({ + path: pathFn, + root: strategyDefaultTag, + }); + } else { + // flat + strategyFn = OperationStrategy.flat({ path: pathFn }); + } + + return strategyFn(operation); +} + +type NestedLeaf = { type: 'leaf'; value: NodeName }; +type NestedNode = { children: Map; type: 'node' }; +type NestedValue = NestedLeaf | NestedNode; + +function buildNestedObject(node: NestedNode): ObjectTsDsl { + const obj = $.object(); + for (const [key, child] of node.children) { + if (child.type === 'leaf') { + obj.prop(key, $(child.value)); + } else { + obj.prop(key, buildNestedObject(child)); + } + } + return obj; +} + export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { - const { - contractNameBuilder, - defaultTag, - groupKeyBuilder, - operationKeyBuilder, - routerName, - validator, - } = plugin.config; + const { contractNameBuilder, router, routerName, validator } = plugin.config; const operations: IR.OperationObject[] = []; @@ -96,7 +146,7 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { for (const op of operations) { const contractName = contractNameBuilder(op.id); - const tags = getTags(op, defaultTag); + const tags = getTags(op, router.strategyDefaultTag); const successResponse = getSuccessResponse(op); const contractSymbol = plugin.symbol(contractName, { @@ -180,30 +230,44 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { }, }); - const operationsByGroup = new Map(); - for (const op of operations) { - const groupKey = groupKeyBuilder(op); - if (!operationsByGroup.has(groupKey)) { - operationsByGroup.set(groupKey, []); - } - operationsByGroup.get(groupKey)!.push(op); - } + // Build nested structure using a tree + const root: NestedNode = { children: new Map(), type: 'node' }; - const contractsObject = $.object().pretty(); - for (const [groupKey, groupOps] of operationsByGroup) { - const groupObject = $.object(); + for (const op of operations) { + const contractSymbol = contractSymbols[op.id]; + if (contractSymbol) { + const paths = getOperationPaths(op, router); + for (const path of paths) { + let current: NestedNode = root; + for (let i = 0; i < path.length; i++) { + const isLast = i === path.length - 1; + const segment = isLast + ? applyNaming(path[i]!, router.keyName) + : applyNaming(path[i]!, router.segmentName); - for (const op of groupOps) { - const contractSymbol = contractSymbols[op.id]; - if (contractSymbol) { - const key = operationKeyBuilder(op.id, groupKey); - groupObject.prop(key, $(contractSymbol)); + if (isLast) { + current.children.set(segment, { + type: 'leaf', + value: contractSymbol, + }); + } else { + if (!current.children.has(segment)) { + current.children.set(segment, { + children: new Map(), + type: 'node', + }); + } + const next = current.children.get(segment)!; + if (next.type === 'node') { + current = next; + } + } + } } } - - contractsObject.prop(groupKey, groupObject); } + const contractsObject = buildNestedObject(root).pretty(); const contractsNode = $.const(contractsSymbol) .export() .assign(contractsObject); diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts index 79781d7a2..7f78d6c6e 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts @@ -1,8 +1,107 @@ -import type { IR } from '~/ir/types'; +import type { + OperationPathStrategy, + OperationsStrategy, +} from '~/openApi/shared/locations'; import type { DefinePlugin, Plugin } from '~/plugins'; import type { PluginValidatorNames } from '~/plugins/types'; import type { NamingConfig, NamingRule } from '~/utils/naming'; +export interface UserRouterConfig { + /** + * Customize key names for operations in the router. + * + * Applied to the final segment of the path (the key name). + */ + keyName?: NamingRule; + /** + * How to derive nesting structure from operations. + * + * - `'operationId'` - Split operationId by delimiters (e.g., `users.list` → `{ users: { list } }`) + * - `'id'` - Use operation id as-is, no nesting + * - Custom function for full control + * + * @default 'operationId' + */ + nesting?: 'id' | 'operationId' | OperationPathStrategy; + /** + * Delimiters for splitting operationId. + * + * Only applies when `nesting` is `'operationId'`. + * + * @default /[./]/ + */ + nestingDelimiters?: RegExp; + /** + * Customize segment names for nested groups. + * + * Applied to intermediate path segments (not the key name). + */ + segmentName?: NamingRule; + /** + * Grouping strategy. + * + * - `'flat'` - No grouping, all contracts at root level + * - `'byTags'` - One group per operation tag + * - `'single'` - All operations in one group + * - Custom function for full control + * + * @default 'flat' + */ + strategy?: OperationsStrategy; + /** + * Default group name for operations without tags. + * + * Only applies when `strategy` is `'byTags'`. + * + * @default 'default' + */ + strategyDefaultTag?: string; +} + +export interface RouterConfig { + /** + * Customize key names for operations in the router. + * + * Applied to the final segment of the path (the key name). + */ + keyName: NamingConfig; + /** + * How to derive nesting structure from operations. + * + * - `'operationId'` - Split operationId by delimiters (e.g., `users.list` → `{ users: { list } }`) + * - `'id'` - Use operation id as-is, no nesting + * - Custom function for full control + */ + nesting: 'id' | 'operationId' | OperationPathStrategy; + /** + * Delimiters for splitting operationId. + * + * Only applies when `nesting` is `'operationId'`. + */ + nestingDelimiters: RegExp; + /** + * Customize segment names for nested groups. + * + * Applied to intermediate path segments (not the key name). + */ + segmentName: NamingConfig; + /** + * Grouping strategy. + * + * - `'flat'` - No grouping, all contracts at root level + * - `'byTags'` - One group per operation tag + * - `'single'` - All operations in one group + * - Custom function for full control + */ + strategy: OperationsStrategy; + /** + * Default group name for operations without tags. + * + * Only applies when `strategy` is `'byTags'`. + */ + strategyDefaultTag: string; +} + export type UserConfig = Plugin.Name<'@orpc/contract'> & Plugin.Hooks & { /** @@ -11,12 +110,6 @@ export type UserConfig = Plugin.Name<'@orpc/contract'> & * @default (id) => `${id}Contract` */ contractNameBuilder?: (operationId: string) => string; - /** - * Default tag name for operations without tags. - * - * @default 'default' - */ - defaultTag?: string; /** * Whether exports should be re-exported in the index file. * @@ -24,18 +117,26 @@ export type UserConfig = Plugin.Name<'@orpc/contract'> & */ exportFromIndex?: boolean; /** - * Custom function to extract group key for router grouping. - * Receives the full IR.OperationObject. + * Router configuration for grouping and nesting operations. * - * @default extracts first path segment as camelCase - */ - groupKeyBuilder?: (operation: IR.OperationObject) => string; - /** - * Custom function to generate operation key within a group. + * Can be a strategy string for simple cases, or an object for full control. + * + * @default { strategy: 'flat' } * - * @default (operationId, groupKey) => simplified operationId + * @example + * // Simple: just set strategy + * router: 'byTags' + * + * @example + * // Full control + * router: { + * strategy: 'byTags', + * nesting: 'operationId', + * segmentName: { casing: 'camelCase' }, + * keyName: { casing: 'camelCase' }, + * } */ - operationKeyBuilder?: (operationId: string, groupKey: string) => string; + router?: OperationsStrategy | UserRouterConfig; /** * Naming rule for the router export. * The type export will be the PascalCase version (e.g., 'router' → 'Router'). @@ -69,11 +170,9 @@ export type UserConfig = Plugin.Name<'@orpc/contract'> & export type Config = Plugin.Name<'@orpc/contract'> & Plugin.Hooks & { contractNameBuilder: (operationId: string) => string; - defaultTag: string; exportFromIndex: boolean; - groupKeyBuilder: (operation: IR.OperationObject) => string; - operationKeyBuilder: (operationId: string, groupKey: string) => string; output: string; + router: RouterConfig; routerName: NamingConfig; validator: PluginValidatorNames; }; From 5f20a24287e7a5b7b3e7270e118b18facac038bf Mon Sep 17 00:00:00 2001 From: Stephen Zhou <38493346+hyoban@users.noreply.github.com> Date: Mon, 26 Jan 2026 01:06:12 +0800 Subject: [PATCH 23/23] methodName --- .../src/plugins/@orpc/contract/config.ts | 6 +++--- .../src/plugins/@orpc/contract/plugin.ts | 2 +- .../src/plugins/@orpc/contract/types.d.ts | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts index d9baec31e..3123aaefb 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/config.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/config.ts @@ -29,13 +29,13 @@ function resolveRouter( }, mappers: { object(value) { - value.keyName = context.valueToObject({ + value.methodName = context.valueToObject({ defaultValue: { casing: 'camelCase' }, mappers: { function: (name) => ({ name }), string: (name) => ({ name }), }, - value: value.keyName, + value: value.methodName, }); value.segmentName = context.valueToObject({ defaultValue: { casing: 'camelCase' }, @@ -57,7 +57,7 @@ export const defaultConfig: OrpcContractPlugin['Config'] = { contractNameBuilder: (id: string) => `${id}Contract`, exportFromIndex: false, router: { - keyName: { casing: 'camelCase' }, + methodName: { casing: 'camelCase' }, nesting: 'operationId', nestingDelimiters: /[./]/, segmentName: { casing: 'camelCase' }, diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts index 26d640c9b..96c07f1a3 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/plugin.ts @@ -242,7 +242,7 @@ export const handler: OrpcContractPlugin['Handler'] = ({ plugin }) => { for (let i = 0; i < path.length; i++) { const isLast = i === path.length - 1; const segment = isLast - ? applyNaming(path[i]!, router.keyName) + ? applyNaming(path[i]!, router.methodName) : applyNaming(path[i]!, router.segmentName); if (isLast) { diff --git a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts index 7f78d6c6e..b9c7c0f9c 100644 --- a/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts +++ b/packages/openapi-ts/src/plugins/@orpc/contract/types.d.ts @@ -8,11 +8,11 @@ import type { NamingConfig, NamingRule } from '~/utils/naming'; export interface UserRouterConfig { /** - * Customize key names for operations in the router. + * Customize method/key names for operations in the router. * - * Applied to the final segment of the path (the key name). + * Applied to the final segment of the path. */ - keyName?: NamingRule; + methodName?: NamingRule; /** * How to derive nesting structure from operations. * @@ -60,11 +60,11 @@ export interface UserRouterConfig { export interface RouterConfig { /** - * Customize key names for operations in the router. + * Customize method/key names for operations in the router. * - * Applied to the final segment of the path (the key name). + * Applied to the final segment of the path. */ - keyName: NamingConfig; + methodName: NamingConfig; /** * How to derive nesting structure from operations. * @@ -133,7 +133,7 @@ export type UserConfig = Plugin.Name<'@orpc/contract'> & * strategy: 'byTags', * nesting: 'operationId', * segmentName: { casing: 'camelCase' }, - * keyName: { casing: 'camelCase' }, + * methodName: { casing: 'camelCase' }, * } */ router?: OperationsStrategy | UserRouterConfig;