diff --git a/packages/quicktype-core/src/language/TypeScriptZod.ts b/packages/quicktype-core/src/language/TypeScriptZod.ts index 4d4d769e8..2ec7df178 100644 --- a/packages/quicktype-core/src/language/TypeScriptZod.ts +++ b/packages/quicktype-core/src/language/TypeScriptZod.ts @@ -1,10 +1,14 @@ +import { StringTypeMapping } from "TypeBuilder"; import { arrayIntercalate } from "collection-utils"; -import { ClassProperty, EnumType, ObjectType, Type } from "../Type"; -import { matchType } from "../TypeUtils"; -import { funPrefixNamer, Name, Namer } from "../Naming"; +import { ConvenienceRenderer } from "../ConvenienceRenderer"; +import { Name, Namer, funPrefixNamer } from "../Naming"; import { RenderContext } from "../Renderer"; -import { BooleanOption, getOptionValues, Option, OptionValues } from "../RendererOptions"; -import { acronymStyle, AcronymStyleOptions } from "../support/Acronyms"; +import { BooleanOption, Option, OptionValues, getOptionValues } from "../RendererOptions"; +import { Sourcelike } from "../Source"; +import { TargetLanguage } from "../TargetLanguage"; +import { ClassProperty, EnumType, ObjectType, PrimitiveStringTypeKind, TransformedStringTypeKind, Type } from "../Type"; +import { matchType } from "../TypeUtils"; +import { AcronymStyleOptions, acronymStyle } from "../support/Acronyms"; import { allLowerWordStyle, capitalize, @@ -15,11 +19,8 @@ import { stringEscape, utf16StringEscape } from "../support/Strings"; -import { TargetLanguage } from "../TargetLanguage"; -import { legalizeName } from "./JavaScript"; -import { Sourcelike } from "../Source"; import { panic } from "../support/Support"; -import { ConvenienceRenderer } from "../ConvenienceRenderer"; +import { legalizeName } from "./JavaScript"; export const typeScriptZodOptions = { justSchema: new BooleanOption("just-schema", "Schema only", false) @@ -38,6 +39,13 @@ export class TypeScriptZodTargetLanguage extends TargetLanguage { super(displayName, names, extension); } + get stringTypeMapping(): StringTypeMapping { + const mapping: Map = new Map(); + const dateTimeType = "date-time"; + mapping.set("date-time", dateTimeType); + return mapping; + } + protected makeRenderer( renderContext: RenderContext, untypedOptionValues: { [name: string]: any } @@ -132,6 +140,9 @@ export class TypeScriptZodRenderer extends ConvenienceRenderer { return ["z.union([", ...arrayIntercalate(", ", children), "])"]; }, _transformedStringType => { + if (_transformedStringType.kind === "date-time") { + return "z.coerce.date()"; + } return "z.string()"; } ); diff --git a/test/languages.ts b/test/languages.ts index c89273e63..222559d18 100644 --- a/test/languages.ts +++ b/test/languages.ts @@ -1425,7 +1425,7 @@ export const TypeScriptZodLanguage: Language = { "e8b04.json" ], allowMissingNull: false, - features: ["enum", "union", "no-defaults"], + features: ["enum", "union", "no-defaults", "date-time"], output: "TopLevel.ts", topLevel: "TopLevel", skipJSON: [ @@ -1485,7 +1485,9 @@ export const TypeScriptZodLanguage: Language = { "bug427.json", "nst-test-suite.json", "keywords.json", - "ed095.json" + "ed095.json", + "7681c.json", + "32d5c.json" ], skipMiscJSON: false, skipSchema: [