From 0b04c7dccad565bdbd75524608798d03ceb21433 Mon Sep 17 00:00:00 2001 From: daanboer <39552979+daanboer@users.noreply.github.com> Date: Thu, 26 May 2022 15:44:13 +0200 Subject: [PATCH] feat: support empty mapped types (#1261) --- src/NodeParser/MappedTypeNodeParser.ts | 5 +++++ test/valid-data-type.test.ts | 2 ++ test/valid-data/type-mapped-empty-exclude/main.ts | 1 + test/valid-data/type-mapped-empty-exclude/schema.json | 10 ++++++++++ test/valid-data/type-mapped-never/main.ts | 1 + test/valid-data/type-mapped-never/schema.json | 10 ++++++++++ 6 files changed, 29 insertions(+) create mode 100644 test/valid-data/type-mapped-empty-exclude/main.ts create mode 100644 test/valid-data/type-mapped-empty-exclude/schema.json create mode 100644 test/valid-data/type-mapped-never/main.ts create mode 100644 test/valid-data/type-mapped-never/schema.json diff --git a/src/NodeParser/MappedTypeNodeParser.ts b/src/NodeParser/MappedTypeNodeParser.ts index bae958e05..312332344 100644 --- a/src/NodeParser/MappedTypeNodeParser.ts +++ b/src/NodeParser/MappedTypeNodeParser.ts @@ -7,6 +7,7 @@ import { ArrayType } from "../Type/ArrayType"; import { BaseType } from "../Type/BaseType"; import { EnumType, EnumValue } from "../Type/EnumType"; import { LiteralType } from "../Type/LiteralType"; +import { NeverType } from "../Type/NeverType"; import { NumberType } from "../Type/NumberType"; import { ObjectProperty, ObjectType } from "../Type/ObjectType"; import { StringType } from "../Type/StringType"; @@ -58,6 +59,10 @@ export class MappedTypeNodeParser implements SubNodeParser { return type === undefined ? undefined : new ArrayType(type); } else if (keyListType instanceof EnumType) { return new ObjectType(id, [], this.getValues(node, keyListType, context), false); + } else if (keyListType instanceof NeverType) { + return new ObjectType(id, [], [], false); + } else if (keyListType === undefined) { + return new ObjectType(id, [], [], false); } else { throw new LogicError( // eslint-disable-next-line max-len diff --git a/test/valid-data-type.test.ts b/test/valid-data-type.test.ts index 1bc376d36..d650fd9b5 100644 --- a/test/valid-data-type.test.ts +++ b/test/valid-data-type.test.ts @@ -96,6 +96,8 @@ describe("valid-data-type", () => { it("type-mapped-exclude", assertValidSchema("type-mapped-exclude", "MyObject", "extended")); it("type-mapped-double-exclude", assertValidSchema("type-mapped-double-exclude", "MyObject", "extended")); it("type-mapped-symbol", assertValidSchema("type-mapped-symbol", "MyObject")); + it("type-mapped-never", assertValidSchema("type-mapped-never", "MyObject")); + it("type-mapped-empty-exclude", assertValidSchema("type-mapped-empty-exclude", "MyObject")); it("type-mapped-annotated-string", assertValidSchema("type-mapped-annotated-string", "ExchangeRate", "extended")); it("type-conditional-simple", assertValidSchema("type-conditional-simple", "MyObject")); diff --git a/test/valid-data/type-mapped-empty-exclude/main.ts b/test/valid-data/type-mapped-empty-exclude/main.ts new file mode 100644 index 000000000..cd509dde4 --- /dev/null +++ b/test/valid-data/type-mapped-empty-exclude/main.ts @@ -0,0 +1 @@ +export type MyObject = { [K in Exclude<"key", "key">]: never }; diff --git a/test/valid-data/type-mapped-empty-exclude/schema.json b/test/valid-data/type-mapped-empty-exclude/schema.json new file mode 100644 index 000000000..88f128ddf --- /dev/null +++ b/test/valid-data/type-mapped-empty-exclude/schema.json @@ -0,0 +1,10 @@ +{ + "$ref": "#/definitions/MyObject", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "MyObject": { + "additionalProperties": false, + "type": "object" + } + } +} diff --git a/test/valid-data/type-mapped-never/main.ts b/test/valid-data/type-mapped-never/main.ts new file mode 100644 index 000000000..9a7847492 --- /dev/null +++ b/test/valid-data/type-mapped-never/main.ts @@ -0,0 +1 @@ +export type MyObject = { [K in never]: never }; diff --git a/test/valid-data/type-mapped-never/schema.json b/test/valid-data/type-mapped-never/schema.json new file mode 100644 index 000000000..88f128ddf --- /dev/null +++ b/test/valid-data/type-mapped-never/schema.json @@ -0,0 +1,10 @@ +{ + "$ref": "#/definitions/MyObject", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "MyObject": { + "additionalProperties": false, + "type": "object" + } + } +}