├── .github └── FUNDING.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── CHANGELOG.md ├── DEPENDENCIES.md ├── README.md ├── package.json ├── src ├── bin.ts └── index.ts ├── tsconfig.json └── yarn.lock /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: JamieMason 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | *.log.* 3 | coverage 4 | dist 5 | node_modules 6 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | **/*.md 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "always", 3 | "printWidth": 120, 4 | "proseWrap": "always", 5 | "singleQuote": true, 6 | "trailingComma": "all" 7 | } 8 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [0.6.2](https://github.com/JamieMason/ts-import-types-cli/compare/0.3.1...0.6.2) (2020-12-13) 2 | 3 | 4 | ### Bug Fixes 5 | 6 | * **default:** output default imports correctly ([3a2a87b](https://github.com/JamieMason/ts-import-types-cli/commit/3a2a87b4f4977435917bd22b64e21efbc63b20d2)) 7 | 8 | 9 | ### Features 10 | 11 | * **directives:** highlight files with triple-slash directives ([5b664b3](https://github.com/JamieMason/ts-import-types-cli/commit/5b664b3e14be7f5c08c7504d65d962a5154b07f1)) 12 | * **output:** skip unchanged files ([731a6e5](https://github.com/JamieMason/ts-import-types-cli/commit/731a6e5c757e03a176b866c7e70eef8be7ffa110)) 13 | * **stdout:** improve logging output ([ace21f4](https://github.com/JamieMason/ts-import-types-cli/commit/ace21f448b9b9652e481823bb7caa30e16b2019c)) 14 | 15 | 16 | 17 | ## [0.3.1](https://github.com/JamieMason/ts-import-types-cli/compare/0.3.0...0.3.1) (2020-12-12) 18 | 19 | 20 | ### Bug Fixes 21 | 22 | * **aliases:** handle import { name as alias } ([548d276](https://github.com/JamieMason/ts-import-types-cli/commit/548d2761d0e8109c61b21f7c3d0fe25c0710b57a)) 23 | 24 | 25 | 26 | # [0.3.0](https://github.com/JamieMason/ts-import-types-cli/compare/0.2.0...0.3.0) (2020-12-12) 27 | 28 | 29 | ### Features 30 | 31 | * **cli:** accept multiple glob patterns to .ts files ([aa05415](https://github.com/JamieMason/ts-import-types-cli/commit/aa0541503ec30bd0610d7b3b42e6f63ad835e50c)) 32 | 33 | 34 | 35 | # [0.2.0](https://github.com/JamieMason/ts-import-types-cli/compare/0.1.0...0.2.0) (2020-12-12) 36 | 37 | 38 | ### Features 39 | 40 | * **cli:** write progress to stdout ([3566275](https://github.com/JamieMason/ts-import-types-cli/commit/3566275e64632bf9ee33ef474e343a0bf9b9a312)) 41 | 42 | 43 | 44 | # [0.1.0](https://github.com/JamieMason/ts-import-types-cli/compare/558e0d92000ae4791b405dd893d6ba7471a1f6fc...0.1.0) (2020-12-12) 45 | 46 | 47 | ### Features 48 | 49 | * **cli:** autofix typeScript types to be imported using `import type` ([558e0d9](https://github.com/JamieMason/ts-import-types-cli/commit/558e0d92000ae4791b405dd893d6ba7471a1f6fc)) 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /DEPENDENCIES.md: -------------------------------------------------------------------------------- 1 | # ts-import-types-cli 2 | 3 | Autofix TypeScript types to be imported using `import type` 4 | 5 | ## Installation 6 | 7 | This is a [Node.js](https://nodejs.org/) module available through the 8 | [npm registry](https://www.npmjs.com/). It can be installed using the 9 | [`npm`](https://docs.npmjs.com/getting-started/installing-npm-packages-locally) 10 | or 11 | [`yarn`](https://yarnpkg.com/en/) 12 | command line tools. 13 | 14 | ```sh 15 | npm install ts-import-types-cli --save 16 | ``` 17 | 18 | ## Dependencies 19 | 20 | - [chalk](https://ghub.io/chalk): Terminal string styling done right 21 | - [commander](https://ghub.io/commander): the complete solution for node.js command-line programs 22 | - [ts-morph](https://ghub.io/ts-morph): TypeScript compiler wrapper for static analysis and code manipulation. 23 | 24 | ## Dev Dependencies 25 | 26 | - [@types/node](https://ghub.io/@types/node): TypeScript definitions for Node.js 27 | - [ts-node](https://ghub.io/ts-node): TypeScript execution environment and REPL for node.js, with source map support 28 | - [typescript](https://ghub.io/typescript): TypeScript is a language for application scale JavaScript development 29 | 30 | ## License 31 | 32 | MIT -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ts-import-types-cli 2 | 3 | > Autofix TypeScript types to be imported using `import type` 4 | 5 | ## Installation 6 | 7 | ``` 8 | npm install -g ts-import-types-cli 9 | ``` 10 | 11 | ## Usage 12 | 13 | ``` 14 | Usage: ts-import-types-cli [options] [patterns...] 15 | 16 | Options: 17 | -V, --version output the version number 18 | -d, --dry-run write output to stdout instead of overwriting files 19 | -p, --project [path] path to tsconfig.json 20 | -O, --no-organise-imports disable use of VS Code's organise imports refactoring 21 | -h, --help display help for command 22 | ``` 23 | 24 | ## Example 25 | 26 | ``` 27 | $ ts-import-types-cli --project ./tsconfig.json 'src/**/*.ts' 'src/**/*.tsx' 28 | ``` 29 | 30 | ```ts 31 | import { interpret, StateValue } from 'xstate'; 32 | import { sendSearch } from '../../services/search-client/send-search'; 33 | import { createAlgoliaMachine } from '../machine'; 34 | import { AlgoliaInterpreter, AlgoliaMachine } from '../machine/types'; 35 | 36 | // ...the rest of the file 37 | ``` 38 | 39 |

