diff --git a/packages/quicktype-core/src/language/TypeScriptEffectSchema/TypeScriptEffectSchemaRenderer.ts b/packages/quicktype-core/src/language/TypeScriptEffectSchema/TypeScriptEffectSchemaRenderer.ts index b61a3764b2..4df2c713f5 100644 --- a/packages/quicktype-core/src/language/TypeScriptEffectSchema/TypeScriptEffectSchemaRenderer.ts +++ b/packages/quicktype-core/src/language/TypeScriptEffectSchema/TypeScriptEffectSchemaRenderer.ts @@ -155,9 +155,9 @@ export class TypeScriptEffectSchemaRenderer extends ConvenienceRenderer { }, (_classType) => panic("Should already be handled."), (_mapType) => [ - "S.Record({ key: S.String, value: ", + "mapSchema(", this.typeMapTypeFor(_mapType.values, false), - "})", + ")", ], (_enumType) => panic("Should already be handled."), (unionType) => { @@ -406,6 +406,26 @@ export class TypeScriptEffectSchemaRenderer extends ConvenienceRenderer { } this.emitImports(); + if (this.haveMaps) { + this.emitMultiline(` +const objectSchema = () => + S.declare( + (input): input is Record => + typeof input === "object" && input !== null && !Array.isArray(input) + ); +const mapSchema = (value: S.Schema) => { + const entries = S.transform(objectSchema(), S.Array(S.Tuple(S.String, value)), { + strict: false, + decode: Object.entries, + encode: Object.fromEntries + }); + return S.transform(entries, objectSchema(), { + strict: false, + decode: Object.fromEntries, + encode: Object.entries + }); +};`); + } this.emitSchemas(); } }