├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .mocharc.json ├── .npmignore ├── LICENSE ├── bin └── transform.ts ├── package-lock.json ├── package.json ├── readme.md ├── src ├── config.ts ├── index.ts ├── transformer │ ├── createContextTransformer.ts │ ├── createSourceFileTransformerFactory.ts │ ├── index.ts │ └── noop.ts ├── transformers │ ├── createIs.ts │ ├── index.ts │ ├── is.ts │ └── types.ts ├── util │ ├── branch.ts │ └── log.ts └── visitors │ ├── index.ts │ └── visitImportDeclaration.ts ├── test ├── createEnvironment.ts ├── createModule.ts ├── index.spec.ts ├── objects │ └── todo.ts ├── primitives │ ├── bigint.ts │ ├── boolean.ts │ ├── null.ts │ ├── number.ts │ ├── string.ts │ ├── symbol.ts │ └── undefined.ts ├── tsconfig.json ├── ttypescript-register.js └── values.ts ├── tsconfig.json ├── yarn-error.log └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | /lib/** 2 | /test/** 3 | .eslintrc.js 4 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * @type {import('eslint').Linter.BaseConfig} 4 | */ 5 | module.exports = { 6 | root: true, 7 | parser: '@typescript-eslint/parser', 8 | parserOptions: { 9 | tsconfigRootDir: __dirname, 10 | project: ['./tsconfig.json'], 11 | }, 12 | plugins: [ 13 | '@typescript-eslint' 14 | ], 15 | extends: [ 16 | 'eslint:recommended', 17 | 'plugin:@typescript-eslint/recommended', 18 | 'plugin:@typescript-eslint/recommended-requiring-type-checking', 19 | ], 20 | rules: { 21 | "@typescript-eslint/explicit-module-boundary-types": "off", 22 | "@typescript-eslint/no-unused-vars": [ 23 | "warn", 24 | { 25 | vars: "all", 26 | args: "all", 27 | caughtErrors: "all", 28 | varsIgnorePattern: "^_", 29 | argsIgnorePattern: "^_", 30 | caughtErrorsIgnorePattern: "^_", 31 | }, 32 | ], 33 | }, 34 | }; 35 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | build/ 3 | lib/ 4 | -------------------------------------------------------------------------------- /.mocharc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extension": ["ts"], 3 | "spec": "test/**/*.spec.ts", 4 | "require": "./test/ttypescript-register.js" 5 | } -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/ 2 | build/ 3 | test/ 4 | .mocharc.json 5 | tsconfig.json 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Kevin Ramharak 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 | -------------------------------------------------------------------------------- /bin/transform.ts: -------------------------------------------------------------------------------- 1 | 2 | import ts from 'typescript'; 3 | import fs from 'fs/promises'; 4 | import { createEnvironment } from '../test/createEnvironment'; 5 | 6 | function printHelp() { 7 | console.log(` 8 | --file FILENAME - transform file and print to stdout 9 | --string STRING - transform string and print to stdout 10 | `); 11 | } 12 | 13 | async function getCompilerOptions() { 14 | const contents = await fs.readFile('./tsconfig.json', { encoding: 'utf8' }); 15 | const json = JSON.parse(contents).compilerOptions; 16 | const compilerOptions = ts.convertCompilerOptionsFromJson(json, '.'); 17 | if (compilerOptions.errors.length > 0) { 18 | throw new Error(compilerOptions.errors[0].messageText.toString()); 19 | } 20 | return compilerOptions.options; 21 | } 22 | 23 | (async function main(args) { 24 | if (args.includes('-h') || args.includes('--help')) { 25 | printHelp(); 26 | return; 27 | } 28 | 29 | let input = ''; 30 | if (args.includes('--file')) { 31 | input = await fs.readFile(args[args.indexOf('--file') + 1], { encoding: 'utf-8' }); 32 | } else if (args.includes('--string')) { 33 | input = args[args.indexOf('--string') + 1]; 34 | } else { 35 | printHelp(); 36 | return; 37 | } 38 | 39 | const options = await getCompilerOptions(); 40 | const env = createEnvironment(options, { 41 | PackageModuleName: '@lib' 42 | }); 43 | const result = env.transformString(['createIs', 'is'], input); 44 | console.log(result); 45 | })(process.argv.slice(2)).catch(error => { 46 | console.error(error); 47 | }); 48 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ts-transform-runtime-check", 3 | "version": "0.0.1-alpha22", 4 | "main": "lib/index.js", 5 | "types": "lib/index.d.ts", 6 | "readme": "readme.md", 7 | "license": "MIT", 8 | "keywords": [ 9 | "typescript", 10 | "typescript-transform", 11 | "ts-transform", 12 | "ts-transformer", 13 | "ts-compiler-api", 14 | "runtime", 15 | "typecheck" 16 | ], 17 | "description": "Typescript AST transformer to generate type checks at compile time", 18 | "scripts": { 19 | "build": "ttsc", 20 | "lint": "eslint . --ext .ts", 21 | "test": "mocha --timeout 0 -r tsconfig-paths/register", 22 | "bin:transform": "./node_modules/.bin/ts-node -C ttypescript -r tsconfig-paths/register ./bin/transform.ts" 23 | }, 24 | "author": "Kevin Ramharak ", 25 | "repository": { 26 | "type": "git", 27 | "url": "https://https://github.com/kevinramharak/ts-transform-runtime-check.git" 28 | }, 29 | "ts-node": { 30 | "compiler": "ttypescript" 31 | }, 32 | "devDependencies": { 33 | "@types/chai": "^4.2.14", 34 | "@types/mocha": "^8.2.0", 35 | "@types/node": "^14.14.22", 36 | "@typescript-eslint/eslint-plugin": "^4.17.0", 37 | "@typescript-eslint/parser": "^4.17.0", 38 | "@typescript/vfs": "^1.3.4", 39 | "@zerollup/ts-transform-paths": "^1.7.18", 40 | "chai": "^4.2.0", 41 | "eslint": "^7.21.0", 42 | "mocha": "^8.2.1", 43 | "ts-expose-internals": "^4.1.3", 44 | "ts-node": "^9.1.1", 45 | "tsconfig-paths": "^3.9.0", 46 | "ttypescript": "^1.5.15", 47 | "typescript": "^4.2.3" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ## Looking for a production ready version of this idea? 2 | 3 | > For TypeScript v4.8+, try [typia](https://typia.io/docs/). 4 | 5 | ## ts-transform-runtime-check 6 | POC idea of generating code to type check values at runtime. 7 | The library provides the `is(value: unkown): value is T` function to be used whenever a type needs to be validated at runtime. 8 | This compiler plugin will generate the code that asserts the type thus providing type safety beyond compile time. 9 | 10 | An example program 11 | ```ts 12 | import { is } from 'ts-transform-runtime-check' 13 | 14 | interface User { 15 | id: number; 16 | name: string; 17 | age: number; 18 | } 19 | 20 | fetchData().then((data: any) => { 21 | if (!is(data)) { 22 | return Promise.reject('invalid data'); 23 | } 24 | // `user` is conforming the `User` interface at compile and runtime 25 | alert(`welcome ${user.name}`); 26 | }); 27 | 28 | ``` 29 | 30 | ### Using the Typescript compiler API 31 | The plugin currently uses `ttypescript` to hook into the typescript compiler as the current typescript compiler does not allow for plugins at the moment. The plugin uses a `.d.ts` file to define the ambient module `'ts-transform-runtime-check'`. The user can import functions from this ambient module as if it were a normal library. 32 | 33 | Whenever a program is compiled `ttypescript` asks each transformer package for its default export and invokes it with the typescript program and expects a factory function to generate context transformer functions. These context transformer functions themself generate source file visitor functions. It gets a bit weird with the factory pattern, but once we are at the `SourceFile` node we are at the actual ast transformation. 34 | 35 | The package pretends its a normal library that you can import but besides the generated code there is no actual runtime code imported. Because of this we look for import declarations for our package and remove those from the source files. To figure out where the package functions are called we ask the `TypeChecker` for a list of all the ambient modules and try to find the one defined by this package. It then maps the exported functions to an `CallExpressionNode` transformer function. These `CallExpressionNode` transformer functions are responsible for taking a `CallExpressionNode` transform it into typescript code that implements the expected behaviour. This allows for the typescript code `is(2)` to look like a function call, but it actually gets transformed into code that implements the same behaviour. By using the `TypeChecker` to figure out when our package functions are called using aliased imports works just as expected. 36 | 37 | To catch users assigning our package functions to other variables and/or properties we can visit `VariableDeclaration` and `PropertyAssignment` nodes and replace the values with `noop` functions. 38 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * Used to find our type declarations. Those type declarations will be tracked to figure out when one of the transformers is invoked. 4 | */ 5 | const PACKAGE_MODULE_SPECIFIER = 'ts-transform-runtime-check'; 6 | 7 | /** 8 | * Options to be compatible with typescript-is 9 | * see: https://github.com/woutervh-/typescript-is#options 10 | */ 11 | interface ITypeScriptIsOptions { 12 | /** 13 | * `boolean` (default false). If `true`, all type guards will return `true`, i.e. no validation takes place. Can be used for example in production deployments where doing a lot of validation can cost too much CPU. 14 | */ 15 | shortCircuit: boolean; 16 | /** 17 | * `boolean` (default: `false`). If `true`, when the transformer encounters a class (except for `Date`), it will ignore it and simply return `true`. If `false`, an error is generated at compile time. 18 | */ 19 | ignoreClasses: boolean; 20 | /** 21 | * `boolean` (default: `false`). If `true`, when the transformer encounters a method, it will ignore it and simply return `true`. If `false`, an error is generated at compile time. 22 | */ 23 | ignoreMethods: boolean; 24 | /** 25 | * One of `error`, `ignore`, or `basic` (default: `error`). Determines the behavior of transformer when encountering a function. `error` will cause a compile-time error, `ignore` will cause the validation function to always return `true`, and `basic` will do a simple function-type-check. 26 | */ 27 | functionBehaviour: 'error' | 'ignore' | 'basic'; 28 | /** 29 | * `boolean` (default: `false`). If `true`, objects are checked for having superfluous properties and will cause the validation to fail if they do. If `false`, no check for superfluous properties is made. 30 | */ 31 | disallowSuperfluousObjectProperties: boolean; 32 | } 33 | 34 | /** 35 | * Package configuration 36 | */ 37 | export interface IPublicPackageOptions { 38 | /** 39 | * Adds the type being being checked in a prefix comment when transforming type checks 40 | * 41 | * (default: `true`) 42 | */ 43 | addTypeComment?: boolean; 44 | /** 45 | * Adds parenthesis around the generated type expressions 46 | * 47 | * (default: `true`) 48 | */ 49 | addParenthesis?: boolean; 50 | /** 51 | * logs a warning if a package function is being used incorrectly 52 | * 53 | * (default: `true`) 54 | * 55 | * TODO: ts-patch to use the diagnostics api? 56 | */ 57 | warnOnInvalidUse?: boolean; 58 | /** 59 | * throws an error if a package function is being used incorrectly, overrides @see {IPublicPackageOptions['warnOnInvalidUse']} 60 | * 61 | * (default: `true`) 62 | * 63 | * TODO: ts-patch to use the diagnostics api? 64 | */ 65 | throwOnInvalidUse?: boolean; 66 | /** 67 | * do not generate type checks for properties that have an `@internal` annotation 68 | * 69 | * (default: uses the value in the project's tsconfig which defaults to `false`) 70 | * 71 | * see: https://www.typescriptlang.org/tsconfig/#stripInternal 72 | */ 73 | ignoreInternal?: boolean; 74 | /** 75 | * [typescript-is](https://github.com/woutervh-/typescript-is) compatibility options 76 | */ 77 | TypeScriptIs?: Partial; 78 | } 79 | 80 | /** 81 | * Package configuration not exposed in the public api 82 | */ 83 | export interface IInternalPackageOptions { 84 | /** 85 | * The module specifier that is used to track the features 86 | */ 87 | PackageModuleName: string; 88 | /** 89 | * Debug mode for developing 90 | */ 91 | debug: boolean; 92 | } 93 | 94 | /** 95 | * default internal package options 96 | */ 97 | const InternalPackageOptions: IInternalPackageOptions = { 98 | PackageModuleName: PACKAGE_MODULE_SPECIFIER, 99 | debug: false, 100 | } 101 | 102 | /** 103 | * default public package options 104 | */ 105 | const PackageOptions: Required = { 106 | addTypeComment: true, 107 | warnOnInvalidUse: true, 108 | throwOnInvalidUse: true, 109 | addParenthesis: true, 110 | ignoreInternal: false, 111 | TypeScriptIs: { 112 | shortCircuit: false, 113 | ignoreClasses: false, 114 | ignoreMethods: false, 115 | functionBehaviour: 'basic', 116 | disallowSuperfluousObjectProperties: false, 117 | } 118 | } 119 | 120 | export type IPackageOptions = IInternalPackageOptions & Required; 121 | export const DefaultPackageOptions = Object.assign({}, InternalPackageOptions, PackageOptions); 122 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | 2 | // TODO: missing features 3 | // - cache checks, Share the cache with createIs 4 | // - debug/develop mode for extensive error reporting 5 | // - ignore @internal flagged properties 6 | // - use json-schema's (at compile time and at runtime?) 7 | // - type MyType = Schema; 8 | // see https://github.com/vega/ts-json-schema-generator for example 9 | 10 | class StubError extends Error { 11 | constructor(fnName: string) { 12 | super(`'${fnName}' is a stub function, calls to this function should have been removed by the transformer plugin`); 13 | } 14 | } 15 | 16 | /** 17 | * check if `value` conforms to the runtime type of `T` 18 | */ 19 | export function is(value: unknown): value is T { 20 | throw new StubError(is.name); 21 | } 22 | 23 | /** 24 | * create a typeguard for type `T` 25 | */ 26 | export function createIs(): (value: unknown) => value is T { 27 | throw new StubError(createIs.name); 28 | } 29 | 30 | 31 | /** 32 | * alias type to allow this to change easily 33 | */ 34 | type SchemaIdentifier = string; 35 | 36 | /** 37 | * A type based on a JSON schema 38 | * can be used like 39 | * ```ts 40 | * type MyType = Schema<'url/to/schema.json'> 41 | * const isMyType = createIs(); 42 | * ``` 43 | * 44 | * TODO: implement this 45 | */ 46 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 47 | export type Schema = unknown; 48 | -------------------------------------------------------------------------------- /src/transformer/createContextTransformer.ts: -------------------------------------------------------------------------------- 1 | import ts from 'typescript'; 2 | import { IPackageOptions, IPublicPackageOptions } from '@/config'; 3 | import { MarkedTransformer, ShouldTransform } from '@/transformers'; 4 | import { MarkedVisitor, visitors } from '@/visitors'; 5 | 6 | /** 7 | * Transformers are applied based on `kind` and `shouldTransform` 8 | * Visitors are applied based on `kind` 9 | * 10 | * Transformers and visitors should non order reliant 11 | */ 12 | export function createNodeVisitor(visitors: MarkedVisitor[], transformers: [ShouldTransform, MarkedTransformer][], checker: ts.TypeChecker, context: ts.TransformationContext, options: IPackageOptions) { 13 | return function nodeVisitor(node: ts.Node): ts.Node | undefined { 14 | const transformed = transformers.reduce((node, [shouldTransform, transformer]) => { 15 | if (transformer.kind === node.kind && shouldTransform(node, checker, context, options)) { 16 | node = transformer(node, checker, context, options); 17 | } 18 | return node; 19 | }, node); 20 | const visited = visitors.reduce((node: ts.Node | undefined, visitor) => { 21 | if (node && visitor.kind === node.kind) { 22 | node = visitor(node, checker, context, options); 23 | } 24 | return node; 25 | }, transformed); 26 | return ts.visitEachChild(visited, nodeVisitor, context); 27 | } 28 | } 29 | 30 | export function createContextTransformer(checker: ts.TypeChecker, transformers: [ShouldTransform, MarkedTransformer][], options: IPublicPackageOptions) { 31 | return function contextTransformer(context: ts.TransformationContext) { 32 | const visitor = createNodeVisitor(visitors as unknown as MarkedVisitor[], transformers, checker, context, options as IPackageOptions); 33 | return function sourceFileVisitor(file: ts.SourceFile) { 34 | return ts.visitNode(file, visitor); 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/transformer/createSourceFileTransformerFactory.ts: -------------------------------------------------------------------------------- 1 | import ts from 'typescript'; 2 | 3 | import { DefaultPackageOptions, IPackageOptions, IPublicPackageOptions } from '@/config'; 4 | import { MarkedTransformer, ShouldTransform, transformers as transformerFactories } from '@/transformers'; 5 | import { useLogger, warn, Logger } from '@/util/log'; 6 | import { createContextTransformer } from './createContextTransformer'; 7 | import { noopContextTransformer } from './noop'; 8 | 9 | /** 10 | * NOTE: this assumes there is only 1 file with relevant exports or 1 single ambient module declaration 11 | */ 12 | function getExportsSymbolTableForModuleSpecifier(program: ts.Program, checker: ts.TypeChecker, moduleSpecifier: string): ts.SymbolTable | undefined { 13 | // NOTE: this took a long time to figure out, not sure why there isn't a simpler api for this 14 | 15 | // either find the sourcefile and use the exports table 16 | for (const sourceFile of program.getSourceFiles()) { 17 | if (sourceFile.resolvedModules && sourceFile.resolvedModules.has(moduleSpecifier)) { 18 | const resolvedModuleInfo = sourceFile.resolvedModules.get(moduleSpecifier); 19 | // sometimes the map does have the key, but the value is undefined (wtf) 20 | if (resolvedModuleInfo) { 21 | const packageSourceFile = program.getSourceFile(resolvedModuleInfo.resolvedFileName); 22 | if (packageSourceFile) { 23 | if (packageSourceFile.symbol.exports) { 24 | return packageSourceFile.symbol.exports; 25 | } 26 | throw new Error(`'${moduleSpecifier}' source file was found but has no exports`) 27 | } 28 | } 29 | } 30 | } 31 | 32 | const ambientModule = checker.tryFindAmbientModuleWithoutAugmentations(moduleSpecifier); 33 | if (ambientModule) { 34 | if (ambientModule.exports) { 35 | return ambientModule.exports; 36 | } 37 | throw new Error(`'${moduleSpecifier}' ambient declaration was found but has no exports`); 38 | } 39 | } 40 | 41 | /** 42 | * implements a `(program: ts.Program, options: any) => ts.TransformerFactory` signature expected by ttypescript 43 | * see: https://github.com/cevek/ttypescript#program 44 | */ 45 | export function createSourceFileTransformerFactory(program: ts.Program, options?: Partial): ts.TransformerFactory; 46 | export function createSourceFileTransformerFactory(program: ts.Program, _options: Partial = {}): ts.TransformerFactory { 47 | const options = Object.assign({}, DefaultPackageOptions, _options) as IPackageOptions; 48 | const checker = program.getTypeChecker(); 49 | 50 | // TODO: implement this when its actually able to self host 51 | // if (!is(options)) { 52 | // throw new TypeError('invalid configuration object'); 53 | // } 54 | 55 | try { 56 | const packageExportsSymbolTable = getExportsSymbolTableForModuleSpecifier(program, checker, options.PackageModuleName); 57 | if (!packageExportsSymbolTable) { 58 | warn(`no import found for '${options.PackageModuleName}, defaulting to a noop transformer'`); 59 | return noopContextTransformer; 60 | } 61 | 62 | const transformers: [ShouldTransform, MarkedTransformer][] = []; 63 | for (const [name, symbol] of (packageExportsSymbolTable as Map).entries()) { 64 | const transformer = transformerFactories.find(transformer => transformer.name === name); 65 | if (transformer) { 66 | // NOTE: the `unknown` cast is needed because of the power of typescript 'branded' types 67 | transformers.push([ 68 | transformer.createShouldTransform(symbol.valueDeclaration), 69 | transformer, 70 | ] as unknown as [ShouldTransform, MarkedTransformer]); 71 | } 72 | warn(`${name} has no transformer factory`); 73 | } 74 | 75 | return createContextTransformer(checker, transformers, options); 76 | } catch (e: unknown) { 77 | if (e instanceof Error) { 78 | warn(e.message); 79 | } 80 | throw e; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/transformer/index.ts: -------------------------------------------------------------------------------- 1 | import { createSourceFileTransformerFactory } from './createSourceFileTransformerFactory'; 2 | 3 | export * from './createContextTransformer'; 4 | export * from './createSourceFileTransformerFactory'; 5 | export * from './noop'; 6 | 7 | export default createSourceFileTransformerFactory; 8 | -------------------------------------------------------------------------------- /src/transformer/noop.ts: -------------------------------------------------------------------------------- 1 | import ts from 'typescript'; 2 | 3 | export function noopNodeVisitor(node: ts.Node) { 4 | return node; 5 | } 6 | 7 | function noopSourceFileVisitor(file: ts.SourceFile) { 8 | return ts.visitNode(file, noopNodeVisitor); 9 | } 10 | 11 | export function noopContextTransformer() { 12 | return noopSourceFileVisitor; 13 | } 14 | -------------------------------------------------------------------------------- /src/transformers/createIs.ts: -------------------------------------------------------------------------------- 1 | // allows us to see more of the internal TS api 2 | import {} from 'ts-expose-internals'; 3 | 4 | import ts from 'typescript'; 5 | import { IPackageOptions } from '@/config'; 6 | import { CreateShouldTransform } from './types'; 7 | import { getTypeCheckGenerator } from './is'; 8 | 9 | const ERROR = { 10 | InvalidAmountOfTypeArguments: `invalid amount of type arguments, expected exactly 1`, 11 | InvalidTypeArgument: (name: string) => `invalid type argument '${name}'`, 12 | ImpossibleBranchReached: (reason: string) => `reached a branch that should be impossible to reach because of: '${reason}'`, 13 | }; 14 | 15 | createIs.kind = ts.SyntaxKind.CallExpression; 16 | 17 | /** 18 | * @param declaration the `createIs() => (value: unknown): value is T` declaration 19 | */ 20 | createIs.createShouldTransform = function createShouldTransform(declaration: ts.Declaration) { 21 | return function shouldTransform(node, checker, _context, _options) { 22 | const signature = checker.getResolvedSignature(node); 23 | return signature && signature.declaration && signature.declaration === declaration; 24 | } 25 | } as CreateShouldTransform; 26 | 27 | /** 28 | * 29 | */ 30 | export function createIs(node: ts.CallExpression, checker: ts.TypeChecker, context: ts.TransformationContext, options: IPackageOptions): ts.Expression { 31 | if (!node.typeArguments || node.typeArguments.length !== 1) { 32 | throw new Error(ERROR.InvalidAmountOfTypeArguments); 33 | } 34 | 35 | // createIs<{is}>() 36 | const isNode = node.typeArguments[0]; 37 | const isType = checker.getTypeFromTypeNode(isNode); 38 | 39 | const parameterIdentifier = context.factory.createIdentifier('value'); 40 | const generateTypeCheck = getTypeCheckGenerator(checker, context, options); 41 | const expression = generateTypeCheck({ type: isType }, { node: parameterIdentifier, type: checker.getAnyType() }); 42 | const parameterDeclaration = context.factory.createParameterDeclaration(void 0, void 0, parameterIdentifier); 43 | 44 | return context.factory.createArrowFunction(void 0, void 0, [parameterDeclaration], void 0, void 0, expression); 45 | } 46 | -------------------------------------------------------------------------------- /src/transformers/index.ts: -------------------------------------------------------------------------------- 1 | 2 | import ts from 'typescript'; 3 | import { IPackageOptions } from '@/config'; 4 | export { CreateShouldTransform, ShouldTransform } from './types'; 5 | 6 | import { is } from './is'; 7 | import { createIs } from './createIs'; 8 | 9 | export type Transformer = (node: TNode, checker: ts.TypeChecker, context: ts.TransformationContext, options: IPackageOptions) => ts.Node; 10 | export type MarkedTransformer = Transformer & { kind: TNode['kind'] }; 11 | 12 | export const transformers = [ 13 | is, 14 | createIs, 15 | ] as const; 16 | -------------------------------------------------------------------------------- /src/transformers/is.ts: -------------------------------------------------------------------------------- 1 | // allows us to see more of the internal TS api 2 | import { } from 'ts-expose-internals'; 3 | 4 | import ts from 'typescript'; 5 | import { branch } from '@/util/branch'; 6 | import { IPackageOptions } from '@/config'; 7 | import { CreateShouldTransform } from './types'; 8 | import { assert, log, warn } from '@/util/log'; 9 | 10 | const ERROR = { 11 | InvalidAmountOfTypeArguments: `invalid amount of type arguments, expected exactly 1`, 12 | InvalidAmountOfArguments: `invalid amount of arguments, expected exactly 1`, 13 | InvalidTypeArgument: (name: string) => `invalid type argument '${name}'`, 14 | ImpossibleBranchReached: (reason: string) => `reached a branch that should be impossible to reach because of: '${reason}'`, 15 | }; 16 | 17 | class NotImplemented extends Error { 18 | name = 'NotImplemented'; 19 | } 20 | 21 | // https://tc39.es/ecma262/#sec-typeof-operator 22 | export enum TypeOfResult { 23 | undefined = 'undefined', 24 | null = 'object', 25 | boolean = 'boolean', 26 | number = 'number', 27 | string = 'string', 28 | symbol = 'symbol', 29 | bigint = 'bigint', 30 | object = 'object', 31 | function = 'function', 32 | } 33 | 34 | /** 35 | * See: https://stackoverflow.com/questions/55056515/typescript-compiler-api-how-to-detect-if-property-type-is-enum-or-object 36 | */ 37 | export function isEnumType(type: ts.Type) { 38 | return type.symbol && type.symbol.valueDeclaration && type.symbol.valueDeclaration.kind === ts.SyntaxKind.EnumDeclaration; 39 | } 40 | 41 | /** 42 | * TODO: This makes the assumption of `Array` being the identifier for the global `Array` object and it having a method `isArray` that takes 1 argument 43 | */ 44 | export function createIsArrayCheck(context: ts.TransformationContext, node: ts.Expression) { 45 | return context.factory.createMethodCall( 46 | context.factory.createIdentifier('Array'), 47 | 'isArray', 48 | [node] 49 | ); 50 | } 51 | 52 | /** 53 | * 54 | */ 55 | export function createTypeOfCheck(context: ts.TransformationContext, value: ts.Expression, type: typeof TypeOfResult[keyof typeof TypeOfResult]) { 56 | return context.factory.createStrictEquality( 57 | context.factory.createTypeOfExpression(value), 58 | context.factory.createStringLiteral(type), 59 | ); 60 | } 61 | 62 | function getUnknownType(checker: ts.TypeChecker) { 63 | // @ts-expect-error - using a hack to get the unreachable unknown type reference 64 | return checker.getTypeFromTypeNode({ kind: ts.SyntaxKind.UnknownKeyword, parent: { kind: ts.SyntaxKind.NotEmittedStatement } }); 65 | } 66 | 67 | export function createTypeCheckGenerator(checker: ts.TypeChecker, context: ts.TransformationContext, options: IPackageOptions) { 68 | const compilerOptions = context.getCompilerOptions(); 69 | // useful: https://github.com/microsoft/TypeScript/blob/master/src/compiler/types.ts#L4936 70 | // NOTE: it is (almost) guarenteed that integer indexes are sorted from 0 - n, so any TypeFlags with multiple flags can be impacted by this 71 | // NOTE: TypeFlags.EnumLiteral is always a & with StringLiteral | NumberLiteral 72 | // NOTE: TypeFlags.Enum is not actually used, Enum's seem to be represented as unions 73 | 74 | /** 75 | * References to intrinsic types, these are only to be passed to context.factory.* method, not to use for reference equality 76 | */ 77 | const intrinsic = { 78 | any: checker.getAnyType(), 79 | null: checker.getNullType(), 80 | undefined: checker.getUndefinedType(), 81 | true: checker.getTrueType(), 82 | false: checker.getFalseType(), 83 | number: checker.getNumberType(), 84 | string: checker.getStringType(), 85 | void: checker.getVoidType(), 86 | optional: checker.getOptionalType(), 87 | boolean: checker.getBooleanType(), 88 | symbol: checker.getESSymbolType(), 89 | // NOTE: is not available like the above, need to find it in the catelog 90 | unknown: getUnknownType(checker), 91 | }; 92 | 93 | const globals = compilerOptions.skipDefaultLibCheck ? {} : {}; 94 | 95 | /** 96 | * generates the code for `is<{ is.type }>({ node.value }: { node.type })` CallExpressions 97 | */ 98 | return function generateTypeCheckExpression(is: { type: ts.Type }, value: { node: ts.Expression, type?: ts.Type }): ts.Expression { 99 | const _value = { node: value.node, type: value.type || intrinsic.any }; 100 | 101 | return branch(is.type.flags, { 102 | [ts.TypeFlags.Never]() { 103 | throw new Error(ERROR.InvalidTypeArgument(checker.typeToString(is.type))); 104 | }, 105 | [ts.TypeFlags.Unknown | ts.TypeFlags.Any]() { 106 | return context.factory.createTrue(); 107 | }, 108 | [ts.TypeFlags.Null]() { 109 | return branch(_value.type.flags, { 110 | [ts.TypeFlags.Null]() { 111 | return context.factory.createTrue(); 112 | }, 113 | default() { 114 | return context.factory.createStrictEquality(_value.node, context.factory.createNull()); 115 | }, 116 | }); 117 | }, 118 | [ts.TypeFlags.Undefined]() { 119 | return branch(_value.type.flags, { 120 | [ts.TypeFlags.Undefined | ts.TypeFlags.Void]() { 121 | return context.factory.createTrue(); 122 | }, 123 | default() { 124 | return context.factory.createStrictEquality(_value.node, context.factory.createVoidZero()); 125 | } 126 | }); 127 | }, 128 | [ts.TypeFlags.Void]() { 129 | // void van be null | undefined or undefined if strict null checks are on 130 | // see: https://www.typescriptlang.org/docs/handbook/basic-types.html#void 131 | return branch(_value.type.flags, { 132 | [ts.TypeFlags.Undefined | ts.TypeFlags.Void]() { 133 | return context.factory.createTrue(); 134 | }, 135 | [ts.TypeFlags.Null]() { 136 | return (compilerOptions.strict || compilerOptions.strictNullChecks) ? 137 | context.factory.createFalse() : 138 | context.factory.createTrue(); 139 | }, 140 | default() { 141 | return (compilerOptions.strict || compilerOptions.strictNullChecks) ? 142 | context.factory.createStrictEquality(_value.node, context.factory.createVoidZero()) : 143 | context.factory.createEquality(_value.node, context.factory.createNull()); 144 | } 145 | }); 146 | }, 147 | // NOTE: NonPrimitive is the plain `object` type 148 | // TODO: figure out if NonPrimitive is hit more than expected ,assumption is now that its the `object` type 149 | // see: https://www.typescriptlang.org/docs/handbook/basic-types.html#object 150 | [ts.TypeFlags.NonPrimitive]() { 151 | return branch(_value.type.flags, { 152 | [ts.TypeFlags.NonPrimitive | ts.TypeFlags.Object]() { 153 | return context.factory.createTrue(); 154 | }, 155 | [ts.TypeFlags.Any | ts.TypeFlags.Unknown]() { 156 | const typeof_object = createTypeOfCheck(context, _value.node, TypeOfResult.object); 157 | const strict_equality_null = context.factory.createStrictInequality(_value.node, context.factory.createNull()); 158 | const typeof_function = createTypeOfCheck(context, _value.node, TypeOfResult.function); 159 | 160 | return context.factory.createLogicalOr( 161 | context.factory.createParenthesizedExpression( 162 | context.factory.createLogicalAnd(typeof_object, strict_equality_null) 163 | ), 164 | typeof_function 165 | ); 166 | }, 167 | default() { 168 | return context.factory.createFalse(); 169 | }, 170 | }); 171 | }, 172 | [ts.TypeFlags.Boolean]() { 173 | return branch(_value.type.flags, { 174 | [ts.TypeFlags.Boolean | ts.TypeFlags.BooleanLiteral]() { 175 | return context.factory.createTrue(); 176 | }, 177 | [ts.TypeFlags.Any | ts.TypeFlags.Unknown]() { 178 | return createTypeOfCheck(context, _value.node, TypeOfResult.boolean); 179 | }, 180 | default() { 181 | return context.factory.createFalse(); 182 | }, 183 | }); 184 | }, 185 | [ts.TypeFlags.BooleanLiteral]() { 186 | return branch(_value.type.flags, { 187 | [ts.TypeFlags.Boolean]() { 188 | const literalValue = checker.typeToString(is.type) === 'true' ? context.factory.createTrue() : context.factory.createFalse(); 189 | return context.factory.createStrictEquality(_value.node, literalValue); 190 | }, 191 | [ts.TypeFlags.BooleanLiteral]() { 192 | const isEqual = checker.typeToString(is.type) === checker.typeToString(_value.type); 193 | return isEqual ? context.factory.createTrue() : context.factory.createFalse(); 194 | }, 195 | [ts.TypeFlags.Any | ts.TypeFlags.Unknown]() { 196 | const rhs = checker.typeToString(is.type) === 'true' ? context.factory.createTrue() : context.factory.createFalse(); 197 | return context.factory.createStrictEquality(_value.node, rhs); 198 | }, 199 | default() { 200 | return context.factory.createFalse(); 201 | }, 202 | }); 203 | }, 204 | [ts.TypeFlags.ESSymbol]() { 205 | return branch(_value.type.flags, { 206 | [ts.TypeFlags.ESSymbolLike]() { 207 | return context.factory.createTrue(); 208 | }, 209 | [ts.TypeFlags.Any | ts.TypeFlags.Unknown]() { 210 | return createTypeOfCheck(context, _value.node, TypeOfResult.symbol); 211 | }, 212 | default() { 213 | return context.factory.createFalse(); 214 | }, 215 | }); 216 | }, 217 | [ts.TypeFlags.UniqueESSymbol]() { 218 | // TODO: implement this 219 | return branch(_value.type.flags, { 220 | default() { 221 | return context.factory.createFalse(); 222 | }, 223 | }); 224 | }, 225 | [ts.TypeFlags.String]() { 226 | return branch(_value.type.flags, { 227 | [ts.TypeFlags.StringLike]() { 228 | return context.factory.createTrue(); 229 | }, 230 | [ts.TypeFlags.Any | ts.TypeFlags.Unknown]() { 231 | return createTypeOfCheck(context, _value.node, TypeOfResult.string); 232 | }, 233 | default() { 234 | return context.factory.createFalse(); 235 | }, 236 | }); 237 | }, 238 | [ts.TypeFlags.StringLiteral]() { 239 | return branch(_value.type.flags, { 240 | [ts.TypeFlags.StringLike & ~ts.TypeFlags.StringLiteral]() { 241 | const rhs = context.factory.createStringLiteral((is.type as ts.StringLiteralType).value); 242 | return context.factory.createStrictEquality(_value.node, rhs); 243 | }, 244 | [ts.TypeFlags.StringLiteral]() { 245 | const isEqual = (is.type as ts.StringLiteralType).value === (_value.type as ts.StringLiteralType).value; 246 | return isEqual ? context.factory.createTrue() : context.factory.createFalse(); 247 | }, 248 | [ts.TypeFlags.Any | ts.TypeFlags.Unknown]() { 249 | const rhs = context.factory.createStringLiteral((is.type as ts.StringLiteralType).value); 250 | return context.factory.createStrictEquality(_value.node, rhs); 251 | }, 252 | default() { 253 | return context.factory.createFalse(); 254 | }, 255 | }); 256 | }, 257 | [ts.TypeFlags.Number]() { 258 | return branch(_value.type.flags, { 259 | [ts.TypeFlags.NumberLike]() { 260 | return context.factory.createTrue(); 261 | }, 262 | [ts.TypeFlags.Any | ts.TypeFlags.Unknown]() { 263 | return createTypeOfCheck(context, _value.node, TypeOfResult.number); 264 | }, 265 | default() { 266 | return context.factory.createFalse(); 267 | }, 268 | }); 269 | }, 270 | [ts.TypeFlags.NumberLiteral]() { 271 | return branch(_value.type.flags, { 272 | [ts.TypeFlags.NumberLiteral]() { 273 | const isEqual = (is.type as ts.NumberLiteralType).value === (_value.type as ts.NumberLiteralType).value; 274 | return isEqual ? context.factory.createTrue() : context.factory.createFalse(); 275 | }, 276 | [ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.NumberLike]() { 277 | const rhs = context.factory.createNumericLiteral((is.type as ts.NumberLiteralType).value); 278 | return context.factory.createStrictEquality(_value.node, rhs); 279 | }, 280 | default() { 281 | return context.factory.createFalse(); 282 | }, 283 | }); 284 | }, 285 | [ts.TypeFlags.BigInt]() { 286 | return branch(_value.type.flags, { 287 | [ts.TypeFlags.BigIntLike]() { 288 | return context.factory.createTrue(); 289 | }, 290 | [ts.TypeFlags.Any | ts.TypeFlags.Unknown]() { 291 | return createTypeOfCheck(context, _value.node, TypeOfResult.bigint); 292 | }, 293 | default() { 294 | return context.factory.createFalse(); 295 | }, 296 | }); 297 | }, 298 | [ts.TypeFlags.BigIntLiteral]() { 299 | return branch(_value.type.flags, { 300 | [ts.TypeFlags.BigIntLiteral]() { 301 | const isEqual = 302 | (is.type as ts.BigIntLiteralType).value.negative === (_value.type as ts.BigIntLiteralType).value.negative && 303 | (is.type as ts.BigIntLiteralType).value.base10Value === (_value.type as ts.BigIntLiteralType).value.base10Value; 304 | return isEqual ? context.factory.createTrue() : context.factory.createFalse(); 305 | }, 306 | [ts.TypeFlags.Any | ts.TypeFlags.Unknown | ts.TypeFlags.BigIntLike]() { 307 | const rhs = context.factory.createBigIntLiteral((is.type as ts.BigIntLiteralType).value); 308 | return context.factory.createStrictEquality(_value.node, rhs); 309 | }, 310 | default() { 311 | return context.factory.createFalse(); 312 | }, 313 | }); 314 | }, 315 | [ts.TypeFlags.Union]() { 316 | // TODO: do we need to care about const enum {} ? 317 | // NOTE: Enums are represented as unions at this level 318 | // TODO: in operator checks protoype chain, is that a problem? 319 | // see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/in#inherited_properties 320 | if (isEnumType(is.type)) { 321 | // Check if the value we are checking is a string | number 322 | const is_string = createTypeOfCheck(context, _value.node, TypeOfResult.string); 323 | const is_number = createTypeOfCheck(context, _value.node, TypeOfResult.number); 324 | const is_index_type = context.factory.createParenthesizedExpression( 325 | context.factory.createLogicalOr(is_string, is_number) 326 | ); 327 | const is_in_enum = context.factory.createBinaryExpression( 328 | _value.node, 329 | ts.SyntaxKind.InKeyword, 330 | context.factory.createIdentifier(is.type.symbol.name) 331 | ); 332 | return context.factory.createLogicalAnd(is_index_type, is_in_enum); 333 | } else { 334 | const types = (is.type as ts.UnionType).types; 335 | return types.map(type => generateTypeCheckExpression({ type }, _value)).reduce((lhs, rhs) => { 336 | return context.factory.createLogicalOr(lhs, rhs); 337 | }); 338 | } 339 | }, 340 | [ts.TypeFlags.Intersection]() { 341 | const types = (is.type as ts.IntersectionType).types; 342 | return types.map(type => generateTypeCheckExpression({ type }, _value)).reduce((lhs, rhs) => { 343 | return context.factory.createLogicalAnd(lhs, rhs); 344 | }); 345 | }, 346 | [ts.TypeFlags.Object]() { 347 | // TODO: add compile time evaluation for object types 348 | 349 | if (checker.isTupleType(is.type)) { 350 | // TODO: should length be checked if so, how with rest/variadic? 351 | 352 | const properties = checker.getPropertiesOfType(is.type); 353 | const target = (is.type as ts.TupleTypeReference).target; 354 | 355 | const is_array = createIsArrayCheck(context, _value.node); 356 | const length_access = context.factory.createElementAccessExpression(_value.node, context.factory.createStringLiteral('length')); 357 | // TODO: what is the difference between `minLength` and `fixedLength`? 358 | const length = target.minLength; // target.hasRestElement ? target.minLength : target.fixedLength; 359 | const length_literal = context.factory.createNumericLiteral(length); 360 | 361 | // TODO: does this support all types of tuples? what about leading rest elements 362 | const has_n_length = target.hasRestElement 363 | ? context.factory.createGreaterThanEquals(length_access, length_literal) 364 | : context.factory.createStrictEquality(length_access, length_literal); 365 | 366 | // TODO: how to support variadic/rest tuples 367 | return [ 368 | is_array, has_n_length, 369 | ...(target.hasRestElement ? [] : properties.filter(property => { 370 | const index = Number.parseInt(property.name); 371 | if (Number.isNaN(index)) { 372 | return false; 373 | } 374 | return index >= 0 && index < length; 375 | }).map(property => { 376 | const index = Number.parseInt(property.name); 377 | const type = checker.getTypeOfSymbolAtLocation(property, _value.node); 378 | const node = context.factory.createElementAccessExpression(_value.node, index); 379 | return generateTypeCheckExpression({ type }, { node }) 380 | })), 381 | ].reduce((lhs, rhs) => { 382 | return context.factory.createLogicalAnd(lhs, rhs); 383 | }); 384 | } else if (checker.isArrayType(is.type)) { 385 | const is_array = createIsArrayCheck(context, _value.node); 386 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 387 | const type = (is.type as ts.GenericType).typeArguments![0]; 388 | return branch(type.flags, { 389 | [ts.TypeFlags.Any | ts.TypeFlags.Unknown]() { 390 | return is_array; 391 | }, 392 | default() { 393 | const parameterIdentifier = context.factory.createIdentifier('item'); 394 | const check = generateTypeCheckExpression({ type }, { node: parameterIdentifier }); 395 | const parameterDeclaration = context.factory.createParameterDeclaration(void 0, void 0, void 0, parameterIdentifier); 396 | const predicate = context.factory.createArrowFunction(void 0, void 0, [parameterDeclaration], void 0, void 0, check); 397 | const rhs = context.factory.createMethodCall(_value.node, 'every', [predicate]); 398 | return context.factory.createLogicalAnd(is_array, rhs); 399 | } 400 | }); 401 | } else { 402 | return branch(_value.type.flags, { 403 | [ts.TypeFlags.Primitive]() { 404 | return context.factory.createFalse(); 405 | }, 406 | default() { 407 | let properties = checker.getPropertiesOfType(is.type); 408 | 409 | const calls = checker.getSignaturesOfType(is.type, ts.SignatureKind.Call); 410 | if (calls.length) { 411 | // TODO: what to do with functions? 412 | } 413 | 414 | const news = checker.getSignaturesOfType(is.type, ts.SignatureKind.Construct); 415 | if (news.length) { 416 | // TODO: what to do with constructors? 417 | } 418 | 419 | if (options.ignoreInternal) { 420 | properties = properties.filter((symbol) => { 421 | const hasInternalTag = symbol.getJsDocTags().find(tag => { 422 | return tag.name === 'internal'; 423 | }); 424 | return !hasInternalTag; 425 | }); 426 | } 427 | 428 | const checks = properties.length === 0 ? [context.factory.createTrue()] : properties.map((symbol) => { 429 | // eslint-disable-next-line @typescript-eslint/no-non-null-assertion 430 | const type = checker.getTypeOfPropertyOfType(is.type, symbol.name)!; 431 | const node = context.factory.createElementAccessExpression(_value.node, context.factory.createStringLiteral(symbol.name)); 432 | if ((type.flags & ts.TypeFlags.AnyOrUnknown) > 0) { 433 | log(type) 434 | warn(`${symbol.name} has type 'any | unknown'`); 435 | } 436 | return generateTypeCheckExpression({ type }, { node }); 437 | }); 438 | 439 | // property access requires a undefined | null check to prevent throwing a type error 440 | // we only generate this check if we cannot infer if the type is not null or undefined 441 | // see: https://tc39.es/ecma262/#sec-requireobjectcoercible 442 | if ((_value.type.flags & (ts.TypeFlags.Any | ts.TypeFlags.Unknown)) !== 0) { 443 | const allows_property_access = context.factory.createInequality(_value.node, context.factory.createNull()); 444 | checks.unshift(allows_property_access); 445 | } 446 | 447 | return checks.reduce((lhs, rhs) => { 448 | return context.factory.createLogicalAnd( 449 | lhs, 450 | rhs, 451 | ); 452 | }); 453 | }, 454 | }); 455 | } 456 | }, 457 | [ts.TypeFlags.TypeParameter]() { 458 | // TODO: specifybehaviour based on configuration 459 | 460 | const baseConstraintType = checker.getBaseConstraintOfType(is.type); 461 | 462 | if (baseConstraintType == null) { 463 | throw new NotImplemented(`generic type check for requires a base type: ${checker.typeToString(is.type)}`); 464 | } 465 | 466 | // TODO: figure out how to use `` 467 | return generateTypeCheckExpression({ type: baseConstraintType }, { node: _value.node }); 468 | }, 469 | default() { 470 | throw new NotImplemented(`missing type check for: ${checker.typeToString(is.type)}`); 471 | }, 472 | }); 473 | } 474 | } 475 | 476 | function shouldWrapInIIFE(node: ts.Expression): boolean { 477 | return ts.isAsExpression(node) ? shouldWrapInIIFE(node.expression) : (ts.isArrayLiteralExpression(node) || ts.isObjectLiteralExpression(node)); 478 | } 479 | 480 | is.kind = ts.SyntaxKind.CallExpression; 481 | 482 | /** 483 | * @param declaration the `is(value: unknown): value is T` declaration 484 | */ 485 | is.createShouldTransform = function createShouldTransform(declaration: ts.Declaration) { 486 | return function shouldTransform(node, checker, context, options) { 487 | const signature = checker.getResolvedSignature(node); 488 | return signature && signature.declaration && signature.declaration === declaration; 489 | } 490 | } as CreateShouldTransform; 491 | 492 | const instances = new Map<[ts.TypeChecker, ts.TransformationContext, IPackageOptions], ReturnType>(); 493 | 494 | export function getTypeCheckGenerator(checker: ts.TypeChecker, context: ts.TransformationContext, options: IPackageOptions): ReturnType { 495 | for (const [[a, b, c], d] of instances) { 496 | if (checker === a && context === b && options === c) { 497 | return d; 498 | } 499 | } 500 | const i = createTypeCheckGenerator(checker, context, options); 501 | instances.set([checker, context, options], i); 502 | return i; 503 | } 504 | 505 | /** 506 | * 507 | */ 508 | export function is(node: ts.CallExpression, checker: ts.TypeChecker, context: ts.TransformationContext, options: IPackageOptions): ts.Expression { 509 | if (!node.typeArguments || node.typeArguments.length !== 1) { 510 | throw new Error(ERROR.InvalidAmountOfTypeArguments); 511 | } 512 | 513 | if (node.arguments.length !== 1) { 514 | throw new Error(ERROR.InvalidAmountOfArguments); 515 | } 516 | 517 | if (options.TypeScriptIs.shortCircuit) { 518 | return context.factory.createTrue(); 519 | } 520 | 521 | const typeCheckGenerator = getTypeCheckGenerator(checker, context, options); 522 | 523 | // is<{is}>({value.node}: {value.type}) 524 | const isNode = node.typeArguments[0]; 525 | const isType = checker.getTypeFromTypeNode(isNode); 526 | 527 | let valueNode = node.arguments[0]; 528 | const valueType = checker.getTypeAtLocation(valueNode); 529 | 530 | // TODO: put this behind a flag 531 | const wrapInIIFE = true && shouldWrapInIIFE(valueNode); 532 | const originalValueNode = valueNode; 533 | 534 | if (wrapInIIFE) { 535 | // when: `is<{ x: 2 }>({ x: 2 } as any);` 536 | // default: `(typeof { x: 2 } != null && { x: 2 }['x'] === 2);` 537 | // wrapped: `(literal => literal != null && literal['x'] === 2)({ x: 2 })` 538 | valueNode = context.factory.createIdentifier('literal'); 539 | } 540 | 541 | 542 | let check = typeCheckGenerator({ type: isType }, { node: valueNode, type: valueType }); 543 | 544 | if (options.addTypeComment) { 545 | ts.addSyntheticLeadingComment(check, ts.SyntaxKind.MultiLineCommentTrivia, ` ${checker.typeToString(isType)} `); 546 | } 547 | 548 | if (options.addParenthesis) { 549 | check = context.factory.createParenthesizedExpression( 550 | check, 551 | ); 552 | } 553 | 554 | if (wrapInIIFE) { 555 | const parameterDeclaration = context.factory.createParameterDeclaration(void 0, void 0, void 0, valueNode as ts.Identifier); 556 | const arrowFunction = context.factory.createArrowFunction(void 0, void 0, [parameterDeclaration], void 0, void 0, check); 557 | check = context.factory.createCallExpression(arrowFunction, void 0, [originalValueNode]); 558 | } 559 | 560 | // TODO: maybe add an optional transformer that inlines `true` stuff? 561 | 562 | return check; 563 | } 564 | -------------------------------------------------------------------------------- /src/transformers/types.ts: -------------------------------------------------------------------------------- 1 | import ts from 'typescript'; 2 | import { IPackageOptions } from '@/config'; 3 | 4 | export type ShouldTransform = ( 5 | node: TNode, 6 | checker: ts.TypeChecker, 7 | context: ts.TransformationContext, 8 | options: IPackageOptions, 9 | ) => boolean; 10 | 11 | export type CreateShouldTransform = (declaration: ts.Declaration) => ShouldTransform; 12 | -------------------------------------------------------------------------------- /src/util/branch.ts: -------------------------------------------------------------------------------- 1 | 2 | export type Index = string | number; 3 | export type Branches R> = Record & { default: T }; 4 | 5 | /** 6 | * helper function to branch on an enum bitmask 7 | * for more info about how Object.keys defines the order 8 | * see: https://www.stefanjudis.com/today-i-learned/property-order-is-predictable-in-javascript-objects-since-es2015/ 9 | */ 10 | export function branch R>, flag?: F) => R>(type: F, branches: Branches) { 11 | const index = Object.keys(branches).find(flag => type & Number(flag)); 12 | const branch = index ? branches[index] : branches.default; 13 | return branch.call(branches); 14 | } 15 | -------------------------------------------------------------------------------- /src/util/log.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface Logger { 3 | debug(...input: unknown[]): void; 4 | log(...input: unknown[]): void; 5 | info(...input: unknown[]): void; 6 | warn(...input: unknown[]): void; 7 | error(...input: unknown[]): void; 8 | assert(condition: boolean, ...input: unknown[]): asserts condition; 9 | } 10 | 11 | // eslint-disable-next-line @typescript-eslint/no-empty-function 12 | function noop(...input: unknown[]) {} 13 | 14 | export class AssertionError extends Error {} 15 | 16 | const noopLogger: Logger = { 17 | debug: noop, 18 | log: noop, 19 | info: noop, 20 | warn: noop, 21 | error: noop, 22 | assert(condition, ...input) { 23 | if (!condition) { 24 | throw new AssertionError('assertion error: ' + input.join(', ')); 25 | } 26 | } 27 | }; 28 | 29 | let _logger: Logger = noopLogger; 30 | 31 | export function useLogger(logger: Logger) { 32 | _logger = logger; 33 | } 34 | 35 | export function log(...input: unknown[]) { 36 | _logger.log(...input); 37 | } 38 | 39 | export function debug(...input: unknown[]) { 40 | _logger.debug(...input); 41 | } 42 | 43 | export function info(...input: unknown[]) { 44 | _logger.info(...input); 45 | } 46 | 47 | export function warn(...input: unknown[]) { 48 | _logger.warn(...input); 49 | } 50 | 51 | export function error(...input: unknown[]) { 52 | _logger.error(...input); 53 | } 54 | 55 | export function assert(condition: boolean, ...input: unknown[]): asserts condition { 56 | _logger.assert(condition, ...input); 57 | if (!condition) { 58 | throw new AssertionError(); 59 | } 60 | } -------------------------------------------------------------------------------- /src/visitors/index.ts: -------------------------------------------------------------------------------- 1 | 2 | import ts from 'typescript'; 3 | import { IPackageOptions } from '@/config'; 4 | import { visitImportDeclaration } from './visitImportDeclaration'; 5 | 6 | export type Visitor = (node: TNode, checker: ts.TypeChecker, context: ts.TransformationContext, options: IPackageOptions) => ts.Node | undefined; 7 | export type MarkedVisitor = Visitor & { kind: TNode['kind'] }; 8 | 9 | export const visitors = [ 10 | visitImportDeclaration, 11 | ] as const; 12 | -------------------------------------------------------------------------------- /src/visitors/visitImportDeclaration.ts: -------------------------------------------------------------------------------- 1 | import ts from 'typescript'; 2 | import { IPackageOptions } from '@/config'; 3 | 4 | visitImportDeclaration.kind = ts.SyntaxKind.ImportDeclaration; 5 | 6 | /** 7 | * checks import declarations to see if it is an import with `PACKAGE_MODULE_SPECIFIER` as module specifier and drops it if it is 8 | */ 9 | export function visitImportDeclaration(node: ts.ImportDeclaration, checker: ts.TypeChecker, context: ts.TransformationContext, options: IPackageOptions) { 10 | // if `node.moduleSpecifier` is not a string literal it is a grammar error so return and let the compiler figure it ut 11 | if (!ts.isStringLiteral(node.moduleSpecifier)) { 12 | return node; 13 | } 14 | 15 | // not the import we are looking for 16 | if (node.moduleSpecifier.text !== options.PackageModuleName) { 17 | return node; 18 | } 19 | 20 | // TODO: do not drop runtime components 21 | 22 | return; 23 | } 24 | -------------------------------------------------------------------------------- /test/createEnvironment.ts: -------------------------------------------------------------------------------- 1 | 2 | import ts from 'typescript'; 3 | import * as tsvfs from '@typescript/vfs'; 4 | 5 | import process from 'process'; 6 | 7 | import RuntimeCheck from '@/transformer'; 8 | import { IPackageOptions } from '@/config'; 9 | import { expect } from 'chai'; 10 | 11 | export interface FileDiagnostic { 12 | file: string; 13 | line: number; 14 | character: number; 15 | message: string; 16 | } 17 | 18 | export interface GeneralDiagnostic { 19 | message: string; 20 | } 21 | 22 | export type Diagnostic = FileDiagnostic | GeneralDiagnostic; 23 | 24 | export type TransformerOptions = Partial & Pick; 25 | 26 | function formatDiagnostic(diagnostic: Diagnostic = { message: 'stub diagnostic' }) { 27 | return typeof (diagnostic as FileDiagnostic).file === 'string' ? `${(diagnostic as FileDiagnostic).file}:${(diagnostic as FileDiagnostic).line}:${(diagnostic as FileDiagnostic).character} ${diagnostic.message}` : diagnostic.message; 28 | } 29 | 30 | function normalizeDiagnostic(diagnostic: ts.Diagnostic): Diagnostic { 31 | if (diagnostic.file) { 32 | const { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start!); 33 | const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'); 34 | return { 35 | file: diagnostic.file.fileName, 36 | line, 37 | character, 38 | message, 39 | }; 40 | } else { 41 | return { 42 | message: diagnostic.messageText as string, 43 | }; 44 | } 45 | } 46 | 47 | export function createEnvironment(options: ts.CompilerOptions, transformerOptions: TransformerOptions) { 48 | const fs = tsvfs.createDefaultMapFromNodeModules(options); 49 | const system = tsvfs.createFSBackedSystem(fs, process.cwd(), ts); 50 | 51 | const host = tsvfs.createVirtualCompilerHost(system, options, ts).compilerHost; 52 | 53 | host.getCurrentDirectory = () => process.cwd(); 54 | 55 | const environment = { 56 | system, 57 | host, 58 | compileString(imports: string[], input: string, inlineTransformerOptions: Partial = {}) { 59 | inlineTransformerOptions = Object.assign({}, transformerOptions, inlineTransformerOptions); 60 | input = input.trim(); 61 | const tempFile = 'test/input.ts'; 62 | const template = ` 63 | import { ${imports.join(', ')} } from "${inlineTransformerOptions.PackageModuleName}"; 64 | 65 | ${input}`; 66 | host.writeFile(tempFile, template, false); 67 | const program = ts.createProgram({ 68 | rootNames: [tempFile], 69 | options, 70 | host, 71 | }); 72 | const { diagnostics } = environment.emit(program, tempFile, inlineTransformerOptions); 73 | environment.assertNoDiagnostics(diagnostics); 74 | const result = system.readFile(tempFile.replace('.ts', '.js')); 75 | if (!result) { 76 | throw new Error(`failed to compile string: '${input}'`); 77 | } 78 | return result; 79 | }, 80 | transformString(imports: string[], input: string, inlineTransformerOptions: Partial = {}) { 81 | inlineTransformerOptions = Object.assign({}, transformerOptions, inlineTransformerOptions); 82 | input = input.trim(); 83 | const tempFile = 'test/input.ts'; 84 | const template = ` 85 | import { ${imports.join(', ')} } from "${inlineTransformerOptions.PackageModuleName}"; 86 | 87 | ${input}`; 88 | host.writeFile(tempFile, template, false); 89 | const program = ts.createProgram({ 90 | rootNames: [tempFile], 91 | options, 92 | host, 93 | }); 94 | const transformerFactory = RuntimeCheck(program, inlineTransformerOptions); 95 | const sourceFile = program.getSourceFile(tempFile); 96 | if (!sourceFile) { 97 | throw new Error(`expected source file for ${tempFile}`); 98 | } 99 | const transformationResult = ts.transform(sourceFile, [transformerFactory], program.getCompilerOptions()); 100 | if (transformationResult.diagnostics) { 101 | environment.assertNoDiagnostics(transformationResult.diagnostics.map(normalizeDiagnostic)); 102 | } 103 | const resultFile = transformationResult.transformed.find(file => file.fileName === tempFile); 104 | if (!resultFile) { 105 | throw new Error(`expected source file for ${tempFile}`); 106 | } 107 | const writer = ts.createTextWriter(host.getNewLine()); 108 | const printer = ts.createPrinter(); 109 | printer.writeFile(resultFile, writer, void 0); 110 | 111 | const result = writer.getText(); 112 | return result; 113 | }, 114 | createProgram(files: string[], compilerOptions: Partial = {}) { 115 | return ts.createProgram({ 116 | rootNames: [...files], 117 | options: Object.assign({}, options, compilerOptions), 118 | host, 119 | }); 120 | }, 121 | emit(program: ts.Program, target?: string | ts.SourceFile, options: Partial = {}, writeFile: ts.WriteFileCallback = host.writeFile) { 122 | if (typeof target === 'string') { 123 | const file = program.getSourceFile(target); 124 | if (file) { 125 | target = file; 126 | } else { 127 | throw new Error(`no source file exits for: '${target}'`); 128 | } 129 | } 130 | 131 | const result = program.emit(target, writeFile, void 0, void 0, { 132 | before: [ 133 | RuntimeCheck(program, Object.assign({}, transformerOptions, options)), 134 | ], 135 | }); 136 | 137 | const diagnostics: Diagnostic[] = [...ts.getPreEmitDiagnostics(program), ...result.diagnostics].map(normalizeDiagnostic); 138 | 139 | return { 140 | diagnostics, 141 | }; 142 | }, 143 | assertNoDiagnostics(diagnostics: Diagnostic[]) { 144 | expect(diagnostics.length).to.equal(0, formatDiagnostic(diagnostics[0])); 145 | }, 146 | }; 147 | 148 | return environment; 149 | } 150 | -------------------------------------------------------------------------------- /test/createModule.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { Module as _Module } from 'module'; 3 | 4 | interface ModuleConstructor { 5 | _nodeModulePaths(directoryPath: string): string[]; 6 | } 7 | 8 | interface ModuleInstance { 9 | _compile(source: string, fileName: string): void; 10 | } 11 | 12 | const Module = _Module as typeof _Module & ModuleConstructor; 13 | 14 | export function createModule>(fileName: string, source: string): InstanceType & { exports: T } { 15 | fileName = path.resolve(process.cwd(), fileName); 16 | const mod = new Module(fileName, require.main) as InstanceType & ModuleInstance; 17 | mod.filename = fileName; 18 | mod.paths = Module._nodeModulePaths(path.dirname(fileName)); 19 | mod._compile(source, fileName); 20 | return mod; 21 | } 22 | -------------------------------------------------------------------------------- /test/index.spec.ts: -------------------------------------------------------------------------------- 1 | import ts from 'typescript'; 2 | import { expect } from 'chai'; 3 | 4 | import { createEnvironment } from './createEnvironment'; 5 | 6 | import { compilerOptions as rootCompilerOptions } from '../tsconfig.json'; 7 | import { compilerOptions as testCompilerOptions } from './tsconfig.json'; 8 | 9 | import { createModule } from './createModule'; 10 | import { readdirSync } from 'fs'; 11 | 12 | function getPrimitiveFileNames() { 13 | return readdirSync('test/primitives', { withFileTypes: true }).filter(type => type.isFile() && type.name.endsWith('.ts')).map(type => type.name.replace('.ts', '')); 14 | } 15 | 16 | function getObjectFileNames() { 17 | return readdirSync('test/objects', { withFileTypes: true }).filter(type => type.isFile() && type.name.endsWith('.ts')).map(type => type.name.replace('.ts', '')); 18 | } 19 | 20 | const PackageModuleName = '@lib'; 21 | const localCompilerOptions: Partial = {}; 22 | 23 | const compilerOptionsResult = ts.convertCompilerOptionsFromJson(Object.assign({}, rootCompilerOptions, testCompilerOptions, localCompilerOptions), '.'); 24 | expect(compilerOptionsResult.errors.length).to.equal(0); 25 | const compilerOptions = compilerOptionsResult.options; 26 | 27 | describe('ts-transform-runtime-check', () => { 28 | const { 29 | system, 30 | host, 31 | createProgram, 32 | emit, 33 | compileString, 34 | transformString, 35 | assertNoDiagnostics, 36 | } = createEnvironment(compilerOptions, { PackageModuleName, debug: true }); 37 | 38 | describe('should generate and execute type checks for primitive values correctly', () => { 39 | const primitives = getPrimitiveFileNames(); 40 | 41 | primitives.forEach((primitive) => { 42 | it(`should generate and execute type checks for '${primitive}' correctly`, () => { 43 | const fileName = `test/primitives/${primitive}.ts`; 44 | const outputName = fileName.replace('.ts', '.js'); 45 | const program = createProgram([fileName]); 46 | const { diagnostics } = emit(program, fileName); 47 | assertNoDiagnostics(diagnostics); 48 | const contents = system.readFile(outputName); 49 | expect(contents).to.be.a('string'); 50 | const mod = createModule<{ test: () => void }>(outputName, contents!); 51 | const { test } = mod.exports; 52 | expect(test).to.be.a('function'); 53 | test(); 54 | }); 55 | }); 56 | }); 57 | 58 | describe('should generate and execute type checks for non-primitive values correctly', () => { 59 | const objects = getObjectFileNames(); 60 | 61 | objects.forEach((object) => { 62 | it(`should generate and execute type checks for '${object}' correctly`, () => { 63 | const fileName = `test/objects/${object}.ts`; 64 | const outputName = fileName.replace('.ts', '.js'); 65 | const program = createProgram([fileName]); 66 | const { diagnostics } = emit(program, fileName); 67 | assertNoDiagnostics(diagnostics); 68 | const contents = system.readFile(outputName); 69 | expect(contents).to.be.a('string'); 70 | const mod = createModule<{ test: () => void }>(outputName, contents!); 71 | const { test } = mod.exports; 72 | expect(test).to.be.a('function'); 73 | test(); 74 | }); 75 | }); 76 | }); 77 | 78 | describe('notepad', () => { 79 | it('notepad', () => { 80 | const result = transformString( 81 | ['is', 'createIs'], 82 | ` 83 | ` 84 | ).trim(); 85 | if (result) { 86 | console.log(result); 87 | } 88 | }); 89 | }); 90 | }); 91 | -------------------------------------------------------------------------------- /test/objects/todo.ts: -------------------------------------------------------------------------------- 1 | 2 | import { is } from '@lib'; 3 | import { expect } from 'chai'; 4 | import { bigint, boolean, cls, fn, number, string, symbol, unique } from '@test/values'; 5 | 6 | // TODO: write tests for ts.TypeFlags.Object and ts.ObjectFlags 7 | 8 | export function test() { 9 | 10 | } 11 | -------------------------------------------------------------------------------- /test/primitives/bigint.ts: -------------------------------------------------------------------------------- 1 | 2 | import { is } from '@lib'; 3 | import { expect } from 'chai'; 4 | import { bigint, boolean, cls, fn, number, string, symbol, unique } from '@test/values'; 5 | 6 | const isTrue = [ 7 | is(bigint), 8 | is(1n), 9 | is<1n>(1n), 10 | ]; 11 | 12 | const isFalse = [ 13 | is(undefined), 14 | is(null), 15 | is(true), 16 | is(false), 17 | is(boolean), 18 | is(number), 19 | is(string), 20 | is(symbol), 21 | is(unique), 22 | is(fn), 23 | is(cls), 24 | is<1n>(1), 25 | is<1n>(2n), 26 | ]; 27 | 28 | export function test() { 29 | isTrue.forEach(entry => expect(entry).to.be.true); 30 | isFalse.forEach(entry => expect(entry).to.be.false); 31 | } 32 | -------------------------------------------------------------------------------- /test/primitives/boolean.ts: -------------------------------------------------------------------------------- 1 | 2 | import { is } from '@lib'; 3 | import { expect } from 'chai'; 4 | import { boolean, cls, fn, number, string } from '@test/values'; 5 | 6 | const shouldBeTrue = [ 7 | [is(true), true], 8 | [is(false), false], 9 | [is(boolean), boolean], 10 | [is(true), true], 11 | [is(false), false], 12 | ] as const; 13 | 14 | const shouldBeFalse = [ 15 | [is(null), null], 16 | [is(number), number], 17 | [is(string), string], 18 | [is(fn), fn], 19 | [is(cls), cls], 20 | [is(1), 1], 21 | [is(0), 0], 22 | [is(void 0), void 0], 23 | [is(undefined), undefined], 24 | [is(null), null], 25 | [is(false), false], 26 | [is(boolean), boolean], 27 | [is(number), number], 28 | [is(string), string], 29 | [is(fn), fn], 30 | [is(cls), cls], 31 | [is(1), 1], 32 | [is(0), 0], 33 | [is(void 0), void 0], 34 | [is(undefined), undefined], 35 | [is(null), null], 36 | [is(true), true], 37 | [is(boolean), boolean], 38 | [is(number), number], 39 | [is(string), string], 40 | [is(fn), fn], 41 | [is(cls), cls], 42 | ] as const; 43 | 44 | export function test() { 45 | shouldBeTrue.forEach(([actual, value], index) => { 46 | expect(actual, `shouldBeTrue[${index}] is<${'T'}>(${value})`).to.be.true; 47 | }); 48 | shouldBeFalse.forEach(([test, value], index) => { 49 | expect(test, `shouldBeFalse[${index}] is<${'T'}>(${value})`).to.be.false; 50 | }); 51 | } 52 | -------------------------------------------------------------------------------- /test/primitives/null.ts: -------------------------------------------------------------------------------- 1 | 2 | import { is } from '@lib'; 3 | import { expect } from 'chai'; 4 | import { boolean, cls, fn, number, string } from '@test/values'; 5 | 6 | const isTrue = [ 7 | is(null), 8 | ]; 9 | 10 | const isFalse = [ 11 | is(undefined), 12 | is(true), 13 | is(false), 14 | is(boolean), 15 | is(number), 16 | is(string), 17 | is(fn), 18 | is(cls), 19 | ]; 20 | 21 | export function test() { 22 | isTrue.forEach(entry => expect(entry).to.be.true); 23 | isFalse.forEach(entry => expect(entry).to.be.false); 24 | } 25 | -------------------------------------------------------------------------------- /test/primitives/number.ts: -------------------------------------------------------------------------------- 1 | 2 | import { is } from '@lib'; 3 | import { expect } from 'chai'; 4 | import { boolean, cls, fn, number, string } from '@test/values'; 5 | 6 | const isTrue = [ 7 | is(number), 8 | is(42), 9 | is<42>(42), 10 | ]; 11 | 12 | const isFalse = [ 13 | is(undefined), 14 | is(null), 15 | is(true), 16 | is(false), 17 | is(boolean), 18 | is(string), 19 | is(fn), 20 | is(cls), 21 | is<42>(24), 22 | ]; 23 | 24 | export function test() { 25 | isTrue.forEach(entry => expect(entry).to.be.true); 26 | isFalse.forEach(entry => expect(entry).to.be.false); 27 | } 28 | -------------------------------------------------------------------------------- /test/primitives/string.ts: -------------------------------------------------------------------------------- 1 | 2 | import { is } from '@lib'; 3 | import { expect } from 'chai'; 4 | import { symbol, unique, bigint, boolean, cls, fn, number, string } from '@test/values'; 5 | 6 | const isTrue = [ 7 | is(string), 8 | is('string'), 9 | is<'string'>('string'), 10 | ]; 11 | 12 | const isFalse = [ 13 | is(undefined), 14 | is(null), 15 | is(true), 16 | is(false), 17 | is(boolean), 18 | is(number), 19 | is(bigint), 20 | is(symbol), 21 | is(unique), 22 | is(fn), 23 | is(cls), 24 | is<'constant'>(string), 25 | ]; 26 | 27 | export function test() { 28 | isTrue.forEach(entry => expect(entry).to.be.true); 29 | isFalse.forEach(entry => expect(entry).to.be.false); 30 | } 31 | -------------------------------------------------------------------------------- /test/primitives/symbol.ts: -------------------------------------------------------------------------------- 1 | 2 | import { is } from '@lib'; 3 | import { expect } from 'chai'; 4 | import { symbol, unique, bigint, boolean, cls, fn, number, string } from '@test/values'; 5 | 6 | const isTrue = [ 7 | is(symbol), 8 | is(unique), 9 | // TODO: support unqiue symbol 10 | // is(unique), 11 | ]; 12 | 13 | const isFalse = [ 14 | is(undefined), 15 | is(null), 16 | is(true), 17 | is(false), 18 | is(boolean), 19 | is(number), 20 | is(string), 21 | is(bigint), 22 | is(symbol), 23 | is(fn), 24 | is(cls), 25 | ]; 26 | 27 | export function test() { 28 | isTrue.forEach(entry => expect(entry).to.be.true); 29 | isFalse.forEach(entry => expect(entry).to.be.false); 30 | } 31 | 32 | -------------------------------------------------------------------------------- /test/primitives/undefined.ts: -------------------------------------------------------------------------------- 1 | 2 | import { is } from '@lib'; 3 | import { expect } from 'chai'; 4 | import { boolean, cls, fn, number, string } from '@test/values'; 5 | 6 | const isTrue = [ 7 | is(undefined), 8 | is(undefined), 9 | is(void 0), 10 | is(void 0), 11 | ]; 12 | 13 | const isFalse = [ 14 | is(null), 15 | is(true), 16 | is(false), 17 | is(boolean), 18 | is(number), 19 | is(string), 20 | is(fn), 21 | is(cls), 22 | is(null), 23 | is(true), 24 | is(false), 25 | is(boolean), 26 | is(number), 27 | is(string), 28 | is(fn), 29 | is(cls), 30 | ]; 31 | 32 | export function test() { 33 | isTrue.forEach(entry => expect(entry).to.be.true); 34 | isFalse.forEach(entry => expect(entry).to.be.false); 35 | } 36 | -------------------------------------------------------------------------------- /test/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "resolveJsonModule": true, 5 | "sourceMap": false, 6 | "declaration": false, 7 | "outDir": "test" 8 | }, 9 | "include": [ 10 | "**/*" 11 | ] 12 | } -------------------------------------------------------------------------------- /test/ttypescript-register.js: -------------------------------------------------------------------------------- 1 | 2 | // based on https://stackoverflow.com/a/57422155/8350696 3 | require('ts-node').register({ compiler: "ttypescript", project: 'test/tsconfig.json' }); 4 | -------------------------------------------------------------------------------- /test/values.ts: -------------------------------------------------------------------------------- 1 | 2 | // The point of this file is to define values that can be reused to ensure all tests use equal values 3 | 4 | export const symbol: symbol = Symbol.for('symbol'); 5 | export const unique: unique symbol = Symbol.for('unique symbol'); 6 | export const boolean: boolean = {} as unknown as boolean; 7 | export const number: number = {} as unknown as number; 8 | export const bigint: bigint = {} as unknown as bigint; 9 | export const string: string = {} as unknown as string; 10 | 11 | export const object: object = {}; 12 | export const record: Record = {}; 13 | export const fn = () => {}; 14 | export const cls = class {}; 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "module": "commonjs", 5 | "lib": [ 6 | "ESNext", 7 | "ESNext.AsyncIterable" 8 | ], 9 | "declaration": true, 10 | "outDir": "lib", 11 | "strict": true, 12 | "esModuleInterop": true, 13 | "experimentalDecorators": true, 14 | "sourceMap": true, 15 | "removeComments": true, 16 | "forceConsistentCasingInFileNames": true, 17 | "baseUrl": ".", 18 | "paths": { 19 | "@lib": ["lib/"], 20 | "@/*": ["src/*"], 21 | "@test/*": ["test/*"] 22 | }, 23 | "plugins": [ 24 | { "transform": "@zerollup/ts-transform-paths" } 25 | ] 26 | }, 27 | "include": [ 28 | "src/**/*.ts" 29 | ], 30 | "exclude": [ 31 | "lib/**/*" 32 | ] 33 | } -------------------------------------------------------------------------------- /yarn-error.log: -------------------------------------------------------------------------------- 1 | Arguments: 2 | C:\Program Files\nodejs\node.exe C:\Program Files\nodejs\node_modules\yarn\bin\yarn.js publish 3 | 4 | PATH: 5 | C:\Program Files\Git\mingw64\bin;C:\Program Files\Git\usr\bin;C:\Users\kevin\bin;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;C:\ProgramData\chocolatey\bin;C:\Program Files\Java\jdk1.8.0_211\bin;C:\Program Files\Microsoft VS Code\bin;%NVM_HOME%;%NVM_SYMLINK%;C:\Program Files\Go\bin;C:\Program Files\Git\cmd;C:\Users\kevin\AppData\Local\Programs\Python\Python39\Scripts;C:\Users\kevin\AppData\Local\Programs\Python\Python39;C:\Users\kevin\AppData\Local\Microsoft\WindowsApps;C:\Users\kevin\AppData\Roaming\nvm;C:\Program Files\nodejs;C:\Users\kevin\go\bin 6 | 7 | Yarn version: 8 | 1.22.10 9 | 10 | Node version: 11 | 15.11.0 12 | 13 | Platform: 14 | win32 x64 15 | 16 | Trace: 17 | Error: canceled 18 | at Interface. (C:\Users\kevin\AppData\Roaming\nvm\v15.11.0\node_modules\yarn\lib\cli.js:136216:13) 19 | at Interface.emit (node:events:378:20) 20 | at Interface._ttyWrite (node:readline:973:16) 21 | at ReadStream.onkeypress (node:readline:259:10) 22 | at ReadStream.emit (node:events:378:20) 23 | at emitKeys (node:internal/readline/utils:358:14) 24 | at emitKeys.next () 25 | at ReadStream.onData (node:readline:1242:36) 26 | at ReadStream.emit (node:events:378:20) 27 | at addChunk (node:internal/streams/readable:313:12) 28 | 29 | npm manifest: 30 | { 31 | "name": "ts-transform-runtime-check", 32 | "version": "0.0.1-alpha21", 33 | "main": "lib/index.js", 34 | "types": "lib/index.d.ts", 35 | "readme": "readme.md", 36 | "license": "MIT", 37 | "keywords": [ 38 | "typescript", 39 | "typescript-transform", 40 | "ts-transform", 41 | "ts-transformer", 42 | "ts-compiler-api", 43 | "runtime", 44 | "typecheck" 45 | ], 46 | "description": "Typescript AST transformer to generate type checks at compile time", 47 | "scripts": { 48 | "build": "ttsc", 49 | "lint": "eslint . --ext .ts", 50 | "test": "mocha --timeout 0 -r tsconfig-paths/register", 51 | "bin:transform": "./node_modules/.bin/ts-node -C ttypescript -r tsconfig-paths/register ./bin/transform.ts" 52 | }, 53 | "author": "Kevin Ramharak ", 54 | "repository": { 55 | "type": "git", 56 | "url": "https://https://github.com/kevinramharak/ts-transform-runtime-check.git" 57 | }, 58 | "ts-node": { 59 | "compiler": "ttypescript" 60 | }, 61 | "devDependencies": { 62 | "@types/chai": "^4.2.14", 63 | "@types/mocha": "^8.2.0", 64 | "@types/node": "^14.14.22", 65 | "@typescript-eslint/eslint-plugin": "^4.17.0", 66 | "@typescript-eslint/parser": "^4.17.0", 67 | "@typescript/vfs": "^1.3.2", 68 | "@zerollup/ts-transform-paths": "^1.7.18", 69 | "chai": "^4.2.0", 70 | "eslint": "^7.21.0", 71 | "mocha": "^8.2.1", 72 | "ts-expose-internals": "^4.1.3", 73 | "ts-node": "^9.1.1", 74 | "ts-transform-runtime-check": "^0.0.1-alpha19", 75 | "tsconfig-paths": "^3.9.0", 76 | "ttypescript": "^1.5.12", 77 | "typescript": "^4.2.3" 78 | } 79 | } 80 | 81 | yarn manifest: 82 | No manifest 83 | 84 | Lockfile: 85 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 86 | # yarn lockfile v1 87 | 88 | 89 | "@babel/code-frame@7.12.11": 90 | "integrity" "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==" 91 | "resolved" "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" 92 | "version" "7.12.11" 93 | dependencies: 94 | "@babel/highlight" "^7.10.4" 95 | 96 | "@babel/helper-validator-identifier@^7.12.11": 97 | "integrity" "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" 98 | "resolved" "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz" 99 | "version" "7.12.11" 100 | 101 | "@babel/highlight@^7.10.4": 102 | "integrity" "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==" 103 | "resolved" "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz" 104 | "version" "7.13.10" 105 | dependencies: 106 | "@babel/helper-validator-identifier" "^7.12.11" 107 | "chalk" "^2.0.0" 108 | "js-tokens" "^4.0.0" 109 | 110 | "@eslint/eslintrc@^0.4.0": 111 | "integrity" "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==" 112 | "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz" 113 | "version" "0.4.0" 114 | dependencies: 115 | "ajv" "^6.12.4" 116 | "debug" "^4.1.1" 117 | "espree" "^7.3.0" 118 | "globals" "^12.1.0" 119 | "ignore" "^4.0.6" 120 | "import-fresh" "^3.2.1" 121 | "js-yaml" "^3.13.1" 122 | "minimatch" "^3.0.4" 123 | "strip-json-comments" "^3.1.1" 124 | 125 | "@nodelib/fs.scandir@2.1.4": 126 | "integrity" "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==" 127 | "resolved" "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz" 128 | "version" "2.1.4" 129 | dependencies: 130 | "@nodelib/fs.stat" "2.0.4" 131 | "run-parallel" "^1.1.9" 132 | 133 | "@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.4": 134 | "integrity" "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==" 135 | "resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz" 136 | "version" "2.0.4" 137 | 138 | "@nodelib/fs.walk@^1.2.3": 139 | "integrity" "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==" 140 | "resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz" 141 | "version" "1.2.6" 142 | dependencies: 143 | "@nodelib/fs.scandir" "2.1.4" 144 | "fastq" "^1.6.0" 145 | 146 | "@types/chai@^4.2.14": 147 | "integrity" "sha512-G+ITQPXkwTrslfG5L/BksmbLUA0M1iybEsmCWPqzSxsRRhJZimBKJkoMi8fr/CPygPTj4zO5pJH7I2/cm9M7SQ==" 148 | "resolved" "https://registry.npmjs.org/@types/chai/-/chai-4.2.14.tgz" 149 | "version" "4.2.14" 150 | 151 | "@types/json-schema@^7.0.3": 152 | "integrity" "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==" 153 | "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz" 154 | "version" "7.0.7" 155 | 156 | "@types/json5@^0.0.29": 157 | "integrity" "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" 158 | "resolved" "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" 159 | "version" "0.0.29" 160 | 161 | "@types/mocha@^8.2.0": 162 | "integrity" "sha512-/Sge3BymXo4lKc31C8OINJgXLaw+7vL1/L1pGiBNpGrBiT8FQiaFpSYV0uhTaG4y78vcMBTMFsWaHDvuD+xGzQ==" 163 | "resolved" "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.0.tgz" 164 | "version" "8.2.0" 165 | 166 | "@types/node@^14.14.22": 167 | "integrity" "sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==" 168 | "resolved" "https://registry.npmjs.org/@types/node/-/node-14.14.22.tgz" 169 | "version" "14.14.22" 170 | 171 | "@typescript-eslint/eslint-plugin@^4.17.0": 172 | "integrity" "sha512-/fKFDcoHg8oNan39IKFOb5WmV7oWhQe1K6CDaAVfJaNWEhmfqlA24g+u1lqU5bMH7zuNasfMId4LaYWC5ijRLw==" 173 | "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.17.0.tgz" 174 | "version" "4.17.0" 175 | dependencies: 176 | "@typescript-eslint/experimental-utils" "4.17.0" 177 | "@typescript-eslint/scope-manager" "4.17.0" 178 | "debug" "^4.1.1" 179 | "functional-red-black-tree" "^1.0.1" 180 | "lodash" "^4.17.15" 181 | "regexpp" "^3.0.0" 182 | "semver" "^7.3.2" 183 | "tsutils" "^3.17.1" 184 | 185 | "@typescript-eslint/experimental-utils@4.17.0": 186 | "integrity" "sha512-ZR2NIUbnIBj+LGqCFGQ9yk2EBQrpVVFOh9/Kd0Lm6gLpSAcCuLLe5lUCibKGCqyH9HPwYC0GIJce2O1i8VYmWA==" 187 | "resolved" "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.17.0.tgz" 188 | "version" "4.17.0" 189 | dependencies: 190 | "@types/json-schema" "^7.0.3" 191 | "@typescript-eslint/scope-manager" "4.17.0" 192 | "@typescript-eslint/types" "4.17.0" 193 | "@typescript-eslint/typescript-estree" "4.17.0" 194 | "eslint-scope" "^5.0.0" 195 | "eslint-utils" "^2.0.0" 196 | 197 | "@typescript-eslint/parser@^4.0.0", "@typescript-eslint/parser@^4.17.0": 198 | "integrity" "sha512-KYdksiZQ0N1t+6qpnl6JeK9ycCFprS9xBAiIrw4gSphqONt8wydBw4BXJi3C11ywZmyHulvMaLjWsxDjUSDwAw==" 199 | "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.17.0.tgz" 200 | "version" "4.17.0" 201 | dependencies: 202 | "@typescript-eslint/scope-manager" "4.17.0" 203 | "@typescript-eslint/types" "4.17.0" 204 | "@typescript-eslint/typescript-estree" "4.17.0" 205 | "debug" "^4.1.1" 206 | 207 | "@typescript-eslint/scope-manager@4.17.0": 208 | "integrity" "sha512-OJ+CeTliuW+UZ9qgULrnGpPQ1bhrZNFpfT/Bc0pzNeyZwMik7/ykJ0JHnQ7krHanFN9wcnPK89pwn84cRUmYjw==" 209 | "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.17.0.tgz" 210 | "version" "4.17.0" 211 | dependencies: 212 | "@typescript-eslint/types" "4.17.0" 213 | "@typescript-eslint/visitor-keys" "4.17.0" 214 | 215 | "@typescript-eslint/types@4.17.0": 216 | "integrity" "sha512-RN5z8qYpJ+kXwnLlyzZkiJwfW2AY458Bf8WqllkondQIcN2ZxQowAToGSd9BlAUZDB5Ea8I6mqL2quGYCLT+2g==" 217 | "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.17.0.tgz" 218 | "version" "4.17.0" 219 | 220 | "@typescript-eslint/typescript-estree@4.17.0": 221 | "integrity" "sha512-lRhSFIZKUEPPWpWfwuZBH9trYIEJSI0vYsrxbvVvNyIUDoKWaklOAelsSkeh3E2VBSZiNe9BZ4E5tYBZbUczVQ==" 222 | "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.17.0.tgz" 223 | "version" "4.17.0" 224 | dependencies: 225 | "@typescript-eslint/types" "4.17.0" 226 | "@typescript-eslint/visitor-keys" "4.17.0" 227 | "debug" "^4.1.1" 228 | "globby" "^11.0.1" 229 | "is-glob" "^4.0.1" 230 | "semver" "^7.3.2" 231 | "tsutils" "^3.17.1" 232 | 233 | "@typescript-eslint/visitor-keys@4.17.0": 234 | "integrity" "sha512-WfuMN8mm5SSqXuAr9NM+fItJ0SVVphobWYkWOwQ1odsfC014Vdxk/92t4JwS1Q6fCA/ABfCKpa3AVtpUKTNKGQ==" 235 | "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.17.0.tgz" 236 | "version" "4.17.0" 237 | dependencies: 238 | "@typescript-eslint/types" "4.17.0" 239 | "eslint-visitor-keys" "^2.0.0" 240 | 241 | "@typescript/vfs@^1.3.2": 242 | "integrity" "sha512-1moNIcxUtDextSNvhGtJcmNZX8gZgRBcea2UlRmKI7TX3fRZ4lHCharaDQUQeguk1rrqxCfOifFZg+Rx/Mi7Lw==" 243 | "resolved" "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.3.2.tgz" 244 | "version" "1.3.2" 245 | dependencies: 246 | "debug" "^4.1.1" 247 | 248 | "@ungap/promise-all-settled@1.1.2": 249 | "integrity" "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" 250 | "resolved" "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" 251 | "version" "1.1.2" 252 | 253 | "@zerollup/ts-helpers@^1.7.18": 254 | "integrity" "sha512-S9zN+y+i5yN/evfWquzSO3lubqPXIsPQf6p9OiPMpRxDx/0totPLF39XoRw48Dav5dSvbIE8D2eAPpXXJxvKwg==" 255 | "resolved" "https://registry.npmjs.org/@zerollup/ts-helpers/-/ts-helpers-1.7.18.tgz" 256 | "version" "1.7.18" 257 | dependencies: 258 | "resolve" "^1.12.0" 259 | 260 | "@zerollup/ts-transform-paths@^1.7.18": 261 | "integrity" "sha512-YPVUxvWQVzRx1OBN0Pmkd58+R9FcfUJuwTaPUSoi5rKxuXMtxevTXdfi0w5mEaIH8b0DfL+wg0wFDHiJE+S2zA==" 262 | "resolved" "https://registry.npmjs.org/@zerollup/ts-transform-paths/-/ts-transform-paths-1.7.18.tgz" 263 | "version" "1.7.18" 264 | dependencies: 265 | "@zerollup/ts-helpers" "^1.7.18" 266 | 267 | "acorn-jsx@^5.3.1": 268 | "integrity" "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==" 269 | "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz" 270 | "version" "5.3.1" 271 | 272 | "acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^7.4.0": 273 | "integrity" "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" 274 | "resolved" "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" 275 | "version" "7.4.1" 276 | 277 | "ajv@^6.10.0", "ajv@^6.12.4": 278 | "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" 279 | "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" 280 | "version" "6.12.6" 281 | dependencies: 282 | "fast-deep-equal" "^3.1.1" 283 | "fast-json-stable-stringify" "^2.0.0" 284 | "json-schema-traverse" "^0.4.1" 285 | "uri-js" "^4.2.2" 286 | 287 | "ajv@^7.0.2": 288 | "integrity" "sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ==" 289 | "resolved" "https://registry.npmjs.org/ajv/-/ajv-7.2.1.tgz" 290 | "version" "7.2.1" 291 | dependencies: 292 | "fast-deep-equal" "^3.1.1" 293 | "json-schema-traverse" "^1.0.0" 294 | "require-from-string" "^2.0.2" 295 | "uri-js" "^4.2.2" 296 | 297 | "ansi-colors@^4.1.1", "ansi-colors@4.1.1": 298 | "integrity" "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" 299 | "resolved" "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" 300 | "version" "4.1.1" 301 | 302 | "ansi-regex@^3.0.0": 303 | "integrity" "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 304 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" 305 | "version" "3.0.0" 306 | 307 | "ansi-regex@^4.1.0": 308 | "integrity" "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 309 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz" 310 | "version" "4.1.0" 311 | 312 | "ansi-regex@^5.0.0": 313 | "integrity" "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" 314 | "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz" 315 | "version" "5.0.0" 316 | 317 | "ansi-styles@^3.2.0", "ansi-styles@^3.2.1": 318 | "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" 319 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 320 | "version" "3.2.1" 321 | dependencies: 322 | "color-convert" "^1.9.0" 323 | 324 | "ansi-styles@^4.0.0": 325 | "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" 326 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 327 | "version" "4.3.0" 328 | dependencies: 329 | "color-convert" "^2.0.1" 330 | 331 | "ansi-styles@^4.1.0": 332 | "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" 333 | "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 334 | "version" "4.3.0" 335 | dependencies: 336 | "color-convert" "^2.0.1" 337 | 338 | "anymatch@~3.1.1": 339 | "integrity" "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==" 340 | "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz" 341 | "version" "3.1.1" 342 | dependencies: 343 | "normalize-path" "^3.0.0" 344 | "picomatch" "^2.0.4" 345 | 346 | "arg@^4.1.0": 347 | "integrity" "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" 348 | "resolved" "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" 349 | "version" "4.1.3" 350 | 351 | "argparse@^1.0.7": 352 | "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" 353 | "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" 354 | "version" "1.0.10" 355 | dependencies: 356 | "sprintf-js" "~1.0.2" 357 | 358 | "array-union@^2.1.0": 359 | "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" 360 | "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" 361 | "version" "2.1.0" 362 | 363 | "assertion-error@^1.1.0": 364 | "integrity" "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" 365 | "resolved" "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" 366 | "version" "1.1.0" 367 | 368 | "astral-regex@^2.0.0": 369 | "integrity" "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" 370 | "resolved" "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" 371 | "version" "2.0.0" 372 | 373 | "balanced-match@^1.0.0": 374 | "integrity" "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 375 | "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" 376 | "version" "1.0.0" 377 | 378 | "binary-extensions@^2.0.0": 379 | "integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" 380 | "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" 381 | "version" "2.2.0" 382 | 383 | "brace-expansion@^1.1.7": 384 | "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" 385 | "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 386 | "version" "1.1.11" 387 | dependencies: 388 | "balanced-match" "^1.0.0" 389 | "concat-map" "0.0.1" 390 | 391 | "braces@^3.0.1", "braces@~3.0.2": 392 | "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" 393 | "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" 394 | "version" "3.0.2" 395 | dependencies: 396 | "fill-range" "^7.0.1" 397 | 398 | "browser-stdout@1.3.1": 399 | "integrity" "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" 400 | "resolved" "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" 401 | "version" "1.3.1" 402 | 403 | "buffer-from@^1.0.0": 404 | "integrity" "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 405 | "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz" 406 | "version" "1.1.1" 407 | 408 | "callsites@^3.0.0": 409 | "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" 410 | "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" 411 | "version" "3.1.0" 412 | 413 | "camelcase@^5.0.0": 414 | "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 415 | "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" 416 | "version" "5.3.1" 417 | 418 | "camelcase@^6.0.0": 419 | "integrity" "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" 420 | "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz" 421 | "version" "6.2.0" 422 | 423 | "chai@^4.2.0": 424 | "integrity" "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==" 425 | "resolved" "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz" 426 | "version" "4.2.0" 427 | dependencies: 428 | "assertion-error" "^1.1.0" 429 | "check-error" "^1.0.2" 430 | "deep-eql" "^3.0.1" 431 | "get-func-name" "^2.0.0" 432 | "pathval" "^1.1.0" 433 | "type-detect" "^4.0.5" 434 | 435 | "chalk@^2.0.0": 436 | "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" 437 | "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 438 | "version" "2.4.2" 439 | dependencies: 440 | "ansi-styles" "^3.2.1" 441 | "escape-string-regexp" "^1.0.5" 442 | "supports-color" "^5.3.0" 443 | 444 | "chalk@^4.0.0": 445 | "integrity" "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==" 446 | "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" 447 | "version" "4.1.0" 448 | dependencies: 449 | "ansi-styles" "^4.1.0" 450 | "supports-color" "^7.1.0" 451 | 452 | "check-error@^1.0.2": 453 | "integrity" "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" 454 | "resolved" "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" 455 | "version" "1.0.2" 456 | 457 | "chokidar@3.4.3": 458 | "integrity" "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==" 459 | "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz" 460 | "version" "3.4.3" 461 | dependencies: 462 | "anymatch" "~3.1.1" 463 | "braces" "~3.0.2" 464 | "glob-parent" "~5.1.0" 465 | "is-binary-path" "~2.1.0" 466 | "is-glob" "~4.0.1" 467 | "normalize-path" "~3.0.0" 468 | "readdirp" "~3.5.0" 469 | optionalDependencies: 470 | "fsevents" "~2.1.2" 471 | 472 | "cliui@^5.0.0": 473 | "integrity" "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==" 474 | "resolved" "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" 475 | "version" "5.0.0" 476 | dependencies: 477 | "string-width" "^3.1.0" 478 | "strip-ansi" "^5.2.0" 479 | "wrap-ansi" "^5.1.0" 480 | 481 | "color-convert@^1.9.0": 482 | "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" 483 | "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 484 | "version" "1.9.3" 485 | dependencies: 486 | "color-name" "1.1.3" 487 | 488 | "color-convert@^2.0.1": 489 | "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" 490 | "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 491 | "version" "2.0.1" 492 | dependencies: 493 | "color-name" "~1.1.4" 494 | 495 | "color-name@~1.1.4": 496 | "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 497 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 498 | "version" "1.1.4" 499 | 500 | "color-name@1.1.3": 501 | "integrity" "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 502 | "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 503 | "version" "1.1.3" 504 | 505 | "concat-map@0.0.1": 506 | "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 507 | "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 508 | "version" "0.0.1" 509 | 510 | "create-require@^1.1.0": 511 | "integrity" "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" 512 | "resolved" "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" 513 | "version" "1.1.1" 514 | 515 | "cross-spawn@^7.0.2": 516 | "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" 517 | "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" 518 | "version" "7.0.3" 519 | dependencies: 520 | "path-key" "^3.1.0" 521 | "shebang-command" "^2.0.0" 522 | "which" "^2.0.1" 523 | 524 | "debug@^4.0.1", "debug@^4.1.1": 525 | "integrity" "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==" 526 | "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" 527 | "version" "4.3.1" 528 | dependencies: 529 | "ms" "2.1.2" 530 | 531 | "debug@4.2.0": 532 | "integrity" "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==" 533 | "resolved" "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz" 534 | "version" "4.2.0" 535 | dependencies: 536 | "ms" "2.1.2" 537 | 538 | "decamelize@^1.2.0": 539 | "integrity" "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 540 | "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" 541 | "version" "1.2.0" 542 | 543 | "decamelize@^4.0.0": 544 | "integrity" "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" 545 | "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" 546 | "version" "4.0.0" 547 | 548 | "deep-eql@^3.0.1": 549 | "integrity" "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==" 550 | "resolved" "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" 551 | "version" "3.0.1" 552 | dependencies: 553 | "type-detect" "^4.0.0" 554 | 555 | "deep-is@^0.1.3": 556 | "integrity" "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 557 | "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" 558 | "version" "0.1.3" 559 | 560 | "diff@^4.0.1", "diff@4.0.2": 561 | "integrity" "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" 562 | "resolved" "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" 563 | "version" "4.0.2" 564 | 565 | "dir-glob@^3.0.1": 566 | "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==" 567 | "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" 568 | "version" "3.0.1" 569 | dependencies: 570 | "path-type" "^4.0.0" 571 | 572 | "doctrine@^3.0.0": 573 | "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==" 574 | "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" 575 | "version" "3.0.0" 576 | dependencies: 577 | "esutils" "^2.0.2" 578 | 579 | "emoji-regex@^7.0.1": 580 | "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 581 | "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" 582 | "version" "7.0.3" 583 | 584 | "emoji-regex@^8.0.0": 585 | "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 586 | "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 587 | "version" "8.0.0" 588 | 589 | "enquirer@^2.3.5": 590 | "integrity" "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==" 591 | "resolved" "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" 592 | "version" "2.3.6" 593 | dependencies: 594 | "ansi-colors" "^4.1.1" 595 | 596 | "escape-string-regexp@^1.0.5": 597 | "integrity" "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 598 | "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 599 | "version" "1.0.5" 600 | 601 | "escape-string-regexp@4.0.0": 602 | "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" 603 | "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" 604 | "version" "4.0.0" 605 | 606 | "eslint-scope@^5.0.0", "eslint-scope@^5.1.1": 607 | "integrity" "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==" 608 | "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" 609 | "version" "5.1.1" 610 | dependencies: 611 | "esrecurse" "^4.3.0" 612 | "estraverse" "^4.1.1" 613 | 614 | "eslint-utils@^2.0.0", "eslint-utils@^2.1.0": 615 | "integrity" "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==" 616 | "resolved" "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" 617 | "version" "2.1.0" 618 | dependencies: 619 | "eslint-visitor-keys" "^1.1.0" 620 | 621 | "eslint-visitor-keys@^1.1.0", "eslint-visitor-keys@^1.3.0": 622 | "integrity" "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" 623 | "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" 624 | "version" "1.3.0" 625 | 626 | "eslint-visitor-keys@^2.0.0": 627 | "integrity" "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==" 628 | "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz" 629 | "version" "2.0.0" 630 | 631 | "eslint@*", "eslint@^5.0.0 || ^6.0.0 || ^7.0.0", "eslint@^7.21.0": 632 | "integrity" "sha512-W2aJbXpMNofUp0ztQaF40fveSsJBjlSCSWpy//gzfTvwC+USs/nceBrKmlJOiM8r1bLwP2EuYkCqArn/6QTIgg==" 633 | "resolved" "https://registry.npmjs.org/eslint/-/eslint-7.21.0.tgz" 634 | "version" "7.21.0" 635 | dependencies: 636 | "@babel/code-frame" "7.12.11" 637 | "@eslint/eslintrc" "^0.4.0" 638 | "ajv" "^6.10.0" 639 | "chalk" "^4.0.0" 640 | "cross-spawn" "^7.0.2" 641 | "debug" "^4.0.1" 642 | "doctrine" "^3.0.0" 643 | "enquirer" "^2.3.5" 644 | "eslint-scope" "^5.1.1" 645 | "eslint-utils" "^2.1.0" 646 | "eslint-visitor-keys" "^2.0.0" 647 | "espree" "^7.3.1" 648 | "esquery" "^1.4.0" 649 | "esutils" "^2.0.2" 650 | "file-entry-cache" "^6.0.1" 651 | "functional-red-black-tree" "^1.0.1" 652 | "glob-parent" "^5.0.0" 653 | "globals" "^12.1.0" 654 | "ignore" "^4.0.6" 655 | "import-fresh" "^3.0.0" 656 | "imurmurhash" "^0.1.4" 657 | "is-glob" "^4.0.0" 658 | "js-yaml" "^3.13.1" 659 | "json-stable-stringify-without-jsonify" "^1.0.1" 660 | "levn" "^0.4.1" 661 | "lodash" "^4.17.20" 662 | "minimatch" "^3.0.4" 663 | "natural-compare" "^1.4.0" 664 | "optionator" "^0.9.1" 665 | "progress" "^2.0.0" 666 | "regexpp" "^3.1.0" 667 | "semver" "^7.2.1" 668 | "strip-ansi" "^6.0.0" 669 | "strip-json-comments" "^3.1.0" 670 | "table" "^6.0.4" 671 | "text-table" "^0.2.0" 672 | "v8-compile-cache" "^2.0.3" 673 | 674 | "espree@^7.3.0", "espree@^7.3.1": 675 | "integrity" "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==" 676 | "resolved" "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" 677 | "version" "7.3.1" 678 | dependencies: 679 | "acorn" "^7.4.0" 680 | "acorn-jsx" "^5.3.1" 681 | "eslint-visitor-keys" "^1.3.0" 682 | 683 | "esprima@^4.0.0": 684 | "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 685 | "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" 686 | "version" "4.0.1" 687 | 688 | "esquery@^1.4.0": 689 | "integrity" "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==" 690 | "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" 691 | "version" "1.4.0" 692 | dependencies: 693 | "estraverse" "^5.1.0" 694 | 695 | "esrecurse@^4.3.0": 696 | "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==" 697 | "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" 698 | "version" "4.3.0" 699 | dependencies: 700 | "estraverse" "^5.2.0" 701 | 702 | "estraverse@^4.1.1": 703 | "integrity" "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" 704 | "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" 705 | "version" "4.3.0" 706 | 707 | "estraverse@^5.1.0", "estraverse@^5.2.0": 708 | "integrity" "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" 709 | "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" 710 | "version" "5.2.0" 711 | 712 | "esutils@^2.0.2": 713 | "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" 714 | "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" 715 | "version" "2.0.3" 716 | 717 | "fast-deep-equal@^3.1.1": 718 | "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" 719 | "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" 720 | "version" "3.1.3" 721 | 722 | "fast-glob@^3.1.1": 723 | "integrity" "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==" 724 | "resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz" 725 | "version" "3.2.5" 726 | dependencies: 727 | "@nodelib/fs.stat" "^2.0.2" 728 | "@nodelib/fs.walk" "^1.2.3" 729 | "glob-parent" "^5.1.0" 730 | "merge2" "^1.3.0" 731 | "micromatch" "^4.0.2" 732 | "picomatch" "^2.2.1" 733 | 734 | "fast-json-stable-stringify@^2.0.0": 735 | "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" 736 | "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 737 | "version" "2.1.0" 738 | 739 | "fast-levenshtein@^2.0.6": 740 | "integrity" "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 741 | "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" 742 | "version" "2.0.6" 743 | 744 | "fastq@^1.6.0": 745 | "integrity" "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==" 746 | "resolved" "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz" 747 | "version" "1.11.0" 748 | dependencies: 749 | "reusify" "^1.0.4" 750 | 751 | "file-entry-cache@^6.0.1": 752 | "integrity" "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==" 753 | "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" 754 | "version" "6.0.1" 755 | dependencies: 756 | "flat-cache" "^3.0.4" 757 | 758 | "fill-range@^7.0.1": 759 | "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" 760 | "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" 761 | "version" "7.0.1" 762 | dependencies: 763 | "to-regex-range" "^5.0.1" 764 | 765 | "find-up@^3.0.0": 766 | "integrity" "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==" 767 | "resolved" "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" 768 | "version" "3.0.0" 769 | dependencies: 770 | "locate-path" "^3.0.0" 771 | 772 | "find-up@5.0.0": 773 | "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==" 774 | "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" 775 | "version" "5.0.0" 776 | dependencies: 777 | "locate-path" "^6.0.0" 778 | "path-exists" "^4.0.0" 779 | 780 | "flat-cache@^3.0.4": 781 | "integrity" "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==" 782 | "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" 783 | "version" "3.0.4" 784 | dependencies: 785 | "flatted" "^3.1.0" 786 | "rimraf" "^3.0.2" 787 | 788 | "flat@^5.0.2": 789 | "integrity" "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" 790 | "resolved" "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" 791 | "version" "5.0.2" 792 | 793 | "flatted@^3.1.0": 794 | "integrity" "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==" 795 | "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz" 796 | "version" "3.1.1" 797 | 798 | "fs.realpath@^1.0.0": 799 | "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 800 | "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 801 | "version" "1.0.0" 802 | 803 | "function-bind@^1.1.1": 804 | "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 805 | "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" 806 | "version" "1.1.1" 807 | 808 | "functional-red-black-tree@^1.0.1": 809 | "integrity" "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" 810 | "resolved" "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" 811 | "version" "1.0.1" 812 | 813 | "get-caller-file@^2.0.1": 814 | "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 815 | "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" 816 | "version" "2.0.5" 817 | 818 | "get-func-name@^2.0.0": 819 | "integrity" "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" 820 | "resolved" "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" 821 | "version" "2.0.0" 822 | 823 | "glob-parent@^5.0.0", "glob-parent@^5.1.0": 824 | "integrity" "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==" 825 | "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 826 | "version" "5.1.2" 827 | dependencies: 828 | "is-glob" "^4.0.1" 829 | 830 | "glob-parent@~5.1.0": 831 | "integrity" "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==" 832 | "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz" 833 | "version" "5.1.1" 834 | dependencies: 835 | "is-glob" "^4.0.1" 836 | 837 | "glob@^7.1.3", "glob@7.1.6": 838 | "integrity" "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==" 839 | "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" 840 | "version" "7.1.6" 841 | dependencies: 842 | "fs.realpath" "^1.0.0" 843 | "inflight" "^1.0.4" 844 | "inherits" "2" 845 | "minimatch" "^3.0.4" 846 | "once" "^1.3.0" 847 | "path-is-absolute" "^1.0.0" 848 | 849 | "globals@^12.1.0": 850 | "integrity" "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==" 851 | "resolved" "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz" 852 | "version" "12.4.0" 853 | dependencies: 854 | "type-fest" "^0.8.1" 855 | 856 | "globby@^11.0.1": 857 | "integrity" "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==" 858 | "resolved" "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz" 859 | "version" "11.0.2" 860 | dependencies: 861 | "array-union" "^2.1.0" 862 | "dir-glob" "^3.0.1" 863 | "fast-glob" "^3.1.1" 864 | "ignore" "^5.1.4" 865 | "merge2" "^1.3.0" 866 | "slash" "^3.0.0" 867 | 868 | "growl@1.10.5": 869 | "integrity" "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" 870 | "resolved" "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" 871 | "version" "1.10.5" 872 | 873 | "has-flag@^3.0.0": 874 | "integrity" "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 875 | "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 876 | "version" "3.0.0" 877 | 878 | "has-flag@^4.0.0": 879 | "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" 880 | "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" 881 | "version" "4.0.0" 882 | 883 | "has@^1.0.3": 884 | "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" 885 | "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 886 | "version" "1.0.3" 887 | dependencies: 888 | "function-bind" "^1.1.1" 889 | 890 | "he@1.2.0": 891 | "integrity" "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 892 | "resolved" "https://registry.npmjs.org/he/-/he-1.2.0.tgz" 893 | "version" "1.2.0" 894 | 895 | "ignore@^4.0.6": 896 | "integrity" "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" 897 | "resolved" "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" 898 | "version" "4.0.6" 899 | 900 | "ignore@^5.1.4": 901 | "integrity" "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" 902 | "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz" 903 | "version" "5.1.8" 904 | 905 | "import-fresh@^3.0.0", "import-fresh@^3.2.1": 906 | "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==" 907 | "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" 908 | "version" "3.3.0" 909 | dependencies: 910 | "parent-module" "^1.0.0" 911 | "resolve-from" "^4.0.0" 912 | 913 | "imurmurhash@^0.1.4": 914 | "integrity" "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 915 | "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 916 | "version" "0.1.4" 917 | 918 | "inflight@^1.0.4": 919 | "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=" 920 | "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 921 | "version" "1.0.6" 922 | dependencies: 923 | "once" "^1.3.0" 924 | "wrappy" "1" 925 | 926 | "inherits@2": 927 | "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 928 | "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 929 | "version" "2.0.4" 930 | 931 | "is-binary-path@~2.1.0": 932 | "integrity" "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==" 933 | "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" 934 | "version" "2.1.0" 935 | dependencies: 936 | "binary-extensions" "^2.0.0" 937 | 938 | "is-core-module@^2.2.0": 939 | "integrity" "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==" 940 | "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz" 941 | "version" "2.2.0" 942 | dependencies: 943 | "has" "^1.0.3" 944 | 945 | "is-extglob@^2.1.1": 946 | "integrity" "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 947 | "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 948 | "version" "2.1.1" 949 | 950 | "is-fullwidth-code-point@^2.0.0": 951 | "integrity" "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 952 | "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" 953 | "version" "2.0.0" 954 | 955 | "is-fullwidth-code-point@^3.0.0": 956 | "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 957 | "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 958 | "version" "3.0.0" 959 | 960 | "is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@~4.0.1": 961 | "integrity" "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==" 962 | "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" 963 | "version" "4.0.1" 964 | dependencies: 965 | "is-extglob" "^2.1.1" 966 | 967 | "is-number@^7.0.0": 968 | "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 969 | "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 970 | "version" "7.0.0" 971 | 972 | "is-plain-obj@^2.1.0": 973 | "integrity" "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" 974 | "resolved" "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" 975 | "version" "2.1.0" 976 | 977 | "isexe@^2.0.0": 978 | "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 979 | "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 980 | "version" "2.0.0" 981 | 982 | "js-tokens@^4.0.0": 983 | "integrity" "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 984 | "resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 985 | "version" "4.0.0" 986 | 987 | "js-yaml@^3.13.1": 988 | "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" 989 | "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" 990 | "version" "3.14.1" 991 | dependencies: 992 | "argparse" "^1.0.7" 993 | "esprima" "^4.0.0" 994 | 995 | "js-yaml@3.14.0": 996 | "integrity" "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==" 997 | "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz" 998 | "version" "3.14.0" 999 | dependencies: 1000 | "argparse" "^1.0.7" 1001 | "esprima" "^4.0.0" 1002 | 1003 | "json-schema-traverse@^0.4.1": 1004 | "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 1005 | "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" 1006 | "version" "0.4.1" 1007 | 1008 | "json-schema-traverse@^1.0.0": 1009 | "integrity" "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" 1010 | "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" 1011 | "version" "1.0.0" 1012 | 1013 | "json-stable-stringify-without-jsonify@^1.0.1": 1014 | "integrity" "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 1015 | "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" 1016 | "version" "1.0.1" 1017 | 1018 | "json5@^1.0.1": 1019 | "integrity" "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==" 1020 | "resolved" "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz" 1021 | "version" "1.0.1" 1022 | dependencies: 1023 | "minimist" "^1.2.0" 1024 | 1025 | "levn@^0.4.1": 1026 | "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==" 1027 | "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" 1028 | "version" "0.4.1" 1029 | dependencies: 1030 | "prelude-ls" "^1.2.1" 1031 | "type-check" "~0.4.0" 1032 | 1033 | "locate-path@^3.0.0": 1034 | "integrity" "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==" 1035 | "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" 1036 | "version" "3.0.0" 1037 | dependencies: 1038 | "p-locate" "^3.0.0" 1039 | "path-exists" "^3.0.0" 1040 | 1041 | "locate-path@^6.0.0": 1042 | "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==" 1043 | "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" 1044 | "version" "6.0.0" 1045 | dependencies: 1046 | "p-locate" "^5.0.0" 1047 | 1048 | "lodash@^4.17.15", "lodash@^4.17.20": 1049 | "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1050 | "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 1051 | "version" "4.17.21" 1052 | 1053 | "log-symbols@4.0.0": 1054 | "integrity" "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==" 1055 | "resolved" "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" 1056 | "version" "4.0.0" 1057 | dependencies: 1058 | "chalk" "^4.0.0" 1059 | 1060 | "lru-cache@^6.0.0": 1061 | "integrity" "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==" 1062 | "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" 1063 | "version" "6.0.0" 1064 | dependencies: 1065 | "yallist" "^4.0.0" 1066 | 1067 | "make-error@^1.1.1": 1068 | "integrity" "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" 1069 | "resolved" "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" 1070 | "version" "1.3.6" 1071 | 1072 | "merge2@^1.3.0": 1073 | "integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 1074 | "resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" 1075 | "version" "1.4.1" 1076 | 1077 | "micromatch@^4.0.2": 1078 | "integrity" "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==" 1079 | "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz" 1080 | "version" "4.0.2" 1081 | dependencies: 1082 | "braces" "^3.0.1" 1083 | "picomatch" "^2.0.5" 1084 | 1085 | "minimatch@^3.0.4", "minimatch@3.0.4": 1086 | "integrity" "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==" 1087 | "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" 1088 | "version" "3.0.4" 1089 | dependencies: 1090 | "brace-expansion" "^1.1.7" 1091 | 1092 | "minimist@^1.2.0": 1093 | "integrity" "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1094 | "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz" 1095 | "version" "1.2.5" 1096 | 1097 | "mocha@^8.2.1": 1098 | "integrity" "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==" 1099 | "resolved" "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz" 1100 | "version" "8.2.1" 1101 | dependencies: 1102 | "@ungap/promise-all-settled" "1.1.2" 1103 | "ansi-colors" "4.1.1" 1104 | "browser-stdout" "1.3.1" 1105 | "chokidar" "3.4.3" 1106 | "debug" "4.2.0" 1107 | "diff" "4.0.2" 1108 | "escape-string-regexp" "4.0.0" 1109 | "find-up" "5.0.0" 1110 | "glob" "7.1.6" 1111 | "growl" "1.10.5" 1112 | "he" "1.2.0" 1113 | "js-yaml" "3.14.0" 1114 | "log-symbols" "4.0.0" 1115 | "minimatch" "3.0.4" 1116 | "ms" "2.1.2" 1117 | "nanoid" "3.1.12" 1118 | "serialize-javascript" "5.0.1" 1119 | "strip-json-comments" "3.1.1" 1120 | "supports-color" "7.2.0" 1121 | "which" "2.0.2" 1122 | "wide-align" "1.1.3" 1123 | "workerpool" "6.0.2" 1124 | "yargs" "13.3.2" 1125 | "yargs-parser" "13.1.2" 1126 | "yargs-unparser" "2.0.0" 1127 | 1128 | "ms@2.1.2": 1129 | "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1130 | "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 1131 | "version" "2.1.2" 1132 | 1133 | "nanoid@3.1.12": 1134 | "integrity" "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==" 1135 | "resolved" "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz" 1136 | "version" "3.1.12" 1137 | 1138 | "natural-compare@^1.4.0": 1139 | "integrity" "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" 1140 | "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" 1141 | "version" "1.4.0" 1142 | 1143 | "normalize-path@^3.0.0", "normalize-path@~3.0.0": 1144 | "integrity" "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" 1145 | "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 1146 | "version" "3.0.0" 1147 | 1148 | "once@^1.3.0": 1149 | "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=" 1150 | "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 1151 | "version" "1.4.0" 1152 | dependencies: 1153 | "wrappy" "1" 1154 | 1155 | "optionator@^0.9.1": 1156 | "integrity" "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==" 1157 | "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" 1158 | "version" "0.9.1" 1159 | dependencies: 1160 | "deep-is" "^0.1.3" 1161 | "fast-levenshtein" "^2.0.6" 1162 | "levn" "^0.4.1" 1163 | "prelude-ls" "^1.2.1" 1164 | "type-check" "^0.4.0" 1165 | "word-wrap" "^1.2.3" 1166 | 1167 | "p-limit@^2.0.0": 1168 | "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" 1169 | "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" 1170 | "version" "2.3.0" 1171 | dependencies: 1172 | "p-try" "^2.0.0" 1173 | 1174 | "p-limit@^3.0.2": 1175 | "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==" 1176 | "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" 1177 | "version" "3.1.0" 1178 | dependencies: 1179 | "yocto-queue" "^0.1.0" 1180 | 1181 | "p-locate@^3.0.0": 1182 | "integrity" "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==" 1183 | "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" 1184 | "version" "3.0.0" 1185 | dependencies: 1186 | "p-limit" "^2.0.0" 1187 | 1188 | "p-locate@^5.0.0": 1189 | "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==" 1190 | "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" 1191 | "version" "5.0.0" 1192 | dependencies: 1193 | "p-limit" "^3.0.2" 1194 | 1195 | "p-try@^2.0.0": 1196 | "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 1197 | "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" 1198 | "version" "2.2.0" 1199 | 1200 | "parent-module@^1.0.0": 1201 | "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==" 1202 | "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" 1203 | "version" "1.0.1" 1204 | dependencies: 1205 | "callsites" "^3.0.0" 1206 | 1207 | "path-exists@^3.0.0": 1208 | "integrity" "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1209 | "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" 1210 | "version" "3.0.0" 1211 | 1212 | "path-exists@^4.0.0": 1213 | "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 1214 | "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" 1215 | "version" "4.0.0" 1216 | 1217 | "path-is-absolute@^1.0.0": 1218 | "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1219 | "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 1220 | "version" "1.0.1" 1221 | 1222 | "path-key@^3.1.0": 1223 | "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" 1224 | "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" 1225 | "version" "3.1.1" 1226 | 1227 | "path-parse@^1.0.6": 1228 | "integrity" "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 1229 | "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz" 1230 | "version" "1.0.6" 1231 | 1232 | "path-type@^4.0.0": 1233 | "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" 1234 | "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" 1235 | "version" "4.0.0" 1236 | 1237 | "pathval@^1.1.0": 1238 | "integrity" "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" 1239 | "resolved" "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" 1240 | "version" "1.1.1" 1241 | 1242 | "picomatch@^2.0.4", "picomatch@^2.0.5", "picomatch@^2.2.1": 1243 | "integrity" "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" 1244 | "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" 1245 | "version" "2.2.2" 1246 | 1247 | "prelude-ls@^1.2.1": 1248 | "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" 1249 | "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" 1250 | "version" "1.2.1" 1251 | 1252 | "progress@^2.0.0": 1253 | "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 1254 | "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" 1255 | "version" "2.0.3" 1256 | 1257 | "punycode@^2.1.0": 1258 | "integrity" "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1259 | "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" 1260 | "version" "2.1.1" 1261 | 1262 | "queue-microtask@^1.2.2": 1263 | "integrity" "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==" 1264 | "resolved" "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz" 1265 | "version" "1.2.2" 1266 | 1267 | "randombytes@^2.1.0": 1268 | "integrity" "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==" 1269 | "resolved" "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" 1270 | "version" "2.1.0" 1271 | dependencies: 1272 | "safe-buffer" "^5.1.0" 1273 | 1274 | "readdirp@~3.5.0": 1275 | "integrity" "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==" 1276 | "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" 1277 | "version" "3.5.0" 1278 | dependencies: 1279 | "picomatch" "^2.2.1" 1280 | 1281 | "regexpp@^3.0.0", "regexpp@^3.1.0": 1282 | "integrity" "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==" 1283 | "resolved" "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz" 1284 | "version" "3.1.0" 1285 | 1286 | "require-directory@^2.1.1": 1287 | "integrity" "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1288 | "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" 1289 | "version" "2.1.1" 1290 | 1291 | "require-from-string@^2.0.2": 1292 | "integrity" "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" 1293 | "resolved" "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" 1294 | "version" "2.0.2" 1295 | 1296 | "require-main-filename@^2.0.0": 1297 | "integrity" "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 1298 | "resolved" "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" 1299 | "version" "2.0.0" 1300 | 1301 | "resolve-from@^4.0.0": 1302 | "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" 1303 | "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" 1304 | "version" "4.0.0" 1305 | 1306 | "resolve@^1.12.0", "resolve@>=1.9.0": 1307 | "integrity" "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==" 1308 | "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" 1309 | "version" "1.20.0" 1310 | dependencies: 1311 | "is-core-module" "^2.2.0" 1312 | "path-parse" "^1.0.6" 1313 | 1314 | "reusify@^1.0.4": 1315 | "integrity" "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 1316 | "resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" 1317 | "version" "1.0.4" 1318 | 1319 | "rimraf@^3.0.2": 1320 | "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==" 1321 | "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" 1322 | "version" "3.0.2" 1323 | dependencies: 1324 | "glob" "^7.1.3" 1325 | 1326 | "run-parallel@^1.1.9": 1327 | "integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==" 1328 | "resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" 1329 | "version" "1.2.0" 1330 | dependencies: 1331 | "queue-microtask" "^1.2.2" 1332 | 1333 | "safe-buffer@^5.1.0": 1334 | "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1335 | "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 1336 | "version" "5.2.1" 1337 | 1338 | "semver@^7.2.1", "semver@^7.3.2": 1339 | "integrity" "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==" 1340 | "resolved" "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz" 1341 | "version" "7.3.4" 1342 | dependencies: 1343 | "lru-cache" "^6.0.0" 1344 | 1345 | "serialize-javascript@5.0.1": 1346 | "integrity" "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==" 1347 | "resolved" "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" 1348 | "version" "5.0.1" 1349 | dependencies: 1350 | "randombytes" "^2.1.0" 1351 | 1352 | "set-blocking@^2.0.0": 1353 | "integrity" "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1354 | "resolved" "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" 1355 | "version" "2.0.0" 1356 | 1357 | "shebang-command@^2.0.0": 1358 | "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" 1359 | "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" 1360 | "version" "2.0.0" 1361 | dependencies: 1362 | "shebang-regex" "^3.0.0" 1363 | 1364 | "shebang-regex@^3.0.0": 1365 | "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" 1366 | "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" 1367 | "version" "3.0.0" 1368 | 1369 | "slash@^3.0.0": 1370 | "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" 1371 | "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" 1372 | "version" "3.0.0" 1373 | 1374 | "slice-ansi@^4.0.0": 1375 | "integrity" "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==" 1376 | "resolved" "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" 1377 | "version" "4.0.0" 1378 | dependencies: 1379 | "ansi-styles" "^4.0.0" 1380 | "astral-regex" "^2.0.0" 1381 | "is-fullwidth-code-point" "^3.0.0" 1382 | 1383 | "source-map-support@^0.5.17": 1384 | "integrity" "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==" 1385 | "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" 1386 | "version" "0.5.19" 1387 | dependencies: 1388 | "buffer-from" "^1.0.0" 1389 | "source-map" "^0.6.0" 1390 | 1391 | "source-map@^0.6.0": 1392 | "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1393 | "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" 1394 | "version" "0.6.1" 1395 | 1396 | "sprintf-js@~1.0.2": 1397 | "integrity" "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1398 | "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" 1399 | "version" "1.0.3" 1400 | 1401 | "string-width@^1.0.2 || 2": 1402 | "integrity" "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==" 1403 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" 1404 | "version" "2.1.1" 1405 | dependencies: 1406 | "is-fullwidth-code-point" "^2.0.0" 1407 | "strip-ansi" "^4.0.0" 1408 | 1409 | "string-width@^3.0.0", "string-width@^3.1.0": 1410 | "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" 1411 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" 1412 | "version" "3.1.0" 1413 | dependencies: 1414 | "emoji-regex" "^7.0.1" 1415 | "is-fullwidth-code-point" "^2.0.0" 1416 | "strip-ansi" "^5.1.0" 1417 | 1418 | "string-width@^4.2.0": 1419 | "integrity" "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==" 1420 | "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz" 1421 | "version" "4.2.2" 1422 | dependencies: 1423 | "emoji-regex" "^8.0.0" 1424 | "is-fullwidth-code-point" "^3.0.0" 1425 | "strip-ansi" "^6.0.0" 1426 | 1427 | "strip-ansi@^4.0.0": 1428 | "integrity" "sha1-qEeQIusaw2iocTibY1JixQXuNo8=" 1429 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" 1430 | "version" "4.0.0" 1431 | dependencies: 1432 | "ansi-regex" "^3.0.0" 1433 | 1434 | "strip-ansi@^5.0.0", "strip-ansi@^5.1.0", "strip-ansi@^5.2.0": 1435 | "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" 1436 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" 1437 | "version" "5.2.0" 1438 | dependencies: 1439 | "ansi-regex" "^4.1.0" 1440 | 1441 | "strip-ansi@^6.0.0": 1442 | "integrity" "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==" 1443 | "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" 1444 | "version" "6.0.0" 1445 | dependencies: 1446 | "ansi-regex" "^5.0.0" 1447 | 1448 | "strip-bom@^3.0.0": 1449 | "integrity" "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" 1450 | "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" 1451 | "version" "3.0.0" 1452 | 1453 | "strip-json-comments@^3.1.0", "strip-json-comments@^3.1.1", "strip-json-comments@3.1.1": 1454 | "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" 1455 | "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" 1456 | "version" "3.1.1" 1457 | 1458 | "supports-color@^5.3.0": 1459 | "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" 1460 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 1461 | "version" "5.5.0" 1462 | dependencies: 1463 | "has-flag" "^3.0.0" 1464 | 1465 | "supports-color@^7.1.0", "supports-color@7.2.0": 1466 | "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" 1467 | "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" 1468 | "version" "7.2.0" 1469 | dependencies: 1470 | "has-flag" "^4.0.0" 1471 | 1472 | "table@^6.0.4": 1473 | "integrity" "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==" 1474 | "resolved" "https://registry.npmjs.org/table/-/table-6.0.7.tgz" 1475 | "version" "6.0.7" 1476 | dependencies: 1477 | "ajv" "^7.0.2" 1478 | "lodash" "^4.17.20" 1479 | "slice-ansi" "^4.0.0" 1480 | "string-width" "^4.2.0" 1481 | 1482 | "text-table@^0.2.0": 1483 | "integrity" "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" 1484 | "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" 1485 | "version" "0.2.0" 1486 | 1487 | "to-regex-range@^5.0.1": 1488 | "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" 1489 | "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 1490 | "version" "5.0.1" 1491 | dependencies: 1492 | "is-number" "^7.0.0" 1493 | 1494 | "ts-expose-internals@^4.1.3": 1495 | "integrity" "sha512-Mf0rQsHuzrgardbZWjenVCY39b/2stTQwLaW+yXrtOIFvmPLOkfjD3mLMJ7XPU8aU51VyXT3BRMi7yEGQ5qNSA==" 1496 | "resolved" "https://registry.npmjs.org/ts-expose-internals/-/ts-expose-internals-4.1.3.tgz" 1497 | "version" "4.1.3" 1498 | 1499 | "ts-node@^9.1.1", "ts-node@>=8.0.2": 1500 | "integrity" "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==" 1501 | "resolved" "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz" 1502 | "version" "9.1.1" 1503 | dependencies: 1504 | "arg" "^4.1.0" 1505 | "create-require" "^1.1.0" 1506 | "diff" "^4.0.1" 1507 | "make-error" "^1.1.1" 1508 | "source-map-support" "^0.5.17" 1509 | "yn" "3.1.1" 1510 | 1511 | "ts-transform-runtime-check@^0.0.1-alpha19": 1512 | "integrity" "sha512-x6KR7ws24TXpHI7qTGV2BslPUMAlz5FKM2edCUOrVdqGYs0ER637W8F17YwTo8Qn4cQJTA0D9bUQRHHALEk/sg==" 1513 | "resolved" "https://registry.npmjs.org/ts-transform-runtime-check/-/ts-transform-runtime-check-0.0.1-alpha20.tgz" 1514 | "version" "0.0.1-alpha20" 1515 | 1516 | "tsconfig-paths@^3.9.0": 1517 | "integrity" "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==" 1518 | "resolved" "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz" 1519 | "version" "3.9.0" 1520 | dependencies: 1521 | "@types/json5" "^0.0.29" 1522 | "json5" "^1.0.1" 1523 | "minimist" "^1.2.0" 1524 | "strip-bom" "^3.0.0" 1525 | 1526 | "tslib@^1.8.1": 1527 | "integrity" "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" 1528 | "resolved" "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" 1529 | "version" "1.14.1" 1530 | 1531 | "tsutils@^3.17.1": 1532 | "integrity" "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==" 1533 | "resolved" "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" 1534 | "version" "3.21.0" 1535 | dependencies: 1536 | "tslib" "^1.8.1" 1537 | 1538 | "ttypescript@^1.5.12": 1539 | "integrity" "sha512-1ojRyJvpnmgN9kIHmUnQPlEV1gq+VVsxVYjk/NfvMlHSmYxjK5hEvOOU2MQASrbekTUiUM7pR/nXeCc8bzvMOQ==" 1540 | "resolved" "https://registry.npmjs.org/ttypescript/-/ttypescript-1.5.12.tgz" 1541 | "version" "1.5.12" 1542 | dependencies: 1543 | "resolve" ">=1.9.0" 1544 | 1545 | "type-check@^0.4.0", "type-check@~0.4.0": 1546 | "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==" 1547 | "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" 1548 | "version" "0.4.0" 1549 | dependencies: 1550 | "prelude-ls" "^1.2.1" 1551 | 1552 | "type-detect@^4.0.0", "type-detect@^4.0.5": 1553 | "integrity" "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" 1554 | "resolved" "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" 1555 | "version" "4.0.8" 1556 | 1557 | "type-fest@^0.8.1": 1558 | "integrity" "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" 1559 | "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" 1560 | "version" "0.8.1" 1561 | 1562 | "typescript@^4.2.3", "typescript@>=2.7", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", "typescript@>=3.2.2", "typescript@>=3.7.2": 1563 | "integrity" "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==" 1564 | "resolved" "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz" 1565 | "version" "4.2.3" 1566 | 1567 | "uri-js@^4.2.2": 1568 | "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" 1569 | "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" 1570 | "version" "4.4.1" 1571 | dependencies: 1572 | "punycode" "^2.1.0" 1573 | 1574 | "v8-compile-cache@^2.0.3": 1575 | "integrity" "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" 1576 | "resolved" "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" 1577 | "version" "2.3.0" 1578 | 1579 | "which-module@^2.0.0": 1580 | "integrity" "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 1581 | "resolved" "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz" 1582 | "version" "2.0.0" 1583 | 1584 | "which@^2.0.1", "which@2.0.2": 1585 | "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" 1586 | "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" 1587 | "version" "2.0.2" 1588 | dependencies: 1589 | "isexe" "^2.0.0" 1590 | 1591 | "wide-align@1.1.3": 1592 | "integrity" "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==" 1593 | "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" 1594 | "version" "1.1.3" 1595 | dependencies: 1596 | "string-width" "^1.0.2 || 2" 1597 | 1598 | "word-wrap@^1.2.3": 1599 | "integrity" "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" 1600 | "resolved" "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz" 1601 | "version" "1.2.3" 1602 | 1603 | "workerpool@6.0.2": 1604 | "integrity" "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==" 1605 | "resolved" "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz" 1606 | "version" "6.0.2" 1607 | 1608 | "wrap-ansi@^5.1.0": 1609 | "integrity" "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==" 1610 | "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" 1611 | "version" "5.1.0" 1612 | dependencies: 1613 | "ansi-styles" "^3.2.0" 1614 | "string-width" "^3.0.0" 1615 | "strip-ansi" "^5.0.0" 1616 | 1617 | "wrappy@1": 1618 | "integrity" "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1619 | "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1620 | "version" "1.0.2" 1621 | 1622 | "y18n@^4.0.0": 1623 | "integrity" "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" 1624 | "resolved" "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz" 1625 | "version" "4.0.1" 1626 | 1627 | "yallist@^4.0.0": 1628 | "integrity" "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 1629 | "resolved" "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" 1630 | "version" "4.0.0" 1631 | 1632 | "yargs-parser@^13.1.2", "yargs-parser@13.1.2": 1633 | "integrity" "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==" 1634 | "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" 1635 | "version" "13.1.2" 1636 | dependencies: 1637 | "camelcase" "^5.0.0" 1638 | "decamelize" "^1.2.0" 1639 | 1640 | "yargs-unparser@2.0.0": 1641 | "integrity" "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==" 1642 | "resolved" "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" 1643 | "version" "2.0.0" 1644 | dependencies: 1645 | "camelcase" "^6.0.0" 1646 | "decamelize" "^4.0.0" 1647 | "flat" "^5.0.2" 1648 | "is-plain-obj" "^2.1.0" 1649 | 1650 | "yargs@13.3.2": 1651 | "integrity" "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==" 1652 | "resolved" "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" 1653 | "version" "13.3.2" 1654 | dependencies: 1655 | "cliui" "^5.0.0" 1656 | "find-up" "^3.0.0" 1657 | "get-caller-file" "^2.0.1" 1658 | "require-directory" "^2.1.1" 1659 | "require-main-filename" "^2.0.0" 1660 | "set-blocking" "^2.0.0" 1661 | "string-width" "^3.0.0" 1662 | "which-module" "^2.0.0" 1663 | "y18n" "^4.0.0" 1664 | "yargs-parser" "^13.1.2" 1665 | 1666 | "yn@3.1.1": 1667 | "integrity" "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" 1668 | "resolved" "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" 1669 | "version" "3.1.1" 1670 | 1671 | "yocto-queue@^0.1.0": 1672 | "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" 1673 | "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" 1674 | "version" "0.1.0" 1675 | -------------------------------------------------------------------------------- /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.12.11": 6 | version "7.12.11" 7 | resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz" 8 | integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== 9 | dependencies: 10 | "@babel/highlight" "^7.10.4" 11 | 12 | "@babel/helper-validator-identifier@^7.12.11": 13 | version "7.12.11" 14 | resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz" 15 | integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== 16 | 17 | "@babel/highlight@^7.10.4": 18 | version "7.13.10" 19 | resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz" 20 | integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== 21 | dependencies: 22 | "@babel/helper-validator-identifier" "^7.12.11" 23 | chalk "^2.0.0" 24 | js-tokens "^4.0.0" 25 | 26 | "@eslint/eslintrc@^0.4.3": 27 | version "0.4.3" 28 | resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" 29 | integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== 30 | dependencies: 31 | ajv "^6.12.4" 32 | debug "^4.1.1" 33 | espree "^7.3.0" 34 | globals "^13.9.0" 35 | ignore "^4.0.6" 36 | import-fresh "^3.2.1" 37 | js-yaml "^3.13.1" 38 | minimatch "^3.0.4" 39 | strip-json-comments "^3.1.1" 40 | 41 | "@humanwhocodes/config-array@^0.5.0": 42 | version "0.5.0" 43 | resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz" 44 | integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== 45 | dependencies: 46 | "@humanwhocodes/object-schema" "^1.2.0" 47 | debug "^4.1.1" 48 | minimatch "^3.0.4" 49 | 50 | "@humanwhocodes/object-schema@^1.2.0": 51 | version "1.2.1" 52 | resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" 53 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 54 | 55 | "@nodelib/fs.scandir@2.1.5": 56 | version "2.1.5" 57 | resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" 58 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 59 | dependencies: 60 | "@nodelib/fs.stat" "2.0.5" 61 | run-parallel "^1.1.9" 62 | 63 | "@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": 64 | version "2.0.5" 65 | resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" 66 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 67 | 68 | "@nodelib/fs.walk@^1.2.3": 69 | version "1.2.8" 70 | resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" 71 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 72 | dependencies: 73 | "@nodelib/fs.scandir" "2.1.5" 74 | fastq "^1.6.0" 75 | 76 | "@types/chai@^4.2.14": 77 | version "4.3.14" 78 | resolved "https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz" 79 | integrity sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w== 80 | 81 | "@types/json-schema@^7.0.7": 82 | version "7.0.15" 83 | resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" 84 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 85 | 86 | "@types/json5@^0.0.29": 87 | version "0.0.29" 88 | resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" 89 | integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= 90 | 91 | "@types/mocha@^8.2.0": 92 | version "8.2.3" 93 | resolved "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz" 94 | integrity sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw== 95 | 96 | "@types/node@^14.14.22": 97 | version "14.18.63" 98 | resolved "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz" 99 | integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== 100 | 101 | "@typescript-eslint/eslint-plugin@^4.17.0": 102 | version "4.33.0" 103 | resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz" 104 | integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg== 105 | dependencies: 106 | "@typescript-eslint/experimental-utils" "4.33.0" 107 | "@typescript-eslint/scope-manager" "4.33.0" 108 | debug "^4.3.1" 109 | functional-red-black-tree "^1.0.1" 110 | ignore "^5.1.8" 111 | regexpp "^3.1.0" 112 | semver "^7.3.5" 113 | tsutils "^3.21.0" 114 | 115 | "@typescript-eslint/experimental-utils@4.33.0": 116 | version "4.33.0" 117 | resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz" 118 | integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q== 119 | dependencies: 120 | "@types/json-schema" "^7.0.7" 121 | "@typescript-eslint/scope-manager" "4.33.0" 122 | "@typescript-eslint/types" "4.33.0" 123 | "@typescript-eslint/typescript-estree" "4.33.0" 124 | eslint-scope "^5.1.1" 125 | eslint-utils "^3.0.0" 126 | 127 | "@typescript-eslint/parser@^4.0.0", "@typescript-eslint/parser@^4.17.0": 128 | version "4.33.0" 129 | resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz" 130 | integrity sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA== 131 | dependencies: 132 | "@typescript-eslint/scope-manager" "4.33.0" 133 | "@typescript-eslint/types" "4.33.0" 134 | "@typescript-eslint/typescript-estree" "4.33.0" 135 | debug "^4.3.1" 136 | 137 | "@typescript-eslint/scope-manager@4.33.0": 138 | version "4.33.0" 139 | resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz" 140 | integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ== 141 | dependencies: 142 | "@typescript-eslint/types" "4.33.0" 143 | "@typescript-eslint/visitor-keys" "4.33.0" 144 | 145 | "@typescript-eslint/types@4.33.0": 146 | version "4.33.0" 147 | resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz" 148 | integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== 149 | 150 | "@typescript-eslint/typescript-estree@4.33.0": 151 | version "4.33.0" 152 | resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz" 153 | integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== 154 | dependencies: 155 | "@typescript-eslint/types" "4.33.0" 156 | "@typescript-eslint/visitor-keys" "4.33.0" 157 | debug "^4.3.1" 158 | globby "^11.0.3" 159 | is-glob "^4.0.1" 160 | semver "^7.3.5" 161 | tsutils "^3.21.0" 162 | 163 | "@typescript-eslint/visitor-keys@4.33.0": 164 | version "4.33.0" 165 | resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz" 166 | integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== 167 | dependencies: 168 | "@typescript-eslint/types" "4.33.0" 169 | eslint-visitor-keys "^2.0.0" 170 | 171 | "@typescript/vfs@^1.3.4": 172 | version "1.5.0" 173 | resolved "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.5.0.tgz" 174 | integrity sha512-AJS307bPgbsZZ9ggCT3wwpg3VbTKMFNHfaY/uF0ahSkYYrPF2dSSKDNIDIQAHm9qJqbLvCsSJH7yN4Vs/CsMMg== 175 | dependencies: 176 | debug "^4.1.1" 177 | 178 | "@ungap/promise-all-settled@1.1.2": 179 | version "1.1.2" 180 | resolved "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz" 181 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 182 | 183 | "@zerollup/ts-helpers@^1.7.18": 184 | version "1.7.18" 185 | resolved "https://registry.npmjs.org/@zerollup/ts-helpers/-/ts-helpers-1.7.18.tgz" 186 | integrity sha512-S9zN+y+i5yN/evfWquzSO3lubqPXIsPQf6p9OiPMpRxDx/0totPLF39XoRw48Dav5dSvbIE8D2eAPpXXJxvKwg== 187 | dependencies: 188 | resolve "^1.12.0" 189 | 190 | "@zerollup/ts-transform-paths@^1.7.18": 191 | version "1.7.18" 192 | resolved "https://registry.npmjs.org/@zerollup/ts-transform-paths/-/ts-transform-paths-1.7.18.tgz" 193 | integrity sha512-YPVUxvWQVzRx1OBN0Pmkd58+R9FcfUJuwTaPUSoi5rKxuXMtxevTXdfi0w5mEaIH8b0DfL+wg0wFDHiJE+S2zA== 194 | dependencies: 195 | "@zerollup/ts-helpers" "^1.7.18" 196 | 197 | acorn-jsx@^5.3.1: 198 | version "5.3.2" 199 | resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" 200 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 201 | 202 | "acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^7.4.0: 203 | version "7.4.1" 204 | resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" 205 | integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== 206 | 207 | ajv@^6.10.0, ajv@^6.12.4: 208 | version "6.12.6" 209 | resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" 210 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 211 | dependencies: 212 | fast-deep-equal "^3.1.1" 213 | fast-json-stable-stringify "^2.0.0" 214 | json-schema-traverse "^0.4.1" 215 | uri-js "^4.2.2" 216 | 217 | ajv@^8.0.1: 218 | version "8.12.0" 219 | resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" 220 | integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== 221 | dependencies: 222 | fast-deep-equal "^3.1.1" 223 | json-schema-traverse "^1.0.0" 224 | require-from-string "^2.0.2" 225 | uri-js "^4.2.2" 226 | 227 | ansi-colors@^4.1.1, ansi-colors@4.1.1: 228 | version "4.1.1" 229 | resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz" 230 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 231 | 232 | ansi-regex@^3.0.0: 233 | version "3.0.1" 234 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" 235 | integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== 236 | 237 | ansi-regex@^5.0.1: 238 | version "5.0.1" 239 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" 240 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 241 | 242 | ansi-styles@^3.2.1: 243 | version "3.2.1" 244 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 245 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 246 | dependencies: 247 | color-convert "^1.9.0" 248 | 249 | ansi-styles@^4.0.0: 250 | version "4.3.0" 251 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 252 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 253 | dependencies: 254 | color-convert "^2.0.1" 255 | 256 | ansi-styles@^4.1.0: 257 | version "4.3.0" 258 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 259 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 260 | dependencies: 261 | color-convert "^2.0.1" 262 | 263 | anymatch@~3.1.1: 264 | version "3.1.3" 265 | resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" 266 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 267 | dependencies: 268 | normalize-path "^3.0.0" 269 | picomatch "^2.0.4" 270 | 271 | arg@^4.1.0: 272 | version "4.1.3" 273 | resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" 274 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 275 | 276 | argparse@^1.0.7: 277 | version "1.0.10" 278 | resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" 279 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 280 | dependencies: 281 | sprintf-js "~1.0.2" 282 | 283 | argparse@^2.0.1: 284 | version "2.0.1" 285 | resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" 286 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 287 | 288 | array-union@^2.1.0: 289 | version "2.1.0" 290 | resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" 291 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 292 | 293 | assertion-error@^1.1.0: 294 | version "1.1.0" 295 | resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" 296 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 297 | 298 | astral-regex@^2.0.0: 299 | version "2.0.0" 300 | resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" 301 | integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== 302 | 303 | balanced-match@^1.0.0: 304 | version "1.0.0" 305 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" 306 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 307 | 308 | binary-extensions@^2.0.0: 309 | version "2.3.0" 310 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" 311 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 312 | 313 | brace-expansion@^1.1.7: 314 | version "1.1.11" 315 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 316 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 317 | dependencies: 318 | balanced-match "^1.0.0" 319 | concat-map "0.0.1" 320 | 321 | braces@^3.0.2, braces@~3.0.2: 322 | version "3.0.2" 323 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" 324 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 325 | dependencies: 326 | fill-range "^7.0.1" 327 | 328 | browser-stdout@1.3.1: 329 | version "1.3.1" 330 | resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" 331 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 332 | 333 | buffer-from@^1.0.0: 334 | version "1.1.1" 335 | resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz" 336 | integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== 337 | 338 | callsites@^3.0.0: 339 | version "3.1.0" 340 | resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" 341 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 342 | 343 | camelcase@^6.0.0: 344 | version "6.2.0" 345 | resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz" 346 | integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== 347 | 348 | chai@^4.2.0: 349 | version "4.4.1" 350 | resolved "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz" 351 | integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== 352 | dependencies: 353 | assertion-error "^1.1.0" 354 | check-error "^1.0.3" 355 | deep-eql "^4.1.3" 356 | get-func-name "^2.0.2" 357 | loupe "^2.3.6" 358 | pathval "^1.1.1" 359 | type-detect "^4.0.8" 360 | 361 | chalk@^2.0.0: 362 | version "2.4.2" 363 | resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 364 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 365 | dependencies: 366 | ansi-styles "^3.2.1" 367 | escape-string-regexp "^1.0.5" 368 | supports-color "^5.3.0" 369 | 370 | chalk@^4.0.0: 371 | version "4.1.0" 372 | resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz" 373 | integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== 374 | dependencies: 375 | ansi-styles "^4.1.0" 376 | supports-color "^7.1.0" 377 | 378 | check-error@^1.0.3: 379 | version "1.0.3" 380 | resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" 381 | integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== 382 | dependencies: 383 | get-func-name "^2.0.2" 384 | 385 | chokidar@3.5.1: 386 | version "3.5.1" 387 | resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz" 388 | integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== 389 | dependencies: 390 | anymatch "~3.1.1" 391 | braces "~3.0.2" 392 | glob-parent "~5.1.0" 393 | is-binary-path "~2.1.0" 394 | is-glob "~4.0.1" 395 | normalize-path "~3.0.0" 396 | readdirp "~3.5.0" 397 | optionalDependencies: 398 | fsevents "~2.3.1" 399 | 400 | cliui@^7.0.2: 401 | version "7.0.4" 402 | resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" 403 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 404 | dependencies: 405 | string-width "^4.2.0" 406 | strip-ansi "^6.0.0" 407 | wrap-ansi "^7.0.0" 408 | 409 | color-convert@^1.9.0: 410 | version "1.9.3" 411 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 412 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 413 | dependencies: 414 | color-name "1.1.3" 415 | 416 | color-convert@^2.0.1: 417 | version "2.0.1" 418 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 419 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 420 | dependencies: 421 | color-name "~1.1.4" 422 | 423 | color-name@~1.1.4: 424 | version "1.1.4" 425 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 426 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 427 | 428 | color-name@1.1.3: 429 | version "1.1.3" 430 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 431 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 432 | 433 | concat-map@0.0.1: 434 | version "0.0.1" 435 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 436 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 437 | 438 | create-require@^1.1.0: 439 | version "1.1.1" 440 | resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" 441 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 442 | 443 | cross-spawn@^7.0.2: 444 | version "7.0.3" 445 | resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" 446 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 447 | dependencies: 448 | path-key "^3.1.0" 449 | shebang-command "^2.0.0" 450 | which "^2.0.1" 451 | 452 | debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@4.3.1: 453 | version "4.3.1" 454 | resolved "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz" 455 | integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== 456 | dependencies: 457 | ms "2.1.2" 458 | 459 | decamelize@^4.0.0: 460 | version "4.0.0" 461 | resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" 462 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 463 | 464 | deep-eql@^4.1.3: 465 | version "4.1.3" 466 | resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz" 467 | integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== 468 | dependencies: 469 | type-detect "^4.0.0" 470 | 471 | deep-is@^0.1.3: 472 | version "0.1.3" 473 | resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz" 474 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 475 | 476 | diff@^4.0.1: 477 | version "4.0.2" 478 | resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" 479 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 480 | 481 | diff@5.0.0: 482 | version "5.0.0" 483 | resolved "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz" 484 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 485 | 486 | dir-glob@^3.0.1: 487 | version "3.0.1" 488 | resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" 489 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 490 | dependencies: 491 | path-type "^4.0.0" 492 | 493 | doctrine@^3.0.0: 494 | version "3.0.0" 495 | resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" 496 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 497 | dependencies: 498 | esutils "^2.0.2" 499 | 500 | emoji-regex@^8.0.0: 501 | version "8.0.0" 502 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 503 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 504 | 505 | enquirer@^2.3.5: 506 | version "2.3.6" 507 | resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz" 508 | integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== 509 | dependencies: 510 | ansi-colors "^4.1.1" 511 | 512 | escalade@^3.1.1: 513 | version "3.1.2" 514 | resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" 515 | integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== 516 | 517 | escape-string-regexp@^1.0.5: 518 | version "1.0.5" 519 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 520 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 521 | 522 | escape-string-regexp@^4.0.0, escape-string-regexp@4.0.0: 523 | version "4.0.0" 524 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" 525 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 526 | 527 | eslint-scope@^5.1.1: 528 | version "5.1.1" 529 | resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" 530 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 531 | dependencies: 532 | esrecurse "^4.3.0" 533 | estraverse "^4.1.1" 534 | 535 | eslint-utils@^2.1.0: 536 | version "2.1.0" 537 | resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" 538 | integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== 539 | dependencies: 540 | eslint-visitor-keys "^1.1.0" 541 | 542 | eslint-utils@^3.0.0: 543 | version "3.0.0" 544 | resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" 545 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 546 | dependencies: 547 | eslint-visitor-keys "^2.0.0" 548 | 549 | eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: 550 | version "1.3.0" 551 | resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" 552 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 553 | 554 | eslint-visitor-keys@^2.0.0: 555 | version "2.1.0" 556 | resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" 557 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 558 | 559 | eslint@*, "eslint@^5.0.0 || ^6.0.0 || ^7.0.0", eslint@^7.21.0, eslint@>=5: 560 | version "7.32.0" 561 | resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz" 562 | integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== 563 | dependencies: 564 | "@babel/code-frame" "7.12.11" 565 | "@eslint/eslintrc" "^0.4.3" 566 | "@humanwhocodes/config-array" "^0.5.0" 567 | ajv "^6.10.0" 568 | chalk "^4.0.0" 569 | cross-spawn "^7.0.2" 570 | debug "^4.0.1" 571 | doctrine "^3.0.0" 572 | enquirer "^2.3.5" 573 | escape-string-regexp "^4.0.0" 574 | eslint-scope "^5.1.1" 575 | eslint-utils "^2.1.0" 576 | eslint-visitor-keys "^2.0.0" 577 | espree "^7.3.1" 578 | esquery "^1.4.0" 579 | esutils "^2.0.2" 580 | fast-deep-equal "^3.1.3" 581 | file-entry-cache "^6.0.1" 582 | functional-red-black-tree "^1.0.1" 583 | glob-parent "^5.1.2" 584 | globals "^13.6.0" 585 | ignore "^4.0.6" 586 | import-fresh "^3.0.0" 587 | imurmurhash "^0.1.4" 588 | is-glob "^4.0.0" 589 | js-yaml "^3.13.1" 590 | json-stable-stringify-without-jsonify "^1.0.1" 591 | levn "^0.4.1" 592 | lodash.merge "^4.6.2" 593 | minimatch "^3.0.4" 594 | natural-compare "^1.4.0" 595 | optionator "^0.9.1" 596 | progress "^2.0.0" 597 | regexpp "^3.1.0" 598 | semver "^7.2.1" 599 | strip-ansi "^6.0.0" 600 | strip-json-comments "^3.1.0" 601 | table "^6.0.9" 602 | text-table "^0.2.0" 603 | v8-compile-cache "^2.0.3" 604 | 605 | espree@^7.3.0, espree@^7.3.1: 606 | version "7.3.1" 607 | resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" 608 | integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== 609 | dependencies: 610 | acorn "^7.4.0" 611 | acorn-jsx "^5.3.1" 612 | eslint-visitor-keys "^1.3.0" 613 | 614 | esprima@^4.0.0: 615 | version "4.0.1" 616 | resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" 617 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 618 | 619 | esquery@^1.4.0: 620 | version "1.4.0" 621 | resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" 622 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 623 | dependencies: 624 | estraverse "^5.1.0" 625 | 626 | esrecurse@^4.3.0: 627 | version "4.3.0" 628 | resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" 629 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 630 | dependencies: 631 | estraverse "^5.2.0" 632 | 633 | estraverse@^4.1.1: 634 | version "4.3.0" 635 | resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" 636 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 637 | 638 | estraverse@^5.1.0, estraverse@^5.2.0: 639 | version "5.2.0" 640 | resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz" 641 | integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== 642 | 643 | esutils@^2.0.2: 644 | version "2.0.3" 645 | resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" 646 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 647 | 648 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 649 | version "3.1.3" 650 | resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" 651 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 652 | 653 | fast-glob@^3.2.9: 654 | version "3.3.2" 655 | resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" 656 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 657 | dependencies: 658 | "@nodelib/fs.stat" "^2.0.2" 659 | "@nodelib/fs.walk" "^1.2.3" 660 | glob-parent "^5.1.2" 661 | merge2 "^1.3.0" 662 | micromatch "^4.0.4" 663 | 664 | fast-json-stable-stringify@^2.0.0: 665 | version "2.1.0" 666 | resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 667 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 668 | 669 | fast-levenshtein@^2.0.6: 670 | version "2.0.6" 671 | resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" 672 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 673 | 674 | fastq@^1.6.0: 675 | version "1.17.1" 676 | resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" 677 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 678 | dependencies: 679 | reusify "^1.0.4" 680 | 681 | file-entry-cache@^6.0.1: 682 | version "6.0.1" 683 | resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" 684 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 685 | dependencies: 686 | flat-cache "^3.0.4" 687 | 688 | fill-range@^7.0.1: 689 | version "7.0.1" 690 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" 691 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 692 | dependencies: 693 | to-regex-range "^5.0.1" 694 | 695 | find-up@5.0.0: 696 | version "5.0.0" 697 | resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" 698 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 699 | dependencies: 700 | locate-path "^6.0.0" 701 | path-exists "^4.0.0" 702 | 703 | flat-cache@^3.0.4: 704 | version "3.0.4" 705 | resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" 706 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 707 | dependencies: 708 | flatted "^3.1.0" 709 | rimraf "^3.0.2" 710 | 711 | flat@^5.0.2: 712 | version "5.0.2" 713 | resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" 714 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 715 | 716 | flatted@^3.1.0: 717 | version "3.1.1" 718 | resolved "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz" 719 | integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== 720 | 721 | fs.realpath@^1.0.0: 722 | version "1.0.0" 723 | resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 724 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 725 | 726 | function-bind@^1.1.1: 727 | version "1.1.1" 728 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" 729 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 730 | 731 | functional-red-black-tree@^1.0.1: 732 | version "1.0.1" 733 | resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz" 734 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 735 | 736 | get-caller-file@^2.0.5: 737 | version "2.0.5" 738 | resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" 739 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 740 | 741 | get-func-name@^2.0.1, get-func-name@^2.0.2: 742 | version "2.0.2" 743 | resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" 744 | integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== 745 | 746 | glob-parent@^5.1.2, glob-parent@~5.1.0: 747 | version "5.1.2" 748 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 749 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 750 | dependencies: 751 | is-glob "^4.0.1" 752 | 753 | glob@^7.1.3, glob@7.1.6: 754 | version "7.1.6" 755 | resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" 756 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 757 | dependencies: 758 | fs.realpath "^1.0.0" 759 | inflight "^1.0.4" 760 | inherits "2" 761 | minimatch "^3.0.4" 762 | once "^1.3.0" 763 | path-is-absolute "^1.0.0" 764 | 765 | globals@^13.6.0, globals@^13.9.0: 766 | version "13.24.0" 767 | resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" 768 | integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== 769 | dependencies: 770 | type-fest "^0.20.2" 771 | 772 | globby@^11.0.3: 773 | version "11.1.0" 774 | resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" 775 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 776 | dependencies: 777 | array-union "^2.1.0" 778 | dir-glob "^3.0.1" 779 | fast-glob "^3.2.9" 780 | ignore "^5.2.0" 781 | merge2 "^1.4.1" 782 | slash "^3.0.0" 783 | 784 | growl@1.10.5: 785 | version "1.10.5" 786 | resolved "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz" 787 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 788 | 789 | has-flag@^3.0.0: 790 | version "3.0.0" 791 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 792 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 793 | 794 | has-flag@^4.0.0: 795 | version "4.0.0" 796 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" 797 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 798 | 799 | has@^1.0.3: 800 | version "1.0.3" 801 | resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 802 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 803 | dependencies: 804 | function-bind "^1.1.1" 805 | 806 | he@1.2.0: 807 | version "1.2.0" 808 | resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" 809 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 810 | 811 | ignore@^4.0.6: 812 | version "4.0.6" 813 | resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz" 814 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 815 | 816 | ignore@^5.1.8, ignore@^5.2.0: 817 | version "5.3.1" 818 | resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" 819 | integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== 820 | 821 | import-fresh@^3.0.0, import-fresh@^3.2.1: 822 | version "3.3.0" 823 | resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" 824 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 825 | dependencies: 826 | parent-module "^1.0.0" 827 | resolve-from "^4.0.0" 828 | 829 | imurmurhash@^0.1.4: 830 | version "0.1.4" 831 | resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 832 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 833 | 834 | inflight@^1.0.4: 835 | version "1.0.6" 836 | resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 837 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 838 | dependencies: 839 | once "^1.3.0" 840 | wrappy "1" 841 | 842 | inherits@2: 843 | version "2.0.4" 844 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 845 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 846 | 847 | is-binary-path@~2.1.0: 848 | version "2.1.0" 849 | resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" 850 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 851 | dependencies: 852 | binary-extensions "^2.0.0" 853 | 854 | is-core-module@^2.2.0: 855 | version "2.2.0" 856 | resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz" 857 | integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== 858 | dependencies: 859 | has "^1.0.3" 860 | 861 | is-extglob@^2.1.1: 862 | version "2.1.1" 863 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 864 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 865 | 866 | is-fullwidth-code-point@^2.0.0: 867 | version "2.0.0" 868 | resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" 869 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 870 | 871 | is-fullwidth-code-point@^3.0.0: 872 | version "3.0.0" 873 | resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 874 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 875 | 876 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: 877 | version "4.0.1" 878 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz" 879 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== 880 | dependencies: 881 | is-extglob "^2.1.1" 882 | 883 | is-number@^7.0.0: 884 | version "7.0.0" 885 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 886 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 887 | 888 | is-plain-obj@^2.1.0: 889 | version "2.1.0" 890 | resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" 891 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 892 | 893 | isexe@^2.0.0: 894 | version "2.0.0" 895 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 896 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 897 | 898 | js-tokens@^4.0.0: 899 | version "4.0.0" 900 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 901 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 902 | 903 | js-yaml@^3.13.1: 904 | version "3.14.1" 905 | resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" 906 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 907 | dependencies: 908 | argparse "^1.0.7" 909 | esprima "^4.0.0" 910 | 911 | js-yaml@4.0.0: 912 | version "4.0.0" 913 | resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz" 914 | integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== 915 | dependencies: 916 | argparse "^2.0.1" 917 | 918 | json-schema-traverse@^0.4.1: 919 | version "0.4.1" 920 | resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" 921 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 922 | 923 | json-schema-traverse@^1.0.0: 924 | version "1.0.0" 925 | resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" 926 | integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== 927 | 928 | json-stable-stringify-without-jsonify@^1.0.1: 929 | version "1.0.1" 930 | resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" 931 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 932 | 933 | json5@^1.0.2: 934 | version "1.0.2" 935 | resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" 936 | integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== 937 | dependencies: 938 | minimist "^1.2.0" 939 | 940 | levn@^0.4.1: 941 | version "0.4.1" 942 | resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" 943 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 944 | dependencies: 945 | prelude-ls "^1.2.1" 946 | type-check "~0.4.0" 947 | 948 | locate-path@^6.0.0: 949 | version "6.0.0" 950 | resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" 951 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 952 | dependencies: 953 | p-locate "^5.0.0" 954 | 955 | lodash.merge@^4.6.2: 956 | version "4.6.2" 957 | resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" 958 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 959 | 960 | lodash.truncate@^4.4.2: 961 | version "4.4.2" 962 | resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" 963 | integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== 964 | 965 | log-symbols@4.0.0: 966 | version "4.0.0" 967 | resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz" 968 | integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== 969 | dependencies: 970 | chalk "^4.0.0" 971 | 972 | loupe@^2.3.6: 973 | version "2.3.7" 974 | resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz" 975 | integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== 976 | dependencies: 977 | get-func-name "^2.0.1" 978 | 979 | lru-cache@^6.0.0: 980 | version "6.0.0" 981 | resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" 982 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 983 | dependencies: 984 | yallist "^4.0.0" 985 | 986 | make-error@^1.1.1: 987 | version "1.3.6" 988 | resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" 989 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 990 | 991 | merge2@^1.3.0, merge2@^1.4.1: 992 | version "1.4.1" 993 | resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" 994 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 995 | 996 | micromatch@^4.0.4: 997 | version "4.0.5" 998 | resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" 999 | integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== 1000 | dependencies: 1001 | braces "^3.0.2" 1002 | picomatch "^2.3.1" 1003 | 1004 | minimatch@^3.0.4, minimatch@3.0.4: 1005 | version "3.0.4" 1006 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" 1007 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 1008 | dependencies: 1009 | brace-expansion "^1.1.7" 1010 | 1011 | minimist@^1.2.0, minimist@^1.2.6: 1012 | version "1.2.8" 1013 | resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" 1014 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 1015 | 1016 | mocha@^8.2.1: 1017 | version "8.4.0" 1018 | resolved "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz" 1019 | integrity sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ== 1020 | dependencies: 1021 | "@ungap/promise-all-settled" "1.1.2" 1022 | ansi-colors "4.1.1" 1023 | browser-stdout "1.3.1" 1024 | chokidar "3.5.1" 1025 | debug "4.3.1" 1026 | diff "5.0.0" 1027 | escape-string-regexp "4.0.0" 1028 | find-up "5.0.0" 1029 | glob "7.1.6" 1030 | growl "1.10.5" 1031 | he "1.2.0" 1032 | js-yaml "4.0.0" 1033 | log-symbols "4.0.0" 1034 | minimatch "3.0.4" 1035 | ms "2.1.3" 1036 | nanoid "3.1.20" 1037 | serialize-javascript "5.0.1" 1038 | strip-json-comments "3.1.1" 1039 | supports-color "8.1.1" 1040 | which "2.0.2" 1041 | wide-align "1.1.3" 1042 | workerpool "6.1.0" 1043 | yargs "16.2.0" 1044 | yargs-parser "20.2.4" 1045 | yargs-unparser "2.0.0" 1046 | 1047 | ms@2.1.2: 1048 | version "2.1.2" 1049 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 1050 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1051 | 1052 | ms@2.1.3: 1053 | version "2.1.3" 1054 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 1055 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1056 | 1057 | nanoid@3.1.20: 1058 | version "3.1.20" 1059 | resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz" 1060 | integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== 1061 | 1062 | natural-compare@^1.4.0: 1063 | version "1.4.0" 1064 | resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" 1065 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 1066 | 1067 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1068 | version "3.0.0" 1069 | resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 1070 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1071 | 1072 | once@^1.3.0: 1073 | version "1.4.0" 1074 | resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 1075 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 1076 | dependencies: 1077 | wrappy "1" 1078 | 1079 | optionator@^0.9.1: 1080 | version "0.9.1" 1081 | resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" 1082 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 1083 | dependencies: 1084 | deep-is "^0.1.3" 1085 | fast-levenshtein "^2.0.6" 1086 | levn "^0.4.1" 1087 | prelude-ls "^1.2.1" 1088 | type-check "^0.4.0" 1089 | word-wrap "^1.2.3" 1090 | 1091 | p-limit@^3.0.2: 1092 | version "3.1.0" 1093 | resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" 1094 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1095 | dependencies: 1096 | yocto-queue "^0.1.0" 1097 | 1098 | p-locate@^5.0.0: 1099 | version "5.0.0" 1100 | resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" 1101 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1102 | dependencies: 1103 | p-limit "^3.0.2" 1104 | 1105 | parent-module@^1.0.0: 1106 | version "1.0.1" 1107 | resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" 1108 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1109 | dependencies: 1110 | callsites "^3.0.0" 1111 | 1112 | path-exists@^4.0.0: 1113 | version "4.0.0" 1114 | resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" 1115 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1116 | 1117 | path-is-absolute@^1.0.0: 1118 | version "1.0.1" 1119 | resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 1120 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 1121 | 1122 | path-key@^3.1.0: 1123 | version "3.1.1" 1124 | resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" 1125 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1126 | 1127 | path-parse@^1.0.6: 1128 | version "1.0.7" 1129 | resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" 1130 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1131 | 1132 | path-type@^4.0.0: 1133 | version "4.0.0" 1134 | resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" 1135 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1136 | 1137 | pathval@^1.1.1: 1138 | version "1.1.1" 1139 | resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" 1140 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 1141 | 1142 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 1143 | version "2.3.1" 1144 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 1145 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1146 | 1147 | prelude-ls@^1.2.1: 1148 | version "1.2.1" 1149 | resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" 1150 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1151 | 1152 | progress@^2.0.0: 1153 | version "2.0.3" 1154 | resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" 1155 | integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== 1156 | 1157 | punycode@^2.1.0: 1158 | version "2.3.1" 1159 | resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" 1160 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1161 | 1162 | queue-microtask@^1.2.2: 1163 | version "1.2.3" 1164 | resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" 1165 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1166 | 1167 | randombytes@^2.1.0: 1168 | version "2.1.0" 1169 | resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" 1170 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1171 | dependencies: 1172 | safe-buffer "^5.1.0" 1173 | 1174 | readdirp@~3.5.0: 1175 | version "3.5.0" 1176 | resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" 1177 | integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== 1178 | dependencies: 1179 | picomatch "^2.2.1" 1180 | 1181 | regexpp@^3.1.0: 1182 | version "3.1.0" 1183 | resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz" 1184 | integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== 1185 | 1186 | require-directory@^2.1.1: 1187 | version "2.1.1" 1188 | resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" 1189 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 1190 | 1191 | require-from-string@^2.0.2: 1192 | version "2.0.2" 1193 | resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" 1194 | integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== 1195 | 1196 | resolve-from@^4.0.0: 1197 | version "4.0.0" 1198 | resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" 1199 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1200 | 1201 | resolve@^1.12.0, resolve@>=1.9.0: 1202 | version "1.20.0" 1203 | resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz" 1204 | integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== 1205 | dependencies: 1206 | is-core-module "^2.2.0" 1207 | path-parse "^1.0.6" 1208 | 1209 | reusify@^1.0.4: 1210 | version "1.0.4" 1211 | resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" 1212 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1213 | 1214 | rimraf@^3.0.2: 1215 | version "3.0.2" 1216 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" 1217 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1218 | dependencies: 1219 | glob "^7.1.3" 1220 | 1221 | run-parallel@^1.1.9: 1222 | version "1.2.0" 1223 | resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" 1224 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1225 | dependencies: 1226 | queue-microtask "^1.2.2" 1227 | 1228 | safe-buffer@^5.1.0: 1229 | version "5.2.1" 1230 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 1231 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1232 | 1233 | semver@^7.2.1, semver@^7.3.5: 1234 | version "7.6.0" 1235 | resolved "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz" 1236 | integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== 1237 | dependencies: 1238 | lru-cache "^6.0.0" 1239 | 1240 | serialize-javascript@5.0.1: 1241 | version "5.0.1" 1242 | resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz" 1243 | integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA== 1244 | dependencies: 1245 | randombytes "^2.1.0" 1246 | 1247 | shebang-command@^2.0.0: 1248 | version "2.0.0" 1249 | resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" 1250 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1251 | dependencies: 1252 | shebang-regex "^3.0.0" 1253 | 1254 | shebang-regex@^3.0.0: 1255 | version "3.0.0" 1256 | resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" 1257 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1258 | 1259 | slash@^3.0.0: 1260 | version "3.0.0" 1261 | resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" 1262 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1263 | 1264 | slice-ansi@^4.0.0: 1265 | version "4.0.0" 1266 | resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" 1267 | integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== 1268 | dependencies: 1269 | ansi-styles "^4.0.0" 1270 | astral-regex "^2.0.0" 1271 | is-fullwidth-code-point "^3.0.0" 1272 | 1273 | source-map-support@^0.5.17: 1274 | version "0.5.19" 1275 | resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz" 1276 | integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== 1277 | dependencies: 1278 | buffer-from "^1.0.0" 1279 | source-map "^0.6.0" 1280 | 1281 | source-map@^0.6.0: 1282 | version "0.6.1" 1283 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" 1284 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1285 | 1286 | sprintf-js@~1.0.2: 1287 | version "1.0.3" 1288 | resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" 1289 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 1290 | 1291 | "string-width@^1.0.2 || 2": 1292 | version "2.1.1" 1293 | resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" 1294 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 1295 | dependencies: 1296 | is-fullwidth-code-point "^2.0.0" 1297 | strip-ansi "^4.0.0" 1298 | 1299 | string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 1300 | version "4.2.3" 1301 | resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" 1302 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1303 | dependencies: 1304 | emoji-regex "^8.0.0" 1305 | is-fullwidth-code-point "^3.0.0" 1306 | strip-ansi "^6.0.1" 1307 | 1308 | strip-ansi@^4.0.0: 1309 | version "4.0.0" 1310 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" 1311 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 1312 | dependencies: 1313 | ansi-regex "^3.0.0" 1314 | 1315 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1316 | version "6.0.1" 1317 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" 1318 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1319 | dependencies: 1320 | ansi-regex "^5.0.1" 1321 | 1322 | strip-bom@^3.0.0: 1323 | version "3.0.0" 1324 | resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" 1325 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1326 | 1327 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@3.1.1: 1328 | version "3.1.1" 1329 | resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" 1330 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1331 | 1332 | supports-color@^5.3.0: 1333 | version "5.5.0" 1334 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 1335 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 1336 | dependencies: 1337 | has-flag "^3.0.0" 1338 | 1339 | supports-color@^7.1.0: 1340 | version "7.2.0" 1341 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" 1342 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1343 | dependencies: 1344 | has-flag "^4.0.0" 1345 | 1346 | supports-color@8.1.1: 1347 | version "8.1.1" 1348 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" 1349 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1350 | dependencies: 1351 | has-flag "^4.0.0" 1352 | 1353 | table@^6.0.9: 1354 | version "6.8.2" 1355 | resolved "https://registry.npmjs.org/table/-/table-6.8.2.tgz" 1356 | integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== 1357 | dependencies: 1358 | ajv "^8.0.1" 1359 | lodash.truncate "^4.4.2" 1360 | slice-ansi "^4.0.0" 1361 | string-width "^4.2.3" 1362 | strip-ansi "^6.0.1" 1363 | 1364 | text-table@^0.2.0: 1365 | version "0.2.0" 1366 | resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" 1367 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 1368 | 1369 | to-regex-range@^5.0.1: 1370 | version "5.0.1" 1371 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 1372 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1373 | dependencies: 1374 | is-number "^7.0.0" 1375 | 1376 | ts-expose-internals@^4.1.3: 1377 | version "4.9.5" 1378 | resolved "https://registry.npmjs.org/ts-expose-internals/-/ts-expose-internals-4.9.5.tgz" 1379 | integrity sha512-+T1UsxhFi+hbVyYwHrOUb9tjyhry1iJoiDwDRjZZTiBREb7oE78kRHSqyFv8gZhwZCFFOGZyI66X2gHUFAt8lA== 1380 | 1381 | ts-node@^9.1.1, ts-node@>=8.0.2: 1382 | version "9.1.1" 1383 | resolved "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz" 1384 | integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== 1385 | dependencies: 1386 | arg "^4.1.0" 1387 | create-require "^1.1.0" 1388 | diff "^4.0.1" 1389 | make-error "^1.1.1" 1390 | source-map-support "^0.5.17" 1391 | yn "3.1.1" 1392 | 1393 | tsconfig-paths@^3.9.0: 1394 | version "3.15.0" 1395 | resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" 1396 | integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== 1397 | dependencies: 1398 | "@types/json5" "^0.0.29" 1399 | json5 "^1.0.2" 1400 | minimist "^1.2.6" 1401 | strip-bom "^3.0.0" 1402 | 1403 | tslib@^1.8.1: 1404 | version "1.14.1" 1405 | resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" 1406 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 1407 | 1408 | tsutils@^3.21.0: 1409 | version "3.21.0" 1410 | resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" 1411 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 1412 | dependencies: 1413 | tslib "^1.8.1" 1414 | 1415 | ttypescript@^1.5.15: 1416 | version "1.5.15" 1417 | resolved "https://registry.npmjs.org/ttypescript/-/ttypescript-1.5.15.tgz" 1418 | integrity sha512-48ykDNHzFnPMnv4hYX1P8Q84TvCZyL1QlFxeuxsuZ48X2+ameBgPenvmCkHJtoOSxpoWTWi8NcgNrRnVDOmfSg== 1419 | dependencies: 1420 | resolve ">=1.9.0" 1421 | 1422 | type-check@^0.4.0, type-check@~0.4.0: 1423 | version "0.4.0" 1424 | resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" 1425 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1426 | dependencies: 1427 | prelude-ls "^1.2.1" 1428 | 1429 | type-detect@^4.0.0, type-detect@^4.0.8: 1430 | version "4.0.8" 1431 | resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" 1432 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1433 | 1434 | type-fest@^0.20.2: 1435 | version "0.20.2" 1436 | resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" 1437 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1438 | 1439 | typescript@^4.2.3, typescript@>=2.7, "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=3.2.2, typescript@>=3.7.2: 1440 | version "4.9.5" 1441 | resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" 1442 | integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== 1443 | 1444 | uri-js@^4.2.2: 1445 | version "4.4.1" 1446 | resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" 1447 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1448 | dependencies: 1449 | punycode "^2.1.0" 1450 | 1451 | v8-compile-cache@^2.0.3: 1452 | version "2.3.0" 1453 | resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" 1454 | integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== 1455 | 1456 | which@^2.0.1, which@2.0.2: 1457 | version "2.0.2" 1458 | resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" 1459 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1460 | dependencies: 1461 | isexe "^2.0.0" 1462 | 1463 | wide-align@1.1.3: 1464 | version "1.1.3" 1465 | resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz" 1466 | integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== 1467 | dependencies: 1468 | string-width "^1.0.2 || 2" 1469 | 1470 | word-wrap@^1.2.3: 1471 | version "1.2.5" 1472 | resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" 1473 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 1474 | 1475 | workerpool@6.1.0: 1476 | version "6.1.0" 1477 | resolved "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz" 1478 | integrity sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg== 1479 | 1480 | wrap-ansi@^7.0.0: 1481 | version "7.0.0" 1482 | resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" 1483 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1484 | dependencies: 1485 | ansi-styles "^4.0.0" 1486 | string-width "^4.1.0" 1487 | strip-ansi "^6.0.0" 1488 | 1489 | wrappy@1: 1490 | version "1.0.2" 1491 | resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1492 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1493 | 1494 | y18n@^5.0.5: 1495 | version "5.0.8" 1496 | resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" 1497 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1498 | 1499 | yallist@^4.0.0: 1500 | version "4.0.0" 1501 | resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" 1502 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1503 | 1504 | yargs-parser@^20.2.2, yargs-parser@20.2.4: 1505 | version "20.2.4" 1506 | resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz" 1507 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1508 | 1509 | yargs-unparser@2.0.0: 1510 | version "2.0.0" 1511 | resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" 1512 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1513 | dependencies: 1514 | camelcase "^6.0.0" 1515 | decamelize "^4.0.0" 1516 | flat "^5.0.2" 1517 | is-plain-obj "^2.1.0" 1518 | 1519 | yargs@16.2.0: 1520 | version "16.2.0" 1521 | resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" 1522 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1523 | dependencies: 1524 | cliui "^7.0.2" 1525 | escalade "^3.1.1" 1526 | get-caller-file "^2.0.5" 1527 | require-directory "^2.1.1" 1528 | string-width "^4.2.0" 1529 | y18n "^5.0.5" 1530 | yargs-parser "^20.2.2" 1531 | 1532 | yn@3.1.1: 1533 | version "3.1.1" 1534 | resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" 1535 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1536 | 1537 | yocto-queue@^0.1.0: 1538 | version "0.1.0" 1539 | resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" 1540 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1541 | --------------------------------------------------------------------------------