↓↓↓↓↓

40 | 41 | ```ts 42 | import type { StateValue } from 'xstate' 43 | import { interpret } from 'xstate' 44 | import { sendSearch } from '../../services/search-client/send-search' 45 | import { createAlgoliaMachine } from '../machine' 46 | import type { AlgoliaInterpreter, AlgoliaMachine } from '../machine/types' 47 | 48 | // ...the rest of the file 49 | ``` 50 | 51 | ## Triple-Slash Directives 52 | 53 | Moving triple-slash directives such as `/// ` back 54 | to the top of the file is not yet supported. If you know how to do this using 55 | https://ts-morph.com please [open a 56 | PR](https://github.com/JamieMason/ts-import-types-cli/pulls) or otherwise let me 57 | know. 58 | 59 | Unfortunately until then, files will need their triple-slash directives manually 60 | moving back to the top of the file. 61 | 62 | `ts-import-types-cli` will output a list of which files are affected. 63 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-import-types-cli", 3 | "description": "Autofix TypeScript types to be imported using `import type`", 4 | "version": "0.6.2", 5 | "author": "Jamie Mason (https://github.com/JamieMason)", 6 | "bin": { 7 | "ts-import-types-cli": "dist/bin.js" 8 | }, 9 | "bugs": "https://github.com/JamieMason/ts-import-types-cli/issues", 10 | "dependencies": { 11 | "chalk": "4.1.0", 12 | "commander": "6.2.0", 13 | "ts-morph": "9.1.0" 14 | }, 15 | "devDependencies": { 16 | "@types/node": "14.14.12", 17 | "ts-node": "9.1.1", 18 | "typescript": "4.1.3" 19 | }, 20 | "engines": { 21 | "node": ">=10" 22 | }, 23 | "files": [ 24 | "dist" 25 | ], 26 | "homepage": "https://github.com/JamieMason/ts-import-types-cli#readme", 27 | "keywords": [ 28 | "cli", 29 | "codemod", 30 | "codemods", 31 | "import declarations", 32 | "imports", 33 | "jscodeshift", 34 | "refactor", 35 | "ts-morph", 36 | "type-only imports", 37 | "typescript" 38 | ], 39 | "license": "MIT", 40 | "main": "ts-import-types-cli", 41 | "repository": "JamieMason/ts-import-types-cli", 42 | "scripts": { 43 | "build": "tsc --project ." 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/bin.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import chalk = require('chalk'); 4 | import program = require('commander'); 5 | import { resolve } from 'path'; 6 | import { tsImportTypes } from '.'; 7 | 8 | const sourcePatterns: string[] = []; 9 | 10 | program 11 | .version(require('../package.json').version) 12 | .arguments('[patterns...]') 13 | .action((args: string[]) => { 14 | sourcePatterns.push(...args.filter((arg) => arg && typeof arg === 'string')); 15 | }) 16 | .option('-d, --dry-run', 'write output to stdout instead of overwriting files') 17 | .option('-p, --project [path]', 'path to tsconfig.json') 18 | .option('-O, --no-organise-imports', "disable use of VS Code's organise imports refactoring") 19 | .parse(process.argv); 20 | 21 | const dryRun = program.dryRun === true; 22 | const organiseImports = program.organiseImports !== false; 23 | const project = program.project || './tsconfig.json'; 24 | const tsConfigFilePath = resolve(process.cwd(), project); 25 | 26 | try { 27 | require(tsConfigFilePath); 28 | } catch (err) { 29 | const message = `ts-import-types-cli --project ${tsConfigFilePath} is not a tsconfig.json file`; 30 | console.error(chalk.red(message)); 31 | process.exit(1); 32 | } 33 | 34 | try { 35 | tsImportTypes({ 36 | dryRun, 37 | organiseImports, 38 | sourcePatterns, 39 | tsConfigFilePath, 40 | }); 41 | } catch (err) { 42 | console.error( 43 | chalk.red('! %s\n\n! Please raise an issue at %s\n\n%s'), 44 | err.message, 45 | chalk.underline('https://github.com/JamieMason/ts-import-types-cli/issues'), 46 | String(err.stack).replace(/^/gm, ' '), 47 | ); 48 | process.exit(1); 49 | } 50 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import chalk from 'chalk'; 2 | import { EOL } from 'os'; 3 | import { relative } from 'path'; 4 | import { DefinitionInfo, ImportDeclaration, ImportSpecifier, Project, SourceFile, ts } from 'ts-morph'; 5 | 6 | interface ModuleImports { 7 | /** import { someImplementation } from './file' */ 8 | codeImports: string[]; 9 | /** import someImplementation from './file' */ 10 | defaultImport: string; 11 | /** import type { SomeType } from './file' */ 12 | typeImports: string[]; 13 | } 14 | 15 | export interface Options { 16 | /** Write output to stdout instead of overwriting files. */ 17 | dryRun: boolean; 18 | /** Disable use of VS Code's organise imports refactoring. */ 19 | organiseImports: boolean; 20 | /** Glob patterns to .ts or .tsx files. */ 21 | sourcePatterns: string[]; 22 | /** Path to tsconfig.json file. */ 23 | tsConfigFilePath: string; 24 | } 25 | 26 | const info = (...messages: Array) => { 27 | console.log(chalk.blue('i', ...messages)); 28 | }; 29 | 30 | const getRelativePath = (sourceFile: SourceFile): string => { 31 | return relative(process.cwd(), sourceFile.getFilePath()); 32 | }; 33 | 34 | const getSourceFiles = (sourcePatterns: string[], project: Project): SourceFile[] => { 35 | return sourcePatterns.length ? project.getSourceFiles(sourcePatterns) : project.getSourceFiles(); 36 | }; 37 | 38 | export function tsImportTypes({ dryRun, organiseImports, sourcePatterns, tsConfigFilePath }: Options) { 39 | info('Analysing', relative(process.cwd(), tsConfigFilePath)); 40 | 41 | const project = new Project({ tsConfigFilePath }); 42 | const sourceFiles = getSourceFiles(sourcePatterns, project); 43 | const filesWithRewrittenDirectives: string[] = []; 44 | 45 | info('Found', sourceFiles.length, 'files'); 46 | 47 | sourceFiles.forEach((sourceFile: SourceFile, i) => { 48 | try { 49 | let hasChanged = false; 50 | 51 | const importDeclarations = sourceFile.getImportDeclarations(); 52 | const imports: Record = {}; 53 | const rewrittenImports: string[] = []; 54 | const rewrittenDirectives: string[] = []; 55 | 56 | sourceFile.getPathReferenceDirectives().forEach((directive) => { 57 | rewrittenDirectives.push(`/// `); 58 | }); 59 | sourceFile.getTypeReferenceDirectives().forEach((directive) => { 60 | rewrittenDirectives.push(`/// `); 61 | }); 62 | sourceFile.getLibReferenceDirectives().forEach((directive) => { 63 | rewrittenDirectives.push(`/// `); 64 | }); 65 | 66 | /** import Default, { named1, named2 as alias } from './file' */ 67 | importDeclarations.forEach((importDeclaration: ImportDeclaration) => { 68 | /** Default */ 69 | const defaultImport = importDeclaration.getDefaultImport(); 70 | /** { named1, named2 as alias } */ 71 | const namedImports = importDeclaration.getNamedImports(); 72 | /** eg './file' or 'some-dependency' */ 73 | const modulePath = importDeclaration.getModuleSpecifierValue(); 74 | 75 | imports[modulePath] = imports[modulePath] || { 76 | codeImports: [], 77 | defaultImport: '', 78 | typeImports: [], 79 | }; 80 | 81 | if (defaultImport) { 82 | imports[modulePath].defaultImport = defaultImport.getText(); 83 | hasChanged = true; 84 | } 85 | 86 | namedImports.forEach((namedImport: ImportSpecifier) => { 87 | /** import { named2 as alias } */ 88 | const alias = namedImport.getAliasNode()?.getText(); 89 | const definitions = namedImport.getNameNode().getDefinitions(); 90 | /** determine whether this import is a type or an implementation */ 91 | definitions.forEach((definition: DefinitionInfo) => { 92 | const definitionName = definition.getName(); 93 | const finalName = alias ? `${definitionName} as ${alias}` : definitionName; 94 | const definitionKind = definition.getKind(); 95 | if (['type', 'interface'].includes(definitionKind)) { 96 | hasChanged = true; 97 | imports[modulePath].typeImports.push(finalName); 98 | } else { 99 | hasChanged = true; 100 | imports[modulePath].codeImports.push(finalName); 101 | } 102 | }); 103 | }); 104 | 105 | if (hasChanged) { 106 | importDeclaration.remove(); 107 | } 108 | }); 109 | 110 | // write new imports for those we've collected and removed 111 | Object.entries(imports).forEach( 112 | ([identifier, { codeImports, defaultImport, typeImports }]: [string, ModuleImports]) => { 113 | if (defaultImport && codeImports.length) { 114 | rewrittenImports.push(`import ${defaultImport}, { ${codeImports.join(', ')} } from '${identifier}'`); 115 | } 116 | if (defaultImport && !codeImports.length) { 117 | rewrittenImports.push(`import ${defaultImport} from '${identifier}'`); 118 | } 119 | if (!defaultImport && codeImports.length) { 120 | rewrittenImports.push(`import { ${codeImports.join(', ')} } from '${identifier}'`); 121 | } 122 | if (typeImports.length) { 123 | rewrittenImports.push(`import type { ${typeImports.join(', ')} } from '${identifier}'`); 124 | } 125 | }, 126 | ); 127 | 128 | // nothing to do 129 | if (rewrittenImports.length === 0) { 130 | console.log(chalk.gray('-', getRelativePath(sourceFile))); 131 | return; 132 | } 133 | 134 | console.log(chalk.green('✓', getRelativePath(sourceFile))); 135 | 136 | if (rewrittenDirectives.length > 0) { 137 | filesWithRewrittenDirectives.push(getRelativePath(sourceFile)); 138 | console.log(chalk.yellow('! contains triple-slash directives')); 139 | } 140 | 141 | sourceFile.insertText(0, rewrittenImports.join(EOL) + EOL + EOL); 142 | 143 | if (organiseImports !== false) { 144 | sourceFile.organizeImports(); 145 | } 146 | 147 | if (dryRun === true) { 148 | console.log(sourceFile.getText()); 149 | } else { 150 | sourceFile.saveSync(); 151 | } 152 | } catch (err) { 153 | console.log(chalk.red('×', getRelativePath(sourceFile))); 154 | } 155 | }); 156 | 157 | console.log(''); 158 | console.log(chalk.bgGreen.black(' Complete ')); 159 | console.log(''); 160 | 161 | if (filesWithRewrittenDirectives.length > 0) { 162 | console.log( 163 | chalk.yellow( 164 | ` 165 | * Moving triple-slash directives such as /// back 166 | to the top of the file is not yet supported. If you know how to do this using 167 | https://ts-morph.com please open a PR or otherwise let me know. 168 | 169 | https://github.com/JamieMason/ts-import-types-cli/pulls 170 | 171 | Unfortunately until then, the following files will need their triple-slash 172 | directives manually moving back to the top of the file: 173 | ${filesWithRewrittenDirectives.map((filePath) => `\n - ${filePath}`).join('')} 174 | `.trim(), 175 | ), 176 | ); 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "downlevelIteration": true, 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "lib": ["es2017", "es6"], 8 | "outDir": "./dist", 9 | "skipLibCheck": true, 10 | "strict": true, 11 | "target": "es3" 12 | }, 13 | "include": ["./package.json", "./src/**/*.ts"], 14 | "exclude": ["./src/**/*.spec.ts"] 15 | } 16 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@dsherret/to-absolute-glob@^2.0.2": 6 | version "2.0.2" 7 | resolved "https://registry.yarnpkg.com/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1f6475dc8bd974cea07a2daf3864b317b1dd332c" 8 | integrity sha1-H2R13IvZdM6gei2vOGSzF7HdMyw= 9 | dependencies: 10 | is-absolute "^1.0.0" 11 | is-negated-glob "^1.0.0" 12 | 13 | "@nodelib/fs.scandir@2.1.3": 14 | version "2.1.3" 15 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" 16 | integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== 17 | dependencies: 18 | "@nodelib/fs.stat" "2.0.3" 19 | run-parallel "^1.1.9" 20 | 21 | "@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": 22 | version "2.0.3" 23 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" 24 | integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== 25 | 26 | "@nodelib/fs.walk@^1.2.3": 27 | version "1.2.4" 28 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" 29 | integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== 30 | dependencies: 31 | "@nodelib/fs.scandir" "2.1.3" 32 | fastq "^1.6.0" 33 | 34 | "@ts-morph/common@~0.7.0": 35 | version "0.7.2" 36 | resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.7.2.tgz#b937d13376695146735aecec6af4573cee513a56" 37 | integrity sha512-XyUPLf1UHtteP5C5FEgVJqgIEOcmaSEoJyU/jQ1gTBKlz/lb1Uss4ix+D2e5qRwPFiBMqM/jwJpna0yVDE5V/g== 38 | dependencies: 39 | "@dsherret/to-absolute-glob" "^2.0.2" 40 | fast-glob "^3.2.4" 41 | is-negated-glob "^1.0.0" 42 | mkdirp "^1.0.4" 43 | multimatch "^5.0.0" 44 | typescript "~4.1.2" 45 | 46 | "@types/minimatch@^3.0.3": 47 | version "3.0.3" 48 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" 49 | integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== 50 | 51 | "@types/node@14.14.12": 52 | version "14.14.12" 53 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.12.tgz#0b1d86f8c40141091285dea02e4940df73bba43f" 54 | integrity sha512-ASH8OPHMNlkdjrEdmoILmzFfsJICvhBsFfAum4aKZ/9U4B6M6tTmTPh+f3ttWdD74CEGV5XvXWkbyfSdXaTd7g== 55 | 56 | ansi-styles@^4.1.0: 57 | version "4.3.0" 58 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 59 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 60 | dependencies: 61 | color-convert "^2.0.1" 62 | 63 | arg@^4.1.0: 64 | version "4.1.3" 65 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 66 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 67 | 68 | array-differ@^3.0.0: 69 | version "3.0.0" 70 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" 71 | integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== 72 | 73 | array-union@^2.1.0: 74 | version "2.1.0" 75 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 76 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 77 | 78 | arrify@^2.0.1: 79 | version "2.0.1" 80 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" 81 | integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== 82 | 83 | balanced-match@^1.0.0: 84 | version "1.0.0" 85 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 86 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 87 | 88 | brace-expansion@^1.1.7: 89 | version "1.1.11" 90 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 91 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 92 | dependencies: 93 | balanced-match "^1.0.0" 94 | concat-map "0.0.1" 95 | 96 | braces@^3.0.1: 97 | version "3.0.2" 98 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 99 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 100 | dependencies: 101 | fill-range "^7.0.1" 102 | 103 | buffer-from@^1.0.0: 104 | version "1.1.1" 105 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 106 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 107 | 108 | chalk@4.1.0: 109 | version "4.1.0" 110 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" 111 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 112 | dependencies: 113 | ansi-styles "^4.1.0" 114 | supports-color "^7.1.0" 115 | 116 | code-block-writer@^10.1.1: 117 | version "10.1.1" 118 | resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-10.1.1.tgz#ad5684ed4bfb2b0783c8b131281ae84ee640a42f" 119 | integrity sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw== 120 | 121 | color-convert@^2.0.1: 122 | version "2.0.1" 123 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 124 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 125 | dependencies: 126 | color-name "~1.1.4" 127 | 128 | color-name@~1.1.4: 129 | version "1.1.4" 130 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 131 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 132 | 133 | commander@6.2.0: 134 | version "6.2.0" 135 | resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" 136 | integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== 137 | 138 | concat-map@0.0.1: 139 | version "0.0.1" 140 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 141 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 142 | 143 | create-require@^1.1.0: 144 | version "1.1.1" 145 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 146 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 147 | 148 | diff@^4.0.1: 149 | version "4.0.2" 150 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 151 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 152 | 153 | fast-glob@^3.2.4: 154 | version "3.2.4" 155 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.4.tgz#d20aefbf99579383e7f3cc66529158c9b98554d3" 156 | integrity sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ== 157 | dependencies: 158 | "@nodelib/fs.stat" "^2.0.2" 159 | "@nodelib/fs.walk" "^1.2.3" 160 | glob-parent "^5.1.0" 161 | merge2 "^1.3.0" 162 | micromatch "^4.0.2" 163 | picomatch "^2.2.1" 164 | 165 | fastq@^1.6.0: 166 | version "1.9.0" 167 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.9.0.tgz#e16a72f338eaca48e91b5c23593bcc2ef66b7947" 168 | integrity sha512-i7FVWL8HhVY+CTkwFxkN2mk3h+787ixS5S63eb78diVRc1MCssarHq3W5cj0av7YDSwmaV928RNag+U1etRQ7w== 169 | dependencies: 170 | reusify "^1.0.4" 171 | 172 | fill-range@^7.0.1: 173 | version "7.0.1" 174 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 175 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 176 | dependencies: 177 | to-regex-range "^5.0.1" 178 | 179 | glob-parent@^5.1.0: 180 | version "5.1.1" 181 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 182 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== 183 | dependencies: 184 | is-glob "^4.0.1" 185 | 186 | has-flag@^4.0.0: 187 | version "4.0.0" 188 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 189 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 190 | 191 | is-absolute@^1.0.0: 192 | version "1.0.0" 193 | resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" 194 | integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== 195 | dependencies: 196 | is-relative "^1.0.0" 197 | is-windows "^1.0.1" 198 | 199 | is-extglob@^2.1.1: 200 | version "2.1.1" 201 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 202 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 203 | 204 | is-glob@^4.0.1: 205 | version "4.0.1" 206 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 207 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 208 | dependencies: 209 | is-extglob "^2.1.1" 210 | 211 | is-negated-glob@^1.0.0: 212 | version "1.0.0" 213 | resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" 214 | integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= 215 | 216 | is-number@^7.0.0: 217 | version "7.0.0" 218 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 219 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 220 | 221 | is-relative@^1.0.0: 222 | version "1.0.0" 223 | resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" 224 | integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== 225 | dependencies: 226 | is-unc-path "^1.0.0" 227 | 228 | is-unc-path@^1.0.0: 229 | version "1.0.0" 230 | resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" 231 | integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== 232 | dependencies: 233 | unc-path-regex "^0.1.2" 234 | 235 | is-windows@^1.0.1: 236 | version "1.0.2" 237 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 238 | integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== 239 | 240 | make-error@^1.1.1: 241 | version "1.3.6" 242 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 243 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 244 | 245 | merge2@^1.3.0: 246 | version "1.4.1" 247 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 248 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 249 | 250 | micromatch@^4.0.2: 251 | version "4.0.2" 252 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" 253 | integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== 254 | dependencies: 255 | braces "^3.0.1" 256 | picomatch "^2.0.5" 257 | 258 | minimatch@^3.0.4: 259 | version "3.0.4" 260 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 261 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 262 | dependencies: 263 | brace-expansion "^1.1.7" 264 | 265 | mkdirp@^1.0.4: 266 | version "1.0.4" 267 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" 268 | integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== 269 | 270 | multimatch@^5.0.0: 271 | version "5.0.0" 272 | resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" 273 | integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== 274 | dependencies: 275 | "@types/minimatch" "^3.0.3" 276 | array-differ "^3.0.0" 277 | array-union "^2.1.0" 278 | arrify "^2.0.1" 279 | minimatch "^3.0.4" 280 | 281 | picomatch@^2.0.5, picomatch@^2.2.1: 282 | version "2.2.2" 283 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 284 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 285 | 286 | reusify@^1.0.4: 287 | version "1.0.4" 288 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 289 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 290 | 291 | run-parallel@^1.1.9: 292 | version "1.1.10" 293 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.10.tgz#60a51b2ae836636c81377df16cb107351bcd13ef" 294 | integrity sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw== 295 | 296 | source-map-support@^0.5.17: 297 | version "0.5.19" 298 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" 299 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 300 | dependencies: 301 | buffer-from "^1.0.0" 302 | source-map "^0.6.0" 303 | 304 | source-map@^0.6.0: 305 | version "0.6.1" 306 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 307 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 308 | 309 | supports-color@^7.1.0: 310 | version "7.2.0" 311 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 312 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 313 | dependencies: 314 | has-flag "^4.0.0" 315 | 316 | to-regex-range@^5.0.1: 317 | version "5.0.1" 318 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 319 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 320 | dependencies: 321 | is-number "^7.0.0" 322 | 323 | ts-morph@9.1.0: 324 | version "9.1.0" 325 | resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-9.1.0.tgz#10d2088387c71f3c674f82492a3cec1e3538f0dd" 326 | integrity sha512-sei4u651MBenr27sD6qLDXN3gZ4thiX71E3qV7SuVtDas0uvK2LtgZkIYUf9DKm/fLJ6AB/+yhRJ1vpEBJgy7Q== 327 | dependencies: 328 | "@dsherret/to-absolute-glob" "^2.0.2" 329 | "@ts-morph/common" "~0.7.0" 330 | code-block-writer "^10.1.1" 331 | 332 | ts-node@9.1.1: 333 | version "9.1.1" 334 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" 335 | integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== 336 | dependencies: 337 | arg "^4.1.0" 338 | create-require "^1.1.0" 339 | diff "^4.0.1" 340 | make-error "^1.1.1" 341 | source-map-support "^0.5.17" 342 | yn "3.1.1" 343 | 344 | typescript@4.1.3, typescript@~4.1.2: 345 | version "4.1.3" 346 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" 347 | integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== 348 | 349 | unc-path-regex@^0.1.2: 350 | version "0.1.2" 351 | resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" 352 | integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= 353 | 354 | yn@3.1.1: 355 | version "3.1.1" 356 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 357 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 358 | --------------------------------------------------------------------------------