├── .gitignore ├── .npmignore ├── CONTRIBUTING.md ├── README.md ├── img └── screenshot.png ├── package.json ├── rollup.config.js ├── scripts └── getDTS.js ├── src ├── index.ts ├── lib │ ├── LICENSE │ └── typescript-json-schema.ts └── vendor │ ├── ds │ └── createDesignSystem.d.ts │ ├── playground.d.ts │ ├── pluginUtils.d.ts │ ├── sandbox.d.ts │ ├── tsWorker.d.ts │ ├── typescript-vfs.d.ts │ └── utils.ts ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # TypeScript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # dotenv environment variables file 55 | .env 56 | 57 | # gatsby files 58 | .cache/ 59 | public 60 | 61 | # Mac files 62 | .DS_Store 63 | 64 | # Yarn 65 | yarn-error.log 66 | .pnp/ 67 | .pnp.js 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | dist 71 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | .gitignore 3 | rollup.config.jss 4 | !dist 5 | scripts 6 | .vscode 7 | yarn* 8 | tsconfig.json 9 | rollup* 10 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing to a TypeScript Playground Plugin 2 | 3 | ## Contributing 4 | 5 | You can use `yarn start` to set up both a copy of Rollup to generate the JS, and Serve to host it. 6 | 7 | ```sh 8 | yarn start 9 | ``` 10 | 11 | Then set up the TypeScript playground to connect to a dev plugin at `http://localhost:5000/`. 12 | 13 | #### Plugin API 14 | 15 | The plugin API is documented in the [interface PlaygroundPlugin in `./src/index.ts`](src/index.ts). 16 | 17 | Roughly: 18 | 19 | - There are a set of mounting and un-mounting functions which you can use to handle your UI in the sidebar 20 | - There are `modelChanged` methods, which are shortcuts to knowing when the code in monaco editor has changed 21 | 22 | ### Sandbox 23 | 24 | The plugins are passed copies of the TypeScript sandbox, which is a high level API wrapper to the [`monaco-editor`](https://microsoft.github.io/monaco-editor/). You can learn more about the sandbox on [the TypeScript website](http://www.typescriptlang.org/v2/dev/sandbox/). 25 | 26 | #### Rollup 27 | 28 | [Rollup](https://rollupjs.org) is a JavaScript bundler, that will take all of the TypeScript + JavaScript code you reference and then create an AMD bundle for it all. AMD bundles are used in Monaco, TypeScript Sandbox and the Playground - so, this is used for consistency with the rest of the ecosystem. 29 | 30 | ## Adding a dependency 31 | 32 | Because most node_modules expect to be running in node, you might have to do some work to get the dependency working on the web. 33 | 34 | The route to handle this is via rollup: 35 | 36 | - add a new dependency via `yarn add xyz` 37 | - import it into your `index.ts` 38 | - run `yarn build` - did it provide some error messages? 39 | - If it did, you may need to edit your `rollup.config.js`. 40 | - You could probably start by taking the [rollup config from `playground-plugin-tsquery`](https://github.com/orta/playground-plugin-tsquery/blob/master/rollup.config.js) and by adding any extra externals and globals. 41 | 42 | #### Serve 43 | 44 | [Serve](https://github.com/zeit/serve) is used to make a web-server for the dist folder. 45 | 46 | ## Deployment 47 | 48 | This module should be deployed to npm when you would like the world to see it, this may mean making your code handle a staging vs production environment (because the URLs will be different.) 49 | 50 | For example, this is how you can handle getting the URL for a CSS file which is included in your `dist` folder: 51 | 52 | ```ts 53 | const isDev = document.location.host.includes("localhost") 54 | const unpkgURL = "https://unpkg.com/typescript-playground-presentation-mode@latest/dist/slideshow.css" 55 | const cssHref = isDev ? "http://localhost:5000/slideshow.css" : unpkgURL 56 | ``` 57 | 58 | ### Post-Deploy 59 | 60 | Once this is deployed, you can test it on the TypeScript playground by passing in the name of your plugin on npm to the custom plugin box. This is effectively your staging environment. 61 | 62 | Once you're happy and it's polished, you can apply to have it in the default plugin list. 63 | 64 | ## Support 65 | 66 | Ask questions either on the TypeScript Website issues](https://github.com/microsoft/TypeScript-Website/issues), or in the [TypeScript Community Discord](https://discord.gg/typescript) - in the TypeScript Website channel. 67 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## TypeScript Playground Plugin 2 | 3 | 4 | 5 | This plugin uses a custom build of YousefED/typescript-json-schema (at commit 20a03a2 to output the JSON schema version of your exported interfaces/types from the Playground editor. 6 | 7 | 8 | ## Running this plugin 9 | 10 | - [Click this link](https://www.typescriptlang.org/play?install-plugin=playground-typescript-json-schema) to install 11 | 12 | or 13 | 14 | - Open up the TypeScript Playground 15 | - Go the "Plugins" in the sidebar 16 | - Look for "Plugins from npm" 17 | - Add "playground-typescript-json-schema" 18 | - Reload the browser 19 | 20 | Then it will show up as a tab in the sidebar. 21 | 22 | ## Contributing 23 | 24 | See [CONTRIBUTING.md](./CONTRIBUTING.md) for the full details, however, TLDR: 25 | 26 | ```sh 27 | git clone ... 28 | yarn install 29 | yarn start 30 | ``` 31 | 32 | Then tick the box for starting plugin development inside the TypeScript Playground. 33 | -------------------------------------------------------------------------------- /img/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/orta/playground-typescript-json-schema/f611a2852badf34aef7283e736bcc8431d027f32/img/screenshot.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "playground-typescript-json-schema", 3 | "version": "1.0.0", 4 | "main": "dist/index.js", 5 | "description": "Convert the exported types/interfaces in the Playground to JSON Schemas", 6 | "license": "MIT", 7 | "keywords": [ 8 | "playground-plugin", "json-schema", "typescript" 9 | ], 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/orta/playground-typescript-json-schema" 13 | }, 14 | "scripts": { 15 | "build": "rollup -c rollup.config.js", 16 | "compile": "tsc", 17 | "bootstrap": "node scripts/getDTS.js", 18 | "start": "concurrently -p \"[{name}]\" -n \"ROLLUP,SITE\" -c \"bgBlue.bold,bgMagenta.bold\" \"yarn rollup -c rollup.config.js --watch\" \"yarn serve dist\"", 19 | "prepublish": "yarn build", 20 | "postinstall": "yarn bootstrap && yarn build" 21 | }, 22 | "devDependencies": { 23 | "@rollup/plugin-commonjs": "^11.0.2", 24 | "@rollup/plugin-json": "^4.0.2", 25 | "@rollup/plugin-node-resolve": "^7.1.0", 26 | "@rollup/plugin-typescript": "^3.0.0", 27 | "@types/react": "^16.9.23", 28 | "concurrently": "^5.1.0", 29 | "monaco-editor": "^0.19.3", 30 | "node-fetch": "^2.6.0", 31 | "rollup": "^1.31.0", 32 | "rollup-plugin-external-globals": "^0.6.1", 33 | "serve": "^11.3.0", 34 | "typescript": "^4.3.5" 35 | }, 36 | "dependencies": { 37 | "@types/json-stable-stringify": "^1.0.33", 38 | "crypto-browserify": "^3.12.0", 39 | "js-md5": "^0.7.3", 40 | "json-stable-stringify": "^1.0.1", 41 | "rollup-plugin-ignore": "^1.0.9", 42 | "rollup-plugin-node-builtins": "^2.1.2", 43 | "tslib": "^1.10.0", 44 | "typescript-json-schema": "^0.50.1" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import typescript from "@rollup/plugin-typescript"; 2 | import node from "@rollup/plugin-node-resolve"; 3 | import commonjs from "@rollup/plugin-commonjs"; 4 | import json from "@rollup/plugin-json"; 5 | import ignore from "rollup-plugin-ignore"; 6 | import builtins from 'rollup-plugin-node-builtins'; 7 | 8 | // You can have more root bundles by extending this array 9 | const rootFiles = ["index.ts"]; 10 | import externalGlobals from "rollup-plugin-external-globals"; 11 | 12 | export default rootFiles.map(name => { 13 | /** @type { import("rollup").RollupOptions } */ 14 | const options = { 15 | input: `src/${name}`, 16 | external: ['typescript'], 17 | output: { 18 | paths: { 19 | "typescript":"typescript-sandbox/index", 20 | "fs.js":"typescript-sandbox/index", 21 | "path.js":"typescript-sandbox/index", 22 | }, 23 | name, 24 | dir: "dist", 25 | format: "amd" 26 | }, 27 | plugins: [ typescript({ tsconfig: "tsconfig.json" }), json(), ignore([ "ts-node", "fs"]) , externalGlobals({ typescript: "window.ts" }), commonjs(), node()] 28 | }; 29 | 30 | return options; 31 | }); -------------------------------------------------------------------------------- /scripts/getDTS.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | // Grab the DTS files from the TypeScript website 4 | // then do a bit of string manipulation in order to make it 5 | // compile without _all_ of the dependencies 6 | 7 | const nodeFetch = require("node-fetch").default 8 | const { writeFileSync, existsSync, mkdirSync } = require("fs") 9 | const { join } = require("path") 10 | 11 | const getFileAndStoreLocally = async (url, path, editFunc) => { 12 | const editingFunc = editFunc ? editFunc : text => text 13 | const packageJSON = await nodeFetch(url) 14 | const contents = await packageJSON.text() 15 | writeFileSync(join(__dirname, "..", path), editingFunc(contents), "utf8") 16 | } 17 | 18 | const go = async () => { 19 | const vendor = join("src", "vendor") 20 | const ds = join("src", "vendor", "ds") 21 | 22 | if (!existsSync(vendor)) mkdirSync(vendor) 23 | if (!existsSync(ds)) mkdirSync(ds) 24 | 25 | const host = "https://www.staging-typescript.org" 26 | 27 | // For playground-dev purposes 28 | // const host = "http://localhost:8000"; 29 | 30 | // The API for the monaco typescript worker 31 | await getFileAndStoreLocally(host + "/js/sandbox/tsWorker.d.ts", join(vendor, "tsWorker.d.ts")) 32 | 33 | // The Design System DTS 34 | await getFileAndStoreLocally( 35 | host + "/js/playground/ds/createDesignSystem.d.ts", 36 | join(ds, "createDesignSystem.d.ts"), 37 | text => { 38 | const renameImport = text.replace("typescriptlang-org/static/js/sandbox", "../sandbox") 39 | return renameImport 40 | } 41 | ) 42 | 43 | // Util funcs 44 | await getFileAndStoreLocally(host + "/js/playground/pluginUtils.d.ts", join(vendor, "pluginUtils.d.ts"), text => { 45 | const renameImport = text.replace('from "@typescript/sandbox"', 'from "./sandbox"') 46 | return renameImport 47 | }) 48 | 49 | // TS-VFS 50 | await getFileAndStoreLocally( 51 | host + "/js/sandbox/vendor/typescript-vfs.d.ts", 52 | join(vendor, "typescript-vfs.d.ts"), 53 | text => { 54 | const removeImports = text.replace('/// ', "") 55 | const removedLZ = removeImports.replace('import("lz-string").LZStringStatic', "any") 56 | return removedLZ 57 | } 58 | ) 59 | 60 | // Sandbox 61 | await getFileAndStoreLocally(host + "/js/sandbox/index.d.ts", join(vendor, "sandbox.d.ts"), text => { 62 | const removeImports = text.replace(/^import/g, "// import").replace(/\nimport/g, "\n// import") 63 | const replaceTSVFS = removeImports.replace( 64 | '// import * as tsvfs from "./vendor/typescript-vfs"', 65 | "\nimport * as tsvfs from './typescript-vfs'" 66 | ) 67 | const removedLZ = replaceTSVFS.replace("lzstring: typeof lzstring", "// lzstring: typeof lzstring") 68 | const addedTsWorkerImport = 'import { TypeScriptWorker } from "./tsWorker";' + removedLZ 69 | return addedTsWorkerImport 70 | }) 71 | 72 | // Playground 73 | await getFileAndStoreLocally(host + "/js/playground/index.d.ts", join(vendor, "/playground.d.ts"), text => { 74 | const replaceSandbox = text.replace('"@typescript/sandbox"', '"./sandbox"') 75 | const replaceTSVFS = replaceSandbox.replace( 76 | /typescriptlang-org\/static\/js\/sandbox\/vendor\/typescript-vfs/g, 77 | "./typescript-vfs" 78 | ) 79 | const removedLZ = replaceTSVFS.replace("lzstring: typeof", "// lzstring: typeof") 80 | const removedWorker = removedLZ.replace("getWorkerProcess", "// getWorkerProcess") 81 | const removedUI = removedWorker.replace("ui:", "// ui:") 82 | return removedUI 83 | }) 84 | } 85 | 86 | go() 87 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import type { PlaygroundPlugin, PluginUtils } from "./vendor/playground"; 2 | import * as TJS from "./lib/typescript-json-schema"; 3 | 4 | const makePlugin = (utils: PluginUtils) => { 5 | const customPlugin: PlaygroundPlugin = { 6 | id: "json-schema", 7 | displayName: "JSON Schema", 8 | didMount: (sandbox, container) => { 9 | // Create a design system object to handle 10 | // making DOM elements which fit the playground (and handle mobile/light/dark etc) 11 | const ds = utils.createDesignSystem(container); 12 | 13 | ds.title("TS -> JSON Schema"); 14 | ds.p( 15 | "This plugin uses a custom build of YousefED/typescript-json-schema (at commit 20a03a2 to output the JSON schema version of your exported interfaces/types from the Playground editor." 16 | ); 17 | 18 | const startButton = document.createElement("input"); 19 | startButton.type = "button"; 20 | startButton.value = "Convert to JSON Schema"; 21 | container.appendChild(startButton); 22 | 23 | const div = document.createElement("div"); 24 | const codeDS = utils.createDesignSystem(div); 25 | container.appendChild(div); 26 | 27 | startButton.onclick = async () => { 28 | const settings: TJS.PartialArgs = { 29 | ignoreErrors: true, 30 | }; 31 | 32 | const program: any = await sandbox.createTSProgram(); 33 | // We can either get the schema for one file and one type... 34 | const schema = TJS.generateSchema(program, "*", settings); 35 | codeDS.clear(); 36 | codeDS.code(JSON.stringify(schema, null, " ")); 37 | }; 38 | }, 39 | 40 | modelChangedDebounce: async (_sandbox, _model) => { 41 | // Do some work with the new text 42 | }, 43 | 44 | // Gives you a chance to remove anything set up, 45 | // the container itself if wiped of children after this. 46 | didUnmount: () => { 47 | console.log("De-focusing plugin"); 48 | }, 49 | }; 50 | 51 | return customPlugin; 52 | }; 53 | 54 | export default makePlugin; 55 | -------------------------------------------------------------------------------- /src/lib/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016, typescript-json-schema contributors 2 | All rights reserved. 3 | 4 | Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 5 | 6 | 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 7 | 8 | 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 9 | 10 | 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 11 | 12 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 13 | -------------------------------------------------------------------------------- /src/lib/typescript-json-schema.ts: -------------------------------------------------------------------------------- 1 | // import * as glob from "glob"; 2 | import stringify from "json-stable-stringify"; 3 | // import * as path from "path"; 4 | import md5 from "js-md5"; 5 | import * as ts from "typescript"; 6 | import type { JSONSchema7 } from "json-schema"; 7 | export type { Program, CompilerOptions, Symbol } from "typescript"; 8 | 9 | // const vm = require("vm"); 10 | 11 | const REGEX_FILE_NAME_OR_SPACE = /(\bimport\(".*?"\)|".*?")\.| /g; 12 | const REGEX_TSCONFIG_NAME = /^.*\.json$/; 13 | const REGEX_TJS_JSDOC = /^-([\w]+)\s+(\S|\S[\s\S]*\S)\s*$/g; 14 | const REGEX_GROUP_JSDOC = /^[.]?([\w]+)\s+(\S|\S[\s\S]*\S)\s*$/g; 15 | /** 16 | * Resolve required file, his path and a property name, 17 | * pattern: require([file_path]).[property_name] 18 | * 19 | * the part ".[property_name]" is optional in the regex 20 | * 21 | * will match: 22 | * 23 | * require('./path.ts') 24 | * require('./path.ts').objectName 25 | * require("./path.ts") 26 | * require("./path.ts").objectName 27 | * require('@module-name') 28 | * 29 | * match[2] = file_path (a path to the file with quotes) 30 | * match[3] = (optional) property_name (a property name, exported in the file) 31 | * 32 | * for more details, see tests/require.test.ts 33 | */ 34 | const REGEX_REQUIRE = /^(\s+)?require\((\'@?[a-zA-Z0-9.\/_-]+\'|\"@?[a-zA-Z0-9.\/_-]+\")\)(\.([a-zA-Z0-9_$]+))?(\s+|$)/; 35 | const NUMERIC_INDEX_PATTERN = "^[0-9]+$"; 36 | 37 | export function getDefaultArgs(): Args { 38 | return { 39 | ref: true, 40 | aliasRef: false, 41 | topRef: false, 42 | titles: false, 43 | defaultProps: false, 44 | noExtraProps: false, 45 | propOrder: false, 46 | typeOfKeyword: false, 47 | required: false, 48 | strictNullChecks: false, 49 | ignoreErrors: false, 50 | out: "", 51 | validationKeywords: [], 52 | include: [], 53 | excludePrivate: false, 54 | uniqueNames: false, 55 | rejectDateType: false, 56 | id: "", 57 | defaultNumberType: "number", 58 | tsNodeRegister: false, 59 | }; 60 | } 61 | 62 | export type ValidationKeywords = { 63 | [prop: string]: boolean; 64 | }; 65 | 66 | export type Args = { 67 | ref: boolean; 68 | aliasRef: boolean; 69 | topRef: boolean; 70 | titles: boolean; 71 | defaultProps: boolean; 72 | noExtraProps: boolean; 73 | propOrder: boolean; 74 | typeOfKeyword: boolean; 75 | required: boolean; 76 | strictNullChecks: boolean; 77 | ignoreErrors: boolean; 78 | out: string; 79 | validationKeywords: string[]; 80 | include: string[]; 81 | excludePrivate: boolean; 82 | uniqueNames: boolean; 83 | rejectDateType: boolean; 84 | id: string; 85 | defaultNumberType: "number" | "integer"; 86 | tsNodeRegister: boolean; 87 | }; 88 | 89 | export type PartialArgs = Partial; 90 | 91 | export type PrimitiveType = number | boolean | string | null; 92 | 93 | type RedefinedFields = 94 | | "type" 95 | | "items" 96 | | "additionalItems" 97 | | "contains" 98 | | "properties" 99 | | "patternProperties" 100 | | "additionalProperties" 101 | | "dependencies" 102 | | "propertyNames" 103 | | "if" 104 | | "then" 105 | | "else" 106 | | "allOf" 107 | | "anyOf" 108 | | "oneOf" 109 | | "not" 110 | | "definitions"; 111 | export type DefinitionOrBoolean = Definition | boolean; 112 | export interface Definition extends Omit { 113 | // The type field here is incompatible with the standard definition 114 | type?: string | string[]; 115 | 116 | // Non-standard fields 117 | propertyOrder?: string[]; 118 | defaultProperties?: string[]; 119 | typeof?: "function"; 120 | 121 | // Fields that must be redefined because they make use of this definition itself 122 | items?: DefinitionOrBoolean | DefinitionOrBoolean[]; 123 | additionalItems?: DefinitionOrBoolean; 124 | contains?: JSONSchema7; 125 | properties?: { 126 | [key: string]: DefinitionOrBoolean; 127 | }; 128 | patternProperties?: { 129 | [key: string]: DefinitionOrBoolean; 130 | }; 131 | additionalProperties?: DefinitionOrBoolean; 132 | dependencies?: { 133 | [key: string]: DefinitionOrBoolean | string[]; 134 | }; 135 | propertyNames?: DefinitionOrBoolean; 136 | if?: DefinitionOrBoolean; 137 | then?: DefinitionOrBoolean; 138 | else?: DefinitionOrBoolean; 139 | allOf?: DefinitionOrBoolean[]; 140 | anyOf?: DefinitionOrBoolean[]; 141 | oneOf?: DefinitionOrBoolean[]; 142 | not?: DefinitionOrBoolean; 143 | definitions?: { 144 | [key: string]: DefinitionOrBoolean; 145 | }; 146 | } 147 | 148 | export type SymbolRef = { 149 | name: string; 150 | typeName: string; 151 | fullyQualifiedName: string; 152 | symbol: ts.Symbol; 153 | }; 154 | 155 | function extend(target: any, ..._: any[]): any { 156 | if (target == null) { 157 | // TypeError if undefined or null 158 | throw new TypeError("Cannot convert undefined or null to object"); 159 | } 160 | 161 | const to = Object(target); 162 | 163 | for (var index = 1; index < arguments.length; index++) { 164 | const nextSource = arguments[index]; 165 | 166 | if (nextSource != null) { 167 | // Skip over if undefined or null 168 | for (const nextKey in nextSource) { 169 | // Avoid bugs when hasOwnProperty is shadowed 170 | if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { 171 | to[nextKey] = nextSource[nextKey]; 172 | } 173 | } 174 | } 175 | } 176 | return to; 177 | } 178 | 179 | function unique(arr: string[]): string[] { 180 | const temp = {}; 181 | for (const e of arr) { 182 | temp[e] = true; 183 | } 184 | const r: string[] = []; 185 | for (const k in temp) { 186 | // Avoid bugs when hasOwnProperty is shadowed 187 | if (Object.prototype.hasOwnProperty.call(temp, k)) { 188 | r.push(k); 189 | } 190 | } 191 | return r; 192 | } 193 | 194 | /** 195 | * Resolve required file 196 | */ 197 | function resolveRequiredFile(symbol: ts.Symbol, key: string, fileName: string, objectName: string): any { 198 | const sourceFile = getSourceFile(symbol); 199 | const requiredFilePath = fileName // /^[.\/]+/.test(fileName) 200 | // ? fileName === "." 201 | // ? path.resolve(sourceFile.fileName) 202 | // : path.resolve(path.dirname(sourceFile.fileName), fileName) 203 | // : fileName; 204 | const requiredFile = require(requiredFilePath); 205 | if (!requiredFile) { 206 | throw Error("Required: File couldn't be loaded"); 207 | } 208 | const requiredObject = objectName ? requiredFile[objectName] : requiredFile.default; 209 | if (requiredObject === undefined) { 210 | throw Error("Required: Variable is undefined"); 211 | } 212 | if (typeof requiredObject === "function") { 213 | throw Error("Required: Can't use function as a variable"); 214 | } 215 | if (key === "examples" && !Array.isArray(requiredObject)) { 216 | throw Error("Required: Variable isn't an array"); 217 | } 218 | return requiredObject; 219 | } 220 | 221 | export function regexRequire(value: string) { 222 | return REGEX_REQUIRE.exec(value); 223 | } 224 | 225 | /** 226 | * Try to parse a value and returns the string if it fails. 227 | */ 228 | function parseValue(symbol: ts.Symbol, key: string, value: string): any { 229 | const match = regexRequire(value); 230 | if (match) { 231 | const fileName = match[2].substr(1, match[2].length - 2).trim(); 232 | const objectName = match[4]; 233 | return resolveRequiredFile(symbol, key, fileName, objectName); 234 | } 235 | try { 236 | return JSON.parse(value); 237 | } catch (error) { 238 | return value; 239 | } 240 | } 241 | 242 | function extractLiteralValue(typ: ts.Type): PrimitiveType | undefined { 243 | let str = (typ).value; 244 | if (str === undefined) { 245 | str = (typ as any).text; 246 | } 247 | if (typ.flags & ts.TypeFlags.StringLiteral) { 248 | return str as string; 249 | } else if (typ.flags & ts.TypeFlags.BooleanLiteral) { 250 | return (typ as any).intrinsicName === "true"; 251 | } else if (typ.flags & ts.TypeFlags.EnumLiteral) { 252 | // or .text for old TS 253 | const num = parseFloat(str as string); 254 | return isNaN(num) ? (str as string) : num; 255 | } else if (typ.flags & ts.TypeFlags.NumberLiteral) { 256 | return parseFloat(str as string); 257 | } 258 | return undefined; 259 | } 260 | 261 | /** 262 | * Checks whether a type is a tuple type. 263 | */ 264 | function resolveTupleType(propertyType: ts.Type): ts.TupleTypeNode | null { 265 | if ( 266 | !propertyType.getSymbol() && 267 | propertyType.getFlags() & ts.TypeFlags.Object && 268 | (propertyType).objectFlags & ts.ObjectFlags.Reference 269 | ) { 270 | return (propertyType as ts.TypeReference).target as any; 271 | } 272 | if ( 273 | !( 274 | propertyType.getFlags() & ts.TypeFlags.Object && 275 | (propertyType).objectFlags & ts.ObjectFlags.Tuple 276 | ) 277 | ) { 278 | return null; 279 | } 280 | return propertyType as any; 281 | } 282 | 283 | const simpleTypesAllowedProperties = { 284 | type: true, 285 | description: true, 286 | }; 287 | 288 | function addSimpleType(def: Definition, type: string): boolean { 289 | for (const k in def) { 290 | if (!simpleTypesAllowedProperties[k]) { 291 | return false; 292 | } 293 | } 294 | 295 | if (!def.type) { 296 | def.type = type; 297 | } else if (typeof def.type !== "string") { 298 | if ( 299 | !(def.type).every((val) => { 300 | return typeof val === "string"; 301 | }) 302 | ) { 303 | return false; 304 | } 305 | 306 | if (def.type.indexOf("null") === -1) { 307 | def.type.push("null"); 308 | } 309 | } else { 310 | if (typeof def.type !== "string") { 311 | return false; 312 | } 313 | 314 | if (def.type !== "null") { 315 | def.type = [def.type, "null"]; 316 | } 317 | } 318 | return true; 319 | } 320 | 321 | function makeNullable(def: Definition): Definition { 322 | if (!addSimpleType(def, "null")) { 323 | const union = def.oneOf || def.anyOf; 324 | if (union) { 325 | union.push({ type: "null" }); 326 | } else { 327 | const subdef = {}; 328 | for (var k in def) { 329 | if (def.hasOwnProperty(k)) { 330 | subdef[k] = def[k]; 331 | delete def[k]; 332 | } 333 | } 334 | def.anyOf = [subdef, { type: "null" }]; 335 | } 336 | } 337 | return def; 338 | } 339 | 340 | /** 341 | * Given a Symbol, returns a canonical Definition. That can be either: 342 | * 1) The Symbol's valueDeclaration parameter if defined, or 343 | * 2) The sole entry in the Symbol's declarations array, provided that array has a length of 1. 344 | * 345 | * valueDeclaration is listed as a required parameter in the definition of a Symbol, but I've 346 | * experienced crashes when it's undefined at runtime, which is the reason for this function's 347 | * existence. Not sure if that's a compiler API bug or what. 348 | */ 349 | function getCanonicalDeclaration(sym: ts.Symbol): ts.Declaration { 350 | if (sym.valueDeclaration !== undefined) { 351 | return sym.valueDeclaration; 352 | } else if (sym.declarations.length === 1) { 353 | return sym.declarations[0]; 354 | } 355 | 356 | throw new Error(`Symbol "${sym.name}" has no valueDeclaration and ${sym.declarations.length} declarations.`); 357 | } 358 | 359 | /** 360 | * Given a Symbol, finds the place it was declared and chases parent pointers until we find a 361 | * node where SyntaxKind === SourceFile. 362 | */ 363 | function getSourceFile(sym: ts.Symbol): ts.SourceFile { 364 | let currentDecl: ts.Node = getCanonicalDeclaration(sym); 365 | 366 | while (currentDecl.kind !== ts.SyntaxKind.SourceFile) { 367 | if (currentDecl.parent === undefined) { 368 | throw new Error(`Unable to locate source file for declaration "${sym.name}".`); 369 | } 370 | currentDecl = currentDecl.parent; 371 | } 372 | 373 | return currentDecl as ts.SourceFile; 374 | } 375 | 376 | /** 377 | * JSDoc keywords that should be used to annotate the JSON schema. 378 | * 379 | * Many of these validation keywords are defined here: http://json-schema.org/latest/json-schema-validation.html 380 | */ 381 | // prettier-ignore 382 | const validationKeywords = { 383 | multipleOf: true, // 6.1. 384 | maximum: true, // 6.2. 385 | exclusiveMaximum: true, // 6.3. 386 | minimum: true, // 6.4. 387 | exclusiveMinimum: true, // 6.5. 388 | maxLength: true, // 6.6. 389 | minLength: true, // 6.7. 390 | pattern: true, // 6.8. 391 | items: true, // 6.9. 392 | // additionalItems: true, // 6.10. 393 | maxItems: true, // 6.11. 394 | minItems: true, // 6.12. 395 | uniqueItems: true, // 6.13. 396 | contains: true, // 6.14. 397 | maxProperties: true, // 6.15. 398 | minProperties: true, // 6.16. 399 | // required: true, // 6.17. This is not required. It is auto-generated. 400 | // properties: true, // 6.18. This is not required. It is auto-generated. 401 | // patternProperties: true, // 6.19. 402 | additionalProperties: true, // 6.20. 403 | // dependencies: true, // 6.21. 404 | // propertyNames: true, // 6.22. 405 | enum: true, // 6.23. 406 | // const: true, // 6.24. 407 | type: true, // 6.25. 408 | // allOf: true, // 6.26. 409 | // anyOf: true, // 6.27. 410 | // oneOf: true, // 6.28. 411 | // not: true, // 6.29. 412 | examples: true, // Draft 6 (draft-handrews-json-schema-validation-01) 413 | 414 | ignore: true, 415 | description: true, 416 | format: true, 417 | default: true, 418 | $ref: true, 419 | id: true, 420 | $id: true, 421 | title: true 422 | }; 423 | 424 | /** 425 | * Subset of descriptive, non-type keywords that are permitted alongside a $ref. 426 | * Prior to JSON Schema draft 2019-09, $ref is a special keyword that doesn't 427 | * permit keywords alongside it, and so AJV may raise warnings if it encounters 428 | * any type-related keywords; see https://github.com/ajv-validator/ajv/issues/1121 429 | */ 430 | const annotationKeywords: { [k in keyof typeof validationKeywords]?: true } = { 431 | description: true, 432 | default: true, 433 | examples: true, 434 | // A JSDoc $ref annotation can appear as a $ref. 435 | $ref: true, 436 | }; 437 | 438 | const subDefinitions = { 439 | items: true, 440 | additionalProperties: true, 441 | contains: true, 442 | }; 443 | 444 | export class JsonSchemaGenerator { 445 | private tc: ts.TypeChecker; 446 | 447 | /** 448 | * Holds all symbols within a custom SymbolRef object, containing useful 449 | * information. 450 | */ 451 | private symbols: SymbolRef[]; 452 | /** 453 | * All types for declarations of classes, interfaces, enums, and type aliases 454 | * defined in all TS files. 455 | */ 456 | private allSymbols: { [name: string]: ts.Type }; 457 | /** 458 | * All symbols for declarations of classes, interfaces, enums, and type aliases 459 | * defined in non-default-lib TS files. 460 | */ 461 | private userSymbols: { [name: string]: ts.Symbol }; 462 | /** 463 | * Maps from the names of base types to the names of the types that inherit from 464 | * them. 465 | */ 466 | private inheritingTypes: { [baseName: string]: string[] }; 467 | 468 | /** 469 | * This map holds references to all reffed definitions, including schema 470 | * overrides and generated definitions. 471 | */ 472 | private reffedDefinitions: { [key: string]: Definition } = {}; 473 | 474 | /** 475 | * This map only holds explicit schema overrides. This helps differentiate between 476 | * user defined schema overrides and generated definitions. 477 | */ 478 | private schemaOverrides = new Map(); 479 | 480 | /** 481 | * This is a set of all the user-defined validation keywords. 482 | */ 483 | private userValidationKeywords: ValidationKeywords; 484 | 485 | /** 486 | * Types are assigned names which are looked up by their IDs. This is the 487 | * map from type IDs to type names. 488 | */ 489 | private typeNamesById: { [id: number]: string } = {}; 490 | /** 491 | * Whenever a type is assigned its name, its entry in this dictionary is set, 492 | * so that we don't give the same name to two separate types. 493 | */ 494 | private typeIdsByName: { [name: string]: number } = {}; 495 | 496 | constructor( 497 | symbols: SymbolRef[], 498 | allSymbols: { [name: string]: ts.Type }, 499 | userSymbols: { [name: string]: ts.Symbol }, 500 | inheritingTypes: { [baseName: string]: string[] }, 501 | tc: ts.TypeChecker, 502 | private args = getDefaultArgs() 503 | ) { 504 | this.symbols = symbols; 505 | this.allSymbols = allSymbols; 506 | this.userSymbols = userSymbols; 507 | this.inheritingTypes = inheritingTypes; 508 | this.tc = tc; 509 | this.userValidationKeywords = args.validationKeywords.reduce((acc, word) => ({ ...acc, [word]: true }), {}); 510 | } 511 | 512 | public get ReffedDefinitions(): { [key: string]: Definition } { 513 | return this.reffedDefinitions; 514 | } 515 | 516 | private isFromDefaultLib(symbol: ts.Symbol) { 517 | const declarations = symbol.getDeclarations(); 518 | if (declarations && declarations.length > 0) { 519 | return declarations[0].parent.getSourceFile().hasNoDefaultLib; 520 | } 521 | return false; 522 | } 523 | 524 | /** 525 | * Parse the comments of a symbol into the definition and other annotations. 526 | */ 527 | private parseCommentsIntoDefinition(symbol: ts.Symbol, definition: Definition, otherAnnotations: {}): void { 528 | if (!symbol) { 529 | return; 530 | } 531 | 532 | if (!this.isFromDefaultLib(symbol)) { 533 | // the comments for a symbol 534 | const comments = symbol.getDocumentationComment(this.tc); 535 | 536 | if (comments.length) { 537 | definition.description = comments 538 | .map((comment) => 539 | comment.kind === "lineBreak" ? comment.text : comment.text.trim().replace(/\r\n/g, "\n") 540 | ) 541 | .join(""); 542 | } 543 | } 544 | 545 | // jsdocs are separate from comments 546 | const jsdocs = symbol.getJsDocTags(); 547 | jsdocs.forEach((doc) => { 548 | // if we have @TJS-... annotations, we have to parse them 549 | let [name, text] = [doc.name, doc.text as any as string]; 550 | // In TypeScript versions prior to 3.7, it stops parsing the annotation 551 | // at the first non-alphanumeric character and puts the rest of the line as the 552 | // "text" of the annotation, so we have a little hack to check for the name 553 | // "TJS" and then we sort of re-parse the annotation to support prior versions 554 | // of TypeScript. 555 | if (name.startsWith("TJS-")) { 556 | name = name.slice(4); 557 | if (!text) { 558 | text = "true"; 559 | } 560 | } else if (name === "TJS" && text.startsWith("-")) { 561 | let match: string[] | RegExpExecArray | null = new RegExp(REGEX_TJS_JSDOC).exec(doc.text as any as string); 562 | if (match) { 563 | name = match[1]; 564 | text = match[2]; 565 | } else { 566 | // Treat empty text as boolean true 567 | name = (text as string).replace(/^[\s\-]+/, ""); 568 | text = "true"; 569 | } 570 | } 571 | 572 | // In TypeScript ~3.5, the annotation name splits at the dot character so we have 573 | // to process the "." and beyond from the value 574 | if (subDefinitions[name]) { 575 | const match: string[] | RegExpExecArray | null = new RegExp(REGEX_GROUP_JSDOC).exec(text); 576 | if (match) { 577 | const k = match[1]; 578 | const v = match[2]; 579 | definition[name] = { ...definition[name], [k]: v ? parseValue(symbol, k, v) : true }; 580 | return; 581 | } 582 | } 583 | 584 | // In TypeScript 3.7+, the "." is kept as part of the annotation name 585 | if (name.includes(".")) { 586 | const parts = name.split("."); 587 | if (parts.length === 2 && subDefinitions[parts[0]]) { 588 | definition[parts[0]] = { 589 | ...definition[parts[0]], 590 | [parts[1]]: text ? parseValue(symbol, name, text) : true, 591 | }; 592 | } 593 | } 594 | 595 | if (validationKeywords[name] || this.userValidationKeywords[name]) { 596 | definition[name] = text === undefined ? "" : parseValue(symbol, name, text); 597 | } else { 598 | // special annotations 599 | otherAnnotations[doc.name] = true; 600 | } 601 | }); 602 | } 603 | 604 | private getDefinitionForRootType( 605 | propertyType: ts.Type, 606 | reffedType: ts.Symbol, 607 | definition: Definition, 608 | defaultNumberType = this.args.defaultNumberType 609 | ): Definition { 610 | const tupleType = resolveTupleType(propertyType); 611 | 612 | if (tupleType) { 613 | // tuple 614 | const elemTypes: ts.NodeArray = (propertyType as any).typeArguments; 615 | const fixedTypes = elemTypes.map((elType) => this.getTypeDefinition(elType as any)); 616 | definition.type = "array"; 617 | definition.items = fixedTypes; 618 | const targetTupleType = (propertyType as ts.TupleTypeReference).target; 619 | definition.minItems = targetTupleType.minLength; 620 | if (targetTupleType.hasRestElement) { 621 | definition.additionalItems = fixedTypes[fixedTypes.length - 1]; 622 | fixedTypes.splice(fixedTypes.length - 1, 1); 623 | } else { 624 | definition.maxItems = targetTupleType.fixedLength; 625 | } 626 | } else { 627 | const propertyTypeString = this.tc.typeToString( 628 | propertyType, 629 | undefined, 630 | ts.TypeFormatFlags.UseFullyQualifiedType 631 | ); 632 | const flags = propertyType.flags; 633 | const arrayType = this.tc.getIndexTypeOfType(propertyType, ts.IndexKind.Number); 634 | 635 | if (flags & ts.TypeFlags.String) { 636 | definition.type = "string"; 637 | } else if (flags & ts.TypeFlags.Number) { 638 | const isInteger = 639 | definition.type === "integer" || 640 | reffedType?.getName() === "integer" || 641 | defaultNumberType === "integer"; 642 | definition.type = isInteger ? "integer" : "number"; 643 | } else if (flags & ts.TypeFlags.Boolean) { 644 | definition.type = "boolean"; 645 | } else if (flags & ts.TypeFlags.Null) { 646 | definition.type = "null"; 647 | } else if (flags & ts.TypeFlags.Undefined) { 648 | definition.type = "undefined"; 649 | } else if (flags & ts.TypeFlags.Any || flags & ts.TypeFlags.Unknown) { 650 | // no type restriction, so that anything will match 651 | } else if (propertyTypeString === "Date" && !this.args.rejectDateType) { 652 | definition.type = "string"; 653 | definition.format = "date-time"; 654 | } else if (propertyTypeString === "object") { 655 | definition.type = "object"; 656 | definition.properties = {}; 657 | definition.additionalProperties = true; 658 | } else { 659 | const value = extractLiteralValue(propertyType); 660 | if (value !== undefined) { 661 | definition.type = typeof value; 662 | definition.enum = [value]; 663 | } else if (arrayType !== undefined) { 664 | if ( 665 | propertyType.flags & ts.TypeFlags.Object && 666 | (propertyType as ts.ObjectType).objectFlags & 667 | (ts.ObjectFlags.Anonymous | ts.ObjectFlags.Interface | ts.ObjectFlags.Mapped) 668 | ) { 669 | definition.type = "object"; 670 | definition.additionalProperties = false; 671 | definition.patternProperties = { 672 | [NUMERIC_INDEX_PATTERN]: this.getTypeDefinition(arrayType), 673 | }; 674 | } else { 675 | definition.type = "array"; 676 | if (!definition.items) { 677 | definition.items = this.getTypeDefinition(arrayType); 678 | } 679 | } 680 | } else { 681 | // Report that type could not be processed 682 | const error = new TypeError("Unsupported type: " + propertyTypeString); 683 | (error as any).type = propertyType; 684 | throw error; 685 | // definition = this.getTypeDefinition(propertyType, tc); 686 | } 687 | } 688 | } 689 | 690 | return definition; 691 | } 692 | 693 | private getReferencedTypeSymbol(prop: ts.Symbol): ts.Symbol | undefined { 694 | const decl = prop.getDeclarations(); 695 | if (decl?.length) { 696 | const type = (decl[0]).type; 697 | if (type && type.kind & ts.SyntaxKind.TypeReference && type.typeName) { 698 | const symbol = this.tc.getSymbolAtLocation(type.typeName); 699 | if (symbol && symbol.flags & ts.SymbolFlags.Alias) { 700 | return this.tc.getAliasedSymbol(symbol); 701 | } 702 | return symbol; 703 | } 704 | } 705 | return undefined; 706 | } 707 | 708 | private getDefinitionForProperty(prop: ts.Symbol, node: ts.Node): Definition | null { 709 | if (prop.flags & ts.SymbolFlags.Method) { 710 | return null; 711 | } 712 | const propertyName = prop.getName(); 713 | const propertyType = this.tc.getTypeOfSymbolAtLocation(prop, node); 714 | 715 | const reffedType = this.getReferencedTypeSymbol(prop); 716 | 717 | const definition = this.getTypeDefinition(propertyType, undefined, undefined, prop, reffedType); 718 | 719 | if (this.args.titles) { 720 | definition.title = propertyName; 721 | } 722 | 723 | if (definition.hasOwnProperty("ignore")) { 724 | return null; 725 | } 726 | 727 | // try to get default value 728 | const valDecl = prop.valueDeclaration as ts.VariableDeclaration; 729 | if (valDecl?.initializer) { 730 | let initial = valDecl.initializer; 731 | 732 | while (ts.isTypeAssertion(initial)) { 733 | initial = initial.expression; 734 | } 735 | 736 | if ((initial).expression) { 737 | // node 738 | console.warn("initializer is expression for property " + propertyName); 739 | } else if ((initial).kind && (initial).kind === ts.SyntaxKind.NoSubstitutionTemplateLiteral) { 740 | definition.default = initial.getText(); 741 | } else { 742 | try { 743 | const sandbox = { sandboxvar: null as any }; 744 | eval("sandboxvar=" + initial.getText()); 745 | 746 | const val = sandbox.sandboxvar; 747 | if ( 748 | val === null || 749 | typeof val === "string" || 750 | typeof val === "number" || 751 | typeof val === "boolean" || 752 | Object.prototype.toString.call(val) === "[object Array]" 753 | ) { 754 | definition.default = val; 755 | } else if (val) { 756 | console.warn("unknown initializer for property " + propertyName + ": " + val); 757 | } 758 | } catch (e) { 759 | console.warn("exception evaluating initializer for property " + propertyName); 760 | } 761 | } 762 | } 763 | 764 | return definition; 765 | } 766 | 767 | private getEnumDefinition(clazzType: ts.Type, definition: Definition): Definition { 768 | const node = clazzType.getSymbol()!.getDeclarations()![0]; 769 | const fullName = this.tc.typeToString(clazzType, undefined, ts.TypeFormatFlags.UseFullyQualifiedType); 770 | const members: ts.NodeArray = 771 | node.kind === ts.SyntaxKind.EnumDeclaration 772 | ? (node as ts.EnumDeclaration).members 773 | : ts.createNodeArray([node as ts.EnumMember]); 774 | var enumValues: (number | boolean | string | null)[] = []; 775 | const enumTypes: string[] = []; 776 | 777 | const addType = (type: string) => { 778 | if (enumTypes.indexOf(type) === -1) { 779 | enumTypes.push(type); 780 | } 781 | }; 782 | 783 | members.forEach((member) => { 784 | const caseLabel = (member.name).text; 785 | const constantValue = this.tc.getConstantValue(member); 786 | if (constantValue !== undefined) { 787 | enumValues.push(constantValue); 788 | addType(typeof constantValue); 789 | } else { 790 | // try to extract the enums value; it will probably by a cast expression 791 | const initial: ts.Expression | undefined = member.initializer; 792 | if (initial) { 793 | if ((initial).expression) { 794 | // node 795 | const exp = (initial).expression; 796 | const text = (exp).text; 797 | // if it is an expression with a text literal, chances are it is the enum convention: 798 | // CASELABEL = 'literal' as any 799 | if (text) { 800 | enumValues.push(text); 801 | addType("string"); 802 | } else if (exp.kind === ts.SyntaxKind.TrueKeyword || exp.kind === ts.SyntaxKind.FalseKeyword) { 803 | enumValues.push(exp.kind === ts.SyntaxKind.TrueKeyword); 804 | addType("boolean"); 805 | } else { 806 | console.warn("initializer is expression for enum: " + fullName + "." + caseLabel); 807 | } 808 | } else if (initial.kind === ts.SyntaxKind.NoSubstitutionTemplateLiteral) { 809 | enumValues.push(initial.getText()); 810 | addType("string"); 811 | } else if (initial.kind === ts.SyntaxKind.NullKeyword) { 812 | enumValues.push(null); 813 | addType("null"); 814 | } 815 | } 816 | } 817 | }); 818 | 819 | if (enumTypes.length) { 820 | definition.type = enumTypes.length === 1 ? enumTypes[0] : enumTypes; 821 | } 822 | 823 | if (enumValues.length > 0) { 824 | definition.enum = enumValues.sort(); 825 | } 826 | 827 | return definition; 828 | } 829 | 830 | private getUnionDefinition( 831 | unionType: ts.UnionType, 832 | prop: ts.Symbol, 833 | unionModifier: string, 834 | definition: Definition 835 | ): Definition { 836 | const enumValues: PrimitiveType[] = []; 837 | const simpleTypes: string[] = []; 838 | const schemas: Definition[] = []; 839 | 840 | const pushSimpleType = (type: string) => { 841 | if (simpleTypes.indexOf(type) === -1) { 842 | simpleTypes.push(type); 843 | } 844 | }; 845 | 846 | const pushEnumValue = (val: PrimitiveType) => { 847 | if (enumValues.indexOf(val) === -1) { 848 | enumValues.push(val); 849 | } 850 | }; 851 | 852 | for (const valueType of unionType.types) { 853 | const value = extractLiteralValue(valueType); 854 | if (value !== undefined) { 855 | pushEnumValue(value); 856 | } else { 857 | const def = this.getTypeDefinition(valueType); 858 | if (def.type === "undefined") { 859 | if (prop) { 860 | (prop).mayBeUndefined = true; 861 | } 862 | } else { 863 | const keys = Object.keys(def); 864 | if (keys.length === 1 && keys[0] === "type") { 865 | if (typeof def.type !== "string") { 866 | console.error("Expected only a simple type."); 867 | } else { 868 | pushSimpleType(def.type); 869 | } 870 | } else { 871 | schemas.push(def); 872 | } 873 | } 874 | } 875 | } 876 | 877 | if (enumValues.length > 0) { 878 | // If the values are true and false, just add "boolean" as simple type 879 | const isOnlyBooleans = 880 | enumValues.length === 2 && 881 | typeof enumValues[0] === "boolean" && 882 | typeof enumValues[1] === "boolean" && 883 | enumValues[0] !== enumValues[1]; 884 | 885 | if (isOnlyBooleans) { 886 | pushSimpleType("boolean"); 887 | } else { 888 | const enumSchema: Definition = { enum: enumValues.sort() }; 889 | 890 | // If all values are of the same primitive type, add a "type" field to the schema 891 | if ( 892 | enumValues.every((x) => { 893 | return typeof x === "string"; 894 | }) 895 | ) { 896 | enumSchema.type = "string"; 897 | } else if ( 898 | enumValues.every((x) => { 899 | return typeof x === "number"; 900 | }) 901 | ) { 902 | enumSchema.type = "number"; 903 | } else if ( 904 | enumValues.every((x) => { 905 | return typeof x === "boolean"; 906 | }) 907 | ) { 908 | enumSchema.type = "boolean"; 909 | } 910 | 911 | schemas.push(enumSchema); 912 | } 913 | } 914 | 915 | if (simpleTypes.length > 0) { 916 | schemas.push({ type: simpleTypes.length === 1 ? simpleTypes[0] : simpleTypes }); 917 | } 918 | 919 | if (schemas.length === 1) { 920 | for (const k in schemas[0]) { 921 | if (schemas[0].hasOwnProperty(k)) { 922 | definition[k] = schemas[0][k]; 923 | } 924 | } 925 | } else { 926 | definition[unionModifier] = schemas; 927 | } 928 | return definition; 929 | } 930 | 931 | private getIntersectionDefinition(intersectionType: ts.IntersectionType, definition: Definition): Definition { 932 | const simpleTypes: string[] = []; 933 | const schemas: Definition[] = []; 934 | 935 | const pushSimpleType = (type: string) => { 936 | if (simpleTypes.indexOf(type) === -1) { 937 | simpleTypes.push(type); 938 | } 939 | }; 940 | 941 | for (const intersectionMember of intersectionType.types) { 942 | const def = this.getTypeDefinition(intersectionMember); 943 | if (def.type === "undefined") { 944 | console.error("Undefined in intersection makes no sense."); 945 | } else { 946 | const keys = Object.keys(def); 947 | if (keys.length === 1 && keys[0] === "type") { 948 | if (typeof def.type !== "string") { 949 | console.error("Expected only a simple type."); 950 | } else { 951 | pushSimpleType(def.type); 952 | } 953 | } else { 954 | schemas.push(def); 955 | } 956 | } 957 | } 958 | 959 | if (simpleTypes.length > 0) { 960 | schemas.push({ type: simpleTypes.length === 1 ? simpleTypes[0] : simpleTypes }); 961 | } 962 | 963 | if (schemas.length === 1) { 964 | for (const k in schemas[0]) { 965 | if (schemas[0].hasOwnProperty(k)) { 966 | definition[k] = schemas[0][k]; 967 | } 968 | } 969 | } else { 970 | definition.allOf = schemas; 971 | } 972 | return definition; 973 | } 974 | 975 | private getClassDefinition(clazzType: ts.Type, definition: Definition): Definition { 976 | const node = clazzType.getSymbol()!.getDeclarations()![0]; 977 | 978 | // Example: typeof globalThis may not have any declaration 979 | if (!node) { 980 | definition.type = "object"; 981 | return definition; 982 | } 983 | 984 | if (this.args.typeOfKeyword && node.kind === ts.SyntaxKind.FunctionType) { 985 | definition.typeof = "function"; 986 | return definition; 987 | } 988 | 989 | const clazz = node; 990 | const props = this.tc.getPropertiesOfType(clazzType).filter((prop) => { 991 | // filter never 992 | const propertyType = this.tc.getTypeOfSymbolAtLocation(prop, node); 993 | if (ts.TypeFlags.Never === propertyType.getFlags()) { 994 | return false; 995 | } 996 | if (!this.args.excludePrivate) { 997 | return true; 998 | } 999 | 1000 | const decls = prop.declarations; 1001 | return !( 1002 | decls?.filter((decl) => { 1003 | const mods = decl.modifiers; 1004 | return mods && mods.filter((mod) => mod.kind === ts.SyntaxKind.PrivateKeyword).length > 0; 1005 | }).length > 0 1006 | ); 1007 | }); 1008 | const fullName = this.tc.typeToString(clazzType, undefined, ts.TypeFormatFlags.UseFullyQualifiedType); 1009 | 1010 | const modifierFlags = ts.getCombinedModifierFlags(node); 1011 | 1012 | if (modifierFlags & ts.ModifierFlags.Abstract && this.inheritingTypes[fullName]) { 1013 | const oneOf = this.inheritingTypes[fullName].map((typename) => { 1014 | return this.getTypeDefinition(this.allSymbols[typename]); 1015 | }); 1016 | 1017 | definition.oneOf = oneOf; 1018 | } else { 1019 | if (clazz.members) { 1020 | const indexSignatures = 1021 | clazz.members == null ? [] : clazz.members.filter((x) => x.kind === ts.SyntaxKind.IndexSignature); 1022 | if (indexSignatures.length === 1) { 1023 | // for case "array-types" 1024 | const indexSignature = indexSignatures[0] as ts.IndexSignatureDeclaration; 1025 | if (indexSignature.parameters.length !== 1) { 1026 | throw new Error("Not supported: IndexSignatureDeclaration parameters.length != 1"); 1027 | } 1028 | const indexSymbol: ts.Symbol = (indexSignature.parameters[0]).symbol; 1029 | const indexType = this.tc.getTypeOfSymbolAtLocation(indexSymbol, node); 1030 | const isStringIndexed = indexType.flags === ts.TypeFlags.String; 1031 | if (indexType.flags !== ts.TypeFlags.Number && !isStringIndexed) { 1032 | throw new Error( 1033 | "Not supported: IndexSignatureDeclaration with index symbol other than a number or a string" 1034 | ); 1035 | } 1036 | 1037 | const typ = this.tc.getTypeAtLocation(indexSignature.type!); 1038 | const def = this.getTypeDefinition(typ, undefined, "anyOf"); 1039 | 1040 | if (isStringIndexed) { 1041 | definition.type = "object"; 1042 | definition.additionalProperties = def; 1043 | } else { 1044 | definition.type = "array"; 1045 | if (!definition.items) { 1046 | definition.items = def; 1047 | } 1048 | } 1049 | } 1050 | } 1051 | 1052 | const propertyDefinitions = props.reduce((all, prop) => { 1053 | const propertyName = prop.getName(); 1054 | const propDef = this.getDefinitionForProperty(prop, node); 1055 | if (propDef != null) { 1056 | all[propertyName] = propDef; 1057 | } 1058 | return all; 1059 | }, {}); 1060 | 1061 | if (definition.type === undefined) { 1062 | definition.type = "object"; 1063 | } 1064 | 1065 | if (definition.type === "object" && Object.keys(propertyDefinitions).length > 0) { 1066 | definition.properties = propertyDefinitions; 1067 | } 1068 | 1069 | if (this.args.defaultProps) { 1070 | definition.defaultProperties = []; 1071 | } 1072 | if (this.args.noExtraProps && definition.additionalProperties === undefined) { 1073 | definition.additionalProperties = false; 1074 | } 1075 | if (this.args.propOrder) { 1076 | // propertyOrder is non-standard, but useful: 1077 | // https://github.com/json-schema/json-schema/issues/87 1078 | const propertyOrder = props.reduce((order: string[], prop: ts.Symbol) => { 1079 | order.push(prop.getName()); 1080 | return order; 1081 | }, []); 1082 | 1083 | definition.propertyOrder = propertyOrder; 1084 | } 1085 | if (this.args.required) { 1086 | const requiredProps = props.reduce((required: string[], prop: ts.Symbol) => { 1087 | const def = {}; 1088 | this.parseCommentsIntoDefinition(prop, def, {}); 1089 | if ( 1090 | !(prop.flags & ts.SymbolFlags.Optional) && 1091 | !(prop.flags & ts.SymbolFlags.Method) && 1092 | !(prop).mayBeUndefined && 1093 | !def.hasOwnProperty("ignore") 1094 | ) { 1095 | required.push(prop.getName()); 1096 | } 1097 | return required; 1098 | }, []); 1099 | 1100 | if (requiredProps.length > 0) { 1101 | definition.required = unique(requiredProps).sort(); 1102 | } 1103 | } 1104 | } 1105 | return definition; 1106 | } 1107 | 1108 | /** 1109 | * Gets/generates a globally unique type name for the given type 1110 | */ 1111 | private getTypeName(typ: ts.Type): string { 1112 | const id = (typ as any).id as number; 1113 | if (this.typeNamesById[id]) { 1114 | // Name already assigned? 1115 | return this.typeNamesById[id]; 1116 | } 1117 | return this.makeTypeNameUnique( 1118 | typ, 1119 | this.tc 1120 | .typeToString( 1121 | typ, 1122 | undefined, 1123 | ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.UseFullyQualifiedType 1124 | ) 1125 | .replace(REGEX_FILE_NAME_OR_SPACE, "") 1126 | ); 1127 | } 1128 | 1129 | private makeTypeNameUnique(typ: ts.Type, baseName: string): string { 1130 | const id = (typ as any).id as number; 1131 | 1132 | let name = baseName; 1133 | // If a type with same name exists 1134 | // Try appending "_1", "_2", etc. 1135 | for (let i = 1; this.typeIdsByName[name] !== undefined && this.typeIdsByName[name] !== id; ++i) { 1136 | name = baseName + "_" + i; 1137 | } 1138 | 1139 | this.typeNamesById[id] = name; 1140 | this.typeIdsByName[name] = id; 1141 | return name; 1142 | } 1143 | 1144 | private recursiveTypeRef = new Map(); 1145 | 1146 | private getTypeDefinition( 1147 | typ: ts.Type, 1148 | asRef = this.args.ref, 1149 | unionModifier: string = "anyOf", 1150 | prop?: ts.Symbol, 1151 | reffedType?: ts.Symbol, 1152 | pairedSymbol?: ts.Symbol 1153 | ): Definition { 1154 | const definition: Definition = {}; // real definition 1155 | 1156 | // Ignore any number of Readonly and Mutable type wrappings, since they only add and remove readonly modifiers on fields and JSON Schema is not concerned with mutability 1157 | while ( 1158 | typ.aliasSymbol && 1159 | (typ.aliasSymbol.escapedName === "Readonly" || typ.aliasSymbol.escapedName === "Mutable") && 1160 | typ.aliasTypeArguments && 1161 | typ.aliasTypeArguments[0] 1162 | ) { 1163 | typ = typ.aliasTypeArguments[0]; 1164 | reffedType = undefined; 1165 | } 1166 | 1167 | if ( 1168 | this.args.typeOfKeyword && 1169 | typ.flags & ts.TypeFlags.Object && 1170 | (typ).objectFlags & ts.ObjectFlags.Anonymous 1171 | ) { 1172 | definition.typeof = "function"; 1173 | return definition; 1174 | } 1175 | 1176 | let returnedDefinition = definition; // returned definition, may be a $ref 1177 | 1178 | // Parse property comments now to skip recursive if ignore. 1179 | if (prop) { 1180 | const defs = {}; 1181 | const others = {}; 1182 | this.parseCommentsIntoDefinition(prop, defs, others); 1183 | if (defs.hasOwnProperty("ignore")) { 1184 | return defs; 1185 | } 1186 | } 1187 | 1188 | const symbol = typ.getSymbol(); 1189 | // FIXME: We can't just compare the name of the symbol - it ignores the namespace 1190 | const isRawType = 1191 | !symbol || 1192 | // Window is incorrectly marked as rawType here for some reason 1193 | (this.tc.getFullyQualifiedName(symbol) !== "Window" && 1194 | (this.tc.getFullyQualifiedName(symbol) === "Date" || 1195 | symbol.name === "integer" || 1196 | this.tc.getIndexInfoOfType(typ, ts.IndexKind.Number) !== undefined)); 1197 | 1198 | // special case: an union where all child are string literals -> make an enum instead 1199 | let isStringEnum = false; 1200 | if (typ.flags & ts.TypeFlags.Union) { 1201 | const unionType = typ; 1202 | isStringEnum = unionType.types.every((propType) => { 1203 | return (propType.getFlags() & ts.TypeFlags.StringLiteral) !== 0; 1204 | }); 1205 | } 1206 | 1207 | // aliased types must be handled slightly different 1208 | const asTypeAliasRef = asRef && reffedType && (this.args.aliasRef || isStringEnum); 1209 | if (!asTypeAliasRef) { 1210 | if ( 1211 | isRawType || 1212 | (typ.getFlags() & ts.TypeFlags.Object && (typ).objectFlags & ts.ObjectFlags.Anonymous) 1213 | ) { 1214 | asRef = false; // raw types and inline types cannot be reffed, 1215 | // unless we are handling a type alias 1216 | // or it is recursive type - see below 1217 | } 1218 | } 1219 | 1220 | let fullTypeName = ""; 1221 | if (asTypeAliasRef) { 1222 | const typeName = this.tc 1223 | .getFullyQualifiedName( 1224 | reffedType!.getFlags() & ts.SymbolFlags.Alias ? this.tc.getAliasedSymbol(reffedType!) : reffedType! 1225 | ) 1226 | .replace(REGEX_FILE_NAME_OR_SPACE, ""); 1227 | if (this.args.uniqueNames && reffedType) { 1228 | const sourceFile = getSourceFile(reffedType); 1229 | const relativePath = sourceFile.fileName // path.relative(process.cwd(), sourceFile.fileName); 1230 | fullTypeName = `${typeName}.${generateHashOfNode(getCanonicalDeclaration(reffedType!), relativePath)}`; 1231 | } else { 1232 | fullTypeName = this.makeTypeNameUnique(typ, typeName); 1233 | } 1234 | } else { 1235 | // typ.symbol can be undefined 1236 | if (this.args.uniqueNames && typ.symbol) { 1237 | const sym = typ.symbol; 1238 | const sourceFile = getSourceFile(sym); 1239 | const relativePath = sourceFile.fileName// = path.relative(process.cwd(), sourceFile.fileName); 1240 | fullTypeName = `${this.getTypeName(typ)}.${generateHashOfNode( 1241 | getCanonicalDeclaration(sym), 1242 | relativePath 1243 | )}`; 1244 | } else if (reffedType && this.schemaOverrides.has(reffedType.escapedName as string)) { 1245 | fullTypeName = reffedType.escapedName as string; 1246 | } else { 1247 | fullTypeName = this.getTypeName(typ); 1248 | } 1249 | } 1250 | 1251 | // Handle recursive types 1252 | if (!isRawType || !!typ.aliasSymbol) { 1253 | if (this.recursiveTypeRef.has(fullTypeName)) { 1254 | asRef = true; 1255 | } else { 1256 | this.recursiveTypeRef.set(fullTypeName, definition); 1257 | } 1258 | } 1259 | 1260 | if (asRef) { 1261 | // We don't return the full definition, but we put it into 1262 | // reffedDefinitions below. 1263 | returnedDefinition = { 1264 | $ref: `${this.args.id}#/definitions/` + fullTypeName, 1265 | }; 1266 | } 1267 | 1268 | // Parse comments 1269 | const otherAnnotations = {}; 1270 | this.parseCommentsIntoDefinition(reffedType!, definition, otherAnnotations); // handle comments in the type alias declaration 1271 | this.parseCommentsIntoDefinition(symbol!, definition, otherAnnotations); 1272 | this.parseCommentsIntoDefinition(typ.aliasSymbol!, definition, otherAnnotations); 1273 | if (prop) { 1274 | this.parseCommentsIntoDefinition(prop, returnedDefinition, otherAnnotations); 1275 | } 1276 | if (pairedSymbol && symbol && this.isFromDefaultLib(symbol)) { 1277 | this.parseCommentsIntoDefinition(pairedSymbol, definition, otherAnnotations); 1278 | } 1279 | 1280 | // Create the actual definition only if is an inline definition, or 1281 | // if it will be a $ref and it is not yet created 1282 | if (!asRef || !this.reffedDefinitions[fullTypeName]) { 1283 | if (asRef) { 1284 | // must be here to prevent recursivity problems 1285 | let reffedDefinition: Definition; 1286 | if (asTypeAliasRef && reffedType && typ.symbol !== reffedType && symbol) { 1287 | reffedDefinition = this.getTypeDefinition(typ, true, undefined, symbol, symbol); 1288 | } else { 1289 | reffedDefinition = definition; 1290 | } 1291 | this.reffedDefinitions[fullTypeName] = reffedDefinition; 1292 | if (this.args.titles && fullTypeName) { 1293 | definition.title = fullTypeName; 1294 | } 1295 | } 1296 | const node = symbol?.getDeclarations() !== undefined ? symbol.getDeclarations()![0] : null; 1297 | 1298 | if (definition.type === undefined) { 1299 | // if users override the type, do not try to infer it 1300 | if (typ.flags & ts.TypeFlags.Union) { 1301 | this.getUnionDefinition(typ as ts.UnionType, prop!, unionModifier, definition); 1302 | } else if (typ.flags & ts.TypeFlags.Intersection) { 1303 | if (this.args.noExtraProps) { 1304 | // extend object instead of using allOf because allOf does not work well with additional properties. See #107 1305 | if (this.args.noExtraProps) { 1306 | definition.additionalProperties = false; 1307 | } 1308 | 1309 | const types = (typ).types; 1310 | for (const member of types) { 1311 | const other = this.getTypeDefinition(member, false); 1312 | definition.type = other.type; // should always be object 1313 | definition.properties = { 1314 | ...definition.properties, 1315 | ...other.properties, 1316 | }; 1317 | if (Object.keys(other.default || {}).length > 0) { 1318 | definition.default = extend(definition.default || {}, other.default); 1319 | } 1320 | if (other.required) { 1321 | definition.required = unique((definition.required || []).concat(other.required)).sort(); 1322 | } 1323 | } 1324 | } else { 1325 | this.getIntersectionDefinition(typ as ts.IntersectionType, definition); 1326 | } 1327 | } else if (isRawType) { 1328 | if (pairedSymbol) { 1329 | this.parseCommentsIntoDefinition(pairedSymbol, definition, {}); 1330 | } 1331 | this.getDefinitionForRootType(typ, reffedType!, definition); 1332 | } else if ( 1333 | node && 1334 | (node.kind === ts.SyntaxKind.EnumDeclaration || node.kind === ts.SyntaxKind.EnumMember) 1335 | ) { 1336 | this.getEnumDefinition(typ, definition); 1337 | } else if ( 1338 | symbol && 1339 | symbol.flags & ts.SymbolFlags.TypeLiteral && 1340 | symbol.members!.size === 0 && 1341 | !(node && node.kind === ts.SyntaxKind.MappedType) 1342 | ) { 1343 | // {} is TypeLiteral with no members. Need special case because it doesn't have declarations. 1344 | definition.type = "object"; 1345 | definition.properties = {}; 1346 | } else { 1347 | this.getClassDefinition(typ, definition); 1348 | } 1349 | } 1350 | } 1351 | 1352 | if (this.recursiveTypeRef.get(fullTypeName) === definition) { 1353 | this.recursiveTypeRef.delete(fullTypeName); 1354 | // If the type was recursive (there is reffedDefinitions) - lets replace it to reference 1355 | if (this.reffedDefinitions[fullTypeName]) { 1356 | const annotations = Object.entries(returnedDefinition).reduce((acc, [key, value]) => { 1357 | if (annotationKeywords[key] && typeof value !== undefined) { 1358 | acc[key] = value; 1359 | } 1360 | return acc; 1361 | }, {}); 1362 | 1363 | returnedDefinition = { 1364 | $ref: `${this.args.id}#/definitions/` + fullTypeName, 1365 | ...annotations, 1366 | }; 1367 | } 1368 | } 1369 | 1370 | if (otherAnnotations["nullable"]) { 1371 | makeNullable(returnedDefinition); 1372 | } 1373 | 1374 | return returnedDefinition; 1375 | } 1376 | 1377 | public setSchemaOverride(symbolName: string, schema: Definition): void { 1378 | this.reffedDefinitions[symbolName] = schema; 1379 | this.schemaOverrides.set(symbolName, schema); 1380 | } 1381 | 1382 | public getSchemaForSymbol(symbolName: string, includeReffedDefinitions: boolean = true): Definition { 1383 | if (!this.allSymbols[symbolName]) { 1384 | throw new Error(`type ${symbolName} not found`); 1385 | } 1386 | const def = this.getTypeDefinition( 1387 | this.allSymbols[symbolName], 1388 | this.args.topRef, 1389 | undefined, 1390 | undefined, 1391 | undefined, 1392 | this.userSymbols[symbolName] || undefined 1393 | ); 1394 | 1395 | if (this.args.ref && includeReffedDefinitions && Object.keys(this.reffedDefinitions).length > 0) { 1396 | def.definitions = this.reffedDefinitions; 1397 | } 1398 | def["$schema"] = "http://json-schema.org/draft-07/schema#"; 1399 | const id = this.args.id; 1400 | if (id) { 1401 | def["$id"] = this.args.id; 1402 | } 1403 | return def; 1404 | } 1405 | 1406 | public getSchemaForSymbols(symbolNames: string[], includeReffedDefinitions: boolean = true): Definition { 1407 | const root = { 1408 | $schema: "http://json-schema.org/draft-07/schema#", 1409 | definitions: {}, 1410 | }; 1411 | const id = this.args.id; 1412 | 1413 | if (id) { 1414 | root["$id"] = id; 1415 | } 1416 | 1417 | for (const symbolName of symbolNames) { 1418 | root.definitions[symbolName] = this.getTypeDefinition( 1419 | this.allSymbols[symbolName], 1420 | this.args.topRef, 1421 | undefined, 1422 | undefined, 1423 | undefined, 1424 | this.userSymbols[symbolName] 1425 | ); 1426 | } 1427 | if (this.args.ref && includeReffedDefinitions && Object.keys(this.reffedDefinitions).length > 0) { 1428 | root.definitions = { ...root.definitions, ...this.reffedDefinitions }; 1429 | } 1430 | return root; 1431 | } 1432 | 1433 | public getSymbols(name?: string): SymbolRef[] { 1434 | if (name === void 0) { 1435 | return this.symbols; 1436 | } 1437 | 1438 | return this.symbols.filter((symbol) => symbol.typeName === name); 1439 | } 1440 | 1441 | public getUserSymbols(): string[] { 1442 | return Object.keys(this.userSymbols); 1443 | } 1444 | 1445 | public getMainFileSymbols(program: ts.Program, onlyIncludeFiles?: string[]): string[] { 1446 | function includeFile(file: ts.SourceFile): boolean { 1447 | if (onlyIncludeFiles === undefined) { 1448 | return !file.isDeclarationFile; 1449 | } 1450 | return onlyIncludeFiles.indexOf(file.fileName) >= 0; 1451 | } 1452 | const files = program.getSourceFiles().filter(includeFile); 1453 | if (files.length) { 1454 | return Object.keys(this.userSymbols).filter((key) => { 1455 | const symbol = this.userSymbols[key]; 1456 | if (!symbol || !symbol.declarations || !symbol.declarations.length) { 1457 | return false; 1458 | } 1459 | let node: ts.Node = symbol.declarations[0]; 1460 | while (node?.parent) { 1461 | node = node.parent; 1462 | } 1463 | return files.indexOf(node.getSourceFile()) > -1; 1464 | }); 1465 | } 1466 | return []; 1467 | } 1468 | } 1469 | 1470 | export function getProgramFromFiles( 1471 | files: string[], 1472 | jsonCompilerOptions: any = {}, 1473 | basePath: string = "./" 1474 | ): ts.Program { 1475 | // use built-in default options 1476 | const compilerOptions = ts.convertCompilerOptionsFromJson(jsonCompilerOptions, basePath).options; 1477 | const options: ts.CompilerOptions = { 1478 | noEmit: true, 1479 | emitDecoratorMetadata: true, 1480 | experimentalDecorators: true, 1481 | target: ts.ScriptTarget.ES5, 1482 | module: ts.ModuleKind.CommonJS, 1483 | allowUnusedLabels: true, 1484 | }; 1485 | for (const k in compilerOptions) { 1486 | if (compilerOptions.hasOwnProperty(k)) { 1487 | options[k] = compilerOptions[k]; 1488 | } 1489 | } 1490 | return ts.createProgram(files, options); 1491 | } 1492 | 1493 | function generateHashOfNode(node: ts.Node, relativePath: string): string { 1494 | return md5.create().update(relativePath).update(node.pos.toString()).hex().substring(0, 8); 1495 | // return createHash("md5").update(relativePath).update(node.pos.toString()).digest("hex").substring(0, 8); 1496 | } 1497 | 1498 | export function buildGenerator( 1499 | program: ts.Program, 1500 | args: PartialArgs = {}, 1501 | onlyIncludeFiles?: string[] 1502 | ): JsonSchemaGenerator | null { 1503 | function isUserFile(file: ts.SourceFile): boolean { 1504 | if (onlyIncludeFiles === undefined) { 1505 | return !file.hasNoDefaultLib; 1506 | } 1507 | return onlyIncludeFiles.indexOf(file.fileName) >= 0; 1508 | } 1509 | // Use defaults unless otherwise specified 1510 | const settings = getDefaultArgs(); 1511 | 1512 | for (const pref in args) { 1513 | if (args.hasOwnProperty(pref)) { 1514 | settings[pref] = args[pref]; 1515 | } 1516 | } 1517 | 1518 | // if (args.tsNodeRegister) { 1519 | // require("ts-node/register"); 1520 | // } 1521 | 1522 | let diagnostics: ReadonlyArray = []; 1523 | 1524 | if (!args.ignoreErrors) { 1525 | diagnostics = ts.getPreEmitDiagnostics(program); 1526 | } 1527 | console.log("OK", diagnostics) 1528 | 1529 | if (diagnostics.length === 0) { 1530 | console.log("OK") 1531 | const typeChecker = program.getTypeChecker(); 1532 | 1533 | const symbols: SymbolRef[] = []; 1534 | const allSymbols: { [name: string]: ts.Type } = {}; 1535 | const userSymbols: { [name: string]: ts.Symbol } = {}; 1536 | const inheritingTypes: { [baseName: string]: string[] } = {}; 1537 | const workingDir = program.getCurrentDirectory(); 1538 | 1539 | program.getSourceFiles().forEach((sourceFile, _sourceFileIdx) => { 1540 | const relativePath = sourceFile.fileName // = path.relative(workingDir, sourceFile.fileName); 1541 | 1542 | function inspect(node: ts.Node, tc: ts.TypeChecker) { 1543 | if ( 1544 | node.kind === ts.SyntaxKind.ClassDeclaration || 1545 | node.kind === ts.SyntaxKind.InterfaceDeclaration || 1546 | node.kind === ts.SyntaxKind.EnumDeclaration || 1547 | node.kind === ts.SyntaxKind.TypeAliasDeclaration 1548 | ) { 1549 | const symbol: ts.Symbol = (node).symbol; 1550 | const nodeType = tc.getTypeAtLocation(node); 1551 | const fullyQualifiedName = tc.getFullyQualifiedName(symbol); 1552 | const typeName = fullyQualifiedName.replace(/".*"\./, ""); 1553 | const name = !args.uniqueNames ? typeName : `${typeName}.${generateHashOfNode(node, relativePath)}`; 1554 | 1555 | symbols.push({ name, typeName, fullyQualifiedName, symbol }); 1556 | if (!userSymbols[name]) { 1557 | allSymbols[name] = nodeType; 1558 | } 1559 | 1560 | if (isUserFile(sourceFile)) { 1561 | userSymbols[name] = symbol; 1562 | } 1563 | 1564 | const baseTypes = nodeType.getBaseTypes() || []; 1565 | 1566 | baseTypes.forEach((baseType) => { 1567 | var baseName = tc.typeToString(baseType, undefined, ts.TypeFormatFlags.UseFullyQualifiedType); 1568 | if (!inheritingTypes[baseName]) { 1569 | inheritingTypes[baseName] = []; 1570 | } 1571 | inheritingTypes[baseName].push(name); 1572 | }); 1573 | } else { 1574 | ts.forEachChild(node, (n) => inspect(n, tc)); 1575 | } 1576 | } 1577 | inspect(sourceFile, typeChecker); 1578 | }); 1579 | 1580 | return new JsonSchemaGenerator(symbols, allSymbols, userSymbols, inheritingTypes, typeChecker, settings); 1581 | } else { 1582 | diagnostics.forEach((diagnostic) => { 1583 | const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n"); 1584 | if (diagnostic.file) { 1585 | const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start!); 1586 | console.error(`${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}`); 1587 | } else { 1588 | console.error(message); 1589 | } 1590 | }); 1591 | return null; 1592 | } 1593 | } 1594 | 1595 | export function generateSchema( 1596 | program: ts.Program, 1597 | fullTypeName: string, 1598 | args: PartialArgs = {}, 1599 | onlyIncludeFiles?: string[], 1600 | externalGenerator?: JsonSchemaGenerator 1601 | ): Definition | null { 1602 | const generator = externalGenerator ?? buildGenerator(program, args, onlyIncludeFiles); 1603 | 1604 | if (generator === null) { 1605 | return null; 1606 | } 1607 | 1608 | if (fullTypeName === "*") { 1609 | // All types in file(s) 1610 | return generator.getSchemaForSymbols(generator.getMainFileSymbols(program, onlyIncludeFiles)); 1611 | } else if (args.uniqueNames) { 1612 | // Find the hashed type name to use as the root object 1613 | const matchingSymbols = generator.getSymbols(fullTypeName); 1614 | if (matchingSymbols.length === 1) { 1615 | return generator.getSchemaForSymbol(matchingSymbols[0].name); 1616 | } else { 1617 | throw new Error(`${matchingSymbols.length} definitions found for requested type "${fullTypeName}".`); 1618 | } 1619 | } else { 1620 | // Use specific type as root object 1621 | return generator.getSchemaForSymbol(fullTypeName); 1622 | } 1623 | } 1624 | 1625 | export function programFromConfig(configFileName: string, onlyIncludeFiles?: string[]): ts.Program { 1626 | // basically a copy of https://github.com/Microsoft/TypeScript/blob/3663d400270ccae8b69cbeeded8ffdc8fa12d7ad/src/compiler/tsc.ts -> parseConfigFile 1627 | const result = ts.parseConfigFileTextToJson(configFileName, ts.sys.readFile(configFileName)!); 1628 | const configObject = result.config; 1629 | 1630 | const configParseResult = {} as any 1631 | const options = configParseResult.options; 1632 | options.noEmit = true; 1633 | delete options.out; 1634 | delete options.outDir; 1635 | delete options.outFile; 1636 | delete options.declaration; 1637 | delete options.declarationDir; 1638 | delete options.declarationMap; 1639 | 1640 | const program = ts.createProgram({ 1641 | rootNames: onlyIncludeFiles || configParseResult.fileNames, 1642 | options, 1643 | projectReferences: configParseResult.projectReferences, 1644 | }); 1645 | return program; 1646 | } 1647 | 1648 | function normalizeFileName(fn: string): string { 1649 | while (fn.substr(0, 2) === "./") { 1650 | fn = fn.substr(2); 1651 | } 1652 | return fn; 1653 | } 1654 | 1655 | export async function exec(program: ts.Program, filePattern: string, fullTypeName: string, args = getDefaultArgs()): Promise { 1656 | let onlyIncludeFiles: string[] | undefined = undefined; 1657 | // if (REGEX_TSCONFIG_NAME.test(path.basename(filePattern))) { 1658 | // if (args.include && args.include.length > 0) { 1659 | // throw new Error("glob removed") 1660 | // } 1661 | // // program = programFromConfig(filePattern, onlyIncludeFiles); 1662 | // } else { 1663 | // // onlyIncludeFiles = glob.sync(filePattern); 1664 | // // program = getProgramFromFiles(onlyIncludeFiles, { 1665 | // // strictNullChecks: args.strictNullChecks, 1666 | // // }); 1667 | // // onlyIncludeFiles = onlyIncludeFiles.map(normalizeFileName); 1668 | // } 1669 | 1670 | const definition = generateSchema(program, fullTypeName, args, onlyIncludeFiles); 1671 | if (definition === null) { 1672 | throw new Error("No output definition. Probably caused by errors prior to this?"); 1673 | } 1674 | 1675 | const json = stringify(definition, { space: 4 }) + "\n\n"; 1676 | return definition 1677 | // if (args.out) { 1678 | // return new Promise((resolve, reject) => { 1679 | // const fs = require("fs"); 1680 | // fs.mkdir(path.dirname(args.out), { recursive: true }, function (mkErr: Error) { 1681 | // if (mkErr) { 1682 | // return reject(new Error("Unable to create parent directory for output file: " + mkErr.message)); 1683 | // } 1684 | // fs.writeFile(args.out, json, function (wrErr: Error) { 1685 | // if (wrErr) { 1686 | // return reject(new Error("Unable to write output file: " + wrErr.message)); 1687 | // } 1688 | // resolve(); 1689 | // }); 1690 | // }); 1691 | // }); 1692 | // } else { 1693 | // const hasBeenBuffered = process.stdout.write(json); 1694 | // if (hasBeenBuffered) { 1695 | // return new Promise((resolve) => process.stdout.on("drain", () => resolve())); 1696 | // } 1697 | // } 1698 | } 1699 | -------------------------------------------------------------------------------- /src/vendor/ds/createDesignSystem.d.ts: -------------------------------------------------------------------------------- 1 | import type { Sandbox } from "../sandbox"; 2 | import type { DiagnosticRelatedInformation, Node } from "typescript"; 3 | export declare type LocalStorageOption = { 4 | blurb: string; 5 | flag: string; 6 | display: string; 7 | emptyImpliesEnabled?: true; 8 | oneline?: true; 9 | requireRestart?: true; 10 | onchange?: (newValue: boolean) => void; 11 | }; 12 | export declare type OptionsListConfig = { 13 | style: "separated" | "rows"; 14 | requireRestart?: true; 15 | }; 16 | export declare type DesignSystem = ReturnType>; 17 | export declare const createDesignSystem: (sandbox: Sandbox) => (container: Element) => { 18 | /** The element of the design system */ 19 | container: Element; 20 | /** Clear the sidebar */ 21 | clear: () => void; 22 | /** Present code in a pre > code */ 23 | code: (code: string) => HTMLElement; 24 | /** Ideally only use this once, and maybe even prefer using subtitles everywhere */ 25 | title: (title: string) => HTMLElement; 26 | /** Used to denote sections, give info etc */ 27 | subtitle: (subtitle: string) => HTMLElement; 28 | /** Used to show a paragraph */ 29 | p: (subtitle: string) => HTMLElement; 30 | /** When you can't do something, or have nothing to show */ 31 | showEmptyScreen: (message: string) => HTMLDivElement; 32 | /** 33 | * Shows a list of hoverable, and selectable items (errors, highlights etc) which have code representation. 34 | * The type is quite small, so it should be very feasible for you to massage other data to fit into this function 35 | */ 36 | listDiags: (model: import("monaco-editor").editor.ITextModel, diags: DiagnosticRelatedInformation[]) => HTMLUListElement; 37 | /** Lets you remove the hovers from listDiags etc */ 38 | clearDeltaDecorators: (force?: true | undefined) => void; 39 | /** Shows a single option in local storage (adds an li to the container BTW) */ 40 | localStorageOption: (setting: LocalStorageOption) => HTMLLIElement; 41 | /** Uses localStorageOption to create a list of options */ 42 | showOptionList: (options: LocalStorageOption[], style: OptionsListConfig) => void; 43 | /** Shows a full-width text input */ 44 | createTextInput: (config: { 45 | id: string; 46 | placeholder: string; 47 | onChanged?: ((text: string, input: HTMLInputElement) => void) | undefined; 48 | onEnter: (text: string, input: HTMLInputElement) => void; 49 | value?: string | undefined; 50 | keepValueAcrossReloads?: true | undefined; 51 | isEnabled?: ((input: HTMLInputElement) => boolean) | undefined; 52 | }) => HTMLFormElement; 53 | /** Renders an AST tree */ 54 | createASTTree: (node: Node, settings?: { 55 | closedByDefault?: true | undefined; 56 | } | undefined) => HTMLDivElement; 57 | /** Creates an input button */ 58 | button: (settings: { 59 | label: string; 60 | onclick?: ((ev: MouseEvent) => void) | undefined; 61 | }) => HTMLInputElement; 62 | /** Used to re-create a UI like the tab bar at the top of the plugins section */ 63 | createTabBar: () => HTMLDivElement; 64 | /** Used with createTabBar to add buttons */ 65 | createTabButton: (text: string) => HTMLButtonElement; 66 | /** A general "restart your browser" message */ 67 | declareRestartRequired: (i?: ((key: string) => string) | undefined) => void; 68 | /** Create a new Design System instance and add it to the container. You'll need to cast 69 | * this after usage, because otherwise the type-system circularly references itself 70 | */ 71 | createSubDesignSystem: () => any; 72 | }; 73 | -------------------------------------------------------------------------------- /src/vendor/playground.d.ts: -------------------------------------------------------------------------------- 1 | declare type Sandbox = import("./sandbox").Sandbox; 2 | declare type Monaco = typeof import("monaco-editor"); 3 | import { PluginUtils } from "./pluginUtils"; 4 | import type React from "react"; 5 | export { PluginUtils } from "./pluginUtils"; 6 | export declare type PluginFactory = { 7 | (i: (key: string, components?: any) => string, utils: PluginUtils): PlaygroundPlugin; 8 | }; 9 | /** The interface of all sidebar plugins */ 10 | export interface PlaygroundPlugin { 11 | /** Not public facing, but used by the playground to uniquely identify plugins */ 12 | id: string; 13 | /** To show in the tabs */ 14 | displayName: string; 15 | /** Should this plugin be selected when the plugin is first loaded? Lets you check for query vars etc to load a particular plugin */ 16 | shouldBeSelected?: () => boolean; 17 | /** Before we show the tab, use this to set up your HTML - it will all be removed by the playground when someone navigates off the tab */ 18 | willMount?: (sandbox: Sandbox, container: HTMLDivElement) => void; 19 | /** After we show the tab */ 20 | didMount?: (sandbox: Sandbox, container: HTMLDivElement) => void; 21 | /** Model changes while this plugin is actively selected */ 22 | modelChanged?: (sandbox: Sandbox, model: import("monaco-editor").editor.ITextModel, container: HTMLDivElement) => void; 23 | /** Delayed model changes while this plugin is actively selected, useful when you are working with the TS API because it won't run on every keypress */ 24 | modelChangedDebounce?: (sandbox: Sandbox, model: import("monaco-editor").editor.ITextModel, container: HTMLDivElement) => void; 25 | /** Before we remove the tab */ 26 | willUnmount?: (sandbox: Sandbox, container: HTMLDivElement) => void; 27 | /** After we remove the tab */ 28 | didUnmount?: (sandbox: Sandbox, container: HTMLDivElement) => void; 29 | /** An object you can use to keep data around in the scope of your plugin object */ 30 | data?: any; 31 | } 32 | interface PlaygroundConfig { 33 | /** Language like "en" / "ja" etc */ 34 | lang: string; 35 | /** Site prefix, like "v2" during the pre-release */ 36 | prefix: string; 37 | /** Optional plugins so that we can re-use the playground with different sidebars */ 38 | plugins?: PluginFactory[]; 39 | /** Should this playground load up custom plugins from localStorage? */ 40 | supportCustomPlugins: boolean; 41 | } 42 | export declare const setupPlayground: (sandbox: Sandbox, monaco: Monaco, config: PlaygroundConfig, i: (key: string) => string, react: typeof React) => { 43 | exporter: { 44 | openProjectInStackBlitz: () => void; 45 | openProjectInCodeSandbox: () => void; 46 | copyAsMarkdownIssue: (e: React.MouseEvent) => Promise; 47 | copyForChat: (e: React.MouseEvent) => boolean; 48 | copyForChatWithPreview: (e: React.MouseEvent) => boolean; 49 | openInTSAST: () => void; 50 | openInBugWorkbench: () => void; 51 | exportAsTweet: () => void; 52 | }; 53 | // ui: import("./createUI").UI; 54 | registerPlugin: (plugin: PlaygroundPlugin) => void; 55 | plugins: PlaygroundPlugin[]; 56 | getCurrentPlugin: () => PlaygroundPlugin; 57 | tabs: HTMLButtonElement[]; 58 | setDidUpdateTab: (func: (newPlugin: PlaygroundPlugin, previousPlugin: PlaygroundPlugin) => void) => void; 59 | createUtils: (sb: any, react: typeof React) => { 60 | el: (str: string, elementType: string, container: Element) => HTMLElement; 61 | requireURL: (path: string) => string; 62 | react: typeof React; 63 | createDesignSystem: (container: Element) => { 64 | container: Element; 65 | clear: () => void; 66 | code: (code: string) => HTMLElement; 67 | title: (title: string) => HTMLElement; 68 | subtitle: (subtitle: string) => HTMLElement; 69 | p: (subtitle: string) => HTMLElement; 70 | showEmptyScreen: (message: string) => HTMLDivElement; 71 | listDiags: (model: import("monaco-editor").editor.ITextModel, diags: import("typescript").DiagnosticRelatedInformation[]) => HTMLUListElement; 72 | clearDeltaDecorators: (force?: true | undefined) => void; 73 | localStorageOption: (setting: import("./ds/createDesignSystem").LocalStorageOption) => HTMLLIElement; 74 | showOptionList: (options: import("./ds/createDesignSystem").LocalStorageOption[], style: import("./ds/createDesignSystem").OptionsListConfig) => void; 75 | createTextInput: (config: { 76 | id: string; 77 | placeholder: string; 78 | onChanged?: ((text: string, input: HTMLInputElement) => void) | undefined; 79 | onEnter: (text: string, input: HTMLInputElement) => void; 80 | value?: string | undefined; 81 | keepValueAcrossReloads?: true | undefined; 82 | isEnabled?: ((input: HTMLInputElement) => boolean) | undefined; 83 | }) => HTMLFormElement; 84 | createASTTree: (node: import("typescript").Node, settings?: { 85 | closedByDefault?: true | undefined; 86 | } | undefined) => HTMLDivElement; 87 | button: (settings: { 88 | label: string; 89 | onclick?: ((ev: MouseEvent) => void) | undefined; 90 | }) => HTMLInputElement; 91 | createTabBar: () => HTMLDivElement; 92 | createTabButton: (text: string) => HTMLButtonElement; 93 | declareRestartRequired: (i?: ((key: string) => string) | undefined) => void; 94 | createSubDesignSystem: () => any; 95 | }; 96 | flashHTMLElement: (element: HTMLElement) => void; 97 | setNotifications: (pluginID: string, amount: number) => void; 98 | }; 99 | }; 100 | export declare type Playground = ReturnType; 101 | -------------------------------------------------------------------------------- /src/vendor/pluginUtils.d.ts: -------------------------------------------------------------------------------- 1 | import type React from "react"; 2 | /** Creates a set of util functions which is exposed to Plugins to make it easier to build consistent UIs */ 3 | export declare const createUtils: (sb: any, react: typeof React) => { 4 | /** Use this to make a few dumb element generation funcs */ 5 | el: (str: string, elementType: string, container: Element) => HTMLElement; 6 | /** Get a relative URL for something in your dist folder depending on if you're in dev mode or not */ 7 | requireURL: (path: string) => string; 8 | /** The Gatsby copy of React */ 9 | react: typeof React; 10 | /** 11 | * The playground plugin design system. Calling any of the functions will append the 12 | * element to the container you pass into the first param, and return the HTMLElement 13 | */ 14 | createDesignSystem: (container: Element) => { 15 | container: Element; 16 | clear: () => void; 17 | code: (code: string) => HTMLElement; 18 | title: (title: string) => HTMLElement; 19 | subtitle: (subtitle: string) => HTMLElement; 20 | p: (subtitle: string) => HTMLElement; 21 | showEmptyScreen: (message: string) => HTMLDivElement; 22 | listDiags: (model: import("monaco-editor").editor.ITextModel, diags: import("typescript").DiagnosticRelatedInformation[]) => HTMLUListElement; 23 | clearDeltaDecorators: (force?: true | undefined) => void; 24 | localStorageOption: (setting: import("./ds/createDesignSystem").LocalStorageOption) => HTMLLIElement; 25 | showOptionList: (options: import("./ds/createDesignSystem").LocalStorageOption[], style: import("./ds/createDesignSystem").OptionsListConfig) => void; 26 | createTextInput: (config: { 27 | id: string; 28 | placeholder: string; 29 | onChanged?: ((text: string, input: HTMLInputElement) => void) | undefined; 30 | onEnter: (text: string, input: HTMLInputElement) => void; 31 | value?: string | undefined; 32 | keepValueAcrossReloads?: true | undefined; 33 | isEnabled?: ((input: HTMLInputElement) => boolean) | undefined; 34 | }) => HTMLFormElement; 35 | createASTTree: (node: import("typescript").Node, settings?: { 36 | closedByDefault?: true | undefined; 37 | } | undefined) => HTMLDivElement; 38 | button: (settings: { 39 | label: string; 40 | onclick?: ((ev: MouseEvent) => void) | undefined; 41 | }) => HTMLInputElement; 42 | createTabBar: () => HTMLDivElement; 43 | createTabButton: (text: string) => HTMLButtonElement; 44 | declareRestartRequired: (i?: ((key: string) => string) | undefined) => void; 45 | createSubDesignSystem: () => any; 46 | }; 47 | /** Flashes a HTML Element */ 48 | flashHTMLElement: (element: HTMLElement) => void; 49 | /** Add a little red button in the top corner of a plugin tab with a number */ 50 | setNotifications: (pluginID: string, amount: number) => void; 51 | }; 52 | export declare type PluginUtils = ReturnType; 53 | -------------------------------------------------------------------------------- /src/vendor/sandbox.d.ts: -------------------------------------------------------------------------------- 1 | import { TypeScriptWorker } from "./tsWorker";// import { TypeScriptWorker } from "./tsWorker"; 2 | // import lzstring from "./vendor/lzstring.min"; 3 | 4 | import * as tsvfs from './typescript-vfs'; 5 | declare type CompilerOptions = import("monaco-editor").languages.typescript.CompilerOptions; 6 | declare type Monaco = typeof import("monaco-editor"); 7 | /** 8 | * These are settings for the playground which are the equivalent to props in React 9 | * any changes to it should require a new setup of the playground 10 | */ 11 | export declare type SandboxConfig = { 12 | /** The default source code for the playground */ 13 | text: string; 14 | /** @deprecated */ 15 | useJavaScript?: boolean; 16 | /** The default file for the plaayground */ 17 | filetype: "js" | "ts" | "d.ts"; 18 | /** Compiler options which are automatically just forwarded on */ 19 | compilerOptions: CompilerOptions; 20 | /** Optional monaco settings overrides */ 21 | monacoSettings?: import("monaco-editor").editor.IEditorOptions; 22 | /** Acquire types via type acquisition */ 23 | acquireTypes: boolean; 24 | /** Support twoslash compiler options */ 25 | supportTwoslashCompilerOptions: boolean; 26 | /** Get the text via query params and local storage, useful when the editor is the main experience */ 27 | suppressAutomaticallyGettingDefaultText?: true; 28 | /** Suppress setting compiler options from the compiler flags from query params */ 29 | suppressAutomaticallyGettingCompilerFlags?: true; 30 | /** Logging system */ 31 | logger: { 32 | log: (...args: any[]) => void; 33 | error: (...args: any[]) => void; 34 | groupCollapsed: (...args: any[]) => void; 35 | groupEnd: (...args: any[]) => void; 36 | }; 37 | } & ({ 38 | domID: string; 39 | } | { 40 | elementToAppend: HTMLElement; 41 | }); 42 | /** The default settings which we apply a partial over */ 43 | export declare function defaultPlaygroundSettings(): { 44 | /** The default source code for the playground */ 45 | text: string; 46 | /** @deprecated */ 47 | useJavaScript?: boolean | undefined; 48 | /** The default file for the plaayground */ 49 | filetype: "d.ts" | "js" | "ts"; 50 | /** Compiler options which are automatically just forwarded on */ 51 | compilerOptions: import("monaco-editor").languages.typescript.CompilerOptions; 52 | /** Optional monaco settings overrides */ 53 | monacoSettings?: import("monaco-editor").editor.IEditorOptions | undefined; 54 | /** Acquire types via type acquisition */ 55 | acquireTypes: boolean; 56 | /** Support twoslash compiler options */ 57 | supportTwoslashCompilerOptions: boolean; 58 | /** Get the text via query params and local storage, useful when the editor is the main experience */ 59 | suppressAutomaticallyGettingDefaultText?: true | undefined; 60 | /** Suppress setting compiler options from the compiler flags from query params */ 61 | suppressAutomaticallyGettingCompilerFlags?: true | undefined; 62 | /** Logging system */ 63 | logger: { 64 | log: (...args: any[]) => void; 65 | error: (...args: any[]) => void; 66 | groupCollapsed: (...args: any[]) => void; 67 | groupEnd: (...args: any[]) => void; 68 | }; 69 | } & { 70 | domID: string; 71 | }; 72 | /** Creates a sandbox editor, and returns a set of useful functions and the editor */ 73 | export declare const createTypeScriptSandbox: (partialConfig: Partial, monaco: Monaco, ts: typeof import("typescript")) => { 74 | /** The same config you passed in */ 75 | config: { 76 | text: string; 77 | useJavaScript?: boolean | undefined; 78 | filetype: "js" | "ts" | "d.ts"; 79 | compilerOptions: CompilerOptions; 80 | monacoSettings?: import("monaco-editor").editor.IEditorOptions | undefined; 81 | acquireTypes: boolean; 82 | supportTwoslashCompilerOptions: boolean; 83 | suppressAutomaticallyGettingDefaultText?: true | undefined; 84 | suppressAutomaticallyGettingCompilerFlags?: true | undefined; 85 | logger: { 86 | log: (...args: any[]) => void; 87 | error: (...args: any[]) => void; 88 | groupCollapsed: (...args: any[]) => void; 89 | groupEnd: (...args: any[]) => void; 90 | }; 91 | domID: string; 92 | }; 93 | /** A list of TypeScript versions you can use with the TypeScript sandbox */ 94 | supportedVersions: readonly ["4.4.0-beta", "4.3.5", "4.2.3", "4.1.5", "4.0.5", "3.9.7", "3.8.3", "3.7.5", "3.6.3", "3.5.1", "3.3.3", "3.1.6", "3.0.1", "2.8.1", "2.7.2", "2.4.1"]; 95 | /** The monaco editor instance */ 96 | editor: import("monaco-editor").editor.IStandaloneCodeEditor; 97 | /** Either "typescript" or "javascript" depending on your config */ 98 | language: string; 99 | /** The outer monaco module, the result of require("monaco-editor") */ 100 | monaco: typeof import("monaco-editor"); 101 | /** Gets a monaco-typescript worker, this will give you access to a language server. Note: prefer this for language server work because it happens on a webworker . */ 102 | getWorkerProcess: () => Promise; 103 | /** A copy of require("@typescript/vfs") this can be used to quickly set up an in-memory compiler runs for ASTs, or to get complex language server results (anything above has to be serialized when passed)*/ 104 | tsvfs: typeof tsvfs; 105 | /** Get all the different emitted files after TypeScript is run */ 106 | getEmitResult: () => Promise; 107 | /** Gets just the JavaScript for your sandbox, will transpile if in TS only */ 108 | getRunnableJS: () => Promise; 109 | /** Gets the DTS output of the main code in the editor */ 110 | getDTSForCode: () => Promise; 111 | /** The monaco-editor dom node, used for showing/hiding the editor */ 112 | getDomNode: () => HTMLElement; 113 | /** The model is an object which monaco uses to keep track of text in the editor. Use this to directly modify the text in the editor */ 114 | getModel: () => import("monaco-editor").editor.ITextModel; 115 | /** Gets the text of the main model, which is the text in the editor */ 116 | getText: () => string; 117 | /** Shortcut for setting the model's text content which would update the editor */ 118 | setText: (text: string) => void; 119 | /** Gets the AST of the current text in monaco - uses `createTSProgram`, so the performance caveat applies there too */ 120 | getAST: () => Promise; 121 | /** The module you get from require("typescript") */ 122 | ts: typeof import("typescript"); 123 | /** Create a new Program, a TypeScript data model which represents the entire project. As well as some of the 124 | * primitive objects you would normally need to do work with the files. 125 | * 126 | * The first time this is called it has to download all the DTS files which is needed for an exact compiler run. Which 127 | * at max is about 1.5MB - after that subsequent downloads of dts lib files come from localStorage. 128 | * 129 | * Try to use this sparingly as it can be computationally expensive, at the minimum you should be using the debounced setup. 130 | * 131 | * Accepts an optional fsMap which you can use to add any files, or overwrite the default file. 132 | * 133 | * TODO: It would be good to create an easy way to have a single program instance which is updated for you 134 | * when the monaco model changes. 135 | */ 136 | setupTSVFS: (fsMapAdditions?: Map | undefined) => Promise<{ 137 | program: import("typescript").Program; 138 | system: import("typescript").System; 139 | host: { 140 | compilerHost: import("typescript").CompilerHost; 141 | updateFile: (sourceFile: import("typescript").SourceFile) => boolean; 142 | }; 143 | fsMap: Map; 144 | }>; 145 | /** Uses the above call setupTSVFS, but only returns the program */ 146 | createTSProgram: () => Promise; 147 | /** The Sandbox's default compiler options */ 148 | compilerDefaults: { 149 | [x: string]: import("monaco-editor").languages.typescript.CompilerOptionsValue; 150 | allowJs?: boolean | undefined; 151 | allowSyntheticDefaultImports?: boolean | undefined; 152 | allowUmdGlobalAccess?: boolean | undefined; 153 | allowUnreachableCode?: boolean | undefined; 154 | allowUnusedLabels?: boolean | undefined; 155 | alwaysStrict?: boolean | undefined; 156 | baseUrl?: string | undefined; 157 | charset?: string | undefined; 158 | checkJs?: boolean | undefined; 159 | declaration?: boolean | undefined; 160 | declarationMap?: boolean | undefined; 161 | emitDeclarationOnly?: boolean | undefined; 162 | declarationDir?: string | undefined; 163 | disableSizeLimit?: boolean | undefined; 164 | disableSourceOfProjectReferenceRedirect?: boolean | undefined; 165 | downlevelIteration?: boolean | undefined; 166 | emitBOM?: boolean | undefined; 167 | emitDecoratorMetadata?: boolean | undefined; 168 | experimentalDecorators?: boolean | undefined; 169 | forceConsistentCasingInFileNames?: boolean | undefined; 170 | importHelpers?: boolean | undefined; 171 | inlineSourceMap?: boolean | undefined; 172 | inlineSources?: boolean | undefined; 173 | isolatedModules?: boolean | undefined; 174 | jsx?: import("monaco-editor").languages.typescript.JsxEmit | undefined; 175 | keyofStringsOnly?: boolean | undefined; 176 | lib?: string[] | undefined; 177 | locale?: string | undefined; 178 | mapRoot?: string | undefined; 179 | maxNodeModuleJsDepth?: number | undefined; 180 | module?: import("monaco-editor").languages.typescript.ModuleKind | undefined; 181 | moduleResolution?: import("monaco-editor").languages.typescript.ModuleResolutionKind | undefined; 182 | newLine?: import("monaco-editor").languages.typescript.NewLineKind | undefined; 183 | noEmit?: boolean | undefined; 184 | noEmitHelpers?: boolean | undefined; 185 | noEmitOnError?: boolean | undefined; 186 | noErrorTruncation?: boolean | undefined; 187 | noFallthroughCasesInSwitch?: boolean | undefined; 188 | noImplicitAny?: boolean | undefined; 189 | noImplicitReturns?: boolean | undefined; 190 | noImplicitThis?: boolean | undefined; 191 | noStrictGenericChecks?: boolean | undefined; 192 | noUnusedLocals?: boolean | undefined; 193 | noUnusedParameters?: boolean | undefined; 194 | noImplicitUseStrict?: boolean | undefined; 195 | noLib?: boolean | undefined; 196 | noResolve?: boolean | undefined; 197 | out?: string | undefined; 198 | outDir?: string | undefined; 199 | outFile?: string | undefined; 200 | paths?: import("monaco-editor").languages.typescript.MapLike | undefined; 201 | preserveConstEnums?: boolean | undefined; 202 | preserveSymlinks?: boolean | undefined; 203 | project?: string | undefined; 204 | reactNamespace?: string | undefined; 205 | jsxFactory?: string | undefined; 206 | composite?: boolean | undefined; 207 | removeComments?: boolean | undefined; 208 | rootDir?: string | undefined; 209 | rootDirs?: string[] | undefined; 210 | skipLibCheck?: boolean | undefined; 211 | skipDefaultLibCheck?: boolean | undefined; 212 | sourceMap?: boolean | undefined; 213 | sourceRoot?: string | undefined; 214 | strict?: boolean | undefined; 215 | strictFunctionTypes?: boolean | undefined; 216 | strictBindCallApply?: boolean | undefined; 217 | strictNullChecks?: boolean | undefined; 218 | strictPropertyInitialization?: boolean | undefined; 219 | stripInternal?: boolean | undefined; 220 | suppressExcessPropertyErrors?: boolean | undefined; 221 | suppressImplicitAnyIndexErrors?: boolean | undefined; 222 | target?: import("monaco-editor").languages.typescript.ScriptTarget | undefined; 223 | traceResolution?: boolean | undefined; 224 | resolveJsonModule?: boolean | undefined; 225 | types?: string[] | undefined; 226 | typeRoots?: string[] | undefined; 227 | esModuleInterop?: boolean | undefined; 228 | useDefineForClassFields?: boolean | undefined; 229 | }; 230 | /** The Sandbox's current compiler options */ 231 | getCompilerOptions: () => import("monaco-editor").languages.typescript.CompilerOptions; 232 | /** Replace the Sandbox's compiler options */ 233 | setCompilerSettings: (opts: CompilerOptions) => void; 234 | /** Overwrite the Sandbox's compiler options */ 235 | updateCompilerSetting: (key: keyof CompilerOptions, value: any) => void; 236 | /** Update a single compiler option in the SAndbox */ 237 | updateCompilerSettings: (opts: CompilerOptions) => void; 238 | /** A way to get callbacks when compiler settings have changed */ 239 | setDidUpdateCompilerSettings: (func: (opts: CompilerOptions) => void) => void; 240 | /** A copy of lzstring, which is used to archive/unarchive code */ 241 | // lzstring: typeof lzstring; 242 | /** Returns compiler options found in the params of the current page */ 243 | createURLQueryWithCompilerOptions: (_sandbox: any, paramOverrides?: any) => string; 244 | /** 245 | * @deprecated Use `getTwoSlashCompilerOptions` instead. 246 | * 247 | * Returns compiler options in the source code using twoslash notation 248 | */ 249 | getTwoSlashComplierOptions: (code: string) => any; 250 | /** Returns compiler options in the source code using twoslash notation */ 251 | getTwoSlashCompilerOptions: (code: string) => any; 252 | /** Gets to the current monaco-language, this is how you talk to the background webworkers */ 253 | languageServiceDefaults: import("monaco-editor").languages.typescript.LanguageServiceDefaults; 254 | /** The path which represents the current file using the current compiler options */ 255 | filepath: string; 256 | /** Adds a file to the vfs used by the editor */ 257 | addLibraryToRuntime: (code: string, path: string) => void; 258 | }; 259 | export declare type Sandbox = ReturnType; 260 | export {}; 261 | -------------------------------------------------------------------------------- /src/vendor/tsWorker.d.ts: -------------------------------------------------------------------------------- 1 | import ts from 'typescript'; 2 | export declare class TypeScriptWorker implements ts.LanguageServiceHost { 3 | private _ctx; 4 | private _extraLibs; 5 | private _languageService; 6 | private _compilerOptions; 7 | constructor(ctx: any, createData: any); 8 | getCompilationSettings(): ts.CompilerOptions; 9 | getScriptFileNames(): string[]; 10 | private _getModel; 11 | getScriptVersion(fileName: string): string; 12 | getScriptSnapshot(fileName: string): ts.IScriptSnapshot | undefined; 13 | getScriptKind?(fileName: string): ts.ScriptKind; 14 | getCurrentDirectory(): string; 15 | getDefaultLibFileName(options: ts.CompilerOptions): string; 16 | isDefaultLibFileName(fileName: string): boolean; 17 | private static clearFiles; 18 | getSyntacticDiagnostics(fileName: string): Promise; 19 | getSemanticDiagnostics(fileName: string): Promise; 20 | getSuggestionDiagnostics(fileName: string): Promise; 21 | getCompilerOptionsDiagnostics(fileName: string): Promise; 22 | getCompletionsAtPosition(fileName: string, position: number): Promise; 23 | getCompletionEntryDetails(fileName: string, position: number, entry: string): Promise; 24 | getSignatureHelpItems(fileName: string, position: number): Promise; 25 | getQuickInfoAtPosition(fileName: string, position: number): Promise; 26 | getOccurrencesAtPosition(fileName: string, position: number): Promise | undefined>; 27 | getDefinitionAtPosition(fileName: string, position: number): Promise | undefined>; 28 | getReferencesAtPosition(fileName: string, position: number): Promise; 29 | getNavigationBarItems(fileName: string): Promise; 30 | getFormattingEditsForDocument(fileName: string, options: ts.FormatCodeOptions): Promise; 31 | getFormattingEditsForRange(fileName: string, start: number, end: number, options: ts.FormatCodeOptions): Promise; 32 | getFormattingEditsAfterKeystroke(fileName: string, postion: number, ch: string, options: ts.FormatCodeOptions): Promise; 33 | findRenameLocations(fileName: string, positon: number, findInStrings: boolean, findInComments: boolean, providePrefixAndSuffixTextForRename: boolean): Promise; 34 | getRenameInfo(fileName: string, positon: number, options: ts.RenameInfoOptions): Promise; 35 | getEmitOutput(fileName: string): Promise; 36 | getCodeFixesAtPosition(fileName: string, start: number, end: number, errorCodes: number[], formatOptions: ts.FormatCodeOptions): Promise>; 37 | updateExtraLibs(extraLibs: IExtraLibs): void; 38 | } 39 | export interface IExtraLib { 40 | content: string; 41 | version: number; 42 | } 43 | export interface IExtraLibs { 44 | [path: string]: IExtraLib; 45 | } 46 | -------------------------------------------------------------------------------- /src/vendor/typescript-vfs.d.ts: -------------------------------------------------------------------------------- 1 | 2 | declare type System = import("typescript").System; 3 | declare type CompilerOptions = import("typescript").CompilerOptions; 4 | declare type CustomTransformers = import("typescript").CustomTransformers; 5 | declare type LanguageServiceHost = import("typescript").LanguageServiceHost; 6 | declare type CompilerHost = import("typescript").CompilerHost; 7 | declare type SourceFile = import("typescript").SourceFile; 8 | declare type TS = typeof import("typescript"); 9 | export interface VirtualTypeScriptEnvironment { 10 | sys: System; 11 | languageService: import("typescript").LanguageService; 12 | getSourceFile: (fileName: string) => import("typescript").SourceFile | undefined; 13 | createFile: (fileName: string, content: string) => void; 14 | updateFile: (fileName: string, content: string, replaceTextSpan?: import("typescript").TextSpan) => void; 15 | } 16 | /** 17 | * Makes a virtual copy of the TypeScript environment. This is the main API you want to be using with 18 | * @typescript/vfs. A lot of the other exposed functions are used by this function to get set up. 19 | * 20 | * @param sys an object which conforms to the TS Sys (a shim over read/write access to the fs) 21 | * @param rootFiles a list of files which are considered inside the project 22 | * @param ts a copy pf the TypeScript module 23 | * @param compilerOptions the options for this compiler run 24 | * @param customTransformers custom transformers for this compiler run 25 | */ 26 | export declare function createVirtualTypeScriptEnvironment(sys: System, rootFiles: string[], ts: TS, compilerOptions?: CompilerOptions, customTransformers?: CustomTransformers): VirtualTypeScriptEnvironment; 27 | /** 28 | * Grab the list of lib files for a particular target, will return a bit more than necessary (by including 29 | * the dom) but that's OK 30 | * 31 | * @param target The compiler settings target baseline 32 | * @param ts A copy of the TypeScript module 33 | */ 34 | export declare const knownLibFilesForCompilerOptions: (compilerOptions: CompilerOptions, ts: TS) => string[]; 35 | /** 36 | * Sets up a Map with lib contents by grabbing the necessary files from 37 | * the local copy of typescript via the file system. 38 | */ 39 | export declare const createDefaultMapFromNodeModules: (compilerOptions: CompilerOptions, ts?: typeof import("typescript") | undefined) => Map; 40 | /** 41 | * Adds recursively files from the FS into the map based on the folder 42 | */ 43 | export declare const addAllFilesFromFolder: (map: Map, workingDir: string) => void; 44 | /** Adds all files from node_modules/@types into the FS Map */ 45 | export declare const addFilesForTypesIntoFolder: (map: Map) => void; 46 | /** 47 | * Create a virtual FS Map with the lib files from a particular TypeScript 48 | * version based on the target, Always includes dom ATM. 49 | * 50 | * @param options The compiler target, which dictates the libs to set up 51 | * @param version the versions of TypeScript which are supported 52 | * @param cache should the values be stored in local storage 53 | * @param ts a copy of the typescript import 54 | * @param lzstring an optional copy of the lz-string import 55 | * @param fetcher an optional replacement for the global fetch function (tests mainly) 56 | * @param storer an optional replacement for the localStorage global (tests mainly) 57 | */ 58 | export declare const createDefaultMapFromCDN: (options: CompilerOptions, version: string, cache: boolean, ts: TS, lzstring?: any | undefined, fetcher?: typeof fetch | undefined, storer?: Storage | undefined) => Promise>; 59 | /** 60 | * Creates an in-memory System object which can be used in a TypeScript program, this 61 | * is what provides read/write aspects of the virtual fs 62 | */ 63 | export declare function createSystem(files: Map): System; 64 | /** 65 | * Creates a file-system backed System object which can be used in a TypeScript program, you provide 66 | * a set of virtual files which are prioritised over the FS versions, then a path to the root of your 67 | * project (basically the folder your node_modules lives) 68 | */ 69 | export declare function createFSBackedSystem(files: Map, _projectRoot: string, ts: TS): System; 70 | /** 71 | * Creates an in-memory CompilerHost -which is essentially an extra wrapper to System 72 | * which works with TypeScript objects - returns both a compiler host, and a way to add new SourceFile 73 | * instances to the in-memory file system. 74 | */ 75 | export declare function createVirtualCompilerHost(sys: System, compilerOptions: CompilerOptions, ts: TS): { 76 | compilerHost: CompilerHost; 77 | updateFile: (sourceFile: SourceFile) => boolean; 78 | }; 79 | /** 80 | * Creates an object which can host a language service against the virtual file-system 81 | */ 82 | export declare function createVirtualLanguageServiceHost(sys: System, rootFiles: string[], compilerOptions: CompilerOptions, ts: TS, customTransformers?: CustomTransformers): { 83 | languageServiceHost: LanguageServiceHost; 84 | updateFile: (sourceFile: import("typescript").SourceFile) => void; 85 | }; 86 | export {}; 87 | -------------------------------------------------------------------------------- /src/vendor/utils.ts: -------------------------------------------------------------------------------- 1 | /** Get a relative URL for something in your dist folder depending on if you're in dev mode or not */ 2 | export const requireURL = (path: string) => { 3 | // https://unpkg.com/browse/typescript-playground-presentation-mode@0.0.1/dist/x.js => unpkg/browse/typescript-playground-presentation-mode@0.0.1/dist/x 4 | const isDev = document.location.host.includes('localhost') 5 | const prefix = isDev ? 'local/' : 'unpkg/typescript-playground-presentation-mode/dist/' 6 | return prefix + path 7 | } 8 | 9 | /** Use this to make a few dumb element generation funcs */ 10 | export const el = (str: string, el: string, container: Element) => { 11 | const para = document.createElement(el) 12 | para.innerHTML = str 13 | container.appendChild(para) 14 | } 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "esModuleInterop": true, 5 | "noEmit": true 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@rollup/plugin-commonjs@^11.0.2": 6 | version "11.1.0" 7 | resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz#60636c7a722f54b41e419e1709df05c7234557ef" 8 | integrity sha512-Ycr12N3ZPN96Fw2STurD21jMqzKwL9QuFhms3SD7KKRK7oaXUsBU9Zt0jL/rOPHiPYisI21/rXGO3jr9BnLHUA== 9 | dependencies: 10 | "@rollup/pluginutils" "^3.0.8" 11 | commondir "^1.0.1" 12 | estree-walker "^1.0.1" 13 | glob "^7.1.2" 14 | is-reference "^1.1.2" 15 | magic-string "^0.25.2" 16 | resolve "^1.11.0" 17 | 18 | "@rollup/plugin-json@^4.0.2": 19 | version "4.1.0" 20 | resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" 21 | integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== 22 | dependencies: 23 | "@rollup/pluginutils" "^3.0.8" 24 | 25 | "@rollup/plugin-node-resolve@^7.1.0": 26 | version "7.1.3" 27 | resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz#80de384edfbd7bfc9101164910f86078151a3eca" 28 | integrity sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q== 29 | dependencies: 30 | "@rollup/pluginutils" "^3.0.8" 31 | "@types/resolve" "0.0.8" 32 | builtin-modules "^3.1.0" 33 | is-module "^1.0.0" 34 | resolve "^1.14.2" 35 | 36 | "@rollup/plugin-typescript@^3.0.0": 37 | version "3.1.1" 38 | resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-3.1.1.tgz#a39175a552ed82a3e424862e6bb403bf9da451ee" 39 | integrity sha512-VPY1MbzIJT+obpav9Kns4MlipVJ1FuefwzO4s1uCVXAzVWya+bhhNauOmmqR/hy1zj7tePfh3t9iBN+HbIzyRA== 40 | dependencies: 41 | "@rollup/pluginutils" "^3.0.1" 42 | resolve "^1.14.1" 43 | 44 | "@rollup/pluginutils@^3.0.1", "@rollup/pluginutils@^3.0.8": 45 | version "3.1.0" 46 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" 47 | integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== 48 | dependencies: 49 | "@types/estree" "0.0.39" 50 | estree-walker "^1.0.1" 51 | picomatch "^2.2.2" 52 | 53 | "@rollup/pluginutils@^4.0.0": 54 | version "4.1.1" 55 | resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.1.tgz#1d4da86dd4eded15656a57d933fda2b9a08d47ec" 56 | integrity sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ== 57 | dependencies: 58 | estree-walker "^2.0.1" 59 | picomatch "^2.2.2" 60 | 61 | "@types/estree@*": 62 | version "0.0.50" 63 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" 64 | integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== 65 | 66 | "@types/estree@0.0.39": 67 | version "0.0.39" 68 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" 69 | integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== 70 | 71 | "@types/json-schema@^7.0.7": 72 | version "7.0.8" 73 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.8.tgz#edf1bf1dbf4e04413ca8e5b17b3b7d7d54b59818" 74 | integrity sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg== 75 | 76 | "@types/json-stable-stringify@^1.0.33": 77 | version "1.0.33" 78 | resolved "https://registry.yarnpkg.com/@types/json-stable-stringify/-/json-stable-stringify-1.0.33.tgz#099b0712d824d15e2660c20e1c16e6a8381f308c" 79 | integrity sha512-qEWiQff6q2tA5gcJGWwzplQcXdJtm+0oy6IHGHzlOf3eFAkGE/FIPXZK9ofWgNSHVp8AFFI33PJJshS0ei3Gvw== 80 | 81 | "@types/node@*": 82 | version "16.4.5" 83 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.4.5.tgz#eac95d4e52775190c405f0b9061ddcfb0304f7fc" 84 | integrity sha512-+0GPv/hIFNoy8r5MFf7vRpBjnqNYNrlHdetoy23E7TYc7JB2ctwyi3GMKpviozaHQ/Sy2kBNUTvG9ywN66zV1g== 85 | 86 | "@types/node@^14.14.33": 87 | version "14.17.6" 88 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.6.tgz#cc61c8361c89e70c468cda464d1fa3dd7e5ebd62" 89 | integrity sha512-iBxsxU7eswQDGhlr3AiamBxOssaYxbM+NKXVil8jg9yFXvrfEFbDumLD/2dMTB+zYyg7w+Xjt8yuxfdbUHAtcQ== 90 | 91 | "@types/prop-types@*": 92 | version "15.7.4" 93 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" 94 | integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== 95 | 96 | "@types/react@^16.9.23": 97 | version "16.14.11" 98 | resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.11.tgz#992a0cd4b66b9f27315042b5d96e976717368f04" 99 | integrity sha512-Don0MtsZZ3fjwTJ2BsoqkyOy7e176KplEAKOpr/4XDdzinlyJBn9yfsKn5mcSgn4kh1B22+3tBnzBC1z63ybtQ== 100 | dependencies: 101 | "@types/prop-types" "*" 102 | "@types/scheduler" "*" 103 | csstype "^3.0.2" 104 | 105 | "@types/resolve@0.0.8": 106 | version "0.0.8" 107 | resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-0.0.8.tgz#f26074d238e02659e323ce1a13d041eee280e194" 108 | integrity sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ== 109 | dependencies: 110 | "@types/node" "*" 111 | 112 | "@types/scheduler@*": 113 | version "0.16.2" 114 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" 115 | integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== 116 | 117 | "@zeit/schemas@2.6.0": 118 | version "2.6.0" 119 | resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.6.0.tgz#004e8e553b4cd53d538bd38eac7bcbf58a867fe3" 120 | integrity sha512-uUrgZ8AxS+Lio0fZKAipJjAh415JyrOZowliZAzmnJSsf7piVL5w+G0+gFJ0KSu3QRhvui/7zuvpLz03YjXAhg== 121 | 122 | abstract-leveldown@~0.12.0, abstract-leveldown@~0.12.1: 123 | version "0.12.4" 124 | resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz#29e18e632e60e4e221d5810247852a63d7b2e410" 125 | integrity sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA= 126 | dependencies: 127 | xtend "~3.0.0" 128 | 129 | accepts@~1.3.5: 130 | version "1.3.7" 131 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" 132 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== 133 | dependencies: 134 | mime-types "~2.1.24" 135 | negotiator "0.6.2" 136 | 137 | acorn@^7.1.0: 138 | version "7.4.1" 139 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" 140 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 141 | 142 | ajv@6.5.3: 143 | version "6.5.3" 144 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" 145 | integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== 146 | dependencies: 147 | fast-deep-equal "^2.0.1" 148 | fast-json-stable-stringify "^2.0.0" 149 | json-schema-traverse "^0.4.1" 150 | uri-js "^4.2.2" 151 | 152 | ansi-align@^2.0.0: 153 | version "2.0.0" 154 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" 155 | integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= 156 | dependencies: 157 | string-width "^2.0.0" 158 | 159 | ansi-regex@^3.0.0: 160 | version "3.0.0" 161 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 162 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 163 | 164 | ansi-regex@^4.1.0: 165 | version "4.1.0" 166 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 167 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 168 | 169 | ansi-regex@^5.0.0: 170 | version "5.0.0" 171 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 172 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 173 | 174 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 175 | version "3.2.1" 176 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 177 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 178 | dependencies: 179 | color-convert "^1.9.0" 180 | 181 | ansi-styles@^4.0.0: 182 | version "4.3.0" 183 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 184 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 185 | dependencies: 186 | color-convert "^2.0.1" 187 | 188 | arch@^2.1.0: 189 | version "2.2.0" 190 | resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" 191 | integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== 192 | 193 | arg@2.0.0: 194 | version "2.0.0" 195 | resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545" 196 | integrity sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w== 197 | 198 | arg@^4.1.0: 199 | version "4.1.3" 200 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 201 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 202 | 203 | asn1.js@^5.2.0: 204 | version "5.4.1" 205 | resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" 206 | integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== 207 | dependencies: 208 | bn.js "^4.0.0" 209 | inherits "^2.0.1" 210 | minimalistic-assert "^1.0.0" 211 | safer-buffer "^2.1.0" 212 | 213 | balanced-match@^1.0.0: 214 | version "1.0.2" 215 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 216 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 217 | 218 | bl@~0.8.1: 219 | version "0.8.2" 220 | resolved "https://registry.yarnpkg.com/bl/-/bl-0.8.2.tgz#c9b6bca08d1bc2ea00fc8afb4f1a5fd1e1c66e4e" 221 | integrity sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4= 222 | dependencies: 223 | readable-stream "~1.0.26" 224 | 225 | bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: 226 | version "4.12.0" 227 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" 228 | integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== 229 | 230 | bn.js@^5.0.0, bn.js@^5.1.1: 231 | version "5.2.0" 232 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" 233 | integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== 234 | 235 | boxen@1.3.0: 236 | version "1.3.0" 237 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" 238 | integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== 239 | dependencies: 240 | ansi-align "^2.0.0" 241 | camelcase "^4.0.0" 242 | chalk "^2.0.1" 243 | cli-boxes "^1.0.0" 244 | string-width "^2.0.0" 245 | term-size "^1.2.0" 246 | widest-line "^2.0.0" 247 | 248 | brace-expansion@^1.1.7: 249 | version "1.1.11" 250 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 251 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 252 | dependencies: 253 | balanced-match "^1.0.0" 254 | concat-map "0.0.1" 255 | 256 | brorand@^1.0.1, brorand@^1.1.0: 257 | version "1.1.0" 258 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 259 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= 260 | 261 | browserify-aes@^1.0.0, browserify-aes@^1.0.4: 262 | version "1.2.0" 263 | resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" 264 | integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== 265 | dependencies: 266 | buffer-xor "^1.0.3" 267 | cipher-base "^1.0.0" 268 | create-hash "^1.1.0" 269 | evp_bytestokey "^1.0.3" 270 | inherits "^2.0.1" 271 | safe-buffer "^5.0.1" 272 | 273 | browserify-cipher@^1.0.0: 274 | version "1.0.1" 275 | resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" 276 | integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== 277 | dependencies: 278 | browserify-aes "^1.0.4" 279 | browserify-des "^1.0.0" 280 | evp_bytestokey "^1.0.0" 281 | 282 | browserify-des@^1.0.0: 283 | version "1.0.2" 284 | resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" 285 | integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== 286 | dependencies: 287 | cipher-base "^1.0.1" 288 | des.js "^1.0.0" 289 | inherits "^2.0.1" 290 | safe-buffer "^5.1.2" 291 | 292 | browserify-fs@^1.0.0: 293 | version "1.0.0" 294 | resolved "https://registry.yarnpkg.com/browserify-fs/-/browserify-fs-1.0.0.tgz#f075aa8a729d4d1716d066620e386fcc1311a96f" 295 | integrity sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8= 296 | dependencies: 297 | level-filesystem "^1.0.1" 298 | level-js "^2.1.3" 299 | levelup "^0.18.2" 300 | 301 | browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: 302 | version "4.1.0" 303 | resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" 304 | integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== 305 | dependencies: 306 | bn.js "^5.0.0" 307 | randombytes "^2.0.1" 308 | 309 | browserify-sign@^4.0.0: 310 | version "4.2.1" 311 | resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" 312 | integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== 313 | dependencies: 314 | bn.js "^5.1.1" 315 | browserify-rsa "^4.0.1" 316 | create-hash "^1.2.0" 317 | create-hmac "^1.1.7" 318 | elliptic "^6.5.3" 319 | inherits "^2.0.4" 320 | parse-asn1 "^5.1.5" 321 | readable-stream "^3.6.0" 322 | safe-buffer "^5.2.0" 323 | 324 | buffer-es6@^4.9.2: 325 | version "4.9.3" 326 | resolved "https://registry.yarnpkg.com/buffer-es6/-/buffer-es6-4.9.3.tgz#f26347b82df76fd37e18bcb5288c4970cfd5c404" 327 | integrity sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ= 328 | 329 | buffer-from@^1.0.0: 330 | version "1.1.1" 331 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 332 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 333 | 334 | buffer-xor@^1.0.3: 335 | version "1.0.3" 336 | resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" 337 | integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= 338 | 339 | builtin-modules@^3.1.0: 340 | version "3.2.0" 341 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.2.0.tgz#45d5db99e7ee5e6bc4f362e008bf917ab5049887" 342 | integrity sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA== 343 | 344 | bytes@3.0.0: 345 | version "3.0.0" 346 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 347 | integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= 348 | 349 | camelcase@^4.0.0: 350 | version "4.1.0" 351 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 352 | integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= 353 | 354 | camelcase@^5.0.0: 355 | version "5.3.1" 356 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 357 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 358 | 359 | chalk@2.4.1: 360 | version "2.4.1" 361 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 362 | integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== 363 | dependencies: 364 | ansi-styles "^3.2.1" 365 | escape-string-regexp "^1.0.5" 366 | supports-color "^5.3.0" 367 | 368 | chalk@^2.0.1, chalk@^2.4.2: 369 | version "2.4.2" 370 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 371 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 372 | dependencies: 373 | ansi-styles "^3.2.1" 374 | escape-string-regexp "^1.0.5" 375 | supports-color "^5.3.0" 376 | 377 | cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: 378 | version "1.0.4" 379 | resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" 380 | integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== 381 | dependencies: 382 | inherits "^2.0.1" 383 | safe-buffer "^5.0.1" 384 | 385 | cli-boxes@^1.0.0: 386 | version "1.0.0" 387 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 388 | integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= 389 | 390 | clipboardy@1.2.3: 391 | version "1.2.3" 392 | resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" 393 | integrity sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA== 394 | dependencies: 395 | arch "^2.1.0" 396 | execa "^0.8.0" 397 | 398 | cliui@^5.0.0: 399 | version "5.0.0" 400 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 401 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== 402 | dependencies: 403 | string-width "^3.1.0" 404 | strip-ansi "^5.2.0" 405 | wrap-ansi "^5.1.0" 406 | 407 | cliui@^7.0.2: 408 | version "7.0.4" 409 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 410 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 411 | dependencies: 412 | string-width "^4.2.0" 413 | strip-ansi "^6.0.0" 414 | wrap-ansi "^7.0.0" 415 | 416 | clone@~0.1.9: 417 | version "0.1.19" 418 | resolved "https://registry.yarnpkg.com/clone/-/clone-0.1.19.tgz#613fb68639b26a494ac53253e15b1a6bd88ada85" 419 | integrity sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU= 420 | 421 | color-convert@^1.9.0: 422 | version "1.9.3" 423 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 424 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 425 | dependencies: 426 | color-name "1.1.3" 427 | 428 | color-convert@^2.0.1: 429 | version "2.0.1" 430 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 431 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 432 | dependencies: 433 | color-name "~1.1.4" 434 | 435 | color-name@1.1.3: 436 | version "1.1.3" 437 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 438 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 439 | 440 | color-name@~1.1.4: 441 | version "1.1.4" 442 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 443 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 444 | 445 | commondir@^1.0.1: 446 | version "1.0.1" 447 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 448 | integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= 449 | 450 | compressible@~2.0.14: 451 | version "2.0.18" 452 | resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" 453 | integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== 454 | dependencies: 455 | mime-db ">= 1.43.0 < 2" 456 | 457 | compression@1.7.3: 458 | version "1.7.3" 459 | resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" 460 | integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== 461 | dependencies: 462 | accepts "~1.3.5" 463 | bytes "3.0.0" 464 | compressible "~2.0.14" 465 | debug "2.6.9" 466 | on-headers "~1.0.1" 467 | safe-buffer "5.1.2" 468 | vary "~1.1.2" 469 | 470 | concat-map@0.0.1: 471 | version "0.0.1" 472 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 473 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 474 | 475 | concat-stream@^1.4.4: 476 | version "1.6.2" 477 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 478 | integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== 479 | dependencies: 480 | buffer-from "^1.0.0" 481 | inherits "^2.0.3" 482 | readable-stream "^2.2.2" 483 | typedarray "^0.0.6" 484 | 485 | concurrently@^5.1.0: 486 | version "5.3.0" 487 | resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.3.0.tgz#7500de6410d043c912b2da27de3202cb489b1e7b" 488 | integrity sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ== 489 | dependencies: 490 | chalk "^2.4.2" 491 | date-fns "^2.0.1" 492 | lodash "^4.17.15" 493 | read-pkg "^4.0.1" 494 | rxjs "^6.5.2" 495 | spawn-command "^0.0.2-1" 496 | supports-color "^6.1.0" 497 | tree-kill "^1.2.2" 498 | yargs "^13.3.0" 499 | 500 | content-disposition@0.5.2: 501 | version "0.5.2" 502 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 503 | integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= 504 | 505 | core-util-is@~1.0.0: 506 | version "1.0.2" 507 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 508 | integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= 509 | 510 | create-ecdh@^4.0.0: 511 | version "4.0.4" 512 | resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" 513 | integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== 514 | dependencies: 515 | bn.js "^4.1.0" 516 | elliptic "^6.5.3" 517 | 518 | create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: 519 | version "1.2.0" 520 | resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" 521 | integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== 522 | dependencies: 523 | cipher-base "^1.0.1" 524 | inherits "^2.0.1" 525 | md5.js "^1.3.4" 526 | ripemd160 "^2.0.1" 527 | sha.js "^2.4.0" 528 | 529 | create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: 530 | version "1.1.7" 531 | resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" 532 | integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== 533 | dependencies: 534 | cipher-base "^1.0.3" 535 | create-hash "^1.1.0" 536 | inherits "^2.0.1" 537 | ripemd160 "^2.0.0" 538 | safe-buffer "^5.0.1" 539 | sha.js "^2.4.8" 540 | 541 | create-require@^1.1.0: 542 | version "1.1.1" 543 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 544 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 545 | 546 | cross-spawn@^5.0.1: 547 | version "5.1.0" 548 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 549 | integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= 550 | dependencies: 551 | lru-cache "^4.0.1" 552 | shebang-command "^1.2.0" 553 | which "^1.2.9" 554 | 555 | crypto-browserify@^3.11.0, crypto-browserify@^3.12.0: 556 | version "3.12.0" 557 | resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" 558 | integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== 559 | dependencies: 560 | browserify-cipher "^1.0.0" 561 | browserify-sign "^4.0.0" 562 | create-ecdh "^4.0.0" 563 | create-hash "^1.1.0" 564 | create-hmac "^1.1.0" 565 | diffie-hellman "^5.0.0" 566 | inherits "^2.0.1" 567 | pbkdf2 "^3.0.3" 568 | public-encrypt "^4.0.0" 569 | randombytes "^2.0.0" 570 | randomfill "^1.0.3" 571 | 572 | csstype@^3.0.2: 573 | version "3.0.8" 574 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.8.tgz#d2266a792729fb227cd216fb572f43728e1ad340" 575 | integrity sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw== 576 | 577 | date-fns@^2.0.1: 578 | version "2.23.0" 579 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.23.0.tgz#4e886c941659af0cf7b30fafdd1eaa37e88788a9" 580 | integrity sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA== 581 | 582 | debug@2.6.9: 583 | version "2.6.9" 584 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 585 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 586 | dependencies: 587 | ms "2.0.0" 588 | 589 | decamelize@^1.2.0: 590 | version "1.2.0" 591 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 592 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 593 | 594 | deep-extend@^0.6.0: 595 | version "0.6.0" 596 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" 597 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== 598 | 599 | deferred-leveldown@~0.2.0: 600 | version "0.2.0" 601 | resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz#2cef1f111e1c57870d8bbb8af2650e587cd2f5b4" 602 | integrity sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ= 603 | dependencies: 604 | abstract-leveldown "~0.12.1" 605 | 606 | des.js@^1.0.0: 607 | version "1.0.1" 608 | resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" 609 | integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== 610 | dependencies: 611 | inherits "^2.0.1" 612 | minimalistic-assert "^1.0.0" 613 | 614 | diff@^4.0.1: 615 | version "4.0.2" 616 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 617 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 618 | 619 | diffie-hellman@^5.0.0: 620 | version "5.0.3" 621 | resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" 622 | integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== 623 | dependencies: 624 | bn.js "^4.1.0" 625 | miller-rabin "^4.0.0" 626 | randombytes "^2.0.0" 627 | 628 | elliptic@^6.5.3: 629 | version "6.5.4" 630 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" 631 | integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== 632 | dependencies: 633 | bn.js "^4.11.9" 634 | brorand "^1.1.0" 635 | hash.js "^1.0.0" 636 | hmac-drbg "^1.0.1" 637 | inherits "^2.0.4" 638 | minimalistic-assert "^1.0.1" 639 | minimalistic-crypto-utils "^1.0.1" 640 | 641 | emoji-regex@^7.0.1: 642 | version "7.0.3" 643 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 644 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== 645 | 646 | emoji-regex@^8.0.0: 647 | version "8.0.0" 648 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 649 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 650 | 651 | errno@^0.1.1, errno@~0.1.1: 652 | version "0.1.8" 653 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" 654 | integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== 655 | dependencies: 656 | prr "~1.0.1" 657 | 658 | error-ex@^1.3.1: 659 | version "1.3.2" 660 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 661 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 662 | dependencies: 663 | is-arrayish "^0.2.1" 664 | 665 | escalade@^3.1.1: 666 | version "3.1.1" 667 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 668 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 669 | 670 | escape-string-regexp@^1.0.5: 671 | version "1.0.5" 672 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 673 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 674 | 675 | estree-walker@^1.0.1: 676 | version "1.0.1" 677 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" 678 | integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== 679 | 680 | estree-walker@^2.0.1: 681 | version "2.0.2" 682 | resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" 683 | integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== 684 | 685 | evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: 686 | version "1.0.3" 687 | resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" 688 | integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== 689 | dependencies: 690 | md5.js "^1.3.4" 691 | safe-buffer "^5.1.1" 692 | 693 | execa@^0.7.0: 694 | version "0.7.0" 695 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 696 | integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= 697 | dependencies: 698 | cross-spawn "^5.0.1" 699 | get-stream "^3.0.0" 700 | is-stream "^1.1.0" 701 | npm-run-path "^2.0.0" 702 | p-finally "^1.0.0" 703 | signal-exit "^3.0.0" 704 | strip-eof "^1.0.0" 705 | 706 | execa@^0.8.0: 707 | version "0.8.0" 708 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" 709 | integrity sha1-2NdrvBtVIX7RkP1t1J08d07PyNo= 710 | dependencies: 711 | cross-spawn "^5.0.1" 712 | get-stream "^3.0.0" 713 | is-stream "^1.1.0" 714 | npm-run-path "^2.0.0" 715 | p-finally "^1.0.0" 716 | signal-exit "^3.0.0" 717 | strip-eof "^1.0.0" 718 | 719 | fast-deep-equal@^2.0.1: 720 | version "2.0.1" 721 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 722 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 723 | 724 | fast-json-stable-stringify@^2.0.0: 725 | version "2.1.0" 726 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 727 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 728 | 729 | fast-url-parser@1.1.3: 730 | version "1.1.3" 731 | resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" 732 | integrity sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0= 733 | dependencies: 734 | punycode "^1.3.2" 735 | 736 | find-up@^3.0.0: 737 | version "3.0.0" 738 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 739 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== 740 | dependencies: 741 | locate-path "^3.0.0" 742 | 743 | foreach@~2.0.1: 744 | version "2.0.5" 745 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 746 | integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= 747 | 748 | fs.realpath@^1.0.0: 749 | version "1.0.0" 750 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 751 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 752 | 753 | function-bind@^1.1.1: 754 | version "1.1.1" 755 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 756 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 757 | 758 | fwd-stream@^1.0.4: 759 | version "1.0.4" 760 | resolved "https://registry.yarnpkg.com/fwd-stream/-/fwd-stream-1.0.4.tgz#ed281cabed46feecf921ee32dc4c50b372ac7cfa" 761 | integrity sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo= 762 | dependencies: 763 | readable-stream "~1.0.26-4" 764 | 765 | get-caller-file@^2.0.1, get-caller-file@^2.0.5: 766 | version "2.0.5" 767 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 768 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 769 | 770 | get-stream@^3.0.0: 771 | version "3.0.0" 772 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 773 | integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= 774 | 775 | glob@^7.1.2, glob@^7.1.6: 776 | version "7.1.7" 777 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 778 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 779 | dependencies: 780 | fs.realpath "^1.0.0" 781 | inflight "^1.0.4" 782 | inherits "2" 783 | minimatch "^3.0.4" 784 | once "^1.3.0" 785 | path-is-absolute "^1.0.0" 786 | 787 | has-flag@^3.0.0: 788 | version "3.0.0" 789 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 790 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 791 | 792 | has@^1.0.3: 793 | version "1.0.3" 794 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 795 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 796 | dependencies: 797 | function-bind "^1.1.1" 798 | 799 | hash-base@^3.0.0: 800 | version "3.1.0" 801 | resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" 802 | integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== 803 | dependencies: 804 | inherits "^2.0.4" 805 | readable-stream "^3.6.0" 806 | safe-buffer "^5.2.0" 807 | 808 | hash.js@^1.0.0, hash.js@^1.0.3: 809 | version "1.1.7" 810 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 811 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 812 | dependencies: 813 | inherits "^2.0.3" 814 | minimalistic-assert "^1.0.1" 815 | 816 | hmac-drbg@^1.0.1: 817 | version "1.0.1" 818 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 819 | integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= 820 | dependencies: 821 | hash.js "^1.0.3" 822 | minimalistic-assert "^1.0.0" 823 | minimalistic-crypto-utils "^1.0.1" 824 | 825 | hosted-git-info@^2.1.4: 826 | version "2.8.9" 827 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" 828 | integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== 829 | 830 | idb-wrapper@^1.5.0: 831 | version "1.7.2" 832 | resolved "https://registry.yarnpkg.com/idb-wrapper/-/idb-wrapper-1.7.2.tgz#8251afd5e77fe95568b1c16152eb44b396767ea2" 833 | integrity sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg== 834 | 835 | indexof@~0.0.1: 836 | version "0.0.1" 837 | resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" 838 | integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= 839 | 840 | inflight@^1.0.4: 841 | version "1.0.6" 842 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 843 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 844 | dependencies: 845 | once "^1.3.0" 846 | wrappy "1" 847 | 848 | inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: 849 | version "2.0.4" 850 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 851 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 852 | 853 | ini@~1.3.0: 854 | version "1.3.8" 855 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" 856 | integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== 857 | 858 | is-arrayish@^0.2.1: 859 | version "0.2.1" 860 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 861 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= 862 | 863 | is-core-module@^2.2.0: 864 | version "2.5.0" 865 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.5.0.tgz#f754843617c70bfd29b7bd87327400cda5c18491" 866 | integrity sha512-TXCMSDsEHMEEZ6eCA8rwRDbLu55MRGmrctljsBX/2v1d9/GzqHOxW5c5oPSgrUt2vBFXebu9rGqckXGPWOlYpg== 867 | dependencies: 868 | has "^1.0.3" 869 | 870 | is-fullwidth-code-point@^2.0.0: 871 | version "2.0.0" 872 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 873 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 874 | 875 | is-fullwidth-code-point@^3.0.0: 876 | version "3.0.0" 877 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 878 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 879 | 880 | is-module@^1.0.0: 881 | version "1.0.0" 882 | resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" 883 | integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= 884 | 885 | is-object@~0.1.2: 886 | version "0.1.2" 887 | resolved "https://registry.yarnpkg.com/is-object/-/is-object-0.1.2.tgz#00efbc08816c33cfc4ac8251d132e10dc65098d7" 888 | integrity sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc= 889 | 890 | is-reference@^1.1.2, is-reference@^1.2.1: 891 | version "1.2.1" 892 | resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" 893 | integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== 894 | dependencies: 895 | "@types/estree" "*" 896 | 897 | is-stream@^1.1.0: 898 | version "1.1.0" 899 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 900 | integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= 901 | 902 | is@~0.2.6: 903 | version "0.2.7" 904 | resolved "https://registry.yarnpkg.com/is/-/is-0.2.7.tgz#3b34a2c48f359972f35042849193ae7264b63562" 905 | integrity sha1-OzSixI81mXLzUEKEkZOucmS2NWI= 906 | 907 | isarray@0.0.1: 908 | version "0.0.1" 909 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 910 | integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 911 | 912 | isarray@~1.0.0: 913 | version "1.0.0" 914 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 915 | integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= 916 | 917 | isbuffer@~0.0.0: 918 | version "0.0.0" 919 | resolved "https://registry.yarnpkg.com/isbuffer/-/isbuffer-0.0.0.tgz#38c146d9df528b8bf9b0701c3d43cf12df3fc39b" 920 | integrity sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s= 921 | 922 | isexe@^2.0.0: 923 | version "2.0.0" 924 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 925 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 926 | 927 | js-md5@^0.7.3: 928 | version "0.7.3" 929 | resolved "https://registry.yarnpkg.com/js-md5/-/js-md5-0.7.3.tgz#b4f2fbb0b327455f598d6727e38ec272cd09c3f2" 930 | integrity sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ== 931 | 932 | json-parse-better-errors@^1.0.1: 933 | version "1.0.2" 934 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 935 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 936 | 937 | json-schema-traverse@^0.4.1: 938 | version "0.4.1" 939 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 940 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 941 | 942 | json-stable-stringify@^1.0.1: 943 | version "1.0.1" 944 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 945 | integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= 946 | dependencies: 947 | jsonify "~0.0.0" 948 | 949 | jsonify@~0.0.0: 950 | version "0.0.0" 951 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 952 | integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= 953 | 954 | level-blobs@^0.1.7: 955 | version "0.1.7" 956 | resolved "https://registry.yarnpkg.com/level-blobs/-/level-blobs-0.1.7.tgz#9ab9b97bb99f1edbf9f78a3433e21ed56386bdaf" 957 | integrity sha1-mrm5e7mfHtv594o0M+Ie1WOGva8= 958 | dependencies: 959 | level-peek "1.0.6" 960 | once "^1.3.0" 961 | readable-stream "^1.0.26-4" 962 | 963 | level-filesystem@^1.0.1: 964 | version "1.2.0" 965 | resolved "https://registry.yarnpkg.com/level-filesystem/-/level-filesystem-1.2.0.tgz#a00aca9919c4a4dfafdca6a8108d225aadff63b3" 966 | integrity sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M= 967 | dependencies: 968 | concat-stream "^1.4.4" 969 | errno "^0.1.1" 970 | fwd-stream "^1.0.4" 971 | level-blobs "^0.1.7" 972 | level-peek "^1.0.6" 973 | level-sublevel "^5.2.0" 974 | octal "^1.0.0" 975 | once "^1.3.0" 976 | xtend "^2.2.0" 977 | 978 | level-fix-range@2.0: 979 | version "2.0.0" 980 | resolved "https://registry.yarnpkg.com/level-fix-range/-/level-fix-range-2.0.0.tgz#c417d62159442151a19d9a2367868f1724c2d548" 981 | integrity sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug= 982 | dependencies: 983 | clone "~0.1.9" 984 | 985 | level-fix-range@~1.0.2: 986 | version "1.0.2" 987 | resolved "https://registry.yarnpkg.com/level-fix-range/-/level-fix-range-1.0.2.tgz#bf15b915ae36d8470c821e883ddf79cd16420828" 988 | integrity sha1-vxW5Fa422EcMgh6IPd95zRZCCCg= 989 | 990 | "level-hooks@>=4.4.0 <5": 991 | version "4.5.0" 992 | resolved "https://registry.yarnpkg.com/level-hooks/-/level-hooks-4.5.0.tgz#1b9ae61922930f3305d1a61fc4d83c8102c0dd93" 993 | integrity sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM= 994 | dependencies: 995 | string-range "~1.2" 996 | 997 | level-js@^2.1.3: 998 | version "2.2.4" 999 | resolved "https://registry.yarnpkg.com/level-js/-/level-js-2.2.4.tgz#bc055f4180635d4489b561c9486fa370e8c11697" 1000 | integrity sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc= 1001 | dependencies: 1002 | abstract-leveldown "~0.12.0" 1003 | idb-wrapper "^1.5.0" 1004 | isbuffer "~0.0.0" 1005 | ltgt "^2.1.2" 1006 | typedarray-to-buffer "~1.0.0" 1007 | xtend "~2.1.2" 1008 | 1009 | level-peek@1.0.6, level-peek@^1.0.6: 1010 | version "1.0.6" 1011 | resolved "https://registry.yarnpkg.com/level-peek/-/level-peek-1.0.6.tgz#bec51c72a82ee464d336434c7c876c3fcbcce77f" 1012 | integrity sha1-vsUccqgu5GTTNkNMfIdsP8vM538= 1013 | dependencies: 1014 | level-fix-range "~1.0.2" 1015 | 1016 | level-sublevel@^5.2.0: 1017 | version "5.2.3" 1018 | resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-5.2.3.tgz#744c12c72d2e72be78dde3b9b5cd84d62191413a" 1019 | integrity sha1-dEwSxy0ucr543eO5tc2E1iGRQTo= 1020 | dependencies: 1021 | level-fix-range "2.0" 1022 | level-hooks ">=4.4.0 <5" 1023 | string-range "~1.2.1" 1024 | xtend "~2.0.4" 1025 | 1026 | levelup@^0.18.2: 1027 | version "0.18.6" 1028 | resolved "https://registry.yarnpkg.com/levelup/-/levelup-0.18.6.tgz#e6a01cb089616c8ecc0291c2a9bd3f0c44e3e5eb" 1029 | integrity sha1-5qAcsIlhbI7MApHCqb0/DETj5es= 1030 | dependencies: 1031 | bl "~0.8.1" 1032 | deferred-leveldown "~0.2.0" 1033 | errno "~0.1.1" 1034 | prr "~0.0.0" 1035 | readable-stream "~1.0.26" 1036 | semver "~2.3.1" 1037 | xtend "~3.0.0" 1038 | 1039 | locate-path@^3.0.0: 1040 | version "3.0.0" 1041 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1042 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== 1043 | dependencies: 1044 | p-locate "^3.0.0" 1045 | path-exists "^3.0.0" 1046 | 1047 | lodash@^4.17.15: 1048 | version "4.17.21" 1049 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1050 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1051 | 1052 | lru-cache@^4.0.1: 1053 | version "4.1.5" 1054 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" 1055 | integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== 1056 | dependencies: 1057 | pseudomap "^1.0.2" 1058 | yallist "^2.1.2" 1059 | 1060 | ltgt@^2.1.2: 1061 | version "2.2.1" 1062 | resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" 1063 | integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= 1064 | 1065 | magic-string@^0.25.2, magic-string@^0.25.7: 1066 | version "0.25.7" 1067 | resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" 1068 | integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== 1069 | dependencies: 1070 | sourcemap-codec "^1.4.4" 1071 | 1072 | make-error@^1.1.1: 1073 | version "1.3.6" 1074 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1075 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1076 | 1077 | md5.js@^1.3.4: 1078 | version "1.3.5" 1079 | resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" 1080 | integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== 1081 | dependencies: 1082 | hash-base "^3.0.0" 1083 | inherits "^2.0.1" 1084 | safe-buffer "^5.1.2" 1085 | 1086 | miller-rabin@^4.0.0: 1087 | version "4.0.1" 1088 | resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" 1089 | integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== 1090 | dependencies: 1091 | bn.js "^4.0.0" 1092 | brorand "^1.0.1" 1093 | 1094 | mime-db@1.49.0, "mime-db@>= 1.43.0 < 2": 1095 | version "1.49.0" 1096 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.49.0.tgz#f3dfde60c99e9cf3bc9701d687778f537001cbed" 1097 | integrity sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA== 1098 | 1099 | mime-db@~1.33.0: 1100 | version "1.33.0" 1101 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" 1102 | integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== 1103 | 1104 | mime-types@2.1.18: 1105 | version "2.1.18" 1106 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" 1107 | integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== 1108 | dependencies: 1109 | mime-db "~1.33.0" 1110 | 1111 | mime-types@~2.1.24: 1112 | version "2.1.32" 1113 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.32.tgz#1d00e89e7de7fe02008db61001d9e02852670fd5" 1114 | integrity sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A== 1115 | dependencies: 1116 | mime-db "1.49.0" 1117 | 1118 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 1119 | version "1.0.1" 1120 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 1121 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 1122 | 1123 | minimalistic-crypto-utils@^1.0.1: 1124 | version "1.0.1" 1125 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 1126 | integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 1127 | 1128 | minimatch@3.0.4, minimatch@^3.0.4: 1129 | version "3.0.4" 1130 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1131 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1132 | dependencies: 1133 | brace-expansion "^1.1.7" 1134 | 1135 | minimist@^1.2.0: 1136 | version "1.2.5" 1137 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1138 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 1139 | 1140 | monaco-editor@^0.19.3: 1141 | version "0.19.3" 1142 | resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.19.3.tgz#1c994b3186c00650dbcd034d5370d46bf56c0663" 1143 | integrity sha512-2n1vJBVQF2Hhi7+r1mMeYsmlf18hjVb6E0v5SoMZyb4aeOmYPKun+CE3gYpiNA1KEvtSdaDHFBqH9d7Wd9vREg== 1144 | 1145 | ms@2.0.0: 1146 | version "2.0.0" 1147 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1148 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 1149 | 1150 | negotiator@0.6.2: 1151 | version "0.6.2" 1152 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" 1153 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== 1154 | 1155 | node-fetch@^2.6.0: 1156 | version "2.6.1" 1157 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 1158 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 1159 | 1160 | normalize-package-data@^2.3.2: 1161 | version "2.5.0" 1162 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" 1163 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== 1164 | dependencies: 1165 | hosted-git-info "^2.1.4" 1166 | resolve "^1.10.0" 1167 | semver "2 || 3 || 4 || 5" 1168 | validate-npm-package-license "^3.0.1" 1169 | 1170 | npm-run-path@^2.0.0: 1171 | version "2.0.2" 1172 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1173 | integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= 1174 | dependencies: 1175 | path-key "^2.0.0" 1176 | 1177 | object-keys@~0.2.0: 1178 | version "0.2.0" 1179 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.2.0.tgz#cddec02998b091be42bf1035ae32e49f1cb6ea67" 1180 | integrity sha1-zd7AKZiwkb5CvxA1rjLknxy26mc= 1181 | dependencies: 1182 | foreach "~2.0.1" 1183 | indexof "~0.0.1" 1184 | is "~0.2.6" 1185 | 1186 | object-keys@~0.4.0: 1187 | version "0.4.0" 1188 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" 1189 | integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= 1190 | 1191 | octal@^1.0.0: 1192 | version "1.0.0" 1193 | resolved "https://registry.yarnpkg.com/octal/-/octal-1.0.0.tgz#63e7162a68efbeb9e213588d58e989d1e5c4530b" 1194 | integrity sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws= 1195 | 1196 | on-headers@~1.0.1: 1197 | version "1.0.2" 1198 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" 1199 | integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== 1200 | 1201 | once@^1.3.0: 1202 | version "1.4.0" 1203 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1204 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1205 | dependencies: 1206 | wrappy "1" 1207 | 1208 | p-finally@^1.0.0: 1209 | version "1.0.0" 1210 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1211 | integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= 1212 | 1213 | p-limit@^2.0.0: 1214 | version "2.3.0" 1215 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1216 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 1217 | dependencies: 1218 | p-try "^2.0.0" 1219 | 1220 | p-locate@^3.0.0: 1221 | version "3.0.0" 1222 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1223 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== 1224 | dependencies: 1225 | p-limit "^2.0.0" 1226 | 1227 | p-try@^2.0.0: 1228 | version "2.2.0" 1229 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1230 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 1231 | 1232 | parse-asn1@^5.0.0, parse-asn1@^5.1.5: 1233 | version "5.1.6" 1234 | resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" 1235 | integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== 1236 | dependencies: 1237 | asn1.js "^5.2.0" 1238 | browserify-aes "^1.0.0" 1239 | evp_bytestokey "^1.0.0" 1240 | pbkdf2 "^3.0.3" 1241 | safe-buffer "^5.1.1" 1242 | 1243 | parse-json@^4.0.0: 1244 | version "4.0.0" 1245 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" 1246 | integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= 1247 | dependencies: 1248 | error-ex "^1.3.1" 1249 | json-parse-better-errors "^1.0.1" 1250 | 1251 | path-exists@^3.0.0: 1252 | version "3.0.0" 1253 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1254 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= 1255 | 1256 | path-is-absolute@^1.0.0: 1257 | version "1.0.1" 1258 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1259 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1260 | 1261 | path-is-inside@1.0.2: 1262 | version "1.0.2" 1263 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1264 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 1265 | 1266 | path-key@^2.0.0: 1267 | version "2.0.1" 1268 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1269 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 1270 | 1271 | path-parse@^1.0.6: 1272 | version "1.0.7" 1273 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1274 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1275 | 1276 | path-to-regexp@2.2.1: 1277 | version "2.2.1" 1278 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" 1279 | integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== 1280 | 1281 | pbkdf2@^3.0.3: 1282 | version "3.1.2" 1283 | resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" 1284 | integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== 1285 | dependencies: 1286 | create-hash "^1.1.2" 1287 | create-hmac "^1.1.4" 1288 | ripemd160 "^2.0.1" 1289 | safe-buffer "^5.0.1" 1290 | sha.js "^2.4.8" 1291 | 1292 | picomatch@^2.2.2: 1293 | version "2.3.0" 1294 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 1295 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 1296 | 1297 | pify@^3.0.0: 1298 | version "3.0.0" 1299 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1300 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 1301 | 1302 | process-es6@^0.11.2: 1303 | version "0.11.6" 1304 | resolved "https://registry.yarnpkg.com/process-es6/-/process-es6-0.11.6.tgz#c6bb389f9a951f82bd4eb169600105bd2ff9c778" 1305 | integrity sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g= 1306 | 1307 | process-nextick-args@~2.0.0: 1308 | version "2.0.1" 1309 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1310 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1311 | 1312 | prr@~0.0.0: 1313 | version "0.0.0" 1314 | resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" 1315 | integrity sha1-GoS4WQgyVQFBGFPQCB7j+obikmo= 1316 | 1317 | prr@~1.0.1: 1318 | version "1.0.1" 1319 | resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" 1320 | integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= 1321 | 1322 | pseudomap@^1.0.2: 1323 | version "1.0.2" 1324 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1325 | integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= 1326 | 1327 | public-encrypt@^4.0.0: 1328 | version "4.0.3" 1329 | resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" 1330 | integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== 1331 | dependencies: 1332 | bn.js "^4.1.0" 1333 | browserify-rsa "^4.0.0" 1334 | create-hash "^1.1.0" 1335 | parse-asn1 "^5.0.0" 1336 | randombytes "^2.0.1" 1337 | safe-buffer "^5.1.2" 1338 | 1339 | punycode@^1.3.2: 1340 | version "1.4.1" 1341 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1342 | integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 1343 | 1344 | punycode@^2.1.0: 1345 | version "2.1.1" 1346 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 1347 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 1348 | 1349 | randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: 1350 | version "2.1.0" 1351 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1352 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1353 | dependencies: 1354 | safe-buffer "^5.1.0" 1355 | 1356 | randomfill@^1.0.3: 1357 | version "1.0.4" 1358 | resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" 1359 | integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== 1360 | dependencies: 1361 | randombytes "^2.0.5" 1362 | safe-buffer "^5.1.0" 1363 | 1364 | range-parser@1.2.0: 1365 | version "1.2.0" 1366 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 1367 | integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= 1368 | 1369 | rc@^1.0.1, rc@^1.1.6: 1370 | version "1.2.8" 1371 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" 1372 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== 1373 | dependencies: 1374 | deep-extend "^0.6.0" 1375 | ini "~1.3.0" 1376 | minimist "^1.2.0" 1377 | strip-json-comments "~2.0.1" 1378 | 1379 | read-pkg@^4.0.1: 1380 | version "4.0.1" 1381 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237" 1382 | integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc= 1383 | dependencies: 1384 | normalize-package-data "^2.3.2" 1385 | parse-json "^4.0.0" 1386 | pify "^3.0.0" 1387 | 1388 | readable-stream@^1.0.26-4: 1389 | version "1.1.14" 1390 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 1391 | integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= 1392 | dependencies: 1393 | core-util-is "~1.0.0" 1394 | inherits "~2.0.1" 1395 | isarray "0.0.1" 1396 | string_decoder "~0.10.x" 1397 | 1398 | readable-stream@^2.2.2: 1399 | version "2.3.7" 1400 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" 1401 | integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== 1402 | dependencies: 1403 | core-util-is "~1.0.0" 1404 | inherits "~2.0.3" 1405 | isarray "~1.0.0" 1406 | process-nextick-args "~2.0.0" 1407 | safe-buffer "~5.1.1" 1408 | string_decoder "~1.1.1" 1409 | util-deprecate "~1.0.1" 1410 | 1411 | readable-stream@^3.6.0: 1412 | version "3.6.0" 1413 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" 1414 | integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== 1415 | dependencies: 1416 | inherits "^2.0.3" 1417 | string_decoder "^1.1.1" 1418 | util-deprecate "^1.0.1" 1419 | 1420 | readable-stream@~1.0.26, readable-stream@~1.0.26-4: 1421 | version "1.0.34" 1422 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" 1423 | integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= 1424 | dependencies: 1425 | core-util-is "~1.0.0" 1426 | inherits "~2.0.1" 1427 | isarray "0.0.1" 1428 | string_decoder "~0.10.x" 1429 | 1430 | registry-auth-token@3.3.2: 1431 | version "3.3.2" 1432 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" 1433 | integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== 1434 | dependencies: 1435 | rc "^1.1.6" 1436 | safe-buffer "^5.0.1" 1437 | 1438 | registry-url@3.1.0: 1439 | version "3.1.0" 1440 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 1441 | integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= 1442 | dependencies: 1443 | rc "^1.0.1" 1444 | 1445 | require-directory@^2.1.1: 1446 | version "2.1.1" 1447 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1448 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1449 | 1450 | require-main-filename@^2.0.0: 1451 | version "2.0.0" 1452 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1453 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 1454 | 1455 | resolve@^1.10.0, resolve@^1.11.0, resolve@^1.14.1, resolve@^1.14.2: 1456 | version "1.20.0" 1457 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" 1458 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 1459 | dependencies: 1460 | is-core-module "^2.2.0" 1461 | path-parse "^1.0.6" 1462 | 1463 | ripemd160@^2.0.0, ripemd160@^2.0.1: 1464 | version "2.0.2" 1465 | resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" 1466 | integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== 1467 | dependencies: 1468 | hash-base "^3.0.0" 1469 | inherits "^2.0.1" 1470 | 1471 | rollup-plugin-external-globals@^0.6.1: 1472 | version "0.6.1" 1473 | resolved "https://registry.yarnpkg.com/rollup-plugin-external-globals/-/rollup-plugin-external-globals-0.6.1.tgz#861c260b5727144e0fd1b424b103f9f0282fc365" 1474 | integrity sha512-mlp3KNa5sE4Sp9UUR2rjBrxjG79OyZAh/QC18RHIjM+iYkbBwNXSo8DHRMZWtzJTrH8GxQ+SJvCTN3i14uMXIA== 1475 | dependencies: 1476 | "@rollup/pluginutils" "^4.0.0" 1477 | estree-walker "^2.0.1" 1478 | is-reference "^1.2.1" 1479 | magic-string "^0.25.7" 1480 | 1481 | rollup-plugin-ignore@^1.0.9: 1482 | version "1.0.9" 1483 | resolved "https://registry.yarnpkg.com/rollup-plugin-ignore/-/rollup-plugin-ignore-1.0.9.tgz#62a692d387d543395ad2fbcc443c9b3549582844" 1484 | integrity sha512-+Q2jmD4gbO3ByFuljkDEfpEcYvll7J5+ZadUuk/Pu35x2KGrbHxKtt3+s+dPIgXX1mG7zCxG4s/NdRqztR5Ruw== 1485 | 1486 | rollup-plugin-node-builtins@^2.1.2: 1487 | version "2.1.2" 1488 | resolved "https://registry.yarnpkg.com/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz#24a1fed4a43257b6b64371d8abc6ce1ab14597e9" 1489 | integrity sha1-JKH+1KQyV7a2Q3HYq8bOGrFFl+k= 1490 | dependencies: 1491 | browserify-fs "^1.0.0" 1492 | buffer-es6 "^4.9.2" 1493 | crypto-browserify "^3.11.0" 1494 | process-es6 "^0.11.2" 1495 | 1496 | rollup@^1.31.0: 1497 | version "1.32.1" 1498 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" 1499 | integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== 1500 | dependencies: 1501 | "@types/estree" "*" 1502 | "@types/node" "*" 1503 | acorn "^7.1.0" 1504 | 1505 | rxjs@^6.5.2: 1506 | version "6.6.7" 1507 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" 1508 | integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== 1509 | dependencies: 1510 | tslib "^1.9.0" 1511 | 1512 | safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1513 | version "5.1.2" 1514 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1515 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1516 | 1517 | safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: 1518 | version "5.2.1" 1519 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1520 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1521 | 1522 | safer-buffer@^2.1.0: 1523 | version "2.1.2" 1524 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1525 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1526 | 1527 | "semver@2 || 3 || 4 || 5": 1528 | version "5.7.1" 1529 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1530 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== 1531 | 1532 | semver@~2.3.1: 1533 | version "2.3.2" 1534 | resolved "https://registry.yarnpkg.com/semver/-/semver-2.3.2.tgz#b9848f25d6cf36333073ec9ef8856d42f1233e52" 1535 | integrity sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI= 1536 | 1537 | serve-handler@6.1.3: 1538 | version "6.1.3" 1539 | resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz#1bf8c5ae138712af55c758477533b9117f6435e8" 1540 | integrity sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w== 1541 | dependencies: 1542 | bytes "3.0.0" 1543 | content-disposition "0.5.2" 1544 | fast-url-parser "1.1.3" 1545 | mime-types "2.1.18" 1546 | minimatch "3.0.4" 1547 | path-is-inside "1.0.2" 1548 | path-to-regexp "2.2.1" 1549 | range-parser "1.2.0" 1550 | 1551 | serve@^11.3.0: 1552 | version "11.3.2" 1553 | resolved "https://registry.yarnpkg.com/serve/-/serve-11.3.2.tgz#b905e980616feecd170e51c8f979a7b2374098f5" 1554 | integrity sha512-yKWQfI3xbj/f7X1lTBg91fXBP0FqjJ4TEi+ilES5yzH0iKJpN5LjNb1YzIfQg9Rqn4ECUS2SOf2+Kmepogoa5w== 1555 | dependencies: 1556 | "@zeit/schemas" "2.6.0" 1557 | ajv "6.5.3" 1558 | arg "2.0.0" 1559 | boxen "1.3.0" 1560 | chalk "2.4.1" 1561 | clipboardy "1.2.3" 1562 | compression "1.7.3" 1563 | serve-handler "6.1.3" 1564 | update-check "1.5.2" 1565 | 1566 | set-blocking@^2.0.0: 1567 | version "2.0.0" 1568 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1569 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 1570 | 1571 | sha.js@^2.4.0, sha.js@^2.4.8: 1572 | version "2.4.11" 1573 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 1574 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 1575 | dependencies: 1576 | inherits "^2.0.1" 1577 | safe-buffer "^5.0.1" 1578 | 1579 | shebang-command@^1.2.0: 1580 | version "1.2.0" 1581 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1582 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 1583 | dependencies: 1584 | shebang-regex "^1.0.0" 1585 | 1586 | shebang-regex@^1.0.0: 1587 | version "1.0.0" 1588 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1589 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 1590 | 1591 | signal-exit@^3.0.0: 1592 | version "3.0.3" 1593 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1594 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== 1595 | 1596 | source-map-support@^0.5.17: 1597 | version "0.5.19" 1598 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 1599 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 1600 | dependencies: 1601 | buffer-from "^1.0.0" 1602 | source-map "^0.6.0" 1603 | 1604 | source-map@^0.6.0: 1605 | version "0.6.1" 1606 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1607 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1608 | 1609 | sourcemap-codec@^1.4.4: 1610 | version "1.4.8" 1611 | resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" 1612 | integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== 1613 | 1614 | spawn-command@^0.0.2-1: 1615 | version "0.0.2-1" 1616 | resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" 1617 | integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= 1618 | 1619 | spdx-correct@^3.0.0: 1620 | version "3.1.1" 1621 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" 1622 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== 1623 | dependencies: 1624 | spdx-expression-parse "^3.0.0" 1625 | spdx-license-ids "^3.0.0" 1626 | 1627 | spdx-exceptions@^2.1.0: 1628 | version "2.3.0" 1629 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" 1630 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== 1631 | 1632 | spdx-expression-parse@^3.0.0: 1633 | version "3.0.1" 1634 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" 1635 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== 1636 | dependencies: 1637 | spdx-exceptions "^2.1.0" 1638 | spdx-license-ids "^3.0.0" 1639 | 1640 | spdx-license-ids@^3.0.0: 1641 | version "3.0.9" 1642 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" 1643 | integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== 1644 | 1645 | string-range@~1.2, string-range@~1.2.1: 1646 | version "1.2.2" 1647 | resolved "https://registry.yarnpkg.com/string-range/-/string-range-1.2.2.tgz#a893ed347e72299bc83befbbf2a692a8d239d5dd" 1648 | integrity sha1-qJPtNH5yKZvIO++78qaSqNI51d0= 1649 | 1650 | string-width@^2.0.0, string-width@^2.1.1: 1651 | version "2.1.1" 1652 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1653 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1654 | dependencies: 1655 | is-fullwidth-code-point "^2.0.0" 1656 | strip-ansi "^4.0.0" 1657 | 1658 | string-width@^3.0.0, string-width@^3.1.0: 1659 | version "3.1.0" 1660 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1661 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== 1662 | dependencies: 1663 | emoji-regex "^7.0.1" 1664 | is-fullwidth-code-point "^2.0.0" 1665 | strip-ansi "^5.1.0" 1666 | 1667 | string-width@^4.1.0, string-width@^4.2.0: 1668 | version "4.2.2" 1669 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" 1670 | integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== 1671 | dependencies: 1672 | emoji-regex "^8.0.0" 1673 | is-fullwidth-code-point "^3.0.0" 1674 | strip-ansi "^6.0.0" 1675 | 1676 | string_decoder@^1.1.1: 1677 | version "1.3.0" 1678 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" 1679 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1680 | dependencies: 1681 | safe-buffer "~5.2.0" 1682 | 1683 | string_decoder@~0.10.x: 1684 | version "0.10.31" 1685 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1686 | integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= 1687 | 1688 | string_decoder@~1.1.1: 1689 | version "1.1.1" 1690 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1691 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1692 | dependencies: 1693 | safe-buffer "~5.1.0" 1694 | 1695 | strip-ansi@^4.0.0: 1696 | version "4.0.0" 1697 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1698 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1699 | dependencies: 1700 | ansi-regex "^3.0.0" 1701 | 1702 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1703 | version "5.2.0" 1704 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1705 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 1706 | dependencies: 1707 | ansi-regex "^4.1.0" 1708 | 1709 | strip-ansi@^6.0.0: 1710 | version "6.0.0" 1711 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1712 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 1713 | dependencies: 1714 | ansi-regex "^5.0.0" 1715 | 1716 | strip-eof@^1.0.0: 1717 | version "1.0.0" 1718 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1719 | integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= 1720 | 1721 | strip-json-comments@~2.0.1: 1722 | version "2.0.1" 1723 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1724 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 1725 | 1726 | supports-color@^5.3.0: 1727 | version "5.5.0" 1728 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1729 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1730 | dependencies: 1731 | has-flag "^3.0.0" 1732 | 1733 | supports-color@^6.1.0: 1734 | version "6.1.0" 1735 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" 1736 | integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== 1737 | dependencies: 1738 | has-flag "^3.0.0" 1739 | 1740 | term-size@^1.2.0: 1741 | version "1.2.0" 1742 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" 1743 | integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= 1744 | dependencies: 1745 | execa "^0.7.0" 1746 | 1747 | tree-kill@^1.2.2: 1748 | version "1.2.2" 1749 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" 1750 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== 1751 | 1752 | ts-node@^9.1.1: 1753 | version "9.1.1" 1754 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" 1755 | integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== 1756 | dependencies: 1757 | arg "^4.1.0" 1758 | create-require "^1.1.0" 1759 | diff "^4.0.1" 1760 | make-error "^1.1.1" 1761 | source-map-support "^0.5.17" 1762 | yn "3.1.1" 1763 | 1764 | tslib@^1.10.0, tslib@^1.9.0: 1765 | version "1.14.1" 1766 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" 1767 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1768 | 1769 | typedarray-to-buffer@~1.0.0: 1770 | version "1.0.4" 1771 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz#9bb8ba0e841fb3f4cf1fe7c245e9f3fa8a5fe99c" 1772 | integrity sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw= 1773 | 1774 | typedarray@^0.0.6: 1775 | version "0.0.6" 1776 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1777 | integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= 1778 | 1779 | typescript-json-schema@^0.50.1: 1780 | version "0.50.1" 1781 | resolved "https://registry.yarnpkg.com/typescript-json-schema/-/typescript-json-schema-0.50.1.tgz#48041eb9f6efbdf4ba88c3e3af9433601f7a2b47" 1782 | integrity sha512-GCof/SDoiTDl0qzPonNEV4CHyCsZEIIf+mZtlrjoD8vURCcEzEfa2deRuxYid8Znp/e27eDR7Cjg8jgGrimBCA== 1783 | dependencies: 1784 | "@types/json-schema" "^7.0.7" 1785 | "@types/node" "^14.14.33" 1786 | glob "^7.1.6" 1787 | json-stable-stringify "^1.0.1" 1788 | ts-node "^9.1.1" 1789 | typescript "~4.2.3" 1790 | yargs "^16.2.0" 1791 | 1792 | typescript@^4.3.5: 1793 | version "4.3.5" 1794 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" 1795 | integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== 1796 | 1797 | typescript@~4.2.3: 1798 | version "4.2.4" 1799 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" 1800 | integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== 1801 | 1802 | update-check@1.5.2: 1803 | version "1.5.2" 1804 | resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.2.tgz#2fe09f725c543440b3d7dabe8971f2d5caaedc28" 1805 | integrity sha512-1TrmYLuLj/5ZovwUS7fFd1jMH3NnFDN1y1A8dboedIDt7zs/zJMo6TwwlhYKkSeEwzleeiSBV5/3c9ufAQWDaQ== 1806 | dependencies: 1807 | registry-auth-token "3.3.2" 1808 | registry-url "3.1.0" 1809 | 1810 | uri-js@^4.2.2: 1811 | version "4.4.1" 1812 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1813 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1814 | dependencies: 1815 | punycode "^2.1.0" 1816 | 1817 | util-deprecate@^1.0.1, util-deprecate@~1.0.1: 1818 | version "1.0.2" 1819 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1820 | integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= 1821 | 1822 | validate-npm-package-license@^3.0.1: 1823 | version "3.0.4" 1824 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 1825 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== 1826 | dependencies: 1827 | spdx-correct "^3.0.0" 1828 | spdx-expression-parse "^3.0.0" 1829 | 1830 | vary@~1.1.2: 1831 | version "1.1.2" 1832 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1833 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 1834 | 1835 | which-module@^2.0.0: 1836 | version "2.0.0" 1837 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1838 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 1839 | 1840 | which@^1.2.9: 1841 | version "1.3.1" 1842 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 1843 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 1844 | dependencies: 1845 | isexe "^2.0.0" 1846 | 1847 | widest-line@^2.0.0: 1848 | version "2.0.1" 1849 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" 1850 | integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== 1851 | dependencies: 1852 | string-width "^2.1.1" 1853 | 1854 | wrap-ansi@^5.1.0: 1855 | version "5.1.0" 1856 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 1857 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== 1858 | dependencies: 1859 | ansi-styles "^3.2.0" 1860 | string-width "^3.0.0" 1861 | strip-ansi "^5.0.0" 1862 | 1863 | wrap-ansi@^7.0.0: 1864 | version "7.0.0" 1865 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1866 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1867 | dependencies: 1868 | ansi-styles "^4.0.0" 1869 | string-width "^4.1.0" 1870 | strip-ansi "^6.0.0" 1871 | 1872 | wrappy@1: 1873 | version "1.0.2" 1874 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1875 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1876 | 1877 | xtend@^2.2.0: 1878 | version "2.2.0" 1879 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.2.0.tgz#eef6b1f198c1c8deafad8b1765a04dad4a01c5a9" 1880 | integrity sha1-7vax8ZjByN6vrYsXZaBNrUoBxak= 1881 | 1882 | xtend@~2.0.4: 1883 | version "2.0.6" 1884 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.0.6.tgz#5ea657a6dba447069c2e59c58a1138cb0c5e6cee" 1885 | integrity sha1-XqZXptukRwacLlnFihE4ywxebO4= 1886 | dependencies: 1887 | is-object "~0.1.2" 1888 | object-keys "~0.2.0" 1889 | 1890 | xtend@~2.1.2: 1891 | version "2.1.2" 1892 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" 1893 | integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= 1894 | dependencies: 1895 | object-keys "~0.4.0" 1896 | 1897 | xtend@~3.0.0: 1898 | version "3.0.0" 1899 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" 1900 | integrity sha1-XM50B7r2Qsunvs2laBEcST9ZZlo= 1901 | 1902 | y18n@^4.0.0: 1903 | version "4.0.3" 1904 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" 1905 | integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== 1906 | 1907 | y18n@^5.0.5: 1908 | version "5.0.8" 1909 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1910 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1911 | 1912 | yallist@^2.1.2: 1913 | version "2.1.2" 1914 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 1915 | integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= 1916 | 1917 | yargs-parser@^13.1.2: 1918 | version "13.1.2" 1919 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 1920 | integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== 1921 | dependencies: 1922 | camelcase "^5.0.0" 1923 | decamelize "^1.2.0" 1924 | 1925 | yargs-parser@^20.2.2: 1926 | version "20.2.9" 1927 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1928 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1929 | 1930 | yargs@^13.3.0: 1931 | version "13.3.2" 1932 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 1933 | integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== 1934 | dependencies: 1935 | cliui "^5.0.0" 1936 | find-up "^3.0.0" 1937 | get-caller-file "^2.0.1" 1938 | require-directory "^2.1.1" 1939 | require-main-filename "^2.0.0" 1940 | set-blocking "^2.0.0" 1941 | string-width "^3.0.0" 1942 | which-module "^2.0.0" 1943 | y18n "^4.0.0" 1944 | yargs-parser "^13.1.2" 1945 | 1946 | yargs@^16.2.0: 1947 | version "16.2.0" 1948 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1949 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1950 | dependencies: 1951 | cliui "^7.0.2" 1952 | escalade "^3.1.1" 1953 | get-caller-file "^2.0.5" 1954 | require-directory "^2.1.1" 1955 | string-width "^4.2.0" 1956 | y18n "^5.0.5" 1957 | yargs-parser "^20.2.2" 1958 | 1959 | yn@3.1.1: 1960 | version "3.1.1" 1961 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 1962 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1963 | --------------------------------------------------------------------------------