├── .editorconfig ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── bin └── tsc-silent ├── example.config.js ├── package.json ├── src └── tsc-silent.ts ├── tsconfig.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | indent_size = 4 4 | indent_style = space 5 | end_of_line = lf 6 | insert_final_newline = true 7 | 8 | [*.json] 9 | indent_size = 2 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /dist 2 | /node_modules -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib" 3 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Evolution Gaming 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `tsc-silent` 2 | 3 | The purpose of the wrapper is to execute TypeScript compiler but suppress some error messages 4 | coming from certain files/folders. For example, this can be used to enable `noImplicitAny` in 5 | some parts of the project while keeping it disabled in others. 6 | 7 | ## Installing 8 | 9 | ```bash 10 | npm install -g tsc-silent 11 | ``` 12 | 13 | ## Usage 14 | 15 | ``` 16 | tsc-silent --project [--suppress config | --suppressConfig path] [--compiler path] [--watch] 17 | ``` 18 | 19 | ## Synopsis 20 | 21 | ``` 22 | --project, -p Path to tsconfig.json 23 | 24 | --compiler Path to typescript.js. 25 | By default, uses `./node_modules/typescript/lib/typescript.js`. 26 | 27 | --suppress Suppressed erros. 28 | E.g. `--suppress 7017@src/js/ 2322,2339,2344@/src/legacy/`. 29 | 30 | --suppressConfig Path to supressed errors config. 31 | See documentation for examples. 32 | 33 | --watch, -w Run in watch mode. 34 | 35 | --stats Print number of suppressed errors per path and error code. 36 | ``` 37 | 38 | ## Suppress config 39 | 40 | You have to pass either `--suppress` or `--suppressConfig`. 41 | 42 | ### `--suppress` 43 | 44 | Let's ignore error `7017` in `src/js/` directory and errors `2322, 2339, 2344` in `/src/legacy/`: 45 | 46 | ```bash 47 | tsc-silent -p tsconfig.json --suppress 7017@/src/js/ 2322,2339,2344@/src/legacy/ 48 | ``` 49 | 50 | or, ignore all errors in `/src/legacy/` folder 51 | 52 | ```bash 53 | tsc-silent -p tsconfig.json --suppress @/src/legacy/ 54 | ``` 55 | 56 | or, completely ignore all errors 57 | 58 | ```bash 59 | tsc-silent -p tsconfig.json --suppress @ 60 | ``` 61 | 62 | ### `--suppressConfig` 63 | 64 | ```bash 65 | tsc-silent -p tsconfig.json --suppressConfig tsc-silent.config.js 66 | ``` 67 | 68 | See [example.config.js](./example.config.js). 69 | 70 | 71 | ## Intended/typical use 72 | 73 | Check out [the article](https://birukov.me/blog/all/tsc-silent.html) to see the intended use. 74 | -------------------------------------------------------------------------------- /bin/tsc-silent: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require("../dist/tsc-silent"); 4 | -------------------------------------------------------------------------------- /example.config.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = { 3 | suppress: [ 4 | { 5 | // Ignore codes `7006, 7017` in `/src/js/general` directory 6 | pathRegExp: '/src/js/general', 7 | codes: [7006, 7017], 8 | }, 9 | { 10 | // Ignore codes `2322, 2339, 2341, 2445, 2531, 2540` in *.spec.* files located in `/packages/foo/src/engine/` 11 | pathRegExp: '/packages/foo/src/engine/.*\\.spec\\..*', 12 | codes: [2322, 2339, 2341, 2445, 2531, 2540], 13 | }, 14 | ], 15 | }; 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tsc-silent", 3 | "version": "1.2.2", 4 | "description": "tsc with --supress", 5 | "main": "dist/tsc-silent.js", 6 | "scripts": { 7 | "build": "rm -rf dist && tsc", 8 | "version": "yarn build && git add .", 9 | "prepublishOnly": "yarn build", 10 | "postversion": "git push && git push --tags" 11 | }, 12 | "bin": { 13 | "tsc-silent": "./bin/tsc-silent" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/evolution-gaming/tsc-silent.git" 18 | }, 19 | "homepage": "https://github.com/evolution-gaming/tsc-silent", 20 | "files": [ 21 | "/src", 22 | "/dist", 23 | "/bin", 24 | "README.md" 25 | ], 26 | "author": "Evolution Gaming", 27 | "license": "MIT", 28 | "dependencies": { 29 | "@types/node": "10.12.7", 30 | "yargs": "12 - 15" 31 | }, 32 | "peerDependencies": { 33 | "typescript": ">=2.9", 34 | "yargs": "12 - 15" 35 | }, 36 | "devDependencies": { 37 | "typescript": "3.1.6" 38 | }, 39 | "engines": { 40 | "npm": ">=5" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/tsc-silent.ts: -------------------------------------------------------------------------------- 1 | // tslint:disable no-console 2 | interface Argv { 3 | suppress: string[]; 4 | compiler: string; 5 | project: string; 6 | watch: boolean; 7 | stats: boolean; 8 | help: boolean; 9 | suppressConfig?: string; 10 | _: string[]; 11 | } 12 | const argv: Argv = require("yargs") 13 | .array("suppress").default("suppress", []) 14 | .string("compiler").default("compiler", "node_modules/typescript/lib/typescript.js") 15 | .string("project").alias("project", "p") 16 | .boolean("watch").default("watch", false).alias("watch", "w") 17 | .boolean("stats").default("stats", false) 18 | .boolean("help") 19 | .parse(process.argv); 20 | 21 | if (!argv.project || argv.help || argv._.length > 2) { 22 | printUsage(); 23 | process.exit(1); 24 | } 25 | 26 | import * as fs from "fs"; 27 | import * as path from "path"; 28 | 29 | import * as ts from "typescript"; 30 | // @ts-ignore 31 | ts = require(path.resolve(argv.compiler)); 32 | 33 | interface StatisticsItem { 34 | codes: { 35 | [code: string]: number; 36 | }; 37 | total: number; 38 | pathRegExp: string; 39 | } 40 | 41 | interface RawSupressConfig { 42 | codes: number[]; 43 | pathRegExp: string; 44 | } 45 | 46 | interface SupressConfigFile { 47 | suppress: RawSupressConfig[]; 48 | } 49 | 50 | interface SupressConfig { 51 | codes: number[]; 52 | pathRegExp: RegExp | null; 53 | } 54 | 55 | const config = ( 56 | argv.suppressConfig 57 | ? require(path.resolve(argv.suppressConfig)) as SupressConfigFile 58 | : null 59 | ); 60 | 61 | const supressConfig = ( 62 | config 63 | ? parseSuppressRules(config.suppress) 64 | : argv.suppress.map(prepareSuppressArg) 65 | ); 66 | 67 | console.log(`Using TypeScript compiler version ${ts.version} from ${path.resolve(argv.compiler)}`); 68 | const formatHost: ts.FormatDiagnosticsHost = { 69 | getCanonicalFileName: (filename: string) => filename, 70 | getCurrentDirectory: ts.sys.getCurrentDirectory, 71 | getNewLine: () => ts.sys.newLine 72 | }; 73 | 74 | if (argv.watch) { 75 | let watchDiagnostics: ts.Diagnostic[] = []; 76 | const createProgram = ts.createSemanticDiagnosticsBuilderProgram; 77 | const watchCompilerHost = ts.createWatchCompilerHost( 78 | argv.project, 79 | {}, 80 | ts.sys, 81 | createProgram, 82 | function reportDiagnostic(diagnostic: ts.Diagnostic) { 83 | watchDiagnostics.push(diagnostic); 84 | }, 85 | function reportWatchStatusChanged(diagnostic: ts.Diagnostic) { 86 | if (diagnostic.code === 6031 || diagnostic.code === 6032) { // Starting compilation | File change detected 87 | process.stdout.write("\u001b[2J\u001b[0;0H"); // clear console 88 | watchDiagnostics = []; 89 | assertDiagnostics(diagnostic, formatHost, false); 90 | } else if (diagnostic.code === 6194) { // Compilation done 91 | assertDiagnostics(diagnostic, formatHost, false); 92 | assertDiagnostics(watchDiagnostics, formatHost); 93 | console.log("Watching for file changes."); 94 | } 95 | } 96 | ); 97 | const origCreateProgram = watchCompilerHost.createProgram; 98 | watchCompilerHost.createProgram = ( 99 | rootNames, 100 | options, 101 | wcHost, 102 | oldProgram 103 | ) => origCreateProgram(rootNames, options, wcHost, oldProgram); 104 | const origPostProgramCreate = watchCompilerHost.afterProgramCreate; 105 | watchCompilerHost.afterProgramCreate = program => { 106 | origPostProgramCreate!(program); 107 | }; 108 | ts.createWatchProgram(watchCompilerHost); 109 | } else { 110 | const configObject = ts.parseConfigFileTextToJson(argv.project, fs.readFileSync(argv.project).toString()); 111 | assertDiagnostics(configObject.error, formatHost, false); 112 | 113 | const configParseResult 114 | = ts.parseJsonConfigFileContent(configObject.config, ts.sys, process.cwd(), undefined, argv.project); 115 | assertDiagnostics(configParseResult.errors, formatHost, false); 116 | 117 | const compilerHost = ts.createCompilerHost(configParseResult.options); 118 | const programOptions = { 119 | rootNames: configParseResult.fileNames, 120 | options: configParseResult.options, 121 | projectReferences: configParseResult.projectReferences, 122 | host: compilerHost, 123 | configFileParsingDiagnostics: ts.getConfigFileParsingDiagnostics(configParseResult) 124 | }; 125 | const program = ts.createProgram(programOptions); 126 | const emitResult = program.emit(); 127 | 128 | if (configParseResult.options.noEmitOnError) { 129 | console.warn('You have `noEmitOnError` enabled, if any error occurs TypeScript will not generate any JavaScript output files even if `tsc-silent` exits with 0.'); 130 | } 131 | 132 | process.exit( 133 | assertDiagnostics(ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics), compilerHost), 134 | ); 135 | } 136 | 137 | // @ts-ignore // ******************************** 138 | return; // Only functions follow this point 139 | // ******************************** 140 | 141 | function assertDiagnostics( 142 | diagnostics: ts.Diagnostic[] | ts.Diagnostic | undefined, 143 | formatDiagnosticsHost: ts.FormatDiagnosticsHost, 144 | allowSuppress = true, 145 | ): number { 146 | if (!diagnostics) { 147 | return 0; 148 | } 149 | if (!Array.isArray(diagnostics)) { 150 | diagnostics = [diagnostics]; 151 | } 152 | if (!diagnostics.length) { 153 | return 0; 154 | } 155 | 156 | let diagnosticsToShow: ts.Diagnostic[] = []; 157 | const suppressedDiagnostics: ts.Diagnostic[] = []; 158 | 159 | if (allowSuppress) { 160 | for (let d of diagnostics) { 161 | if (isSuppressed(d.code, d.file && d.file.fileName)) { 162 | suppressedDiagnostics.push(d); 163 | } else { 164 | diagnosticsToShow.push(d); 165 | } 166 | } 167 | } else { 168 | diagnosticsToShow = diagnostics; 169 | } 170 | 171 | if (diagnosticsToShow.length) { 172 | // console.(error | warn) does not allow to grep output (OS X) 173 | console.log(ts.formatDiagnosticsWithColorAndContext(diagnosticsToShow, formatDiagnosticsHost)); 174 | } 175 | if (allowSuppress) { 176 | if (argv.stats) { 177 | console.log(JSON.stringify(getStatistics(suppressedDiagnostics), null, " ")); 178 | } 179 | console.warn(`Visible errors: ${diagnosticsToShow.length}, suppressed errors: ${suppressedDiagnostics.length}`); 180 | } 181 | if (diagnosticsToShow.length) { 182 | return 2; 183 | } 184 | return 0; 185 | } 186 | 187 | function prepareSuppressArg(arg: string) { 188 | const suppress: SupressConfig = { 189 | codes: [], 190 | pathRegExp: null, 191 | }; 192 | const pathIndex = arg.indexOf("@"); 193 | if (pathIndex === -1) { 194 | console.error(`Cannot parse suppression '${arg}'`); 195 | printUsage(); 196 | process.exit(1); 197 | } 198 | if (pathIndex > 0) { 199 | suppress.codes = arg.substr(0, pathIndex).split(",").map(Number); 200 | } 201 | if (pathIndex < arg.length - 1) { 202 | suppress.pathRegExp = new RegExp(arg.substr(pathIndex + 1)); 203 | } 204 | return suppress; 205 | } 206 | 207 | function parseSuppressRules(suppressRules: RawSupressConfig[]): SupressConfig[] { 208 | return suppressRules.map((rule) => ({ 209 | ...rule, 210 | pathRegExp: new RegExp(rule.pathRegExp), 211 | })); 212 | } 213 | 214 | function isSuppressed(code: number, fileName?: string) { 215 | if (!fileName) { 216 | return false; 217 | } 218 | for (const suppress of supressConfig) { 219 | if (suppress.codes.length && suppress.codes.indexOf(code) === -1) { 220 | continue; 221 | } 222 | if (suppress.pathRegExp && !suppress.pathRegExp.test(fileName)) { 223 | continue; 224 | } 225 | return true; 226 | } 227 | return false; 228 | } 229 | 230 | function getStatistics(suppressedDiagnostics: ts.Diagnostic[]): StatisticsItem[] { 231 | const statistics = []; 232 | for (const suppress of supressConfig) { 233 | const statisticsItemCodes: StatisticsItem["codes"] = {}; 234 | for (let code of suppress.codes) { 235 | statisticsItemCodes[code] = 0; 236 | } 237 | const statisticsItem: StatisticsItem = { 238 | codes: statisticsItemCodes, 239 | pathRegExp: (suppress.pathRegExp || "").toString(), 240 | total: 0, 241 | }; 242 | statistics.push(statisticsItem); 243 | for (let suppressedDiag of suppressedDiagnostics) { 244 | if (suppress.pathRegExp && suppress.pathRegExp.test(suppressedDiag.file!.fileName)) { 245 | statisticsItem.total++; 246 | if (suppress.codes.length && suppress.codes.indexOf(suppressedDiag.code) !== -1) { 247 | statisticsItemCodes[suppressedDiag.code]++; 248 | } 249 | } 250 | } 251 | } 252 | return statistics; 253 | } 254 | 255 | function printUsage() { 256 | console.log("Usage:"); 257 | console.log(" tsc-silent --project [--suppress config | --suppressConfig path] [--compiler path]"); 258 | console.log(" [--watch]"); 259 | console.log(); 260 | console.log("Synopsis:"); 261 | console.log(" --project, -p Path to tsconfig.json"); 262 | console.log(); 263 | console.log(" --compiler Path to typescript.js."); 264 | console.log(" By default, uses `./node_modules/typescript/lib/typescript.js`."); 265 | console.log(); 266 | console.log(" --suppress Suppressed erros."); 267 | console.log(" E.g. `--suppress 7017@src/js/ 2322,2339,2344@/src/legacy/`.") 268 | console.log(); 269 | console.log(" --suppressConfig Path to supressed errors config."); 270 | console.log(" See documentation for examples."); 271 | console.log(); 272 | console.log(" --watch, -w Run in watch mode."); 273 | console.log(); 274 | console.log(" --stats Print number of suppressed errors per path and error code."); 275 | console.log(); 276 | console.log("Description:"); 277 | console.log("The purpose of the wrapper is to execute TypeScript compiler but suppress some error messages"); 278 | console.log("coming from certain files/folders. For example, this can be used to enable `noImplicitAny` in"); 279 | console.log("some parts of the project while keeping it disabled in others."); 280 | console.log(); 281 | } 282 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "outDir": "./dist", 6 | "strict": true, 7 | "esModuleInterop": true 8 | }, 9 | "include": ["./src/**/*"] 10 | } 11 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/color-name@^1.1.1": 6 | version "1.1.1" 7 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 8 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== 9 | 10 | "@types/node@10.12.7": 11 | version "10.12.7" 12 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.7.tgz#195808b2d4b2e7c33e75e7d9b24aeee88f94660d" 13 | integrity sha512-Zh5Z4kACfbeE8aAOYh9mqotRxaZMro8MbBQtR8vEXOMiZo2rGEh2LayJijKdlu48YnS6y2EFU/oo2NCe5P6jGw== 14 | 15 | ansi-regex@^5.0.0: 16 | version "5.0.0" 17 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 18 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== 19 | 20 | ansi-styles@^4.0.0: 21 | version "4.2.1" 22 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 23 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== 24 | dependencies: 25 | "@types/color-name" "^1.1.1" 26 | color-convert "^2.0.1" 27 | 28 | camelcase@^5.0.0: 29 | version "5.2.0" 30 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" 31 | integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ== 32 | 33 | cliui@^6.0.0: 34 | version "6.0.0" 35 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" 36 | integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== 37 | dependencies: 38 | string-width "^4.2.0" 39 | strip-ansi "^6.0.0" 40 | wrap-ansi "^6.2.0" 41 | 42 | color-convert@^2.0.1: 43 | version "2.0.1" 44 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 45 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 46 | dependencies: 47 | color-name "~1.1.4" 48 | 49 | color-name@~1.1.4: 50 | version "1.1.4" 51 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 52 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 53 | 54 | decamelize@^1.2.0: 55 | version "1.2.0" 56 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 57 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 58 | 59 | emoji-regex@^8.0.0: 60 | version "8.0.0" 61 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 62 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 63 | 64 | find-up@^4.1.0: 65 | version "4.1.0" 66 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 67 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 68 | dependencies: 69 | locate-path "^5.0.0" 70 | path-exists "^4.0.0" 71 | 72 | get-caller-file@^2.0.1: 73 | version "2.0.5" 74 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 75 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 76 | 77 | is-fullwidth-code-point@^3.0.0: 78 | version "3.0.0" 79 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 80 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 81 | 82 | locate-path@^5.0.0: 83 | version "5.0.0" 84 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 85 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 86 | dependencies: 87 | p-locate "^4.1.0" 88 | 89 | p-limit@^2.2.0: 90 | version "2.2.2" 91 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" 92 | integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== 93 | dependencies: 94 | p-try "^2.0.0" 95 | 96 | p-locate@^4.1.0: 97 | version "4.1.0" 98 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 99 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 100 | dependencies: 101 | p-limit "^2.2.0" 102 | 103 | p-try@^2.0.0: 104 | version "2.0.0" 105 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" 106 | integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== 107 | 108 | path-exists@^4.0.0: 109 | version "4.0.0" 110 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 111 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 112 | 113 | require-directory@^2.1.1: 114 | version "2.1.1" 115 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 116 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 117 | 118 | require-main-filename@^2.0.0: 119 | version "2.0.0" 120 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 121 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== 122 | 123 | set-blocking@^2.0.0: 124 | version "2.0.0" 125 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 126 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= 127 | 128 | string-width@^4.1.0, string-width@^4.2.0: 129 | version "4.2.0" 130 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 131 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 132 | dependencies: 133 | emoji-regex "^8.0.0" 134 | is-fullwidth-code-point "^3.0.0" 135 | strip-ansi "^6.0.0" 136 | 137 | strip-ansi@^6.0.0: 138 | version "6.0.0" 139 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 140 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 141 | dependencies: 142 | ansi-regex "^5.0.0" 143 | 144 | typescript@3.1.6: 145 | version "3.1.6" 146 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" 147 | integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA== 148 | 149 | which-module@^2.0.0: 150 | version "2.0.0" 151 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 152 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 153 | 154 | wrap-ansi@^6.2.0: 155 | version "6.2.0" 156 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 157 | integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== 158 | dependencies: 159 | ansi-styles "^4.0.0" 160 | string-width "^4.1.0" 161 | strip-ansi "^6.0.0" 162 | 163 | y18n@^4.0.0: 164 | version "4.0.0" 165 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 166 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== 167 | 168 | yargs-parser@^16.1.0: 169 | version "16.1.0" 170 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1" 171 | integrity sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg== 172 | dependencies: 173 | camelcase "^5.0.0" 174 | decamelize "^1.2.0" 175 | 176 | "yargs@12 - 15": 177 | version "15.1.0" 178 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.1.0.tgz#e111381f5830e863a89550bd4b136bb6a5f37219" 179 | integrity sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg== 180 | dependencies: 181 | cliui "^6.0.0" 182 | decamelize "^1.2.0" 183 | find-up "^4.1.0" 184 | get-caller-file "^2.0.1" 185 | require-directory "^2.1.1" 186 | require-main-filename "^2.0.0" 187 | set-blocking "^2.0.0" 188 | string-width "^4.2.0" 189 | which-module "^2.0.0" 190 | y18n "^4.0.0" 191 | yargs-parser "^16.1.0" 192 | --------------------------------------------------------------------------------