From 7b7299d9c475105f9d2387c9dc31974139997483 Mon Sep 17 00:00:00 2001 From: Karl-Philipp Wulfert Date: Wed, 19 Dec 2018 14:58:06 +0100 Subject: [PATCH] feat: validate generated schemas Fixes #1 --- package-lock.json | 39 +++++++++++++++++++++++++++++++++++++++ package.json | 1 + src/schema.ts | 21 ++++++++++++++++++++- 3 files changed, 60 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 2a6b7e5d..98d7e322 100644 --- a/package-lock.json +++ b/package-lock.json @@ -148,6 +148,17 @@ "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", "dev": true }, + "ajv": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", @@ -625,6 +636,16 @@ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", "dev": true }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", @@ -1066,6 +1087,11 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", @@ -1429,6 +1455,11 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -1878,6 +1909,14 @@ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 28f36715..e1aeb20c 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "@types/humanize-string": "1.0.0", "@types/mustache": "0.8.32", "@types/node": "10.12.15", + "ajv": "6.6.2", "async": "2.6.1", "async-pool-native": "0.1.0", "commander": "2.19.0", diff --git a/src/schema.ts b/src/schema.ts index 1c7e0313..5fbb2197 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -12,6 +12,7 @@ * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ +import * as ajv from 'ajv'; import {Schema as JSONSchema} from 'jsonschema'; import {join} from 'path'; import {DEFAULT_CONFIG, SchemaGenerator} from 'ts-json-schema-generator'; @@ -29,6 +30,7 @@ import {isSchemaWithDefinitions} from './common'; */ export class Converter { private generator: SchemaGenerator; + private schemaValidator: ajv.Ajv; /** * Create a new converter @@ -56,6 +58,10 @@ export class Converter { createParser(program, config), createFormatter(config), ); + + // create ajv instance + this.schemaValidator = new ajv(); + this.schemaValidator.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json')); } /** @@ -73,8 +79,21 @@ export class Converter { schema.id = 'https://core.stapps.tu-berlin.de/v' + version + '/lib/schema/' + type + '.json'; if (isSchemaWithDefinitions(schema)) { + const selfReference = { + ...{}, + ...schema, + }; + + delete selfReference.$schema; + delete selfReference.definitions; + delete selfReference.id; + // add self reference to definitions - schema.definitions['SC' + type] = Object.assign({}, schema.properties); + schema.definitions['SC' + type] = Object.assign({}, selfReference as any); + } + + if (!this.schemaValidator.validateSchema(schema)) { + throw new Error(`Generated schema for ${type} is invalid!`); } return schema;