├── .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 | [](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 | [](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 |
--------------------------------------------------------------------------------