diff --git a/packages/quicktype-core/src/input/JSONSchemaInput.ts b/packages/quicktype-core/src/input/JSONSchemaInput.ts index 66b1c4104..a80504fb4 100644 --- a/packages/quicktype-core/src/input/JSONSchemaInput.ts +++ b/packages/quicktype-core/src/input/JSONSchemaInput.ts @@ -1139,14 +1139,19 @@ async function addTypesInSchema( } let additionalProperties = schema.additionalProperties; - // This is an incorrect hack to fix an issue with a Go->Schema generator: - // https://github.com/quicktype/quicktype/issues/976 if ( - additionalProperties === undefined && + (additionalProperties === undefined || + additionalProperties === false) && typeof schema.patternProperties === "object" && - hasOwnProperty(schema.patternProperties, ".*") + schema.patternProperties !== null && + !Array.isArray(schema.patternProperties) ) { - additionalProperties = schema.patternProperties[".*"]; + const patternSchemas = Object.values(schema.patternProperties); + if (patternSchemas.length === 1) { + additionalProperties = patternSchemas[0]; + } else if (patternSchemas.length > 1) { + additionalProperties = { anyOf: patternSchemas }; + } } // Handle unevaluatedProperties if additionalProperties is not defined diff --git a/test/inputs/schema/pattern-properties-value.1.fail.json b/test/inputs/schema/pattern-properties-value.1.fail.json new file mode 100644 index 000000000..087db4c8f --- /dev/null +++ b/test/inputs/schema/pattern-properties-value.1.fail.json @@ -0,0 +1,8 @@ +{ + "materials": { + "steel": { + "roughness": "smooth", + "thickness": "not-a-number" + } + } +} diff --git a/test/inputs/schema/pattern-properties-value.1.json b/test/inputs/schema/pattern-properties-value.1.json new file mode 100644 index 000000000..d32be2f4a --- /dev/null +++ b/test/inputs/schema/pattern-properties-value.1.json @@ -0,0 +1,8 @@ +{ + "materials": { + "steel": { + "roughness": "smooth", + "thickness": 1.5 + } + } +} diff --git a/test/inputs/schema/pattern-properties-value.schema b/test/inputs/schema/pattern-properties-value.schema new file mode 100644 index 000000000..2c4a56981 --- /dev/null +++ b/test/inputs/schema/pattern-properties-value.schema @@ -0,0 +1,22 @@ +{ + "type": "object", + "additionalProperties": false, + "properties": { + "materials": { + "type": "object", + "patternProperties": { + "^.*\\S.*$": { + "type": "object", + "additionalProperties": false, + "properties": { + "roughness": { "type": "string" }, + "thickness": { "type": "number" } + }, + "required": ["roughness", "thickness"] + } + }, + "additionalProperties": false + } + }, + "required": ["materials"] +} diff --git a/test/languages.ts b/test/languages.ts index 120f3170b..12a1ee374 100644 --- a/test/languages.ts +++ b/test/languages.ts @@ -55,6 +55,7 @@ const skipsUntypedUnions = [ // schema whose fail sample relies on rejecting a mistyped map value. const skipsMapValueValidation = [ "go-schema-pattern-properties.schema", + "pattern-properties-value.schema", "unevaluated-properties.schema", ];