From 318336ea03f065ff8496f7d64a8facfff811ea7f Mon Sep 17 00:00:00 2001 From: Thomas Riener Date: Mon, 21 Nov 2022 12:52:51 +0100 Subject: [PATCH] feat: add support for type URL (string with format "uri") --- README.md | 2 +- src/NodeParser/TypeReferenceNodeParser.ts | 4 ++++ test/valid-data-type.test.ts | 1 + test/valid-data/type-uri/main.ts | 6 ++++++ test/valid-data/type-uri/schema.json | 24 +++++++++++++++++++++++ 5 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 test/valid-data/type-uri/main.ts create mode 100644 test/valid-data/type-uri/schema.json diff --git a/README.md b/README.md index 579e53165..9ded540c6 100644 --- a/README.md +++ b/README.md @@ -252,7 +252,7 @@ fs.writeFile(output_path, schemaString, (err) => { - `interface` types - `enum` types - `union`, `tuple`, `type[]` types -- `Date`, `RegExp` types +- `Date`, `RegExp`, `URL` types - `string`, `boolean`, `number` types - `"value"`, `123`, `true`, `false`, `null`, `undefined` literals - type aliases diff --git a/src/NodeParser/TypeReferenceNodeParser.ts b/src/NodeParser/TypeReferenceNodeParser.ts index 40b3c0f50..ae7607bca 100644 --- a/src/NodeParser/TypeReferenceNodeParser.ts +++ b/src/NodeParser/TypeReferenceNodeParser.ts @@ -60,6 +60,10 @@ export class TypeReferenceNodeParser implements SubNodeParser { return new AnnotatedType(new StringType(), { format: "regex" }, false); } + if (typeSymbol.name === "URL") { + return new AnnotatedType(new StringType(), { format: "uri" }, false); + } + return this.childNodeParser.createType( typeSymbol.declarations!.filter((n: ts.Declaration) => !invalidTypes[n.kind])[0], this.createSubContext(node, context) diff --git a/test/valid-data-type.test.ts b/test/valid-data-type.test.ts index 9bc962889..406744a48 100644 --- a/test/valid-data-type.test.ts +++ b/test/valid-data-type.test.ts @@ -34,6 +34,7 @@ describe("valid-data-type", () => { it("type-date", assertValidSchema("type-date", "MyObject")); it("type-date-annotation", assertValidSchema("type-date-annotation", "MyObject", "basic")); it("type-regexp", assertValidSchema("type-regexp", "MyObject")); + it("type-uri", assertValidSchema("type-uri", "MyObject")); it("type-union", assertValidSchema("type-union", "TypeUnion")); it("type-union-tagged", assertValidSchema("type-union-tagged", "Shape")); it("type-intersection", assertValidSchema("type-intersection", "MyObject")); diff --git a/test/valid-data/type-uri/main.ts b/test/valid-data/type-uri/main.ts new file mode 100644 index 000000000..249b299cc --- /dev/null +++ b/test/valid-data/type-uri/main.ts @@ -0,0 +1,6 @@ +type MyURL = URL + +export interface MyObject { + url: URL; + urlAlias: MyURL; +} diff --git a/test/valid-data/type-uri/schema.json b/test/valid-data/type-uri/schema.json new file mode 100644 index 000000000..8d8d674cf --- /dev/null +++ b/test/valid-data/type-uri/schema.json @@ -0,0 +1,24 @@ +{ + "$ref": "#/definitions/MyObject", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "MyObject": { + "additionalProperties": false, + "properties": { + "url": { + "format": "uri", + "type": "string" + }, + "urlAlias": { + "format": "uri", + "type": "string" + } + }, + "required": [ + "url", + "urlAlias" + ], + "type": "object" + } + } +}