diff --git a/.changeset/odd-plums-tell.md b/.changeset/odd-plums-tell.md new file mode 100644 index 0000000000..79f4464a2a --- /dev/null +++ b/.changeset/odd-plums-tell.md @@ -0,0 +1,5 @@ +--- +"@hey-api/openapi-ts": patch +--- + +**plugin(zod)**: fix: move `.default()` after `.optional()` to avoid `z.infer` producing required fields diff --git a/dev/package.json b/dev/package.json index cec12c9ac9..9d460bb6fc 100644 --- a/dev/package.json +++ b/dev/package.json @@ -31,8 +31,5 @@ "valibot": "1.3.1", "vue": "3.5.25", "zod": "4.3.6" - }, - "engines": { - "node": ">=22.13.0" } } diff --git a/packages/openapi-python-tests/pydantic/v2/package.json b/packages/openapi-python-tests/pydantic/v2/package.json index 6e91a829e4..788803fe99 100644 --- a/packages/openapi-python-tests/pydantic/v2/package.json +++ b/packages/openapi-python-tests/pydantic/v2/package.json @@ -6,8 +6,5 @@ "devDependencies": { "@hey-api/openapi-python": "workspace:*", "typescript": "6.0.2" - }, - "engines": { - "node": ">=22.13.0" } } diff --git a/packages/openapi-python-tests/sdks/package.json b/packages/openapi-python-tests/sdks/package.json index 5e6d882375..4828707845 100644 --- a/packages/openapi-python-tests/sdks/package.json +++ b/packages/openapi-python-tests/sdks/package.json @@ -6,8 +6,5 @@ "devDependencies": { "@hey-api/openapi-python": "workspace:*", "typescript": "6.0.2" - }, - "engines": { - "node": ">=22.13.0" } } diff --git a/packages/openapi-python/src/plugins/pydantic/v2/walker.ts b/packages/openapi-python/src/plugins/pydantic/v2/walker.ts index e4799eb246..3c2a24657d 100644 --- a/packages/openapi-python/src/plugins/pydantic/v2/walker.ts +++ b/packages/openapi-python/src/plugins/pydantic/v2/walker.ts @@ -37,8 +37,8 @@ export function createVisitor( applyModifiers(result, ctx, options = {}): PydanticFinal { const { optional } = options; - const hasDefault = result.meta.default !== undefined; - const needsOptional = optional || hasDefault; + const needsDefault = result.meta.default !== undefined; + const needsOptional = optional || needsDefault; const needsNullable = result.meta.nullable; let type = result.type; @@ -48,7 +48,7 @@ export function createVisitor( const optionalType = ctx.plugin.external('typing.Optional'); type = $(optionalType).slice(type ?? ctx.plugin.external('typing.Any')); if (needsOptional) { - fieldConstraints.default = hasDefault ? result.meta.default : null; + fieldConstraints.default = needsDefault ? result.meta.default : null; } } diff --git a/packages/openapi-ts-tests/main/package.json b/packages/openapi-ts-tests/main/package.json index 6ac2585331..60fee056f6 100644 --- a/packages/openapi-ts-tests/main/package.json +++ b/packages/openapi-ts-tests/main/package.json @@ -44,8 +44,5 @@ "typescript": "6.0.2", "vue": "3.5.25", "zod": "4.3.6" - }, - "engines": { - "node": ">=22.13.0" } } diff --git a/packages/openapi-ts-tests/nestjs/v11/package.json b/packages/openapi-ts-tests/nestjs/v11/package.json index 51e4528dee..f7d28d5db1 100644 --- a/packages/openapi-ts-tests/nestjs/v11/package.json +++ b/packages/openapi-ts-tests/nestjs/v11/package.json @@ -9,8 +9,5 @@ "devDependencies": { "@hey-api/openapi-ts": "workspace:*", "typescript": "6.0.2" - }, - "engines": { - "node": ">=22.13.0" } } diff --git a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.0.x/default/zod.gen.ts b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.0.x/default/zod.gen.ts index 622f83e5e4..2d085de34d 100644 --- a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.0.x/default/zod.gen.ts +++ b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.0.x/default/zod.gen.ts @@ -36,12 +36,12 @@ export const zPost = z.object({ export const zCreatePostInput = z.object({ title: z.string(), content: z.string(), - status: z.enum(['draft', 'published']).optional().default('draft') + status: z.enum(['draft', 'published']).default('draft').optional() }); export const zGetUsersQuery = z.object({ - limit: z.int().optional().default(10), - offset: z.int().optional().default(0) + limit: z.int().default(10).optional(), + offset: z.int().default(0).optional() }); /** @@ -119,7 +119,7 @@ export const zGetPostByIdPath = z.object({ }); export const zGetPostByIdQuery = z.object({ - includeComments: z.boolean().optional().default(false) + includeComments: z.boolean().default(false).optional() }); /** diff --git a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-custom-naming/zod.gen.ts b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-custom-naming/zod.gen.ts index 622f83e5e4..2d085de34d 100644 --- a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-custom-naming/zod.gen.ts +++ b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-custom-naming/zod.gen.ts @@ -36,12 +36,12 @@ export const zPost = z.object({ export const zCreatePostInput = z.object({ title: z.string(), content: z.string(), - status: z.enum(['draft', 'published']).optional().default('draft') + status: z.enum(['draft', 'published']).default('draft').optional() }); export const zGetUsersQuery = z.object({ - limit: z.int().optional().default(10), - offset: z.int().optional().default(0) + limit: z.int().default(10).optional(), + offset: z.int().default(0).optional() }); /** @@ -119,7 +119,7 @@ export const zGetPostByIdPath = z.object({ }); export const zGetPostByIdQuery = z.object({ - includeComments: z.boolean().optional().default(false) + includeComments: z.boolean().default(false).optional() }); /** diff --git a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-nesting-id/zod.gen.ts b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-nesting-id/zod.gen.ts index 622f83e5e4..2d085de34d 100644 --- a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-nesting-id/zod.gen.ts +++ b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-nesting-id/zod.gen.ts @@ -36,12 +36,12 @@ export const zPost = z.object({ export const zCreatePostInput = z.object({ title: z.string(), content: z.string(), - status: z.enum(['draft', 'published']).optional().default('draft') + status: z.enum(['draft', 'published']).default('draft').optional() }); export const zGetUsersQuery = z.object({ - limit: z.int().optional().default(10), - offset: z.int().optional().default(0) + limit: z.int().default(10).optional(), + offset: z.int().default(0).optional() }); /** @@ -119,7 +119,7 @@ export const zGetPostByIdPath = z.object({ }); export const zGetPostByIdQuery = z.object({ - includeComments: z.boolean().optional().default(false) + includeComments: z.boolean().default(false).optional() }); /** diff --git a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-strategy-by-tags/zod.gen.ts b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-strategy-by-tags/zod.gen.ts index 622f83e5e4..2d085de34d 100644 --- a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-strategy-by-tags/zod.gen.ts +++ b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-strategy-by-tags/zod.gen.ts @@ -36,12 +36,12 @@ export const zPost = z.object({ export const zCreatePostInput = z.object({ title: z.string(), content: z.string(), - status: z.enum(['draft', 'published']).optional().default('draft') + status: z.enum(['draft', 'published']).default('draft').optional() }); export const zGetUsersQuery = z.object({ - limit: z.int().optional().default(10), - offset: z.int().optional().default(0) + limit: z.int().default(10).optional(), + offset: z.int().default(0).optional() }); /** @@ -119,7 +119,7 @@ export const zGetPostByIdPath = z.object({ }); export const zGetPostByIdQuery = z.object({ - includeComments: z.boolean().optional().default(false) + includeComments: z.boolean().default(false).optional() }); /** diff --git a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-strategy-single/zod.gen.ts b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-strategy-single/zod.gen.ts index 622f83e5e4..2d085de34d 100644 --- a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-strategy-single/zod.gen.ts +++ b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/contracts-strategy-single/zod.gen.ts @@ -36,12 +36,12 @@ export const zPost = z.object({ export const zCreatePostInput = z.object({ title: z.string(), content: z.string(), - status: z.enum(['draft', 'published']).optional().default('draft') + status: z.enum(['draft', 'published']).default('draft').optional() }); export const zGetUsersQuery = z.object({ - limit: z.int().optional().default(10), - offset: z.int().optional().default(0) + limit: z.int().default(10).optional(), + offset: z.int().default(0).optional() }); /** @@ -119,7 +119,7 @@ export const zGetPostByIdPath = z.object({ }); export const zGetPostByIdQuery = z.object({ - includeComments: z.boolean().optional().default(false) + includeComments: z.boolean().default(false).optional() }); /** diff --git a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/default/zod.gen.ts b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/default/zod.gen.ts index 622f83e5e4..2d085de34d 100644 --- a/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/default/zod.gen.ts +++ b/packages/openapi-ts-tests/orpc/v1/__snapshots__/3.1.x/default/zod.gen.ts @@ -36,12 +36,12 @@ export const zPost = z.object({ export const zCreatePostInput = z.object({ title: z.string(), content: z.string(), - status: z.enum(['draft', 'published']).optional().default('draft') + status: z.enum(['draft', 'published']).default('draft').optional() }); export const zGetUsersQuery = z.object({ - limit: z.int().optional().default(10), - offset: z.int().optional().default(0) + limit: z.int().default(10).optional(), + offset: z.int().default(0).optional() }); /** @@ -119,7 +119,7 @@ export const zGetPostByIdPath = z.object({ }); export const zGetPostByIdQuery = z.object({ - includeComments: z.boolean().optional().default(false) + includeComments: z.boolean().default(false).optional() }); /** diff --git a/packages/openapi-ts-tests/orpc/v1/package.json b/packages/openapi-ts-tests/orpc/v1/package.json index 69a9e44345..3c74ef84af 100644 --- a/packages/openapi-ts-tests/orpc/v1/package.json +++ b/packages/openapi-ts-tests/orpc/v1/package.json @@ -12,8 +12,5 @@ "typescript": "6.0.2", "valibot": "1.3.1", "zod": "4.3.6" - }, - "engines": { - "node": ">=22.13.0" } } diff --git a/packages/openapi-ts-tests/sdks/package.json b/packages/openapi-ts-tests/sdks/package.json index 39af925f16..b5f06a2ec2 100644 --- a/packages/openapi-ts-tests/sdks/package.json +++ b/packages/openapi-ts-tests/sdks/package.json @@ -9,8 +9,5 @@ "devDependencies": { "@hey-api/openapi-ts": "workspace:*", "typescript": "6.0.2" - }, - "engines": { - "node": ">=22.13.0" } } diff --git a/packages/openapi-ts-tests/valibot/v1/package.json b/packages/openapi-ts-tests/valibot/v1/package.json index 176f1a4d92..758cf80b55 100644 --- a/packages/openapi-ts-tests/valibot/v1/package.json +++ b/packages/openapi-ts-tests/valibot/v1/package.json @@ -10,8 +10,5 @@ "@hey-api/openapi-ts": "workspace:*", "typescript": "6.0.2", "valibot": "1.3.1" - }, - "engines": { - "node": ">=22.13.0" } } diff --git a/packages/openapi-ts-tests/valibot/v1/test/utils.ts b/packages/openapi-ts-tests/valibot/v1/test/utils.ts index 31917d2ced..d9b8e8a939 100644 --- a/packages/openapi-ts-tests/valibot/v1/test/utils.ts +++ b/packages/openapi-ts-tests/valibot/v1/test/utils.ts @@ -1,7 +1,8 @@ import fs from 'node:fs'; import path from 'node:path'; -import { createClient, type UserConfig } from '@hey-api/openapi-ts'; +import type { UserConfig } from '@hey-api/openapi-ts'; +import { createClient } from '@hey-api/openapi-ts'; import * as v from 'valibot'; import { getSpecsPath } from '../../../utils'; diff --git a/packages/openapi-ts-tests/zod/v3/.gitignore b/packages/openapi-ts-tests/zod/v3/.gitignore index e0a0cbb0f4..d276aefe26 100644 --- a/packages/openapi-ts-tests/zod/v3/.gitignore +++ b/packages/openapi-ts-tests/zod/v3/.gitignore @@ -1,14 +1,5 @@ .DS_Store .idea -.tmp -.tsdown logs node_modules -temp - -.env coverage -dist - -# test files -.gen diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts index 271182df5c..2884146051 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/mini/default/zod.gen.ts @@ -510,19 +510,19 @@ export const zCallWithDefaultParametersQuery = z.object({ }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z._default(z.optional(z.string()), 'Hello World!'), - parameterNumber: z._default(z.optional(z.number()), 123), - parameterBoolean: z._default(z.optional(z.boolean()), true), - parameterEnum: z._default(z.optional(z.enum([ + parameterString: z.optional(z._default(z.string(), 'Hello World!')), + parameterNumber: z.optional(z._default(z.number(), 123)), + parameterBoolean: z.optional(z._default(z.boolean(), true)), + parameterEnum: z.optional(z._default(z.enum([ 'Success', 'Warning', 'Error' - ])), 'Success') + ]), 'Success')) }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z._default(z.optional(z.string()), 'Hello World!'), - parameterOptionalStringWithEmptyDefault: z._default(z.optional(z.string()), ''), + parameterOptionalStringWithDefault: z.optional(z._default(z.string(), 'Hello World!')), + parameterOptionalStringWithEmptyDefault: z.optional(z._default(z.string(), '')), parameterOptionalStringWithNoDefault: z.optional(z.string()), parameterStringWithDefault: z._default(z.string(), 'Hello World!'), parameterStringWithEmptyDefault: z._default(z.string(), ''), diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts index 58497f0918..435d2bfbe4 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v3/default/zod.gen.ts @@ -510,19 +510,19 @@ export const zCallWithDefaultParametersQuery = z.object({ }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success') + ]).default('Success').optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts index 3a05b1004c..be8ea01786 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/2.0.x/v4/default/zod.gen.ts @@ -510,19 +510,19 @@ export const zCallWithDefaultParametersQuery = z.object({ }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success') + ]).default('Success').optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/default/zod.gen.ts index c47fadf327..ee9deaddbb 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z._default(z.optional(z.string()), 'test') + foo: z.optional(z._default(z.string(), 'test')) }), z.object({ bar: z.optional(z.string()) })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z._default(z.optional(z.enum(['3.0'])), '3.0') + 'foo-bar-baz-qux': z.optional(z._default(z.enum(['3.0']), '3.0')) }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z._default(z.optional(z.int().check(z.gte(0), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }))), 0), + page: z.optional(z._default(z.int().check(z.gte(0), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' })), 0)), size: z.optional(z.int().check(z.gte(1), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }))), sort: z.optional(z.array(z.string())) }); @@ -1215,29 +1215,29 @@ export const zCallWithDefaultParametersQuery = z.object({ parameterString: z._default(z.nullish(z.string()), 'Hello World!'), parameterNumber: z._default(z.nullish(z.number()), 123), parameterBoolean: z._default(z.nullish(z.boolean()), true), - parameterEnum: z._default(z.optional(z.enum([ + parameterEnum: z.optional(z._default(z.enum([ 'Success', 'Warning', 'Error' - ])), 'Success'), + ]), 'Success')), parameterModel: z.nullish(zModelWithString) }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z._default(z.optional(z.string()), 'Hello World!'), - parameterNumber: z._default(z.optional(z.number()), 123), - parameterBoolean: z._default(z.optional(z.boolean()), true), - parameterEnum: z._default(z.optional(z.enum([ + parameterString: z.optional(z._default(z.string(), 'Hello World!')), + parameterNumber: z.optional(z._default(z.number(), 123)), + parameterBoolean: z.optional(z._default(z.boolean(), true)), + parameterEnum: z.optional(z._default(z.enum([ 'Success', 'Warning', 'Error' - ])), 'Success'), + ]), 'Success')), parameterModel: z.optional(zModelWithString) }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z._default(z.optional(z.string()), 'Hello World!'), - parameterOptionalStringWithEmptyDefault: z._default(z.optional(z.string()), ''), + parameterOptionalStringWithDefault: z.optional(z._default(z.string(), 'Hello World!')), + parameterOptionalStringWithEmptyDefault: z.optional(z._default(z.string(), '')), parameterOptionalStringWithNoDefault: z.optional(z.string()), parameterStringWithDefault: z._default(z.string(), 'Hello World!'), parameterStringWithEmptyDefault: z._default(z.string(), ''), @@ -1366,7 +1366,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.nullable(z.readonly(z.string().check(z.maxLength(64), z.regex(/^[a-zA-Z0-9_]*$/)))), name: z.nullable(z.string().check(z.maxLength(255))), - enabled: z._default(z.optional(z.boolean()), true), + enabled: z.optional(z._default(z.boolean(), true)), type: z.readonly(z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/validators/zod.gen.ts index fd4b0647cf..7850761313 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/mini/validators/zod.gen.ts @@ -8,7 +8,7 @@ export const zFoo = z._default(z.nullable(z.object({ foo: z.optional(z.string().check(z.regex(/^\d{3}-\d{2}-\d{4}$/))), bar: z.optional(z.lazy((): any => zBar)), baz: z.optional(z.array(z.lazy((): any => zFoo))), - qux: z._default(z.optional(z.int().check(z.gt(0))), 0) + qux: z.optional(z._default(z.int().check(z.gt(0)), 0)) })), null); export const zBar = z.object({ diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/default/zod.gen.ts index 5c6dc87c2b..51867284c1 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z.string().optional().default('test') + foo: z.string().default('test').optional() }), z.object({ bar: z.string().optional() })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z.enum(['3.0']).optional().default('3.0') + 'foo-bar-baz-qux': z.enum(['3.0']).default('3.0').optional() }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z.number().int().gte(0).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).optional().default(0), + page: z.number().int().gte(0).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).default(0).optional(), size: z.number().int().gte(1).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).optional(), sort: z.array(z.string()).optional() }); @@ -1219,25 +1219,25 @@ export const zCallWithDefaultParametersQuery = z.object({ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.nullish() }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), @@ -1366,7 +1366,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.string().max(64).regex(/^[a-zA-Z0-9_]*$/).readonly().nullable(), name: z.string().max(255).nullable(), - enabled: z.boolean().optional().default(true), + enabled: z.boolean().default(true).optional(), type: z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/validators/zod.gen.ts index a1fd0b756d..290e5f86a3 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v3/validators/zod.gen.ts @@ -8,7 +8,7 @@ export const zFoo: z.ZodTypeAny = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy(() => zBar).optional(), baz: z.array(z.lazy(() => zFoo)).optional(), - qux: z.number().int().gt(0).optional().default(0) + qux: z.number().int().gt(0).default(0).optional() }).nullable().default(null); export const zBar = z.object({ diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/default/zod.gen.ts index ab1abd778e..c20fd687ac 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z.string().optional().default('test') + foo: z.string().default('test').optional() }), z.object({ bar: z.string().optional() })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z.enum(['3.0']).optional().default('3.0') + 'foo-bar-baz-qux': z.enum(['3.0']).default('3.0').optional() }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z.int().gte(0).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).optional().default(0), + page: z.int().gte(0).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).default(0).optional(), size: z.int().gte(1).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).optional(), sort: z.array(z.string()).optional() }); @@ -1219,25 +1219,25 @@ export const zCallWithDefaultParametersQuery = z.object({ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.nullish() }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), @@ -1366,7 +1366,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.string().max(64).regex(/^[a-zA-Z0-9_]*$/).readonly().nullable(), name: z.string().max(255).nullable(), - enabled: z.boolean().optional().default(true), + enabled: z.boolean().default(true).optional(), type: z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/validators/zod.gen.ts index 7618e3266c..2c4bbd0e04 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.0.x/v4/validators/zod.gen.ts @@ -8,7 +8,7 @@ export const zFoo = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy((): any => zBar).optional(), baz: z.array(z.lazy((): any => zFoo)).optional(), - qux: z.int().gt(0).optional().default(0) + qux: z.int().gt(0).default(0).optional() }).nullable().default(null); export const zBar = z.object({ diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/default/zod.gen.ts index 81dab9d3d4..046bbcae90 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z._default(z.optional(z.string()), 'test') + foo: z.optional(z._default(z.string(), 'test')) }), z.object({ bar: z.optional(z.string()) })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z._default(z.optional(z.enum(['3.0'])), '3.0') + 'foo-bar-baz-qux': z.optional(z._default(z.enum(['3.0']), '3.0')) }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z._default(z.optional(z.int().check(z.gte(0), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }))), 0), + page: z.optional(z._default(z.int().check(z.gte(0), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' })), 0)), size: z.optional(z.int().check(z.gte(1), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }))), sort: z.optional(z.array(z.string())) }); @@ -1233,29 +1233,29 @@ export const zCallWithDefaultParametersQuery = z.object({ parameterString: z._default(z.nullish(z.string()), 'Hello World!'), parameterNumber: z._default(z.nullish(z.number()), 123), parameterBoolean: z._default(z.nullish(z.boolean()), true), - parameterEnum: z._default(z.optional(z.enum([ + parameterEnum: z.optional(z._default(z.enum([ 'Success', 'Warning', 'Error' - ])), 'Success'), + ]), 'Success')), parameterModel: z.nullish(zModelWithString) }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z._default(z.optional(z.string()), 'Hello World!'), - parameterNumber: z._default(z.optional(z.number()), 123), - parameterBoolean: z._default(z.optional(z.boolean()), true), - parameterEnum: z._default(z.optional(z.enum([ + parameterString: z.optional(z._default(z.string(), 'Hello World!')), + parameterNumber: z.optional(z._default(z.number(), 123)), + parameterBoolean: z.optional(z._default(z.boolean(), true)), + parameterEnum: z.optional(z._default(z.enum([ 'Success', 'Warning', 'Error' - ])), 'Success'), - parameterModel: z._default(z.optional(zModelWithString), { prop: 'Hello World!' }) + ]), 'Success')), + parameterModel: z.optional(z._default(zModelWithString, { prop: 'Hello World!' })) }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z._default(z.optional(z.string()), 'Hello World!'), - parameterOptionalStringWithEmptyDefault: z._default(z.optional(z.string()), ''), + parameterOptionalStringWithDefault: z.optional(z._default(z.string(), 'Hello World!')), + parameterOptionalStringWithEmptyDefault: z.optional(z._default(z.string(), '')), parameterOptionalStringWithNoDefault: z.optional(z.string()), parameterStringWithDefault: z._default(z.string(), 'Hello World!'), parameterStringWithEmptyDefault: z._default(z.string(), ''), @@ -1384,7 +1384,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.nullable(z.readonly(z.string().check(z.maxLength(64), z.regex(/^[a-zA-Z0-9_]*$/)))), name: z.nullable(z.string().check(z.maxLength(255))), - enabled: z._default(z.optional(z.boolean()), true), + enabled: z.optional(z._default(z.boolean(), true)), type: z.readonly(z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-dates/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-dates/zod.gen.ts index f98d3a4d1c..c5b910c76b 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-dates/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-dates/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo = z._default(z.nullable(z.object({ foo: z.optional(z.string().check(z.regex(/^\d{3}-\d{2}-\d{4}$/))), bar: z.optional(z.lazy((): any => zBar)), baz: z.optional(z.array(z.lazy((): any => zFoo))), - qux: z._default(z.optional(z.int().check(z.gt(0))), 0) + qux: z.optional(z._default(z.int().check(z.gt(0)), 0)) })), null); /** diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-metadata/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-metadata/zod.gen.ts index 33c918fb80..bd231a92a5 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-metadata/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-metadata/zod.gen.ts @@ -19,9 +19,9 @@ export const zFoo = z._default(z.nullable(z.object({ baz: z.optional(z.array(z.lazy((): any => zFoo)).register(z.globalRegistry, { description: 'This is baz property.' })), - qux: z._default(z.optional(z.int().check(z.gt(0)).register(z.globalRegistry, { + qux: z.optional(z._default(z.int().check(z.gt(0)).register(z.globalRegistry, { description: 'This is qux property.' - })), 0) + }), 0)) })), null); /** diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-types/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-types/zod.gen.ts index a0e7680f8d..4b793e9abe 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-types/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-types/zod.gen.ts @@ -19,7 +19,7 @@ export const zFoo = z._default(z.nullable(z.object({ foo: z.optional(z.string().check(z.regex(/^\d{3}-\d{2}-\d{4}$/))), bar: z.optional(z.lazy((): any => zBar)), baz: z.optional(z.array(z.lazy((): any => zFoo))), - qux: z._default(z.optional(z.int().check(z.gt(0))), 0) + qux: z.optional(z._default(z.int().check(z.gt(0)), 0)) })), null); export type FooZodType = z.infer; diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-union-merge/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-union-merge/zod.gen.ts index e09f7a7cae..238c2319c4 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-union-merge/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators-union-merge/zod.gen.ts @@ -32,7 +32,7 @@ export const zCatDetails = z.object({ export const zPetStore = z.object({ animals: z.array(z.object({ name: z.string(), - type: z._default(z.optional(z.enum(['dog', 'cat'])), 'dog'), + type: z.optional(z._default(z.enum(['dog', 'cat']), 'dog')), details: z.union([ zDogDetails, zCatDetails diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators/zod.gen.ts index 0cc767f51b..59bf59c71f 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/mini/validators/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo = z._default(z.nullable(z.object({ foo: z.optional(z.string().check(z.regex(/^\d{3}-\d{2}-\d{4}$/))), bar: z.optional(z.lazy((): any => zBar)), baz: z.optional(z.array(z.lazy((): any => zFoo))), - qux: z._default(z.optional(z.int().check(z.gt(0))), 0) + qux: z.optional(z._default(z.int().check(z.gt(0)), 0)) })), null); /** diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/default/zod.gen.ts index 1aa1e86a66..ab23e94cab 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z.string().optional().default('test') + foo: z.string().default('test').optional() }), z.object({ bar: z.string().optional() })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z.enum(['3.0']).optional().default('3.0') + 'foo-bar-baz-qux': z.enum(['3.0']).default('3.0').optional() }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z.number().int().gte(0).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).optional().default(0), + page: z.number().int().gte(0).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).default(0).optional(), size: z.number().int().gte(1).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).optional(), sort: z.array(z.string()).optional() }); @@ -1237,25 +1237,25 @@ export const zCallWithDefaultParametersQuery = z.object({ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.nullish() }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), - parameterModel: zModelWithString.optional().default({ prop: 'Hello World!' }) + ]).default('Success').optional(), + parameterModel: zModelWithString.default({ prop: 'Hello World!' }).optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), @@ -1384,7 +1384,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.string().max(64).regex(/^[a-zA-Z0-9_]*$/).readonly().nullable(), name: z.string().max(255).nullable(), - enabled: z.boolean().optional().default(true), + enabled: z.boolean().default(true).optional(), type: z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-dates/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-dates/zod.gen.ts index 518849beed..620a57ecd0 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-dates/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-dates/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo: z.ZodTypeAny = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy(() => zBar).optional(), baz: z.array(z.lazy(() => zFoo)).optional(), - qux: z.number().int().gt(0).optional().default(0) + qux: z.number().int().gt(0).default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-metadata/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-metadata/zod.gen.ts index a984a7a429..043f48df44 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-metadata/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-metadata/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo: z.ZodTypeAny = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).describe('This is foo property.').optional(), bar: z.lazy(() => zBar).optional(), baz: z.array(z.lazy(() => zFoo)).describe('This is baz property.').optional(), - qux: z.number().int().gt(0).describe('This is qux property.').optional().default(0) + qux: z.number().int().gt(0).describe('This is qux property.').default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-types/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-types/zod.gen.ts index deafcaf486..730310ab95 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-types/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-types/zod.gen.ts @@ -19,7 +19,7 @@ export const zFoo: z.ZodTypeAny = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy(() => zBar).optional(), baz: z.array(z.lazy(() => zFoo)).optional(), - qux: z.number().int().gt(0).optional().default(0) + qux: z.number().int().gt(0).default(0).optional() }).nullable().default(null); export type FooZodType = z.infer; diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-union-merge/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-union-merge/zod.gen.ts index 7561d69de8..3d51be8ffc 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-union-merge/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators-union-merge/zod.gen.ts @@ -32,7 +32,7 @@ export const zCatDetails = z.object({ export const zPetStore = z.object({ animals: z.array(z.object({ name: z.string(), - type: z.enum(['dog', 'cat']).optional().default('dog'), + type: z.enum(['dog', 'cat']).default('dog').optional(), details: z.union([ zDogDetails, zCatDetails diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators/zod.gen.ts index 43072cb351..ea5e83c903 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v3/validators/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo: z.ZodTypeAny = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy(() => zBar).optional(), baz: z.array(z.lazy(() => zFoo)).optional(), - qux: z.number().int().gt(0).optional().default(0) + qux: z.number().int().gt(0).default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/default/zod.gen.ts index 069d3536d3..edacc75435 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z.string().optional().default('test') + foo: z.string().default('test').optional() }), z.object({ bar: z.string().optional() })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z.enum(['3.0']).optional().default('3.0') + 'foo-bar-baz-qux': z.enum(['3.0']).default('3.0').optional() }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z.int().gte(0).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).optional().default(0), + page: z.int().gte(0).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).default(0).optional(), size: z.int().gte(1).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).optional(), sort: z.array(z.string()).optional() }); @@ -1237,25 +1237,25 @@ export const zCallWithDefaultParametersQuery = z.object({ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.nullish() }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), - parameterModel: zModelWithString.optional().default({ prop: 'Hello World!' }) + ]).default('Success').optional(), + parameterModel: zModelWithString.default({ prop: 'Hello World!' }).optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), @@ -1384,7 +1384,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.string().max(64).regex(/^[a-zA-Z0-9_]*$/).readonly().nullable(), name: z.string().max(255).nullable(), - enabled: z.boolean().optional().default(true), + enabled: z.boolean().default(true).optional(), type: z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-dates/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-dates/zod.gen.ts index 3fe68dd1e2..f0ce2a9083 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-dates/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-dates/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy((): any => zBar).optional(), baz: z.array(z.lazy((): any => zFoo)).optional(), - qux: z.int().gt(0).optional().default(0) + qux: z.int().gt(0).default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-metadata/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-metadata/zod.gen.ts index 4b8affd9ac..28534434ac 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-metadata/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-metadata/zod.gen.ts @@ -21,7 +21,7 @@ export const zFoo = z.object({ }).optional(), qux: z.int().gt(0).register(z.globalRegistry, { description: 'This is qux property.' - }).optional().default(0) + }).default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-types/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-types/zod.gen.ts index fdf095f5df..960799d0ce 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-types/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-types/zod.gen.ts @@ -19,7 +19,7 @@ export const zFoo = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy((): any => zBar).optional(), baz: z.array(z.lazy((): any => zFoo)).optional(), - qux: z.int().gt(0).optional().default(0) + qux: z.int().gt(0).default(0).optional() }).nullable().default(null); export type FooZodType = z.infer; diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-union-merge/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-union-merge/zod.gen.ts index 9a8fd61b70..109abdae7f 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-union-merge/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators-union-merge/zod.gen.ts @@ -32,7 +32,7 @@ export const zCatDetails = z.object({ export const zPetStore = z.object({ animals: z.array(z.object({ name: z.string(), - type: z.enum(['dog', 'cat']).optional().default('dog'), + type: z.enum(['dog', 'cat']).default('dog').optional(), details: z.union([ zDogDetails, zCatDetails diff --git a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators/zod.gen.ts index ff18cb34cd..8d69e8cb7b 100644 --- a/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v3/__snapshots__/3.1.x/v4/validators/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy((): any => zBar).optional(), baz: z.array(z.lazy((): any => zFoo)).optional(), - qux: z.int().gt(0).optional().default(0) + qux: z.int().gt(0).default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v3/package.json b/packages/openapi-ts-tests/zod/v3/package.json index a6c3495469..aebebe9b10 100644 --- a/packages/openapi-ts-tests/zod/v3/package.json +++ b/packages/openapi-ts-tests/zod/v3/package.json @@ -10,8 +10,5 @@ "@hey-api/openapi-ts": "workspace:*", "typescript": "6.0.2", "zod": "^3.25.0" - }, - "engines": { - "node": ">=22.13.0" } } diff --git a/packages/openapi-ts-tests/zod/v3/test/3.0.x.test.ts b/packages/openapi-ts-tests/zod/v3/test/3.0.x.test.ts index d441759618..f498a05473 100644 --- a/packages/openapi-ts-tests/zod/v3/test/3.0.x.test.ts +++ b/packages/openapi-ts-tests/zod/v3/test/3.0.x.test.ts @@ -4,13 +4,13 @@ import path from 'node:path'; import { createClient } from '@hey-api/openapi-ts'; import { getFilePaths } from '../../../utils'; -import { createConfigFactory, getSnapshotsPath, getTempSnapshotsPath, zodVersions } from './utils'; +import { snapshotsDir, tmpDir } from './constants'; +import { createConfigFactory, zodVersions } from './utils'; const version = '3.0.x'; for (const zodVersion of zodVersions) { - const outputDir = path.join(getTempSnapshotsPath(), version, zodVersion.folder); - const snapshotsDir = path.join(getSnapshotsPath(), version, zodVersion.folder); + const outputDir = path.join(tmpDir, version, zodVersion.folder); describe(`OpenAPI ${version}`, () => { const createConfig = createConfigFactory({ @@ -59,7 +59,12 @@ for (const zodVersion of zodVersions) { filePaths.map(async (filePath) => { const fileContent = fs.readFileSync(filePath, 'utf-8'); await expect(fileContent).toMatchFileSnapshot( - path.join(snapshotsDir, filePath.slice(outputDir.length + 1)), + path.join( + snapshotsDir, + version, + zodVersion.folder, + filePath.slice(outputDir.length + 1), + ), ); }), ); diff --git a/packages/openapi-ts-tests/zod/v3/test/3.1.x.test.ts b/packages/openapi-ts-tests/zod/v3/test/3.1.x.test.ts index a538ccfaff..841552b12a 100644 --- a/packages/openapi-ts-tests/zod/v3/test/3.1.x.test.ts +++ b/packages/openapi-ts-tests/zod/v3/test/3.1.x.test.ts @@ -4,13 +4,13 @@ import path from 'node:path'; import { createClient } from '@hey-api/openapi-ts'; import { getFilePaths } from '../../../utils'; -import { createConfigFactory, getSnapshotsPath, getTempSnapshotsPath, zodVersions } from './utils'; +import { snapshotsDir, tmpDir } from './constants'; +import { createConfigFactory, zodVersions } from './utils'; const version = '3.1.x'; for (const zodVersion of zodVersions) { - const outputDir = path.join(getTempSnapshotsPath(), version, zodVersion.folder); - const snapshotsDir = path.join(getSnapshotsPath(), version, zodVersion.folder); + const outputDir = path.join(tmpDir, version, zodVersion.folder); describe(`OpenAPI ${version}`, () => { const createConfig = createConfigFactory({ @@ -171,7 +171,12 @@ for (const zodVersion of zodVersions) { filePaths.map(async (filePath) => { const fileContent = fs.readFileSync(filePath, 'utf-8'); await expect(fileContent).toMatchFileSnapshot( - path.join(snapshotsDir, filePath.slice(outputDir.length + 1)), + path.join( + snapshotsDir, + version, + zodVersion.folder, + filePath.slice(outputDir.length + 1), + ), ); }), ); diff --git a/packages/openapi-ts-tests/zod/v3/test/constants.ts b/packages/openapi-ts-tests/zod/v3/test/constants.ts new file mode 100644 index 0000000000..e72988d8bb --- /dev/null +++ b/packages/openapi-ts-tests/zod/v3/test/constants.ts @@ -0,0 +1,4 @@ +import path from 'node:path'; + +export const snapshotsDir = path.join(__dirname, '..', '__snapshots__'); +export const tmpDir = path.join(__dirname, '..', '.tmp'); diff --git a/packages/openapi-ts-tests/zod/v3/test/globalTeardown.ts b/packages/openapi-ts-tests/zod/v3/test/globalTeardown.ts new file mode 100644 index 0000000000..7c8712f70f --- /dev/null +++ b/packages/openapi-ts-tests/zod/v3/test/globalTeardown.ts @@ -0,0 +1,7 @@ +import fs from 'node:fs'; + +import { tmpDir } from './constants'; + +export function teardown() { + fs.rmSync(tmpDir, { force: true, recursive: true }); +} diff --git a/packages/openapi-ts-tests/zod/v3/test/openapi.test.ts b/packages/openapi-ts-tests/zod/v3/test/openapi.test.ts index 8f3c4375e3..cfc852adec 100644 --- a/packages/openapi-ts-tests/zod/v3/test/openapi.test.ts +++ b/packages/openapi-ts-tests/zod/v3/test/openapi.test.ts @@ -4,14 +4,14 @@ import path from 'node:path'; import { createClient } from '@hey-api/openapi-ts'; import { getFilePaths } from '../../../utils'; -import { createConfigFactory, getSnapshotsPath, getTempSnapshotsPath, zodVersions } from './utils'; +import { snapshotsDir, tmpDir } from './constants'; +import { createConfigFactory, zodVersions } from './utils'; const versions = ['2.0.x', '3.0.x', '3.1.x']; for (const version of versions) { for (const zodVersion of zodVersions) { - const outputDir = path.join(getTempSnapshotsPath(), version, zodVersion.folder); - const snapshotsDir = path.join(getSnapshotsPath(), version, zodVersion.folder); + const outputDir = path.join(tmpDir, version, zodVersion.folder); describe(`OpenAPI ${version}`, () => { const createConfig = createConfigFactory({ @@ -53,7 +53,12 @@ for (const version of versions) { filePaths.map(async (filePath) => { const fileContent = fs.readFileSync(filePath, 'utf-8'); await expect(fileContent).toMatchFileSnapshot( - path.join(snapshotsDir, filePath.slice(outputDir.length + 1)), + path.join( + snapshotsDir, + version, + zodVersion.folder, + filePath.slice(outputDir.length + 1), + ), ); }), ); diff --git a/packages/openapi-ts-tests/zod/v3/test/utils.ts b/packages/openapi-ts-tests/zod/v3/test/utils.ts index 7451b309a9..be32736cde 100644 --- a/packages/openapi-ts-tests/zod/v3/test/utils.ts +++ b/packages/openapi-ts-tests/zod/v3/test/utils.ts @@ -1,13 +1,9 @@ import path from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { type UserConfig } from '@hey-api/openapi-ts'; +import type { UserConfig } from '@hey-api/openapi-ts'; import { getSpecsPath } from '../../../utils'; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - export function createConfigFactory({ openApiVersion, outputDir, @@ -48,10 +44,6 @@ export function createConfigFactory({ }; } -export const getSnapshotsPath = (): string => path.join(__dirname, '..', '__snapshots__'); - -export const getTempSnapshotsPath = (): string => path.join(__dirname, '..', '.gen', 'snapshots'); - export const zodVersions = [ { compatibilityVersion: 3, diff --git a/packages/openapi-ts-tests/zod/v3/tsconfig.json b/packages/openapi-ts-tests/zod/v3/tsconfig.json index b406106e5a..e7572df83d 100644 --- a/packages/openapi-ts-tests/zod/v3/tsconfig.json +++ b/packages/openapi-ts-tests/zod/v3/tsconfig.json @@ -1,6 +1,5 @@ { "extends": "../../tsconfig.base.json", "include": ["test/**/*", "__snapshots__/**/*"], - "exclude": [".gen/**/*"], "references": [{ "path": "../../../openapi-ts" }] } diff --git a/packages/openapi-ts-tests/zod/v4/.gitignore b/packages/openapi-ts-tests/zod/v4/.gitignore index e0a0cbb0f4..d276aefe26 100644 --- a/packages/openapi-ts-tests/zod/v4/.gitignore +++ b/packages/openapi-ts-tests/zod/v4/.gitignore @@ -1,14 +1,5 @@ .DS_Store .idea -.tmp -.tsdown logs node_modules -temp - -.env coverage -dist - -# test files -.gen diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts index 50106f42f3..380cf4f46c 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/mini/default/zod.gen.ts @@ -510,19 +510,19 @@ export const zCallWithDefaultParametersQuery = z.object({ }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z._default(z.optional(z.string()), 'Hello World!'), - parameterNumber: z._default(z.optional(z.number()), 123), - parameterBoolean: z._default(z.optional(z.boolean()), true), - parameterEnum: z._default(z.optional(z.enum([ + parameterString: z.optional(z._default(z.string(), 'Hello World!')), + parameterNumber: z.optional(z._default(z.number(), 123)), + parameterBoolean: z.optional(z._default(z.boolean(), true)), + parameterEnum: z.optional(z._default(z.enum([ 'Success', 'Warning', 'Error' - ])), 'Success') + ]), 'Success')) }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z._default(z.optional(z.string()), 'Hello World!'), - parameterOptionalStringWithEmptyDefault: z._default(z.optional(z.string()), ''), + parameterOptionalStringWithDefault: z.optional(z._default(z.string(), 'Hello World!')), + parameterOptionalStringWithEmptyDefault: z.optional(z._default(z.string(), '')), parameterOptionalStringWithNoDefault: z.optional(z.string()), parameterStringWithDefault: z._default(z.string(), 'Hello World!'), parameterStringWithEmptyDefault: z._default(z.string(), ''), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts index 56c3bbd494..6db2653609 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v3/default/zod.gen.ts @@ -510,19 +510,19 @@ export const zCallWithDefaultParametersQuery = z.object({ }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success') + ]).default('Success').optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts index f0edba470e..2784904e91 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/2.0.x/v4/default/zod.gen.ts @@ -510,19 +510,19 @@ export const zCallWithDefaultParametersQuery = z.object({ }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success') + ]).default('Success').optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/default/zod.gen.ts index 7821e9f7af..6e4bc53d00 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z._default(z.optional(z.string()), 'test') + foo: z.optional(z._default(z.string(), 'test')) }), z.object({ bar: z.optional(z.string()) })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z._default(z.optional(z.enum(['3.0'])), '3.0') + 'foo-bar-baz-qux': z.optional(z._default(z.enum(['3.0']), '3.0')) }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z._default(z.optional(z.int().check(z.gte(0), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }))), 0), + page: z.optional(z._default(z.int().check(z.gte(0), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' })), 0)), size: z.optional(z.int().check(z.gte(1), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }))), sort: z.optional(z.array(z.string())) }); @@ -1215,29 +1215,29 @@ export const zCallWithDefaultParametersQuery = z.object({ parameterString: z._default(z.nullish(z.string()), 'Hello World!'), parameterNumber: z._default(z.nullish(z.number()), 123), parameterBoolean: z._default(z.nullish(z.boolean()), true), - parameterEnum: z._default(z.optional(z.enum([ + parameterEnum: z.optional(z._default(z.enum([ 'Success', 'Warning', 'Error' - ])), 'Success'), + ]), 'Success')), parameterModel: z.nullish(zModelWithString) }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z._default(z.optional(z.string()), 'Hello World!'), - parameterNumber: z._default(z.optional(z.number()), 123), - parameterBoolean: z._default(z.optional(z.boolean()), true), - parameterEnum: z._default(z.optional(z.enum([ + parameterString: z.optional(z._default(z.string(), 'Hello World!')), + parameterNumber: z.optional(z._default(z.number(), 123)), + parameterBoolean: z.optional(z._default(z.boolean(), true)), + parameterEnum: z.optional(z._default(z.enum([ 'Success', 'Warning', 'Error' - ])), 'Success'), + ]), 'Success')), parameterModel: z.optional(zModelWithString) }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z._default(z.optional(z.string()), 'Hello World!'), - parameterOptionalStringWithEmptyDefault: z._default(z.optional(z.string()), ''), + parameterOptionalStringWithDefault: z.optional(z._default(z.string(), 'Hello World!')), + parameterOptionalStringWithEmptyDefault: z.optional(z._default(z.string(), '')), parameterOptionalStringWithNoDefault: z.optional(z.string()), parameterStringWithDefault: z._default(z.string(), 'Hello World!'), parameterStringWithEmptyDefault: z._default(z.string(), ''), @@ -1366,7 +1366,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.nullable(z.readonly(z.string().check(z.maxLength(64), z.regex(/^[a-zA-Z0-9_]*$/)))), name: z.nullable(z.string().check(z.maxLength(255))), - enabled: z._default(z.optional(z.boolean()), true), + enabled: z.optional(z._default(z.boolean(), true)), type: z.readonly(z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/validators/zod.gen.ts index e80f1ac170..e2ac424fe3 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/mini/validators/zod.gen.ts @@ -8,7 +8,7 @@ export const zFoo = z._default(z.nullable(z.object({ foo: z.optional(z.string().check(z.regex(/^\d{3}-\d{2}-\d{4}$/))), bar: z.optional(z.lazy((): any => zBar)), baz: z.optional(z.array(z.lazy((): any => zFoo))), - qux: z._default(z.optional(z.int().check(z.gt(0))), 0) + qux: z.optional(z._default(z.int().check(z.gt(0)), 0)) })), null); export const zBar = z.object({ diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/default/zod.gen.ts index 71377eec8f..f2e2cca6c2 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z.string().optional().default('test') + foo: z.string().default('test').optional() }), z.object({ bar: z.string().optional() })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z.enum(['3.0']).optional().default('3.0') + 'foo-bar-baz-qux': z.enum(['3.0']).default('3.0').optional() }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z.number().int().gte(0).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).optional().default(0), + page: z.number().int().gte(0).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).default(0).optional(), size: z.number().int().gte(1).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).optional(), sort: z.array(z.string()).optional() }); @@ -1219,25 +1219,25 @@ export const zCallWithDefaultParametersQuery = z.object({ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.nullish() }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), @@ -1366,7 +1366,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.string().max(64).regex(/^[a-zA-Z0-9_]*$/).readonly().nullable(), name: z.string().max(255).nullable(), - enabled: z.boolean().optional().default(true), + enabled: z.boolean().default(true).optional(), type: z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/validators/zod.gen.ts index 1e7523b1f6..fdc9a45e4d 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v3/validators/zod.gen.ts @@ -8,7 +8,7 @@ export const zFoo: z.ZodTypeAny = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy(() => zBar).optional(), baz: z.array(z.lazy(() => zFoo)).optional(), - qux: z.number().int().gt(0).optional().default(0) + qux: z.number().int().gt(0).default(0).optional() }).nullable().default(null); export const zBar = z.object({ diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/default/zod.gen.ts index 424a8ed779..3d7087c9d8 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z.string().optional().default('test') + foo: z.string().default('test').optional() }), z.object({ bar: z.string().optional() })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z.enum(['3.0']).optional().default('3.0') + 'foo-bar-baz-qux': z.enum(['3.0']).default('3.0').optional() }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z.int().gte(0).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).optional().default(0), + page: z.int().gte(0).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).default(0).optional(), size: z.int().gte(1).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).optional(), sort: z.array(z.string()).optional() }); @@ -1219,25 +1219,25 @@ export const zCallWithDefaultParametersQuery = z.object({ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.nullish() }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), @@ -1366,7 +1366,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.string().max(64).regex(/^[a-zA-Z0-9_]*$/).readonly().nullable(), name: z.string().max(255).nullable(), - enabled: z.boolean().optional().default(true), + enabled: z.boolean().default(true).optional(), type: z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/validators/zod.gen.ts index 09932afd1e..3bcdc351c7 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.0.x/v4/validators/zod.gen.ts @@ -8,7 +8,7 @@ export const zFoo = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy((): any => zBar).optional(), baz: z.array(z.lazy((): any => zFoo)).optional(), - qux: z.int().gt(0).optional().default(0) + qux: z.int().gt(0).default(0).optional() }).nullable().default(null); export const zBar = z.object({ diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/default/zod.gen.ts index 4850e117d1..c5f8400015 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z._default(z.optional(z.string()), 'test') + foo: z.optional(z._default(z.string(), 'test')) }), z.object({ bar: z.optional(z.string()) })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z._default(z.optional(z.enum(['3.0'])), '3.0') + 'foo-bar-baz-qux': z.optional(z._default(z.enum(['3.0']), '3.0')) }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z._default(z.optional(z.int().check(z.gte(0), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }))), 0), + page: z.optional(z._default(z.int().check(z.gte(0), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' })), 0)), size: z.optional(z.int().check(z.gte(1), z.maximum(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }))), sort: z.optional(z.array(z.string())) }); @@ -1233,29 +1233,29 @@ export const zCallWithDefaultParametersQuery = z.object({ parameterString: z._default(z.nullish(z.string()), 'Hello World!'), parameterNumber: z._default(z.nullish(z.number()), 123), parameterBoolean: z._default(z.nullish(z.boolean()), true), - parameterEnum: z._default(z.optional(z.enum([ + parameterEnum: z.optional(z._default(z.enum([ 'Success', 'Warning', 'Error' - ])), 'Success'), + ]), 'Success')), parameterModel: z.nullish(zModelWithString) }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z._default(z.optional(z.string()), 'Hello World!'), - parameterNumber: z._default(z.optional(z.number()), 123), - parameterBoolean: z._default(z.optional(z.boolean()), true), - parameterEnum: z._default(z.optional(z.enum([ + parameterString: z.optional(z._default(z.string(), 'Hello World!')), + parameterNumber: z.optional(z._default(z.number(), 123)), + parameterBoolean: z.optional(z._default(z.boolean(), true)), + parameterEnum: z.optional(z._default(z.enum([ 'Success', 'Warning', 'Error' - ])), 'Success'), - parameterModel: z._default(z.optional(zModelWithString), { prop: 'Hello World!' }) + ]), 'Success')), + parameterModel: z.optional(z._default(zModelWithString, { prop: 'Hello World!' })) }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z._default(z.optional(z.string()), 'Hello World!'), - parameterOptionalStringWithEmptyDefault: z._default(z.optional(z.string()), ''), + parameterOptionalStringWithDefault: z.optional(z._default(z.string(), 'Hello World!')), + parameterOptionalStringWithEmptyDefault: z.optional(z._default(z.string(), '')), parameterOptionalStringWithNoDefault: z.optional(z.string()), parameterStringWithDefault: z._default(z.string(), 'Hello World!'), parameterStringWithEmptyDefault: z._default(z.string(), ''), @@ -1384,7 +1384,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.nullable(z.readonly(z.string().check(z.maxLength(64), z.regex(/^[a-zA-Z0-9_]*$/)))), name: z.nullable(z.string().check(z.maxLength(255))), - enabled: z._default(z.optional(z.boolean()), true), + enabled: z.optional(z._default(z.boolean(), true)), type: z.readonly(z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-dates/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-dates/zod.gen.ts index f4c05f3e46..145d012444 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-dates/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-dates/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo = z._default(z.nullable(z.object({ foo: z.optional(z.string().check(z.regex(/^\d{3}-\d{2}-\d{4}$/))), bar: z.optional(z.lazy((): any => zBar)), baz: z.optional(z.array(z.lazy((): any => zFoo))), - qux: z._default(z.optional(z.int().check(z.gt(0))), 0) + qux: z.optional(z._default(z.int().check(z.gt(0)), 0)) })), null); /** diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-metadata-fn/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-metadata-fn/zod.gen.ts index 10c1cf9c82..9d88ce8b40 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-metadata-fn/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-metadata-fn/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo = z._default(z.nullable(z.object({ foo: z.optional(z.string().check(z.regex(/^\d{3}-\d{2}-\d{4}$/)).register(z.globalRegistry, { custom: 'value', title: 'This is foo property.' })), bar: z.optional(z.lazy((): any => zBar)), baz: z.optional(z.array(z.lazy((): any => zFoo)).register(z.globalRegistry, { custom: 'value', title: 'This is baz property.' })), - qux: z._default(z.optional(z.int().check(z.gt(0)).register(z.globalRegistry, { custom: 'value', title: 'This is qux property.' })), 0) + qux: z.optional(z._default(z.int().check(z.gt(0)).register(z.globalRegistry, { custom: 'value', title: 'This is qux property.' }), 0)) }).register(z.globalRegistry, { custom: 'value', title: 'object' })), null); /** diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-metadata/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-metadata/zod.gen.ts index 74056350b0..9f03ab8c79 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-metadata/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-metadata/zod.gen.ts @@ -19,9 +19,9 @@ export const zFoo = z._default(z.nullable(z.object({ baz: z.optional(z.array(z.lazy((): any => zFoo)).register(z.globalRegistry, { description: 'This is baz property.' })), - qux: z._default(z.optional(z.int().check(z.gt(0)).register(z.globalRegistry, { + qux: z.optional(z._default(z.int().check(z.gt(0)).register(z.globalRegistry, { description: 'This is qux property.' - })), 0) + }), 0)) })), null); /** diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-types/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-types/zod.gen.ts index 436869e13e..a5fe642fcc 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-types/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-types/zod.gen.ts @@ -19,7 +19,7 @@ export const zFoo = z._default(z.nullable(z.object({ foo: z.optional(z.string().check(z.regex(/^\d{3}-\d{2}-\d{4}$/))), bar: z.optional(z.lazy((): any => zBar)), baz: z.optional(z.array(z.lazy((): any => zFoo))), - qux: z._default(z.optional(z.int().check(z.gt(0))), 0) + qux: z.optional(z._default(z.int().check(z.gt(0)), 0)) })), null); export type FooZodType = z.infer; diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-union-merge/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-union-merge/zod.gen.ts index 56805e5927..a5f289dcfe 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-union-merge/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators-union-merge/zod.gen.ts @@ -32,7 +32,7 @@ export const zCatDetails = z.object({ export const zPetStore = z.object({ animals: z.array(z.object({ name: z.string(), - type: z._default(z.optional(z.enum(['dog', 'cat'])), 'dog'), + type: z.optional(z._default(z.enum(['dog', 'cat']), 'dog')), details: z.union([ zDogDetails, zCatDetails diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators/zod.gen.ts index 74e1108e6b..4723e2e8dd 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/mini/validators/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo = z._default(z.nullable(z.object({ foo: z.optional(z.string().check(z.regex(/^\d{3}-\d{2}-\d{4}$/))), bar: z.optional(z.lazy((): any => zBar)), baz: z.optional(z.array(z.lazy((): any => zFoo))), - qux: z._default(z.optional(z.int().check(z.gt(0))), 0) + qux: z.optional(z._default(z.int().check(z.gt(0)), 0)) })), null); /** diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/default/zod.gen.ts index 81ebbaf44a..a6e30ae50e 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z.string().optional().default('test') + foo: z.string().default('test').optional() }), z.object({ bar: z.string().optional() })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z.enum(['3.0']).optional().default('3.0') + 'foo-bar-baz-qux': z.enum(['3.0']).default('3.0').optional() }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z.number().int().gte(0).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).optional().default(0), + page: z.number().int().gte(0).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).default(0).optional(), size: z.number().int().gte(1).max(2147483647, { message: 'Invalid value: Expected int32 to be <= 2147483647' }).optional(), sort: z.array(z.string()).optional() }); @@ -1237,25 +1237,25 @@ export const zCallWithDefaultParametersQuery = z.object({ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.nullish() }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), - parameterModel: zModelWithString.optional().default({ prop: 'Hello World!' }) + ]).default('Success').optional(), + parameterModel: zModelWithString.default({ prop: 'Hello World!' }).optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), @@ -1384,7 +1384,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.string().max(64).regex(/^[a-zA-Z0-9_]*$/).readonly().nullable(), name: z.string().max(255).nullable(), - enabled: z.boolean().optional().default(true), + enabled: z.boolean().default(true).optional(), type: z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-dates/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-dates/zod.gen.ts index cfe41b5d16..260f3b0e03 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-dates/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-dates/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo: z.ZodTypeAny = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy(() => zBar).optional(), baz: z.array(z.lazy(() => zFoo)).optional(), - qux: z.number().int().gt(0).optional().default(0) + qux: z.number().int().gt(0).default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-metadata-fn/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-metadata-fn/zod.gen.ts index ec54e3466f..d05150c156 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-metadata-fn/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-metadata-fn/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo: z.ZodTypeAny = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).describe('This is foo property.').optional(), bar: z.lazy(() => zBar).optional(), baz: z.array(z.lazy(() => zFoo)).describe('This is baz property.').optional(), - qux: z.number().int().gt(0).describe('This is qux property.').optional().default(0) + qux: z.number().int().gt(0).describe('This is qux property.').default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-metadata/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-metadata/zod.gen.ts index ec54e3466f..d05150c156 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-metadata/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-metadata/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo: z.ZodTypeAny = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).describe('This is foo property.').optional(), bar: z.lazy(() => zBar).optional(), baz: z.array(z.lazy(() => zFoo)).describe('This is baz property.').optional(), - qux: z.number().int().gt(0).describe('This is qux property.').optional().default(0) + qux: z.number().int().gt(0).describe('This is qux property.').default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-types/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-types/zod.gen.ts index 0699f4d2ce..33e9c5ac74 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-types/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-types/zod.gen.ts @@ -19,7 +19,7 @@ export const zFoo: z.ZodTypeAny = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy(() => zBar).optional(), baz: z.array(z.lazy(() => zFoo)).optional(), - qux: z.number().int().gt(0).optional().default(0) + qux: z.number().int().gt(0).default(0).optional() }).nullable().default(null); export type FooZodType = z.infer; diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-union-merge/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-union-merge/zod.gen.ts index 18dd2072c2..2465c99026 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-union-merge/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators-union-merge/zod.gen.ts @@ -32,7 +32,7 @@ export const zCatDetails = z.object({ export const zPetStore = z.object({ animals: z.array(z.object({ name: z.string(), - type: z.enum(['dog', 'cat']).optional().default('dog'), + type: z.enum(['dog', 'cat']).default('dog').optional(), details: z.union([ zDogDetails, zCatDetails diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators/zod.gen.ts index fb0bb585c7..2ef93af30e 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v3/validators/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo: z.ZodTypeAny = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy(() => zBar).optional(), baz: z.array(z.lazy(() => zFoo)).optional(), - qux: z.number().int().gt(0).optional().default(0) + qux: z.number().int().gt(0).default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/default/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/default/zod.gen.ts index 86a318e83c..23cb9d4af0 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/default/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/default/zod.gen.ts @@ -171,7 +171,7 @@ export const zArrayWithProperties = z.array(z.object({ * This is a simple array with any of properties */ export const zArrayWithAnyOfProperties = z.array(z.union([z.object({ - foo: z.string().optional().default('test') + foo: z.string().default('test').optional() }), z.object({ bar: z.string().optional() })])); @@ -313,7 +313,7 @@ export const zModelWithEnum = z.object({ * This is a model with one enum with escaped name */ export const zModelWithEnumWithHyphen = z.object({ - 'foo-bar-baz-qux': z.enum(['3.0']).optional().default('3.0') + 'foo-bar-baz-qux': z.enum(['3.0']).default('3.0').optional() }); /** @@ -668,7 +668,7 @@ export const zDefault = z.object({ }); export const zPageable = z.object({ - page: z.int().gte(0).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).optional().default(0), + page: z.int().gte(0).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).default(0).optional(), size: z.int().gte(1).max(2147483647, { error: 'Invalid value: Expected int32 to be <= 2147483647' }).optional(), sort: z.array(z.string()).optional() }); @@ -1237,25 +1237,25 @@ export const zCallWithDefaultParametersQuery = z.object({ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), + ]).default('Success').optional(), parameterModel: zModelWithString.nullish() }); export const zCallWithDefaultOptionalParametersQuery = z.object({ - parameterString: z.string().optional().default('Hello World!'), - parameterNumber: z.number().optional().default(123), - parameterBoolean: z.boolean().optional().default(true), + parameterString: z.string().default('Hello World!').optional(), + parameterNumber: z.number().default(123).optional(), + parameterBoolean: z.boolean().default(true).optional(), parameterEnum: z.enum([ 'Success', 'Warning', 'Error' - ]).optional().default('Success'), - parameterModel: zModelWithString.optional().default({ prop: 'Hello World!' }) + ]).default('Success').optional(), + parameterModel: zModelWithString.default({ prop: 'Hello World!' }).optional() }); export const zCallToTestOrderOfParamsQuery = z.object({ - parameterOptionalStringWithDefault: z.string().optional().default('Hello World!'), - parameterOptionalStringWithEmptyDefault: z.string().optional().default(''), + parameterOptionalStringWithDefault: z.string().default('Hello World!').optional(), + parameterOptionalStringWithEmptyDefault: z.string().default('').optional(), parameterOptionalStringWithNoDefault: z.string().optional(), parameterStringWithDefault: z.string().default('Hello World!'), parameterStringWithEmptyDefault: z.string().default(''), @@ -1384,7 +1384,7 @@ export const zMultipartRequestBody = z.object({ export const zComplexParamsBody = z.object({ key: z.string().max(64).regex(/^[a-zA-Z0-9_]*$/).readonly().nullable(), name: z.string().max(255).nullable(), - enabled: z.boolean().optional().default(true), + enabled: z.boolean().default(true).optional(), type: z.enum([ 'Monkey', 'Horse', diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-dates/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-dates/zod.gen.ts index 52d2c67130..0fef9607d8 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-dates/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-dates/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy((): any => zBar).optional(), baz: z.array(z.lazy((): any => zFoo)).optional(), - qux: z.int().gt(0).optional().default(0) + qux: z.int().gt(0).default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-metadata-fn/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-metadata-fn/zod.gen.ts index a7d7889264..f59ac372d7 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-metadata-fn/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-metadata-fn/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).register(z.globalRegistry, { custom: 'value', title: 'This is foo property.' }).optional(), bar: z.lazy((): any => zBar).optional(), baz: z.array(z.lazy((): any => zFoo)).register(z.globalRegistry, { custom: 'value', title: 'This is baz property.' }).optional(), - qux: z.int().gt(0).register(z.globalRegistry, { custom: 'value', title: 'This is qux property.' }).optional().default(0) + qux: z.int().gt(0).register(z.globalRegistry, { custom: 'value', title: 'This is qux property.' }).default(0).optional() }).register(z.globalRegistry, { custom: 'value', title: 'object' }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-metadata/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-metadata/zod.gen.ts index 3792b90892..8f4aed134c 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-metadata/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-metadata/zod.gen.ts @@ -21,7 +21,7 @@ export const zFoo = z.object({ }).optional(), qux: z.int().gt(0).register(z.globalRegistry, { description: 'This is qux property.' - }).optional().default(0) + }).default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-types/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-types/zod.gen.ts index 917e0735d8..9a24bf2f79 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-types/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-types/zod.gen.ts @@ -19,7 +19,7 @@ export const zFoo = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy((): any => zBar).optional(), baz: z.array(z.lazy((): any => zFoo)).optional(), - qux: z.int().gt(0).optional().default(0) + qux: z.int().gt(0).default(0).optional() }).nullable().default(null); export type FooZodType = z.infer; diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-union-merge/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-union-merge/zod.gen.ts index 6b89a0a4cc..e15abc7f43 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-union-merge/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators-union-merge/zod.gen.ts @@ -32,7 +32,7 @@ export const zCatDetails = z.object({ export const zPetStore = z.object({ animals: z.array(z.object({ name: z.string(), - type: z.enum(['dog', 'cat']).optional().default('dog'), + type: z.enum(['dog', 'cat']).default('dog').optional(), details: z.union([ zDogDetails, zCatDetails diff --git a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators/zod.gen.ts b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators/zod.gen.ts index edbf35b7cd..46472ea52c 100644 --- a/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators/zod.gen.ts +++ b/packages/openapi-ts-tests/zod/v4/__snapshots__/3.1.x/v4/validators/zod.gen.ts @@ -15,7 +15,7 @@ export const zFoo = z.object({ foo: z.string().regex(/^\d{3}-\d{2}-\d{4}$/).optional(), bar: z.lazy((): any => zBar).optional(), baz: z.array(z.lazy((): any => zFoo)).optional(), - qux: z.int().gt(0).optional().default(0) + qux: z.int().gt(0).default(0).optional() }).nullable().default(null); /** diff --git a/packages/openapi-ts-tests/zod/v4/package.json b/packages/openapi-ts-tests/zod/v4/package.json index 66daa4f74a..011022df0e 100644 --- a/packages/openapi-ts-tests/zod/v4/package.json +++ b/packages/openapi-ts-tests/zod/v4/package.json @@ -10,8 +10,5 @@ "@hey-api/openapi-ts": "workspace:*", "typescript": "6.0.2", "zod": "4.3.6" - }, - "engines": { - "node": ">=22.13.0" } } diff --git a/packages/openapi-ts-tests/zod/v4/test/3.0.x.test.ts b/packages/openapi-ts-tests/zod/v4/test/3.0.x.test.ts index d441759618..f498a05473 100644 --- a/packages/openapi-ts-tests/zod/v4/test/3.0.x.test.ts +++ b/packages/openapi-ts-tests/zod/v4/test/3.0.x.test.ts @@ -4,13 +4,13 @@ import path from 'node:path'; import { createClient } from '@hey-api/openapi-ts'; import { getFilePaths } from '../../../utils'; -import { createConfigFactory, getSnapshotsPath, getTempSnapshotsPath, zodVersions } from './utils'; +import { snapshotsDir, tmpDir } from './constants'; +import { createConfigFactory, zodVersions } from './utils'; const version = '3.0.x'; for (const zodVersion of zodVersions) { - const outputDir = path.join(getTempSnapshotsPath(), version, zodVersion.folder); - const snapshotsDir = path.join(getSnapshotsPath(), version, zodVersion.folder); + const outputDir = path.join(tmpDir, version, zodVersion.folder); describe(`OpenAPI ${version}`, () => { const createConfig = createConfigFactory({ @@ -59,7 +59,12 @@ for (const zodVersion of zodVersions) { filePaths.map(async (filePath) => { const fileContent = fs.readFileSync(filePath, 'utf-8'); await expect(fileContent).toMatchFileSnapshot( - path.join(snapshotsDir, filePath.slice(outputDir.length + 1)), + path.join( + snapshotsDir, + version, + zodVersion.folder, + filePath.slice(outputDir.length + 1), + ), ); }), ); diff --git a/packages/openapi-ts-tests/zod/v4/test/3.1.x.test.ts b/packages/openapi-ts-tests/zod/v4/test/3.1.x.test.ts index 2d5aaaa02d..56154b63ee 100644 --- a/packages/openapi-ts-tests/zod/v4/test/3.1.x.test.ts +++ b/packages/openapi-ts-tests/zod/v4/test/3.1.x.test.ts @@ -4,13 +4,13 @@ import path from 'node:path'; import { createClient } from '@hey-api/openapi-ts'; import { getFilePaths } from '../../../utils'; -import { createConfigFactory, getSnapshotsPath, getTempSnapshotsPath, zodVersions } from './utils'; +import { snapshotsDir, tmpDir } from './constants'; +import { createConfigFactory, zodVersions } from './utils'; const version = '3.1.x'; for (const zodVersion of zodVersions) { - const outputDir = path.join(getTempSnapshotsPath(), version, zodVersion.folder); - const snapshotsDir = path.join(getSnapshotsPath(), version, zodVersion.folder); + const outputDir = path.join(tmpDir, version, zodVersion.folder); describe(`OpenAPI ${version}`, () => { const createConfig = createConfigFactory({ @@ -196,7 +196,12 @@ for (const zodVersion of zodVersions) { filePaths.map(async (filePath) => { const fileContent = fs.readFileSync(filePath, 'utf-8'); await expect(fileContent).toMatchFileSnapshot( - path.join(snapshotsDir, filePath.slice(outputDir.length + 1)), + path.join( + snapshotsDir, + version, + zodVersion.folder, + filePath.slice(outputDir.length + 1), + ), ); }), ); diff --git a/packages/openapi-ts-tests/zod/v4/test/constants.ts b/packages/openapi-ts-tests/zod/v4/test/constants.ts new file mode 100644 index 0000000000..e72988d8bb --- /dev/null +++ b/packages/openapi-ts-tests/zod/v4/test/constants.ts @@ -0,0 +1,4 @@ +import path from 'node:path'; + +export const snapshotsDir = path.join(__dirname, '..', '__snapshots__'); +export const tmpDir = path.join(__dirname, '..', '.tmp'); diff --git a/packages/openapi-ts-tests/zod/v4/test/formats.test.ts b/packages/openapi-ts-tests/zod/v4/test/formats.test.ts index fb571f318e..79d016a79d 100644 --- a/packages/openapi-ts-tests/zod/v4/test/formats.test.ts +++ b/packages/openapi-ts-tests/zod/v4/test/formats.test.ts @@ -4,13 +4,13 @@ import path from 'node:path'; import { createClient } from '@hey-api/openapi-ts'; import { getFilePaths } from '../../../utils'; -import { createConfigFactory, getSnapshotsPath, getTempSnapshotsPath, zodVersions } from './utils'; +import { snapshotsDir, tmpDir } from './constants'; +import { createConfigFactory, zodVersions } from './utils'; const version = '3.1.x'; for (const zodVersion of zodVersions) { - const outputDir = path.join(getTempSnapshotsPath(), version, zodVersion.folder); - const snapshotsDir = path.join(getSnapshotsPath(), version, zodVersion.folder); + const outputDir = path.join(tmpDir, version, zodVersion.folder); describe(`OpenAPI ${version} Zod formats`, () => { const createConfig = createConfigFactory({ @@ -70,7 +70,12 @@ for (const zodVersion of zodVersions) { filePaths.map(async (filePath) => { const fileContent = fs.readFileSync(filePath, 'utf-8'); await expect(fileContent).toMatchFileSnapshot( - path.join(snapshotsDir, filePath.slice(outputDir.length + 1)), + path.join( + snapshotsDir, + version, + zodVersion.folder, + filePath.slice(outputDir.length + 1), + ), ); }), ); diff --git a/packages/openapi-ts-tests/zod/v4/test/globalTeardown.ts b/packages/openapi-ts-tests/zod/v4/test/globalTeardown.ts new file mode 100644 index 0000000000..7c8712f70f --- /dev/null +++ b/packages/openapi-ts-tests/zod/v4/test/globalTeardown.ts @@ -0,0 +1,7 @@ +import fs from 'node:fs'; + +import { tmpDir } from './constants'; + +export function teardown() { + fs.rmSync(tmpDir, { force: true, recursive: true }); +} diff --git a/packages/openapi-ts-tests/zod/v4/test/openapi.test.ts b/packages/openapi-ts-tests/zod/v4/test/openapi.test.ts index 1f8b290f93..cfc2a9f2ee 100644 --- a/packages/openapi-ts-tests/zod/v4/test/openapi.test.ts +++ b/packages/openapi-ts-tests/zod/v4/test/openapi.test.ts @@ -4,14 +4,14 @@ import path from 'node:path'; import { createClient } from '@hey-api/openapi-ts'; import { getFilePaths } from '../../../utils'; -import { createConfigFactory, getSnapshotsPath, getTempSnapshotsPath, zodVersions } from './utils'; +import { snapshotsDir, tmpDir } from './constants'; +import { createConfigFactory, zodVersions } from './utils'; const versions = ['2.0.x', '3.0.x', '3.1.x']; for (const version of versions) { for (const zodVersion of zodVersions) { - const outputDir = path.join(getTempSnapshotsPath(), version, zodVersion.folder); - const snapshotsDir = path.join(getSnapshotsPath(), version, zodVersion.folder); + const outputDir = path.join(tmpDir, version, zodVersion.folder); describe(`OpenAPI ${version}`, () => { const createConfig = createConfigFactory({ @@ -66,7 +66,12 @@ for (const version of versions) { filePaths.map(async (filePath) => { const fileContent = fs.readFileSync(filePath, 'utf-8'); await expect(fileContent).toMatchFileSnapshot( - path.join(snapshotsDir, filePath.slice(outputDir.length + 1)), + path.join( + snapshotsDir, + version, + zodVersion.folder, + filePath.slice(outputDir.length + 1), + ), ); }), ); diff --git a/packages/openapi-ts-tests/zod/v4/test/utils.ts b/packages/openapi-ts-tests/zod/v4/test/utils.ts index 7451b309a9..be32736cde 100644 --- a/packages/openapi-ts-tests/zod/v4/test/utils.ts +++ b/packages/openapi-ts-tests/zod/v4/test/utils.ts @@ -1,13 +1,9 @@ import path from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { type UserConfig } from '@hey-api/openapi-ts'; +import type { UserConfig } from '@hey-api/openapi-ts'; import { getSpecsPath } from '../../../utils'; -const __filename = fileURLToPath(import.meta.url); -const __dirname = path.dirname(__filename); - export function createConfigFactory({ openApiVersion, outputDir, @@ -48,10 +44,6 @@ export function createConfigFactory({ }; } -export const getSnapshotsPath = (): string => path.join(__dirname, '..', '__snapshots__'); - -export const getTempSnapshotsPath = (): string => path.join(__dirname, '..', '.gen', 'snapshots'); - export const zodVersions = [ { compatibilityVersion: 3, diff --git a/packages/openapi-ts-tests/zod/v4/tsconfig.json b/packages/openapi-ts-tests/zod/v4/tsconfig.json index b406106e5a..e7572df83d 100644 --- a/packages/openapi-ts-tests/zod/v4/tsconfig.json +++ b/packages/openapi-ts-tests/zod/v4/tsconfig.json @@ -1,6 +1,5 @@ { "extends": "../../tsconfig.base.json", "include": ["test/**/*", "__snapshots__/**/*"], - "exclude": [".gen/**/*"], "references": [{ "path": "../../../openapi-ts" }] } diff --git a/packages/openapi-ts/src/plugins/valibot/v1/walker.ts b/packages/openapi-ts/src/plugins/valibot/v1/walker.ts index e493dad98e..f72bb278cf 100644 --- a/packages/openapi-ts/src/plugins/valibot/v1/walker.ts +++ b/packages/openapi-ts/src/plugins/valibot/v1/walker.ts @@ -51,15 +51,15 @@ export function createVisitor( pipes.push($(v).attr(identifiers.actions.readonly).call()); } - const hasDefault = result.meta.default !== undefined; - const needsOptional = optional || hasDefault; + const needsDefault = result.meta.default !== undefined; + const needsOptional = optional || needsDefault; const needsNullable = result.meta.nullable; const innerNode = pipesToNode(pipes, ctx.plugin); let finalPipes: Pipes; if (needsOptional && needsNullable) { - if (hasDefault) { + if (needsDefault) { finalPipes = [ $(v).attr(identifiers.schemas.nullish).call(innerNode, getDefaultValue(result.meta)), ]; @@ -67,7 +67,7 @@ export function createVisitor( finalPipes = [$(v).attr(identifiers.schemas.nullish).call(innerNode)]; } } else if (needsOptional) { - if (hasDefault) { + if (needsDefault) { finalPipes = [ $(v).attr(identifiers.schemas.optional).call(innerNode, getDefaultValue(result.meta)), ]; diff --git a/packages/openapi-ts/src/plugins/zod/mini/walker.ts b/packages/openapi-ts/src/plugins/zod/mini/walker.ts index 3d30781d60..5e67864140 100644 --- a/packages/openapi-ts/src/plugins/zod/mini/walker.ts +++ b/packages/openapi-ts/src/plugins/zod/mini/walker.ts @@ -9,7 +9,7 @@ import { identifiers } from '../constants'; import type { Chain } from '../shared/chain'; import { defaultMeta, inheritMeta } from '../shared/meta'; import type { ProcessorContext } from '../shared/processor'; -import type { ZodFinal, ZodResult } from '../shared/types'; +import type { ZodFinal, ZodMeta, ZodResult } from '../shared/types'; import type { ZodPlugin } from '../types'; import { arrayToAst } from './toAst/array'; import { booleanToAst } from './toAst/boolean'; @@ -29,6 +29,10 @@ export interface VisitorConfig { schemaExtractor?: SchemaExtractor; } +function getDefaultValue(meta: ZodMeta): ReturnType { + return meta.format ? maybeBigInt(meta.default, meta.format) : $.fromValue(meta.default); +} + export function createVisitor( config: VisitorConfig = {}, ): SchemaVisitor { @@ -44,26 +48,28 @@ export function createVisitor( expression = $(z).attr(identifiers.readonly).call(expression); } - const hasDefault = result.meta.default !== undefined; + const needsDefault = result.meta.default !== undefined; const needsNullable = result.meta.nullable; + let hasDefault = false; + if (optional && needsNullable) { expression = $(z).attr(identifiers.nullish).call(expression); } else if (optional) { + if (needsDefault) { + expression = $(z) + .attr(identifiers._default) + .call(expression, getDefaultValue(result.meta)); + hasDefault = true; + } + expression = $(z).attr(identifiers.optional).call(expression); } else if (needsNullable) { expression = $(z).attr(identifiers.nullable).call(expression); } - if (hasDefault) { - expression = $(z) - .attr(identifiers._default) - .call( - expression, - result.meta.format - ? maybeBigInt(result.meta.default, result.meta.format) - : $.fromValue(result.meta.default), - ); + if (needsDefault && !hasDefault) { + expression = $(z).attr(identifiers._default).call(expression, getDefaultValue(result.meta)); } return { diff --git a/packages/openapi-ts/src/plugins/zod/v3/walker.ts b/packages/openapi-ts/src/plugins/zod/v3/walker.ts index 17265ba252..f5476f3525 100644 --- a/packages/openapi-ts/src/plugins/zod/v3/walker.ts +++ b/packages/openapi-ts/src/plugins/zod/v3/walker.ts @@ -9,7 +9,7 @@ import { identifiers } from '../constants'; import type { Chain } from '../shared/chain'; import { defaultMeta, inheritMeta } from '../shared/meta'; import type { ProcessorContext } from '../shared/processor'; -import type { ZodFinal, ZodResult } from '../shared/types'; +import type { ZodFinal, ZodMeta, ZodResult } from '../shared/types'; import type { ZodPlugin } from '../types'; import { arrayToAst } from './toAst/array'; import { booleanToAst } from './toAst/boolean'; @@ -29,6 +29,10 @@ export interface VisitorConfig { schemaExtractor?: SchemaExtractor; } +function getDefaultValue(meta: ZodMeta): ReturnType { + return meta.format ? maybeBigInt(meta.default, meta.format) : $.fromValue(meta.default); +} + export function createVisitor( config: VisitorConfig = {}, ): SchemaVisitor { @@ -43,25 +47,26 @@ export function createVisitor( expression = expression.attr(identifiers.readonly).call(); } - const hasDefault = result.meta.default !== undefined; + const needsDefault = result.meta.default !== undefined; const needsNullable = result.meta.nullable; + let hasDefault = false; + if (optional && needsNullable) { expression = expression.attr(identifiers.nullish).call(); } else if (optional) { + if (needsDefault) { + expression = expression.attr(identifiers.default).call(getDefaultValue(result.meta)); + hasDefault = true; + } + expression = expression.attr(identifiers.optional).call(); } else if (needsNullable) { expression = expression.attr(identifiers.nullable).call(); } - if (hasDefault) { - expression = expression - .attr(identifiers.default) - .call( - result.meta.format - ? maybeBigInt(result.meta.default, result.meta.format) - : $.fromValue(result.meta.default), - ); + if (needsDefault && !hasDefault) { + expression = expression.attr(identifiers.default).call(getDefaultValue(result.meta)); } return { diff --git a/packages/openapi-ts/src/plugins/zod/v4/walker.ts b/packages/openapi-ts/src/plugins/zod/v4/walker.ts index fcf45afd53..5ade4787c8 100644 --- a/packages/openapi-ts/src/plugins/zod/v4/walker.ts +++ b/packages/openapi-ts/src/plugins/zod/v4/walker.ts @@ -9,7 +9,7 @@ import { identifiers } from '../constants'; import type { Chain } from '../shared/chain'; import { defaultMeta, inheritMeta } from '../shared/meta'; import type { ProcessorContext } from '../shared/processor'; -import type { ZodFinal, ZodResult } from '../shared/types'; +import type { ZodFinal, ZodMeta, ZodResult } from '../shared/types'; import type { ZodPlugin } from '../types'; import { arrayToAst } from './toAst/array'; import { booleanToAst } from './toAst/boolean'; @@ -29,6 +29,10 @@ export interface VisitorConfig { schemaExtractor?: SchemaExtractor; } +function getDefaultValue(meta: ZodMeta): ReturnType { + return meta.format ? maybeBigInt(meta.default, meta.format) : $.fromValue(meta.default); +} + export function createVisitor( config: VisitorConfig = {}, ): SchemaVisitor { @@ -43,25 +47,26 @@ export function createVisitor( expression = expression.attr(identifiers.readonly).call(); } - const hasDefault = result.meta.default !== undefined; + const needsDefault = result.meta.default !== undefined; const needsNullable = result.meta.nullable; + let hasDefault = false; + if (optional && needsNullable) { expression = expression.attr(identifiers.nullish).call(); } else if (optional) { + if (needsDefault) { + expression = expression.attr(identifiers.default).call(getDefaultValue(result.meta)); + hasDefault = true; + } + expression = expression.attr(identifiers.optional).call(); } else if (needsNullable) { expression = expression.attr(identifiers.nullable).call(); } - if (hasDefault) { - expression = expression - .attr(identifiers.default) - .call( - result.meta.format - ? maybeBigInt(result.meta.default, result.meta.format) - : $.fromValue(result.meta.default), - ); + if (needsDefault && !hasDefault) { + expression = expression.attr(identifiers.default).call(getDefaultValue(result.meta)); } return { diff --git a/vitest.config.ts b/vitest.config.ts index 8bd8e3eac1..b03d26954a 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -96,6 +96,7 @@ export default defineConfig({ { extends: true, test: { + globalSetup: ['./test/globalTeardown.ts'], name: '@test/openapi-ts-zod-v3', root: 'packages/openapi-ts-tests/zod/v3', setupFiles: ['./vitest.setup.ts'], @@ -104,6 +105,7 @@ export default defineConfig({ { extends: true, test: { + globalSetup: ['./test/globalTeardown.ts'], name: '@test/openapi-ts-zod-v4', root: 'packages/openapi-ts-tests/zod/v4', setupFiles: ['./vitest.setup.ts'],