diff --git a/packages/quicktype-core/src/language/Python/JSONPythonRenderer.ts b/packages/quicktype-core/src/language/Python/JSONPythonRenderer.ts index 738748a087..5ecbb55b7e 100644 --- a/packages/quicktype-core/src/language/Python/JSONPythonRenderer.ts +++ b/packages/quicktype-core/src/language/Python/JSONPythonRenderer.ts @@ -521,7 +521,7 @@ export class JSONPythonRenderer extends PythonRenderer { this.emitLine( "assert isinstance(x, str) and ", this.withModuleImport("re"), - '.match(r"^\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})?$", x)', + '.match(r"^\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:[Zz]|[+-]\\d{2}:\\d{2})?$", x)', ); this.emitLine("return dateutil.parser.parse(x).timetz()"); }, @@ -542,7 +542,7 @@ export class JSONPythonRenderer extends PythonRenderer { ], () => { this._haveDateutil = true; - this.emitLine("return dateutil.parser.parse(x)"); + this.emitLine("return dateutil.parser.isoparse(x)"); }, ); } diff --git a/packages/quicktype-core/src/language/TypeScriptEffectSchema/TypeScriptEffectSchemaRenderer.ts b/packages/quicktype-core/src/language/TypeScriptEffectSchema/TypeScriptEffectSchemaRenderer.ts index b61a3764b2..ac2d00bf12 100644 --- a/packages/quicktype-core/src/language/TypeScriptEffectSchema/TypeScriptEffectSchemaRenderer.ts +++ b/packages/quicktype-core/src/language/TypeScriptEffectSchema/TypeScriptEffectSchemaRenderer.ts @@ -195,11 +195,11 @@ export class TypeScriptEffectSchemaRenderer extends ConvenienceRenderer { ? 'S.transform(S.Literal("true", "false"), S.Boolean, { strict: true, decode: (value) => value === "true", encode: (value) => value ? "true" : "false" })' : 'S.Literal("true", "false")'; if (_transformedStringType.kind === "date") - return "S.String.pipe(S.pattern(/^\\d{4}-\\d{2}-\\d{2}$/))"; + return 'S.String.pipe(S.pattern(/^\\d{4}-(?:0[1-9]|1[0-2])-(?:[0-2]\\d|3[01])$/), S.filter(value => (new Date(value + "T00:00:00Z").toJSON() || "").slice(0, 10) === value))'; if (_transformedStringType.kind === "time") - return "S.String.pipe(S.pattern(/^\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$/))"; + return "S.String.pipe(S.pattern(/^(?:[01]\\d|2[0-3]):[0-5]\\d:(?:[0-5]\\d|60)(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$/i))"; if (_transformedStringType.kind === "date-time") - return "S.String.pipe(S.pattern(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$/))"; + return 'S.String.pipe(S.pattern(/^\\d{4}-(?:0[1-9]|1[0-2])-(?:[0-2]\\d|3[01])T(?:[01]\\d|2[0-3]):[0-5]\\d:(?:[0-5]\\d|60)(?:\\.\\d+)?(?:Z|[+-](?:[01]\\d|2[0-3]):[0-5]\\d)$/i), S.filter(value => (new Date(value.slice(0, 10) + "T00:00:00Z").toJSON() || "").slice(0, 10) === value.slice(0, 10)))'; if (_transformedStringType.kind === "integer-string") return coerceStrings ? "S.NumberFromString.pipe(S.int())" diff --git a/test/languages.ts b/test/languages.ts index ebfdb206ec..539bcce001 100644 --- a/test/languages.ts +++ b/test/languages.ts @@ -297,6 +297,8 @@ export const PythonLanguage: Language = { "union", "no-defaults", "date-time", + "date", + "time", "integer-string", "bool-string", "uuid", @@ -1787,6 +1789,8 @@ export const TypeScriptEffectSchemaLanguage: Language = { "minmaxlength", "bool-string", "date-time", + "date", + "time", "integer-string", "pattern", "minmax",