From ad6b1cf641ad49898d5e0486cda204cb672fd978 Mon Sep 17 00:00:00 2001 From: Yann Renaudin Date: Sun, 8 Mar 2020 18:46:33 -0400 Subject: [PATCH] feat: generate json schema at build time. Validate yaml against json schema --- package.json | 7 +- src/core/parser/parser.spec.ts | 16 ++++- src/core/parser/parser.ts | 83 ++++++++++++--------- src/core/parser/parser.types.ts | 27 +++++++ src/core/parser/schema.json | 60 ++++++++++++++++ src/core/stateMachine.ts | 3 +- yarn.lock | 124 ++++++++++++-------------------- 7 files changed, 202 insertions(+), 118 deletions(-) create mode 100644 src/core/parser/parser.types.ts create mode 100644 src/core/parser/schema.json diff --git a/package.json b/package.json index 09b7f59..81dbf86 100644 --- a/package.json +++ b/package.json @@ -10,12 +10,13 @@ ], "scripts": { "start": "tsnd --respawn ./src/cli/index.ts", - "build": "run-p build:js build:types", + "build": "yarn generate-json-schema && run-p build:js build:types", "build:js": "TS_NODE_PROJECT=\"tsconfig.webpack.json\" webpack --mode=production", "build:types": "tsc -p tsconfig.prod.json --emitDeclarationOnly", "local": "yarn build && npm link && rm -rf package-lock.json", "test": "jest", - "semantic-release": "semantic-release" + "semantic-release": "semantic-release", + "generate-json-schema": "ts-json-schema-generator -p ./src/core/parser/parser.types.ts -t MatronDocument -o ./src/core/parser/schema.json" }, "release": { "branches": [ @@ -58,6 +59,7 @@ "npm-run-all": "^4.1.5", "semantic-release": "^17.0.4", "source-map-loader": "^0.2.4", + "ts-json-schema-generator": "^0.65.0", "ts-node-dev": "^1.0.0-pre.44", "typescript": "^3.7.5", "webpack": "^4.41.6", @@ -66,6 +68,7 @@ }, "dependencies": { "@reduxjs/toolkit": "^1.2.4", + "ajv": "^6.12.0", "chalk": "^3.0.0", "cross-spawn": "^7.0.1", "deepmerge": "^4.2.2", diff --git a/src/core/parser/parser.spec.ts b/src/core/parser/parser.spec.ts index 8e23e8e..c1b9724 100644 --- a/src/core/parser/parser.spec.ts +++ b/src/core/parser/parser.spec.ts @@ -1,4 +1,5 @@ -import { parser, evaluate, Command, toSpawnCommand } from './parser'; +import { loadMatronDocument, parser, lint, evaluate, toSpawnCommand } from './parser'; +import { Command } from './parser.types'; describe('parser', () => { it('should parse a YAML file to a command', () => { @@ -20,6 +21,19 @@ describe('parser', () => { expect(jobs.length).toEqual(1); expect(jobs[0]).toEqual({ key, name, steps: [{ cmd, args }] }); }); + + it('should throw when yaml linter fails', () => { + const yaml = ` + jobs: + a-job: + steps: + - UNKNOWN_COMMAND: 12 + `; + + const doc = loadMatronDocument(yaml); + const fn = () => lint(doc); + expect(fn).toThrow(); + }); }); describe('evaluate', () => { diff --git a/src/core/parser/parser.ts b/src/core/parser/parser.ts index a013239..437f62c 100644 --- a/src/core/parser/parser.ts +++ b/src/core/parser/parser.ts @@ -1,56 +1,69 @@ import yaml from 'js-yaml'; import { readFileSync } from 'fs'; import { morphism, createSchema } from 'morphism'; - -export interface Command { - cmd: keyof typeof CommandType; - args: string[]; -} - -export enum CommandType { - COPY = 'COPY', - RUN = 'RUN', - WORKDIR = 'WORKDIR', - MERGE_JSON = 'MERGE_JSON' -} +import Ajv, { ValidationError } from 'ajv'; +import fse from 'fs-extra'; +import path from 'path'; +import jsonSchema from './schema.json'; +import { Command, CommandType, Job, MatronDocumentJobStep, MatronDocument } from './parser.types.js'; export function loadFile(path: string) { return Promise.resolve(readFileSync(path, 'utf8')); } - -export interface Job { - key: string; - name?: string; - steps: Command[]; -} - -type YamlDocStep = { [key: string]: string }; -interface YamlDoc { - jobs: { [key: string]: { name?: string; steps: YamlDocStep[] } }; -} - const toCommand = morphism( - createSchema({ + createSchema({ cmd: step => { return Object.keys(step)[0] as CommandType; }, - args: step => Object.values(step)[0].split(' ') + args: step => { + const argsStr = Object.values(step)[0]; + if (argsStr) { + const args = argsStr.split(' '); + return args; + } else { + return []; + } + } }) ); -export function parser(content: string): Job[] { + +export function loadMatronDocument(content: string): MatronDocument { try { - const doc: YamlDoc = yaml.safeLoad(content); - return Object.entries(doc.jobs).map(([key, job]) => { - return { - key, - name: job.name, - steps: toCommand(job.steps) - }; - }); + return yaml.safeLoad(content); } catch (error) { throw error; } } +export function parser(content: string): Job[] { + const doc = loadMatronDocument(content); + lint(doc); + return Object.entries(doc.jobs).map(([key, job]) => { + return { + key, + name: job.name, + steps: toCommand(job.steps) + }; + }); +} + +export function lint(doc: MatronDocument) { + const ajv = new Ajv(); + const validate = ajv.compile(jsonSchema); + const isValid = validate(doc); + if (!isValid) { + throw new LinterError(validate.errors!); + } +} + +class LinterError extends Error { + constructor(errors: Ajv.ErrorObject[]) { + const message = ` +Unable to validate the Matron file. + Errors: ${JSON.stringify(errors, null, 2)} + `; + super(message); + } +} function getCommandParameters(commandString: string) { const regex = /\${(?\w+)}/gm; diff --git a/src/core/parser/parser.types.ts b/src/core/parser/parser.types.ts new file mode 100644 index 0000000..0ae7e17 --- /dev/null +++ b/src/core/parser/parser.types.ts @@ -0,0 +1,27 @@ +export interface Job { + key: string; + name?: string; + steps: Command[]; +} + +export interface Command { + cmd: keyof typeof CommandType; + args: string[]; +} + +export enum CommandType { + COPY = 'COPY', + RUN = 'RUN', + WORKDIR = 'WORKDIR', + MERGE_JSON = 'MERGE_JSON' +} + +export type MatronDocumentJobStep = { [key in CommandType]?: string }; +export interface MatronDocumentJob { + name?: string; + steps: MatronDocumentJobStep[]; +} +export type MatronDocumentJobs = { [key: string]: MatronDocumentJob }; +export interface MatronDocument { + jobs: MatronDocumentJobs; +} diff --git a/src/core/parser/schema.json b/src/core/parser/schema.json new file mode 100644 index 0000000..d999e03 --- /dev/null +++ b/src/core/parser/schema.json @@ -0,0 +1,60 @@ +{ + "$ref": "#/definitions/MatronDocument", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "MatronDocument": { + "additionalProperties": false, + "properties": { + "jobs": { + "$ref": "#/definitions/MatronDocumentJobs" + } + }, + "required": [ + "jobs" + ], + "type": "object" + }, + "MatronDocumentJob": { + "additionalProperties": false, + "properties": { + "name": { + "type": "string" + }, + "steps": { + "items": { + "$ref": "#/definitions/MatronDocumentJobStep" + }, + "type": "array" + } + }, + "required": [ + "steps" + ], + "type": "object" + }, + "MatronDocumentJobStep": { + "additionalProperties": false, + "properties": { + "COPY": { + "type": "string" + }, + "MERGE_JSON": { + "type": "string" + }, + "RUN": { + "type": "string" + }, + "WORKDIR": { + "type": "string" + } + }, + "type": "object" + }, + "MatronDocumentJobs": { + "additionalProperties": { + "$ref": "#/definitions/MatronDocumentJob" + }, + "type": "object" + } + } +} \ No newline at end of file diff --git a/src/core/stateMachine.ts b/src/core/stateMachine.ts index e1b58ad..21eb3a0 100644 --- a/src/core/stateMachine.ts +++ b/src/core/stateMachine.ts @@ -1,12 +1,13 @@ import { interpret, createMachine, assign, actions } from 'xstate'; import { createAction } from '@reduxjs/toolkit'; -import { Command, CommandType, parser, loadFile, evaluate, toSpawnCommand } from './parser/parser'; +import { parser, loadFile, evaluate, toSpawnCommand } from './parser/parser'; import spawn from 'cross-spawn'; import uuidv4 from 'uuid/v4'; import merge from 'deepmerge'; import path from 'path'; import fs from 'fs'; import fse from 'fs-extra'; +import { Command, CommandType } from './parser/parser.types'; const { log } = actions; diff --git a/yarn.lock b/yarn.lock index 71f1109..20376c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1270,6 +1270,11 @@ resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-3.12.2.tgz#a35a1809c33a68200fb6403d1ad708363c56470a" integrity sha512-0CFu/g4mDSNkodVwWijdlr8jH7RoplRWNgovjFLEZeT+QEbbZXjBmCe3HwaWheAlCbHwomTwzZoSedeOycABug== +"@types/json-schema@^7.0.4": + version "7.0.4" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339" + integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== + "@types/node@*", "@types/node@>= 8", "@types/node@^13.7.1": version "13.9.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-13.9.0.tgz#5b6ee7a77faacddd7de719017d0bc12f52f81589" @@ -1610,7 +1615,7 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.10.2, ajv@^6.5.5: +ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: version "6.12.0" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== @@ -2519,6 +2524,11 @@ commander@^2.20.0, commander@~2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@~4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2858,14 +2868,14 @@ debug@^2.2.0, debug@^2.3.3: dependencies: ms "2.0.0" -debug@^3.1.0, debug@^3.2.6: +debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= @@ -2972,11 +2982,6 @@ detect-indent@~5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" @@ -3821,7 +3826,7 @@ glob-parent@^5.1.0: dependencies: is-glob "^4.0.1" -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -4127,7 +4132,7 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: +iconv-lite@0.4.24, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4202,7 +4207,7 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= @@ -5105,6 +5110,13 @@ json-schema@0.2.3: resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -5131,6 +5143,11 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -5453,11 +5470,6 @@ lockfile@^1.0.4: dependencies: signal-exit "^3.0.2" -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw= - lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -5466,33 +5478,11 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4= - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI= - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM= - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY= -lodash._getnative@*, lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= - lodash._root@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" @@ -5528,11 +5518,6 @@ lodash.isstring@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= -lodash.restparam@*: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU= - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -6021,15 +6006,6 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= -needle@^2.2.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.3.3.tgz#a041ad1d04a871b0ebb666f40baaf1fb47867117" - integrity sha512-EkY0GeSq87rWp1hoq/sH/wnTWgFVhYlnIkbJ0YJFfRgEFlz2RraCjBpFQ+vrEgEdp0ThfyHADmkChEhcb7PKyw== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" @@ -6144,22 +6120,6 @@ node-notifier@^6.0.0: shellwords "^0.1.1" which "^1.3.1" -node-pre-gyp@*: - version "0.14.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83" - integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4.4.2" - node-releases@^1.1.50: version "1.1.50" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.50.tgz#803c40d2c45db172d0410e4efec83aa8c6ad0592" @@ -6263,7 +6223,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: semver "^5.6.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.12, npm-packlist@^1.1.6, npm-packlist@^1.4.8: +npm-packlist@^1.1.12, npm-packlist@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e" integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A== @@ -6458,7 +6418,7 @@ npm@^6.10.3: worker-farm "^1.7.0" write-file-atomic "^2.4.3" -npmlog@^4.0.2, npmlog@^4.1.2, npmlog@~4.1.2: +npmlog@^4.1.2, npmlog@~4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -7219,7 +7179,7 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8: +rc@^1.0.1, rc@^1.1.6, rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -7773,11 +7733,6 @@ sane@^4.0.3: minimist "^1.1.1" walker "~1.0.5" -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - saxes@^3.1.9: version "3.1.11" resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b" @@ -7847,7 +7802,7 @@ semver-regex@^2.0.0: resolved "https://registry.yarnpkg.com/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338" integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw== -"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1: +"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -8455,7 +8410,7 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tar@^4.4.10, tar@^4.4.12, tar@^4.4.13, tar@^4.4.2: +tar@^4.4.10, tar@^4.4.12, tar@^4.4.13: version "4.4.13" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== @@ -8678,6 +8633,17 @@ trim-off-newlines@^1.0.0: resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" integrity sha1-n5up2e+odkw4dpi8v+sshI8RrbM= +ts-json-schema-generator@^0.65.0: + version "0.65.0" + resolved "https://registry.yarnpkg.com/ts-json-schema-generator/-/ts-json-schema-generator-0.65.0.tgz#c167bda22c501740ee336d84d1052e3188e76a09" + integrity sha512-UbDmCc3NM8vsTTWnHDzwEJt0e0bK/LOIveHT7LeQ35YhgkGr/Y18b5NCEVGCv81LV1UszXvgEKbJV39gxAMXQA== + dependencies: + "@types/json-schema" "^7.0.4" + commander "~4.1.1" + glob "~7.1.6" + json-stable-stringify "^1.0.1" + typescript "~3.8.3" + ts-node-dev@^1.0.0-pre.44: version "1.0.0-pre.44" resolved "https://registry.yarnpkg.com/ts-node-dev/-/ts-node-dev-1.0.0-pre.44.tgz#2f4d666088481fb9c4e4f5bc8f15995bd8b06ecb" @@ -8783,7 +8749,7 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.7.5: +typescript@^3.7.5, typescript@~3.8.3: version "3.8.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==