From 8bd0f6f3a155e08b1dca8f8bc2e8860fd33f2cda Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Mon, 20 Jul 2026 18:06:27 -0400 Subject: [PATCH 1/5] fix(javascript-prop-types): emit .isRequired for required properties (#1561) Co-Authored-By: gpt-5.6-sol via pi --- .../JavaScriptPropTypesRenderer.ts | 35 +++++++--- .../javascript-prop-types-required.test.ts | 69 +++++++++++++++++++ 2 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 test/unit/javascript-prop-types-required.test.ts diff --git a/packages/quicktype-core/src/language/JavaScriptPropTypes/JavaScriptPropTypesRenderer.ts b/packages/quicktype-core/src/language/JavaScriptPropTypes/JavaScriptPropTypesRenderer.ts index 67b37614d4..d4859b792a 100644 --- a/packages/quicktype-core/src/language/JavaScriptPropTypes/JavaScriptPropTypesRenderer.ts +++ b/packages/quicktype-core/src/language/JavaScriptPropTypes/JavaScriptPropTypesRenderer.ts @@ -20,6 +20,7 @@ import { type ArrayType, type ClassProperty, type ClassType, + type MapType, type ObjectType, PrimitiveType, type Type, @@ -27,6 +28,7 @@ import { import { directlyReachableSingleNamedType, matchType, + removeNullFromType, } from "../../Type/TypeUtils.js"; import { isES3IdentifierStart } from "../JavaScript/unicodeMaps.js"; import { legalizeName } from "../JavaScript/utils.js"; @@ -92,9 +94,16 @@ export class JavaScriptPropTypesRenderer extends ConvenienceRenderer { return super.makeNameForProperty(c, className, p, jsonName, undefined); } - private typeMapTypeFor(t: Type, required = true): Sourcelike { + private typeMapTypeFor(t: Type, required = false): Sourcelike { if (["class", "object", "enum"].includes(t.kind)) { - return ["_", this.nameForNamedType(t)]; + const validator: Sourcelike = [ + "_", + this.nameForNamedType(t), + required ? ".isRequired" : "", + ]; + return t.kind === "enum" + ? validator + : ["(...args) => ", validator, "(...args)"]; } const match = matchType( @@ -129,14 +138,15 @@ export class JavaScriptPropTypesRenderer extends ConvenienceRenderer { ); if (required) { - return [match]; + return [match, ".isRequired"]; } return match; } private typeMapTypeForProperty(p: ClassProperty): Sourcelike { - return this.typeMapTypeFor(p.type); + const [nullType] = removeNullFromType(p.type); + return this.typeMapTypeFor(p.type, !p.isOptional && nullType === null); } private importStatement( @@ -211,10 +221,10 @@ export class JavaScriptPropTypesRenderer extends ConvenienceRenderer { this.forEachEnumCase( enumType, "none", - (name: Name, _jsonName, _position) => { - options.push("'"); - options.push(name); - options.push("'"); + (_name: Name, jsonName, _position) => { + options.push('"'); + options.push(utf16StringEscape(jsonName)); + options.push('"'); options.push(", "); }, ); @@ -223,7 +233,7 @@ export class JavaScriptPropTypesRenderer extends ConvenienceRenderer { this.emitLine([ "const _", enumName, - " = PropTypes.oneOfType([", + " = PropTypes.oneOf([", ...options, "]);", ]); @@ -281,6 +291,13 @@ export class JavaScriptPropTypesRenderer extends ConvenienceRenderer { this.typeMapTypeFor((type as ArrayType).items), ")", ]); + } else if (type.kind === "map") { + this.ensureBlankLine(); + this.emitExport(name, [ + "PropTypes.objectOf(", + this.typeMapTypeFor((type as MapType).values), + ")", + ]); } else { this.ensureBlankLine(); this.emitExport(name, ["_", name]); diff --git a/test/unit/javascript-prop-types-required.test.ts b/test/unit/javascript-prop-types-required.test.ts new file mode 100644 index 0000000000..bde1070642 --- /dev/null +++ b/test/unit/javascript-prop-types-required.test.ts @@ -0,0 +1,69 @@ +import { + InputData, + JSONSchemaInput, + quicktype, +} from "../../packages/quicktype-core/src/index.js"; +import { describe, expect, test } from "vitest"; + +async function renderPropTypes(schema: object): Promise { + const schemaInput = new JSONSchemaInput(undefined); + await schemaInput.addSource({ + name: "Component", + schema: JSON.stringify(schema), + }); + + const inputData = new InputData(); + inputData.addInput(schemaInput); + + const result = await quicktype({ + inputData, + lang: "javascript-prop-types", + }); + return result.lines.join("\n"); +} + +function propertyLine(output: string, property: string): string | undefined { + return output + .split("\n") + .find((line) => line.trimStart().startsWith(`"${property}":`)); +} + +describe("JavaScript PropTypes required properties", () => { + test("marks only required shape validators as required", async () => { + const output = await renderPropTypes({ + type: "object", + required: ["anything", "disabled", "options", "tags"], + properties: { + anything: {}, + disabled: { type: "boolean" }, + options: { + type: "object", + properties: { label: { type: "string" } }, + }, + tags: { type: "array", items: { type: "string" } }, + type: { + type: "string", + enum: ["primary choice", "secondary"], + }, + }, + }); + + expect(propertyLine(output, "anything")).toContain( + "PropTypes.any.isRequired", + ); + expect(propertyLine(output, "disabled")).toContain( + "PropTypes.bool.isRequired", + ); + expect(propertyLine(output, "options")).toContain( + "_Options.isRequired", + ); + expect(propertyLine(output, "tags")).toContain( + "PropTypes.arrayOf(PropTypes.string).isRequired", + ); + expect(propertyLine(output, "type")).not.toContain(".isRequired"); + expect(output).toContain( + 'const _Type = PropTypes.oneOf(["primary choice", "secondary"]);', + ); + expect(output).not.toContain("const _Type = PropTypes.oneOfType("); + }); +}); From 6799c2391c17c3182043b8229e6549468dda9567 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Wed, 22 Jul 2026 16:07:52 -0400 Subject: [PATCH 2/5] test(javascript-prop-types): cover required schema properties --- test/fixtures.ts | 21 ++++-- test/fixtures/javascript-prop-types/main.js | 6 +- ...rop-types-required.1.fail.no-defaults.json | 11 +++ ...rop-types-required.2.fail.no-defaults.json | 13 ++++ ...rop-types-required.3.fail.no-defaults.json | 11 +++ ...rop-types-required.4.fail.no-defaults.json | 10 +++ ...rop-types-required.5.fail.no-defaults.json | 13 ++++ ...rop-types-required.6.fail.no-defaults.json | 12 ++++ .../javascript-prop-types-required.json | 14 ++++ .../javascript-prop-types-required.schema | 24 +++++++ .../javascript-prop-types-required.test.ts | 69 ------------------- 11 files changed, 128 insertions(+), 76 deletions(-) create mode 100644 test/inputs/schema/javascript-prop-types-required.1.fail.no-defaults.json create mode 100644 test/inputs/schema/javascript-prop-types-required.2.fail.no-defaults.json create mode 100644 test/inputs/schema/javascript-prop-types-required.3.fail.no-defaults.json create mode 100644 test/inputs/schema/javascript-prop-types-required.4.fail.no-defaults.json create mode 100644 test/inputs/schema/javascript-prop-types-required.5.fail.no-defaults.json create mode 100644 test/inputs/schema/javascript-prop-types-required.6.fail.no-defaults.json create mode 100644 test/inputs/schema/javascript-prop-types-required.json create mode 100644 test/inputs/schema/javascript-prop-types-required.schema delete mode 100644 test/unit/javascript-prop-types-required.test.ts diff --git a/test/fixtures.ts b/test/fixtures.ts index 788bebd537..14baaecef9 100644 --- a/test/fixtures.ts +++ b/test/fixtures.ts @@ -927,6 +927,20 @@ class JSONSchemaFixture extends LanguageFixture { } } +class JavaScriptPropTypesJSONSchemaFixture extends JSONSchemaFixture { + constructor() { + super(languages.JavaScriptPropTypesLanguage); + } + + getSamples(sources: string[]): { priority: Sample[]; others: Sample[] } { + return super.getSamples( + sources.length === 0 + ? ["test/inputs/schema/javascript-prop-types-required.schema"] + : sources, + ); + } +} + // `leadingComments` is a quicktype-core API option, so the CLI fixture path // cannot exercise it. class LeadingCommentsGoFixture extends JSONSchemaFixture { @@ -1639,11 +1653,7 @@ class CommandSuccessfulLanguageFixture extends LanguageFixture { } const command = this.language.runCommand(filename); - const results = await execAsync(command); - - if (results.stdout.indexOf("Success") === -1) { - throw new Error(`Test failed:\n${results.stdout}`); - } + await execAsync(command); return 0; } @@ -1812,6 +1822,7 @@ export const allFixtures: Fixture[] = [ new JSONSchemaFixture(languages.TypeScriptZodLanguage), new JSONSchemaFixture(languages.FlowLanguage), new JSONSchemaFixture(languages.JavaScriptLanguage), + new JavaScriptPropTypesJSONSchemaFixture(), new JSONSchemaFixture(languages.KotlinLanguage), new JSONSchemaFixture( languages.KotlinJacksonLanguage, diff --git a/test/fixtures/javascript-prop-types/main.js b/test/fixtures/javascript-prop-types/main.js index a8795f3f90..27b6185c01 100644 --- a/test/fixtures/javascript-prop-types/main.js +++ b/test/fixtures/javascript-prop-types/main.js @@ -1,7 +1,6 @@ import { readFileSync } from "node:fs"; import { argv } from "node:process"; import PropTypes from "prop-types"; -import { TopLevel } from "./toplevel.js"; const sample = argv[2]; const json = readFileSync(sample); @@ -26,6 +25,7 @@ try { checkerWorks = errors.length > 0; errors.length = 0; + const { TopLevel } = await import("./toplevel.js"); PropTypes.resetWarningCache(); PropTypes.checkPropTypes({ obj: TopLevel }, { obj }, "prop", "MyComponent"); } finally { @@ -36,8 +36,10 @@ if (!checkerWorks) { console.log( "Failure: prop-types checks are disabled (NODE_ENV=production?)", ); + process.exitCode = 1; } else if (errors.length > 0) { console.log("Failure:", errors.join("\n")); + process.exitCode = 1; } else { - console.log("Success"); + console.log(JSON.stringify(obj)); } diff --git a/test/inputs/schema/javascript-prop-types-required.1.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types-required.1.fail.no-defaults.json new file mode 100644 index 0000000000..dfdc101409 --- /dev/null +++ b/test/inputs/schema/javascript-prop-types-required.1.fail.no-defaults.json @@ -0,0 +1,11 @@ +{ + "disabled": false, + "options": { + "label": "shown" + }, + "tags": [ + "one", + "two" + ], + "kind": "primary choice" +} diff --git a/test/inputs/schema/javascript-prop-types-required.2.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types-required.2.fail.no-defaults.json new file mode 100644 index 0000000000..2b7691209f --- /dev/null +++ b/test/inputs/schema/javascript-prop-types-required.2.fail.no-defaults.json @@ -0,0 +1,13 @@ +{ + "anything": { + "accepted": true + }, + "options": { + "label": "shown" + }, + "tags": [ + "one", + "two" + ], + "kind": "primary choice" +} diff --git a/test/inputs/schema/javascript-prop-types-required.3.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types-required.3.fail.no-defaults.json new file mode 100644 index 0000000000..2e2f92396a --- /dev/null +++ b/test/inputs/schema/javascript-prop-types-required.3.fail.no-defaults.json @@ -0,0 +1,11 @@ +{ + "anything": { + "accepted": true + }, + "disabled": false, + "tags": [ + "one", + "two" + ], + "kind": "primary choice" +} diff --git a/test/inputs/schema/javascript-prop-types-required.4.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types-required.4.fail.no-defaults.json new file mode 100644 index 0000000000..3ef42cf9c5 --- /dev/null +++ b/test/inputs/schema/javascript-prop-types-required.4.fail.no-defaults.json @@ -0,0 +1,10 @@ +{ + "anything": { + "accepted": true + }, + "disabled": false, + "options": { + "label": "shown" + }, + "kind": "primary choice" +} diff --git a/test/inputs/schema/javascript-prop-types-required.5.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types-required.5.fail.no-defaults.json new file mode 100644 index 0000000000..9537c59dd1 --- /dev/null +++ b/test/inputs/schema/javascript-prop-types-required.5.fail.no-defaults.json @@ -0,0 +1,13 @@ +{ + "anything": { + "accepted": true + }, + "disabled": false, + "options": { + "label": "shown" + }, + "tags": [ + "one", + "two" + ] +} diff --git a/test/inputs/schema/javascript-prop-types-required.6.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types-required.6.fail.no-defaults.json new file mode 100644 index 0000000000..160b01d73a --- /dev/null +++ b/test/inputs/schema/javascript-prop-types-required.6.fail.no-defaults.json @@ -0,0 +1,12 @@ +{ + "anything": { + "accepted": true + }, + "disabled": false, + "options": {}, + "tags": [ + "one", + "two" + ], + "kind": "primary choice" +} diff --git a/test/inputs/schema/javascript-prop-types-required.json b/test/inputs/schema/javascript-prop-types-required.json new file mode 100644 index 0000000000..ebbf0cdbea --- /dev/null +++ b/test/inputs/schema/javascript-prop-types-required.json @@ -0,0 +1,14 @@ +{ + "anything": { + "accepted": true + }, + "disabled": false, + "options": { + "label": "shown" + }, + "tags": [ + "one", + "two" + ], + "kind": "primary choice" +} diff --git a/test/inputs/schema/javascript-prop-types-required.schema b/test/inputs/schema/javascript-prop-types-required.schema new file mode 100644 index 0000000000..c84f0f2dc7 --- /dev/null +++ b/test/inputs/schema/javascript-prop-types-required.schema @@ -0,0 +1,24 @@ +{ + "type": "object", + "required": ["anything", "disabled", "options", "tags", "kind"], + "properties": { + "anything": {}, + "disabled": { "type": "boolean" }, + "options": { + "type": "object", + "required": ["label"], + "properties": { + "label": { "type": "string" } + } + }, + "tags": { + "type": "array", + "items": { "type": "string" } + }, + "kind": { + "type": "string", + "enum": ["primary choice", "secondary"] + }, + "optional": { "type": "number" } + } +} diff --git a/test/unit/javascript-prop-types-required.test.ts b/test/unit/javascript-prop-types-required.test.ts deleted file mode 100644 index bde1070642..0000000000 --- a/test/unit/javascript-prop-types-required.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { - InputData, - JSONSchemaInput, - quicktype, -} from "../../packages/quicktype-core/src/index.js"; -import { describe, expect, test } from "vitest"; - -async function renderPropTypes(schema: object): Promise { - const schemaInput = new JSONSchemaInput(undefined); - await schemaInput.addSource({ - name: "Component", - schema: JSON.stringify(schema), - }); - - const inputData = new InputData(); - inputData.addInput(schemaInput); - - const result = await quicktype({ - inputData, - lang: "javascript-prop-types", - }); - return result.lines.join("\n"); -} - -function propertyLine(output: string, property: string): string | undefined { - return output - .split("\n") - .find((line) => line.trimStart().startsWith(`"${property}":`)); -} - -describe("JavaScript PropTypes required properties", () => { - test("marks only required shape validators as required", async () => { - const output = await renderPropTypes({ - type: "object", - required: ["anything", "disabled", "options", "tags"], - properties: { - anything: {}, - disabled: { type: "boolean" }, - options: { - type: "object", - properties: { label: { type: "string" } }, - }, - tags: { type: "array", items: { type: "string" } }, - type: { - type: "string", - enum: ["primary choice", "secondary"], - }, - }, - }); - - expect(propertyLine(output, "anything")).toContain( - "PropTypes.any.isRequired", - ); - expect(propertyLine(output, "disabled")).toContain( - "PropTypes.bool.isRequired", - ); - expect(propertyLine(output, "options")).toContain( - "_Options.isRequired", - ); - expect(propertyLine(output, "tags")).toContain( - "PropTypes.arrayOf(PropTypes.string).isRequired", - ); - expect(propertyLine(output, "type")).not.toContain(".isRequired"); - expect(output).toContain( - 'const _Type = PropTypes.oneOf(["primary choice", "secondary"]);', - ); - expect(output).not.toContain("const _Type = PropTypes.oneOfType("); - }); -}); From bcc594d0001efd7226bad5381cd4556be2abd56f Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Wed, 22 Jul 2026 16:11:55 -0400 Subject: [PATCH 3/5] test: isolate prop-types schema fixture inputs --- test/fixtures.ts | 4 +++- .../javascript-prop-types-required.1.fail.no-defaults.json | 0 .../javascript-prop-types-required.2.fail.no-defaults.json | 0 .../javascript-prop-types-required.3.fail.no-defaults.json | 0 .../javascript-prop-types-required.4.fail.no-defaults.json | 0 .../javascript-prop-types-required.5.fail.no-defaults.json | 0 .../javascript-prop-types-required.6.fail.no-defaults.json | 0 .../javascript-prop-types-required.json | 0 .../javascript-prop-types-required.schema | 0 9 files changed, 3 insertions(+), 1 deletion(-) rename test/inputs/schema/{ => javascript-prop-types}/javascript-prop-types-required.1.fail.no-defaults.json (100%) rename test/inputs/schema/{ => javascript-prop-types}/javascript-prop-types-required.2.fail.no-defaults.json (100%) rename test/inputs/schema/{ => javascript-prop-types}/javascript-prop-types-required.3.fail.no-defaults.json (100%) rename test/inputs/schema/{ => javascript-prop-types}/javascript-prop-types-required.4.fail.no-defaults.json (100%) rename test/inputs/schema/{ => javascript-prop-types}/javascript-prop-types-required.5.fail.no-defaults.json (100%) rename test/inputs/schema/{ => javascript-prop-types}/javascript-prop-types-required.6.fail.no-defaults.json (100%) rename test/inputs/schema/{ => javascript-prop-types}/javascript-prop-types-required.json (100%) rename test/inputs/schema/{ => javascript-prop-types}/javascript-prop-types-required.schema (100%) diff --git a/test/fixtures.ts b/test/fixtures.ts index 14baaecef9..919531e42e 100644 --- a/test/fixtures.ts +++ b/test/fixtures.ts @@ -935,7 +935,9 @@ class JavaScriptPropTypesJSONSchemaFixture extends JSONSchemaFixture { getSamples(sources: string[]): { priority: Sample[]; others: Sample[] } { return super.getSamples( sources.length === 0 - ? ["test/inputs/schema/javascript-prop-types-required.schema"] + ? [ + "test/inputs/schema/javascript-prop-types/javascript-prop-types-required.schema", + ] : sources, ); } diff --git a/test/inputs/schema/javascript-prop-types-required.1.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types/javascript-prop-types-required.1.fail.no-defaults.json similarity index 100% rename from test/inputs/schema/javascript-prop-types-required.1.fail.no-defaults.json rename to test/inputs/schema/javascript-prop-types/javascript-prop-types-required.1.fail.no-defaults.json diff --git a/test/inputs/schema/javascript-prop-types-required.2.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types/javascript-prop-types-required.2.fail.no-defaults.json similarity index 100% rename from test/inputs/schema/javascript-prop-types-required.2.fail.no-defaults.json rename to test/inputs/schema/javascript-prop-types/javascript-prop-types-required.2.fail.no-defaults.json diff --git a/test/inputs/schema/javascript-prop-types-required.3.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types/javascript-prop-types-required.3.fail.no-defaults.json similarity index 100% rename from test/inputs/schema/javascript-prop-types-required.3.fail.no-defaults.json rename to test/inputs/schema/javascript-prop-types/javascript-prop-types-required.3.fail.no-defaults.json diff --git a/test/inputs/schema/javascript-prop-types-required.4.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types/javascript-prop-types-required.4.fail.no-defaults.json similarity index 100% rename from test/inputs/schema/javascript-prop-types-required.4.fail.no-defaults.json rename to test/inputs/schema/javascript-prop-types/javascript-prop-types-required.4.fail.no-defaults.json diff --git a/test/inputs/schema/javascript-prop-types-required.5.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types/javascript-prop-types-required.5.fail.no-defaults.json similarity index 100% rename from test/inputs/schema/javascript-prop-types-required.5.fail.no-defaults.json rename to test/inputs/schema/javascript-prop-types/javascript-prop-types-required.5.fail.no-defaults.json diff --git a/test/inputs/schema/javascript-prop-types-required.6.fail.no-defaults.json b/test/inputs/schema/javascript-prop-types/javascript-prop-types-required.6.fail.no-defaults.json similarity index 100% rename from test/inputs/schema/javascript-prop-types-required.6.fail.no-defaults.json rename to test/inputs/schema/javascript-prop-types/javascript-prop-types-required.6.fail.no-defaults.json diff --git a/test/inputs/schema/javascript-prop-types-required.json b/test/inputs/schema/javascript-prop-types/javascript-prop-types-required.json similarity index 100% rename from test/inputs/schema/javascript-prop-types-required.json rename to test/inputs/schema/javascript-prop-types/javascript-prop-types-required.json diff --git a/test/inputs/schema/javascript-prop-types-required.schema b/test/inputs/schema/javascript-prop-types/javascript-prop-types-required.schema similarity index 100% rename from test/inputs/schema/javascript-prop-types-required.schema rename to test/inputs/schema/javascript-prop-types/javascript-prop-types-required.schema From c7f300b2b4f5e98c756db99a3e4260bf1751270f Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Wed, 22 Jul 2026 16:18:16 -0400 Subject: [PATCH 4/5] ci: run prop-types schema fixture --- .github/workflows/test-pr.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-pr.yaml b/.github/workflows/test-pr.yaml index 7001f80230..a89f9d6558 100644 --- a/.github/workflows/test-pr.yaml +++ b/.github/workflows/test-pr.yaml @@ -49,7 +49,7 @@ jobs: - json-ts-csharp - dart,schema-dart # - swift,schema-swift # pgp issue - - javascript-prop-types + - javascript-prop-types,schema-javascript-prop-types - ruby - php,schema-php - scala3,schema-scala3 From ea70809caf164b9f2cb5f08886efd0b587526d28 Mon Sep 17 00:00:00 2001 From: Mark Probst Date: Wed, 22 Jul 2026 17:48:50 -0400 Subject: [PATCH 5/5] test(javascript-prop-types): cover top-level maps --- test/fixtures.ts | 1 + .../javascript-prop-types-map.1.fail.json | 3 +++ .../javascript-prop-types/javascript-prop-types-map.json | 4 ++++ .../javascript-prop-types/javascript-prop-types-map.schema | 4 ++++ 4 files changed, 12 insertions(+) create mode 100644 test/inputs/schema/javascript-prop-types/javascript-prop-types-map.1.fail.json create mode 100644 test/inputs/schema/javascript-prop-types/javascript-prop-types-map.json create mode 100644 test/inputs/schema/javascript-prop-types/javascript-prop-types-map.schema diff --git a/test/fixtures.ts b/test/fixtures.ts index 919531e42e..514684e558 100644 --- a/test/fixtures.ts +++ b/test/fixtures.ts @@ -936,6 +936,7 @@ class JavaScriptPropTypesJSONSchemaFixture extends JSONSchemaFixture { return super.getSamples( sources.length === 0 ? [ + "test/inputs/schema/javascript-prop-types/javascript-prop-types-map.schema", "test/inputs/schema/javascript-prop-types/javascript-prop-types-required.schema", ] : sources, diff --git a/test/inputs/schema/javascript-prop-types/javascript-prop-types-map.1.fail.json b/test/inputs/schema/javascript-prop-types/javascript-prop-types-map.1.fail.json new file mode 100644 index 0000000000..3e1946bc9e --- /dev/null +++ b/test/inputs/schema/javascript-prop-types/javascript-prop-types-map.1.fail.json @@ -0,0 +1,3 @@ +{ + "first": 42 +} diff --git a/test/inputs/schema/javascript-prop-types/javascript-prop-types-map.json b/test/inputs/schema/javascript-prop-types/javascript-prop-types-map.json new file mode 100644 index 0000000000..0ee4c04574 --- /dev/null +++ b/test/inputs/schema/javascript-prop-types/javascript-prop-types-map.json @@ -0,0 +1,4 @@ +{ + "first": "value", + "second": "another value" +} diff --git a/test/inputs/schema/javascript-prop-types/javascript-prop-types-map.schema b/test/inputs/schema/javascript-prop-types/javascript-prop-types-map.schema new file mode 100644 index 0000000000..dbd1f4b0f7 --- /dev/null +++ b/test/inputs/schema/javascript-prop-types/javascript-prop-types-map.schema @@ -0,0 +1,4 @@ +{ + "type": "object", + "additionalProperties": { "type": "string" } +}