From a73dac302df8247dbf0a18bedd4c7b37cb49478c Mon Sep 17 00:00:00 2001 From: Sam Sudar Date: Mon, 24 Nov 2025 20:42:03 -0800 Subject: [PATCH 1/7] get basic case --- test/valid-data-type.test.ts | 2 ++ test/valid-data/index-any-type/main.ts | 5 +++++ test/valid-data/index-any-type/schema.json | 16 ++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 test/valid-data/index-any-type/main.ts create mode 100644 test/valid-data/index-any-type/schema.json diff --git a/test/valid-data-type.test.ts b/test/valid-data-type.test.ts index 519b48864..1e3ac8f64 100644 --- a/test/valid-data-type.test.ts +++ b/test/valid-data-type.test.ts @@ -148,6 +148,8 @@ describe("valid-data-type", () => { it("const-spread", assertValidSchema("const-spread", "MyType")); it("keyof-typeof-x", assertValidSchema("keyof-typeof-x", "MyType")); + it("index-any-type", assertValidSchema("index-any-type", "MyObject")); + it("promise-extensions", assertValidSchema("promise-extensions", "*")); it("promise-generics", assertValidSchema("promise-generics", "*")); diff --git a/test/valid-data/index-any-type/main.ts b/test/valid-data/index-any-type/main.ts new file mode 100644 index 000000000..4a61153d0 --- /dev/null +++ b/test/valid-data/index-any-type/main.ts @@ -0,0 +1,5 @@ +export interface MyObject { + nodes: { + [Key in any]: number; + }; +} diff --git a/test/valid-data/index-any-type/schema.json b/test/valid-data/index-any-type/schema.json new file mode 100644 index 000000000..60c1d0d26 --- /dev/null +++ b/test/valid-data/index-any-type/schema.json @@ -0,0 +1,16 @@ +{ + "$ref": "#/definitions/MyObject", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "MyObject": { + "additionalProperties": false, + "properties": { + "foo": { "type": "number" } + }, + "required": [ + "foo" + ], + "type": "object" + } + } +} From e5fea9f76dde5bbf1d48d069056cba3796c4cb2c Mon Sep 17 00:00:00 2001 From: Sam Sudar Date: Mon, 24 Nov 2025 20:50:17 -0800 Subject: [PATCH 2/7] fix test --- src/NodeParser/MappedTypeNodeParser.ts | 4 +++- test/valid-data/index-any-type/schema.json | 7 +++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/NodeParser/MappedTypeNodeParser.ts b/src/NodeParser/MappedTypeNodeParser.ts index 625cee6e6..62cefadc7 100644 --- a/src/NodeParser/MappedTypeNodeParser.ts +++ b/src/NodeParser/MappedTypeNodeParser.ts @@ -4,6 +4,7 @@ import type { NodeParser } from "../NodeParser.js"; import { Context } from "../NodeParser.js"; import type { SubNodeParser } from "../SubNodeParser.js"; import { AnnotatedType } from "../Type/AnnotatedType.js"; +import { AnyType } from "../Type/AnyType.js"; import { ArrayType } from "../Type/ArrayType.js"; import type { BaseType } from "../Type/BaseType.js"; import { DefinitionType } from "../Type/DefinitionType.js"; @@ -55,7 +56,8 @@ export class MappedTypeNodeParser implements SubNodeParser { if ( keyListType instanceof StringType || keyListType instanceof NumberType || - keyListType instanceof SymbolType + keyListType instanceof SymbolType || + keyListType instanceof AnyType ) { if (constraintType?.getId() === "number") { const type = this.childNodeParser.createType( diff --git a/test/valid-data/index-any-type/schema.json b/test/valid-data/index-any-type/schema.json index 60c1d0d26..01ac0f6ea 100644 --- a/test/valid-data/index-any-type/schema.json +++ b/test/valid-data/index-any-type/schema.json @@ -5,10 +5,13 @@ "MyObject": { "additionalProperties": false, "properties": { - "foo": { "type": "number" } + "nodes": { + "additionalProperties": { "type": "number" }, + "type": "object" + } }, "required": [ - "foo" + "nodes" ], "type": "object" } From 31bec0e41cfe3632e98de5fd92555d50c78cdd00 Mon Sep 17 00:00:00 2001 From: Sam Sudar Date: Wed, 26 Nov 2025 10:53:49 -0800 Subject: [PATCH 3/7] add some tests --- test/valid-data/index-any-type/main.ts | 15 ++++++++++++++- test/valid-data/index-any-type/schema.json | 15 +++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/test/valid-data/index-any-type/main.ts b/test/valid-data/index-any-type/main.ts index 4a61153d0..11d8d40f7 100644 --- a/test/valid-data/index-any-type/main.ts +++ b/test/valid-data/index-any-type/main.ts @@ -1,5 +1,18 @@ +type AorB = "a" | "b"; + +type MyObject = Record; + export interface MyObject { - nodes: { + anyNodes: { [Key in any]: number; }; + symbolNodes: { + [Key: symbol]: string; + }; + numberNodes: { + [Key: number]: string; + }; + templateLiteralNodes: { + [Key in `key${AorB}`]: number; + }; } diff --git a/test/valid-data/index-any-type/schema.json b/test/valid-data/index-any-type/schema.json index 01ac0f6ea..59d1192bc 100644 --- a/test/valid-data/index-any-type/schema.json +++ b/test/valid-data/index-any-type/schema.json @@ -5,13 +5,24 @@ "MyObject": { "additionalProperties": false, "properties": { - "nodes": { + "anyNodes": { "additionalProperties": { "type": "number" }, "type": "object" + }, + "symbolNodes": { + "additionalProperties": { "type": "string" }, + "type": "object" + }, + "numberNodes": { + "additionalProperties": { "type": "string" }, + "type": "object" } + }, "required": [ - "nodes" + "anyNodes", + "symbolNodes", + "numberNodes" ], "type": "object" } From 098b4e70ee2de4be1c91c10f39d7510cfd0c11ca Mon Sep 17 00:00:00 2001 From: Sam Sudar Date: Wed, 26 Nov 2025 12:47:19 -0800 Subject: [PATCH 4/7] better file --- test/valid-data/type-mapped-any/main.ts | 1 + test/valid-data/type-mapped-any/schema.json | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 test/valid-data/type-mapped-any/main.ts create mode 100644 test/valid-data/type-mapped-any/schema.json diff --git a/test/valid-data/type-mapped-any/main.ts b/test/valid-data/type-mapped-any/main.ts new file mode 100644 index 000000000..90a70e9f9 --- /dev/null +++ b/test/valid-data/type-mapped-any/main.ts @@ -0,0 +1 @@ +export type MyObject = Record; diff --git a/test/valid-data/type-mapped-any/schema.json b/test/valid-data/type-mapped-any/schema.json new file mode 100644 index 000000000..cd0c3baa4 --- /dev/null +++ b/test/valid-data/type-mapped-any/schema.json @@ -0,0 +1,12 @@ +{ + "$ref": "#/definitions/MyObject", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "MyObject": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + } +} From 79548ac3aa13baf7c94403159e01cd82eb85a5ea Mon Sep 17 00:00:00 2001 From: Sam Sudar Date: Wed, 26 Nov 2025 13:01:23 -0800 Subject: [PATCH 5/7] include test for template literal --- test/valid-data-type.test.ts | 4 ++-- test/valid-data/type-mapped-template-literal/main.ts | 1 + .../type-mapped-template-literal/schema.json | 12 ++++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 test/valid-data/type-mapped-template-literal/main.ts create mode 100644 test/valid-data/type-mapped-template-literal/schema.json diff --git a/test/valid-data-type.test.ts b/test/valid-data-type.test.ts index 1e3ac8f64..15cad25f3 100644 --- a/test/valid-data-type.test.ts +++ b/test/valid-data-type.test.ts @@ -102,6 +102,7 @@ describe("valid-data-type", () => { it("type-mapped-widened", assertValidSchema("type-mapped-widened", "MyObject")); it("type-mapped-optional", assertValidSchema("type-mapped-optional", "MyObject")); it("type-mapped-additional-props", assertValidSchema("type-mapped-additional-props", "MyObject")); + it("type-mapped-any", assertValidSchema("type-mapped-any", "MyObject")); it("type-mapped-array", assertValidSchema("type-mapped-array", "MyObject")); it("type-mapped-union-intersection", assertValidSchema("type-mapped-union-intersection", "MyObject")); it("type-mapped-union-union", assertValidSchema("type-mapped-union-union", "MyType")); @@ -110,6 +111,7 @@ describe("valid-data-type", () => { it("type-mapped-enum-null", assertValidSchema("type-mapped-enum-null", "MyObject")); it("type-mapped-enum-number", assertValidSchema("type-mapped-enum-number", "MyObject")); it("type-mapped-exclude", assertValidSchema("type-mapped-exclude", "MyObject")); + it("type-mapped-template-literal", assertValidSchema("type-mapped-template-literal", "MyObject")); it("type-mapped-double-exclude", assertValidSchema("type-mapped-double-exclude", "MyObject")); it("type-mapped-symbol", assertValidSchema("type-mapped-symbol", "MyObject")); it("type-mapped-never", assertValidSchema("type-mapped-never", "MyObject")); @@ -148,8 +150,6 @@ describe("valid-data-type", () => { it("const-spread", assertValidSchema("const-spread", "MyType")); it("keyof-typeof-x", assertValidSchema("keyof-typeof-x", "MyType")); - it("index-any-type", assertValidSchema("index-any-type", "MyObject")); - it("promise-extensions", assertValidSchema("promise-extensions", "*")); it("promise-generics", assertValidSchema("promise-generics", "*")); diff --git a/test/valid-data/type-mapped-template-literal/main.ts b/test/valid-data/type-mapped-template-literal/main.ts new file mode 100644 index 000000000..90a70e9f9 --- /dev/null +++ b/test/valid-data/type-mapped-template-literal/main.ts @@ -0,0 +1 @@ +export type MyObject = Record; diff --git a/test/valid-data/type-mapped-template-literal/schema.json b/test/valid-data/type-mapped-template-literal/schema.json new file mode 100644 index 000000000..cd0c3baa4 --- /dev/null +++ b/test/valid-data/type-mapped-template-literal/schema.json @@ -0,0 +1,12 @@ +{ + "$ref": "#/definitions/MyObject", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "MyObject": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + } + } +} From 5ac6aaf30d01a4c0c0c2e93ede86de8d47598b83 Mon Sep 17 00:00:00 2001 From: Sam Sudar Date: Wed, 26 Nov 2025 13:03:18 -0800 Subject: [PATCH 6/7] rm thing --- test/valid-data/index-any-type/main.ts | 18 ------------- test/valid-data/index-any-type/schema.json | 30 ---------------------- 2 files changed, 48 deletions(-) delete mode 100644 test/valid-data/index-any-type/main.ts delete mode 100644 test/valid-data/index-any-type/schema.json diff --git a/test/valid-data/index-any-type/main.ts b/test/valid-data/index-any-type/main.ts deleted file mode 100644 index 11d8d40f7..000000000 --- a/test/valid-data/index-any-type/main.ts +++ /dev/null @@ -1,18 +0,0 @@ -type AorB = "a" | "b"; - -type MyObject = Record; - -export interface MyObject { - anyNodes: { - [Key in any]: number; - }; - symbolNodes: { - [Key: symbol]: string; - }; - numberNodes: { - [Key: number]: string; - }; - templateLiteralNodes: { - [Key in `key${AorB}`]: number; - }; -} diff --git a/test/valid-data/index-any-type/schema.json b/test/valid-data/index-any-type/schema.json deleted file mode 100644 index 59d1192bc..000000000 --- a/test/valid-data/index-any-type/schema.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "$ref": "#/definitions/MyObject", - "$schema": "http://json-schema.org/draft-07/schema#", - "definitions": { - "MyObject": { - "additionalProperties": false, - "properties": { - "anyNodes": { - "additionalProperties": { "type": "number" }, - "type": "object" - }, - "symbolNodes": { - "additionalProperties": { "type": "string" }, - "type": "object" - }, - "numberNodes": { - "additionalProperties": { "type": "string" }, - "type": "object" - } - - }, - "required": [ - "anyNodes", - "symbolNodes", - "numberNodes" - ], - "type": "object" - } - } -} From ccab3b1615735c09b625595945caeda9c6195a75 Mon Sep 17 00:00:00 2001 From: Sam Sudar Date: Wed, 26 Nov 2025 13:06:03 -0800 Subject: [PATCH 7/7] correct template literal --- .../type-mapped-template-literal/main.ts | 4 +++- .../type-mapped-template-literal/schema.json | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/test/valid-data/type-mapped-template-literal/main.ts b/test/valid-data/type-mapped-template-literal/main.ts index 90a70e9f9..17cc9c22c 100644 --- a/test/valid-data/type-mapped-template-literal/main.ts +++ b/test/valid-data/type-mapped-template-literal/main.ts @@ -1 +1,3 @@ -export type MyObject = Record; +type AorB = "A" | "B"; + +export type MyObject = Record<`letter-${AorB}`, string>; diff --git a/test/valid-data/type-mapped-template-literal/schema.json b/test/valid-data/type-mapped-template-literal/schema.json index cd0c3baa4..09634fa92 100644 --- a/test/valid-data/type-mapped-template-literal/schema.json +++ b/test/valid-data/type-mapped-template-literal/schema.json @@ -3,9 +3,19 @@ "$schema": "http://json-schema.org/draft-07/schema#", "definitions": { "MyObject": { - "additionalProperties": { - "type": "string" + "additionalProperties": false, + "properties": { + "letter-A": { + "type": "string" + }, + "letter-B": { + "type": "string" + } }, + "required": [ + "letter-A", + "letter-B" + ], "type": "object" } }