├── .dprintrc.json ├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── LICENSE ├── demo.gif ├── package.json ├── readme.md ├── src ├── CommandLineOptions.ts ├── Maintainer.ts ├── Options.ts ├── PublicApi.ts ├── cli.ts ├── getHelpText.ts ├── getPackageVersion.ts ├── index.ts ├── parseCommandLineArgs.ts ├── tests │ ├── maintainerTests.ts │ ├── parseCommandLineArgsTests.ts │ └── utils │ │ ├── determineFileExtensionTests.ts │ │ ├── determineQuoteKindTests.ts │ │ ├── directoryAncestorCollectionTests.ts │ │ └── throttlerTests.ts ├── utils │ ├── DirectoryAncestorCollection.ts │ ├── Throttler.ts │ ├── asyncTimeout.ts │ ├── determineFileExtension.ts │ ├── determineQuoteKind.ts │ ├── index.ts │ └── pathUtils.ts └── watch.ts ├── tsconfig.json └── yarn.lock /.dprintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://dprint.dev/schemas/v0.json", 3 | "projectType": "openSource", 4 | "incremental": true, 5 | "lineWidth": 180, 6 | "typescript": { 7 | "useBraces": "preferNone", 8 | "singleBodyPosition": "nextLine", 9 | "nextControlFlowPosition": "nextLine", 10 | "arrowFunction.useParentheses": "preferNone", 11 | "tryStatement.nextControlFlowPosition": "sameLine", 12 | "quoteStyle": "alwaysDouble", 13 | "semiColons": "always" 14 | }, 15 | "json": { 16 | "indentWidth": 2 17 | }, 18 | "includes": ["**/*.{ts,tsx,js,jsx,json,md}"], 19 | "excludes": [ 20 | "CHANGELOG.md", 21 | ".nyc_output", 22 | "dist", 23 | "coverage", 24 | "**/node_modules", 25 | "**/*-lock.json" 26 | ], 27 | "plugins": [ 28 | "https://plugins.dprint.dev/typescript-0.19.9.wasm", 29 | "https://plugins.dprint.dev/json-0.4.1.wasm", 30 | "https://plugins.dprint.dev/markdown-0.2.4.wasm" 31 | ] 32 | } 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /.vscode 3 | /.nyc_output 4 | *.js.map 5 | /obj 6 | /temp 7 | /bin 8 | *.suo 9 | *.csproj 10 | *.csproj.user 11 | *.sln 12 | /coverage 13 | /.vs 14 | /dist 15 | /docs/Gemfile.lock 16 | /docs/_site 17 | yarn-error.log 18 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | /.vs 2 | /node_modules 3 | /coverage 4 | /.vscode 5 | /.nyc_output 6 | /dist/tests 7 | /src 8 | *.js.map 9 | /obj 10 | /temp 11 | /bin 12 | *.suo 13 | *.csproj 14 | *.csproj.user 15 | *.sln 16 | demo.gif 17 | dprint.json 18 | tsconfig.json 19 | yarn-error.log 20 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | 6 | ## [1.5.2](https://github.com/dsherret/barrel-maintainer/compare/v1.5.1...v1.5.2) (2020-02-16) 7 | 8 | 9 | 10 | 11 | ## [1.5.1](https://github.com/dsherret/barrel-maintainer/compare/v1.5.0...v1.5.1) (2019-08-03) 12 | 13 | 14 | 15 | 16 | # [1.5.0](https://github.com/dsherret/barrel-maintainer/compare/v1.4.0...v1.5.0) (2018-10-12) 17 | 18 | 19 | ### Features 20 | 21 | * Update ts-simple-ast version. ([5d3e5b3](https://github.com/dsherret/barrel-maintainer/commit/5d3e5b3)) 22 | 23 | 24 | 25 | 26 | # [1.4.0](https://github.com/dsherret/barrel-maintainer/compare/v1.3.1...v1.4.0) (2018-09-30) 27 | 28 | 29 | ### Features 30 | 31 | * Update to TS 3.0.3. ([248c04f](https://github.com/dsherret/barrel-maintainer/commit/248c04f)) 32 | 33 | 34 | 35 | 36 | ## [1.3.1](https://github.com/dsherret/barrel-maintainer/compare/v1.3.0...v1.3.1) (2018-08-25) 37 | 38 | 39 | ### Bug Fixes 40 | 41 | * Point barrel link to TypeScript Deep Dive ([#4](https://github.com/dsherret/barrel-maintainer/issues/4)) ([819de99](https://github.com/dsherret/barrel-maintainer/commit/819de99)) 42 | 43 | 44 | 45 | 46 | # [1.3.0](https://github.com/dsherret/barrel-maintainer/compare/v1.2.11...v1.3.0) (2018-08-25) 47 | 48 | 49 | ### Features 50 | 51 | * Add TypeScript 3.0 support. ([e0a4cb5](https://github.com/dsherret/barrel-maintainer/commit/e0a4cb5)) 52 | 53 | 54 | 55 | 56 | ## [1.2.11](https://github.com/dsherret/barrel-maintainer/compare/v1.2.10...v1.2.11) (2018-02-07) 57 | 58 | 59 | ### Bug Fixes 60 | 61 | * [#3](https://github.com/dsherret/barrel-maintainer/issues/3) - Fix flags coming before the path not working. ([2247b67](https://github.com/dsherret/barrel-maintainer/commit/2247b67)) 62 | 63 | 64 | 65 | 66 | ## [1.2.10](https://github.com/dsherret/barrel-maintainer/compare/v1.2.9...v1.2.10) (2018-01-07) 67 | 68 | 69 | ### Bug Fixes 70 | 71 | * Ignore declaration files. ([031b351](https://github.com/dsherret/barrel-maintainer/commit/031b351)) 72 | 73 | 74 | 75 | 76 | ## [1.2.9](https://github.com/dsherret/barrel-maintainer/compare/v1.2.8...v1.2.9) (2018-01-06) 77 | 78 | 79 | ### Bug Fixes 80 | 81 | * Fix issue with files being overwritten (ts-simple-ast issue) ([8a6f644](https://github.com/dsherret/barrel-maintainer/commit/8a6f644)) 82 | 83 | 84 | 85 | 86 | ## [1.2.8](https://github.com/dsherret/barrel-maintainer/compare/v1.2.7...v1.2.8) (2018-01-02) 87 | 88 | 89 | ### Bug Fixes 90 | 91 | * Renaming a directory should update the barrel. ([3b92103](https://github.com/dsherret/barrel-maintainer/commit/3b92103)) 92 | 93 | 94 | 95 | 96 | ## [1.2.7](https://github.com/dsherret/barrel-maintainer/compare/v1.2.6...v1.2.7) (2018-01-01) 97 | 98 | 99 | 100 | 101 | ## [1.2.6](https://github.com/dsherret/barrel-maintainer/compare/v1.2.5...v1.2.6) (2018-01-01) 102 | 103 | 104 | ### Bug Fixes 105 | 106 | * Ignore permission errors when watching files. ([df7fec9](https://github.com/dsherret/barrel-maintainer/commit/df7fec9)) 107 | 108 | 109 | 110 | 111 | ## [1.2.5](https://github.com/dsherret/barrel-maintainer/compare/v1.2.4...v1.2.5) (2018-01-01) 112 | 113 | 114 | ### Bug Fixes 115 | 116 | * Getting namespace insert index should be case insensitive. ([cf69a6f](https://github.com/dsherret/barrel-maintainer/commit/cf69a6f)) 117 | 118 | 119 | 120 | 121 | ## [1.2.4](https://github.com/dsherret/barrel-maintainer/compare/v1.2.3...v1.2.4) (2017-12-31) 122 | 123 | 124 | 125 | 126 | ## [1.2.3](https://github.com/dsherret/barrel-maintainer/compare/v1.2.2...v1.2.3) (2017-12-31) 127 | 128 | 129 | 130 | 131 | ## [1.2.2](https://github.com/dsherret/barrel-maintainer/compare/v1.2.1...v1.2.2) (2017-12-31) 132 | 133 | 134 | 135 | 136 | ## [1.2.1](https://github.com/dsherret/barrel-maintainer/compare/v1.2.0...v1.2.1) (2017-12-31) 137 | 138 | 139 | ### Bug Fixes 140 | 141 | * Don't add exports for non-namespace exports that exist. ([614d03f](https://github.com/dsherret/barrel-maintainer/commit/614d03f)) 142 | 143 | 144 | 145 | 146 | # [1.2.0](https://github.com/dsherret/barrel-maintainer/compare/v1.1.0...v1.2.0) (2017-12-30) 147 | 148 | 149 | ### Features 150 | 151 | * Insert export declarations in alphabetical order. ([18a6f0b](https://github.com/dsherret/barrel-maintainer/commit/18a6f0b)) 152 | 153 | 154 | 155 | 156 | # 1.1.0 (2017-12-30) 157 | 158 | 159 | ### Features 160 | 161 | * Add help and version commands. ([b4404ed](https://github.com/dsherret/barrel-maintainer/commit/b4404ed)) 162 | * Selectively modify export declarations. ([972905c](https://github.com/dsherret/barrel-maintainer/commit/972905c)) 163 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 David Sherret 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 | -------------------------------------------------------------------------------- /demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsherret/barrel-maintainer/ec2a590f404f05c397b9e47249b3d8fcc9940723/demo.gif -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "barrel-maintainer", 3 | "version": "1.5.3", 4 | "description": "Automated real-time maintenance of barrels in ES2015.", 5 | "main": "dist/index.js", 6 | "bin": { 7 | "barrel-maintainer": "dist/cli.js" 8 | }, 9 | "scripts": { 10 | "build": "rimraf dist && tsc", 11 | "format": "dprint fmt", 12 | "test": "rimraf dist && npm run build && nyc --reporter=html --reporter=text mocha dist/tests/**/*.js", 13 | "dopublish": "npm run build && npm publish" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/dsherret/barrel-maintainer.git" 18 | }, 19 | "keywords": [ 20 | "code-generation", 21 | "code-manipulation" 22 | ], 23 | "author": "David Sherret", 24 | "license": "MIT", 25 | "bugs": { 26 | "url": "https://github.com/dsherret/barrel-maintainer/issues" 27 | }, 28 | "homepage": "https://github.com/dsherret/barrel-maintainer#readme", 29 | "dependencies": { 30 | "@types/minimist": "^1.2.0", 31 | "chokidar": "^3.4.1", 32 | "minimist": "^1.2.5", 33 | "ts-morph": "7.1.2" 34 | }, 35 | "devDependencies": { 36 | "@types/chai": "^4.2.11", 37 | "@types/chokidar": "^2.1.3", 38 | "@types/mocha": "^8.0.0", 39 | "@types/node": "^14.0.23", 40 | "chai": "^4.2.0", 41 | "mocha": "^8.0.1", 42 | "nyc": "^15.1.0", 43 | "rimraf": "^3.0.2", 44 | "typescript": "^3.9.7" 45 | }, 46 | "nyc": { 47 | "exclude": [ 48 | "dist/tests/**/*.js" 49 | ] 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Barrel Maintainer 2 | 3 | [![npm version](https://badge.fury.io/js/barrel-maintainer.svg)](https://badge.fury.io/js/barrel-maintainer) 4 | 5 | Automatically maintains [barrels](https://basarat.gitbooks.io/typescript/docs/tips/barrel.html) in real-time. 6 | 7 | [![Automated real-time barrel maintenance](https://github.com/dsherret/barrel-maintainer/raw/master/demo.gif)](https://youtu.be/gFi7kQnD69k) 8 | 9 | [Video Overview](https://youtu.be/gFi7kQnD69k) 10 | 11 | ## Installation 12 | 13 | ```bash 14 | npm install -g barrel-maintainer 15 | ``` 16 | 17 | ## Usage 18 | 19 | ```bash 20 | barrel-maintainer [options] [path] 21 | ``` 22 | 23 | Options: 24 | 25 | - `--includeRootDir` - Create a barrel in the root directory. 26 | - Quote type (specify one) 27 | - Defaults to the quote type used in the first found import declaration in your project. 28 | - `--singleQuotes` - Use single quotes. 29 | - `--doubleQuotes` - Use double quotes. 30 | - File extension for barrel (specify one) 31 | - Defaults to whichever file type your project has more of. 32 | - `--ts` - Create index.ts files. 33 | - `--js` - Create index.js files. 34 | - New lines (specify one) 35 | - `--crlf` - Use carriage return line feed newlines (default on windows) 36 | - `--lf` - Use line feed newlines (default elsewhere) 37 | 38 | ## Ignoring Files 39 | 40 | Add a `/* barrel:ignore */` statement to the file: 41 | 42 | ```ts 43 | /* barrel:ignore */ 44 | export function log(message: string) { 45 | console.log(message); 46 | } 47 | ``` 48 | 49 | ## Exporting a Subset of a File's Exports 50 | 51 | Given the following setup: 52 | 53 | ```js 54 | // classes.js 55 | export ClassA {} 56 | export ClassB {} 57 | 58 | // index.js 59 | export * from "./classes"; 60 | ``` 61 | 62 | If you want the barrel to export a subset of the exports from _classes.js_, then edit the barrel to say so: 63 | 64 | ```js 65 | // index.js 66 | export { ClassA } from "./classes"; 67 | ``` 68 | 69 | These kind of changes won't be overwritten by the code manipulation. 70 | 71 | ## Api 72 | 73 | ```ts 74 | import BarrelMaintainer from "barrel-maintainer"; 75 | 76 | const maintainer = new BarrelMaintainer("myProject/src/", { 77 | includeRootDir: false, 78 | fileExtension: "js", // or "ts" (extension for barrel) 79 | quoteType: "'", // or "\"" 80 | newLineType: "\r\n", // or "\n" 81 | }); 82 | 83 | await maintainer.updateDirectory("myProject/src/subdir"); 84 | const watcher = maintainer.watchDirectory("myProject/src"); 85 | 86 | // then later (if necessary) 87 | watcher.stop(); 88 | ``` 89 | 90 | ## About 91 | 92 | This project uses [ts-morph](https://github.com/dsherret/ts-morph) to navigate and manipulate source code. 93 | 94 | ## Disclaimer 95 | 96 | This library will modify and delete source code. I am not responsible for any of its modifications or deletions! 97 | 98 | Always use version control to verify and to be able to easily revert the changes it makes! 99 | -------------------------------------------------------------------------------- /src/CommandLineOptions.ts: -------------------------------------------------------------------------------- 1 | import { Options } from "./Options"; 2 | 3 | export interface CommandLineOptions extends Options { 4 | path: string; 5 | showVersion: boolean; 6 | showHelp: boolean; 7 | } 8 | -------------------------------------------------------------------------------- /src/Maintainer.ts: -------------------------------------------------------------------------------- 1 | import { SourceFile, Directory, TypeGuards } from "ts-morph"; 2 | import { determineFileExtension } from "./utils"; 3 | 4 | export interface MaintainerOptions { 5 | includeRootDir?: boolean; 6 | fileExtension?: "ts" | "js"; 7 | } 8 | 9 | export class Maintainer { 10 | private readonly barrelFileName: string; 11 | private readonly includeRootDir: boolean; 12 | 13 | constructor(private readonly rootDir: Directory, options: MaintainerOptions) { 14 | this.includeRootDir = options.includeRootDir || false; 15 | this.barrelFileName = `index.${options.fileExtension || determineFileExtension(rootDir)}`; 16 | } 17 | 18 | updateDir(dir: Directory) { 19 | if (dir !== this.rootDir && !dir.isDescendantOf(this.rootDir)) 20 | throw new Error(`Provided directory of ${dir.getPath()} is not equal to or a descendant of the root directory (${this.rootDir.getPath()}).`); 21 | 22 | if (!this.includeRootDir && dir === this.rootDir) { 23 | for (const subDir of dir.getDirectories()) 24 | this.updateDirInternal(subDir); 25 | return; 26 | } 27 | 28 | const isBarrelDir = this.updateDirInternal(dir); 29 | if (isBarrelDir) 30 | this.addBarrelExportToParent(dir); 31 | else 32 | this.removeBarrelExportFromParent(dir); 33 | } 34 | 35 | private updateDirInternal(dir: Directory): boolean { 36 | let barrelFile = dir.getSourceFile(this.barrelFileName); 37 | const dirsForBarrel = dir.getDirectories().filter(d => this.updateDirInternal(d)); 38 | const filesForBarrel = dir.getSourceFiles().filter(s => s !== barrelFile && isSourceFileForBarrel(s)); 39 | const allExports = [...filesForBarrel.map(getModuleSpecifierForFile), ...dirsForBarrel.map(getModuleSpecifierForDir)]; 40 | const existingExports = barrelFile == null ? [] : barrelFile.getExportDeclarations().filter(e => e.hasModuleSpecifier()); 41 | const existingNamespaceExports = existingExports.filter(e => e.isNamespaceExport()); 42 | const exportsToAdd = allExports.filter(e => existingExports.findIndex(i => i.getModuleSpecifierValue() === e) === -1); 43 | const exportsToRemove = existingNamespaceExports.filter(e => allExports.indexOf(e.getModuleSpecifierValue()!) === -1); 44 | 45 | if (barrelFile == null && allExports.length > 0) 46 | barrelFile = dir.createSourceFile(this.barrelFileName); 47 | 48 | if (barrelFile == null) 49 | return false; 50 | 51 | if (exportsToAdd != null && exportsToAdd.length > 0) 52 | addNamespaceExports(barrelFile, exportsToAdd); 53 | 54 | for (const exportToRemove of exportsToRemove) 55 | exportToRemove.remove(); 56 | 57 | if (barrelFile.getStatements().length === 0) { 58 | barrelFile.delete(); 59 | return false; 60 | } 61 | 62 | return isSourceFileForBarrel(barrelFile); 63 | } 64 | 65 | private addBarrelExportToParent(dir: Directory) { 66 | const parentDir = this.getParentDir(dir); 67 | if (parentDir == null) 68 | return; 69 | const parentBarrelFile = parentDir.getSourceFile(this.barrelFileName) || parentDir.createSourceFile(this.barrelFileName); 70 | const parentExport = getExportForDir(parentBarrelFile, dir); 71 | if (parentExport != null) 72 | return; 73 | 74 | addNamespaceExports(parentBarrelFile, [getModuleSpecifierForDir(dir)]); 75 | this.addBarrelExportToParent(parentDir); 76 | } 77 | 78 | private removeBarrelExportFromParent(dir: Directory) { 79 | const parentDir = this.getParentDir(dir); 80 | if (parentDir == null) 81 | return; 82 | const parentBarrelFile = parentDir.getSourceFile(this.barrelFileName); 83 | if (parentBarrelFile == null) 84 | return; 85 | const parentExport = getExportForDir(parentBarrelFile, dir); 86 | if (parentExport == null) 87 | return; 88 | 89 | parentExport.remove(); 90 | if (!isSourceFileForBarrel(parentBarrelFile)) 91 | this.removeBarrelExportFromParent(parentBarrelFile.getDirectory()); 92 | 93 | if (parentBarrelFile.getStatements().length === 0) 94 | parentBarrelFile.deleteImmediatelySync(); 95 | } 96 | 97 | private getParentDir(dir: Directory) { 98 | const parent = dir.getParent(); 99 | if (parent == null || dir === this.rootDir || !this.includeRootDir && parent === this.rootDir) 100 | return undefined; 101 | return parent; 102 | } 103 | } 104 | 105 | const ignoreFileRegex = /\/\*\s*barrel:ignore\s*\*\//i; 106 | 107 | function isSourceFileForBarrel(sourceFile: SourceFile) { 108 | // ignore files containing /* barrel:ignore */ 109 | if (ignoreFileRegex.test(sourceFile.getFullText())) 110 | return false; 111 | 112 | return hasExports(); 113 | 114 | function hasExports() { 115 | for (const statement of sourceFile.getStatements()) { 116 | if (TypeGuards.isExportDeclaration(statement) || TypeGuards.isExportAssignment(statement)) 117 | return true; 118 | if (TypeGuards.isExportableNode(statement) && statement.isExported()) 119 | return true; 120 | } 121 | 122 | return false; 123 | } 124 | } 125 | 126 | function addNamespaceExports(barrelFile: SourceFile, moduleSpecifiers: string[]) { 127 | for (const moduleSpecifier of moduleSpecifiers) 128 | barrelFile.insertExportDeclaration(getInsertIndex(moduleSpecifier), { moduleSpecifier }); 129 | 130 | function getInsertIndex(moduleSpecifier: string) { 131 | const upperCaseModuleSpecifier = moduleSpecifier.toUpperCase(); 132 | const insertDec = barrelFile.getExportDeclaration(s => s.getModuleSpecifierValue()!.toUpperCase() > upperCaseModuleSpecifier); 133 | if (insertDec != null) 134 | return insertDec.getChildIndex(); 135 | 136 | const exports = barrelFile.getExportDeclarations(); 137 | if (exports.length > 0) 138 | return exports[exports.length - 1].getChildIndex() + 1; 139 | 140 | return barrelFile.getStatements().length; 141 | } 142 | } 143 | 144 | function getExportForDir(barrelFile: SourceFile, dir: Directory) { 145 | const dirModuleSpecifier = getModuleSpecifierForDir(dir); 146 | return barrelFile.getExportDeclaration(e => e.isNamespaceExport() && e.getModuleSpecifierValue() === dirModuleSpecifier); 147 | } 148 | 149 | function getModuleSpecifierForDir(dir: Directory) { 150 | return `./${dir.getBaseName()}`; 151 | } 152 | 153 | function getModuleSpecifierForFile(file: SourceFile) { 154 | return `./${file.getBaseName().replace(/\.(ts|js|tsx|jsx)$/, "")}`; 155 | } 156 | -------------------------------------------------------------------------------- /src/Options.ts: -------------------------------------------------------------------------------- 1 | export interface Options { 2 | includeRootDir?: boolean; 3 | fileExtension?: "ts" | "js"; 4 | quoteType?: "\"" | "'"; 5 | newLineType?: "\r\n" | "\n"; 6 | } 7 | -------------------------------------------------------------------------------- /src/PublicApi.ts: -------------------------------------------------------------------------------- 1 | import { Project, QuoteKind, NewLineKind } from "ts-morph"; 2 | import * as path from "path"; 3 | import * as pathUtils from "./utils/pathUtils"; 4 | import { Maintainer } from "./Maintainer"; 5 | import { Options } from "./Options"; 6 | import { watch } from "./watch"; 7 | import { determineQuoteKind } from "./utils"; 8 | 9 | export class PublicApi { 10 | private readonly rootDirPath: string; 11 | 12 | constructor(rootDirPath: string, private readonly options: Options = {}) { 13 | this.rootDirPath = pathUtils.standardizePath(rootDirPath); 14 | } 15 | 16 | async updateDirectory(dirPath: string) { 17 | const { rootDir, dir, maintainer } = this.setup(dirPath); 18 | maintainer.updateDir(dir); 19 | await rootDir.save(); 20 | } 21 | 22 | watchDirectory(dirPath: string) { 23 | const { rootDir, dir, maintainer } = this.setup(dirPath); 24 | return watch(rootDir, dir, maintainer); 25 | } 26 | 27 | private setup(dirPath: string) { 28 | dirPath = this.verifyAndGetPath(dirPath); 29 | 30 | const project = getProject(this.rootDirPath, this.options); 31 | const dir = project.addDirectoryAtPath(dirPath); 32 | const rootDir = project.getRootDirectories()[0]; 33 | const maintainer = new Maintainer(rootDir, this.options); 34 | 35 | return { project, dir, rootDir, maintainer }; 36 | } 37 | 38 | private verifyAndGetPath(dirPath: string) { 39 | dirPath = pathUtils.standardizePath(dirPath); 40 | if (!pathUtils.isDescendantOf(this.rootDirPath, dirPath)) 41 | throw new Error(`The root directory (${this.rootDirPath}) must be a sub directory of the specified directory (${dirPath}).`); 42 | return dirPath; 43 | } 44 | } 45 | 46 | export function getProject(dirPath: string, options: Options) { 47 | const project = new Project({ compilerOptions: { allowJs: true } }); 48 | project.addSourceFilesAtPaths([ 49 | path.join(dirPath, "**/*.{js,ts,jsx,tsx}"), 50 | "!" + path.join(dirPath, "**/*.d.ts"), 51 | ]); 52 | 53 | if (options.quoteType === "'") 54 | project.manipulationSettings.set({ quoteKind: QuoteKind.Single }); 55 | else if (options.quoteType === "\"") 56 | project.manipulationSettings.set({ quoteKind: QuoteKind.Double }); 57 | else 58 | project.manipulationSettings.set({ quoteKind: determineQuoteKind(project) }); 59 | 60 | if (options.newLineType === "\r\n") 61 | project.manipulationSettings.set({ newLineKind: NewLineKind.CarriageReturnLineFeed }); 62 | 63 | return project; 64 | } 65 | -------------------------------------------------------------------------------- /src/cli.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import { PublicApi } from "./PublicApi"; 4 | import { parseCommandLineArgs } from "./parseCommandLineArgs"; 5 | import { getPackageVersion } from "./getPackageVersion"; 6 | import { getHelpText } from "./getHelpText"; 7 | 8 | const args = parseCommandLineArgs(process.argv.slice(2)); 9 | if (args.showHelp) 10 | console.log(getHelpText()); 11 | else if (args.showVersion) 12 | console.log(getPackageVersion()); 13 | else { 14 | const watchPath = args.path; 15 | const api = new PublicApi(watchPath, args); 16 | 17 | console.log(`Updating directory ${watchPath}...`); 18 | api.updateDirectory(watchPath); 19 | console.log(`Watching files in ${watchPath}...`); 20 | api.watchDirectory(watchPath); 21 | } 22 | -------------------------------------------------------------------------------- /src/getHelpText.ts: -------------------------------------------------------------------------------- 1 | import { getPackageVersion } from "./getPackageVersion"; 2 | 3 | export function getHelpText() { 4 | // I used tsc --help as an example template for this 5 | return `Version ${getPackageVersion()} 6 | Syntax: barrel-maintainer [options] [path] 7 | 8 | Examples: barrel-maintainer 9 | barrel-maintainer src 10 | barrel-maintainer --includeRootDir src 11 | barrel-maintainer --singleQuotes --ts --crlf --includeRootDir src 12 | 13 | Options: 14 | -h, --help Output this message. 15 | -v, --version Output the version. 16 | --includeRootDir Specify to create a barrel in the root directory. 17 | --singleQuotes, --doubleQuotes Force the kind of quotes to use (defaults to what's used in the project) 18 | --ts, --js Force the file type to use for barrel index files (defaults to what's used most in the project) 19 | --crlf, --lf Force the line ending kind to use (defaults to crlf on windows and lf on linux) 20 | 21 | Ignoring files: 22 | 23 | Add a /* barrel:ignore */ comment to the file. 24 | `; 25 | } 26 | -------------------------------------------------------------------------------- /src/getPackageVersion.ts: -------------------------------------------------------------------------------- 1 | export function getPackageVersion() { 2 | const pjson = require("./../package.json"); 3 | return pjson.version; 4 | } 5 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | export { PublicApi as default } from "./PublicApi"; 2 | export { Options } from "./Options"; 3 | -------------------------------------------------------------------------------- /src/parseCommandLineArgs.ts: -------------------------------------------------------------------------------- 1 | import * as path from "path"; 2 | import * as os from "os"; 3 | import { CommandLineOptions } from "./CommandLineOptions"; 4 | import * as minimist from "minimist"; 5 | 6 | export function parseCommandLineArgs(args: string[]): CommandLineOptions { 7 | const argv = minimist(args, { boolean: true }); 8 | 9 | return { 10 | path: getPath(), 11 | fileExtension: getFileExtension(), 12 | newLineType: getNewLineType(), 13 | quoteType: getQuoteType(), 14 | includeRootDir: argv.hasOwnProperty("includeRootDir"), 15 | showHelp: argv.hasOwnProperty("h") || argv.hasOwnProperty("help"), 16 | showVersion: argv.hasOwnProperty("v") || argv.hasOwnProperty("version"), 17 | }; 18 | 19 | function getPath() { 20 | if (argv._.length === 0) 21 | return path.resolve(); 22 | const dirPath = argv._[0]; 23 | return path.normalize(path.resolve(dirPath)); 24 | } 25 | 26 | function getFileExtension() { 27 | const ts = "ts"; 28 | const js = "js"; 29 | if (argv.hasOwnProperty(ts) && argv.hasOwnProperty(js)) 30 | throw new Error(`Cannot specify both a --${ts} and --${js} option.`); 31 | 32 | if (argv.hasOwnProperty(ts)) 33 | return "ts"; 34 | if (argv.hasOwnProperty(js)) 35 | return "js"; 36 | return undefined; 37 | } 38 | 39 | function getNewLineType() { 40 | const lf = "lf"; 41 | const crlf = "crlf"; 42 | if (argv.hasOwnProperty(lf) && argv.hasOwnProperty(crlf)) 43 | throw new Error(`Cannot specify both a --${lf} and --${crlf} option.`); 44 | 45 | if (argv.hasOwnProperty(lf)) 46 | return "\n"; 47 | if (argv.hasOwnProperty(crlf)) 48 | return "\r\n"; 49 | return os.platform() === "win32" ? "\r\n" : "\n"; 50 | } 51 | 52 | function getQuoteType() { 53 | const singleQuotes = "singleQuotes"; 54 | const doubleQuotes = "doubleQuotes"; 55 | if (argv.hasOwnProperty(singleQuotes) && argv.hasOwnProperty(doubleQuotes)) 56 | throw new Error(`Cannot specify both a --${singleQuotes} and --${doubleQuotes} option.`); 57 | 58 | if (argv.hasOwnProperty(singleQuotes)) 59 | return "'"; 60 | if (argv.hasOwnProperty(doubleQuotes)) 61 | return "\""; 62 | return undefined; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/tests/maintainerTests.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import { Project, Directory, QuoteKind } from "ts-morph"; 3 | import { Maintainer } from "./../Maintainer"; 4 | 5 | describe("Maintainer", () => { 6 | function setup(opts: { fileExtension?: "ts" | "js"; quoteStyle?: "\"" | "'"; includeRootDir?: boolean; } = {}) { 7 | const { fileExtension = "ts", quoteStyle, includeRootDir } = opts; 8 | const project = new Project({ useInMemoryFileSystem: true }); 9 | if (quoteStyle === "'") 10 | project.manipulationSettings.set({ quoteKind: QuoteKind.Single }); 11 | const rootDir = project.createDirectory("rootDir"); 12 | const maintainer = new Maintainer(rootDir, { fileExtension, includeRootDir }); 13 | return { project, rootDir, maintainer }; 14 | } 15 | 16 | function checkBarrels(dir: Directory, expectedBarrelFiles: { path: string; text: string; }[]) { 17 | const barrelFiles = dir.getDescendantSourceFiles().filter(s => s.getBaseName() === "index.ts" || s.getBaseName() === "index.js"); 18 | for (const file of barrelFiles) { 19 | const index = expectedBarrelFiles.findIndex(f => "/rootDir/" + f.path === file.getFilePath()); 20 | if (index === -1) 21 | throw new Error(`Could not find expected file of ${file.getFilePath()}`); 22 | const expectedFile = expectedBarrelFiles.splice(index, 1)[0]; 23 | expect(file.getFullText()).to.equal(expectedFile.text, `Expected file at ${file.getFilePath()} to match.`); 24 | } 25 | 26 | if (expectedBarrelFiles.length > 0) 27 | throw new Error("Left over files: " + expectedBarrelFiles.map(f => f.path)); 28 | } 29 | 30 | describe("#updateDir()", () => { 31 | it("should determine the file extension", () => { 32 | const project = new Project({ useInMemoryFileSystem: true }); 33 | const rootDir = project.createDirectory("dir"); 34 | rootDir.createSourceFile("dir/file.ts", ""); 35 | const maintainer = new Maintainer(rootDir, {}); 36 | maintainer.updateDir(rootDir); 37 | 38 | it("should have the correct files", () => { 39 | checkBarrels(rootDir, [ 40 | { path: "dir/index.ts", text: `export * from "./file";\n` }, 41 | ]); 42 | }); 43 | }); 44 | 45 | it("should throw if specifying a directory that is not a descendant or equal to the root directory", () => { 46 | const { project, maintainer } = setup(); 47 | const otherDir = project.createDirectory("otherDir"); 48 | expect(() => maintainer.updateDir(otherDir)).to.throw(); 49 | }); 50 | 51 | it("should update the root directory when specifying so", () => { 52 | const { project, rootDir } = setup({ includeRootDir: true }); 53 | const dir = project.createDirectory("dir"); 54 | dir.createSourceFile("dir/file.ts", ""); 55 | 56 | it("should have the correct files", () => { 57 | checkBarrels(rootDir, [ 58 | { path: "index.ts", text: `export * from "./dir";\n` }, 59 | { path: "dir/index.ts", text: `export * from "./file";\n` }, 60 | ]); 61 | }); 62 | }); 63 | 64 | describe("specifying the root directory", () => { 65 | const { rootDir, maintainer } = setup(); 66 | 67 | // entities dir 68 | const entitiesDir = rootDir.createDirectory("entities"); 69 | entitiesDir.createSourceFile("person.ts", "export class Person {}"); 70 | entitiesDir.createSourceFile("note.ts", "/* barrel:ignore */\nexport class Note {}"); 71 | 72 | // random dir 73 | const randomDir = rootDir.createDirectory("random"); 74 | randomDir.createSourceFile("file1.ts", "export = 5;"); 75 | randomDir.createSourceFile("file2.ts", "export default 5;"); 76 | randomDir.createSourceFile("file3.ts", "console.log(5);"); 77 | const randomSubDir = randomDir.createDirectory("subDir"); 78 | randomSubDir.createSourceFile("jsFile.js", "export class MyClass {}"); 79 | const randomEmptyDir = randomDir.createDirectory("emptyDir"); 80 | 81 | maintainer.updateDir(rootDir); 82 | 83 | it("should have the correct files", () => { 84 | checkBarrels(rootDir, [ 85 | { path: "entities/index.ts", text: `export * from "./person";\n` }, 86 | { 87 | path: "random/index.ts", 88 | text: `export * from "./file1";\n` 89 | + `export * from "./file2";\n` 90 | + `export * from "./subDir";\n`, 91 | }, 92 | { path: "random/subDir/index.ts", text: `export * from "./jsFile";\n` }, 93 | ]); 94 | }); 95 | }); 96 | 97 | describe("only updating one directory", () => { 98 | const { rootDir, maintainer } = setup(); 99 | 100 | const entitiesDir = rootDir.createDirectory("entities"); 101 | entitiesDir.createSourceFile("person.ts", "export class Person {}"); 102 | const randomDir = rootDir.createDirectory("random"); 103 | randomDir.createSourceFile("file1.ts", "export = 5;"); 104 | const randomSubDir = randomDir.createDirectory("subDir"); 105 | randomSubDir.createSourceFile("jsFile.js", "export class MyClass {}"); 106 | maintainer.updateDir(rootDir.getDirectoryOrThrow("random/subDir")); 107 | 108 | it("should have the correct files", () => { 109 | checkBarrels(rootDir, [ 110 | { path: "random/index.ts", text: `export * from "./subDir";\n` }, 111 | { path: "random/subDir/index.ts", text: `export * from "./jsFile";\n` }, 112 | ]); 113 | }); 114 | }); 115 | 116 | describe("deleting all the files in a folder after updating", () => { 117 | const { project, rootDir, maintainer } = setup(); 118 | const randomDir = rootDir.createDirectory("random"); 119 | randomDir.createSourceFile("file1.ts", "export = 5;"); 120 | const randomSubDir = randomDir.createDirectory("subDir"); 121 | randomSubDir.createSourceFile("jsFile.js", "export class MyClass {}"); 122 | const randomEmptyDir = randomDir.createDirectory("emptyDir"); 123 | maintainer.updateDir(rootDir); 124 | 125 | const subDir = rootDir.getDirectoryOrThrow("random/subDir"); 126 | subDir.getSourceFileOrThrow("jsFile.js").deleteImmediatelySync(); 127 | const indexPath = subDir.getSourceFileOrThrow("index.ts").getFilePath(); 128 | maintainer.updateDir(subDir); 129 | 130 | it("should have deleted the index file in the sub directory", () => { 131 | expect(project.getFileSystem().fileExistsSync(indexPath)).to.be.false; 132 | expect(subDir.getSourceFile("index.ts")).to.be.undefined; 133 | }); 134 | 135 | it("should have the correct files", () => { 136 | checkBarrels(rootDir, [ 137 | { path: "random/index.ts", text: `export * from "./file1";\n` }, 138 | ]); 139 | }); 140 | }); 141 | 142 | describe("deleting a file way down in a sub folder", () => { 143 | const { maintainer, rootDir } = setup(); 144 | const descendantFile = rootDir.createSourceFile("dir/subdir/deeper/more/file.ts", "export class MyClass {}"); 145 | const finalDirectory = descendantFile.getDirectory(); 146 | 147 | maintainer.updateDir(rootDir); 148 | rootDir.getSourceFileOrThrow("dir/subdir/index.ts").addClass({ name: "MyClass", isExported: true }); 149 | rootDir.getSourceFileOrThrow("dir/subdir/deeper/index.ts").addClass({ name: "MyClass" }); 150 | descendantFile.delete(); 151 | maintainer.updateDir(finalDirectory); 152 | 153 | it("should have the correct files", () => { 154 | checkBarrels(rootDir, [ 155 | { path: "dir/index.ts", text: `export * from "./subdir";\n` }, 156 | { path: "dir/subdir/index.ts", text: `export class MyClass {\n}\n` }, 157 | { path: "dir/subdir/deeper/index.ts", text: `class MyClass {\n}\n` }, 158 | ]); 159 | }); 160 | }); 161 | 162 | describe("deleting a file way down in a sub folder", () => { 163 | const { maintainer, rootDir } = setup(); 164 | const descendantFile = rootDir.createSourceFile("dir/subdir/deeper/more/file.ts", "export class MyClass {}"); 165 | const finalDirectory = descendantFile.getDirectory(); 166 | 167 | maintainer.updateDir(rootDir); 168 | descendantFile.delete(); 169 | maintainer.updateDir(finalDirectory); 170 | 171 | it("should have no barrel files", () => { 172 | checkBarrels(rootDir, []); 173 | }); 174 | }); 175 | 176 | describe("refreshing a folder multiple times", () => { 177 | const { maintainer, rootDir } = setup(); 178 | const file = rootDir.createSourceFile("dir/file.ts", "export class MyClass {}"); 179 | const dir = file.getDirectory(); 180 | 181 | maintainer.updateDir(rootDir); 182 | maintainer.updateDir(rootDir); 183 | 184 | it("should have the correct files", () => { 185 | checkBarrels(rootDir, [{ 186 | path: "dir/index.ts", 187 | text: `export * from "./file";\n`, 188 | }]); 189 | }); 190 | }); 191 | 192 | describe("adding a file", () => { 193 | const { maintainer, rootDir } = setup(); 194 | const file = rootDir.createSourceFile("dir/b.ts", "export class MyClass {}"); 195 | const subdir = file.getDirectory(); 196 | 197 | maintainer.updateDir(rootDir); 198 | rootDir.createSourceFile("dir/c.ts", "export class MyClass2 {}"); 199 | rootDir.createSourceFile("dir/a.ts", "export class MyClass2 {}"); 200 | rootDir.createSourceFile("dir/f.ts", "export class MyClass2 {}"); 201 | rootDir.createSourceFile("dir/E.ts", "export class MyClass2 {}"); 202 | rootDir.createSourceFile("dir/d.ts", "export class MyClass2 {}"); 203 | maintainer.updateDir(subdir); 204 | 205 | it("should have the correct files and put them in alphabetical order", () => { 206 | checkBarrels(rootDir, [{ 207 | path: "dir/index.ts", 208 | text: `export * from "./a";\n` 209 | + `export * from "./b";\n` 210 | + `export * from "./c";\n` 211 | + `export * from "./d";\n` 212 | + `export * from "./E";\n` 213 | + `export * from "./f";\n`, 214 | }]); 215 | }); 216 | }); 217 | 218 | describe("adding a folder", () => { 219 | const { maintainer, rootDir } = setup(); 220 | const file = rootDir.createSourceFile("dir/subdir/file.ts", "export class MyClass {}"); 221 | const subdir = file.getDirectory(); 222 | 223 | maintainer.updateDir(rootDir); 224 | const newFile = rootDir.createSourceFile("dir/subdir/deeper/file.ts", "export class MyClass {}"); 225 | maintainer.updateDir(subdir); 226 | 227 | it("should have the correct files", () => { 228 | checkBarrels(rootDir, [{ 229 | path: "dir/index.ts", 230 | text: `export * from "./subdir";\n`, 231 | }, { 232 | path: "dir/subdir/index.ts", 233 | text: `export * from "./deeper";\nexport * from "./file";\n`, 234 | }, { 235 | path: "dir/subdir/deeper/index.ts", 236 | text: `export * from "./file";\n`, 237 | }]); 238 | }); 239 | }); 240 | 241 | describe("having a named export in a barrel", () => { 242 | const { maintainer, rootDir } = setup(); 243 | rootDir.createSourceFile("dir/file1.ts", "export class MyClass {}"); 244 | rootDir.createSourceFile("dir/file2.ts", "export class MyClass2 {}"); 245 | rootDir.createSourceFile("dir/index.ts", `export {MyClass2} from "./file2";\n`); 246 | maintainer.updateDir(rootDir); 247 | 248 | it("should keep the named export as-is", () => { 249 | checkBarrels(rootDir, [{ 250 | path: "dir/index.ts", 251 | text: `export * from "./file1";\n` 252 | + `export {MyClass2} from "./file2";\n`, 253 | }]); 254 | }); 255 | }); 256 | 257 | describe("using single quotes and js files", () => { 258 | const { maintainer, rootDir } = setup({ quoteStyle: "'", fileExtension: "js" }); 259 | rootDir.createSourceFile("dir/file.js", "export class MyClass {}"); 260 | maintainer.updateDir(rootDir); 261 | 262 | it("should have the correct files", () => { 263 | checkBarrels(rootDir, [{ 264 | path: "dir/index.js", 265 | text: `export * from './file';\n`, 266 | }]); 267 | }); 268 | }); 269 | }); 270 | }); 271 | -------------------------------------------------------------------------------- /src/tests/parseCommandLineArgsTests.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import * as path from "path"; 3 | import * as os from "os"; 4 | import { CommandLineOptions } from "./../CommandLineOptions"; 5 | import { parseCommandLineArgs } from "./../parseCommandLineArgs"; 6 | 7 | describe("parseCommandLineArgs", () => { 8 | function doThrowTest(args: string) { 9 | expect(() => parseCommandLineArgs(args.split(" "))).to.throw(); 10 | } 11 | 12 | function doTest(args: string, expected: Partial) { 13 | const result = parseCommandLineArgs(args.split(" ")); 14 | if (expected.path == null) 15 | expect(result.path).to.equal(path.resolve()); 16 | else 17 | expect(result.path).to.equal(path.normalize(path.resolve(expected.path))); 18 | expect(result.fileExtension).to.equal(expected.fileExtension); 19 | expect(result.newLineType).to 20 | .equal(expected.newLineType || (os.platform() === "win32" ? "\r\n" : "\n")); 21 | expect(result.quoteType).to.equal(expected.quoteType); 22 | expect(result.includeRootDir).to.equal(expected.includeRootDir || false); 23 | expect(result.showHelp).to.equal(expected.showHelp || false); 24 | expect(result.showVersion).to.equal(expected.showVersion || false); 25 | } 26 | 27 | it("should return the defaults when not specified", () => { 28 | doTest("", {}); 29 | }); 30 | 31 | it("should return the path when specified", () => { 32 | doTest("src", { path: "src" }); 33 | }); 34 | 35 | it("should return the path when including flags after", () => { 36 | doTest("src --ts", { path: "src", fileExtension: "ts" }); 37 | }); 38 | 39 | it("should return the path when including flags before", () => { 40 | doTest("--ts src", { path: "src", fileExtension: "ts" }); 41 | }); 42 | 43 | describe("fileExtension", () => { 44 | it("should use ts when specifying", () => { 45 | doTest("--ts", { fileExtension: "ts" }); 46 | }); 47 | 48 | it("should use js when specifying", () => { 49 | doTest("--js", { fileExtension: "js" }); 50 | }); 51 | 52 | it("should throw when specifying both", () => { 53 | doThrowTest("--ts --js"); 54 | }); 55 | }); 56 | 57 | describe("newLineType", () => { 58 | it("should use crlf when specifying", () => { 59 | doTest("--crlf", { newLineType: "\r\n" }); 60 | }); 61 | 62 | it("should use lf when specifying", () => { 63 | doTest("--lf", { newLineType: "\n" }); 64 | }); 65 | 66 | it("should throw when specifying both", () => { 67 | doThrowTest("--crlf --lf"); 68 | }); 69 | }); 70 | 71 | describe("quotes", () => { 72 | it("should use single quotes when specifying", () => { 73 | doTest("--singleQuotes", { quoteType: "'" }); 74 | }); 75 | 76 | it("should use double quotes when specifying", () => { 77 | doTest("--doubleQuotes", { quoteType: "\"" }); 78 | }); 79 | 80 | it("should throw when specifying both", () => { 81 | doThrowTest("--singleQuotes --doubleQuotes"); 82 | }); 83 | }); 84 | 85 | describe("includeRootDir", () => { 86 | it("should include the root dir when specifying", () => { 87 | doTest("--includeRootDir", { includeRootDir: true }); 88 | }); 89 | }); 90 | 91 | describe("showVersion", () => { 92 | it("should show the version when specified short form", () => { 93 | doTest("-v", { showVersion: true }); 94 | }); 95 | 96 | it("should show the version when specified long form", () => { 97 | doTest("--version", { showVersion: true }); 98 | }); 99 | }); 100 | 101 | describe("showHelp", () => { 102 | it("should show the help when specified short form", () => { 103 | doTest("-h", { showHelp: true }); 104 | }); 105 | 106 | it("should show the version when specified long form", () => { 107 | doTest("--help", { showHelp: true }); 108 | }); 109 | }); 110 | }); 111 | -------------------------------------------------------------------------------- /src/tests/utils/determineFileExtensionTests.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import { Project } from "ts-morph"; 3 | import { determineFileExtension } from "./../../utils"; 4 | 5 | describe("determineFileExtension", () => { 6 | function setup() { 7 | const project = new Project({ useInMemoryFileSystem: true }); 8 | const rootDir = project.createDirectory("rootDir"); 9 | return { project, rootDir }; 10 | } 11 | 12 | it("should determine as js when there are no files", () => { 13 | const { rootDir } = setup(); 14 | expect(determineFileExtension(rootDir)).to.equal("js"); 15 | }); 16 | 17 | it("should determine as js when there are more js files", () => { 18 | const { rootDir } = setup(); 19 | rootDir.createSourceFile("file.ts"); 20 | rootDir.createSourceFile("dir/file.js"); 21 | rootDir.createSourceFile("dir/file2.js"); 22 | expect(determineFileExtension(rootDir)).to.equal("js"); 23 | }); 24 | 25 | it("should determine as ts when there are more ts files", () => { 26 | const { rootDir } = setup(); 27 | rootDir.createSourceFile("file.ts"); 28 | rootDir.createSourceFile("dir/file.ts"); 29 | rootDir.createSourceFile("dir/file2.js"); 30 | expect(determineFileExtension(rootDir)).to.equal("ts"); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /src/tests/utils/determineQuoteKindTests.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import { Project, QuoteKind } from "ts-morph"; 3 | import { determineQuoteKind } from "./../../utils"; 4 | 5 | describe("determineQuoteKind", () => { 6 | it("should determine as double quote when there are no files", () => { 7 | const project = new Project({ useInMemoryFileSystem: true }); 8 | expect(determineQuoteKind(project)).to.equal(QuoteKind.Double); 9 | }); 10 | 11 | it("should determine as single quote when there's a file with an import declaration with a single quote", () => { 12 | const project = new Project({ useInMemoryFileSystem: true }); 13 | project.createSourceFile("file.ts", ""); 14 | project.createSourceFile("dir/file.ts", "import * from 'test';"); 15 | expect(determineQuoteKind(project)).to.equal(QuoteKind.Single); 16 | }); 17 | 18 | it("should determine as double quote when there's a file with an import declaration with a double quote", () => { 19 | const project = new Project({ useInMemoryFileSystem: true }); 20 | project.createSourceFile("file.ts", ""); 21 | project.createSourceFile("dir/file.ts", `import * from "test";`); 22 | expect(determineQuoteKind(project)).to.equal(QuoteKind.Double); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/tests/utils/directoryAncestorCollectionTests.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import { Project, Directory } from "ts-morph"; 3 | import { DirectoryAncestorCollection } from "./../../utils"; 4 | 5 | describe("DirectoryAncestorCollection", () => { 6 | const project = new Project({ useInMemoryFileSystem: true }); 7 | const rootDir = project.createDirectory("dir"); 8 | const child1 = rootDir.createDirectory("child1"); 9 | const child2 = rootDir.createDirectory("child2"); 10 | const grandChild1 = child1.createDirectory("grandChild1"); 11 | 12 | function testDirs(collection: DirectoryAncestorCollection, dirs: Directory[]) { 13 | expect(collection.getAll().map(d => d.getPath()).sort()).to.deep.equal( 14 | dirs.map(d => d.getPath()).sort(), 15 | ); 16 | } 17 | 18 | describe("#tryAdd()", () => { 19 | it("should add if no descendant or ancestor exists", () => { 20 | const collection = new DirectoryAncestorCollection(); 21 | collection.tryAdd(child1); 22 | collection.tryAdd(child2); 23 | testDirs(collection, [child1, child2]); 24 | }); 25 | 26 | it("should not add if an ancestor exists", () => { 27 | const collection = new DirectoryAncestorCollection(); 28 | collection.tryAdd(rootDir); 29 | collection.tryAdd(child1); 30 | collection.tryAdd(child2); 31 | testDirs(collection, [rootDir]); 32 | }); 33 | 34 | it("should not add if the same directory exists", () => { 35 | const collection = new DirectoryAncestorCollection(); 36 | collection.tryAdd(rootDir); 37 | collection.tryAdd(rootDir); 38 | testDirs(collection, [rootDir]); 39 | }); 40 | 41 | it("should add if a descendant exists and remove the descendants", () => { 42 | const collection = new DirectoryAncestorCollection(); 43 | collection.tryAdd(grandChild1); 44 | collection.tryAdd(child1); 45 | testDirs(collection, [child1]); 46 | collection.tryAdd(child2); 47 | collection.tryAdd(rootDir); 48 | testDirs(collection, [rootDir]); 49 | }); 50 | }); 51 | 52 | describe("#clear()", () => { 53 | it("should clear anything that exists in the collection", () => { 54 | const collection = new DirectoryAncestorCollection(); 55 | collection.tryAdd(child1); 56 | collection.tryAdd(child2); 57 | collection.clear(); 58 | expect(collection.getAll().length).to.equal(0); 59 | }); 60 | }); 61 | }); 62 | -------------------------------------------------------------------------------- /src/tests/utils/throttlerTests.ts: -------------------------------------------------------------------------------- 1 | import { expect } from "chai"; 2 | import { Throttler, asyncTimeout } from "./../../utils"; 3 | 4 | describe("Throttler", () => { 5 | describe("#run()", () => { 6 | it("should only run once within the throttle time", async () => { 7 | let increment = 0; 8 | const throttler = new Throttler(50, () => increment++); 9 | for (let i = 0; i < 10; i++) 10 | throttler.run(); 11 | await asyncTimeout(100); 12 | for (let i = 0; i < 10; i++) 13 | throttler.run(); 14 | await asyncTimeout(100); 15 | throttler.run(); 16 | expect(increment).to.equal(2); // final throttle should not have executed yet 17 | }); 18 | }); 19 | }); 20 | -------------------------------------------------------------------------------- /src/utils/DirectoryAncestorCollection.ts: -------------------------------------------------------------------------------- 1 | import { Directory } from "ts-morph"; 2 | 3 | /** 4 | * Holds a collection of directories, but only maintains the parent-most directories. 5 | * 6 | * 1. If a directory is added and an ancestor exists in the collection, the directory will not be added. 7 | * 2. If a directory is added and a descendant exists in the collection, the directory will be added 8 | * and the descendant will be removed. 9 | * 3. If a directory is added and neither an ancestor or descendant exists in the collection, 10 | * the directory will be added. 11 | */ 12 | export class DirectoryAncestorCollection { 13 | private readonly directories: Directory[] = []; 14 | 15 | tryAdd(dir: Directory) { 16 | for (let i = this.directories.length - 1; i >= 0; i--) { 17 | const existingDir = this.directories[i]; 18 | if (dir.isDescendantOf(existingDir) || dir === existingDir) 19 | return; 20 | if (dir.isAncestorOf(existingDir)) 21 | this.directories.splice(i, 1); 22 | } 23 | 24 | this.directories.push(dir); 25 | } 26 | 27 | getAll() { 28 | return [...this.directories]; 29 | } 30 | 31 | clear() { 32 | this.directories.length = 0; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/utils/Throttler.ts: -------------------------------------------------------------------------------- 1 | export class Throttler { 2 | private timeout: NodeJS.Timer | undefined; 3 | 4 | constructor(private readonly delay: number, private readonly action: () => void) { 5 | } 6 | 7 | run() { 8 | if (this.timeout != null) 9 | return; 10 | 11 | this.timeout = setTimeout(() => { 12 | this.action(); 13 | this.timeout = undefined; 14 | }, this.delay); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/utils/asyncTimeout.ts: -------------------------------------------------------------------------------- 1 | export function asyncTimeout(timeout: number) { 2 | return new Promise(resolve => { 3 | setTimeout(() => resolve(), timeout); 4 | }); 5 | } 6 | -------------------------------------------------------------------------------- /src/utils/determineFileExtension.ts: -------------------------------------------------------------------------------- 1 | import { Directory } from "ts-morph"; 2 | 3 | export function determineFileExtension(dir: Directory) { 4 | const extensions = dir.getDescendantSourceFiles().map(s => { 5 | const filePath = s.getFilePath(); 6 | return filePath.substring(filePath.length - 2).toUpperCase(); 7 | }); 8 | const tsEndings = extensions.filter(p => p === "TS").length; 9 | const jsEndings = extensions.filter(p => p === "JS").length; 10 | 11 | return tsEndings > jsEndings ? "ts" : "js"; 12 | } 13 | -------------------------------------------------------------------------------- /src/utils/determineQuoteKind.ts: -------------------------------------------------------------------------------- 1 | import { Project, QuoteKind, SyntaxKind } from "ts-morph"; 2 | 3 | /** 4 | * Finds a source file with an import declaration, then checks what quote kind it's using. 5 | * @param ast - Ast. 6 | */ 7 | export function determineQuoteKind(project: Project) { 8 | const defaultType = QuoteKind.Double; 9 | const sourceFileWithImport = project.getSourceFiles().find(s => s.getImportDeclarations().length > 0); 10 | if (sourceFileWithImport == null) 11 | return defaultType; 12 | const importDeclaration = sourceFileWithImport.getImportDeclarations()[0]; 13 | const stringLiteral = importDeclaration.getFirstChildByKind(SyntaxKind.StringLiteral); 14 | 15 | return stringLiteral == null ? defaultType : stringLiteral.getQuoteKind(); 16 | } 17 | -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./asyncTimeout"; 2 | export * from "./determineFileExtension"; 3 | export * from "./determineQuoteKind"; 4 | export * from "./DirectoryAncestorCollection"; 5 | export * from "./pathUtils"; 6 | export * from "./Throttler"; 7 | -------------------------------------------------------------------------------- /src/utils/pathUtils.ts: -------------------------------------------------------------------------------- 1 | import * as nodePath from "path"; 2 | 3 | export function standardizePath(path: string) { 4 | return nodePath.normalize(nodePath.resolve(path)); 5 | } 6 | 7 | export function isDescendantOf(path: string, expectedDescendant: string) { 8 | return expectedDescendant.startsWith(path); 9 | } 10 | -------------------------------------------------------------------------------- /src/watch.ts: -------------------------------------------------------------------------------- 1 | import * as chokidar from "chokidar"; 2 | import * as path from "path"; 3 | import { FileSystemRefreshResult, Directory } from "ts-morph"; 4 | import { Maintainer } from "./Maintainer"; 5 | import { Throttler, DirectoryAncestorCollection } from "./utils"; 6 | 7 | export function watch(rootDir: Directory, directory: Directory, maintainer: Maintainer) { 8 | const watchThrottler = new WatchThrottler(100, maintainer, rootDir); 9 | const watcher = chokidar.watch([path.join(directory.getPath(), "**/*.{ts,js,tsx,jsx}"), "!" + path.join(directory.getPath(), "**/*.d.ts")], { 10 | ignorePermissionErrors: true, 11 | usePolling: true, 12 | interval: 300, 13 | }).on("all", async (event: string, path: string) => { 14 | try { 15 | let sourceFile = directory.getSourceFile(path); 16 | if (sourceFile == null) { 17 | sourceFile = directory.addSourceFileAtPathIfExists(path); 18 | if (sourceFile != null) 19 | watchThrottler.addDirectory(sourceFile.getDirectory()); 20 | return; 21 | } 22 | 23 | const dirToUpdate = sourceFile.getDirectory(); 24 | const result = await sourceFile.refreshFromFileSystem(); 25 | switch (result) { 26 | case FileSystemRefreshResult.Updated: 27 | case FileSystemRefreshResult.Deleted: 28 | watchThrottler.addDirectory(dirToUpdate); 29 | break; 30 | } 31 | } catch (err) { 32 | console.error(err); 33 | } 34 | }); 35 | 36 | return { 37 | stop: () => { 38 | watcher.removeAllListeners(); 39 | }, 40 | }; 41 | } 42 | 43 | class WatchThrottler { 44 | private readonly directories = new DirectoryAncestorCollection(); 45 | private readonly throttler: Throttler; 46 | 47 | constructor(delay: number, private readonly maintainer: Maintainer, private readonly rootDir: Directory) { 48 | this.throttler = new Throttler(delay, () => { 49 | for (const directory of this.directories.getAll()) { 50 | this.maintainer.updateDir(directory); 51 | console.log(`Updated ${directory.getPath()}`); 52 | } 53 | this.directories.clear(); 54 | this.rootDir.save(); 55 | }); 56 | } 57 | 58 | addDirectory(dir: Directory) { 59 | this.directories.tryAdd(dir); 60 | this.throttler.run(); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "declaration": true, 6 | "rootDir": "src", 7 | "outDir": "dist", 8 | "removeComments": true, 9 | "strict": true, 10 | "newLine": "lf", 11 | "noFallthroughCasesInSwitch": true, 12 | "noImplicitReturns": true, 13 | "allowSyntheticDefaultImports": true, 14 | "lib": ["es2015"] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.8.3": 6 | version "7.8.3" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" 8 | dependencies: 9 | "@babel/highlight" "^7.8.3" 10 | 11 | "@babel/core@^7.7.5": 12 | version "7.9.0" 13 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" 14 | dependencies: 15 | "@babel/code-frame" "^7.8.3" 16 | "@babel/generator" "^7.9.0" 17 | "@babel/helper-module-transforms" "^7.9.0" 18 | "@babel/helpers" "^7.9.0" 19 | "@babel/parser" "^7.9.0" 20 | "@babel/template" "^7.8.6" 21 | "@babel/traverse" "^7.9.0" 22 | "@babel/types" "^7.9.0" 23 | convert-source-map "^1.7.0" 24 | debug "^4.1.0" 25 | gensync "^1.0.0-beta.1" 26 | json5 "^2.1.2" 27 | lodash "^4.17.13" 28 | resolve "^1.3.2" 29 | semver "^5.4.1" 30 | source-map "^0.5.0" 31 | 32 | "@babel/generator@^7.9.0", "@babel/generator@^7.9.5": 33 | version "7.9.5" 34 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.5.tgz#27f0917741acc41e6eaaced6d68f96c3fa9afaf9" 35 | dependencies: 36 | "@babel/types" "^7.9.5" 37 | jsesc "^2.5.1" 38 | lodash "^4.17.13" 39 | source-map "^0.5.0" 40 | 41 | "@babel/helper-function-name@^7.9.5": 42 | version "7.9.5" 43 | resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" 44 | dependencies: 45 | "@babel/helper-get-function-arity" "^7.8.3" 46 | "@babel/template" "^7.8.3" 47 | "@babel/types" "^7.9.5" 48 | 49 | "@babel/helper-get-function-arity@^7.8.3": 50 | version "7.8.3" 51 | resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" 52 | dependencies: 53 | "@babel/types" "^7.8.3" 54 | 55 | "@babel/helper-member-expression-to-functions@^7.8.3": 56 | version "7.8.3" 57 | resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" 58 | dependencies: 59 | "@babel/types" "^7.8.3" 60 | 61 | "@babel/helper-module-imports@^7.8.3": 62 | version "7.8.3" 63 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" 64 | dependencies: 65 | "@babel/types" "^7.8.3" 66 | 67 | "@babel/helper-module-transforms@^7.9.0": 68 | version "7.9.0" 69 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" 70 | dependencies: 71 | "@babel/helper-module-imports" "^7.8.3" 72 | "@babel/helper-replace-supers" "^7.8.6" 73 | "@babel/helper-simple-access" "^7.8.3" 74 | "@babel/helper-split-export-declaration" "^7.8.3" 75 | "@babel/template" "^7.8.6" 76 | "@babel/types" "^7.9.0" 77 | lodash "^4.17.13" 78 | 79 | "@babel/helper-optimise-call-expression@^7.8.3": 80 | version "7.8.3" 81 | resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" 82 | dependencies: 83 | "@babel/types" "^7.8.3" 84 | 85 | "@babel/helper-replace-supers@^7.8.6": 86 | version "7.8.6" 87 | resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" 88 | dependencies: 89 | "@babel/helper-member-expression-to-functions" "^7.8.3" 90 | "@babel/helper-optimise-call-expression" "^7.8.3" 91 | "@babel/traverse" "^7.8.6" 92 | "@babel/types" "^7.8.6" 93 | 94 | "@babel/helper-simple-access@^7.8.3": 95 | version "7.8.3" 96 | resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" 97 | dependencies: 98 | "@babel/template" "^7.8.3" 99 | "@babel/types" "^7.8.3" 100 | 101 | "@babel/helper-split-export-declaration@^7.8.3": 102 | version "7.8.3" 103 | resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" 104 | dependencies: 105 | "@babel/types" "^7.8.3" 106 | 107 | "@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": 108 | version "7.9.5" 109 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" 110 | 111 | "@babel/helpers@^7.9.0": 112 | version "7.9.2" 113 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" 114 | dependencies: 115 | "@babel/template" "^7.8.3" 116 | "@babel/traverse" "^7.9.0" 117 | "@babel/types" "^7.9.0" 118 | 119 | "@babel/highlight@^7.8.3": 120 | version "7.9.0" 121 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.9.0.tgz#4e9b45ccb82b79607271b2979ad82c7b68163079" 122 | dependencies: 123 | "@babel/helper-validator-identifier" "^7.9.0" 124 | chalk "^2.0.0" 125 | js-tokens "^4.0.0" 126 | 127 | "@babel/parser@^7.7.5", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": 128 | version "7.9.4" 129 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" 130 | 131 | "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": 132 | version "7.8.6" 133 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" 134 | dependencies: 135 | "@babel/code-frame" "^7.8.3" 136 | "@babel/parser" "^7.8.6" 137 | "@babel/types" "^7.8.6" 138 | 139 | "@babel/traverse@^7.7.4", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": 140 | version "7.9.5" 141 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.5.tgz#6e7c56b44e2ac7011a948c21e283ddd9d9db97a2" 142 | dependencies: 143 | "@babel/code-frame" "^7.8.3" 144 | "@babel/generator" "^7.9.5" 145 | "@babel/helper-function-name" "^7.9.5" 146 | "@babel/helper-split-export-declaration" "^7.8.3" 147 | "@babel/parser" "^7.9.0" 148 | "@babel/types" "^7.9.5" 149 | debug "^4.1.0" 150 | globals "^11.1.0" 151 | lodash "^4.17.13" 152 | 153 | "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5": 154 | version "7.9.5" 155 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.5.tgz#89231f82915a8a566a703b3b20133f73da6b9444" 156 | dependencies: 157 | "@babel/helper-validator-identifier" "^7.9.5" 158 | lodash "^4.17.13" 159 | to-fast-properties "^2.0.0" 160 | 161 | "@dsherret/to-absolute-glob@^2.0.2": 162 | version "2.0.2" 163 | resolved "https://registry.yarnpkg.com/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1f6475dc8bd974cea07a2daf3864b317b1dd332c" 164 | dependencies: 165 | is-absolute "^1.0.0" 166 | is-negated-glob "^1.0.0" 167 | 168 | "@istanbuljs/load-nyc-config@^1.0.0": 169 | version "1.0.0" 170 | resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" 171 | dependencies: 172 | camelcase "^5.3.1" 173 | find-up "^4.1.0" 174 | js-yaml "^3.13.1" 175 | resolve-from "^5.0.0" 176 | 177 | "@istanbuljs/schema@^0.1.2": 178 | version "0.1.2" 179 | resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" 180 | 181 | "@nodelib/fs.scandir@2.1.3": 182 | version "2.1.3" 183 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" 184 | dependencies: 185 | "@nodelib/fs.stat" "2.0.3" 186 | run-parallel "^1.1.9" 187 | 188 | "@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": 189 | version "2.0.3" 190 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" 191 | 192 | "@nodelib/fs.walk@^1.2.3": 193 | version "1.2.4" 194 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" 195 | dependencies: 196 | "@nodelib/fs.scandir" "2.1.3" 197 | fastq "^1.6.0" 198 | 199 | "@ts-morph/common@~0.5.1": 200 | version "0.5.1" 201 | resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.5.1.tgz#c85037c9ed420755a68fce613348a94d8ef81a3d" 202 | integrity sha512-0qasHorGK8VfUK20oECpIfmu/B6cwGSNTj2HoNsIKeDE1kB/uCk5jWFHkgBuoZu/3i3ysLOwO9QsFJaRAH65UA== 203 | dependencies: 204 | "@dsherret/to-absolute-glob" "^2.0.2" 205 | fast-glob "^3.2.2" 206 | fs-extra "^9.0.0" 207 | is-negated-glob "^1.0.0" 208 | multimatch "^4.0.0" 209 | typescript "~3.9.2" 210 | 211 | "@types/chai@^4.2.11": 212 | version "4.2.11" 213 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.11.tgz#d3614d6c5f500142358e6ed24e1bf16657536c50" 214 | 215 | "@types/chokidar@^2.1.3": 216 | version "2.1.3" 217 | resolved "https://registry.yarnpkg.com/@types/chokidar/-/chokidar-2.1.3.tgz#123ab795dba6d89be04bf076e6aecaf8620db674" 218 | dependencies: 219 | chokidar "*" 220 | 221 | "@types/color-name@^1.1.1": 222 | version "1.1.1" 223 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" 224 | 225 | "@types/minimatch@^3.0.3": 226 | version "3.0.3" 227 | resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" 228 | 229 | "@types/minimist@^1.2.0": 230 | version "1.2.0" 231 | resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" 232 | 233 | "@types/mocha@^8.0.0": 234 | version "8.0.0" 235 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.0.0.tgz#b0ba1c5b4cb3880c51a6b488ad007a657d1be888" 236 | integrity sha512-jWeYcTo3sCH/rMgsdYXDTO85GNRyTCII5dayMIu/ZO4zbEot1E3iNGaOwpLReLUHjeNQFkgeNNVYlY4dX6azQQ== 237 | 238 | "@types/node@^14.0.23": 239 | version "14.0.23" 240 | resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806" 241 | integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw== 242 | 243 | aggregate-error@^3.0.0: 244 | version "3.0.1" 245 | resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" 246 | dependencies: 247 | clean-stack "^2.0.0" 248 | indent-string "^4.0.0" 249 | 250 | ansi-colors@4.1.1: 251 | version "4.1.1" 252 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 253 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 254 | 255 | ansi-regex@^3.0.0: 256 | version "3.0.0" 257 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 258 | 259 | ansi-regex@^4.1.0: 260 | version "4.1.0" 261 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 262 | 263 | ansi-regex@^5.0.0: 264 | version "5.0.0" 265 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" 266 | 267 | ansi-styles@^3.2.0, ansi-styles@^3.2.1: 268 | version "3.2.1" 269 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 270 | dependencies: 271 | color-convert "^1.9.0" 272 | 273 | ansi-styles@^4.0.0: 274 | version "4.2.1" 275 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" 276 | dependencies: 277 | "@types/color-name" "^1.1.1" 278 | color-convert "^2.0.1" 279 | 280 | anymatch@~3.1.1: 281 | version "3.1.1" 282 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" 283 | dependencies: 284 | normalize-path "^3.0.0" 285 | picomatch "^2.0.4" 286 | 287 | append-transform@^2.0.0: 288 | version "2.0.0" 289 | resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" 290 | dependencies: 291 | default-require-extensions "^3.0.0" 292 | 293 | archy@^1.0.0: 294 | version "1.0.0" 295 | resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" 296 | 297 | argparse@^1.0.7: 298 | version "1.0.10" 299 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 300 | dependencies: 301 | sprintf-js "~1.0.2" 302 | 303 | array-differ@^3.0.0: 304 | version "3.0.0" 305 | resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" 306 | 307 | array-union@^2.1.0: 308 | version "2.1.0" 309 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 310 | 311 | array.prototype.map@^1.0.1: 312 | version "1.0.2" 313 | resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.2.tgz#9a4159f416458a23e9483078de1106b2ef68f8ec" 314 | integrity sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw== 315 | dependencies: 316 | define-properties "^1.1.3" 317 | es-abstract "^1.17.0-next.1" 318 | es-array-method-boxes-properly "^1.0.0" 319 | is-string "^1.0.4" 320 | 321 | arrify@^2.0.1: 322 | version "2.0.1" 323 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" 324 | 325 | assertion-error@^1.1.0: 326 | version "1.1.0" 327 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 328 | 329 | at-least-node@^1.0.0: 330 | version "1.0.0" 331 | resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" 332 | integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== 333 | 334 | balanced-match@^1.0.0: 335 | version "1.0.0" 336 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 337 | 338 | binary-extensions@^2.0.0: 339 | version "2.0.0" 340 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" 341 | 342 | brace-expansion@^1.1.7: 343 | version "1.1.11" 344 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 345 | dependencies: 346 | balanced-match "^1.0.0" 347 | concat-map "0.0.1" 348 | 349 | braces@^3.0.1, braces@~3.0.2: 350 | version "3.0.2" 351 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 352 | dependencies: 353 | fill-range "^7.0.1" 354 | 355 | browser-stdout@1.3.1: 356 | version "1.3.1" 357 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 358 | 359 | caching-transform@^4.0.0: 360 | version "4.0.0" 361 | resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" 362 | dependencies: 363 | hasha "^5.0.0" 364 | make-dir "^3.0.0" 365 | package-hash "^4.0.0" 366 | write-file-atomic "^3.0.0" 367 | 368 | camelcase@^5.0.0, camelcase@^5.3.1: 369 | version "5.3.1" 370 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 371 | 372 | chai@^4.2.0: 373 | version "4.2.0" 374 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" 375 | dependencies: 376 | assertion-error "^1.1.0" 377 | check-error "^1.0.2" 378 | deep-eql "^3.0.1" 379 | get-func-name "^2.0.0" 380 | pathval "^1.1.0" 381 | type-detect "^4.0.5" 382 | 383 | chalk@^2.0.0, chalk@^2.4.2: 384 | version "2.4.2" 385 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 386 | dependencies: 387 | ansi-styles "^3.2.1" 388 | escape-string-regexp "^1.0.5" 389 | supports-color "^5.3.0" 390 | 391 | check-error@^1.0.2: 392 | version "1.0.2" 393 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 394 | 395 | chokidar@*, chokidar@3.3.1: 396 | version "3.3.1" 397 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" 398 | dependencies: 399 | anymatch "~3.1.1" 400 | braces "~3.0.2" 401 | glob-parent "~5.1.0" 402 | is-binary-path "~2.1.0" 403 | is-glob "~4.0.1" 404 | normalize-path "~3.0.0" 405 | readdirp "~3.3.0" 406 | optionalDependencies: 407 | fsevents "~2.1.2" 408 | 409 | chokidar@^3.4.1: 410 | version "3.4.1" 411 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1" 412 | integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g== 413 | dependencies: 414 | anymatch "~3.1.1" 415 | braces "~3.0.2" 416 | glob-parent "~5.1.0" 417 | is-binary-path "~2.1.0" 418 | is-glob "~4.0.1" 419 | normalize-path "~3.0.0" 420 | readdirp "~3.4.0" 421 | optionalDependencies: 422 | fsevents "~2.1.2" 423 | 424 | clean-stack@^2.0.0: 425 | version "2.2.0" 426 | resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" 427 | 428 | cliui@^5.0.0: 429 | version "5.0.0" 430 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 431 | dependencies: 432 | string-width "^3.1.0" 433 | strip-ansi "^5.2.0" 434 | wrap-ansi "^5.1.0" 435 | 436 | cliui@^6.0.0: 437 | version "6.0.0" 438 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" 439 | dependencies: 440 | string-width "^4.2.0" 441 | strip-ansi "^6.0.0" 442 | wrap-ansi "^6.2.0" 443 | 444 | code-block-writer@^10.1.0: 445 | version "10.1.0" 446 | resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-10.1.0.tgz#54fc410ebef2af836d9c2314ac40af7d7b37eee9" 447 | 448 | color-convert@^1.9.0: 449 | version "1.9.3" 450 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 451 | dependencies: 452 | color-name "1.1.3" 453 | 454 | color-convert@^2.0.1: 455 | version "2.0.1" 456 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 457 | dependencies: 458 | color-name "~1.1.4" 459 | 460 | color-name@1.1.3: 461 | version "1.1.3" 462 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 463 | 464 | color-name@~1.1.4: 465 | version "1.1.4" 466 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 467 | 468 | commondir@^1.0.1: 469 | version "1.0.1" 470 | resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 471 | 472 | concat-map@0.0.1: 473 | version "0.0.1" 474 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 475 | 476 | convert-source-map@^1.7.0: 477 | version "1.7.0" 478 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" 479 | dependencies: 480 | safe-buffer "~5.1.1" 481 | 482 | cross-spawn@^7.0.0: 483 | version "7.0.2" 484 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.2.tgz#d0d7dcfa74e89115c7619f4f721a94e1fdb716d6" 485 | dependencies: 486 | path-key "^3.1.0" 487 | shebang-command "^2.0.0" 488 | which "^2.0.1" 489 | 490 | debug@3.2.6: 491 | version "3.2.6" 492 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 493 | dependencies: 494 | ms "^2.1.1" 495 | 496 | debug@^4.1.0, debug@^4.1.1: 497 | version "4.1.1" 498 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 499 | dependencies: 500 | ms "^2.1.1" 501 | 502 | decamelize@^1.2.0: 503 | version "1.2.0" 504 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 505 | 506 | deep-eql@^3.0.1: 507 | version "3.0.1" 508 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 509 | dependencies: 510 | type-detect "^4.0.0" 511 | 512 | default-require-extensions@^3.0.0: 513 | version "3.0.0" 514 | resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" 515 | dependencies: 516 | strip-bom "^4.0.0" 517 | 518 | define-properties@^1.1.2, define-properties@^1.1.3: 519 | version "1.1.3" 520 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" 521 | dependencies: 522 | object-keys "^1.0.12" 523 | 524 | diff@4.0.2: 525 | version "4.0.2" 526 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 527 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 528 | 529 | emoji-regex@^7.0.1: 530 | version "7.0.3" 531 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 532 | 533 | emoji-regex@^8.0.0: 534 | version "8.0.0" 535 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 536 | 537 | es-abstract@^1.17.0-next.1, es-abstract@^1.17.5: 538 | version "1.17.5" 539 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" 540 | dependencies: 541 | es-to-primitive "^1.2.1" 542 | function-bind "^1.1.1" 543 | has "^1.0.3" 544 | has-symbols "^1.0.1" 545 | is-callable "^1.1.5" 546 | is-regex "^1.0.5" 547 | object-inspect "^1.7.0" 548 | object-keys "^1.1.1" 549 | object.assign "^4.1.0" 550 | string.prototype.trimleft "^2.1.1" 551 | string.prototype.trimright "^2.1.1" 552 | 553 | es-abstract@^1.17.4: 554 | version "1.17.6" 555 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a" 556 | integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw== 557 | dependencies: 558 | es-to-primitive "^1.2.1" 559 | function-bind "^1.1.1" 560 | has "^1.0.3" 561 | has-symbols "^1.0.1" 562 | is-callable "^1.2.0" 563 | is-regex "^1.1.0" 564 | object-inspect "^1.7.0" 565 | object-keys "^1.1.1" 566 | object.assign "^4.1.0" 567 | string.prototype.trimend "^1.0.1" 568 | string.prototype.trimstart "^1.0.1" 569 | 570 | es-array-method-boxes-properly@^1.0.0: 571 | version "1.0.0" 572 | resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" 573 | integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== 574 | 575 | es-get-iterator@^1.0.2: 576 | version "1.1.0" 577 | resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" 578 | integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== 579 | dependencies: 580 | es-abstract "^1.17.4" 581 | has-symbols "^1.0.1" 582 | is-arguments "^1.0.4" 583 | is-map "^2.0.1" 584 | is-set "^2.0.1" 585 | is-string "^1.0.5" 586 | isarray "^2.0.5" 587 | 588 | es-to-primitive@^1.2.1: 589 | version "1.2.1" 590 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" 591 | dependencies: 592 | is-callable "^1.1.4" 593 | is-date-object "^1.0.1" 594 | is-symbol "^1.0.2" 595 | 596 | es6-error@^4.0.1: 597 | version "4.1.1" 598 | resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" 599 | 600 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 601 | version "1.0.5" 602 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 603 | 604 | esprima@^4.0.0: 605 | version "4.0.1" 606 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 607 | 608 | fast-glob@^3.2.2: 609 | version "3.2.2" 610 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d" 611 | dependencies: 612 | "@nodelib/fs.stat" "^2.0.2" 613 | "@nodelib/fs.walk" "^1.2.3" 614 | glob-parent "^5.1.0" 615 | merge2 "^1.3.0" 616 | micromatch "^4.0.2" 617 | picomatch "^2.2.1" 618 | 619 | fastq@^1.6.0: 620 | version "1.7.0" 621 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.7.0.tgz#fcd79a08c5bd7ec5b55cd3f5c4720db551929801" 622 | dependencies: 623 | reusify "^1.0.4" 624 | 625 | fill-range@^7.0.1: 626 | version "7.0.1" 627 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 628 | dependencies: 629 | to-regex-range "^5.0.1" 630 | 631 | find-cache-dir@^3.2.0: 632 | version "3.3.1" 633 | resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" 634 | dependencies: 635 | commondir "^1.0.1" 636 | make-dir "^3.0.2" 637 | pkg-dir "^4.1.0" 638 | 639 | find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0: 640 | version "4.1.0" 641 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 642 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 643 | dependencies: 644 | locate-path "^5.0.0" 645 | path-exists "^4.0.0" 646 | 647 | find-up@^3.0.0: 648 | version "3.0.0" 649 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" 650 | dependencies: 651 | locate-path "^3.0.0" 652 | 653 | flat@^4.1.0: 654 | version "4.1.0" 655 | resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2" 656 | dependencies: 657 | is-buffer "~2.0.3" 658 | 659 | foreground-child@^2.0.0: 660 | version "2.0.0" 661 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" 662 | dependencies: 663 | cross-spawn "^7.0.0" 664 | signal-exit "^3.0.2" 665 | 666 | fromentries@^1.2.0: 667 | version "1.2.0" 668 | resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.2.0.tgz#e6aa06f240d6267f913cea422075ef88b63e7897" 669 | 670 | fs-extra@^9.0.0: 671 | version "9.0.1" 672 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.1.tgz#910da0062437ba4c39fedd863f1675ccfefcb9fc" 673 | integrity sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ== 674 | dependencies: 675 | at-least-node "^1.0.0" 676 | graceful-fs "^4.2.0" 677 | jsonfile "^6.0.1" 678 | universalify "^1.0.0" 679 | 680 | fs.realpath@^1.0.0: 681 | version "1.0.0" 682 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 683 | 684 | fsevents@~2.1.2: 685 | version "2.1.2" 686 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" 687 | 688 | function-bind@^1.1.1: 689 | version "1.1.1" 690 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 691 | 692 | gensync@^1.0.0-beta.1: 693 | version "1.0.0-beta.1" 694 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" 695 | 696 | get-caller-file@^2.0.1: 697 | version "2.0.5" 698 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 699 | 700 | get-func-name@^2.0.0: 701 | version "2.0.0" 702 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 703 | 704 | get-package-type@^0.1.0: 705 | version "0.1.0" 706 | resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" 707 | integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== 708 | 709 | glob-parent@^5.1.0, glob-parent@~5.1.0: 710 | version "5.1.1" 711 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" 712 | dependencies: 713 | is-glob "^4.0.1" 714 | 715 | glob@7.1.6, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: 716 | version "7.1.6" 717 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" 718 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 719 | dependencies: 720 | fs.realpath "^1.0.0" 721 | inflight "^1.0.4" 722 | inherits "2" 723 | minimatch "^3.0.4" 724 | once "^1.3.0" 725 | path-is-absolute "^1.0.0" 726 | 727 | globals@^11.1.0: 728 | version "11.12.0" 729 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 730 | 731 | graceful-fs@^4.1.15, graceful-fs@^4.1.6, graceful-fs@^4.2.0: 732 | version "4.2.3" 733 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" 734 | 735 | growl@1.10.5: 736 | version "1.10.5" 737 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 738 | 739 | has-flag@^3.0.0: 740 | version "3.0.0" 741 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 742 | 743 | has-flag@^4.0.0: 744 | version "4.0.0" 745 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 746 | 747 | has-symbols@^1.0.0, has-symbols@^1.0.1: 748 | version "1.0.1" 749 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" 750 | 751 | has@^1.0.3: 752 | version "1.0.3" 753 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 754 | dependencies: 755 | function-bind "^1.1.1" 756 | 757 | hasha@^5.0.0: 758 | version "5.2.0" 759 | resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.0.tgz#33094d1f69c40a4a6ac7be53d5fe3ff95a269e0c" 760 | dependencies: 761 | is-stream "^2.0.0" 762 | type-fest "^0.8.0" 763 | 764 | he@1.2.0: 765 | version "1.2.0" 766 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 767 | 768 | html-escaper@^2.0.0: 769 | version "2.0.2" 770 | resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" 771 | 772 | imurmurhash@^0.1.4: 773 | version "0.1.4" 774 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 775 | 776 | indent-string@^4.0.0: 777 | version "4.0.0" 778 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" 779 | 780 | inflight@^1.0.4: 781 | version "1.0.6" 782 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 783 | dependencies: 784 | once "^1.3.0" 785 | wrappy "1" 786 | 787 | inherits@2: 788 | version "2.0.4" 789 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 790 | 791 | is-absolute@^1.0.0: 792 | version "1.0.0" 793 | resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" 794 | dependencies: 795 | is-relative "^1.0.0" 796 | is-windows "^1.0.1" 797 | 798 | is-arguments@^1.0.4: 799 | version "1.0.4" 800 | resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" 801 | integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== 802 | 803 | is-binary-path@~2.1.0: 804 | version "2.1.0" 805 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 806 | dependencies: 807 | binary-extensions "^2.0.0" 808 | 809 | is-buffer@~2.0.3: 810 | version "2.0.4" 811 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" 812 | 813 | is-callable@^1.1.4, is-callable@^1.1.5: 814 | version "1.1.5" 815 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" 816 | 817 | is-callable@^1.2.0: 818 | version "1.2.0" 819 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" 820 | integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw== 821 | 822 | is-date-object@^1.0.1: 823 | version "1.0.2" 824 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 825 | 826 | is-extglob@^2.1.1: 827 | version "2.1.1" 828 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 829 | 830 | is-fullwidth-code-point@^2.0.0: 831 | version "2.0.0" 832 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 833 | 834 | is-fullwidth-code-point@^3.0.0: 835 | version "3.0.0" 836 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 837 | 838 | is-glob@^4.0.1, is-glob@~4.0.1: 839 | version "4.0.1" 840 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" 841 | dependencies: 842 | is-extglob "^2.1.1" 843 | 844 | is-map@^2.0.1: 845 | version "2.0.1" 846 | resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" 847 | integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== 848 | 849 | is-negated-glob@^1.0.0: 850 | version "1.0.0" 851 | resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" 852 | 853 | is-number@^7.0.0: 854 | version "7.0.0" 855 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 856 | 857 | is-regex@^1.0.5: 858 | version "1.0.5" 859 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" 860 | dependencies: 861 | has "^1.0.3" 862 | 863 | is-regex@^1.1.0: 864 | version "1.1.0" 865 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff" 866 | integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw== 867 | dependencies: 868 | has-symbols "^1.0.1" 869 | 870 | is-relative@^1.0.0: 871 | version "1.0.0" 872 | resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" 873 | dependencies: 874 | is-unc-path "^1.0.0" 875 | 876 | is-set@^2.0.1: 877 | version "2.0.1" 878 | resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" 879 | integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== 880 | 881 | is-stream@^2.0.0: 882 | version "2.0.0" 883 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" 884 | 885 | is-string@^1.0.4, is-string@^1.0.5: 886 | version "1.0.5" 887 | resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" 888 | integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== 889 | 890 | is-symbol@^1.0.2: 891 | version "1.0.3" 892 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" 893 | dependencies: 894 | has-symbols "^1.0.1" 895 | 896 | is-typedarray@^1.0.0: 897 | version "1.0.0" 898 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 899 | 900 | is-unc-path@^1.0.0: 901 | version "1.0.0" 902 | resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" 903 | dependencies: 904 | unc-path-regex "^0.1.2" 905 | 906 | is-windows@^1.0.1, is-windows@^1.0.2: 907 | version "1.0.2" 908 | resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" 909 | 910 | isarray@^2.0.5: 911 | version "2.0.5" 912 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" 913 | integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== 914 | 915 | isexe@^2.0.0: 916 | version "2.0.0" 917 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 918 | 919 | istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.0.0-alpha.1: 920 | version "3.0.0" 921 | resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" 922 | 923 | istanbul-lib-hook@^3.0.0: 924 | version "3.0.0" 925 | resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" 926 | dependencies: 927 | append-transform "^2.0.0" 928 | 929 | istanbul-lib-instrument@^4.0.0: 930 | version "4.0.1" 931 | resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.1.tgz#61f13ac2c96cfefb076fe7131156cc05907874e6" 932 | dependencies: 933 | "@babel/core" "^7.7.5" 934 | "@babel/parser" "^7.7.5" 935 | "@babel/template" "^7.7.4" 936 | "@babel/traverse" "^7.7.4" 937 | "@istanbuljs/schema" "^0.1.2" 938 | istanbul-lib-coverage "^3.0.0" 939 | semver "^6.3.0" 940 | 941 | istanbul-lib-processinfo@^2.0.2: 942 | version "2.0.2" 943 | resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.2.tgz#e1426514662244b2f25df728e8fd1ba35fe53b9c" 944 | dependencies: 945 | archy "^1.0.0" 946 | cross-spawn "^7.0.0" 947 | istanbul-lib-coverage "^3.0.0-alpha.1" 948 | make-dir "^3.0.0" 949 | p-map "^3.0.0" 950 | rimraf "^3.0.0" 951 | uuid "^3.3.3" 952 | 953 | istanbul-lib-report@^3.0.0: 954 | version "3.0.0" 955 | resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" 956 | dependencies: 957 | istanbul-lib-coverage "^3.0.0" 958 | make-dir "^3.0.0" 959 | supports-color "^7.1.0" 960 | 961 | istanbul-lib-source-maps@^4.0.0: 962 | version "4.0.0" 963 | resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" 964 | dependencies: 965 | debug "^4.1.1" 966 | istanbul-lib-coverage "^3.0.0" 967 | source-map "^0.6.1" 968 | 969 | istanbul-reports@^3.0.2: 970 | version "3.0.2" 971 | resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b" 972 | dependencies: 973 | html-escaper "^2.0.0" 974 | istanbul-lib-report "^3.0.0" 975 | 976 | iterate-iterator@^1.0.1: 977 | version "1.0.1" 978 | resolved "https://registry.yarnpkg.com/iterate-iterator/-/iterate-iterator-1.0.1.tgz#1693a768c1ddd79c969051459453f082fe82e9f6" 979 | integrity sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw== 980 | 981 | iterate-value@^1.0.0: 982 | version "1.0.2" 983 | resolved "https://registry.yarnpkg.com/iterate-value/-/iterate-value-1.0.2.tgz#935115bd37d006a52046535ebc8d07e9c9337f57" 984 | integrity sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ== 985 | dependencies: 986 | es-get-iterator "^1.0.2" 987 | iterate-iterator "^1.0.1" 988 | 989 | js-tokens@^4.0.0: 990 | version "4.0.0" 991 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 992 | 993 | js-yaml@3.13.1, js-yaml@^3.13.1: 994 | version "3.13.1" 995 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 996 | dependencies: 997 | argparse "^1.0.7" 998 | esprima "^4.0.0" 999 | 1000 | jsesc@^2.5.1: 1001 | version "2.5.2" 1002 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" 1003 | 1004 | json5@^2.1.2: 1005 | version "2.1.3" 1006 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" 1007 | dependencies: 1008 | minimist "^1.2.5" 1009 | 1010 | jsonfile@^6.0.1: 1011 | version "6.0.1" 1012 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" 1013 | integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== 1014 | dependencies: 1015 | universalify "^1.0.0" 1016 | optionalDependencies: 1017 | graceful-fs "^4.1.6" 1018 | 1019 | locate-path@^3.0.0: 1020 | version "3.0.0" 1021 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" 1022 | dependencies: 1023 | p-locate "^3.0.0" 1024 | path-exists "^3.0.0" 1025 | 1026 | locate-path@^5.0.0: 1027 | version "5.0.0" 1028 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 1029 | dependencies: 1030 | p-locate "^4.1.0" 1031 | 1032 | lodash.flattendeep@^4.4.0: 1033 | version "4.4.0" 1034 | resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" 1035 | 1036 | lodash@^4.17.13, lodash@^4.17.15: 1037 | version "4.17.15" 1038 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 1039 | 1040 | log-symbols@3.0.0: 1041 | version "3.0.0" 1042 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" 1043 | dependencies: 1044 | chalk "^2.4.2" 1045 | 1046 | make-dir@^3.0.0, make-dir@^3.0.2: 1047 | version "3.0.2" 1048 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" 1049 | dependencies: 1050 | semver "^6.0.0" 1051 | 1052 | merge2@^1.3.0: 1053 | version "1.3.0" 1054 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" 1055 | 1056 | micromatch@^4.0.2: 1057 | version "4.0.2" 1058 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" 1059 | dependencies: 1060 | braces "^3.0.1" 1061 | picomatch "^2.0.5" 1062 | 1063 | minimatch@3.0.4, minimatch@^3.0.4: 1064 | version "3.0.4" 1065 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1066 | dependencies: 1067 | brace-expansion "^1.1.7" 1068 | 1069 | minimist@^1.2.5: 1070 | version "1.2.5" 1071 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 1072 | 1073 | mocha@^8.0.1: 1074 | version "8.0.1" 1075 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-8.0.1.tgz#fe01f0530362df271aa8f99510447bc38b88d8ed" 1076 | integrity sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg== 1077 | dependencies: 1078 | ansi-colors "4.1.1" 1079 | browser-stdout "1.3.1" 1080 | chokidar "3.3.1" 1081 | debug "3.2.6" 1082 | diff "4.0.2" 1083 | escape-string-regexp "1.0.5" 1084 | find-up "4.1.0" 1085 | glob "7.1.6" 1086 | growl "1.10.5" 1087 | he "1.2.0" 1088 | js-yaml "3.13.1" 1089 | log-symbols "3.0.0" 1090 | minimatch "3.0.4" 1091 | ms "2.1.2" 1092 | object.assign "4.1.0" 1093 | promise.allsettled "1.0.2" 1094 | serialize-javascript "3.0.0" 1095 | strip-json-comments "3.0.1" 1096 | supports-color "7.1.0" 1097 | which "2.0.2" 1098 | wide-align "1.1.3" 1099 | workerpool "6.0.0" 1100 | yargs "13.3.2" 1101 | yargs-parser "13.1.2" 1102 | yargs-unparser "1.6.0" 1103 | 1104 | ms@2.1.2, ms@^2.1.1: 1105 | version "2.1.2" 1106 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1107 | 1108 | multimatch@^4.0.0: 1109 | version "4.0.0" 1110 | resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3" 1111 | dependencies: 1112 | "@types/minimatch" "^3.0.3" 1113 | array-differ "^3.0.0" 1114 | array-union "^2.1.0" 1115 | arrify "^2.0.1" 1116 | minimatch "^3.0.4" 1117 | 1118 | node-preload@^0.2.1: 1119 | version "0.2.1" 1120 | resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" 1121 | dependencies: 1122 | process-on-spawn "^1.0.0" 1123 | 1124 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1125 | version "3.0.0" 1126 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1127 | 1128 | nyc@^15.1.0: 1129 | version "15.1.0" 1130 | resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" 1131 | integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== 1132 | dependencies: 1133 | "@istanbuljs/load-nyc-config" "^1.0.0" 1134 | "@istanbuljs/schema" "^0.1.2" 1135 | caching-transform "^4.0.0" 1136 | convert-source-map "^1.7.0" 1137 | decamelize "^1.2.0" 1138 | find-cache-dir "^3.2.0" 1139 | find-up "^4.1.0" 1140 | foreground-child "^2.0.0" 1141 | get-package-type "^0.1.0" 1142 | glob "^7.1.6" 1143 | istanbul-lib-coverage "^3.0.0" 1144 | istanbul-lib-hook "^3.0.0" 1145 | istanbul-lib-instrument "^4.0.0" 1146 | istanbul-lib-processinfo "^2.0.2" 1147 | istanbul-lib-report "^3.0.0" 1148 | istanbul-lib-source-maps "^4.0.0" 1149 | istanbul-reports "^3.0.2" 1150 | make-dir "^3.0.0" 1151 | node-preload "^0.2.1" 1152 | p-map "^3.0.0" 1153 | process-on-spawn "^1.0.0" 1154 | resolve-from "^5.0.0" 1155 | rimraf "^3.0.0" 1156 | signal-exit "^3.0.2" 1157 | spawn-wrap "^2.0.0" 1158 | test-exclude "^6.0.0" 1159 | yargs "^15.0.2" 1160 | 1161 | object-inspect@^1.7.0: 1162 | version "1.7.0" 1163 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" 1164 | 1165 | object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: 1166 | version "1.1.1" 1167 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1168 | 1169 | object.assign@4.1.0, object.assign@^4.1.0: 1170 | version "4.1.0" 1171 | resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" 1172 | dependencies: 1173 | define-properties "^1.1.2" 1174 | function-bind "^1.1.1" 1175 | has-symbols "^1.0.0" 1176 | object-keys "^1.0.11" 1177 | 1178 | once@^1.3.0: 1179 | version "1.4.0" 1180 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1181 | dependencies: 1182 | wrappy "1" 1183 | 1184 | p-limit@^2.0.0, p-limit@^2.2.0: 1185 | version "2.3.0" 1186 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 1187 | dependencies: 1188 | p-try "^2.0.0" 1189 | 1190 | p-locate@^3.0.0: 1191 | version "3.0.0" 1192 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" 1193 | dependencies: 1194 | p-limit "^2.0.0" 1195 | 1196 | p-locate@^4.1.0: 1197 | version "4.1.0" 1198 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 1199 | dependencies: 1200 | p-limit "^2.2.0" 1201 | 1202 | p-map@^3.0.0: 1203 | version "3.0.0" 1204 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" 1205 | dependencies: 1206 | aggregate-error "^3.0.0" 1207 | 1208 | p-try@^2.0.0: 1209 | version "2.2.0" 1210 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 1211 | 1212 | package-hash@^4.0.0: 1213 | version "4.0.0" 1214 | resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" 1215 | dependencies: 1216 | graceful-fs "^4.1.15" 1217 | hasha "^5.0.0" 1218 | lodash.flattendeep "^4.4.0" 1219 | release-zalgo "^1.0.0" 1220 | 1221 | path-exists@^3.0.0: 1222 | version "3.0.0" 1223 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1224 | 1225 | path-exists@^4.0.0: 1226 | version "4.0.0" 1227 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1228 | 1229 | path-is-absolute@^1.0.0: 1230 | version "1.0.1" 1231 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1232 | 1233 | path-key@^3.1.0: 1234 | version "3.1.1" 1235 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1236 | 1237 | path-parse@^1.0.6: 1238 | version "1.0.6" 1239 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 1240 | 1241 | pathval@^1.1.0: 1242 | version "1.1.0" 1243 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" 1244 | 1245 | picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7, picomatch@^2.2.1: 1246 | version "2.2.2" 1247 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" 1248 | 1249 | pkg-dir@^4.1.0: 1250 | version "4.2.0" 1251 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 1252 | dependencies: 1253 | find-up "^4.0.0" 1254 | 1255 | process-on-spawn@^1.0.0: 1256 | version "1.0.0" 1257 | resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" 1258 | dependencies: 1259 | fromentries "^1.2.0" 1260 | 1261 | promise.allsettled@1.0.2: 1262 | version "1.0.2" 1263 | resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.2.tgz#d66f78fbb600e83e863d893e98b3d4376a9c47c9" 1264 | integrity sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg== 1265 | dependencies: 1266 | array.prototype.map "^1.0.1" 1267 | define-properties "^1.1.3" 1268 | es-abstract "^1.17.0-next.1" 1269 | function-bind "^1.1.1" 1270 | iterate-value "^1.0.0" 1271 | 1272 | readdirp@~3.3.0: 1273 | version "3.3.0" 1274 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" 1275 | dependencies: 1276 | picomatch "^2.0.7" 1277 | 1278 | readdirp@~3.4.0: 1279 | version "3.4.0" 1280 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" 1281 | integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== 1282 | dependencies: 1283 | picomatch "^2.2.1" 1284 | 1285 | release-zalgo@^1.0.0: 1286 | version "1.0.0" 1287 | resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" 1288 | dependencies: 1289 | es6-error "^4.0.1" 1290 | 1291 | require-directory@^2.1.1: 1292 | version "2.1.1" 1293 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1294 | 1295 | require-main-filename@^2.0.0: 1296 | version "2.0.0" 1297 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" 1298 | 1299 | resolve-from@^5.0.0: 1300 | version "5.0.0" 1301 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 1302 | 1303 | resolve@^1.3.2: 1304 | version "1.16.0" 1305 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.16.0.tgz#063dc704fa3413e13ac1d0d1756a7cbfe95dd1a7" 1306 | dependencies: 1307 | path-parse "^1.0.6" 1308 | 1309 | reusify@^1.0.4: 1310 | version "1.0.4" 1311 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1312 | 1313 | rimraf@^3.0.0, rimraf@^3.0.2: 1314 | version "3.0.2" 1315 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1316 | dependencies: 1317 | glob "^7.1.3" 1318 | 1319 | run-parallel@^1.1.9: 1320 | version "1.1.9" 1321 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" 1322 | 1323 | safe-buffer@~5.1.1: 1324 | version "5.1.2" 1325 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1326 | 1327 | semver@^5.4.1: 1328 | version "5.7.1" 1329 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" 1330 | 1331 | semver@^6.0.0, semver@^6.3.0: 1332 | version "6.3.0" 1333 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" 1334 | 1335 | serialize-javascript@3.0.0: 1336 | version "3.0.0" 1337 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.0.0.tgz#492e489a2d77b7b804ad391a5f5d97870952548e" 1338 | integrity sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw== 1339 | 1340 | set-blocking@^2.0.0: 1341 | version "2.0.0" 1342 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1343 | 1344 | shebang-command@^2.0.0: 1345 | version "2.0.0" 1346 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1347 | dependencies: 1348 | shebang-regex "^3.0.0" 1349 | 1350 | shebang-regex@^3.0.0: 1351 | version "3.0.0" 1352 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1353 | 1354 | signal-exit@^3.0.2: 1355 | version "3.0.3" 1356 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" 1357 | 1358 | source-map@^0.5.0: 1359 | version "0.5.7" 1360 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1361 | 1362 | source-map@^0.6.1: 1363 | version "0.6.1" 1364 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1365 | 1366 | spawn-wrap@^2.0.0: 1367 | version "2.0.0" 1368 | resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" 1369 | dependencies: 1370 | foreground-child "^2.0.0" 1371 | is-windows "^1.0.2" 1372 | make-dir "^3.0.0" 1373 | rimraf "^3.0.0" 1374 | signal-exit "^3.0.2" 1375 | which "^2.0.1" 1376 | 1377 | sprintf-js@~1.0.2: 1378 | version "1.0.3" 1379 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1380 | 1381 | "string-width@^1.0.2 || 2": 1382 | version "2.1.1" 1383 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1384 | dependencies: 1385 | is-fullwidth-code-point "^2.0.0" 1386 | strip-ansi "^4.0.0" 1387 | 1388 | string-width@^3.0.0, string-width@^3.1.0: 1389 | version "3.1.0" 1390 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" 1391 | dependencies: 1392 | emoji-regex "^7.0.1" 1393 | is-fullwidth-code-point "^2.0.0" 1394 | strip-ansi "^5.1.0" 1395 | 1396 | string-width@^4.1.0, string-width@^4.2.0: 1397 | version "4.2.0" 1398 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" 1399 | dependencies: 1400 | emoji-regex "^8.0.0" 1401 | is-fullwidth-code-point "^3.0.0" 1402 | strip-ansi "^6.0.0" 1403 | 1404 | string.prototype.trimend@^1.0.0, string.prototype.trimend@^1.0.1: 1405 | version "1.0.1" 1406 | resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" 1407 | dependencies: 1408 | define-properties "^1.1.3" 1409 | es-abstract "^1.17.5" 1410 | 1411 | string.prototype.trimleft@^2.1.1: 1412 | version "2.1.2" 1413 | resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc" 1414 | dependencies: 1415 | define-properties "^1.1.3" 1416 | es-abstract "^1.17.5" 1417 | string.prototype.trimstart "^1.0.0" 1418 | 1419 | string.prototype.trimright@^2.1.1: 1420 | version "2.1.2" 1421 | resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3" 1422 | dependencies: 1423 | define-properties "^1.1.3" 1424 | es-abstract "^1.17.5" 1425 | string.prototype.trimend "^1.0.0" 1426 | 1427 | string.prototype.trimstart@^1.0.0, string.prototype.trimstart@^1.0.1: 1428 | version "1.0.1" 1429 | resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" 1430 | dependencies: 1431 | define-properties "^1.1.3" 1432 | es-abstract "^1.17.5" 1433 | 1434 | strip-ansi@^4.0.0: 1435 | version "4.0.0" 1436 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1437 | dependencies: 1438 | ansi-regex "^3.0.0" 1439 | 1440 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: 1441 | version "5.2.0" 1442 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 1443 | dependencies: 1444 | ansi-regex "^4.1.0" 1445 | 1446 | strip-ansi@^6.0.0: 1447 | version "6.0.0" 1448 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" 1449 | dependencies: 1450 | ansi-regex "^5.0.0" 1451 | 1452 | strip-bom@^4.0.0: 1453 | version "4.0.0" 1454 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" 1455 | 1456 | strip-json-comments@3.0.1: 1457 | version "3.0.1" 1458 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" 1459 | integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== 1460 | 1461 | supports-color@7.1.0, supports-color@^7.1.0: 1462 | version "7.1.0" 1463 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1" 1464 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g== 1465 | dependencies: 1466 | has-flag "^4.0.0" 1467 | 1468 | supports-color@^5.3.0: 1469 | version "5.5.0" 1470 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 1471 | dependencies: 1472 | has-flag "^3.0.0" 1473 | 1474 | test-exclude@^6.0.0: 1475 | version "6.0.0" 1476 | resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" 1477 | dependencies: 1478 | "@istanbuljs/schema" "^0.1.2" 1479 | glob "^7.1.4" 1480 | minimatch "^3.0.4" 1481 | 1482 | to-fast-properties@^2.0.0: 1483 | version "2.0.0" 1484 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" 1485 | 1486 | to-regex-range@^5.0.1: 1487 | version "5.0.1" 1488 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1489 | dependencies: 1490 | is-number "^7.0.0" 1491 | 1492 | ts-morph@7.1.2: 1493 | version "7.1.2" 1494 | resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-7.1.2.tgz#7da8c3686b238f89988c3ee658bc5f3953ed8ec7" 1495 | integrity sha512-0ggF46muGv3v09Yf8Ce5ykTLiQ8I6hGvdB5ID/3+K4J11nCHo/vTaucqTvdFprJzQALpwQx+9bKi31mTxO0+tw== 1496 | dependencies: 1497 | "@dsherret/to-absolute-glob" "^2.0.2" 1498 | "@ts-morph/common" "~0.5.1" 1499 | code-block-writer "^10.1.0" 1500 | 1501 | type-detect@^4.0.0, type-detect@^4.0.5: 1502 | version "4.0.8" 1503 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1504 | 1505 | type-fest@^0.8.0: 1506 | version "0.8.1" 1507 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" 1508 | 1509 | typedarray-to-buffer@^3.1.5: 1510 | version "3.1.5" 1511 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" 1512 | dependencies: 1513 | is-typedarray "^1.0.0" 1514 | 1515 | typescript@^3.9.7, typescript@~3.9.2: 1516 | version "3.9.7" 1517 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" 1518 | integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== 1519 | 1520 | unc-path-regex@^0.1.2: 1521 | version "0.1.2" 1522 | resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" 1523 | 1524 | universalify@^1.0.0: 1525 | version "1.0.0" 1526 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" 1527 | integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== 1528 | 1529 | uuid@^3.3.3: 1530 | version "3.4.0" 1531 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 1532 | 1533 | which-module@^2.0.0: 1534 | version "2.0.0" 1535 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1536 | 1537 | which@2.0.2, which@^2.0.1: 1538 | version "2.0.2" 1539 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1540 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1541 | dependencies: 1542 | isexe "^2.0.0" 1543 | 1544 | wide-align@1.1.3: 1545 | version "1.1.3" 1546 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" 1547 | dependencies: 1548 | string-width "^1.0.2 || 2" 1549 | 1550 | workerpool@6.0.0: 1551 | version "6.0.0" 1552 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.0.0.tgz#85aad67fa1a2c8ef9386a1b43539900f61d03d58" 1553 | integrity sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA== 1554 | 1555 | wrap-ansi@^5.1.0: 1556 | version "5.1.0" 1557 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 1558 | dependencies: 1559 | ansi-styles "^3.2.0" 1560 | string-width "^3.0.0" 1561 | strip-ansi "^5.0.0" 1562 | 1563 | wrap-ansi@^6.2.0: 1564 | version "6.2.0" 1565 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" 1566 | dependencies: 1567 | ansi-styles "^4.0.0" 1568 | string-width "^4.1.0" 1569 | strip-ansi "^6.0.0" 1570 | 1571 | wrappy@1: 1572 | version "1.0.2" 1573 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1574 | 1575 | write-file-atomic@^3.0.0: 1576 | version "3.0.3" 1577 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" 1578 | dependencies: 1579 | imurmurhash "^0.1.4" 1580 | is-typedarray "^1.0.0" 1581 | signal-exit "^3.0.2" 1582 | typedarray-to-buffer "^3.1.5" 1583 | 1584 | y18n@^4.0.0: 1585 | version "4.0.0" 1586 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" 1587 | 1588 | yargs-parser@13.1.2, yargs-parser@^13.1.2: 1589 | version "13.1.2" 1590 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" 1591 | dependencies: 1592 | camelcase "^5.0.0" 1593 | decamelize "^1.2.0" 1594 | 1595 | yargs-parser@^18.1.1: 1596 | version "18.1.3" 1597 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" 1598 | dependencies: 1599 | camelcase "^5.0.0" 1600 | decamelize "^1.2.0" 1601 | 1602 | yargs-unparser@1.6.0: 1603 | version "1.6.0" 1604 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" 1605 | dependencies: 1606 | flat "^4.1.0" 1607 | lodash "^4.17.15" 1608 | yargs "^13.3.0" 1609 | 1610 | yargs@13.3.2, yargs@^13.3.0: 1611 | version "13.3.2" 1612 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" 1613 | dependencies: 1614 | cliui "^5.0.0" 1615 | find-up "^3.0.0" 1616 | get-caller-file "^2.0.1" 1617 | require-directory "^2.1.1" 1618 | require-main-filename "^2.0.0" 1619 | set-blocking "^2.0.0" 1620 | string-width "^3.0.0" 1621 | which-module "^2.0.0" 1622 | y18n "^4.0.0" 1623 | yargs-parser "^13.1.2" 1624 | 1625 | yargs@^15.0.2: 1626 | version "15.3.1" 1627 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz#9505b472763963e54afe60148ad27a330818e98b" 1628 | dependencies: 1629 | cliui "^6.0.0" 1630 | decamelize "^1.2.0" 1631 | find-up "^4.1.0" 1632 | get-caller-file "^2.0.1" 1633 | require-directory "^2.1.1" 1634 | require-main-filename "^2.0.0" 1635 | set-blocking "^2.0.0" 1636 | string-width "^4.2.0" 1637 | which-module "^2.0.0" 1638 | y18n "^4.0.0" 1639 | yargs-parser "^18.1.1" 1640 | --------------------------------------------------------------------------------