diff --git a/.eslintignore b/.eslintignore index ed82b50a4..13dfc861b 100755 --- a/.eslintignore +++ b/.eslintignore @@ -11,9 +11,13 @@ syntest/ LICENSE* Dockerfile NOTICE +commitlint.config.js +link.sh + # The instrumentation files are copied from istanbul (and modified). # In the future in a big refactor the instrumentation should be redone such that these files dont have to be ignored anymore. **/instrumentation/Instrumenter.ts **/instrumentation/VisitState.ts -**/instrumentation/Visitor.ts \ No newline at end of file +**/instrumentation/Visitor.ts +**/instrumentation/source-coverage.ts diff --git a/.eslintrc.json b/.eslintrc.json index f54c33605..8ec8d47dd 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,27 +1,73 @@ { "env": { - "es6": true, + "es2021": true, "mocha": true, "node": true }, "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", - "prettier" + // "plugin:@typescript-eslint/recommended-requiring-type-checking", // TODO later too much work currently + "plugin:unicorn/recommended", + // "plugin:import/recommended", // TODO gives weird errors + "plugin:import/typescript", + "plugin:promise/recommended", + "prettier"//, + // "plugin:sonarjs/recommended" // TODO later too much work currently ], - "parser": "@typescript-eslint/parser", + // "parser": "@typescript-eslint/parser", "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" + "ecmaVersion": 2021, + "sourceType": "module"//, + // "project": "./tsconfig.json", + // "tsconfigRootDir": "." }, - "plugins": ["@typescript-eslint", "notice"], + "settings": { + "import/resolver": { + "typescript": true, + "node": true + } + }, + "plugins": [ + "@typescript-eslint", + "notice", + "unused-imports" + ], "rules": { - "no-fallthrough": "off", - "notice/notice":["error", + // "import/first": "error", + // "import/newline-after-import": "error", + // "import/no-duplicates": "error", + // "import/order": ["error", + // { + // "alphabetize": { + // "order": "asc", + // "caseInsensitive": true + // }, + // "newlines-between": "always" + // } + // ], + // "sort-imports": ["error", + // { + // "ignoreDeclarationSort": true, + // "ignoreCase": true + // } + // ], + "notice/notice": [ + "error", { "templateFile": "./LICENSE.header.ts", "nonMatchingTolerance": 0.8 - } - ] + } + ], + "unicorn/filename-case": "off", + // "no-unused-vars": "off", + // "@typescript-eslint/no-unused-vars": "off", + // "unused-imports/no-unused-imports": "error", + // "unused-imports/no-unused-vars": [ + // "error", + // { "vars": "all", "varsIgnorePattern": "^_", "args": "after-used", "argsIgnorePattern": "^_" } + // ], + "no-fallthrough": "off", + "unicorn/expiring-todo-comments": "off" } } diff --git a/.github/workflows/main-test.yml b/.github/workflows/main-test.yml index d8ae1e248..3696c178b 100644 --- a/.github/workflows/main-test.yml +++ b/.github/workflows/main-test.yml @@ -61,10 +61,11 @@ jobs: matrix: # Collect coverage for all packages and plugins package: - - libraries/ast-javascript - - libraries/cfg-javascript + - libraries/analysis-javascript + - libraries/ast-visitor-javascript - libraries/instrumentation-javascript - - libraries/javascript + - libraries/search-javascript + - tools/javascript steps: # Download test results diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 3e71248ce..f1e059fd6 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -96,10 +96,11 @@ jobs: matrix: # Collect coverage for all packages and plugins package: - - libraries/ast-javascript - - libraries/cfg-javascript + - libraries/analysis-javascript + - libraries/ast-visitor-javascript - libraries/instrumentation-javascript - - libraries/javascript + - libraries/search-javascript + - tools/javascript steps: # Download test results diff --git a/.prettierignore b/.prettierignore index 9439bf690..fd3fc52d1 100644 --- a/.prettierignore +++ b/.prettierignore @@ -4,4 +4,5 @@ node_modules/ .* *.jpg NOTICE -Dockerfile \ No newline at end of file +Dockerfile +link.sh \ No newline at end of file diff --git a/README.md b/README.md index 444793d10..b8f58e71c 100644 --- a/README.md +++ b/README.md @@ -16,67 +16,62 @@ The common core contains the common interfaces for the code control-flow represe #### NPM -The simplest way to use syntest-javascript is by installing the [npm package](https://www.npmjs.com/package/syntest/javascript). +The simplest way to use syntest javascript is by installing the following two npm packages: [@syntest/cli](https://www.npmjs.com/package/syntest/cli), [@syntest/javascript](https://www.npmjs.com/package/syntest/javascript). ```bash +$ npm install @syntest/cli $ npm install @syntest/javascript ``` You can install it in your project as shown in the snippit above or you can install the package globally by using the npm options `-g`. -#### From source - -The tool can be used by cloning the project, installing its dependencies, and compiling the TypeScript: - -- Clone the projects +## Usage -```bash -$ git clone git@github.com:syntest-framework/syntest-javascript.git -``` +To start you need to be in the root of the project folder containing the code you want to create test-cases for. Next, you need to install two dev-dependencies in your project, namely [chai](https://www.npmjs.com/package/chai) and [chai-as-promised](https://www.npmjs.com/package/chai-as-promised). Both are needed to run the tests. -- Install dependencies +Next, you want to run the following command: ```bash -$ cd syntest-javascript; npm install +$ npx syntest init config --modules @syntest/javascript ``` -- Build Syntest-javascript +This will create the `.syntest.json` configuration file for you with some pre filled in parameters. +The file should look somewhat like this: -```bash -$ cd syntest-javascript; npm run build ``` - -You can create a `.syntest.js` file to change the way the tool behaves. - -Finally run the tool - -```bash -cd ; npm run standalone +{ + ..., + "target-root-directory": "./express", + "include": [ + "./express/lib/**/*.js" + ], + "exclude": [], + "modules": [ + "@syntest/javascript" + ], + "preset": "DynaMOSA" + ... +} ``` -The results can be found in the `syntest` folder - -## Usage +In the above example the most important configuration options are shown. -To start you need to be in the root of the project folder containing the code you want to create test-cases for. Next, you need to install two dev-dependencies in your project, namely [chai](https://www.npmjs.com/package/chai) and [chai-as-promised](https://www.npmjs.com/package/chai-as-promised). Both are needed to run the tests. +- The preset value which decides the algorithms the tool will use. +- The loaded module "@syntest/javascript". +- The target root directory which is the source directory of all the files you want to target. +- The include array where you can specify which files to target. +- The exclude array where you can specify which files to exclude specifically -After installing these dependencies together with the tool, you can run the following example command. +Once these properties are set you can run: ```bash -$ syntest-javascript --target-root-directory="/src" --total-time=10 +$ npx syntest javascript test ``` -This will test all javascript code that is contained in the source folder. It will run for 10 seconds. - -SynTest-JavaScript is highly configurable and supports a bunch of options and arguments, all of them can be found by providing the `--help` option or `-h` for short. Another way of configuring the tool is by putting a .syntest.js file in the root of your project. The file should have the following structure: +If everything is correct the tool will now start. +The results can be found in the `syntest` folder -```js -module.exports = { - "population-size": 10, - "max-depth": 5, - ... -} -``` +SynTest-JavaScript is highly configurable and supports a bunch of options and arguments, all of them can be found by providing the `--help` option or `-h` for short. Another way of configuring the tool is through the .syntest.json file in the root of your project. ## Documentation diff --git a/libraries/ast-javascript/LICENSE.header.ts b/libraries/analysis-javascript/LICENSE.header.ts similarity index 100% rename from libraries/ast-javascript/LICENSE.header.ts rename to libraries/analysis-javascript/LICENSE.header.ts diff --git a/libraries/ast-javascript/NOTICE b/libraries/analysis-javascript/NOTICE similarity index 100% rename from libraries/ast-javascript/NOTICE rename to libraries/analysis-javascript/NOTICE diff --git a/libraries/cfg-javascript/README.md b/libraries/analysis-javascript/README.md similarity index 100% rename from libraries/cfg-javascript/README.md rename to libraries/analysis-javascript/README.md diff --git a/libraries/analysis-javascript/index.ts b/libraries/analysis-javascript/index.ts new file mode 100644 index 000000000..533f08979 --- /dev/null +++ b/libraries/analysis-javascript/index.ts @@ -0,0 +1,59 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from "./lib/ast/AbstractSyntaxTreeFactory"; +export * from "./lib/ast/defaultBabelConfig"; + +export * from "./lib/cfg/ControlFlowGraphFactory"; +export * from "./lib/cfg/ControlFlowGraphVisitor"; + +export * from "./lib/dependency/DependencyFactory"; +export * from "./lib/dependency/DependencyVisitor"; + +export * from "./lib/target/export/Export"; +export * from "./lib/target/export/ExportDefaultDeclaration"; +export * from "./lib/target/export/ExportFactory"; +export * from "./lib/target/export/ExportNamedDeclaration"; +export * from "./lib/target/export/ExportVisitor"; +export * from "./lib/target/export/ExpressionStatement"; + +export * from "./lib/target/Target"; +export * from "./lib/target/TargetFactory"; +export * from "./lib/target/TargetVisitor"; +export * from "./lib/target/VisibilityType"; + +export * from "./lib/type/discovery/element/Element"; +export * from "./lib/type/discovery/element/ElementVisitor"; + +export * from "./lib/type/discovery/object/DiscoveredType"; +export * from "./lib/type/discovery/object/ObjectVisitor"; + +export * from "./lib/type/discovery/relation/Relation"; +export * from "./lib/type/discovery/relation/RelationVisitor"; + +export * from "./lib/type/discovery/TypeExtractor"; + +export * from "./lib/type/resolving/Type"; +export * from "./lib/type/resolving/TypeEnum"; +export * from "./lib/type/resolving/TypeModel"; +export * from "./lib/type/resolving/TypeModelFactory"; +export * from "./lib/type/resolving/InferenceTypeModelFactory"; +export * from "./lib/type/resolving/RandomTypeModelFactory"; + +export * from "./lib/utils/fileSystem"; + +export * from "./lib/RootContext"; diff --git a/libraries/analysis-javascript/lib/RootContext.ts b/libraries/analysis-javascript/lib/RootContext.ts new file mode 100644 index 000000000..91a358bcf --- /dev/null +++ b/libraries/analysis-javascript/lib/RootContext.ts @@ -0,0 +1,481 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { existsSync, lstatSync } from "node:fs"; +import * as path from "node:path"; + +import * as t from "@babel/types"; +import { RootContext as CoreRootContext } from "@syntest/analysis"; + +import { AbstractSyntaxTreeFactory } from "./ast/AbstractSyntaxTreeFactory"; +import { ControlFlowGraphFactory } from "./cfg/ControlFlowGraphFactory"; +import { DependencyFactory } from "./dependency/DependencyFactory"; +import { Export } from "./target/export/Export"; +import { TargetFactory } from "./target/TargetFactory"; +import { TypeModelFactory } from "./type/resolving/TypeModelFactory"; +import { readFile } from "./utils/fileSystem"; +import { ExportFactory } from "./target/export/ExportFactory"; +import { TypeExtractor } from "./type/discovery/TypeExtractor"; +import { TypeModel } from "./type/resolving/TypeModel"; +import { Element } from "./type/discovery/element/Element"; +import { DiscoveredObjectType } from "./type/discovery/object/DiscoveredType"; +import { Relation } from "./type/discovery/relation/Relation"; + +export class RootContext extends CoreRootContext { + protected _exportFactory: ExportFactory; + protected _typeExtractor: TypeExtractor; + protected _typeResolver: TypeModelFactory; + + protected _elementMap: Map; + protected _relationMap: Map; + protected _objectMap: Map; + + protected _typeModel: TypeModel; + + // Mapping: filepath -> target name -> Exports + protected _exportMap: Map; + + constructor( + rootPath: string, + abstractSyntaxTreeFactory: AbstractSyntaxTreeFactory, + controlFlowGraphFactory: ControlFlowGraphFactory, + targetFactory: TargetFactory, + dependencyFactory: DependencyFactory, + exportFactory: ExportFactory, + typeExtractor: TypeExtractor, + typeResolver: TypeModelFactory + ) { + super( + rootPath, + undefined, + abstractSyntaxTreeFactory, + controlFlowGraphFactory, + targetFactory, + dependencyFactory + ); + this._exportFactory = exportFactory; + this._typeExtractor = typeExtractor; + this._typeResolver = typeResolver; + + this._exportMap = new Map(); + } + + get rootPath(): string { + return this._rootPath; + } + + // TODO something with the types + + override getSource(filePath: string) { + let absoluteTargetPath = path.resolve(filePath); + + if (!this._sources.has(absoluteTargetPath)) { + if (!existsSync(absoluteTargetPath)) { + if (existsSync(absoluteTargetPath + ".js")) { + absoluteTargetPath += ".js"; + } else if (existsSync(absoluteTargetPath + ".ts")) { + absoluteTargetPath += ".ts"; + } else { + throw new Error("Cannot find source: " + absoluteTargetPath); + } + } + + const stats = lstatSync(absoluteTargetPath); + + if (stats.isDirectory()) { + if (existsSync(absoluteTargetPath + "/index.js")) { + absoluteTargetPath += "/index.js"; + } else if (existsSync(absoluteTargetPath + "/index.ts")) { + absoluteTargetPath += "/index.ts"; + } else { + throw new Error("Cannot find source: " + absoluteTargetPath); + } + } + + this._sources.set(absoluteTargetPath, readFile(absoluteTargetPath)); + } + + return this._sources.get(absoluteTargetPath); + } + + getExports(filePath: string): Export[] { + const absolutePath = this.resolvePath(filePath); + + if (!this._exportMap.has(absolutePath)) { + this._exportMap.set( + absolutePath, + this._exportFactory.extract( + absolutePath, + this.getAbstractSyntaxTree(absolutePath) + ) + ); + } + + return this._exportMap.get(absolutePath); + } + + extractTypes(): void { + if (!this._elementMap || !this._relationMap || !this._objectMap) { + this._typeExtractor.extractAll(this); + this._elementMap = this._typeExtractor.elementMap; + this._relationMap = this._typeExtractor.relationMap; + this._objectMap = this._typeExtractor.objectMap; + } + } + + resolveTypes(): void { + if (!this._typeModel) { + this.extractTypes(); + this._typeModel = this._typeResolver.resolveTypes( + this._elementMap, + this._relationMap + ); //, this._objectMap); + } + } + + getTypeModel(): TypeModel { + if (!this._typeModel) { + this.extractTypes(); + this.resolveTypes(); + // or should this always be done beforehand? + } + + return this._typeModel; + } + + // getTargetMap(targetPath: string): Map { + // const absoluteTargetPath = path.resolve(targetPath); + + // if (!this._targetMap.has(absoluteTargetPath)) { + // const targetAST = this.getAST(absoluteTargetPath); + // const { targetMap, functionMap } = this.targetMapGenerator.generate( + // absoluteTargetPath, + // targetAST + // ); + + // const exports = this.getExports(targetPath); + + // const finalTargetMap = new Map(); + + // for (const key of targetMap.keys()) { + // const name = targetMap.get(key).name; + // const export_ = exports.find((export_) => export_.name === name); + + // if (!export_) { + // // No export found so we cannot import it and thus not test it + // continue; + // } + + // if ( + // export_.type === ExportType.const && + // functionMap.get(key).size === 0 + // ) { + // throw new Error( + // `Target cannot be constant: ${name} -> ${JSON.stringify(export_)}` + // ); + // } + + // let isPrototypeClass = false; + // for (const function_ of functionMap.get(key).values()) { + // if (function_.isConstructor) { + // isPrototypeClass = true; + // break; + // } + // } + + // // let isClass = false + // // if (functionMap.get(key).size > 1) { + // // isClass = true + // // } + + // // threat everything as a function if we don't know + // finalTargetMap.set(key, { + // name: name, + // type: + // export_.type === ExportType.class || isPrototypeClass + // ? SubjectType.class + // : export_.type === ExportType.const + // ? SubjectType.object + // : SubjectType.function, + // export: export_, + // }); + // } + + // this._targetMap.set(absoluteTargetPath, finalTargetMap); + // this._functionMaps.set(absoluteTargetPath, functionMap); + // } + + // return this._targetMap.get(absoluteTargetPath); + // } + + // getDependencies(targetPath: string): Export[] { + // const absoluteTargetPath = path.resolve(targetPath); + + // if (!this._dependencyMaps.has(absoluteTargetPath)) { + // // Find all external imports in the file under test + // const imports = this.importGenerator.generate( + // absoluteTargetPath, + // this.getAST(targetPath) + // ); + + // // For each external import scan the file for libraries with exported functions + // const libraries: Export[] = []; + // for (const importPath of imports) { + // // Full path to the imported file + // const pathLibrary = path.join(path.dirname(targetPath), importPath); + + // // External libraries have a different path! + // try { + // this.getSource(pathLibrary); + // } catch (error) { + // if (error.message.includes("Cannot find source")) { + // // TODO would be nice if we could get the actual path! (node modules) + // continue; + + // // pathLib = path.join + // } else { + // throw error; + // } + // } + + // // Scan for libraries with public or external functions + // const exports = this.getExports(pathLibrary); + + // // Import the found libraries + // // TODO: check for duplicates in libraries + // libraries.push(...exports); + // } + + // return libraries; + + // // this._dependencyMaps.set(targetPath, libraries); + // } + + // return this._dependencyMaps.get(absoluteTargetPath); + // } + + // scanTargetRootDirectory(targetRootDirectory: string): void { + // const absoluteRootPath = path.resolve(targetRootDirectory); + + // // TODO remove the filters + // const files = getAllFiles(absoluteRootPath, ".js").filter( + // (x) => + // !x.includes("/test/") && + // !x.includes(".test.js") && + // !x.includes("node_modules") + // ); // maybe we should also take those into account + + // const objects: ComplexType[] = []; + // const objectGenerator = new ObjectGenerator(); + + // for (const file of files) { + // const exports = this.getExports(file); + // objects.push( + // ...objectGenerator.generate( + // file, + // this.getAbstractSyntaxTree(file), + // exports + // ) + // ); + // } + + // // standard stuff + // // function https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function + // objects.push( + // { + // name: "function", + // properties: new Set([ + // "arguments", + // "caller", + // "displayName", + // "length", + // "name", + // ]), + // functions: new Set(["apply", "bind", "call", "toString"]), + // propertyType: new Map([ + // ["arguments", new TypeProbability([[TypeEnum.ARRAY, 1, undefined]])], + // ["caller", new TypeProbability([[TypeEnum.FUNCTION, 1, undefined]])], + // [ + // "displayName", + // new TypeProbability([[TypeEnum.STRING, 1, undefined]]), + // ], + // ["length", new TypeProbability([[TypeEnum.NUMERIC, 1, undefined]])], + // ["name", new TypeProbability([[TypeEnum.STRING, 1, undefined]])], + // ]), + // }, + + // // array https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array + // { + // name: "array", + // properties: new Set(["length"]), + // functions: new Set([ + // "at", + // "concat", + // "copyWithin", + // "entries", + // "fill", + // "filter", + // "find", + // "findIndex", + // "flat", + // "flatMap", + // "includes", + // "indexOf", + // "join", + // "keys", + // "lastIndexOf", + // "map", + // "pop", + // "push", + // "reduce", + // "reduceRight", + // "reverse", + // "shift", + // "slice", + // "toLocaleString", + // "toString", + // "unshift", + // "values", + // ]), + // propertyType: new Map([ + // ["length", new TypeProbability([[TypeEnum.NUMERIC, 1, undefined]])], + // ]), + // }, + + // // string + // { + // name: "string", + // properties: new Set(["length"]), + // functions: new Set([ + // "at", + // "charAt", + // "charCodeAt", + // "codePointAt", + // "concat", + // "includes", + // "endsWith", + // "indexOf", + // "lastIndexOf", + // "localeCompare", + // "match", + // "matchAll", + // "normalize", + // "padEnd", + // "padStart", + // "repeat", + // "replace", + // "replaceAll", + // "search", + // "slice", + // "split", + // "startsWith", + // "substring", + // "toLocaleLowerCase", + // "toLocaleUpperCase", + // "toLowerCase", + // "toString", + // "toUpperCase", + // "trim", + // "trimStart", + // "trimEnd", + // "valueOf", + // ]), + // propertyType: new Map([ + // ["length", new TypeProbability([[TypeEnum.NUMERIC, 1, undefined]])], + // ]), + // } + // ); + + // // TODO npm dependencies + // // TODO get rid of duplicates + + // const finalObjects: ComplexType[] = []; + + // // eslint-disable-next-line unicorn/consistent-function-scoping + // function eqSet(as: Set, bs: Set) { + // if (as.size !== bs.size) return false; + // for (const a of as) if (!bs.has(a)) return false; + // return true; + // } + + // for (const o of objects) { + // if (o.properties.size === 0 && o.functions.size === 0) { + // continue; + // } + + // const found = finalObjects.find((o2) => { + // return ( + // o.export === o2.export && // TODO not sure if you can compare exports like this + // o.name === o2.name && + // eqSet(o.properties, o2.properties) && + // eqSet(o.functions, o2.functions) + // ); + // }); + + // if (!found) { + // finalObjects.push(o); + // } + // } + + // const generator = new VariableGenerator(); + // const elements: Element[] = []; + // const relations: Relation[] = []; + // const wrapperElementIsRelation: Map = new Map(); + + // for (const file of files) { + // const [_elements, _relations, _wrapperElementIsRelation] = + // generator.generate(file, this.getAbstractSyntaxTree(file)); + + // elements.push(..._elements); + // relations.push(..._relations); + + // for (const key of _wrapperElementIsRelation.keys()) { + // wrapperElementIsRelation.set(key, _wrapperElementIsRelation.get(key)); + // } + // } + + // this._typeResolver.resolveTypes( + // elements, + // relations, + // wrapperElementIsRelation, + // finalObjects + // ); + + // } + + getElement(id: string): Element { + if (!this._elementMap || !this._elementMap.has(id)) { + this.extractTypes(); + } + return this._elementMap.get(id); + } + + getRelation(id: string): Relation { + if (!this._relationMap || !this._relationMap.has(id)) { + this.extractTypes(); + } + return this._relationMap.get(id); + } + + getObject(id: string): DiscoveredObjectType { + if (!this._objectMap || !this._objectMap.has(id)) { + this.extractTypes(); + } + return this._objectMap.get(id); + } +} diff --git a/libraries/ast-javascript/lib/AbstractSyntaxTreeGenerator.ts b/libraries/analysis-javascript/lib/ast/AbstractSyntaxTreeFactory.ts similarity index 74% rename from libraries/ast-javascript/lib/AbstractSyntaxTreeGenerator.ts rename to libraries/analysis-javascript/lib/ast/AbstractSyntaxTreeFactory.ts index 5d18fb583..650300809 100644 --- a/libraries/ast-javascript/lib/AbstractSyntaxTreeGenerator.ts +++ b/libraries/analysis-javascript/lib/ast/AbstractSyntaxTreeFactory.ts @@ -16,13 +16,17 @@ * limitations under the License. */ -import { defaultBabelOptions } from "./defaultBabelConfig"; import { transformSync } from "@babel/core"; import * as t from "@babel/types"; +import { AbstractSyntaxTreeFactory as CoreAbstractSyntaxTreeFactory } from "@syntest/analysis"; + +import { defaultBabelOptions } from "./defaultBabelConfig"; -export class AbstractSyntaxTreeGenerator { - generate(source: string): t.Node { - const options = JSON.parse(JSON.stringify(defaultBabelOptions)); +export class AbstractSyntaxTreeFactory + implements CoreAbstractSyntaxTreeFactory +{ + convert(filepath: string, source: string): t.Node { + const options: unknown = JSON.parse(JSON.stringify(defaultBabelOptions)); const codeMap = transformSync(source, options); diff --git a/libraries/ast-javascript/lib/defaultBabelConfig.ts b/libraries/analysis-javascript/lib/ast/defaultBabelConfig.ts similarity index 99% rename from libraries/ast-javascript/lib/defaultBabelConfig.ts rename to libraries/analysis-javascript/lib/ast/defaultBabelConfig.ts index 3023402f1..5bbdabea3 100644 --- a/libraries/ast-javascript/lib/defaultBabelConfig.ts +++ b/libraries/analysis-javascript/lib/ast/defaultBabelConfig.ts @@ -20,6 +20,7 @@ import { TransformOptions } from "@babel/core"; export const defaultBabelOptions: TransformOptions = { configFile: false, + // "presets": ["@babel/preset-react"], babelrc: false, ast: true, diff --git a/libraries/javascript/lib/bin.ts b/libraries/analysis-javascript/lib/cfg/ControlFlowGraphFactory.ts similarity index 53% rename from libraries/javascript/lib/bin.ts rename to libraries/analysis-javascript/lib/cfg/ControlFlowGraphFactory.ts index 42508f32f..8aa6b4437 100644 --- a/libraries/javascript/lib/bin.ts +++ b/libraries/analysis-javascript/lib/cfg/ControlFlowGraphFactory.ts @@ -1,4 +1,3 @@ -#!/usr/bin/env node /* * Copyright 2020-2023 Delft University of Technology and SynTest contributors * @@ -16,14 +15,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { EventManager, PluginManager } from "@syntest/core"; -import { JavaScriptLauncher } from "./JavaScriptLauncher"; -import { JavaScriptTestCase } from "./testcase/JavaScriptTestCase"; +import { traverse } from "@babel/core"; +import * as t from "@babel/types"; +import { ControlFlowGraphFactory as CoreControlFlowGraphFactory } from "@syntest/analysis"; +import { ControlFlowProgram, contractControlFlowProgram } from "@syntest/cfg"; -const name = "syntest-javascript"; -const state = {}; -const eventManager = new EventManager(state); -const pluginManager = new PluginManager(); +import { ControlFlowGraphVisitor } from "./ControlFlowGraphVisitor"; -const launcher = new JavaScriptLauncher(name, eventManager, pluginManager); -launcher.run(process.argv); +export class ControlFlowGraphFactory + implements CoreControlFlowGraphFactory +{ + convert(filePath: string, AST: t.Node): ControlFlowProgram { + const visitor = new ControlFlowGraphVisitor(filePath); + traverse(AST, visitor); + + return contractControlFlowProgram(visitor.cfg); + } +} diff --git a/libraries/analysis-javascript/lib/cfg/ControlFlowGraphVisitor.ts b/libraries/analysis-javascript/lib/cfg/ControlFlowGraphVisitor.ts new file mode 100644 index 000000000..3985db0fb --- /dev/null +++ b/libraries/analysis-javascript/lib/cfg/ControlFlowGraphVisitor.ts @@ -0,0 +1,980 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { NodePath } from "@babel/core"; +import * as t from "@babel/types"; +import { AbstractSyntaxTreeVisitor } from "@syntest/ast-visitor-javascript"; +import { + ControlFlowFunction, + ControlFlowGraph, + ControlFlowProgram, + Edge, + EdgeType, + Location, + Node, + NodeType, +} from "@syntest/cfg"; +import { getLogger } from "@syntest/logging"; + +export class ControlFlowGraphVisitor extends AbstractSyntaxTreeVisitor { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + protected static override LOGGER: any; + + private _nodesList: Node[]; + private _nodes: Map>; + private _edges: Edge[]; + + private _breakNodesStack: Set[]; + private _continueNodesStack: Set[]; + private _returnNodes: Set; + private _throwNodes: Set; + + private _functions: ControlFlowFunction[]; + + private _currentParents: string[]; + private _edgeType: EdgeType; + + get cfg(): ControlFlowProgram { + if (!this._nodes.has("ENTRY")) { + throw new Error("No entry node found"); + } + if (!this._nodes.has("SUCCESS_EXIT")) { + throw new Error("No success exit node found"); + } + if (!this._nodes.has("ERROR_EXIT")) { + throw new Error("No error exit node found"); + } + + if (this._nodesList.length !== this._nodes.size) { + throw new Error("Number of nodes dont match"); + } + + const entryNode = this._nodes.get("ENTRY"); + const successExitNode = this._nodes.get("SUCCESS_EXIT"); + const errorExitNode = this._nodes.get("ERROR_EXIT"); + + // connect last nodes to success exit + this._connectToParents(successExitNode); + + // connect all return nodes to success exit + for (const returnNode of this._returnNodes) { + this._edges.push( + this._createEdge( + this._nodes.get(returnNode), + successExitNode, + EdgeType.NORMAL + ) + ); + } + + // connect all throw nodes to error exit + for (const throwNode of this._throwNodes) { + this._edges.push( + this._createEdge( + this._nodes.get(throwNode), + errorExitNode, + EdgeType.EXCEPTION + ) + ); + } + + if (this._breakNodesStack.length > 0) { + ControlFlowGraphVisitor.LOGGER.warn( + `Found ${this._breakNodesStack.length} break node stacks that are not connected to a loop` + ); + } + + if (this._continueNodesStack.length > 0) { + ControlFlowGraphVisitor.LOGGER.warn( + `Found ${this._continueNodesStack.length} continue node stacks that are not connected to a loop` + ); + } + + return { + graph: new ControlFlowGraph( + entryNode, + successExitNode, + errorExitNode, + this._nodes, + this._edges + ), + functions: this._functions, + }; + } + + constructor(filePath: string) { + super(filePath); + ControlFlowGraphVisitor.LOGGER = getLogger("ControlFlowGraphVisitor"); + + this._nodesList = []; + this._nodes = new Map>(); + this._edges = []; + + this._breakNodesStack = []; + this._continueNodesStack = []; + this._returnNodes = new Set(); + this._throwNodes = new Set(); + + this._functions = []; + + this._currentParents = []; + + this._edgeType = EdgeType.NORMAL; + + const entry = new Node("ENTRY", NodeType.ENTRY, "ENTRY", [], {}); + const successExit = new Node( + "SUCCESS_EXIT", + NodeType.EXIT, + "EXIT", + [], + {} + ); + const errorExit = new Node( + "ERROR_EXIT", + NodeType.EXIT, + "EXIT", + [], + {} + ); + + this._nodes.set(entry.id, entry); + this._nodes.set(successExit.id, successExit); + this._nodes.set(errorExit.id, errorExit); + this._nodesList.push(entry, successExit, errorExit); + + this._currentParents = [entry.id]; + } + + private _getBreakNodes(): Set { + if (this._breakNodesStack.length === 0) { + throw new Error("No break nodes found"); + } + return this._breakNodesStack[this._breakNodesStack.length - 1]; + } + + private _getContinueNodes(): Set { + if (this._continueNodesStack.length === 0) { + throw new Error("No continue nodes found"); + } + return this._continueNodesStack[this._continueNodesStack.length - 1]; + } + + private _getLocation(path: NodePath): Location { + return { + start: { + line: path.node.loc.start.line, + column: path.node.loc.start.column, + index: (<{ index: number }>(path.node.loc.start)).index, + }, + end: { + line: path.node.loc.end.line, + column: path.node.loc.end.column, + index: (<{ index: number }>(path.node.loc.end)).index, + }, + }; + } + + private _createNode(path: NodePath): Node { + const id = `${this._getNodeId(path)}`; + const node = new Node( + id, + NodeType.NORMAL, + path.node.type, + [ + { + id: id, + location: this._getLocation(path), + statement: path.node, + statementAsText: path.toString(), + }, + ], + {}, + path.node.type + ); + this._nodes.set(id, node); + this._nodesList.push(node); + + return node; + } + + /** + * Create a placeholder node for a node that is not in the AST, but is used in the CFG. + * Uses the end location of the parent node as the start and end location of the placeholder node. + * @param path + * @returns + */ + private _createPlaceholderNode(path: NodePath): Node { + const id = `placeholder-${this._getNodeId(path)}`; + const location = this._getLocation(path); + const node = new Node( + id, + NodeType.NORMAL, + path.node.type, + [ + { + id: id, + location: { + start: { + line: location.end.line, + column: location.end.column, + index: location.end.index, + }, + end: { + line: location.end.line, + column: location.end.column, + index: location.end.index, + }, + }, + statement: path.node, + statementAsText: path.toString(), + }, + ], + {}, + path.node.type + ); + this._nodes.set(id, node); + this._nodesList.push(node); + + return node; + } + + private _isSpecial(path: NodePath): boolean { + return ( + path.isFunction() || + path.isClass() || + path.isConditional() || + path.isLoop() || + path.isBlock() || + // terminating statements + path.isBreakStatement() || + path.isContinueStatement() || + path.isReturnStatement() || + path.isThrowStatement() || + // exports + path.isExportAllDeclaration() || + path.isExportDeclaration() || + path.isExportDefaultDeclaration() || + path.isExportDefaultSpecifier() || + path.isExportNamedDeclaration() || + path.isExportNamespaceSpecifier() || + path.isExportSpecifier() + ); + } + + private _generalNode: ( + path: NodePath< + t.Statement | t.Declaration | t.Expression | t.VariableDeclarator + > + ) => void = (path) => { + if (this._isSpecial(path)) { + return; + } + + const node = this._createNode(path); + + this._connectToParents(node); + this._currentParents = [node.id]; + + path.skip(); + }; + + private _createEdge( + source: Node, + target: Node, + edgeType: EdgeType, + label = "" + ): Edge { + return new Edge( + `${source.id}->${target.id}`, + edgeType, + label, + source.id, + target.id, + "description" + ); + } + + /** + * Connects the current parents to the given node + * It uses the current edge type and resets it back to normal afterwards + * + * @param node + */ + private _connectToParents(node: Node) { + // it is actually possible that there are no parents + for (const parent of this._currentParents) { + this._edges.push( + this._createEdge(this._nodes.get(parent), node, this._edgeType) + ); + this._edgeType = EdgeType.NORMAL; + } + } + + public Block: (path: NodePath) => void = (path) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering block at ${this._getNodeId(path)}` + ); + + // we need to repeat this from the baseclass because we cannot use super.Program + if (path.isProgram() && this._scopeIdOffset === undefined) { + this._scopeIdOffset = this._getUidFromScope(path.scope); + this._thisScopeStack.push(this._getUidFromScope(path.scope)); + this._thisScopeStackNames.push("global"); + } + + const node = this._createNode(path); + + this._connectToParents(node); + this._currentParents = [node.id]; + + for (const statement of path.get("body")) { + statement.visit(); + } + + path.skip(); + }; + + // functions + public Function: (path: NodePath) => void = (path) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering function at ${this._getNodeId(path)}` + ); + const subVisitor = new ControlFlowGraphVisitor(this.filePath); + path.traverse(subVisitor); + + if (!subVisitor._nodes.has("ENTRY")) { + // this function has no block + // e.g. () => log("hello world") + // we need to create a node for it + if (subVisitor._nodes.size > 0) { + throw new Error( + `Function ${this._getNodeId(path)} has no entry node but has ${ + subVisitor._nodes.size + } nodes` + ); + } + + const entry = new Node("ENTRY", NodeType.ENTRY, "ENTRY", [], {}); + const successExit = new Node( + "SUCCESS_EXIT", + NodeType.EXIT, + "EXIT", + [], + {} + ); + const errorExit = new Node( + "ERROR_EXIT", + NodeType.EXIT, + "EXIT", + [], + {} + ); + + subVisitor._nodes.set(entry.id, entry); + subVisitor._nodes.set(successExit.id, successExit); + subVisitor._nodes.set(errorExit.id, errorExit); + + this._currentParents = [entry.id]; + subVisitor._connectToParents(successExit); + } + + this._functions.push( + { + id: this._getNodeId(path), + name: "id" in path.node ? path.node.id?.name : "anonymous", + graph: subVisitor.cfg.graph, + }, + // sub functions within this function + ...subVisitor.cfg.functions + ); + + path.skip(); + }; + + // actual control flow graph related nodes + public Statement: (path: NodePath) => void = (path) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering statement: ${path.type}\tline: ${path.node.loc.start.line}\tcolumn: ${path.node.loc.start.column}` + ); + const node = this._createNode(path); + + this._connectToParents(node); + this._currentParents = [node.id]; + + let expression; + if ( + path.isExpressionStatement() && + ((expression = path.get("expression")), + expression.isAssignmentExpression()) + ) { + if (this._isSpecial(expression.get("right"))) { + expression.get("right").visit(); + } + } else if (this._isSpecial(path)) { + path.traverse(this); + } + + path.skip(); + }; + + public Declaration: (path: NodePath) => void = (path) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering Declaration at ${this._getNodeId(path)}` + ); + + const node = this._createNode(path); + + this._connectToParents(node); + this._currentParents = [node.id]; + + if (path.has("declarations")) { + const declarations = path.get("declarations"); + + if (!Array.isArray(declarations)) { + throw new TypeError("Declarations is not an array"); + } + + for (const declaration of declarations) { + if (declaration.has("init")) { + const init = declaration.get("init"); + + if (Array.isArray(init)) { + throw new TypeError("Init is an array"); + } + + if (this._isSpecial(init)) { + init.visit(); + } + } + } + } else if (this._isSpecial(path)) { + path.traverse(this); + } + path.skip(); + }; + + public Expression: (path: NodePath) => void = (path) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering Expression at ${this._getNodeId(path)}` + ); + + this._generalNode(path); + }; + + public IfStatement: (path: NodePath) => void = (path) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering IfStatement at ${this._getNodeId(path)}` + ); + + const branchNode = this._createNode(path); // or path.get("test") ?? + // TODO test + + this._connectToParents(branchNode); + + // consequent + this._currentParents = [branchNode.id]; + this._edgeType = EdgeType.CONDITIONAL_TRUE; + path.get("consequent").visit(); + const consequentNodes = this._currentParents; + + // alternate + this._currentParents = [branchNode.id]; + this._edgeType = EdgeType.CONDITIONAL_FALSE; + if (path.has("alternate")) { + path.get("alternate").visit(); + } else { + const alternate = this._createPlaceholderNode(path); + this._connectToParents(alternate); + this._currentParents = [alternate.id]; + } + + const alternateNodes = this._currentParents; + + this._currentParents = [...alternateNodes, ...consequentNodes]; + + path.skip(); + }; + + public DoWhileStatement: (path: NodePath) => void = ( + path + ) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering DoWhileStatement at ${this._getNodeId(path)}` + ); + + this._breakNodesStack.push(new Set()); + this._continueNodesStack.push(new Set()); + + const size = this._nodesList.length; + // body + path.get("body").visit(); + + let firstBodyNode = this._nodesList[size]; + if (firstBodyNode === undefined) { + // should never happen since we always add the block node + // empty body + // create placeholder node + const placeholderNode = this._createPlaceholderNode(path); + this._connectToParents(placeholderNode); + this._currentParents = [placeholderNode.id]; + firstBodyNode = placeholderNode; + } + + // loop + const loopNode = this._createNode(path); // or path.get("test") ?? + // TODO test + + this._connectToParents(loopNode); + + // consequent + // the back edge + this._edges.push( + this._createEdge( + loopNode, + firstBodyNode, + EdgeType.CONDITIONAL_TRUE, + EdgeType.BACK_EDGE + ) + ); + + // alternate + this._currentParents = [loopNode.id]; + this._edgeType = EdgeType.CONDITIONAL_FALSE; + + // connect all break nodes to loop exit + this._currentParents.push(...this._breakNodesStack.pop()); + + // connect all continue nodes to test + for (const continueNode of this._continueNodesStack.pop()) { + this._edges.push( + this._createEdge( + this._nodes.get(continueNode), + loopNode, + EdgeType.BACK_EDGE, + EdgeType.BACK_EDGE + ) + ); + } + + path.skip(); + }; + + public WhileStatement: (path: NodePath) => void = ( + path + ) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering WhileStatement at ${this._getNodeId(path)}` + ); + + this._breakNodesStack.push(new Set()); + this._continueNodesStack.push(new Set()); + + // loop + const loopNode = this._createNode(path); // or path.get("test") ?? + // TODO test + + this._connectToParents(loopNode); + + // body + this._currentParents = [loopNode.id]; + this._edgeType = EdgeType.CONDITIONAL_TRUE; + const beforeSize = this._nodes.size; + path.get("body").visit(); + + // check if something was created + if (beforeSize === this._nodes.size) { + // empty body + // create placeholder node + const placeholderNode = this._createPlaceholderNode(path); + this._connectToParents(placeholderNode); + this._currentParents = [placeholderNode.id]; + } + + // the back edge + this._edgeType = EdgeType.BACK_EDGE; + this._connectToParents(loopNode); // TODO should be label back edge too + + // exit + this._edgeType = EdgeType.CONDITIONAL_FALSE; + this._currentParents = [loopNode.id]; + + // connect all break nodes to loop exit + this._currentParents.push(...this._breakNodesStack.pop()); + + // connect all continue nodes to test entry + for (const continueNode of this._continueNodesStack.pop()) { + this._edges.push( + this._createEdge( + this._nodes.get(continueNode), + loopNode, + EdgeType.BACK_EDGE, + EdgeType.BACK_EDGE + ) + ); + } + + path.skip(); + }; + + public ForStatement: (path: NodePath) => void = (path) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering ForStatement at ${this._getNodeId(path)}` + ); + + this._breakNodesStack.push(new Set()); + this._continueNodesStack.push(new Set()); + + // init + if (path.has("init")) { + path.get("init").visit(); + } + + // test + if (!path.has("test")) { + // unsupported + throw new Error( + `ForStatement test not implemented at ${this._getNodeId(path)}` + ); + } + + // TODO test + const testNode = this._createNode(path); // or path.get("test") ?? + this._connectToParents(testNode); + this._currentParents = [testNode.id]; + + // true + // body + this._edgeType = EdgeType.CONDITIONAL_TRUE; + const beforeSize = this._nodes.size; + path.get("body").visit(); + + // check if something was created + if (beforeSize === this._nodes.size) { + // empty body + // create placeholder node + const placeholderNode = this._createPlaceholderNode(path); + this._connectToParents(placeholderNode); + this._currentParents = [placeholderNode.id]; + } + + // update + if (!path.has("update")) { + // unsupported + throw new Error( + `ForStatement update not implemented at ${this._getNodeId(path)}` + ); + } + + path.get("update").visit(); + + // connect to test + this._edgeType = EdgeType.BACK_EDGE; + this._connectToParents(testNode); + + // false + this._edgeType = EdgeType.CONDITIONAL_FALSE; + this._currentParents = [testNode.id]; + + // connect all break nodes to loop exit + this._currentParents.push(...this._breakNodesStack.pop()); + + // connect all continue nodes to test + for (const continueNode of this._continueNodesStack.pop()) { + this._edges.push( + this._createEdge( + this._nodes.get(continueNode), + testNode, + EdgeType.BACK_EDGE, + EdgeType.BACK_EDGE + ) + ); + } + + path.skip(); + }; + + public ForInStatement: (path: NodePath) => void = ( + path + ) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering ForInStatement at ${this._getNodeId(path)}` + ); + + this._breakNodesStack.push(new Set()); + this._continueNodesStack.push(new Set()); + + if (!path.has("left")) { + // unsupported + throw new Error( + `ForInStatement left not implemented at ${this._getNodeId(path)}` + ); + } + if (!path.has("right")) { + // unsupported + throw new Error( + `ForInStatement right not implemented at ${this._getNodeId(path)}` + ); + } + + // left + path.get("left").visit(); + + // TODO test + const testNode = this._createNode(path); // or path.get("test") ?? + this._connectToParents(testNode); + this._currentParents = [testNode.id]; + + // true + // body + this._edgeType = EdgeType.CONDITIONAL_TRUE; + const beforeSize = this._nodes.size; + path.get("body").visit(); + + // check if something was created + if (beforeSize === this._nodes.size) { + // empty body + // create placeholder node + const placeholderNode = this._createPlaceholderNode(path); + this._connectToParents(placeholderNode); + this._currentParents = [placeholderNode.id]; + } + + // connect to test + this._edgeType = EdgeType.BACK_EDGE; + this._connectToParents(testNode); + + // false + this._edgeType = EdgeType.CONDITIONAL_FALSE; + this._currentParents = [testNode.id]; + + // connect all break nodes to loop exit + this._currentParents.push(...this._breakNodesStack.pop()); + + // connect all continue nodes to test + for (const continueNode of this._continueNodesStack.pop()) { + this._edges.push( + this._createEdge( + this._nodes.get(continueNode), + testNode, + EdgeType.BACK_EDGE, + EdgeType.BACK_EDGE + ) + ); + } + + path.skip(); + }; + + public ForOfStatement: (path: NodePath) => void = ( + path + ) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering ForOfStatement at ${this._getNodeId(path)}` + ); + + this._breakNodesStack.push(new Set()); + this._continueNodesStack.push(new Set()); + + if (!path.has("left")) { + // unsupported + throw new Error( + `ForOfStatement left not implemented at ${this._getNodeId(path)}` + ); + } + if (!path.has("right")) { + // unsupported + throw new Error( + `ForOfStatement right not implemented at ${this._getNodeId(path)}` + ); + } + + // left + path.get("left").visit(); + + // TODO test + const testNode = this._createNode(path); // or path.get("test") ?? + this._connectToParents(testNode); + this._currentParents = [testNode.id]; + + // true + // body + this._edgeType = EdgeType.CONDITIONAL_TRUE; + const beforeSize = this._nodes.size; + path.get("body").visit(); + + // check if something was created + if (beforeSize === this._nodes.size) { + // empty body + // create placeholder node + const placeholderNode = this._createPlaceholderNode(path); + this._connectToParents(placeholderNode); + this._currentParents = [placeholderNode.id]; + } + + // connect to test + this._edgeType = EdgeType.BACK_EDGE; + this._connectToParents(testNode); + + // false + this._edgeType = EdgeType.CONDITIONAL_FALSE; + this._currentParents = [testNode.id]; + + // connect all break nodes to loop exit + this._currentParents.push(...this._breakNodesStack.pop()); + + // connect all continue nodes to loop entry + for (const continueNode of this._continueNodesStack.pop()) { + this._edges.push( + this._createEdge( + this._nodes.get(continueNode), + testNode, + EdgeType.BACK_EDGE, + EdgeType.BACK_EDGE + ) + ); + } + + path.skip(); + }; + + public SwitchStatement: (path: NodePath) => void = ( + path + ) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering SwitchStatement at ${this._getNodeId(path)}` + ); + + this._breakNodesStack.push(new Set()); + + // TODO test + const testNode = this._createNode(path); // or path.get("test") ?? + this._connectToParents(testNode); + this._currentParents = [testNode.id]; + + for (const caseNode of path.get("cases")) { + // TODO test + const caseTestNode = this._createNode(caseNode); // or path.get("test") ?? + this._connectToParents(caseTestNode); + this._currentParents = [caseTestNode.id]; + + if (caseNode.has("test")) { + // case + this._edgeType = EdgeType.CONDITIONAL_TRUE; + } + + // consequent + if (caseNode.get("consequent").length === 0) { + // empty body + // create placeholder node + const placeholderNode = this._createPlaceholderNode(caseNode); + this._connectToParents(placeholderNode); + this._currentParents = [placeholderNode.id]; + } else { + for (const consequentNode of caseNode.get("consequent")) { + consequentNode.visit(); + } + } + + if (caseNode.has("test")) { + // case + this._edgeType = EdgeType.CONDITIONAL_FALSE; + this._currentParents = [caseTestNode.id, ...this._currentParents]; + } else { + // default + this._currentParents = [...this._currentParents]; + } + } + + // connect all break nodes to switch exit + this._currentParents.push(...this._breakNodesStack.pop()); + + path.skip(); + }; + + // terminating statements + // these statements are the end of a path + // so they don't have any children + // which is why we empty the parents list instead of adding the node to it + + public BreakStatement: (path: NodePath) => void = ( + path + ) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering BreakStatement at ${this._getNodeId(path)}` + ); + + const node = this._createNode(path); + this._connectToParents(node); + + this._getBreakNodes().add(node.id); + this._currentParents = []; + path.skip(); + }; + + public ContinueStatement: (path: NodePath) => void = ( + path + ) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering ContinueStatement at ${this._getNodeId(path)}` + ); + + const node = this._createNode(path); + this._connectToParents(node); + + this._getContinueNodes().add(node.id); + this._currentParents = []; + path.skip(); + }; + + public ReturnStatement: (path: NodePath) => void = ( + path + ) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering ReturnStatement at ${this._getNodeId(path)}` + ); + + const node = this._createNode(path); + this._connectToParents(node); + this._currentParents = [node.id]; + + if (path.has("argument")) { + path.get("argument").visit(); + } + + for (const nodeId of this._currentParents) { + this._returnNodes.add(nodeId); + } + + this._currentParents = []; + path.skip(); + }; + + public ThrowStatement: (path: NodePath) => void = ( + path + ) => { + ControlFlowGraphVisitor.LOGGER.debug( + `Entering ThrowStatement at ${this._getNodeId(path)}` + ); + + const node = this._createNode(path); + this._connectToParents(node); + + this._throwNodes.add(node.id); + this._currentParents = []; + path.skip(); + }; +} diff --git a/libraries/javascript/lib/analysis/static/dependency/ImportGenerator.ts b/libraries/analysis-javascript/lib/dependency/DependencyFactory.ts similarity index 66% rename from libraries/javascript/lib/analysis/static/dependency/ImportGenerator.ts rename to libraries/analysis-javascript/lib/dependency/DependencyFactory.ts index 59f4fb0ca..9185dbff5 100644 --- a/libraries/javascript/lib/analysis/static/dependency/ImportGenerator.ts +++ b/libraries/analysis-javascript/lib/dependency/DependencyFactory.ts @@ -17,25 +17,27 @@ */ import { traverse } from "@babel/core"; -import { ImportVisitor } from "./ImportVisitor"; import * as t from "@babel/types"; +import { DependencyFactory as CoreDependencyFactory } from "@syntest/analysis"; + +import { DependencyVisitor } from "./DependencyVisitor"; /** - * Imports generator for targets. + * Dependency generator for targets. * * @author Dimitri Stallenberg */ -export class ImportGenerator { +export class DependencyFactory implements CoreDependencyFactory { /** * Generate function map for specified target. * - * @param targetAST The AST of the target + * @param AST The AST of the target */ - generate(filePath: string, targetAST: t.Node): Set { - const visitor = new ImportVisitor(filePath); + extract(filePath: string, AST: t.Node): string[] { + const visitor = new DependencyVisitor(filePath); - traverse(targetAST, visitor); + traverse(AST, visitor); - return visitor.imports; + return [...visitor.imports]; } } diff --git a/libraries/analysis-javascript/lib/dependency/DependencyVisitor.ts b/libraries/analysis-javascript/lib/dependency/DependencyVisitor.ts new file mode 100644 index 000000000..4383a9482 --- /dev/null +++ b/libraries/analysis-javascript/lib/dependency/DependencyVisitor.ts @@ -0,0 +1,95 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NodePath } from "@babel/core"; +import * as t from "@babel/types"; +import { AbstractSyntaxTreeVisitor } from "@syntest/ast-visitor-javascript"; +import { getLogger, Logger } from "@syntest/logging"; + +export class DependencyVisitor extends AbstractSyntaxTreeVisitor { + protected static override LOGGER: Logger; + + private _imports: Set; + + constructor(filePath: string) { + super(filePath); + DependencyVisitor.LOGGER = getLogger("DependencyVisitor"); + this._imports = new Set(); + } + + public ImportDeclaration: (path: NodePath) => void = ( + path + ) => { + this._imports.add(path.node.source.value); + }; + + public Import: (path: NodePath) => void = (path) => { + const parentNode = path.parentPath.node; + + if (parentNode.type === "CallExpression") { + // e.g. import(?) + if (parentNode.arguments.length === 1) { + if (parentNode.arguments[0].type === "StringLiteral") { + // e.g. import('module1') + this._imports.add(parentNode.arguments[0].value); + } else { + // e.g. import('module' + '1') + // e.g. import(`module${1}`) + // e.g. import(x) + // This tool does not support computed dynamic import statements. + DependencyVisitor.LOGGER.warn( + `This tool does not support computed dynamic import statements. Found one at ${this._getNodeId( + path + )}` + ); + } + } else { + // e.g. import() + // e.g. import('module1', 'module2') + // unsupported + // not possible + throw new Error("Unsupported import statement."); + } + } else { + // unsupported + // no clue what this is + throw new Error("Unsupported import statement."); + } + }; + + public CallExpression: (path: NodePath) => void = ( + path + ) => { + if ("name" in path.node.callee && path.node.callee.name === "require") { + if (path.node.arguments[0].type === "StringLiteral") { + this._imports.add(path.node.arguments[0].value); + } else { + // This tool does not support computed dynamic require statements. + DependencyVisitor.LOGGER.warn( + `This tool does not support computed dynamic require statements. Found one at ${this._getNodeId( + path + )}` + ); + } + } + }; + + get imports(): Set { + return this._imports; + } +} diff --git a/libraries/analysis-javascript/lib/target/Target.ts b/libraries/analysis-javascript/lib/target/Target.ts new file mode 100644 index 000000000..e2cd89099 --- /dev/null +++ b/libraries/analysis-javascript/lib/target/Target.ts @@ -0,0 +1,97 @@ +/* + * Copyright 2020-2021 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Core. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + SubTarget as CoreSubTarget, + Target as CoreTarget, + TargetType, +} from "@syntest/analysis"; + +import { VisibilityType } from "./VisibilityType"; + +export interface Target extends CoreTarget { + path: string; + name: string; + subTargets: SubTarget[]; +} + +export interface SubTarget extends CoreSubTarget { + type: TargetType; + id: string; +} + +export interface NamedSubTarget extends SubTarget { + name: string; +} + +export type Exportable = { + exported: boolean; + // maybe scope? + renamedTo?: string; + module?: boolean; + default?: boolean; +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function isExported(target: any): target is Exportable { + return "exported" in target && target.exported === true; +} + +export interface Callable { + isAsync: boolean; +} + +export interface FunctionTarget extends NamedSubTarget, Exportable, Callable { + type: TargetType.FUNCTION; +} + +export interface ClassTarget extends NamedSubTarget, Exportable { + type: TargetType.CLASS; +} + +export interface MethodTarget extends NamedSubTarget, Callable { + type: TargetType.METHOD; + className: string; + + visibility: VisibilityType; + + methodType: "constructor" | "method" | "get" | "set"; + isStatic: boolean; +} + +export interface ObjectTarget extends NamedSubTarget, Exportable { + type: TargetType.OBJECT; +} + +export interface ObjectFunctionTarget extends NamedSubTarget, Callable { + type: TargetType.OBJECT_FUNCTION; + objectName: string; +} + +export interface PathTarget extends SubTarget { + type: TargetType.PATH; + ids: string[]; +} + +export interface BranchTarget extends SubTarget { + type: TargetType.BRANCH; +} + +export interface LineTarget extends SubTarget { + type: TargetType.LINE; + line: number; +} diff --git a/libraries/javascript/lib/analysis/static/map/TargetMapGenerator.ts b/libraries/analysis-javascript/lib/target/TargetFactory.ts similarity index 53% rename from libraries/javascript/lib/analysis/static/map/TargetMapGenerator.ts rename to libraries/analysis-javascript/lib/target/TargetFactory.ts index d814e480d..c221135a4 100644 --- a/libraries/javascript/lib/analysis/static/map/TargetMapGenerator.ts +++ b/libraries/analysis-javascript/lib/target/TargetFactory.ts @@ -16,38 +16,46 @@ * limitations under the License. */ +import * as path from "node:path"; + import { traverse } from "@babel/core"; -import { TargetVisitor } from "./TargetVisitor"; -import { TargetMetaData } from "@syntest/core"; -import { ActionDescription } from "../parsing/ActionDescription"; import * as t from "@babel/types"; +import { TargetFactory as CoreTargetFactory } from "@syntest/analysis"; + +import { ExportVisitor } from "./export/ExportVisitor"; +import { Target } from "./Target"; +import { TargetVisitor } from "./TargetVisitor"; /** - * FUNCTION map generator for targets. + * TargetFactory for Javascript. * * @author Dimitri Stallenberg */ -export class TargetMapGenerator { +export class TargetFactory implements CoreTargetFactory { /** * Generate function map for specified target. * * @param filePath The filePath of the target - * @param targetAST The AST of the target + * @param AST The AST of the target */ - generate( - filePath: string, - targetAST: t.Node - ): { - targetMap: Map; - functionMap: Map>; - } { - const visitor = new TargetVisitor(filePath); + extract(filePath: string, AST: t.Node): Target { + // bit sad that we have to do this twice, but we need to know the exports + const exportVisitor = new ExportVisitor(filePath); + + traverse(AST, exportVisitor); + + const exports = exportVisitor.exports; + const visitor = new TargetVisitor(filePath, exports); - traverse(targetAST, visitor); + traverse(AST, visitor); - const targetMap = visitor.targetMap; - const functionMap = visitor.functionMap; + // we should check wether every export is actually used + // TODO - return { targetMap, functionMap }; + return { + path: filePath, + name: path.basename(filePath), + subTargets: visitor.subTargets, + }; } } diff --git a/libraries/analysis-javascript/lib/target/TargetVisitor.ts b/libraries/analysis-javascript/lib/target/TargetVisitor.ts new file mode 100644 index 000000000..908b46bdc --- /dev/null +++ b/libraries/analysis-javascript/lib/target/TargetVisitor.ts @@ -0,0 +1,979 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NodePath } from "@babel/core"; +import * as t from "@babel/types"; +import { TargetType } from "@syntest/analysis"; +import { AbstractSyntaxTreeVisitor } from "@syntest/ast-visitor-javascript"; + +import { + ClassTarget, + FunctionTarget, + MethodTarget, + ObjectFunctionTarget, + ObjectTarget, + SubTarget, +} from "./Target"; +import { VisibilityType } from "./VisibilityType"; +import { Export } from "./export/Export"; +import { unsupportedSyntax } from "../utils/diagnostics"; +import { getLogger, Logger } from "@syntest/logging"; + +const COMPUTED_FLAG = ":computed:"; +export class TargetVisitor extends AbstractSyntaxTreeVisitor { + protected static override LOGGER: Logger; + + private _exports: Export[]; + + private _subTargets: SubTarget[]; + + constructor(filePath: string, exports: Export[]) { + super(filePath); + TargetVisitor.LOGGER = getLogger("TargetVisitor"); + this._exports = exports; + this._subTargets = []; + } + + private _getExport( + path: NodePath, + targetName: string + ): Export | undefined { + // TODO scoping + // what if renamed + return this._exports.find((x) => { + return x.name === targetName || x.renamedTo === targetName; + }); + } + + private _getTargetNameOfDeclaration( + path: NodePath + ): string { + if (path.node.id === null) { + if (path.parentPath.node.type === "ExportDefaultDeclaration") { + // e.g. export default class {} + // e.g. export default function () {} + return "default"; + } else { + // e.g. class {} + // e.g. function () {} + // Should not be possible + throw new Error("unknown class declaration"); + } + } else { + // e.g. class x {} + // e.g. function x() {} + return path.node.id.name; + } + } + + /** + * Get the target name of an expression + * The variable the expression is assigned to is used as the target name + * @param path + * @returns + */ + private _getTargetNameOfExpression(path: NodePath): string { + // e.g. const x = class A {} + // e.g. const x = function A {} + // e.g. const x = () => {} + // we always use x as the target name instead of A + const parentNode = path.parentPath.node; + switch (parentNode.type) { + case "ClassProperty": { + // e.g. class A { ? = class {} } + // e.g. class A { ? = function () {} } + // e.g. class A { ? = () => {} } + + if (parentNode.key.type === "Identifier") { + // e.g. class A { x = class {} } + // e.g. class A { x = function () {} } + // e.g. class A { x = () => {} } + return parentNode.key.name; + } else if (parentNode.key.type.includes("Literal")) { + // e.g. class A { "x" = class {} } + // e.g. class A { "x" = function () {} } + // e.g. class A { "x" = () => {} } + return "value" in parentNode.key + ? parentNode.key.value.toString() + : "null"; + } else { + // e.g. const {x} = class {} + // e.g. const {x} = function {} + // e.g. const {x} = () => {} + // Should not be possible + throw new Error( + unsupportedSyntax(path.node.type, this._getNodeId(path)) + ); + } + } + case "VariableDeclarator": { + // e.g. const ?? = class {} + // e.g. const ?? = function {} + // e.g. const ?? = () => {} + if (parentNode.id.type === "Identifier") { + // e.g. const x = class {} + // e.g. const x = function {} + // e.g. const x = () => {} + return parentNode.id.name; + } else { + // e.g. const {x} = class {} + // e.g. const {x} = function {} + // e.g. const {x} = () => {} + // Should not be possible + throw new Error( + unsupportedSyntax(path.node.type, this._getNodeId(path)) + ); + } + } + case "AssignmentExpression": { + // e.g. ?? = class {} + // e.g. ?? = function {} + // e.g. ?? = () => {} + const assigned = parentNode.left; + if (assigned.type === "Identifier") { + // could also be memberexpression + // e.g. x = class {} + // e.g. x = function {} + // e.g. x = () => {} + return assigned.name; + } else if (assigned.type === "MemberExpression") { + // e.g. x.? = class {} + // e.g. x.? = function {} + // e.g. x.? = () => {} + if (assigned.computed === true) { + if (assigned.property.type.includes("Literal")) { + // e.g. x["y"] = class {} + // e.g. x["y"] = function {} + // e.g. x["y"] = () => {} + return "value" in assigned.property + ? assigned.property.value.toString() + : "null"; + } else { + // e.g. x[y] = class {} + // e.g. x[y] = function {} + // e.g. x[y] = () => {} + // TODO unsupported cannot get the name unless executing + TargetVisitor.LOGGER.warn( + `This tool does not support computed property assignments. Found one at ${this._getNodeId( + path + )}` + ); + return COMPUTED_FLAG; + } + } else if (assigned.property.type === "Identifier") { + // e.g. x.y = class {} + // e.g. x.y = function {} + // e.g. x.y = () => {} + return assigned.property.name; + } else { + // e.g. x.? = class {} + // e.g. x.? = function {} + // e.g. x.? = () => {} + // Should not be possible + throw new Error( + unsupportedSyntax(path.node.type, this._getNodeId(path)) + ); + } + } else { + // e.g. {x} = class {} + // e.g. {x} = function {} + // e.g. {x} = () => {} + // Should not be possible + throw new Error( + unsupportedSyntax(path.node.type, this._getNodeId(path)) + ); + } + } + case "ObjectProperty": { + // e.g. {?: class {}} + // e.g. {?: function {}} + // e.g. {?: () => {}} + if (parentNode.key.type === "Identifier") { + // e.g. {y: class {}} + // e.g. {y: function {}} + // e.g. {y: () => {}} + return parentNode.key.name; + } else if (parentNode.key.type.includes("Literal")) { + // e.g. {1: class {}} + // e.g. {1: function {}} + // e.g. {1: () => {}} + return "value" in parentNode.key + ? parentNode.key.value.toString() + : "null"; + } else { + // e.g. {?: class {}} + // e.g. {?: function {}} + // e.g. {?: () => {}} + // Should not be possible + throw new Error( + unsupportedSyntax(path.node.type, this._getNodeId(path)) + ); + } + } + case "ReturnStatement": { + // e.g. return class {} + // e.g. return function () {} + // e.g. return () => {} + return "id" in path.node && path.node.id && "name" in path.node.id + ? path.node.id.name + : "anonymous"; + } + case "CallExpression": { + // e.g. function(class {}) // dont think this one is possible but unsure + // e.g. function(function () {}) + // e.g. function(() => {}) + return "id" in path.node && path.node.id && "name" in path.node.id + ? path.node.id.name + : "anonymous"; + } + case "ConditionalExpression": { + // e.g. c ? class {} : b + // e.g. c ? function () {} : b + // e.g. c ? () => {} : b + return this._getTargetNameOfExpression(path.parentPath); + // return "id" in path.node && path.node.id + // ? path.node.id.name + // : "anonymous"; + } + case "LogicalExpression": { + // e.g. c || class {} + // e.g. c || function () {} + // e.g. c || () => {} + return this._getTargetNameOfExpression(path.parentPath); + // return "id" in path.node && path.node.id + // ? path.node.id.name + // : "anonymous"; + } + default: { + // e.g. class {} + // e.g. function () {} + // e.g. () => {} + // Should not be possible + throw new Error( + `unknown class expression ${parentNode.type} in ${this.filePath}` + ); + } + } + } + + public FunctionExpression: (path: NodePath) => void = ( + path + ) => { + this._functionExpression(path); + }; + + public FunctionDeclaration: (path: NodePath) => void = + (path) => { + // e.g. function x() {} + const targetName = this._getTargetNameOfDeclaration(path); + const export_ = this._getExport(path, targetName); + + const target: FunctionTarget = { + id: `${this._getNodeId(path)}`, + name: targetName, + type: TargetType.FUNCTION, + exported: !!export_, + default: export_ ? export_.default : false, + module: export_ ? export_.module : false, + isAsync: path.node.async, + }; + + this.subTargets.push(target); + }; + + public ClassExpression: (path: NodePath) => void = ( + path + ) => { + const targetName = this._getTargetNameOfExpression(path); + const export_ = this._getExport(path, targetName); + + const target: ClassTarget = { + id: `${this._getNodeId(path)}`, + name: targetName, + type: TargetType.CLASS, + exported: !!export_, + default: export_ ? export_.default : false, + module: export_ ? export_.module : false, + }; + + this.subTargets.push(target); + }; + + public ClassDeclaration: (path: NodePath) => void = ( + path + ) => { + // e.g. class A {} + const targetName = this._getTargetNameOfDeclaration(path); + const export_ = this._getExport(path, targetName); + + const target: ClassTarget = { + id: `${this._getNodeId(path)}`, + name: targetName, + type: TargetType.CLASS, + exported: !!export_, + default: export_ ? export_.default : false, + module: export_ ? export_.module : false, + }; + + this.subTargets.push(target); + }; + + private _getParentClassName( + path: NodePath< + | t.ClassMethod + | t.ClassProperty + | t.ClassPrivateMethod + | t.ClassPrivateProperty + > + ): string { + const parentNode = path.parentPath.parentPath.node; + const parentOfParentNode = path.parentPath.parentPath.parentPath.node; + if (parentNode.type === "ClassDeclaration") { + // e.g. class A { ... } + if (parentNode.id && parentNode.id.type === "Identifier") { + return parentNode.id.name; + } else if ( + parentOfParentNode !== undefined && + parentOfParentNode.type === "ExportDefaultDeclaration" + ) { + // e.g. export default class { ... } + return "default"; + } else { + // e.g. class { ... } + // unsupported + // should not be possible + throw new Error("unknown class method parent"); + } + } else if (parentNode.type === "ClassExpression") { + // e.g. const x = class A { ... } + // e.g. const x = class { ... } + // e.g. { x: class A { ... } } + // in all cases the name should be x + + if ( + parentOfParentNode !== undefined && + parentOfParentNode.type === "VariableDeclarator" + ) { + // e.g. ? = class A { ... } + if (parentOfParentNode.id.type === "Identifier") { + // e.g. const x = class A { ... } + return parentOfParentNode.id.name; + } else { + // e.g. ? = class { ... } + // unsupported + // should not be possible + throw new Error("unknown class method parent"); + } + } else if ( + parentOfParentNode !== undefined && + parentOfParentNode.type === "ObjectProperty" + ) { + // e.g. { x: class A { ... } } + if (parentOfParentNode.key.type === "Identifier") { + return parentOfParentNode.key.name; + } else if (parentOfParentNode.key.type.includes("Literal")) { + // e.g. { "x": class A { ... } } + return "value" in parentOfParentNode.key + ? parentOfParentNode.key.value.toString() + : "null"; + } else { + // e.g. { ??: class { ... } } + // unsupported + throw new Error("unknown class method parent"); + } + } else { + // unsupported + throw new Error("unknown class method parent"); + } + } else { + // unsupported + throw new Error("unknown class method parent"); + } + } + + public ClassMethod: (path: NodePath) => void = (path) => { + if (path.parentPath.type !== "ClassBody") { + // unsupported + // not possible i think + throw new Error("unknown class method parent"); + } + + const parentClassName: string = this._getParentClassName(path); + + if (path.node.key.type !== "Identifier") { + // e.g. class A { ?() {} } + // unsupported + // not possible i think + throw new Error("unknown class method key"); + } + + const targetName = path.node.key.name; + + let visibility = VisibilityType.PUBLIC; + if (path.node.access === "private") { + visibility = VisibilityType.PRIVATE; + } else if (path.node.access === "protected") { + visibility = VisibilityType.PROTECTED; + } + + const target: MethodTarget = { + id: `${this._getNodeId(path)}`, + name: targetName, + type: TargetType.METHOD, + className: parentClassName, + isStatic: path.node.static, + isAsync: path.node.async, + methodType: path.node.kind, + visibility: visibility, + }; + + this.subTargets.push(target); + }; + + private _functionExpression( + path: NodePath + ) { + // e.g. const x = () => {} + const targetName = this._getTargetNameOfExpression(path); + + const parent = path.parentPath; + let left; + if ( + parent.isAssignmentExpression() && + ((left = parent.get("left")), left.isMemberExpression()) + ) { + let object = left.get("object"); + const property = left.get("property"); + + if (object.isMemberExpression()) { + const subObject = object.get("object"); + const subProperty = object.get("property"); + + if (!subProperty.isIdentifier()) { + // e.g. a.x().y = function () {} + // unsupported + throw new Error( + unsupportedSyntax(path.node.type, this._getNodeId(path)) + ); + } + + if (subProperty.node.name === "prototype") { + // e.g. a.prototype.y = function() {} + object = subObject; + if (object.isIdentifier()) { + const prototypeName = object.node.name; + // find function + const target = ( + this._subTargets.find( + (target) => + target.type === TargetType.FUNCTION && + (target).name === prototypeName + ) + ); + if (target) { + // remove + this._subTargets = this._subTargets.filter( + (subTarget) => subTarget.id !== target.id + ); + // add new + this._subTargets.push( + { + id: target.id, + type: TargetType.CLASS, + name: target.name, + exported: target.exported, + renamedTo: target.renamedTo, + module: target.module, + default: target.default, + }, + // add constructor + { + id: target.id, + type: TargetType.METHOD, + name: "constructor", + className: prototypeName, + + visibility: VisibilityType.PUBLIC, + + methodType: "constructor", + isStatic: false, + isAsync: target.isAsync, + } + ); + } + // add this as class method + if (!property.isIdentifier()) { + throw new Error( + unsupportedSyntax(path.node.type, this._getNodeId(path)) + ); + } + + this._subTargets.push({ + id: `${this._getNodeId(path)}`, + type: TargetType.METHOD, + name: property.node.name, + className: prototypeName, + + visibility: VisibilityType.PUBLIC, + + methodType: "method", + isStatic: false, + isAsync: path.node.async, + }); + return; + } else { + // e.g. a().prototype.y = function() {} + throw new Error( + unsupportedSyntax(path.node.type, this._getNodeId(path)) + ); + } + } else { + // e.g. a.x.y = function () {} + // unsupported for now should create a objecttarget as a subtarget + throw new Error( + unsupportedSyntax(path.node.type, this._getNodeId(path)) + ); + } + } + + // e.g. a.x = function () {} + if (object.isIdentifier()) { + if ( + left.node.computed == true && + !property.node.type.includes("Literal") + ) { + // e.g. x[y] = class {} + // e.g. x[y] = function {} + // e.g. x[y] = () => {} + // TODO unsupported cannot get the name unless executing + TargetVisitor.LOGGER.warn( + `This tool does not support computed property assignments. Found one at ${this._getNodeId( + path + )}` + ); + return; + } + + const functionName = property.isIdentifier() + ? property.node.name + : "value" in property.node + ? property.node.value.toString() + : "null"; + + if (object.node.name === "exports") { + // e.g. exports.x = function () {} + // this is simply a function not an object function + const export_ = this._getExport(path, functionName); + + const functionTarget: FunctionTarget = { + id: `${this._getNodeId(path)}`, + type: TargetType.FUNCTION, + name: functionName, + exported: !!export_, + default: export_ ? export_.default : false, + module: export_ ? export_.module : false, + isAsync: path.node.async, + }; + this._subTargets.push(functionTarget); + } else { + const export_ = this._getExport(path, object.node.name); + + const objectTarget: ObjectTarget = { + type: TargetType.OBJECT, + name: object.node.name, + id: `${this._getNodeId(path)}`, + exported: !!export_, + default: export_ ? export_.default : false, + module: export_ ? export_.module : false, + }; + const objectFunctionTarget: ObjectFunctionTarget = { + type: TargetType.OBJECT_FUNCTION, + objectName: object.node.name, + name: functionName, + id: `${this._getNodeId(path)}`, + isAsync: path.node.async, + }; + + this.subTargets.push(objectTarget, objectFunctionTarget); + } + } else if (object.isThisExpression()) { + // TODO repair this + // get the this scope object name + // create new object function target + return; + } else { + // e.g. a().x = function () {} + // unsupported + throw new Error( + unsupportedSyntax(path.node.type, this._getNodeId(path)) + ); + } + } else + switch (parent.node.type) { + case "ClassPrivateProperty": { + // e.g. class A { #x = () => {} } + // unsupported + throw new Error("unknown class method parent"); + } + case "ClassProperty": { + // e.g. class A { x = () => {} } + const parentClassName: string = this._getParentClassName( + >path.parentPath + ); + + const visibility = VisibilityType.PUBLIC; + // apparantly there is no access property on class properties + // if (parentNode.access === "private") { + // visibility = VisibilityType.PRIVATE; + // } else if (parentNode.access === "protected") { + // visibility = VisibilityType.PROTECTED; + // } + + const target: MethodTarget = { + id: `${this._getNodeId(path)}`, + className: parentClassName, + name: targetName, + type: TargetType.METHOD, + isStatic: (parent.node).static, + isAsync: path.node.async, + methodType: "method", + visibility: visibility, + }; + + this.subTargets.push(target); + + break; + } + case "VariableDeclarator": { + if (!path.parentPath.has("id")) { + // unsupported + throw new Error( + unsupportedSyntax(path.node.type, this._getNodeId(path)) + ); + } + + const export_ = this._getExport(path, targetName); + + const target: FunctionTarget = { + id: `${this._getNodeId(path.parentPath)}`, + name: targetName, + type: TargetType.FUNCTION, + exported: !!export_, + default: export_ ? export_.default : false, + module: export_ ? export_.module : false, + isAsync: path.node.async, + }; + + this.subTargets.push(target); + + break; + } + case "LogicalExpression": + case "ConditionalExpression": { + const export_ = this._getExport(path, targetName); + + let parent = path.parentPath; + + while (parent.isLogicalExpression() || parent.isConditional()) { + parent = parent.parentPath; + } + + const target: FunctionTarget = { + id: `${this._getNodeId(parent)}`, + name: targetName, + type: TargetType.FUNCTION, + exported: !!export_, + default: export_ ? export_.default : false, + module: export_ ? export_.module : false, + isAsync: path.node.async, + }; + + this.subTargets.push(target); + } + default: { + const export_ = this._getExport(path, targetName); + + const target: FunctionTarget = { + id: `${this._getNodeId(path)}`, + name: targetName, + type: TargetType.FUNCTION, + exported: !!export_, + default: export_ ? export_.default : false, + module: export_ ? export_.module : false, + isAsync: path.node.async, + }; + + this.subTargets.push(target); + } + } + } + + public ArrowFunctionExpression: ( + path: NodePath + ) => void = (path) => { + this._functionExpression(path); + }; + + // public VariableDeclarator: (path: NodePath) => void = ( + // path + // ) => { + // if (!path.node.init) { + // return; + // } + + // if (!(path.node.init.type === "ArrowFunctionExpression")) { + // return; + // } + + // const targetName = path.node.id.name; + // const functionName = targetName; + + // this._createMaps(targetName); + + // let scope; + // path.traverse({ + // ArrowFunctionExpression: { + // enter: (p) => { + // scope = { + // uid: `${p.scope.uid - this.scopeIdOffset}`, + // filePath: this.filePath, + // }; + // }, + // }, + // FunctionExpression: { + // enter: (p) => { + // scope = { + // uid: `${p.scope.uid - this.scopeIdOffset}`, + // filePath: this.filePath, + // }; + // }, + // }, + // }); + + // this._functionMap.get(targetName).set(functionName, { + // scope: scope, + // name: functionName, + // type: ActionType.FUNCTION, + // visibility: VisibilityType.PUBLIC, + // isConstructor: false, + // parameters: path.node.init.params.map((x) => this._extractParam(x)), + // returnParameter: { + // name: "returnValue", + // typeProbabilityMap: new TypeProbability(), // TODO unknown because javascript! (check how this looks in typescript) + // }, + // isStatic: path.node.init.static, + // isAsync: path.node.init.async, + // }); + // }; + + // // prototyping + // public AssignmentExpression: ( + // path: NodePath + // ) => void = (path) => { + // if (path.node.right.type !== "FunctionExpression") { + // return; + // } + + // let scope; + // path.traverse({ + // FunctionExpression: { + // enter: (p) => { + // scope = { + // uid: `${p.scope.uid - this.scopeIdOffset}`, + // filePath: this.filePath, + // }; + // }, + // }, + // }); + + // let targetName; + + // if (path.node.left.type === "MemberExpression") { + // if ( + // path.node.left.object.name === "module" && + // path.node.left.property.name === "exports" + // ) { + // targetName = path.node.right.id?.name; + + // if (!targetName) { + // targetName = "anon"; + // } + // } else if (path.node.left.object.name === "exports") { + // targetName = path.node.left.property.name; + // } else if ( + // path.node.left.object.type === "MemberExpression" && + // path.node.left.object.property.name === "prototype" + // ) { + // targetName = path.node.left.object.object.name; + // const functionName = path.node.left.property.name; + + // if (path.node.left.computed) { + // // we cannot know the name of computed properties unless we find out what the identifier refers to + // // see line 136 of Axios.js as example + // // Axios.prototype[method] = ? + // return; + // } + + // if (functionName === "method") { + // throw new Error("Invalid functionName"); + // } + + // if (this._functionMap.has(targetName)) { + // // modify original + // this._functionMap.get(targetName).get(targetName).type = + // ActionType.CONSTRUCTOR; + // this._functionMap.get(targetName).get(targetName).isConstructor = + // true; + // } else { + // this._createMaps(targetName); + + // // modify original + // // but there is no original so... no constructor? + // } + + // // TODO this one is probably wrong + + // this._functionMap.get(targetName).set(functionName, { + // scope: scope, + // name: functionName, + // type: + // functionName === "constructor" + // ? ActionType.CONSTRUCTOR + // : ActionType.METHOD, + // visibility: VisibilityType.PUBLIC, + // isConstructor: functionName === "constructor", + // parameters: path.node.right.params.map((x) => this._extractParam(x)), + // returnParameter: { + // name: "returnValue", + // typeProbabilityMap: new TypeProbability(), // TODO unknown because javascript! (check how this looks in typescript) + // }, + // isStatic: path.node.right.static, + // isAsync: path.node.right.async, + // }); + // return; + // } else { + // targetName = path.node.left.object.name; + // const functionName = path.node.left.property.name; + + // if (path.node.left.computed) { + // // we cannot know the name of computed properties unless we find out what the identifier refers to + // // see line 136 of Axios.js as example + // // Axios.prototype[method] = ? + // return; + // } + + // if (functionName === "method") { + // throw new Error("Invalid functionName"); + // } + + // if (!this._functionMap.has(targetName)) { + // this._createMaps(targetName); + + // // modify original + // // but there is no original so... no constructor? + // } + + // if (this.functionMap.get(targetName).has(targetName)) { + // // modify original + // this._functionMap.get(targetName).get(targetName).type = + // ActionType.CONSTRUCTOR; + // this._functionMap.get(targetName).get(targetName).isConstructor = + // true; + // } + + // // TODO this one is probably wrong + + // this._functionMap.get(targetName).set(functionName, { + // scope: scope, + // name: functionName, + // type: ActionType.METHOD, + // visibility: VisibilityType.PUBLIC, + // isConstructor: false, + // parameters: path.node.right.params.map((x) => this._extractParam(x)), + // returnParameter: { + // name: "returnValue", + // typeProbabilityMap: new TypeProbability(), // TODO unknown because javascript! (check how this looks in typescript) + // }, + // isStatic: path.node.right.static, + // isAsync: path.node.right.async, + // }); + // return; + // } + // } else if (path.node.left.type === "Identifier") { + // targetName = path.node.left.name; + // } else { + // throw new Error("unknown function expression name"); + // } + + // if (!this.targetMap.has(targetName)) { + // this._createMaps(targetName); + // } + + // this._functionMap.get(targetName).set(targetName, { + // scope: scope, + // name: targetName, + // type: ActionType.FUNCTION, + // visibility: VisibilityType.PUBLIC, + // isConstructor: false, + // parameters: path.node.right.params.map((x) => this._extractParam(x)), + // returnParameter: { + // name: "returnValue", + // typeProbabilityMap: new TypeProbability(), // TODO unknown because javascript! (check how this looks in typescript) + // }, + // isStatic: path.node.right.static, + // isAsync: path.node.right.async, + // }); + // }; + + get subTargets(): SubTarget[] { + // filter duplicates because of redefinitions + // e.g. let a = 1; a = 2; + // this would result in two subtargets with the same name "a" + // but we only want the last one + this._subTargets = this._subTargets + .reverse() + .filter((subTarget, index, self) => { + if ("name" in subTarget) { + return ( + index === + self.findIndex((t) => { + return ( + "name" in t && + t.type === subTarget.type && + t.name === subTarget.name && + (t.type === TargetType.METHOD + ? (t).methodType === + (subTarget).methodType && + (t).isStatic === + (subTarget).isStatic && + (t).className === + (subTarget).className + : true) + ); + }) + ); + } + + // paths/branches/lines are always unique + return true; + }) + .reverse(); + + return this._subTargets; + } +} diff --git a/libraries/javascript/lib/analysis/static/parsing/ActionVisibility.ts b/libraries/analysis-javascript/lib/target/VisibilityType.ts similarity index 96% rename from libraries/javascript/lib/analysis/static/parsing/ActionVisibility.ts rename to libraries/analysis-javascript/lib/target/VisibilityType.ts index 628d1d566..fc425da5f 100644 --- a/libraries/javascript/lib/analysis/static/parsing/ActionVisibility.ts +++ b/libraries/analysis-javascript/lib/target/VisibilityType.ts @@ -21,7 +21,7 @@ * * @author Dimitri Stallenberg */ -export enum ActionVisibility { +export enum VisibilityType { PUBLIC = "public", PRIVATE = "private", PROTECTED = "protected", diff --git a/libraries/instrumentation-javascript/lib/index.ts b/libraries/analysis-javascript/lib/target/export/Export.ts similarity index 76% rename from libraries/instrumentation-javascript/lib/index.ts rename to libraries/analysis-javascript/lib/target/export/Export.ts index bae45b5c5..dccc3623c 100644 --- a/libraries/instrumentation-javascript/lib/index.ts +++ b/libraries/analysis-javascript/lib/target/export/Export.ts @@ -1,7 +1,7 @@ /* * Copyright 2020-2023 Delft University of Technology and SynTest contributors * - * This file is part of SynTest Framework - SynTest Javascript. + * This file is part of SynTest Framework - SynTest JavaScript. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,11 @@ * limitations under the License. */ -export * from "./instrumentation/Instrumenter"; -export * from "./instrumentation/Visitor"; -export * from "./instrumentation/VisitState"; +export interface Export { + id: string; + filePath: string; + name: string; + renamedTo: string; + default: boolean; + module: boolean; +} diff --git a/libraries/analysis-javascript/lib/target/export/ExportDefaultDeclaration.ts b/libraries/analysis-javascript/lib/target/export/ExportDefaultDeclaration.ts new file mode 100644 index 000000000..2c4d58a14 --- /dev/null +++ b/libraries/analysis-javascript/lib/target/export/ExportDefaultDeclaration.ts @@ -0,0 +1,81 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NodePath } from "@babel/core"; +import * as t from "@babel/types"; + +import { Export } from "./Export"; +import { ExportVisitor } from "./ExportVisitor"; + +export function extractExportsFromExportDefaultDeclaration( + visitor: ExportVisitor, + filePath: string, + path: NodePath +): Export { + let name: string; + let id: string; + + switch (path.node.declaration.type) { + case "Identifier": { + name = path.node.declaration.name; + id = visitor._getBindingId(path.get("declaration")); + break; + } + case "NewExpression": { + if (path.node.declaration.callee.type !== "Identifier") { + // unsupported + throw new Error("Unsupported export default declaration"); + } + name = path.node.declaration.callee.name; + // idk if this is correct + id = visitor._getNodeId(path.get("declaration")); + + break; + } + case "FunctionDeclaration": + case "ClassDeclaration": { + name = path.node.declaration.id + ? path.node.declaration.id.name + : "default"; + id = visitor._getNodeId(path.get("declaration")); + break; + } + default: { + // we could also put anon here, but that would be a bit weird + // name = "anonymous" + // unsupported + // examples which we don't support: + // export default true + // export default 1 + // export default "string" + // export default {} + // export default [] + // etc. + throw new Error("Unsupported export default declaration"); + } + } + + return { + id: id, + filePath, + name: name, + renamedTo: name, + default: true, + module: false, + }; +} diff --git a/libraries/cfg-javascript/lib/CFGGenerator.ts b/libraries/analysis-javascript/lib/target/export/ExportFactory.ts similarity index 65% rename from libraries/cfg-javascript/lib/CFGGenerator.ts rename to libraries/analysis-javascript/lib/target/export/ExportFactory.ts index 7eda13d08..73d3db992 100644 --- a/libraries/cfg-javascript/lib/CFGGenerator.ts +++ b/libraries/analysis-javascript/lib/target/export/ExportFactory.ts @@ -17,25 +17,28 @@ */ import { traverse } from "@babel/core"; -import { ControlFlowGraphVisitor } from "./ControlFlowGraphVisitor"; -import { ControlFlowGraph } from "@syntest/cfg-core"; import * as t from "@babel/types"; +import { ExportVisitor } from "./ExportVisitor"; +import { Export } from "./Export"; + /** - * Exports generator for targets. + * ExportFactory for Javascript. * * @author Dimitri Stallenberg */ -export class CFGGenerator { +export class ExportFactory { /** - * Generate function map for specified target. + * Generate exports for specified target. * - * @param targetAST The AST of the target + * @param filePath The filePath of the target + * @param AST The AST of the target */ - generate(targetAST: t.Node): ControlFlowGraph { - const visitor = new ControlFlowGraphVisitor(); - traverse(targetAST, visitor); + extract(filePath: string, AST: t.Node): Export[] { + const exportVisitor = new ExportVisitor(filePath); + + traverse(AST, exportVisitor); - return visitor.cfg; + return exportVisitor.exports; } } diff --git a/libraries/analysis-javascript/lib/target/export/ExportNamedDeclaration.ts b/libraries/analysis-javascript/lib/target/export/ExportNamedDeclaration.ts new file mode 100644 index 000000000..3da63a787 --- /dev/null +++ b/libraries/analysis-javascript/lib/target/export/ExportNamedDeclaration.ts @@ -0,0 +1,309 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { NodePath } from "@babel/core"; +import * as t from "@babel/types"; + +import { Export } from "./Export"; +import { ExportVisitor } from "./ExportVisitor"; + +function extractFromIdentifier( + visitor: ExportVisitor, + filePath: string, + path: NodePath, + initPath?: NodePath +): Export { + if (initPath && initPath.isIdentifier()) { + const binding = visitor._getBindingId(initPath); + + return { + id: binding, + filePath, + name: initPath.node.name, + renamedTo: path.node.name, + default: false, + module: false, + }; + } else { + // not sure about this id + return { + id: visitor._getNodeId(path), + filePath, + name: path.node.name, + renamedTo: path.node.name, + default: false, + module: false, + }; + } +} + +function extractFromObjectPattern( + visitor: ExportVisitor, + filePath: string, + path: NodePath, + initPath: NodePath +): Export[] { + const exports: Export[] = []; + + if (!initPath.isObjectExpression()) { + // unsupported + // e.g. export const {a} = o + throw new Error("Property init is not an object expression"); + } + + if (path.get("properties").length !== initPath.get("properties").length) { + // unsupported + // e.g. export const {a, b} = {a: 1} + // the number of properties in the object pattern should be the same as the number of properties in the object expression + throw new Error( + "Number of properties in object pattern and object expression do not match" + ); + } + + for (const property of path.get("properties")) { + if (property.isRestElement()) { + // unsupported + // e.g. export const {a, ...b} = objectA + // if we have a rest element, we bassically export all the properties of the rest element so it is not possible to know what is exported + throw new Error("RestElement is not supported"); + } + + if (property.isObjectProperty()) { + const key = property.get("key"); + if (!key.isIdentifier()) { + // unsupported + // not possible i think + throw new Error("Property key is not an identifier"); + } + + const propertyName = key.node.name; + + // find the property in the object expression that has the same name as the property in the object pattern + const match = initPath.get("properties").find((_property) => { + if (_property.node.type === "SpreadElement") { + // unsupported + // e.g. export const {a, b} = {a, ...o} + // if we have a sperad element, we bassically export all the properties of the spread element so it is not possible to know what is exported + throw new Error("SpreadElement is not supported"); + } + + if (_property.node.key.type !== "Identifier") { + // unsupported + // not possible i think + throw new Error("Property key is not an identifier"); + } + + // so we want to find the property that has the same name as the property in the object pattern + // e.g. export const {a} = {a: 1} + return _property.node.key.name === propertyName; + }); + + if (!match) { + throw new Error("Property not found"); + } + + // stupid hack to make typescript happy (is already checked above) + if (match.isSpreadElement()) { + // unsupported + // should never happen + // if we have a sperad element, we bassically export all the properties of the spread element so it is not possible to know what is exported + throw new Error("SpreadElement is not supported"); + } + + if (match.isObjectMethod()) { + // unsupported + // no idea what this is + throw new Error("ObjectMethod is not supported"); + } + + if (!key.isIdentifier()) { + // unsupported + // should never happen + throw new Error("Property key is not an identifier"); + } + + if (match.isObjectProperty()) { + if (match.node.value.type === "Identifier") { + // if the value assigned is an identifier we rename the identifier + // e.g. export const {a} = {a: b} + // in the above example we rename b to a (as the export) + + // get the binding of the local variable b + const bindingId = visitor._getBindingId(match.get("value")); + + exports.push({ + id: bindingId, + filePath, + name: match.node.value.name, + renamedTo: key.node.name, + default: false, + module: false, + }); + } else { + // no rename, probably a literal + // e.g. export const {a} = {a: 1} + exports.push({ + id: visitor._getNodeId(match.get("value")), + filePath, + name: key.node.name, + renamedTo: key.node.name, + default: false, + module: false, + }); + } + } + } + } + return exports; +} + +function extractFromArrayPattern( + visitor: ExportVisitor, + filePath: string, + path: NodePath, + initPath: NodePath +): Export[] { + const exports: Export[] = []; + + if (!initPath.isArrayExpression()) { + // unsupported + // e.g. export const [a] = o + throw new Error("Property init is not an array expression"); + } + + if (path.get("elements").length !== initPath.get("elements").length) { + // unsupported + // e.g. export const [a, b] = [1] + throw new Error("Array length does not match"); + } + + for (let index = 0; index < path.get("elements").length; index++) { + const element = path.get("elements")[index]; + const initElement = initPath.get("elements")[index]; + + if (!element.isIdentifier()) { + // unsupported + throw new Error("Array element is not an identifier"); + } + + if (initElement.isIdentifier()) { + // if the value assigned is an identifier we rename the identifier + // e.g. export const [a] = [b] + // in the above example we rename b to a (as the export) + + // get the binding of the local name + const bindingId = visitor._getBindingId(initElement); + exports.push({ + id: bindingId, + filePath, + name: initElement.node.name, + renamedTo: element.node.name, + default: false, + module: false, + }); + } else { + // no rename, probably a literal + // e.g. export const [a] = [1] + exports.push({ + id: visitor._getNodeId(initElement), + filePath, + name: element.node.name, + renamedTo: element.node.name, + default: false, + module: false, + }); + } + } + + return exports; +} + +export function extractExportsFromExportNamedDeclaration( + visitor: ExportVisitor, + filePath: string, + path: NodePath +): Export[] { + const exports: Export[] = []; + + if (path.has("declaration")) { + const declaration = path.get("declaration"); + + if ( + declaration.isFunctionDeclaration() || + declaration.isClassDeclaration() + ) { + exports.push({ + id: visitor._getNodeId(declaration), + filePath, + name: declaration.node.id.name, + renamedTo: declaration.node.id.name, + default: false, + module: false, + }); + } else if (declaration.isVariableDeclaration()) { + for (const declaration_ of declaration.get("declarations")) { + const id = declaration_.get("id"); + const init = declaration_.get("init"); + + if (id.isIdentifier()) { + exports.push(extractFromIdentifier(visitor, filePath, id, init)); + } else if (id.isObjectPattern()) { + exports.push( + ...extractFromObjectPattern(visitor, filePath, id, init) + ); + } else if (id.isArrayPattern()) { + exports.push(...extractFromArrayPattern(visitor, filePath, id, init)); + } else { + throw new Error("Unsupported declaration type"); + } + } + } else { + // unsupported + throw new Error("Unsupported declaration type"); + } + } else if (path.node.specifiers) { + for (const specifierPath of path.get("specifiers")) { + if (specifierPath.isExportSpecifier()) { + // e.g. export {a as b} + // e.g. export {a as "b"} + // e.g. export {a} + // get the binding of the local name + const bindingId = visitor._getBindingId(specifierPath.get("local")); + + exports.push({ + id: bindingId, + filePath, + name: specifierPath.node.local.name, + renamedTo: + specifierPath.node.exported.type === "Identifier" + ? specifierPath.node.exported.name + : specifierPath.node.exported.value, + default: false, + module: false, + }); + } else { + // unsupported + throw new Error("Unsupported specifier type"); + } + } + } else { + // unsupported + throw new Error("Export has no specifiers nor declarations"); + } + + return exports; +} diff --git a/libraries/analysis-javascript/lib/target/export/ExportVisitor.ts b/libraries/analysis-javascript/lib/target/export/ExportVisitor.ts new file mode 100644 index 000000000..76fde50f7 --- /dev/null +++ b/libraries/analysis-javascript/lib/target/export/ExportVisitor.ts @@ -0,0 +1,82 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NodePath } from "@babel/core"; +import * as t from "@babel/types"; +import { AbstractSyntaxTreeVisitor } from "@syntest/ast-visitor-javascript"; + +import { Export } from "./Export"; +import { extractExportsFromExportDefaultDeclaration } from "./ExportDefaultDeclaration"; +import { extractExportsFromExportNamedDeclaration } from "./ExportNamedDeclaration"; +import { extractExportsFromExpressionStatement } from "./ExpressionStatement"; + +export class ExportVisitor extends AbstractSyntaxTreeVisitor { + private _exports: Export[]; + + constructor(filePath: string) { + super(filePath); + this._exports = []; + } + + // e.g. export { foo, bar } + public ExportNamedDeclaration: ( + path: NodePath + ) => void = (path) => { + if (path.node.source) { + // this means that the export comes from another module + // we skip this because we already cover those through the original exporting module + return; + } + + this._exports.push( + ...extractExportsFromExportNamedDeclaration(this, this.filePath, path) + ); + }; + + // e.g. export default foo + public ExportDefaultDeclaration: ( + path: NodePath + ) => void = (path) => { + this._exports.push( + extractExportsFromExportDefaultDeclaration(this, this.filePath, path) + ); + }; + + // e.g. module.exports = ... + // e.g. exports.foo = ... + public ExpressionStatement: (path: NodePath) => void = + (path) => { + if (path.node.expression.type !== "AssignmentExpression") { + return; + } + + const exports = extractExportsFromExpressionStatement( + this, + this.filePath, + path + ); + if (exports) { + this._exports.push(...exports); + } + }; + + // getters + get exports(): Export[] { + return this._exports; + } +} diff --git a/libraries/analysis-javascript/lib/target/export/ExpressionStatement.ts b/libraries/analysis-javascript/lib/target/export/ExpressionStatement.ts new file mode 100644 index 000000000..f11a87a50 --- /dev/null +++ b/libraries/analysis-javascript/lib/target/export/ExpressionStatement.ts @@ -0,0 +1,317 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NodePath } from "@babel/core"; +import * as t from "@babel/types"; +import { shouldNeverHappen } from "@syntest/search"; + +import { Export } from "./Export"; +import { ExportVisitor } from "./ExportVisitor"; + +function getName(node: t.Node): string { + switch (node.type) { + case "Identifier": { + return node.name; + } + case "ArrayExpression": + case "ObjectExpression": { + return `${node.type}`; + } + case "FunctionExpression": { + return node.id?.name || "anonymous"; + } + case "ArrowFunctionExpression": { + return "anonymous"; + } + } + + if (node.type.includes("Literal")) { + return `${node.type}`; + } + + // throw new Error(`Cannot get name of node of type ${node.type}`) + return "anonymous"; +} + +export function extractExportsFromExpressionStatement( + visitor: ExportVisitor, + filePath: string, + path: NodePath +): Export[] | undefined { + const expression = path.get("expression"); + if (!expression.isAssignmentExpression()) { + // cannot happen (because we check this in the visitor) + return undefined; + } + + const assigned = expression.node.left; + const init = expression.node.right; + + const initPath = expression.get("right"); + + let name: string; + let default_ = false; + + if (assigned.type === "Identifier" && assigned.name === "exports") { + // e.g. exports = ?? + name = getName(init); + default_ = true; + } else if (assigned.type === "MemberExpression") { + const object = assigned.object; + const property = assigned.property; + + if (object.type === "Identifier") { + if (object.name === "exports") { + // e.g. exports.?? = ?? + if (property.type === "Identifier") { + if (assigned.computed) { + // e.g. exports[x] = ?? + // unsupported + throw new Error("Unsupported export declaration"); + } else { + // e.g. exports.x = ?? + name = property.name; + } + } else if (property.type === "StringLiteral") { + // e.g. exports["x"] = ?? + name = property.value; + } else { + // e.g. exports.x() = ?? + // unsupported + // dont think this is possible + throw new Error("Unsupported export declaration"); + } + } else if (object.name === "module") { + // e.g. module.? = ?? + if (property.type === "Identifier" && property.name === "exports") { + // e.g. module.exports = ?? + if (assigned.computed) { + // e.g. module[exports] = ?? + // unsupported + throw new Error("Unsupported export declaration"); + } + name = getName(init); + default_ = true; + } else if ( + property.type === "StringLiteral" && + property.value === "exports" + ) { + // e.g. module["exports"] = ?? + name = getName(init); + default_ = true; + } else { + // e.g. module.exports() = ?? + // e.g. module.somethingelse = ?? + // unsupported + // should this just return undefined? + // throw new Error("Unsupported export declaration"); + return undefined; + } + } else { + // e.g. somethingelse.? = ?? + // e.g. somethingelse.? = ?? + // dont care + return undefined; + } + } else if (object.type === "MemberExpression") { + // e.g. ??.??.?? = ?? + const higherObject = object.object; + const higherProperty = object.property; + + if ( + higherObject.type === "Identifier" && + higherObject.name === "module" && + higherProperty.type === "Identifier" && + higherProperty.name === "exports" + ) { + // e.g. module.exports.?? = ?? + if (property.type === "Identifier") { + // e.g. module.exports.x = ?? + if (assigned.computed) { + // e.g. module.exports[x] = ?? + // unsupported + throw new Error("Unsupported export declaration"); + } + name = property.name; + } else if (property.type === "StringLiteral") { + // e.g. module.exports["x"] = ?? + name = property.value; + } else { + // e.g. module.exports.x() = ?? + // unsupported + // not possible i think + throw new Error("Unsupported export declaration"); + } + } else { + // e.g. module.somethingelse.?? = ?? + // e.g. somethingelse.exports.?? = ?? + // e.g. somethingelse.somethingelse.?? = ?? + + // dont care + return undefined; + } + } else { + return undefined; + } + } else { + // this is probably an unrelated statement + // e.g. not an export + return undefined; + } + + if (!name) { + // not possible + throw new Error(shouldNeverHappen("ExpressionStatement")); + } + + const exports: Export[] = []; + + if (default_) { + if (initPath.isObjectExpression()) { + // e.g. exports = { a: ? } + // e.g. module.exports = { a: ? } + for (const property of initPath.get("properties")) { + if (property.isObjectMethod()) { + // e.g. exports = { a() {} } + + const key = property.get("key"); + if (!key.isIdentifier()) { + // e.g. exports = { () {} } + // unsupported + // not possible i think + throw new Error("Unsupported export declaration"); + } + + exports.push({ + id: visitor._getNodeId(property), + filePath, + name: key.node.name, + renamedTo: key.node.name, + default: false, + module: true, + }); + } else if (property.isSpreadElement()) { + // e.g. exports = { ...a } + // unsupported + throw new Error("Unsupported export declaration"); + } else if (property.isObjectProperty()) { + const keyPath = property.get("key"); + const valuePath = property.get("value"); + + let key: string; + if (keyPath.node.type.includes("Literal")) { + // e.g. exports = { "a": ? } + // e.g. exports = { 1: ? } + // e.g. exports = { true: ? } + // e.g. exports = { null: ? } + // eslint-disable-next-line unicorn/no-null + key = `${"value" in keyPath.node ? keyPath.node.value : null}`; + } else if (keyPath.isIdentifier()) { + // e.g. exports = { a: ? } + key = keyPath.node.name; + } else { + // e.g. exports = { 1: ? } + // unsupported + throw new Error("Unsupported export declaration"); + } + + if (valuePath.isIdentifier()) { + // e.g. exports = { a: b } + // get binding of b + const bindingId = visitor._getBindingId(valuePath); + exports.push({ + id: bindingId, + filePath, + name: valuePath.node.name, + renamedTo: key, + default: false, + module: true, + }); + } else { + // e.g. exports = { a: 1 } + exports.push({ + id: visitor._getNodeId(valuePath), + filePath, + name: key, + renamedTo: key, + default: false, + module: true, + }); + } + } + } + } else { + // e.g. exports = ? + + if (initPath.isIdentifier()) { + // e.g. exports = obj + // e.g. module.exports = obj + // get binding of obj + const bindingId = visitor._getBindingId(initPath); + + exports.push({ + id: bindingId, + filePath, + name: name, + renamedTo: name, + default: default_, + module: true, + }); + } else { + // e.g. exports = 1 + // e.g. module.exports = 1 + exports.push({ + id: visitor._getNodeId(initPath), + filePath, + name: name, + renamedTo: name, + default: default_, + module: true, + }); + } + } + } else { + // e.g. exports.a = ?? + // e.g. module.exports.a = ?? + if (init.type === "Identifier") { + // e.g. exports.a = b + // get binding of b + const bindingId = visitor._getBindingId(initPath); + exports.push({ + id: bindingId, + filePath, + name: init.name, + renamedTo: name, + default: default_, + module: true, + }); + } else { + // e.g. exports.a = 1 + exports.push({ + id: visitor._getNodeId(initPath), + filePath, + name: name, + renamedTo: name, + default: default_, + module: true, + }); + } + } + + return exports; +} diff --git a/libraries/analysis-javascript/lib/type/discovery/TypeExtractor.ts b/libraries/analysis-javascript/lib/type/discovery/TypeExtractor.ts new file mode 100644 index 000000000..9d473c389 --- /dev/null +++ b/libraries/analysis-javascript/lib/type/discovery/TypeExtractor.ts @@ -0,0 +1,113 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { getAllFiles } from "../../utils/fileSystem"; +import { ObjectVisitor } from "./object/ObjectVisitor"; +import traverse from "@babel/traverse"; +import { ElementVisitor } from "./element/ElementVisitor"; +import { RelationVisitor } from "./relation/RelationVisitor"; +import { RootContext } from "../../RootContext"; +import { Element } from "./element/Element"; +import { Relation } from "./relation/Relation"; +import { DiscoveredObjectType } from "./object/DiscoveredType"; + +export class TypeExtractor { + private _elementMap: Map; + private _relationMap: Map; + private _objectMap: Map; + + constructor() { + this._elementMap = new Map(); + this._relationMap = new Map(); + this._objectMap = new Map(); + } + + extractAll(rootContext: RootContext) { + const files = getAllFiles(rootContext.rootPath, ".js").filter( + (x) => + !x.includes("/test/") && + !x.includes(".test.js") && + !x.includes("node_modules") + ); // maybe we should also take those into account + + for (const file of files) { + this.extract(rootContext, file); + } + } + + extract(rootContext: RootContext, filePath: string) { + const elementVisitor = new ElementVisitor(filePath); + const relationVisitor = new RelationVisitor(filePath); + const complexTypeVisitor = new ObjectVisitor(filePath); + + const ast = rootContext.getAbstractSyntaxTree(filePath); + // traverse( + // ast, + // visitors.merge([elementVisitor, relationVisitor, complexTypeVisitor]) + // ); + + traverse(ast, elementVisitor); + traverse(ast, relationVisitor); + traverse(ast, complexTypeVisitor); + + this._elementMap = new Map([ + ...this._elementMap, + ...elementVisitor.elementMap, + ]); + this._relationMap = new Map([ + ...this._relationMap, + ...relationVisitor.relationMap, + ]); + this._objectMap = new Map([ + ...this._objectMap, + ...complexTypeVisitor.complexTypeMap, + ]); + } + + getElement(id: string): Element { + if (!this._elementMap.has(id)) { + throw new Error(`Element with id ${id} does not exist`); + } + return this._elementMap.get(id); + } + + getRelation(id: string): Relation { + if (!this._relationMap.has(id)) { + throw new Error(`Relation with id ${id} does not exist`); + } + return this._relationMap.get(id); + } + + getObjectType(id: string): DiscoveredObjectType { + if (!this._objectMap.has(id)) { + throw new Error(`ComplexType with id ${id} does not exist`); + } + return this._objectMap.get(id); + } + + get elementMap(): Map { + return this._elementMap; + } + + get relationMap(): Map { + return this._relationMap; + } + + get objectMap(): Map { + return this._objectMap; + } +} diff --git a/libraries/analysis-javascript/lib/type/discovery/element/Element.ts b/libraries/analysis-javascript/lib/type/discovery/element/Element.ts new file mode 100644 index 000000000..0868697b8 --- /dev/null +++ b/libraries/analysis-javascript/lib/type/discovery/element/Element.ts @@ -0,0 +1,66 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export type Element = Identifier | Literal; + +export interface Identifier { + id: string; + filePath: string; + location: { + startIndex: number; + endIndex: number; + }; + type: ElementType.Identifier; + bindingId: string; + name: string; +} + +export interface Literal { + id: string; + filePath: string; + location: { + startIndex: number; + endIndex: number; + }; + type: + | ElementType.StringLiteral + | ElementType.NumericalLiteral + | ElementType.NullLiteral + | ElementType.BooleanLiteral + | ElementType.RegExpLiteral + | ElementType.TemplateLiteral + | ElementType.BigIntLiteral + | ElementType.DecimalLiteral + | ElementType.Undefined; + value: string; +} + +export enum ElementType { + StringLiteral = "stringLiteral", + NumericalLiteral = "numericalLiteral", + NullLiteral = "nullLiteral", + BooleanLiteral = "booleanLiteral", + RegExpLiteral = "regExpLiteral", + TemplateLiteral = "templateLiteral", + BigIntLiteral = "bigIntLiteral", + DecimalLiteral = "decimalLiteral", + + Undefined = "undefined", + + Identifier = "identifier", +} diff --git a/libraries/analysis-javascript/lib/type/discovery/element/ElementVisitor.ts b/libraries/analysis-javascript/lib/type/discovery/element/ElementVisitor.ts new file mode 100644 index 000000000..f318ab99c --- /dev/null +++ b/libraries/analysis-javascript/lib/type/discovery/element/ElementVisitor.ts @@ -0,0 +1,154 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { NodePath } from "@babel/core"; +import * as t from "@babel/types"; +import { AbstractSyntaxTreeVisitor } from "@syntest/ast-visitor-javascript"; +import { Element, ElementType } from "../element/Element"; + +export class ElementVisitor extends AbstractSyntaxTreeVisitor { + private _elementMap: Map; + + get elementMap(): Map { + return this._elementMap; + } + + constructor(filePath: string) { + super(filePath); + this._elementMap = new Map(); + } + + private _createElement( + path: NodePath, + type: ElementType, + value: string + ) { + if (type === ElementType.Identifier) { + const bindingId = this._getBindingId(path); + + const element: Element = { + id: this._getNodeId(path), + filePath: this._filePath, + location: { + startIndex: (<{ index: number }>(path.node.loc.start)).index, + endIndex: (<{ index: number }>(path.node.loc.end)).index, + }, + type: ElementType.Identifier, + bindingId, + name: value, + }; + this._elementMap.set(element.id, element); + } else { + const element: Element = { + id: this._getNodeId(path), + filePath: this._filePath, + location: { + startIndex: (<{ index: number }>(path.node.loc.start)).index, + endIndex: (<{ index: number }>(path.node.loc.end)).index, + }, + type, + value, + }; + this._elementMap.set(element.id, element); + } + } + + public Identifier: (path: NodePath) => void = ( + path: NodePath + ) => { + if (path.node.name === "undefined") { + this._createElement(path, ElementType.Undefined, "undefined"); + } else { + if ( + path.parentPath.isLabeledStatement() || + path.parentPath.isContinueStatement() || + path.parentPath.isBreakStatement() + ) { + // we ignore these types of identifiers + // these all have a label property, but we don't want to add them to the element map + return; + } + + this._createElement(path, ElementType.Identifier, path.node.name); + } + }; + + public Literal: (path: NodePath) => void = ( + path: NodePath + ) => { + switch (path.node.type) { + case "StringLiteral": { + this._createElement(path, ElementType.StringLiteral, path.node.value); + break; + } + case "NumericLiteral": { + this._createElement( + path, + ElementType.NumericalLiteral, + path.node.value.toString() + ); + break; + } + case "NullLiteral": { + this._createElement(path, ElementType.NullLiteral, "null"); + break; + } + case "BooleanLiteral": { + this._createElement( + path, + ElementType.BooleanLiteral, + path.node.value.toString() + ); + break; + } + case "RegExpLiteral": { + this._createElement(path, ElementType.RegExpLiteral, path.node.pattern); + break; + } + case "TemplateLiteral": { + // we handle template literals as relations + break; + } + case "BigIntLiteral": { + this._createElement( + path, + ElementType.BigIntLiteral, + path.node.value.toString() + ); + break; + } + case "DecimalLiteral": { + this._createElement( + path, + ElementType.DecimalLiteral, + path.node.value.toString() + ); + break; + } + default: { + // should never occur + throw new Error(`Unknown literal type`); + } + } + }; + + public TemplateElement: (path: NodePath) => void = ( + path: NodePath + ) => { + this._createElement(path, ElementType.StringLiteral, path.node.value.raw); + }; +} diff --git a/libraries/javascript/lib/analysis/static/parsing/ActionType.ts b/libraries/analysis-javascript/lib/type/discovery/object/DiscoveredType.ts similarity index 66% rename from libraries/javascript/lib/analysis/static/parsing/ActionType.ts rename to libraries/analysis-javascript/lib/type/discovery/object/DiscoveredType.ts index 1d603ba5b..d32526765 100644 --- a/libraries/javascript/lib/analysis/static/parsing/ActionType.ts +++ b/libraries/analysis-javascript/lib/type/discovery/object/DiscoveredType.ts @@ -1,7 +1,7 @@ /* * Copyright 2020-2023 Delft University of Technology and SynTest contributors * - * This file is part of SynTest Framework - SynTest Javascript. + * This file is part of SynTest Framework - SynTest JavaScript. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,15 +16,18 @@ * limitations under the License. */ -/** - * Enum for a Action Types. - * - * @author Dimitri Stallenberg - */ -export enum ActionType { - METHOD = "method", - GET = "get", - SET = "set", - CONSTRUCTOR = "constructor", - FUNCTION = "function", +export type DiscoveredType = DiscoveredObjectType; + +export interface DiscoveredObjectType { + id: string; + kind: DiscoveredObjectKind; + // name -> id + properties: Map; +} + +export enum DiscoveredObjectKind { + CLASS, + OBJECT, + INTERFACE, + FUNCTION, } diff --git a/libraries/analysis-javascript/lib/type/discovery/object/ObjectVisitor.ts b/libraries/analysis-javascript/lib/type/discovery/object/ObjectVisitor.ts new file mode 100644 index 000000000..eb1864b08 --- /dev/null +++ b/libraries/analysis-javascript/lib/type/discovery/object/ObjectVisitor.ts @@ -0,0 +1,334 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { NodePath } from "@babel/core"; +import * as t from "@babel/types"; +import { AbstractSyntaxTreeVisitor } from "@syntest/ast-visitor-javascript"; +import { DiscoveredObjectKind, DiscoveredType } from "./DiscoveredType"; + +export class ObjectVisitor extends AbstractSyntaxTreeVisitor { + private _complexTypeMap: Map; + + // TODO separate stack for static and non-static properties + private _objectStack: DiscoveredType[]; + + get complexTypeMap(): Map { + return this._complexTypeMap; + } + + constructor(filePath: string) { + super(filePath); + this._complexTypeMap = new Map(); + this._objectStack = []; + } + + private _getCurrentObject(path: NodePath): DiscoveredType { + if (this._objectStack.length === 0) { + throw new Error( + `No current object found! Location: ${this._getNodeId(path)}` + ); + } + return this._objectStack[this._objectStack.length - 1]; + } + + private _removeFromStack(path: NodePath): void { + const currentObject = this._getCurrentObject(path); + if (currentObject.id === this._getNodeId(path)) { + this._objectStack.pop(); + } else { + throw new Error( + `Unexpected object stack state: ${ + currentObject.id + } !== ${this._getNodeId(path)}` + ); + } + } + + private _getPropertyName(node: t.ClassProperty["key"]) { + if (node.type === "Identifier") { + // e.g. class A { x = class {} } + // e.g. class A { x = function () {} } + // e.g. class A { x = () => {} } + return node.name; + } else if (node.type.includes("Literal")) { + // e.g. class A { "x" = class {} } + // e.g. class A { "x" = function () {} } + // e.g. class A { "x" = () => {} } + return "value" in node ? node.value.toString() : "null"; + } else { + // e.g. const {x} = class {} + // e.g. const {x} = function {} + // e.g. const {x} = () => {} + // Should not be possible + throw new Error(`Unexpected property name type: ${node.type}`); + } + } + + // classes + public ClassExpression: (path: NodePath) => void = ( + path: NodePath + ) => { + const complexType: DiscoveredType = { + id: this._getNodeId(path), + kind: DiscoveredObjectKind.CLASS, + properties: new Map(), + }; + this._complexTypeMap.set(this._getNodeId(path), complexType); + this._objectStack.push(complexType); + + path.get("body").visit(); + + this._removeFromStack(path); + + path.skip(); + }; + + public ClassDeclaration: (path: NodePath) => void = ( + path: NodePath + ) => { + const complexType: DiscoveredType = { + id: this._getNodeId(path), + kind: DiscoveredObjectKind.CLASS, + properties: new Map(), + }; + this._complexTypeMap.set(this._getNodeId(path), complexType); + this._objectStack.push(complexType); + + path.get("body").visit(); + + this._removeFromStack(path); + + path.skip(); + }; + + public ClassMethod: (path: NodePath) => void = ( + path: NodePath + ) => { + const name = this._getPropertyName(path.node.key); + const currentObject = this._getCurrentObject(path); + + currentObject.properties.set(name, this._getNodeId(path)); + }; + + public ClassPrivateMethod: (path: NodePath) => void = ( + path: NodePath + ) => { + const name = this._getPropertyName(path.node.key.id); + const currentObject = this._getCurrentObject(path); + + currentObject.properties.set(`#${name}`, this._getNodeId(path)); + }; + + public ClassProperty: (path: NodePath) => void = ( + path: NodePath + ) => { + const name = this._getPropertyName(path.node.key); + const currentObject = this._getCurrentObject(path); + + currentObject.properties.set(name, this._getNodeId(path)); + }; + + public ClassPrivateProperty: ( + path: NodePath + ) => void = (path: NodePath) => { + const name = this._getPropertyName(path.node.key.id); + const currentObject = this._getCurrentObject(path); + + currentObject.properties.set(`#${name}`, this._getNodeId(path)); + }; + + // TODO ClassAccessorProperty | TSDeclareMethod | TSIndexSignature | StaticBlock + + // TODO interfaces + // public InterfaceDeclaration: (path: NodePath) => void = ( + // path: NodePath + // ) => { + + // }; + + // Objects + public ObjectExpression: (path: NodePath) => void = ( + path: NodePath + ) => { + const complexType: DiscoveredType = { + id: this._getNodeId(path), + kind: DiscoveredObjectKind.OBJECT, + properties: new Map(), + }; + this._complexTypeMap.set(this._getNodeId(path), complexType); + this._objectStack.push(complexType); + + for (const property of path.get("properties")) { + property.visit(); + } + + this._removeFromStack(path); + + path.skip(); + }; + + public ObjectPattern: (path: NodePath) => void = ( + path: NodePath + ) => { + const complexType: DiscoveredType = { + id: this._getNodeId(path), + kind: DiscoveredObjectKind.OBJECT, + properties: new Map(), + }; + this._complexTypeMap.set(this._getNodeId(path), complexType); + this._objectStack.push(complexType); + + for (const property of path.get("properties")) { + property.visit(); + } + + this._removeFromStack(path); + + path.skip(); + }; + + public ObjectMethod: (path: NodePath) => void = ( + path: NodePath + ) => { + const name = this._getPropertyName(path.node.key); + const currentObject = this._getCurrentObject(path); + + currentObject.properties.set(name, this._getNodeId(path)); + }; + + public ObjectProperty: (path: NodePath) => void = ( + path: NodePath + ) => { + const currentObject = this._getCurrentObject(path); + + if (path.node.key.type === "PrivateName") { + const name = this._getPropertyName(path.node.key.id); + + currentObject.properties.set(`#${name}`, this._getNodeId(path)); + } else { + const name = this._getPropertyName(path.node.key); + + currentObject.properties.set(name, this._getNodeId(path)); + } + }; + + // TODO SpreadElement + + // Functions + public FunctionDeclaration: (path: NodePath) => void = + (path: NodePath) => { + const complexType: DiscoveredType = { + id: this._getNodeId(path), + kind: DiscoveredObjectKind.FUNCTION, + properties: new Map(), + }; + this._complexTypeMap.set(this._getNodeId(path), complexType); + this._objectStack.push(complexType); + + path.get("body").visit(); + + this._removeFromStack(path); + + path.skip(); + }; + + public FunctionExpression: (path: NodePath) => void = ( + path: NodePath + ) => { + const complexType: DiscoveredType = { + id: this._getNodeId(path), + kind: DiscoveredObjectKind.FUNCTION, + properties: new Map(), + }; + this._complexTypeMap.set(this._getNodeId(path), complexType); + this._objectStack.push(complexType); + + path.get("body").visit(); + + this._removeFromStack(path); + + path.skip(); + }; + + public ArrowFunctionExpression: ( + path: NodePath + ) => void = (path: NodePath) => { + const complexType: DiscoveredType = { + id: this._getNodeId(path), + kind: DiscoveredObjectKind.FUNCTION, + properties: new Map(), + }; + this._complexTypeMap.set(this._getNodeId(path), complexType); + this._objectStack.push(complexType); + + path.get("body").visit(); + + this._removeFromStack(path); + + path.skip(); + }; + + public MemberExpression: (path: NodePath) => void = ( + path: NodePath + ) => { + if (path.node.computed) { + return; + } + + if (path.node.object.type === "ThisExpression") { + const parent = this._getThisParent(path); + + const _object = this.complexTypeMap.get(this._getNodeId(parent)); + + if (!_object) { + throw new Error(`Unexpected object type: ${path.node.object.type}`); + } + + if (path.node.property.type === "PrivateName") { + const name = this._getPropertyName(path.node.property.id); + + _object.properties.set(`#${name}`, this._getNodeId(path)); + } else { + const name = this._getPropertyName(path.node.property); + + _object.properties.set(name, this._getNodeId(path)); + } + } else if (path.node.object.type === "Identifier") { + const bindingId = this._getBindingId(path.get("object")); + let _object = this.complexTypeMap.get(bindingId); + + if (!_object) { + _object = { + id: bindingId, + kind: DiscoveredObjectKind.OBJECT, // not sure actually + properties: new Map(), + }; + this._complexTypeMap.set(bindingId, _object); + } + + if (path.node.property.type === "PrivateName") { + const name = this._getPropertyName(path.node.property.id); + + _object.properties.set(`#${name}`, this._getNodeId(path)); + } else { + const name = this._getPropertyName(path.node.property); + + _object.properties.set(name, this._getNodeId(path)); + } + } + }; +} diff --git a/libraries/analysis-javascript/lib/type/discovery/relation/Relation.ts b/libraries/analysis-javascript/lib/type/discovery/relation/Relation.ts new file mode 100644 index 000000000..637ac4c97 --- /dev/null +++ b/libraries/analysis-javascript/lib/type/discovery/relation/Relation.ts @@ -0,0 +1,387 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators +// TODO add missing + +export interface Relation { + id: string; + type: RelationType; + involved: string[]; + computed?: boolean; +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function isRelation(object: any): object is Relation { + return ( + object !== undefined && + object.id !== undefined && + object.type !== undefined && + object.involved !== undefined + ); +} + +export function getRelationName(type: RelationType): string { + return Object.entries(RelationType).find(([, value]) => value === type)[0]; +} + +export enum RelationType { + // special + Return = "L->R", + Call = "L(R)", + PrivateName = "#L", + ObjectProperty = "{L:R}", + ObjectMethod = "{L(R)}", + + ClassProperty = "L{K:V}", + StaticClassProperty = "L{static K:V}", + ClassMethod = "L{R()}", + AsyncClassMethod = "L{async R()}", + StaticClassMethod = "L{static R()}", + StaticAsyncClassMethod = "L{static async R()}", + ClassConstructor = "L{constructor(R)}", + ClassGetter = "L{get R}", + ClassSetter = "L{set R}", + + ArrayPattern = "[L]", + ObjectPattern = "{L}", + RestElement = "...R", + + While = "while(L)", // also do while + If = "if(L)", + For = "for(L)", + ForIn = "for(L in R)", + ForOf = "for(L of R)", + Switch = "switch(L) case R", // L === R bassically + + // Primary Expressions + This = "this", + // literals are processed differently + ArrayInitializer = "[L]", + ObjectInitializer = "{L}", + ClassDefinition = "class L", + FunctionDefinition = "function L(R)", + FunctionStarDefinition = "function* L(R)", + AsyncFunctionDefinition = "async function L(R)", + AsyncFunctionStarDefinition = "async function* L(R)", + // RegularExpression = "/L/", this is a literal + TemplateLiteral = "`L`", + Sequence = "(L,R)", + + // Left-hand-side Expressions + PropertyAccessor = "L.R", + OptionalPropertyAccessor = "L?.R", + New = "new L()", + + // TODO new.target + // TODO import.meta + // TODO super() + // TODO import() + + // UNARY + // Increment and Decrement + PlusPlusPostFix = "L++", + MinusMinusPostFix = "L--", + PlusPlusPrefix = "++L", + MinusMinusPrefix = "--L", + + // Unary + Delete = "delete L", + Void = "void L", + TypeOf = "typeof L", + PlusUnary = "+L", + MinusUnary = "-L", + BitwiseNotUnary = "~L", + LogicalNotUnary = "!L", + Await = "await L", + + // BINARY + // Arithmetic + Addition = "L+R", + Subtraction = "L-R", + Division = "L/R", + Multiplication = "L*R", + Remainder = "L%R", + Exponentiation = "L**R", + + // Relation + Less = "L ${operator}`); +} + +function getBinaryRelationType(operator: string) { + switch (operator) { + case "+": { + return RelationType.Addition; + } + case "-": { + return RelationType.Subtraction; + } + case "/": { + return RelationType.Division; + } + case "*": { + return RelationType.Multiplication; + } + case "%": { + return RelationType.Remainder; + } + case "**": { + return RelationType.Exponentiation; + } + case "<": { + return RelationType.Less; + } + case ">": { + return RelationType.Greater; + } + case "<=": { + return RelationType.LessOrEqual; + } + case ">=": { + return RelationType.GreaterOrEqual; + } + case "instanceof": { + return RelationType.InstanceOf; + } + case "in": { + return RelationType.In; + } + + case "==": { + return RelationType.Equality; + } + case "!=": { + return RelationType.InEquality; + } + case "===": { + return RelationType.StrictEquality; + } + case "!==": { + return RelationType.StrictInequality; + } + + case "<<": { + return RelationType.BitwiseLeftShift; + } + case ">>": { + return RelationType.BitwiseRightShift; + } + case ">>>": { + return RelationType.BitwiseUnsignedRightShift; + } + + case "&": { + return RelationType.BitwiseAnd; + } + case "|": { + return RelationType.BitwiseOr; + } + case "^": { + return RelationType.BitwiseXor; + } + + case "&&": { + return RelationType.LogicalAnd; + } + case "||": { + return RelationType.LogicalAnd; + } + case "??": { + return RelationType.NullishCoalescing; + } + } + + throw new Error(`Unsupported relation type operator: binary -> ${operator}`); +} + +function getAssignmentRelationType(operator: string) { + switch (operator) { + case "=": { + return RelationType.Assignment; + } + case "*=": { + return RelationType.MultiplicationAssignment; + } + case "**=": { + return RelationType.ExponentiationAssignment; + } + case "/=": { + return RelationType.DivisionAssignment; + } + case "%=": { + return RelationType.RemainderAssigment; + } + case "+=": { + return RelationType.AdditionAssignment; + } + case "-=": { + return RelationType.SubtractionAssignment; + } + case "<<=": { + return RelationType.LeftShiftAssignment; + } + case ">>=": { + return RelationType.RightShiftAssignment; + } + case ">>>=": { + return RelationType.UnSignedRightShiftAssignment; + } + case "&=": { + return RelationType.BitwiseAndAssignment; + } + case "^=": { + return RelationType.BitwiseXorAssignment; + } + case "|=": { + return RelationType.BitwiseOrAssignment; + } + case "&&=": { + return RelationType.LogicalAndAssignment; + } + case "||=": { + return RelationType.LogicalOrAssignment; + } + case "??=": { + return RelationType.LogicalNullishAssignment; + } + } + + throw new Error( + `Unsupported relation type operator: assignment -> ${operator}` + ); +} + +export function getRelationType( + type: string, + operator: string, + prefix = false +): RelationType { + switch (type) { + case "unary": { + return getUnaryRelationType(operator, prefix); + } + case "binary": { + return getBinaryRelationType(operator); + } + case "assignment": { + return getAssignmentRelationType(operator); + } + } + + throw new Error(`Unsupported relation type operator: ${type} -> ${operator}`); +} diff --git a/libraries/analysis-javascript/lib/type/discovery/relation/RelationVisitor.ts b/libraries/analysis-javascript/lib/type/discovery/relation/RelationVisitor.ts new file mode 100644 index 000000000..7c7b524ee --- /dev/null +++ b/libraries/analysis-javascript/lib/type/discovery/relation/RelationVisitor.ts @@ -0,0 +1,537 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { NodePath } from "@babel/core"; +import * as t from "@babel/types"; +import { AbstractSyntaxTreeVisitor } from "@syntest/ast-visitor-javascript"; +import { Relation, RelationType, getRelationType } from "../relation/Relation"; + +export class RelationVisitor extends AbstractSyntaxTreeVisitor { + private _relationMap: Map; + + get relationMap(): Map { + return this._relationMap; + } + + constructor(filePath: string) { + super(filePath); + this._relationMap = new Map(); + } + + private _createRelation( + path: NodePath, + type: RelationType, + involved: NodePath[], + computed = false + ) { + const id = this._getNodeId(path); + const relation: Relation = { + id: id, + type: type, + involved: involved.map((p) => { + if ( + p === undefined || + p === null || + p.node === null || + p.node === undefined + ) { + // throw new Error(`Involved node is undefined or null for ${id}`); + return `${id}::anonymous`; // TODO we should look into this + } + return this._getNodeId(p); + }), + computed, + }; + + this._relationMap.set(relation.id, relation); + } + // special + public ReturnStatement: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.Return; + + // get the function id + const functionPath = path.findParent((p) => p.isFunction()); + + if (functionPath === null) { + // should not be possible + throw new Error("Return statement is not inside a function"); + } + + if (path.has("argument")) { + this._createRelation(path, type, [functionPath, path.get("argument")]); + } else { + this._createRelation(path, type, [functionPath]); + } + }; + + public CallExpression: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.Call; + this._createRelation(path, type, [ + path.get("callee"), + ...path.get("arguments"), + ]); + }; + + public PrivateName: (path: NodePath) => void = (path) => { + const type = RelationType.PrivateName; + this._createRelation(path, type, [path.get("id")]); + }; + + public ObjectProperty: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.ObjectProperty; + this._createRelation( + path, + type, + [path.get("key"), path.get("value")], + path.node.computed + ); + }; + + public ObjectMethod: (path: NodePath) => void = (path) => { + const type = RelationType.ObjectMethod; + this._createRelation( + path, + type, + [path.get("key"), ...path.get("params")], + path.node.computed + ); + }; + + public ClassProperty: (path: NodePath) => void = (path) => { + const classParent = path.findParent((p) => p.isClass()); + const involved = [classParent, path.get("key")]; + + if (path.has("value")) { + involved.push(path.get("value")); + } + + if (path.node.static) { + this._createRelation( + path, + RelationType.StaticClassProperty, + involved, + path.node.computed + ); + } else { + this._createRelation( + path, + RelationType.ClassProperty, + involved, + path.node.computed + ); + } + }; + + public ClassMethod: (path: NodePath) => void = (path) => { + const classParent = path.findParent((p) => p.isClass()); + + switch (path.node.kind) { + case "constructor": { + this._createRelation( + path, + RelationType.ClassConstructor, + [classParent, path.get("key"), ...path.get("params")], + path.node.computed + ); + break; + } + case "get": { + this._createRelation( + path, + RelationType.ClassGetter, + [classParent, path.get("key")], + path.node.computed + ); + break; + } + case "set": { + this._createRelation( + path, + RelationType.ClassSetter, + [classParent, path.get("key"), ...path.get("params")], + path.node.computed + ); + break; + } + default: { + if (path.node.static && path.node.async) { + this._createRelation( + path, + RelationType.StaticAsyncClassMethod, + [classParent, path.get("key"), ...path.get("params")], + path.node.computed + ); + } else if (path.node.static) { + this._createRelation( + path, + RelationType.StaticClassMethod, + [classParent, path.get("key"), ...path.get("params")], + path.node.computed + ); + } else if (path.node.async) { + this._createRelation( + path, + RelationType.AsyncClassMethod, + [classParent, path.get("key"), ...path.get("params")], + path.node.computed + ); + } else { + this._createRelation( + path, + RelationType.ClassMethod, + [classParent, path.get("key"), ...path.get("params")], + path.node.computed + ); + } + } + } + }; + + public ArrayPattern: (path: NodePath) => void = (path) => { + const type = RelationType.ArrayPattern; + + if (path.has("elements")) { + this._createRelation( + path, + type, + path.get("elements").filter((p) => p.node !== null) + ); + } else { + this._createRelation(path, type, []); + } + }; + + public ObjectPattern: (path: NodePath) => void = (path) => { + const type = RelationType.ObjectPattern; + + if (path.has("properties")) { + this._createRelation(path, type, path.get("properties")); + } else { + this._createRelation(path, type, []); + } + }; + + public RestElement: (path: NodePath) => void = (path) => { + const type = RelationType.RestElement; + this._createRelation(path, type, [path.get("argument")]); + }; + + // primary expression + public ThisExpression: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.This; + + const parent = this._getThisParent(path); + + this._createRelation(path, type, [parent]); + }; + + public ArrayExpression: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.ArrayInitializer; + + if (path.has("elements")) { + this._createRelation( + path, + type, + path.get("elements").filter((p) => p.node !== null) + ); + } else { + this._createRelation(path, type, []); + } + }; + + public ObjectExpression: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.ObjectInitializer; + + if (path.has("properties")) { + this._createRelation(path, type, path.get("properties")); + } else { + this._createRelation(path, type, []); + } + }; + + public FunctionExpression: (path: NodePath) => void = ( + path + ) => { + const involved = [path.get("id"), ...path.get("params")]; + + if (path.node.generator && path.node.async) { + this._createRelation( + path, + RelationType.AsyncFunctionStarDefinition, + involved + ); + } else if (path.node.generator) { + this._createRelation(path, RelationType.FunctionStarDefinition, involved); + } else if (path.node.async) { + this._createRelation( + path, + RelationType.AsyncFunctionDefinition, + involved + ); + } else { + this._createRelation(path, RelationType.FunctionDefinition, involved); + } + }; + + public FunctionDeclaration: (path: NodePath) => void = + (path) => { + if (path.node.generator && path.node.async) { + this._createRelation(path, RelationType.AsyncFunctionStarDefinition, [ + path.get("id"), + ...path.get("params"), + ]); + } else if (path.node.generator) { + this._createRelation(path, RelationType.FunctionStarDefinition, [ + path.get("id"), + ...path.get("params"), + ]); + } else if (path.node.async) { + this._createRelation(path, RelationType.AsyncFunctionDefinition, [ + path.get("id"), + ...path.get("params"), + ]); + } else { + this._createRelation(path, RelationType.FunctionDefinition, [ + path.get("id"), + ...path.get("params"), + ]); + } + }; + + public ArrowFunctionExpression: ( + path: NodePath + ) => void = (path) => { + const type = RelationType.FunctionDefinition; + // no id for arrow functions + this._createRelation(path, type, [undefined, ...path.get("params")]); + }; + + public ClassExpression: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.ClassDefinition; + this._createRelation(path, type, [path.get("id")]); + }; + + public ClassDeclaration: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.ClassDefinition; + this._createRelation(path, type, [path.get("id")]); + }; + + public TemplateLiteral: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.TemplateLiteral; + this._createRelation(path, type, [ + ...path.get("quasis"), + ...path.get("expressions"), + ]); + }; + + public SequenceExpression: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.Sequence; + this._createRelation(path, type, path.get("expressions")); + }; + + // left-hand-side expression + public MemberExpression: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.PropertyAccessor; + this._createRelation( + path, + type, + [path.get("object"), path.get("property")], + path.node.computed + ); + }; + + public OptionalMemberExpression: ( + path: NodePath + ) => void = (path) => { + const type = RelationType.OptionalPropertyAccessor; + this._createRelation( + path, + type, + [path.get("object"), path.get("property")], + path.node.computed + ); + }; + + public MetaProperty: (path: NodePath) => void = (path) => { + const type = RelationType.PropertyAccessor; + this._createRelation(path, type, [path.get("meta"), path.get("property")]); + }; + + public NewExpression: (path: NodePath) => void = (path) => { + const type = RelationType.New; + this._createRelation(path, type, [ + path.get("callee"), + ...path.get("arguments"), + ]); + }; + + // UNARY + // increment and decrement + public UpdateExpression: (path: NodePath) => void = ( + path + ) => { + const type = getRelationType("unary", path.node.operator, path.node.prefix); + this._createRelation(path, type, [path.get("argument")]); + }; + + // unary + public UnaryExpression: (path: NodePath) => void = ( + path + ) => { + const type = getRelationType("unary", path.node.operator, path.node.prefix); + this._createRelation(path, type, [path.get("argument")]); + }; + + public AwaitExpression: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.Await; + this._createRelation(path, type, [path.get("argument")]); + }; + + // binary + public BinaryExpression: (path: NodePath) => void = ( + path + ) => { + const type = getRelationType("binary", path.node.operator); + this._createRelation(path, type, [path.get("left"), path.get("right")]); + }; + + public LogicalExpression: (path: NodePath) => void = ( + path + ) => { + const type = getRelationType("binary", path.node.operator); + this._createRelation(path, type, [path.get("left"), path.get("right")]); + }; + + // ternary + public ConditionalExpression: ( + path: NodePath + ) => void = (path) => { + const type = RelationType.Conditional; + this._createRelation(path, type, [ + path.get("test"), + path.get("consequent"), + path.get("alternate"), + ]); + }; + + // assignment + public AssignmentExpression: ( + path: NodePath + ) => void = (path) => { + const type = getRelationType("assignment", path.node.operator); + this._createRelation(path, type, [path.get("left"), path.get("right")]); + }; + + public AssignmentPattern: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.Assignment; + this._createRelation(path, type, [path.get("left"), path.get("right")]); + }; + + public VariableDeclarator: (path: NodePath) => void = ( + path + ) => { + if (path.has("init")) { + const type = RelationType.Assignment; + this._createRelation(path, type, [path.get("id"), path.get("init")]); + } + // if there is no init, it is a declaration + // declarations are handled by the ElementVisitor + }; + + // TODO yield + // spread + public SpreadElement: (path: NodePath) => void = (path) => { + const type = RelationType.Spread; + this._createRelation(path, type, [path.get("argument")]); + }; + + // TODO comma + + public WhileStatement: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.While; + this._createRelation(path, type, [path.get("test")]); + }; + + public IfStatement: (path: NodePath) => void = (path) => { + const type = RelationType.If; + this._createRelation(path, type, [path.get("test")]); + }; + + public ForStatement: (path: NodePath) => void = (path) => { + const type = RelationType.For; + if (path.has("test")) { + this._createRelation(path, type, [path.get("test")]); + } else { + this._createRelation(path, type, []); + } + }; + + public ForInStatement: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.ForIn; + this._createRelation(path, type, [path.get("left"), path.get("right")]); + }; + + public ForOfStatement: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.ForIn; + this._createRelation(path, type, [path.get("left"), path.get("right")]); + }; + + public SwitchStatement: (path: NodePath) => void = ( + path + ) => { + const type = RelationType.Switch; + this._createRelation(path, type, [ + path.get("discriminant"), + ...path + .get("cases") + .filter((p) => p.has("test")) + .map((p) => p.get("test")), + ]); + }; +} diff --git a/libraries/analysis-javascript/lib/type/resolving/InferenceTypeModelFactory.ts b/libraries/analysis-javascript/lib/type/resolving/InferenceTypeModelFactory.ts new file mode 100644 index 000000000..aabdbd662 --- /dev/null +++ b/libraries/analysis-javascript/lib/type/resolving/InferenceTypeModelFactory.ts @@ -0,0 +1,1205 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Relation, RelationType } from "../discovery/relation/Relation"; +import { elementTypeToTypingType, TypeEnum } from "./TypeEnum"; +import { TypeModelFactory } from "./TypeModelFactory"; + +import { Element, ElementType } from "../discovery/element/Element"; +import { TypeModel } from "./TypeModel"; +import { ArrayType, FunctionType, ObjectType } from "./Type"; + +export class InferenceTypeModelFactory extends TypeModelFactory { + private _typeModel: TypeModel; + + private _elementMap: Map; + private _relationsMap: Map; + + private _idToBindingIdMap: Map; + + // private _processedIds: Set; + + constructor() { + super(); + this._elementMap = new Map(); + this._relationsMap = new Map(); + + this._idToBindingIdMap = new Map(); + + // this._processedIds = new Set(); + } + + resolveTypes( + elementMap: Map, + relationMap: Map + ) { + this._typeModel = new TypeModel(); + this._elementMap = elementMap; + this._relationsMap = relationMap; + + this.createLiteralTypeMaps(elementMap); + this.createIdentifierTypeMaps(elementMap); + this.createRelationTypeMaps(relationMap); + + // create objects + + this.inferRelationTypes(relationMap); + + return this._typeModel; + } + + createNewTypeProbability(id: string, bindingId: string) { + this._typeModel.addId(bindingId); + + if (id === bindingId) { + // don't set if the id and binding are equal + return; + } + + if ( + this._idToBindingIdMap.has(id) && + this._idToBindingIdMap.get(id) !== bindingId + ) { + throw new Error( + `Setting a new binding id to a previously set id is not allowed. Id: ${id}, old binding: ${this._idToBindingIdMap.get( + id + )}, new binding: ${bindingId}` + ); + } + + this._idToBindingIdMap.set(id, bindingId); + // always requires a mapping to itself + // because for example a global variable is never declared + // so we create a global::variable binding id + // but this binding id is never created in the element map + // so we manually add it here + // if () + // this._idToBindingIdMap.set(bindingId, bindingId); + } + + createLiteralTypeMaps(elementMap: Map) { + for (const element of elementMap.values()) { + if (element.type === ElementType.Identifier) { + continue; + } + + this.createNewTypeProbability(element.id, element.id); + this._typeModel.addPrimitiveTypeScore(element.id, { + type: elementTypeToTypingType(element.type), + }); + } + } + + createIdentifierTypeMaps(elementMap: Map) { + for (const element of elementMap.values()) { + if (element.type !== ElementType.Identifier) { + continue; + } + + this.createNewTypeProbability(element.id, element.bindingId); + } + } + + createRelationTypeMaps(relationMap: Map) { + for (const relation of relationMap.values()) { + this.createNewTypeProbability(relation.id, relation.id); + + for (let index = 0; index < relation.involved.length; index++) { + const involvedId = relation.involved[index]; + if (this._elementMap.has(involvedId)) { + const element = this._elementMap.get(involvedId); + + if (element.type === ElementType.Identifier) { + this.createNewTypeProbability(element.id, element.bindingId); + } else { + this.createNewTypeProbability(element.id, element.id); + } + } else { + // relation + this.createNewTypeProbability(involvedId, involvedId); + } + } + } + } + + // findComplexTypes(relationMap: Map) { + // const complexTypes = new Map(); + + // for (const relation of relationMap.values()) { + // if (relation.type === RelationType.PropertyAccessor || relation.type === RelationType.OptionalPropertyAccessor) { + // let objectId = relation.involved[0] + // objectId = this._idRefersToIdMap.has(objectId) ? this._idRefersToIdMap.get(objectId) : objectId + + // const propertyId = relation.involved[1] + + // const object = this._totalElementsMap.has(objectId) ? this._totalElementsMap.get(objectId) : this._totalRelationsMap.get(objectId); + // const property = this._totalElementsMap.has(propertyId) ? this._totalElementsMap.get(propertyId) : this._totalRelationsMap.get(propertyId); + + // if (object === undefined || property === undefined) { + // throw new Error(`Object or property not found object: ${object}, property: ${property}`); + // } + + // if (!complexTypes.has(objectId)) { + // complexTypes.set(objectId, { + // id: objectId, + // properties: new Map() + // }); + // } + + // if (isRelation(property)) { // i.e. property is a function + // // check wether the relation is actually a function of some sort + // const functionId = property.involved[0] + // const functionElement = this._totalElementsMap.get(functionId) + // const propertyName = "name" in functionElement ? functionElement.name : functionElement.value + + // // TODO or function id? + // complexTypes.get(objectId).properties.set(propertyName, this.getTyping(property.id)) + // } else { + // const propertyName = "name" in property ? property.name : property.value + // complexTypes.get(objectId).properties.set(propertyName, this.getTyping(property.id)) + // } + // } else if (relation.type === RelationType.ObjectPattern) { + // const properties = new Map() + + // for (const elementId of relation.involved) { + // const subRelation = this._totalRelationsMap.get(elementId) + + // if (subRelation === undefined) { + // throw new Error(`Subrelation not found ${elementId}`); + // } + + // if (subRelation.type === RelationType.ObjectProperty) { + // const propertyId = subRelation.involved[0] + // const property = this._totalElementsMap.get(propertyId) + + // if (property === undefined) { + // throw new Error(`Property not found ${propertyId}`); + // } + + // const propertyName = "name" in property ? property.name : property.value + + // const valueId = subRelation.involved[1] + // properties.set(propertyName, this.getTyping(valueId)) + // } else if (subRelation.type === RelationType.ObjectMethod) { + // const propertyId = subRelation.involved[0] + // const property = this._totalElementsMap.get(propertyId) + + // if (property === undefined) { + // throw new Error(`Property not found ${propertyId}`); + // } + + // const propertyName = "name" in property ? property.name : property.value + + // properties.set(propertyName, this.getTyping(propertyId)) + // } + // } + + // complexTypes.set(relation.id, { + // id: relation.id, + // properties: properties + // }); + // } else if (relation.type === RelationType.ClassDefinition) { + + // } + + // } + // } + + inferRelationTypes(relationMap: Map) { + const solveOrder = [ + RelationType.ClassDefinition, + RelationType.ObjectPattern, + RelationType.ArrayPattern, + RelationType.ObjectInitializer, + RelationType.ArrayInitializer, + + RelationType.FunctionDefinition, + RelationType.FunctionStarDefinition, + RelationType.AsyncFunctionDefinition, + RelationType.AsyncFunctionStarDefinition, + + RelationType.ClassProperty, + RelationType.StaticClassProperty, + RelationType.ClassMethod, + RelationType.AsyncClassMethod, + RelationType.StaticClassMethod, + RelationType.StaticAsyncClassMethod, + RelationType.ClassConstructor, + RelationType.ClassGetter, + RelationType.ClassSetter, + + RelationType.ObjectMethod, + RelationType.ObjectProperty, + + RelationType.Return, + + RelationType.PropertyAccessor, + RelationType.OptionalPropertyAccessor, + ]; + const sortedRelations = [...relationMap.values()].sort((a, b) => { + const aIndex = solveOrder.indexOf(a.type); + const bIndex = solveOrder.indexOf(b.type); + + if (aIndex === -1) { + return 1; + } else if (bIndex === -1) { + return -1; + } else { + return aIndex - bIndex; + } + }); + + for (const relation of sortedRelations) { + this.resolveRelation(relation); + } + } + + getElement(id: string): Element { + return this._elementMap.get(id); + } + + getRelation(id: string): Relation { + return this._relationsMap.get(id); + } + + resolveRelation(relation: Relation): void { + const relationId = relation.id; + const relationType: RelationType = relation.type; + const involved: string[] = relation.involved.map((id) => { + while (this._idToBindingIdMap.has(id)) { + id = this._idToBindingIdMap.get(id); + } + return id; + }); + + switch (relationType) { + case RelationType.Return: { + const functionId = involved[0]; + const argumentId = involved[1]; + + if (argumentId !== undefined) { + this._typeModel.addRelationScore(relationId, argumentId); + + const type = ( + this._typeModel.getType(functionId, TypeEnum.FUNCTION) + ); + + type.return.add(argumentId); + } + + break; + } + case RelationType.Call: { + // TODO currently not possible because of the way the relations are created + + // const [functionId, ...arguments_] = involved; + + // const type = this._typeModel.getType(functionId, TypeEnum.FUNCTION) + + // // relation result is equal to return type of functionId + // for (const returnValueId of type.return) { + // this._typeModel.addRelationScore(relationId, returnValueId) + // } + + // // couple function arguments with function parameters + // if (arguments_.length > type.parameters.size) { + // throw new Error(`Function ${functionId} has ${type.parameters.size} parameters, but was called with ${arguments_.length} arguments`) + // } + + // for (const [index, argumentId] of arguments_.entries()) { + // const parameterId = type.parameters.get(index) + // this._typeModel.addRelationScore(parameterId, argumentId) + // } + + break; + } + case RelationType.PrivateName: { + // TODO + break; + } + case RelationType.ObjectProperty: { + const [propertyId, valueId] = involved; + + const propertyElement = this._elementMap.get(propertyId); + const propertyMap = new Map(); + + if (propertyElement) { + const propertyName = + "name" in propertyElement + ? propertyElement.name + : propertyElement.value; + + propertyMap.set(propertyName, propertyId); + } else { + // TODO what if the property is not an element (spread element for example) + } + + // create object type + this._typeModel.addObjectTypeScore(relationId, { + type: TypeEnum.OBJECT, + properties: propertyMap, + }); + + // connect property to value + if (valueId !== undefined) { + this._typeModel.addRelationScore(propertyId, valueId); + } + + break; + } + case RelationType.ObjectMethod: { + const [functionId, ...parameters] = involved; + + // TODO what if the property is not an element + const propertyElement = this._elementMap.get(functionId); + const propertyName = + "name" in propertyElement + ? propertyElement.name + : propertyElement.value; + + const propertyMap = new Map(); + propertyMap.set(propertyName, functionId); + + // create object type + this._typeModel.addObjectTypeScore(relationId, { + type: TypeEnum.OBJECT, + properties: propertyMap, + }); + + // create function type + this._typeModel.addFunctionTypeScore(functionId, { + type: TypeEnum.FUNCTION, + parameters: new Map(parameters.map((id, index) => [index, id])), + return: new Set(), + }); + + break; + } + + case RelationType.ClassProperty: + case RelationType.StaticClassProperty: { + if (involved.length < 2) { + throw new Error( + `Class property relation should have at least 2 elements, but has ${involved.length}` + ); + } + + const classId = involved[0]; + const propertyId = involved[1]; + const valueId = involved[2]; + + // TODO what if the property is not an element + const propertyElement = this.getElement(propertyId); + const propertyName = + "name" in propertyElement + ? propertyElement.name + : propertyElement.value; + + const propertyMap = new Map(); + propertyMap.set(propertyName, propertyId); + + // make object for the class + this._typeModel.addObjectTypeScore(classId, { + type: TypeEnum.OBJECT, + properties: propertyMap, + }); + + // connect property to value + if (valueId !== undefined) { + this._typeModel.addRelationScore(propertyId, valueId); + } + + break; + } + case RelationType.ClassMethod: + case RelationType.AsyncClassMethod: + case RelationType.StaticClassMethod: + case RelationType.StaticAsyncClassMethod: + case RelationType.ClassConstructor: + case RelationType.ClassGetter: + case RelationType.ClassSetter: { + if (involved.length < 2) { + throw new Error( + `Class method relation should have at least 2 elements, but has ${involved.length}` + ); + } + + const [classId, functionId, ...parameters] = involved; + + // TODO what if the function id is not an element + const propertyElement = this.getElement(functionId); + const propertyName = + "name" in propertyElement + ? propertyElement.name + : propertyElement.value; + + const propertyMap = new Map(); + propertyMap.set(propertyName, functionId); + + // make object for the class + this._typeModel.addObjectTypeScore(classId, { + type: TypeEnum.OBJECT, + properties: propertyMap, + }); + + // TODO maybe not for setter / getter + // make function for the method + this._typeModel.addFunctionTypeScore(functionId, { + type: TypeEnum.FUNCTION, + parameters: new Map(parameters.map((id, index) => [index, id])), + return: new Set(), + }); + break; + } + + case RelationType.ArrayPattern: { + const elements = involved; + + // create array type + this._typeModel.addArrayTypeScore(relationId, { + type: TypeEnum.ARRAY, + elements: new Map(elements.map((id, index) => [index, id])), + }); + + break; + } + case RelationType.ObjectPattern: { + // create object type + this._typeModel.addObjectTypeScore(relationId, { + type: TypeEnum.OBJECT, + properties: new Map(), // the properties are added through the ObjectMethod/ObjectProperty relations + }); + break; + } + case RelationType.RestElement: { + const restElement = involved[0]; + + // create array type + this._typeModel.addArrayTypeScore(relationId, { + type: TypeEnum.ARRAY, + elements: new Map(), + }); + + // connect rest element to array + this._typeModel.addRelationScore(restElement, relationId); + break; + } + + case RelationType.While: + case RelationType.If: { + const conditionId = involved[0]; + + // add boolean type to condition + this._typeModel.addPrimitiveTypeScore(conditionId, { + type: TypeEnum.BOOLEAN, + }); + + break; + } + case RelationType.For: { + const conditionId = involved[0]; + + if (conditionId) { + // weird + break; + } + // add boolean type to condition + this._typeModel.addPrimitiveTypeScore(conditionId, { + type: TypeEnum.BOOLEAN, + }); + + break; + } + case RelationType.ForIn: { + const declarator = involved[0]; + const arrayOrObject = involved[1]; + + // create array type + this._typeModel.addArrayTypeScore(arrayOrObject, { + type: TypeEnum.ARRAY, + elements: new Map(), + }); + + // create object type + this._typeModel.addObjectTypeScore(arrayOrObject, { + type: TypeEnum.OBJECT, + properties: new Map(), + }); + + const typeOfArray = ( + this._typeModel.getType(arrayOrObject, TypeEnum.ARRAY) + ); + + for (const id of typeOfArray.elements.values()) { + // connect declarator to array element + this._typeModel.addRelationScore(declarator, id); + } + + const typeOfObject = ( + this._typeModel.getType(arrayOrObject, TypeEnum.OBJECT) + ); + + for (const id of typeOfObject.properties.values()) { + // connect declarator to object property + this._typeModel.addRelationScore(declarator, id); + } + + break; + } + case RelationType.ForOf: { + const declarator = involved[0]; + const array = involved[1]; + + // create array type + this._typeModel.addArrayTypeScore(array, { + type: TypeEnum.ARRAY, + elements: new Map(), + }); + + const typeOfArray = ( + this._typeModel.getType(array, TypeEnum.ARRAY) + ); + + for (const id of typeOfArray.elements.values()) { + // connect declarator to array element + this._typeModel.addRelationScore(declarator, id); + } + + break; + } + case RelationType.Switch: { + const [discriminant, ...cases] = involved; + + for (const case_ of cases) { + this._typeModel.addRelationScore(discriminant, case_); + } + + break; + } + + // Primary Expressions + case RelationType.This: { + const thisParent = involved[0]; + + // add this type to parent + this._typeModel.addRelationScore(thisParent, relationId); + + // create object type + this._typeModel.addObjectTypeScore(relationId, { + type: TypeEnum.OBJECT, + properties: new Map(), + }); + + break; + } + + case RelationType.ArrayInitializer: { + const elements = involved; + + // create array type + this._typeModel.addArrayTypeScore(relationId, { + type: TypeEnum.ARRAY, + elements: new Map(elements.map((id, index) => [index, id])), + }); + + break; + } + case RelationType.ObjectInitializer: { + // create object type + this._typeModel.addObjectTypeScore(relationId, { + type: TypeEnum.OBJECT, + properties: new Map(), // the properties are added through the ObjectMethod/ObjectProperty relations + }); + break; + } + + case RelationType.ClassDefinition: { + if (involved.length === 0) { + throw new Error(`Class definition has no involved elements`); + } + const classId = involved[0]; + + // make object for the class + this._typeModel.addObjectTypeScore(classId, { + type: TypeEnum.OBJECT, + properties: new Map(), // the properties are added through the ClassMethod/ClassProperty relations + }); + + // connect class to relation + this._typeModel.addRelationScore(classId, relationId); + + break; + } + + case RelationType.FunctionDefinition: + case RelationType.FunctionStarDefinition: + case RelationType.AsyncFunctionDefinition: + case RelationType.AsyncFunctionStarDefinition: { + if (involved.length === 0) { + throw new Error(`Function definition has no involved elements`); + } + const [functionId, ...parameters] = involved; + + // make function for the function + this._typeModel.addFunctionTypeScore(functionId, { + type: TypeEnum.FUNCTION, + parameters: new Map(parameters.map((id, index) => [index, id])), + return: new Set(), + }); + + // connect function to relation + this._typeModel.addRelationScore(functionId, relationId); + + break; + } + + case RelationType.TemplateLiteral: { + // TODO something with the quasis and expressions + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.STRING, + }); + break; + } + + case RelationType.Sequence: { + // TODO nothing i think + break; + } + + // Left-hand-side Expressions + case RelationType.PropertyAccessor: + case RelationType.OptionalPropertyAccessor: { + // TODO + const [objectId, propertyId] = involved; + + // if (propertyId !== relationId) { + // throw new Error(`Property accessor relation has wrong involved elements: ${propertyId} !== ${relationId}`); + // } + if (!objectId.includes("truncate")) { + break; + } + + const propertyElement = this.getElement(propertyId); + + if (propertyElement === undefined) { + // TODO what if the property is not an element + } else { + const propertyName = + "name" in propertyElement + ? propertyElement.name + : propertyElement.value; + + // add object type to object + this._typeModel.addObjectTypeScore(objectId, { + type: TypeEnum.OBJECT, + properties: new Map([[propertyName, propertyId]]), // can't add properties since we only know the propertyName + }); + + if (propertyElement.type === ElementType.NumericalLiteral) { + // e.g. object[0] + // add array type to object + this._typeModel.addArrayTypeScore(objectId, { + type: TypeEnum.ARRAY, + elements: new Map(), // can't add elements since we only know the index, i.e. Number(propertyName) + }); + } + } + + // we don't have to connect the relationid to the propertyId since they are equal already + this._typeModel.addRelationScore(relationId, propertyId); + + // ofcourse this can be any object type (string, function, etc) + // however if we match the object type to the string object type we can get more information here + + break; + } + + case RelationType.New: { + const class_ = involved[0]; + // TODO maybe this is not neccessary since the class is already connected to the relation + // this._typeModel.addObjectTypeScore(relationId, { + // type: TypeEnum.OBJECT, + // properties: new Map() + // }); + this._typeModel.addRelationScore(relationId, class_); + break; + } + + case RelationType.PlusPlusPrefix: // must be numerical + case RelationType.MinusMinusPrefix: // must be numerical + case RelationType.PlusPlusPostFix: // must be numerical + case RelationType.MinusMinusPostFix: { + // must be numerical + const argumentId = involved[0]; + + this._typeModel.addPrimitiveTypeScore(argumentId, { + type: TypeEnum.NUMERIC, + }); + this._typeModel.addRelationScore(relationId, argumentId); + break; + } + + // Unary + case RelationType.Delete: { + // TODO can we say something about the argument? + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.UNDEFINED, + }); + break; + } + case RelationType.Void: { + // TODO can we say something about the argument? + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.UNDEFINED, + }); + break; + } + case RelationType.TypeOf: { + // TODO can we say something about the argument? + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.STRING, + }); + break; + } + case RelationType.PlusUnary: + case RelationType.MinusUnary: + case RelationType.BitwiseNotUnary: { + // could be multiple things but the argument is probably numerical + const argumentId = involved[0]; + this._typeModel.addPrimitiveTypeScore(argumentId, { + type: TypeEnum.NUMERIC, + }); + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.NUMERIC, + }); + break; + } + case RelationType.LogicalNotUnary: { + // TODO can we say something about the argument? + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.BOOLEAN, + }); + break; + } + case RelationType.Await: { + // often function? + const argumentId = involved[0]; + + this._typeModel.addFunctionTypeScore(argumentId, { + type: TypeEnum.FUNCTION, + parameters: new Map(), + return: new Set(), + }); + + const type_ = ( + this._typeModel.getType(argumentId, TypeEnum.FUNCTION) + ); + + for (const returnType of type_.return) { + this._typeModel.addRelationScore(relationId, returnType); + } + + break; + } + + // binary + case RelationType.Addition: { + if (involved.length !== 2) { + throw new Error(`Addition relation has wrong involved elements`); + } + + const [leftId, rightId] = involved; + + // can be multiple things but string and number are the most likely + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.NUMERIC, + }); + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.STRING, + }); + + this._typeModel.addPrimitiveTypeScore(rightId, { + type: TypeEnum.NUMERIC, + }); + this._typeModel.addPrimitiveTypeScore(rightId, { + type: TypeEnum.STRING, + }); + + this._typeModel.addRelationScore(relationId, leftId); + this._typeModel.addRelationScore(relationId, rightId); + // even though we add the relations we still add the number type directly since it is most likely + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.NUMERIC, + }); + + break; + } + case RelationType.Subtraction: // must be numerical + case RelationType.Division: // must be numerical + case RelationType.Multiplication: // must be numerical + case RelationType.Remainder: // must be numerical + case RelationType.Exponentiation: { + if (involved.length !== 2) { + throw new Error(`Relation has wrong involved elements`); + } + + const [leftId, rightId] = involved; + + // can be multiple things but number is the most likely + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.NUMERIC, + }); + this._typeModel.addPrimitiveTypeScore(rightId, { + type: TypeEnum.NUMERIC, + }); + this._typeModel.addRelationScore(relationId, leftId); + this._typeModel.addRelationScore(relationId, rightId); + // even though we add the relations we still add the number type directly since it is most likely + // in this case we are pretty sure the result is numeric so we give 2 score + this._typeModel.addPrimitiveTypeScore( + relationId, + { type: TypeEnum.NUMERIC }, + 2 + ); + + break; + } + + case RelationType.In: { + const [, rightId] = involved; + + // right is likely an array or object + + this._typeModel.addArrayTypeScore(rightId, { + type: TypeEnum.ARRAY, + elements: new Map(), + }); + this._typeModel.addObjectTypeScore(rightId, { + type: TypeEnum.OBJECT, + properties: new Map(), + }); + + // TODO + // if it is an array we know the leftId is an element of the array + // if it is an object we know the leftId is a property of the object + + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.BOOLEAN, + }); + + break; + } + case RelationType.InstanceOf: { + const [leftId, rightId] = involved; + + this._typeModel.addObjectTypeScore(leftId, { + type: TypeEnum.OBJECT, + properties: new Map(), + }); + this._typeModel.addObjectTypeScore(rightId, { + type: TypeEnum.OBJECT, + properties: new Map(), + }); + + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.BOOLEAN, + }); + + break; + } + case RelationType.Less: // must be numeric + case RelationType.Greater: // must be numeric + case RelationType.LessOrEqual: // must be numeric + case RelationType.GreaterOrEqual: { + const [leftId, rightId] = involved; + + // most likely numerical + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.NUMERIC, + }); + this._typeModel.addPrimitiveTypeScore(rightId, { + type: TypeEnum.NUMERIC, + }); + + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.BOOLEAN, + }); + + break; + } + + case RelationType.Equality: // could be multiple things + case RelationType.InEquality: // could be multiple things + case RelationType.StrictEquality: // could be multiple things + case RelationType.StrictInequality: { + const [leftId, rightId] = involved; + + // both sides are likely the same type + this._typeModel.addRelationScore(leftId, rightId); + + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.BOOLEAN, + }); + + break; + } + + case RelationType.BitwiseLeftShift: // must be numeric + case RelationType.BitwiseRightShift: // must be numeric + case RelationType.BitwiseUnsignedRightShift: // must be numeric + + case RelationType.BitwiseAnd: // must be numeric + case RelationType.BitwiseOr: // must be numeric + case RelationType.BitwiseXor: { + const [leftId, rightId] = involved; + + // most likely numerical + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.NUMERIC, + }); + this._typeModel.addPrimitiveTypeScore(rightId, { + type: TypeEnum.NUMERIC, + }); + + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.NUMERIC, + }); + + break; + } + + case RelationType.LogicalAnd: { + const [leftId, rightId] = involved; + + // most likely both boolean + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.BOOLEAN, + }); + this._typeModel.addPrimitiveTypeScore(rightId, { + type: TypeEnum.BOOLEAN, + }); + + //can be the boolean or the type of the second one depending on if the first and second are not false/null/undefined + this._typeModel.addRelationScore(relationId, leftId); + this._typeModel.addRelationScore(relationId, rightId); + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.BOOLEAN, + }); + // TODO can we say that the leftId and rightId are the same type? + + break; + } + + case RelationType.LogicalOr: { + const [leftId, rightId] = involved; + + // most likely both boolean + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.BOOLEAN, + }); + this._typeModel.addPrimitiveTypeScore(rightId, { + type: TypeEnum.BOOLEAN, + }); + + // can be the type of the first or second one depending on if the first is not false/null/undefined + this._typeModel.addRelationScore(relationId, leftId); + this._typeModel.addRelationScore(relationId, rightId); + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.BOOLEAN, + }); + // TODO can we say that the leftId and rightId are the same type? + + break; + } + case RelationType.NullishCoalescing: { + const [leftId, rightId] = involved; + + // left side could be nullish + this._typeModel.addPrimitiveTypeScore(leftId, { type: TypeEnum.NULL }); + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.UNDEFINED, + }); + + // returns the rightId if leftId is nullish + this._typeModel.addRelationScore(relationId, leftId); + this._typeModel.addRelationScore(relationId, rightId); + // TODO can we say that the leftId and rightId are the same type? + + break; + } + + // ternary + case RelationType.Conditional: { + const [conditionId, leftId, rightId] = involved; + this._typeModel.addPrimitiveTypeScore(conditionId, { + type: TypeEnum.BOOLEAN, + }); + + // returns the leftId if conditionId is true + // returns the rightId if conditionId is false + this._typeModel.addRelationScore(relationId, leftId); + this._typeModel.addRelationScore(relationId, rightId); + + // TODO can we say that the leftId and rightId are the same type? + + break; + } + + case RelationType.Assignment: { + // should always have two involved + if (involved.length !== 2) { + throw new Error( + `Assignment relation should have two involved, but has ${involved.length}. ${relation.id}` + ); + } + const [leftId, rightId] = involved; + + this._typeModel.addRelationScore(leftId, rightId); + // TODO This is not the way to do this + // for now it is neccessary because variable declarations such as in lodash/at.js + // do not have the correct ids causing the relation to have the wrong + this._typeModel.addRelationScore(relationId, rightId); + this._typeModel.addRelationScore(leftId, relationId); + + // undefined should be the actual result + // this._typeModel.addPrimitiveTypeScore(relationId, { + // type: TypeEnum.UNDEFINED, + // }); + + break; + } + case RelationType.MultiplicationAssignment: // must be numeric + case RelationType.ExponentiationAssignment: // must be numeric + case RelationType.DivisionAssignment: // must be numeric + case RelationType.RemainderAssigment: // must be numeric + case RelationType.SubtractionAssignment: // must be numeric + case RelationType.LeftShiftAssignment: // must be numeric + case RelationType.RightShiftAssignment: // must be numeric + case RelationType.UnSignedRightShiftAssignment: // must be numeric + case RelationType.BitwiseAndAssignment: // must be numeric + case RelationType.BitwiseXorAssignment: // must be numeric + case RelationType.BitwiseOrAssignment: { + if (involved.length !== 2) { + throw new Error( + `Assignment relation should have two involved, but has ${involved.length}` + ); + } + const [leftId, rightId] = involved; + + this._typeModel.addRelationScore(leftId, rightId); + // likely numeric + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.NUMERIC, + }); + this._typeModel.addPrimitiveTypeScore(rightId, { + type: TypeEnum.NUMERIC, + }); + + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.UNDEFINED, + }); + + break; + } + case RelationType.AdditionAssignment: { + if (involved.length !== 2) { + throw new Error( + `Assignment relation should have two involved, but has ${involved.length}` + ); + } + const [leftId, rightId] = involved; + + this._typeModel.addRelationScore(leftId, rightId); + // likely numeric or string + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.NUMERIC, + }); + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.STRING, + }); + this._typeModel.addPrimitiveTypeScore(rightId, { + type: TypeEnum.NUMERIC, + }); + this._typeModel.addPrimitiveTypeScore(rightId, { + type: TypeEnum.STRING, + }); + + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.UNDEFINED, + }); + + break; + } + + case RelationType.LogicalAndAssignment: // could be multiple things + case RelationType.LogicalOrAssignment: // could be multiple things + case RelationType.LogicalNullishAssignment: { + if (involved.length !== 2) { + throw new Error( + `Assignment relation should have two involved, but has ${involved.length}` + ); + } + const [leftId, rightId] = involved; + + this._typeModel.addRelationScore(leftId, rightId); + // likely boolean + this._typeModel.addPrimitiveTypeScore(leftId, { + type: TypeEnum.BOOLEAN, + }); + this._typeModel.addPrimitiveTypeScore(rightId, { + type: TypeEnum.BOOLEAN, + }); + + this._typeModel.addPrimitiveTypeScore(relationId, { + type: TypeEnum.UNDEFINED, + }); + + break; + } + + case RelationType.Yield: + case RelationType.YieldStar: { + // TODO + break; + } + + case RelationType.Spread: { + const [spreadId] = involved; + + // is array or object + this._typeModel.addArrayTypeScore(spreadId, { + type: TypeEnum.ARRAY, + elements: new Map(), + }); + this._typeModel.addObjectTypeScore(spreadId, { + type: TypeEnum.OBJECT, + properties: new Map(), + }); + + // TODO results in a sequence of the type of the spread + + break; + } + + case RelationType.Comma: { + // TODO + break; + } + } + } +} diff --git a/libraries/javascript/lib/analysis/static/types/resolving/TypeResolverUnknown.ts b/libraries/analysis-javascript/lib/type/resolving/RandomTypeModelFactory.ts similarity index 60% rename from libraries/javascript/lib/analysis/static/types/resolving/TypeResolverUnknown.ts rename to libraries/analysis-javascript/lib/type/resolving/RandomTypeModelFactory.ts index ff1425052..0992584a3 100644 --- a/libraries/javascript/lib/analysis/static/types/resolving/TypeResolverUnknown.ts +++ b/libraries/analysis-javascript/lib/type/resolving/RandomTypeModelFactory.ts @@ -16,14 +16,21 @@ * limitations under the License. */ -import { TypeResolver } from "./TypeResolver"; -import { TypeProbability } from "./TypeProbability"; +import { Element } from "../discovery/element/Element"; +import { Relation } from "../discovery/relation/Relation"; +import { TypeModel } from "./TypeModel"; +import { TypeModelFactory } from "./TypeModelFactory"; -export class TypeResolverUnknown extends TypeResolver { - getTyping(): TypeProbability { - return new TypeProbability(); +export class RandomTypeModelFactory extends TypeModelFactory { + getElement(): Element { + throw new Error("Method not implemented."); } - // eslint-disable-next-line - resolveTypes() {} + getRelation(): Relation { + throw new Error("Method not implemented."); + } + + resolveTypes() { + return new TypeModel(); + } } diff --git a/libraries/analysis-javascript/lib/type/resolving/Type.ts b/libraries/analysis-javascript/lib/type/resolving/Type.ts new file mode 100644 index 000000000..109ba66fb --- /dev/null +++ b/libraries/analysis-javascript/lib/type/resolving/Type.ts @@ -0,0 +1,62 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { TypeEnum } from "./TypeEnum"; + +export type Type = PrimitiveType | FunctionType | ArrayType | ObjectType; + +export interface PrimitiveType { + type: + | TypeEnum.NUMERIC + | TypeEnum.STRING + | TypeEnum.BOOLEAN + | TypeEnum.NULL + | TypeEnum.UNDEFINED + | TypeEnum.REGEX; +} + +export function isPrimitiveType(type: Type): type is PrimitiveType { + return ( + type.type === TypeEnum.NUMERIC || + type.type === TypeEnum.STRING || + type.type === TypeEnum.BOOLEAN || + type.type === TypeEnum.NULL || + type.type === TypeEnum.UNDEFINED || + type.type === TypeEnum.REGEX + ); +} + +export interface FunctionType { + type: TypeEnum.FUNCTION; + // index -> id + parameters: Map; + // id + return: Set; +} + +export interface ArrayType { + type: TypeEnum.ARRAY; + // index -> id + elements: Map; +} + +export interface ObjectType { + type: TypeEnum.OBJECT; + // name -> id + properties: Map; +} diff --git a/libraries/javascript/lib/analysis/static/types/resolving/TypeEnum.ts b/libraries/analysis-javascript/lib/type/resolving/TypeEnum.ts similarity index 65% rename from libraries/javascript/lib/analysis/static/types/resolving/TypeEnum.ts rename to libraries/analysis-javascript/lib/type/resolving/TypeEnum.ts index 10065d289..b3cd9af97 100644 --- a/libraries/javascript/lib/analysis/static/types/resolving/TypeEnum.ts +++ b/libraries/analysis-javascript/lib/type/resolving/TypeEnum.ts @@ -16,10 +16,9 @@ * limitations under the License. */ -import { ElementType } from "@syntest/ast-javascript"; +import { ElementType } from "../discovery/element/Element"; export enum TypeEnum { - ANY = "any", NUMERIC = "numeric", STRING = "string", BOOLEAN = "boolean", @@ -35,19 +34,40 @@ export enum TypeEnum { export function elementTypeToTypingType( elementType: ElementType -): TypeEnum | void { +): + | TypeEnum.STRING + | TypeEnum.NUMERIC + | TypeEnum.BOOLEAN + | TypeEnum.NULL + | TypeEnum.UNDEFINED + | TypeEnum.REGEX { switch (elementType) { - case ElementType.BooleanConstant: - return TypeEnum.BOOLEAN; - case ElementType.StringConstant: + case ElementType.StringLiteral: { return TypeEnum.STRING; - case ElementType.NumericalConstant: + } + case ElementType.NumericalLiteral: { return TypeEnum.NUMERIC; - case ElementType.NullConstant: + } + case ElementType.NullLiteral: { return TypeEnum.NULL; - case ElementType.UndefinedConstant: - return TypeEnum.UNDEFINED; - case ElementType.RegexConstant: + } + case ElementType.BooleanLiteral: { + return TypeEnum.BOOLEAN; + } + case ElementType.RegExpLiteral: { return TypeEnum.REGEX; + } + case ElementType.TemplateLiteral: { + return TypeEnum.STRING; + } + case ElementType.BigIntLiteral: { + return TypeEnum.NUMERIC; + } + + case ElementType.Undefined: { + return TypeEnum.UNDEFINED; + } } + + throw new Error("Unknown element type"); } diff --git a/libraries/analysis-javascript/lib/type/resolving/TypeModel.ts b/libraries/analysis-javascript/lib/type/resolving/TypeModel.ts new file mode 100644 index 000000000..15ed1a756 --- /dev/null +++ b/libraries/analysis-javascript/lib/type/resolving/TypeModel.ts @@ -0,0 +1,475 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { prng } from "@syntest/search"; +import { + ArrayType, + FunctionType, + ObjectType, + PrimitiveType, + Type, +} from "./Type"; +import { TypeEnum } from "./TypeEnum"; + +export class TypeModel { + private _elements: Set; + // element1 -> element2 -> score + private _relationScoreMap: Map>; + // element -> type enum -> score + private _elementTypeScoreMap: Map>; + // element -> type enum -> score + private _typeExecutionScoreMap: Map>; + + // element -> type enum -> probability + private _elementTypeProbabilityMap: Map>; + + // element -> type enum -> type + private _typeIdToTypeMap: Map>; + + // element -> scoreHasChanged + private _scoreHasChangedMap: Map; + + constructor() { + this._elements = new Set(); + + this._relationScoreMap = new Map(); + this._elementTypeScoreMap = new Map(); + this._typeExecutionScoreMap = new Map(); + + this._elementTypeProbabilityMap = new Map(); + + this._typeIdToTypeMap = new Map(); + + this._scoreHasChangedMap = new Map(); + } + + getType(element: string, type: string): Type { + if (!this._typeIdToTypeMap.has(element)) { + throw new Error(`Element ${element} does not exist`); + } + + if (!this._typeIdToTypeMap.get(element).has(type)) { + throw new Error(`Type ${type} does not exist on element ${element}`); + } + + return this._typeIdToTypeMap.get(element).get(type); + } + + addId(id: string) { + if (this._elements.has(id)) { + return; + } + + this._elements.add(id); + this._relationScoreMap.set(id, new Map()); + this._elementTypeScoreMap.set(id, new Map()); + this._elementTypeProbabilityMap.set(id, new Map()); + this._typeExecutionScoreMap.set(id, new Map()); + this._typeIdToTypeMap.set(id, new Map()); + this._scoreHasChangedMap.set(id, true); + + this._addTypeScore(id, { type: TypeEnum.NUMERIC }, 0.1); + this._addTypeScore(id, { type: TypeEnum.STRING }, 0.1); + this._addTypeScore(id, { type: TypeEnum.BOOLEAN }, 0.1); + this._addTypeScore(id, { type: TypeEnum.NULL }, 0.1); + this._addTypeScore(id, { type: TypeEnum.UNDEFINED }, 0.1); + this._addTypeScore(id, { type: TypeEnum.REGEX }, 0.1); + this._addTypeScore(id, { type: TypeEnum.ARRAY, elements: new Map() }, 0.1); + this._addTypeScore( + id, + { type: TypeEnum.OBJECT, properties: new Map() }, + 0.1 + ); + this._addTypeScore( + id, + { type: TypeEnum.FUNCTION, parameters: new Map(), return: new Set() }, + 0.1 + ); + } + + private _addRelationScore(id1: string, id2: string, score: number) { + if (!this._relationScoreMap.has(id1)) { + throw new Error(`Element ${id1} does not exist`); + } + if (!this._relationScoreMap.get(id1).has(id2)) { + this._relationScoreMap.get(id1).set(id2, 0); + } + + const currentScore1 = this._relationScoreMap.get(id1).get(id2); + + this._relationScoreMap.get(id1).set(id2, currentScore1 + score); + + this._scoreHasChangedMap.set(id1, true); + } + + addRelationScore(id1: string, id2: string, score = 1) { + this._addRelationScore(id1, id2, score); + this._addRelationScore(id2, id1, score); + } + + private _addTypeScore(id: string, type: Type, score: number) { + if (!this._elementTypeScoreMap.has(id)) { + throw new Error(`Element ${id} does not exist`); + } + if (!this._elementTypeScoreMap.get(id).has(type.type)) { + this._elementTypeScoreMap.get(id).set(type.type, 0); + } + + const currentScore = this._elementTypeScoreMap.get(id).get(type.type); + + this._elementTypeScoreMap.get(id).set(type.type, currentScore + score); + + this._scoreHasChangedMap.set(id, true); + + if (!this._typeIdToTypeMap.get(id).has(type.type)) { + this._typeIdToTypeMap.get(id).set(type.type, type); + } + } + + addPrimitiveTypeScore(id: string, type: PrimitiveType, score = 1) { + this._addTypeScore(id, type, score); + } + + addFunctionTypeScore(element: string, type: FunctionType, score = 1) { + this._addTypeScore(element, type, score); + const currentType = ( + this._typeIdToTypeMap.get(element).get(type.type) + ); + + if (currentType === type) { + // just added so we ignore + return; + } + + // merge the new type with the existing one + for (const [index, id] of type.parameters.entries()) { + currentType.parameters.set(index, id); + } + + currentType.return = new Set([...type.return, ...currentType.return]); + } + + addArrayTypeScore(id: string, type: ArrayType, score = 1) { + this._addTypeScore(id, type, score); + const currentType = this._typeIdToTypeMap.get(id).get(type.type); + + if (currentType === type) { + // just added so we ignore + return; + } + + // merge the new type with the existing one + for (const [index, id] of type.elements.entries()) { + currentType.elements.set(index, id); + } + } + + addObjectTypeScore(id: string, type: ObjectType, score = 1) { + this._addTypeScore(id, type, score); + const currentType = ( + this._typeIdToTypeMap.get(id).get(type.type) + ); + + if (currentType === type) { + // just added so we ignore + return; + } + + // merge the new type with the existing one + for (const [name, id] of type.properties.entries()) { + currentType.properties.set(name, id); + } + } + + // TODO type should be TypeEnum? + addExecutionScore(id: string, type: string, score: number) { + if (!this._typeExecutionScoreMap.has(id)) { + throw new Error(`Element ${id} does not exist`); + } + + if (!this._typeExecutionScoreMap.get(id).has(type)) { + this._typeExecutionScoreMap.get(id).set(type, 0); + } + + const currentScore = this._typeExecutionScoreMap.get(id).get(type); + + this._typeExecutionScoreMap.get(id).set(type, currentScore + score); + + this._scoreHasChangedMap.set(id, true); + } + + private _sum(iterable: Iterable) { + return [...iterable].reduce((total, currentValue) => total + currentValue); + } + + /** + * + * @param incorporateExecutionScore wether the execution score should be weighted in + * @param id the id we want to get a random type for + * @param matchType (optional) the type enum you want to get (there can be multiple object/function/array types) + * @returns + */ + getRandomType( + incorporateExecutionScore: boolean, + id: string, + matchType?: TypeEnum + ): Type { + const probabilities = this.calculateProbabilitiesForElement( + incorporateExecutionScore, + id + ); + + // console.log(id) + // console.log(probabilities) + + // const probabilities = this._elementTypeProbabilityMap.get(element); + let matchingTypes = [...probabilities.entries()]; + let totalProbability = 1; + + if (matchType) { + matchingTypes = matchingTypes.filter(([type]) => + type.endsWith(matchType) + ); + totalProbability = this._sum( + matchingTypes.map(([, probability]) => probability) + ); + } + + const choice = prng.nextDouble(0, totalProbability); + let index = 0; + + let chosenType: string; + let probability: number; + for ([chosenType, probability] of matchingTypes) { + if (choice <= index + probability) { + if (chosenType.includes("<>")) { + const [relationId, type] = chosenType.split("<>"); + return this._typeIdToTypeMap.get(relationId).get(type); + } + + return this._typeIdToTypeMap.get(id).get(chosenType); + } + + index += probability; + } + + if (chosenType.includes("<>")) { + const [relationId, type] = chosenType.split("<>"); + return this._typeIdToTypeMap.get(relationId).get(type); + } + return this._typeIdToTypeMap.get(id).get(chosenType); + } + + getHighestProbabilityType( + incorporateExecutionScore: boolean, + element: string + ): Type { + this.calculateProbabilitiesForElement(incorporateExecutionScore, element); + + const probabilities = this._elementTypeProbabilityMap.get(element); + + let best: string = probabilities.keys().next().value; + + for (const [type, probability] of probabilities.entries()) { + if (probability > probabilities.get(best)) { + best = type; + } + } + + return this._typeIdToTypeMap.get(element).get(best); + } + + calculateProbabilitiesForFile( + incorporateExecutionScore: boolean, + filepath: string + ): Map> { + const map = new Map(); + for (const id of this._elements) { + if (!id.startsWith(filepath)) { + continue; + } + map.set( + id, + this.calculateProbabilitiesForElement(incorporateExecutionScore, id) + ); + } + + return map; + } + + calculateProbabilitiesForElement( + incorporateExecutionScore: boolean, + id: string, + relationPairsVisited?: Map> + ): Map { + // if (!this._scoreHasChangedMap.has(element)) { + // throw new Error(`Element ${element} does not exist`); + // } + // if (this._scoreHasChangedMap.get(element) === false) { + // // prevent recalculation of probabilities without score changes + // return this._elementTypeProbabilityMap.get(element); + // } + + // this._scoreHasChangedMap.set(element, false); + + const probabilityMap = new Map(); + + const typeScoreMap = this._elementTypeScoreMap.get(id); + const relationMap = this._relationScoreMap.get(id); + + if (!relationPairsVisited) { + relationPairsVisited = new Map(); + // this._scoreHasChangedMap.set(element, false); + // this._elementTypeProbabilityMap.set(element, probabilityMap); + } + + let totalScore = this._sum(typeScoreMap.values()); + + const usableRelations = new Set(); + + for (const [relation, score] of relationMap.entries()) { + if (!relationPairsVisited.has(id)) { + relationPairsVisited.set(id, new Set()); + } + + if (relationPairsVisited.get(id).has(relation)) { + // we have already visited this relation pair + // this means that we have a cycle in the graph + // we can safely ignore this relation + continue; + } + usableRelations.add(relation); + totalScore += score; + } + + for (const [type, score] of typeScoreMap.entries()) { + probabilityMap.set(type, score / totalScore); + } + + for (const [relation, score] of relationMap.entries()) { + if (!usableRelations.has(relation)) { + // we have already visited this relation pair + // this means that we have a cycle in the graph + // we can safely ignore this relation + continue; + } + + relationPairsVisited.get(id).add(relation); + + const probabilityOfRelation = score / totalScore; + + const probabilityMapOfRelation = this.calculateProbabilitiesForElement( + incorporateExecutionScore, + relation, + relationPairsVisited + ); + + if (probabilityMapOfRelation.size === 0) { + throw new Error(`No probabilities for relation ${relation}`); + } + + for (const [type, probability] of probabilityMapOfRelation.entries()) { + let finalType = type; + + if ( + type === TypeEnum.FUNCTION || + type === TypeEnum.ARRAY || + type === TypeEnum.OBJECT + ) { + // maybe should check for includes (or the inverse by checking for primitive types) + // this will only add only the final relation id + // the other method will add all relation id from the element to the final relation + finalType = `${relation}<>${type}`; + } + + if (!probabilityMap.has(finalType)) { + probabilityMap.set(finalType, 0); + } + + probabilityMap.set( + finalType, + probabilityMap.get(finalType) + probability * probabilityOfRelation + ); + } + } + + // sanity check + const totalProbability = this._sum(probabilityMap.values()); + + if (Math.abs(totalProbability - 1) > 0.0001) { + throw new Error( + `Total probability should be 1, but is ${totalProbability}` + ); + } + + // incorporate execution scores + const executionScoreMap = this._typeExecutionScoreMap.get(id); + + if (incorporateExecutionScore && executionScoreMap.size > 0) { + let minValue = 0; + for (const score of executionScoreMap.values()) { + minValue = Math.min(minValue, score); + } + + let totalScore = 0; + for (const type of typeScoreMap.keys()) { + let score = executionScoreMap.has(type) + ? executionScoreMap.get(type) + : 0; + score -= minValue; + totalScore += score; + } + + if (totalScore < 0) { + throw new Error("Total score should be positive"); + } + + if (totalScore === 0) { + throw new Error("Total score should be positive"); + } + + // incorporate execution score + for (const type of typeScoreMap.keys()) { + let score = executionScoreMap.has(type) + ? executionScoreMap.get(type) + : 0; + score -= minValue; + + const executionScoreDiscount = score / totalScore; + const probability = probabilityMap.get(type); + const newProbability = executionScoreDiscount * probability; + + probabilityMap.set(type, newProbability); + } + + // normalize to 1 + let totalProbability = 0; + for (const probability of probabilityMap.values()) { + totalProbability += probability; + } + + if (totalProbability !== 0) { + for (const [type, probability] of probabilityMap.entries()) { + probabilityMap.set(type, probability / totalProbability); + } + } + } + + return probabilityMap; + } +} diff --git a/libraries/javascript/lib/analysis/static/parsing/IdentifierDescription.ts b/libraries/analysis-javascript/lib/type/resolving/TypeModelFactory.ts similarity index 59% rename from libraries/javascript/lib/analysis/static/parsing/IdentifierDescription.ts rename to libraries/analysis-javascript/lib/type/resolving/TypeModelFactory.ts index 4c1a232ad..a4ca0942f 100644 --- a/libraries/javascript/lib/analysis/static/parsing/IdentifierDescription.ts +++ b/libraries/analysis-javascript/lib/type/resolving/TypeModelFactory.ts @@ -16,21 +16,23 @@ * limitations under the License. */ -import { TypeProbability } from "../types/resolving/TypeProbability"; +import { Element } from "../discovery/element/Element"; +import { Relation } from "../discovery/relation/Relation"; +import { TypeModel } from "./TypeModel"; /** - * Interface for a IdentifierDescription Description. + * Abstract TypeResolver class * * @author Dimitri Stallenberg */ -export interface IdentifierDescription { +export abstract class TypeModelFactory { /** - * Name of the parameter. + * Resolves the types of all given elements and relations + * @param elementMap the elements to resolve the types of + * @param relationMap the relations to resolve the types of */ - name: string; - - /** - * Type probability map of the parameter. - */ - typeProbabilityMap: TypeProbability; + abstract resolveTypes( + elementMap: Map, + relationMap: Map + ): TypeModel; } diff --git a/libraries/analysis-javascript/lib/utils/diagnostics.ts b/libraries/analysis-javascript/lib/utils/diagnostics.ts new file mode 100644 index 000000000..c6e76c8d5 --- /dev/null +++ b/libraries/analysis-javascript/lib/utils/diagnostics.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export function unsupportedSyntax( + pathType: string, + locationId: string +): string { + return `Unsupported syntax found in ${pathType} at ${locationId}`; +} diff --git a/libraries/javascript/lib/utils/fileSystem.ts b/libraries/analysis-javascript/lib/utils/fileSystem.ts similarity index 75% rename from libraries/javascript/lib/utils/fileSystem.ts rename to libraries/analysis-javascript/lib/utils/fileSystem.ts index ddc35728c..ce43edba8 100644 --- a/libraries/javascript/lib/utils/fileSystem.ts +++ b/libraries/analysis-javascript/lib/utils/fileSystem.ts @@ -16,33 +16,33 @@ * limitations under the License. */ -import * as path from "path"; -import { readFileSync, readdirSync, statSync } from "fs"; +import { readdirSync, readFileSync, statSync } from "node:fs"; +import * as path from "node:path"; export function readFile(absolutePath: string): string { if (!path.isAbsolute(absolutePath)) { absolutePath = path.resolve(absolutePath); } - return readFileSync(absolutePath).toString("utf-8"); + return readFileSync(absolutePath).toString("utf8"); } export function getAllFiles( - dir: string, + directory: string, extn: string, - files: string[] = null, - result: string[] = null, - regex: RegExp = null + files?: string[] | undefined, + result?: string[] | undefined, + regex?: RegExp | undefined ) { - files = files || readdirSync(dir); + files = files || readdirSync(directory); result = result || []; regex = regex || new RegExp(`\\${extn}$`); - for (let i = 0; i < files.length; i++) { - const file = path.join(dir, files[i]); + for (const file_ of files) { + const file: string = path.join(directory, file_); if (statSync(file).isDirectory()) { try { result = getAllFiles(file, extn, readdirSync(file), result, regex); - } catch (error) { + } catch { continue; } } else { diff --git a/libraries/cfg-javascript/package.json b/libraries/analysis-javascript/package.json similarity index 70% rename from libraries/cfg-javascript/package.json rename to libraries/analysis-javascript/package.json index ba830fb9a..eb8e485c6 100644 --- a/libraries/cfg-javascript/package.json +++ b/libraries/analysis-javascript/package.json @@ -1,5 +1,5 @@ { - "name": "@syntest/cfg-javascript", + "name": "@syntest/analysis-javascript", "version": "0.1.0-beta.4", "description": "SynTest CFG JavaScript is a library for generating control flow graphs for the JavaScript language", "keywords": [ @@ -19,8 +19,12 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ - "/dist", - "/NOTICE", + "dist/lib", + "dist/index.d.ts", + "dist/index.d.ts.map", + "dist/index.js", + "dist/index.js.map", + "NOTICE", "README.md" ], "repository": { @@ -36,19 +40,27 @@ "format:check": "prettier --config ../../.prettierrc.json --ignore-path ../../.prettierignore --check .", "lint": "eslint --config ../../.eslintrc.json --ignore-path ../../.eslintignore .", "lint:fix": "eslint --config ../../.eslintrc.json --ignore-path ../../.eslintignore . --fix", - "test": "mocha --config ../../.mocharc.json", - "test:coverage": "nyc --reporter=text --reporter=html mocha --config ../../.mocharc.json", + "test": "mocha --config ../../.mocharc.json ", + "test:coverage": "nyc --reporter=text --reporter=html --reporter=lcov mocha --config ../../.mocharc.json", "test:coverage:ci": "nyc --reporter=lcovonly mocha --config ../../.mocharc.json --reporter json --reporter-option output=test-results.json", "test:watch": "mocha --config ../../.mocharc.json --watch" }, "dependencies": { - "@syntest/cfg-core": "*", - "@syntest/core": "*" + "@babel/core": "7.20.12", + "@babel/traverse": "^7.21.5", + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/ast-visitor-javascript": "*", + "@syntest/cfg": "^0.3.0-beta.16", + "@syntest/logging": "^0.1.0-beta.6", + "@syntest/search": "^0.4.0-beta.25" }, "engines": { "node": ">=10.24.0" }, "publishConfig": { "access": "public" + }, + "devDependencies": { + "@babel/types": "^7.21.5" } } diff --git a/libraries/ast-javascript/test/AbstractSyntaxTreeGenerator.test.ts b/libraries/analysis-javascript/test/AbstractSyntaxTreeGenerator.test.ts similarity index 85% rename from libraries/ast-javascript/test/AbstractSyntaxTreeGenerator.test.ts rename to libraries/analysis-javascript/test/AbstractSyntaxTreeGenerator.test.ts index bd1595e68..79f412f29 100644 --- a/libraries/ast-javascript/test/AbstractSyntaxTreeGenerator.test.ts +++ b/libraries/analysis-javascript/test/AbstractSyntaxTreeGenerator.test.ts @@ -16,14 +16,16 @@ * limitations under the License. */ import * as chai from "chai"; -import { AbstractSyntaxTreeGenerator } from "../lib/AbstractSyntaxTreeGenerator"; + +import { AbstractSyntaxTreeFactory } from "../lib/ast/AbstractSyntaxTreeFactory"; + const expect = chai.expect; /** * This test is only added such that the github action does not fail. */ describe("example test", () => { - it("test", async () => { + it("test", () => { const source = ` export class Example { constructor(a) { @@ -40,8 +42,8 @@ describe("example test", () => { } `; - const generator = new AbstractSyntaxTreeGenerator(); - const ast = generator.generate(source); + const generator = new AbstractSyntaxTreeFactory(); + const ast = generator.convert("", source); expect(ast.type === "File"); }); diff --git a/libraries/ast-javascript/test/AbstractSyntaxTreeVisitor.test.ts b/libraries/analysis-javascript/test/AbstractSyntaxTreeVisitor.test.ts similarity index 82% rename from libraries/ast-javascript/test/AbstractSyntaxTreeVisitor.test.ts rename to libraries/analysis-javascript/test/AbstractSyntaxTreeVisitor.test.ts index 697287098..709f3c879 100644 --- a/libraries/ast-javascript/test/AbstractSyntaxTreeVisitor.test.ts +++ b/libraries/analysis-javascript/test/AbstractSyntaxTreeVisitor.test.ts @@ -15,17 +15,19 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as chai from "chai"; -import { AbstractSyntaxTreeGenerator } from "../lib/AbstractSyntaxTreeGenerator"; -import { AbstractSyntaxTreeVisitor } from "../lib/AbstractSyntaxTreeVisitor"; import { traverse } from "@babel/core"; +import { AbstractSyntaxTreeVisitor } from "@syntest/ast-visitor-javascript"; +import * as chai from "chai"; + +import { AbstractSyntaxTreeFactory } from "../lib/ast/AbstractSyntaxTreeFactory"; + const expect = chai.expect; /** * This test is only added such that the github action does not fail. */ describe("visitor test", () => { - it("test", async () => { + it("test", () => { const source = ` export class Example { constructor(a) { @@ -42,8 +44,8 @@ describe("visitor test", () => { } `; - const generator = new AbstractSyntaxTreeGenerator(); - const ast = generator.generate(source); + const generator = new AbstractSyntaxTreeFactory(); + const ast = generator.convert("", source); const visitor = new AbstractSyntaxTreeVisitor(""); traverse(ast, visitor); diff --git a/libraries/analysis-javascript/test/cfg/ControlFlowGraphVisitor.test.ts b/libraries/analysis-javascript/test/cfg/ControlFlowGraphVisitor.test.ts new file mode 100644 index 000000000..b8a5ab91e --- /dev/null +++ b/libraries/analysis-javascript/test/cfg/ControlFlowGraphVisitor.test.ts @@ -0,0 +1,1263 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { traverse } from "@babel/core"; +import * as chai from "chai"; + +import { AbstractSyntaxTreeFactory } from "../../lib/ast/AbstractSyntaxTreeFactory"; +import { ControlFlowGraphVisitor } from "../../lib/cfg/ControlFlowGraphVisitor"; +import { EdgeType, contractControlFlowProgram } from "@syntest/cfg"; + +const expect = chai.expect; + +function cfgHelper(source: string) { + const generator = new AbstractSyntaxTreeFactory(); + const ast = generator.convert("", source); + + const visitor = new ControlFlowGraphVisitor(""); + traverse(ast, visitor); + + return visitor.cfg; +} + +describe("ControlFlowGraphVisitor test", () => { + it("simple statements", () => { + const source = ` + const x = 0 + const y = 1 + const z = 2 + `; + + const cfg = cfgHelper(source); + + expect(cfg.graph.nodes).to.have.lengthOf(7); + expect(cfg.graph.edges).to.have.lengthOf(5); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const constX = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const constY = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(cfg.graph.getIncomingEdges(constY)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constY)).to.have.lengthOf(1); + + const constZ = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(cfg.graph.getIncomingEdges(constZ)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constZ)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constZ)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("if statements", () => { + const source = ` + if (true) { + const x = 0 + } + const y = 1 + `; + + const cfg = cfgHelper(source); + expect(cfg.graph.nodes).to.have.lengthOf(9); + expect(cfg.graph.edges).to.have.lengthOf(8); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const ifStatement = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(ifStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(ifStatement)).to.have.lengthOf(2); + + // const x = 0 + const trueBranch = cfg.graph.getOutgoingEdges(ifStatement)[0].target; + + expect(cfg.graph.getIncomingEdges(trueBranch)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(trueBranch)).to.have.lengthOf(1); + + const constX = cfg.graph.getOutgoingEdges(trueBranch)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const falseBranch = cfg.graph.getOutgoingEdges(ifStatement)[1].target; + + expect(cfg.graph.getIncomingEdges(falseBranch)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(falseBranch)).to.have.lengthOf(1); + + const constYtrue = cfg.graph.getOutgoingEdges(constX)[0].target; + const constYfalse = cfg.graph.getOutgoingEdges(falseBranch)[0].target; + + expect(constYtrue).to.equal(constYfalse); + + expect(cfg.graph.getIncomingEdges(constYfalse)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(constYfalse)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constYfalse)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("if else statements", () => { + const source = ` + if (true) { + const x = 0 + } else { + const y = 1 + } + const z = 1 + `; + + const cfg = cfgHelper(source); + expect(cfg.graph.nodes).to.have.lengthOf(10); + expect(cfg.graph.edges).to.have.lengthOf(9); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const ifStatement = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(ifStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(ifStatement)).to.have.lengthOf(2); + + const trueBranch = cfg.graph.getOutgoingEdges(ifStatement)[0].target; + + expect(cfg.graph.getIncomingEdges(trueBranch)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(trueBranch)).to.have.lengthOf(1); + + const constX = cfg.graph.getOutgoingEdges(trueBranch)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const falseBranch = cfg.graph.getOutgoingEdges(ifStatement)[1].target; + + expect(cfg.graph.getIncomingEdges(falseBranch)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(falseBranch)).to.have.lengthOf(1); + + const constY = cfg.graph.getOutgoingEdges(falseBranch)[0].target; + + expect(cfg.graph.getIncomingEdges(constY)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constY)).to.have.lengthOf(1); + + const constZtrue = cfg.graph.getOutgoingEdges(constX)[0].target; + const constZfalse = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(constZtrue).to.equal(constZfalse); + + expect(cfg.graph.getIncomingEdges(constZfalse)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(constZfalse)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constZfalse)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("if block statements", () => { + const source = ` + if (true) { + const x = 0 + const z = 1 + } + const y = 1 + `; + + const cfg = cfgHelper(source); + expect(cfg.graph.nodes).to.have.lengthOf(10); + expect(cfg.graph.edges).to.have.lengthOf(9); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const ifStatement = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(ifStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(ifStatement)).to.have.lengthOf(2); + + // true + expect(cfg.graph.getOutgoingEdges(ifStatement)[0].type).to.equal( + EdgeType.CONDITIONAL_TRUE + ); + const trueBranch = cfg.graph.getOutgoingEdges(ifStatement)[0].target; + + expect(cfg.graph.getIncomingEdges(trueBranch)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(trueBranch)).to.have.lengthOf(1); + + const constX = cfg.graph.getOutgoingEdges(trueBranch)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + // const z = 1 + const zConst = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(cfg.graph.getIncomingEdges(zConst)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(zConst)).to.have.lengthOf(1); + + // false + expect(cfg.graph.getOutgoingEdges(ifStatement)[1].type).to.equal( + EdgeType.CONDITIONAL_FALSE + ); + const falseBranch = cfg.graph.getOutgoingEdges(ifStatement)[1].target; + + expect(cfg.graph.getIncomingEdges(falseBranch)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(falseBranch)).to.have.lengthOf(1); + + const constYtrue = cfg.graph.getOutgoingEdges(zConst)[0].target; + const constYfalse = cfg.graph.getOutgoingEdges(falseBranch)[0].target; + + expect(constYtrue).to.equal(constYfalse); + + expect(cfg.graph.getIncomingEdges(constYfalse)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(constYfalse)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constYfalse)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("do while statements", () => { + const source = ` + do { + const x = 0 + } while (true) + const y = 1 + `; + + const cfg = cfgHelper(source); + // console.log(cfg.graph) + + expect(cfg.graph.nodes).to.have.lengthOf(8); + expect(cfg.graph.edges).to.have.lengthOf(7); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const doBlock = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(doBlock)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(doBlock)).to.have.lengthOf(1); + + const constX = cfg.graph.getOutgoingEdges(doBlock)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const doWhileStatement = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(cfg.graph.getIncomingEdges(doWhileStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(doWhileStatement)).to.have.lengthOf(2); + + // true + expect(cfg.graph.getOutgoingEdges(doWhileStatement)[0].type).to.equal( + EdgeType.CONDITIONAL_TRUE + ); + const bodyRepeat = cfg.graph.getOutgoingEdges(doWhileStatement)[0].target; + // false + expect(cfg.graph.getOutgoingEdges(doWhileStatement)[1].type).to.equal( + EdgeType.CONDITIONAL_FALSE + ); + const constY = cfg.graph.getOutgoingEdges(doWhileStatement)[1].target; + + expect(doBlock).to.equal(bodyRepeat); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("do while statements without block", () => { + const source = ` + do { + + } while (true) + const y = 1 + `; + + const cfg = cfgHelper(source); + + expect(cfg.graph.nodes).to.have.lengthOf(7); + expect(cfg.graph.edges).to.have.lengthOf(6); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const doBlock = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(doBlock)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(doBlock)).to.have.lengthOf(1); + + const doWhileStatement = cfg.graph.getOutgoingEdges(doBlock)[0].target; + + expect(cfg.graph.getIncomingEdges(doWhileStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(doWhileStatement)).to.have.lengthOf(2); + + // true + expect(cfg.graph.getOutgoingEdges(doWhileStatement)[0].type).to.equal( + EdgeType.CONDITIONAL_TRUE + ); + const bodyRepeat = cfg.graph.getOutgoingEdges(doWhileStatement)[0].target; + // false + expect(cfg.graph.getOutgoingEdges(doWhileStatement)[1].type).to.equal( + EdgeType.CONDITIONAL_FALSE + ); + const constY = cfg.graph.getOutgoingEdges(doWhileStatement)[1].target; + + expect(doBlock).to.equal(bodyRepeat); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("do while statements without after", () => { + const source = ` + do { + const x = 0 + } while (true) + + `; + + const cfg = cfgHelper(source); + + expect(cfg.graph.nodes).to.have.lengthOf(7); + expect(cfg.graph.edges).to.have.lengthOf(6); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const doBlock = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(doBlock)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(doBlock)).to.have.lengthOf(1); + + const constX = cfg.graph.getOutgoingEdges(doBlock)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const doWhileStatement = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(cfg.graph.getIncomingEdges(doWhileStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(doWhileStatement)).to.have.lengthOf(2); + + // true + expect(cfg.graph.getOutgoingEdges(doWhileStatement)[0].type).to.equal( + EdgeType.CONDITIONAL_TRUE + ); + const bodyRepeat = cfg.graph.getOutgoingEdges(doWhileStatement)[0].target; + + // false + expect(cfg.graph.getOutgoingEdges(doWhileStatement)[1].type).to.equal( + EdgeType.CONDITIONAL_FALSE + ); + const exit = cfg.graph.getOutgoingEdges(doWhileStatement)[1].target; + + expect(doBlock).to.equal(bodyRepeat); + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("do while statements continue", () => { + const source = ` + do { + continue + } while (true) + const y = 1 + `; + + const cfg = cfgHelper(source); + + expect(cfg.graph.nodes).to.have.lengthOf(8); + expect(cfg.graph.edges).to.have.lengthOf(7); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const doBlock = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(doBlock)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(doBlock)).to.have.lengthOf(1); + + const continueStatement = cfg.graph.getOutgoingEdges(doBlock)[0].target; + + expect(cfg.graph.getIncomingEdges(continueStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(continueStatement)).to.have.lengthOf(1); + + const doWhileStatement = + cfg.graph.getOutgoingEdges(continueStatement)[0].target; + + expect(cfg.graph.getIncomingEdges(doWhileStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(doWhileStatement)).to.have.lengthOf(2); + + // true + expect(cfg.graph.getOutgoingEdges(doWhileStatement)[0].type).to.equal( + EdgeType.CONDITIONAL_TRUE + ); + const bodyRepeat = cfg.graph.getOutgoingEdges(doWhileStatement)[0].target; + // false + expect(cfg.graph.getOutgoingEdges(doWhileStatement)[1].type).to.equal( + EdgeType.CONDITIONAL_FALSE + ); + const constY = cfg.graph.getOutgoingEdges(doWhileStatement)[1].target; + + expect(doBlock).to.equal(bodyRepeat); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("do while statements break", () => { + const source = ` + do { + break + } while (true) + const y = 1 + `; + + const cfg = cfgHelper(source); + + expect(cfg.graph.nodes).to.have.lengthOf(8); + expect(cfg.graph.edges).to.have.lengthOf(7); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const doBlock = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(doBlock)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(doBlock)).to.have.lengthOf(1); + + const breakStatement = cfg.graph.getOutgoingEdges(doBlock)[0].target; + + expect(cfg.graph.getIncomingEdges(breakStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(breakStatement)).to.have.lengthOf(1); + + const constY = cfg.graph.getOutgoingEdges(breakStatement)[0].target; + + expect(cfg.graph.getIncomingEdges(constY)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(constY)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + + // the while loop is dead code here + const doWhileStatement = cfg.graph.getIncomingEdges(doBlock)[1].source; + + expect(cfg.graph.getIncomingEdges(doWhileStatement)).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges(doWhileStatement)).to.have.lengthOf(2); + + // true + expect(cfg.graph.getOutgoingEdges(doWhileStatement)[0].type).to.equal( + EdgeType.CONDITIONAL_TRUE + ); + const bodyRepeat = cfg.graph.getOutgoingEdges(doWhileStatement)[0].target; + + // false + expect(cfg.graph.getOutgoingEdges(doWhileStatement)[1].type).to.equal( + EdgeType.CONDITIONAL_FALSE + ); + const exit2 = cfg.graph.getOutgoingEdges(doWhileStatement)[1].target; + + expect(doBlock).to.equal(bodyRepeat); + + expect(exit2).to.equal(constY); + }); + + it("do while statements if break", () => { + const source = ` + do { + if (true) { // 24:65 + break // 48:53 + } // placeholder-24:65 + } while (true) // 9:88 + const y = 1 // 97:108 + `; + + const cfg = cfgHelper(source); + + expect(cfg.graph.nodes).to.have.lengthOf(11); + expect(cfg.graph.edges).to.have.lengthOf(11); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const doBlock = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(doBlock)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(doBlock)).to.have.lengthOf(1); + + const ifStatement = cfg.graph.getOutgoingEdges(doBlock)[0].target; + + expect(cfg.graph.getIncomingEdges(ifStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(ifStatement)).to.have.lengthOf(2); + + // true + expect(cfg.graph.getOutgoingEdges(ifStatement)[0].type).to.equal( + EdgeType.CONDITIONAL_TRUE + ); + + const ifBlock = cfg.graph.getOutgoingEdges(ifStatement)[0].target; + + expect(cfg.graph.getIncomingEdges(ifBlock)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(ifBlock)).to.have.lengthOf(1); + + const breakStatement = cfg.graph.getOutgoingEdges(ifBlock)[0].target; + + expect(cfg.graph.getIncomingEdges(breakStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(breakStatement)).to.have.lengthOf(1); + + const constYBreak = cfg.graph.getOutgoingEdges(breakStatement)[0].target; + + // false + expect(cfg.graph.getOutgoingEdges(ifStatement)[1].type).to.equal( + EdgeType.CONDITIONAL_FALSE + ); + const placeHolderNode = cfg.graph.getOutgoingEdges(ifStatement)[1].target; + + expect(cfg.graph.getIncomingEdges(placeHolderNode)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(placeHolderNode)).to.have.lengthOf(1); + + const whileStatement = + cfg.graph.getOutgoingEdges(placeHolderNode)[0].target; + + expect(cfg.graph.getIncomingEdges(whileStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(whileStatement)).to.have.lengthOf(2); + + // true while + expect(cfg.graph.getOutgoingEdges(whileStatement)[0].type).to.equal( + EdgeType.CONDITIONAL_TRUE + ); + const bodyRepeat = cfg.graph.getOutgoingEdges(whileStatement)[0].target; + + // false while + expect(cfg.graph.getOutgoingEdges(whileStatement)[1].type).to.equal( + EdgeType.CONDITIONAL_FALSE + ); + const constYWhile = cfg.graph.getOutgoingEdges(whileStatement)[1].target; + + expect(doBlock).to.equal(bodyRepeat); + expect(constYBreak).to.equal(constYWhile); + + expect(cfg.graph.getIncomingEdges(constYWhile)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(constYWhile)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constYWhile)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + }); + + it("while statements", () => { + const source = ` + while (true) { + const x = 0 + } + const y = 1 + `; + + const cfg = cfgHelper(source); + expect(cfg.graph.nodes).to.have.lengthOf(8); + expect(cfg.graph.edges).to.have.lengthOf(7); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const whileStatement = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(whileStatement)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(whileStatement)).to.have.lengthOf(2); + + // true + expect(cfg.graph.getOutgoingEdges(whileStatement)[0].type).to.equal( + EdgeType.CONDITIONAL_TRUE + ); + + const whileBlock = cfg.graph.getOutgoingEdges(whileStatement)[0].target; + + expect(cfg.graph.getIncomingEdges(whileBlock)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(whileBlock)).to.have.lengthOf(1); + + const constX = cfg.graph.getOutgoingEdges(whileBlock)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const backEdge = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(whileStatement).to.equal(backEdge); + + // false + expect(cfg.graph.getOutgoingEdges(whileStatement)[1].type).to.equal( + EdgeType.CONDITIONAL_FALSE + ); + const constY = cfg.graph.getOutgoingEdges(whileStatement)[1].target; + + expect(cfg.graph.getIncomingEdges(constY)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constY)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("while statements no block", () => { + const source = ` + while (true) { + + } + const y = 1 + `; + + const cfg = cfgHelper(source); + expect(cfg.graph.nodes).to.have.lengthOf(7); + expect(cfg.graph.edges).to.have.lengthOf(6); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const whileStatement = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(whileStatement)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(whileStatement)).to.have.lengthOf(2); + + // true + expect(cfg.graph.getOutgoingEdges(whileStatement)[0].type).to.equal( + EdgeType.CONDITIONAL_TRUE + ); + const constX = cfg.graph.getOutgoingEdges(whileStatement)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const backEdge = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(whileStatement).to.equal(backEdge); + + // false + expect(cfg.graph.getOutgoingEdges(whileStatement)[1].type).to.equal( + EdgeType.CONDITIONAL_FALSE + ); + const constY = cfg.graph.getOutgoingEdges(whileStatement)[1].target; + + expect(cfg.graph.getIncomingEdges(constY)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constY)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("for i loop", () => { + const source = ` + for (let i = 0; i < 10; i++) { + const x = 1 + } + const y = 1 + `; + + const cfg = cfgHelper(source); + expect(cfg.graph.nodes).to.have.lengthOf(10); + expect(cfg.graph.edges).to.have.lengthOf(9); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const initExpression = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(initExpression)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(initExpression)).to.have.lengthOf(1); + + const testExpression = cfg.graph.getOutgoingEdges(initExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(testExpression)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(testExpression)).to.have.lengthOf(2); + + // true + const forBlock = cfg.graph.getOutgoingEdges(testExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(forBlock)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(forBlock)).to.have.lengthOf(1); + + const constX = cfg.graph.getOutgoingEdges(forBlock)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const updateExpression = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(cfg.graph.getIncomingEdges(updateExpression)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(updateExpression)).to.have.lengthOf(1); + + const backEdge = cfg.graph.getOutgoingEdges(updateExpression)[0].target; + + expect(testExpression).to.equal(backEdge); + + // false + const constY = cfg.graph.getOutgoingEdges(testExpression)[1].target; + + expect(cfg.graph.getIncomingEdges(constY)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constY)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("for i loop no block", () => { + const source = ` + for (let i = 0; i < 10; i++) { + + } + const y = 1 + `; + + const cfg = cfgHelper(source); + expect(cfg.graph.nodes).to.have.lengthOf(9); + expect(cfg.graph.edges).to.have.lengthOf(8); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const initExpression = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(initExpression)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(initExpression)).to.have.lengthOf(1); + + const testExpression = cfg.graph.getOutgoingEdges(initExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(testExpression)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(testExpression)).to.have.lengthOf(2); + + // true + const constX = cfg.graph.getOutgoingEdges(testExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const updateExpression = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(cfg.graph.getIncomingEdges(updateExpression)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(updateExpression)).to.have.lengthOf(1); + + const backEdge = cfg.graph.getOutgoingEdges(updateExpression)[0].target; + + expect(testExpression).to.equal(backEdge); + + // false + const constY = cfg.graph.getOutgoingEdges(testExpression)[1].target; + + expect(cfg.graph.getIncomingEdges(constY)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constY)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("for in loop", () => { + const source = ` + for (let i in a) { + const x = 1 + } + const y = 1 + `; + + const cfg = cfgHelper(source); + expect(cfg.graph.nodes).to.have.lengthOf(9); + expect(cfg.graph.edges).to.have.lengthOf(8); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const initExpression = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(initExpression)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(initExpression)).to.have.lengthOf(1); + + const testExpression = cfg.graph.getOutgoingEdges(initExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(testExpression)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(testExpression)).to.have.lengthOf(2); + + // true + const forBlock = cfg.graph.getOutgoingEdges(testExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(forBlock)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(forBlock)).to.have.lengthOf(1); + + const constX = cfg.graph.getOutgoingEdges(forBlock)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const backEdge = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(testExpression).to.equal(backEdge); + + // false + const constY = cfg.graph.getOutgoingEdges(testExpression)[1].target; + + expect(cfg.graph.getIncomingEdges(constY)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constY)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("for in loop no block", () => { + const source = ` + for (let i in a) { + + } + const y = 1 + `; + + const cfg = cfgHelper(source); + expect(cfg.graph.nodes).to.have.lengthOf(8); + expect(cfg.graph.edges).to.have.lengthOf(7); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const initExpression = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(initExpression)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(initExpression)).to.have.lengthOf(1); + + const testExpression = cfg.graph.getOutgoingEdges(initExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(testExpression)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(testExpression)).to.have.lengthOf(2); + + // true + const constX = cfg.graph.getOutgoingEdges(testExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const backEdge = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(testExpression).to.equal(backEdge); + + // false + const constY = cfg.graph.getOutgoingEdges(testExpression)[1].target; + + expect(cfg.graph.getIncomingEdges(constY)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constY)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("for of loop", () => { + const source = ` + for (let i of a) { + const x = 1 + } + const y = 1 + `; + + const cfg = cfgHelper(source); + expect(cfg.graph.nodes).to.have.lengthOf(9); + expect(cfg.graph.edges).to.have.lengthOf(8); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const initExpression = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(initExpression)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(initExpression)).to.have.lengthOf(1); + + const testExpression = cfg.graph.getOutgoingEdges(initExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(testExpression)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(testExpression)).to.have.lengthOf(2); + + // true + const forBlock = cfg.graph.getOutgoingEdges(testExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(forBlock)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(forBlock)).to.have.lengthOf(1); + + const constX = cfg.graph.getOutgoingEdges(forBlock)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const backEdge = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(testExpression).to.equal(backEdge); + + // false + const constY = cfg.graph.getOutgoingEdges(testExpression)[1].target; + + expect(cfg.graph.getIncomingEdges(constY)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constY)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + it("for of loop no block", () => { + const source = ` + for (let i of a) { + + } + const y = 1 + `; + + const cfg = cfgHelper(source); + expect(cfg.graph.nodes).to.have.lengthOf(8); + expect(cfg.graph.edges).to.have.lengthOf(7); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const initExpression = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(initExpression)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(initExpression)).to.have.lengthOf(1); + + const testExpression = cfg.graph.getOutgoingEdges(initExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(testExpression)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(testExpression)).to.have.lengthOf(2); + + // true + const constX = cfg.graph.getOutgoingEdges(testExpression)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const backEdge = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(testExpression).to.equal(backEdge); + + // false + const constY = cfg.graph.getOutgoingEdges(testExpression)[1].target; + + expect(cfg.graph.getIncomingEdges(constY)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constY)).to.have.lengthOf(1); + + const exit = cfg.graph.getOutgoingEdges(constY)[0].target; + + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + // switch + it("switch", () => { + const source = ` + switch (a) { // 007:374 + case 1: // 044:121 + const x = 1 // 081:092 + break // 116:121 + case 2: // 149:156 // placeholder-149:156 + case 3: { // 207:278 + break // 244:249 + } // + default: // 305:348 + break; // 342:348 + } // + `; + + const cfg = cfgHelper(source); + + expect(cfg.graph.nodes).to.have.lengthOf(15); + expect(cfg.graph.edges).to.have.lengthOf(16); + + expect(cfg.graph.getIncomingEdges("ENTRY")).to.have.lengthOf(0); + expect(cfg.graph.getOutgoingEdges("ENTRY")).to.have.lengthOf(1); + + const block = cfg.graph.getOutgoingEdges("ENTRY")[0].target; + + expect(cfg.graph.getIncomingEdges(block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(block)).to.have.lengthOf(1); + + const switchStatement = cfg.graph.getOutgoingEdges(block)[0].target; + + expect(cfg.graph.getIncomingEdges(switchStatement)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(switchStatement)).to.have.lengthOf(1); + + const case1 = cfg.graph.getOutgoingEdges(switchStatement)[0].target; + + expect(cfg.graph.getIncomingEdges(case1)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(case1)).to.have.lengthOf(2); + + // true case 1 + const constX = cfg.graph.getOutgoingEdges(case1)[0].target; + + expect(cfg.graph.getIncomingEdges(constX)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(constX)).to.have.lengthOf(1); + + const breakStatementCase1 = cfg.graph.getOutgoingEdges(constX)[0].target; + + expect(cfg.graph.getIncomingEdges(breakStatementCase1)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(breakStatementCase1)).to.have.lengthOf(1); + + // false case 1 + const case2 = cfg.graph.getOutgoingEdges(case1)[1].target; + + expect(cfg.graph.getIncomingEdges(case2)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(case2)).to.have.lengthOf(2); + + // true case 2 + const placeholderCase2 = cfg.graph.getOutgoingEdges(case2)[0].target; + + expect(cfg.graph.getIncomingEdges(placeholderCase2)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(placeholderCase2)).to.have.lengthOf(1); + + const case3Placeholder = + cfg.graph.getOutgoingEdges(placeholderCase2)[0].target; + + // false case 2 + const case3 = cfg.graph.getOutgoingEdges(case2)[1].target; + + expect(cfg.graph.getIncomingEdges(case3)).to.have.lengthOf(2); + expect(cfg.graph.getOutgoingEdges(case3)).to.have.lengthOf(2); + + expect(case3).to.equal(case3Placeholder); + + // true case 3 + const case3Block = cfg.graph.getOutgoingEdges(case3)[0].target; + + expect(cfg.graph.getIncomingEdges(case3Block)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(case3Block)).to.have.lengthOf(1); + + const breakStatementCase3 = + cfg.graph.getOutgoingEdges(case3Block)[0].target; + + expect(cfg.graph.getIncomingEdges(breakStatementCase3)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(breakStatementCase3)).to.have.lengthOf(1); + + // false case 3 + const defaultCase = cfg.graph.getOutgoingEdges(case3)[1].target; + + expect(cfg.graph.getIncomingEdges(defaultCase)).to.have.lengthOf(1); + expect(cfg.graph.getOutgoingEdges(defaultCase)).to.have.lengthOf(1); + + const breakStatementDefault = + cfg.graph.getOutgoingEdges(defaultCase)[0].target; + + expect(cfg.graph.getIncomingEdges(breakStatementDefault)).to.have.lengthOf( + 1 + ); + expect(cfg.graph.getOutgoingEdges(breakStatementDefault)).to.have.lengthOf( + 1 + ); + + const exitBreak1 = + cfg.graph.getOutgoingEdges(breakStatementCase1)[0].target; + const exitBreak3 = + cfg.graph.getOutgoingEdges(breakStatementCase3)[0].target; + const exit = cfg.graph.getOutgoingEdges(breakStatementDefault)[0].target; + + expect(exitBreak1).to.equal(exitBreak3); + expect(exitBreak1).to.equal(exit); + expect(exit).to.equal("SUCCESS_EXIT"); + expect(cfg.graph.getIncomingEdges(exit)).to.have.lengthOf(3); + expect(cfg.graph.getOutgoingEdges(exit)).to.have.lengthOf(0); + }); + + // functions + it("function simple block", () => { + const source = ` + function a () { + const x = 1; + const y = 1; + const z = 1; + } + `; + + const cfg = cfgHelper(source); + + expect(cfg); + }); + + it("function simple block", () => { + const source = ` + function after(n, func) { + if (typeof func !== 'function') { + throw new TypeError('Expected a function') + } + + n = n || 0 + + return function(...args) { + if (--n < 1) { + return func.apply(this, args) + } + } + } + + export default after + + `; + + const cfg = contractControlFlowProgram(cfgHelper(source)); + + console.log(cfg.functions[0].graph); + expect(cfg.functions); + }); + + it("function short arrow", () => { + const source = `const at = (object, ...paths) => baseAt(object, baseFlatten(paths, 1)) +export default at + `; + + const cfg = contractControlFlowProgram(cfgHelper(source)); + + console.log(cfg); + expect(cfg.functions); + }); +}); diff --git a/libraries/analysis-javascript/test/dependency/DependencyVisitor.test.ts b/libraries/analysis-javascript/test/dependency/DependencyVisitor.test.ts new file mode 100644 index 000000000..41c8fb986 --- /dev/null +++ b/libraries/analysis-javascript/test/dependency/DependencyVisitor.test.ts @@ -0,0 +1,121 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { traverse } from "@babel/core"; +import * as chai from "chai"; + +import { AbstractSyntaxTreeFactory } from "../../lib/ast/AbstractSyntaxTreeFactory"; +import { DependencyVisitor } from "../../lib/dependency/DependencyVisitor"; + +const expect = chai.expect; + +function dependencyHelper(source: string) { + const generator = new AbstractSyntaxTreeFactory(); + const ast = generator.convert("", source); + + const visitor = new DependencyVisitor(""); + traverse(ast, visitor); + + return visitor.imports; +} + +describe("TargetVisitor test", () => { + it("basic import", () => { + const source = ` + import { name1 } from 'module1'; + `; + + const imports = dependencyHelper(source); + + expect(imports.size).to.equal(1); + expect(imports.has("module1")).to.equal(true); + }); + + it("basic import default", () => { + const source = ` + import name1 from 'module1'; + `; + + const imports = dependencyHelper(source); + + expect(imports.size).to.equal(1); + expect(imports.has("module1")).to.equal(true); + }); + + it("require import default", () => { + const source = ` + const name1 = require('module1'); + `; + + const imports = dependencyHelper(source); + + expect(imports.size).to.equal(1); + expect(imports.has("module1")).to.equal(true); + }); + + it("require import default scoped", () => { + const source = ` + if (true) { + const name1 = require('module1'); + } + `; + + const imports = dependencyHelper(source); + + expect(imports.size).to.equal(1); + expect(imports.has("module1")).to.equal(true); + }); + + it("require import default duplicate", () => { + const source = ` + const name1 = require('module1'); + const name2 = require('module1'); + `; + + const imports = dependencyHelper(source); + + expect(imports.size).to.equal(1); + expect(imports.has("module1")).to.equal(true); + }); + + it("require import default computed", () => { + const source = ` + const name1 = require(x); + `; + + expect(dependencyHelper(source)).to.deep.equal(new Set()); + }); + + it("basic dynamic import default computed", () => { + const source = ` + const name1 = import(x); + `; + + expect(dependencyHelper(source)).to.deep.equal(new Set()); + }); + + it("basic dynamic import default computed", () => { + const source = ` + const name1 = import('module1'); + `; + + const imports = dependencyHelper(source); + + expect(imports.size).to.equal(1); + expect(imports.has("module1")).to.equal(true); + }); +}); diff --git a/libraries/cfg-javascript/lib/index.ts b/libraries/analysis-javascript/test/helper.test.ts similarity index 75% rename from libraries/cfg-javascript/lib/index.ts rename to libraries/analysis-javascript/test/helper.test.ts index 9f172848f..147972010 100644 --- a/libraries/cfg-javascript/lib/index.ts +++ b/libraries/analysis-javascript/test/helper.test.ts @@ -1,7 +1,7 @@ /* * Copyright 2020-2023 Delft University of Technology and SynTest contributors * - * This file is part of SynTest Framework - SynTest Javascript. + * This file is part of SynTest Framework - SynTest JavaScript. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { setupLogger } from "@syntest/logging"; -export * from "./CFGGenerator"; -export * from "./ControlFlowGraphGenerator"; -export * from "./ControlFlowGraphVisitor"; +before(() => { + // Set up the test environment + // ... + setupLogger("", [], "debug"); +}); diff --git a/libraries/javascript/test/analysis/static/map/TargetMapGenerator.test.ts b/libraries/analysis-javascript/test/target/TargetFactory.test.ts similarity index 65% rename from libraries/javascript/test/analysis/static/map/TargetMapGenerator.test.ts rename to libraries/analysis-javascript/test/target/TargetFactory.test.ts index e56c578a7..4099cac9f 100644 --- a/libraries/javascript/test/analysis/static/map/TargetMapGenerator.test.ts +++ b/libraries/analysis-javascript/test/target/TargetFactory.test.ts @@ -15,12 +15,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { AbstractSyntaxTreeGenerator } from "@syntest/ast-javascript"; -import { TargetMapGenerator } from "../../../../lib/analysis/static/map/TargetMapGenerator"; +import { expect } from "chai"; +import { AbstractSyntaxTreeFactory } from "../../lib/ast/AbstractSyntaxTreeFactory"; -describe("Temp", () => { - it("temp", () => { - const target = "test"; +import { TargetFactory } from "../../lib/target/TargetFactory"; + +describe("TargetFactory", () => { + it("class with getter and setters", () => { const code = ` class Test { _propertyX = "example" @@ -33,12 +34,11 @@ describe("Temp", () => { } } `; - const ast = new AbstractSyntaxTreeGenerator().generate(code); + const ast = new AbstractSyntaxTreeFactory().convert("", code); - const targetMapGenerator = new TargetMapGenerator(); - const { targetMap, functionMap } = targetMapGenerator.generate(target, ast); + const targetMapGenerator = new TargetFactory(); + const target = targetMapGenerator.extract("", ast); - console.log(targetMap); - console.log(functionMap); + expect(target.subTargets.length).to.equal(3); }); }); diff --git a/libraries/analysis-javascript/test/target/TargetVisitor.test.ts b/libraries/analysis-javascript/test/target/TargetVisitor.test.ts new file mode 100644 index 000000000..76b651539 --- /dev/null +++ b/libraries/analysis-javascript/test/target/TargetVisitor.test.ts @@ -0,0 +1,498 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { traverse } from "@babel/core"; +import * as chai from "chai"; + +import { AbstractSyntaxTreeFactory } from "../../lib/ast/AbstractSyntaxTreeFactory"; +import { ExportVisitor } from "../../lib/target/export/ExportVisitor"; +import { TargetVisitor } from "../../lib/target/TargetVisitor"; +import { + FunctionTarget, + SubTarget, + ClassTarget, + MethodTarget, + ObjectTarget, + ObjectFunctionTarget, +} from "../../lib/target/Target"; +import { TargetType } from "@syntest/analysis"; + +const expect = chai.expect; + +function targetHelper(source: string) { + const generator = new AbstractSyntaxTreeFactory(); + const ast = generator.convert("", source); + + const exportVisitor = new ExportVisitor(""); + traverse(ast, exportVisitor); + const exports = exportVisitor.exports; + + const visitor = new TargetVisitor("", exports); + traverse(ast, visitor); + + return visitor.subTargets; +} + +function checkFunction( + target: SubTarget, + name: string, + exported: boolean, + isAsync: boolean +): void { + expect(target.type).to.equal(TargetType.FUNCTION); + + const functionTarget = target; + + expect(functionTarget.name).to.equal(name); + expect(functionTarget.exported).to.equal(exported); + expect(functionTarget.isAsync).to.equal(isAsync); +} + +function checkObject(target: SubTarget, name: string, exported: boolean): void { + expect(target.type).to.equal(TargetType.OBJECT); + + const objectTarget = target; + + expect(objectTarget.name).to.equal(name); + expect(objectTarget.exported).to.equal(exported); +} + +function checkObjectFunction( + target: SubTarget, + name: string, + objectName: string, + isAsync: boolean +): void { + expect(target.type).to.equal(TargetType.OBJECT_FUNCTION); + + const functionTarget = target; + + expect(functionTarget.name).to.equal(name); + expect(functionTarget.objectName).to.equal(objectName); + expect(functionTarget.isAsync).to.equal(isAsync); +} + +function checkClass(target: SubTarget, name: string, exported: boolean): void { + expect(target.type).to.equal(TargetType.CLASS); + + const classTarget = target; + + expect(classTarget.name).to.equal(name); + expect(classTarget.exported).to.equal(exported); +} + +function checkClassMethod( + target: SubTarget, + name: string, + className: string, + methodType: string, + visibility: string, + isStatic: boolean, + isAsync: boolean +): void { + expect(target.type).to.equal(TargetType.METHOD); + + const methodTarget = target; + + expect(methodTarget.name).to.equal(name); + expect(methodTarget.className).to.equal(className); + expect(methodTarget.methodType).to.equal(methodType); + expect(methodTarget.visibility).to.equal(visibility); + expect(methodTarget.isStatic).to.equal(isStatic); + expect(methodTarget.isAsync).to.equal(isAsync); +} + +describe("TargetVisitor test", () => { + it("FunctionExpression: tree functions one exported", () => { + const source = ` + const name1 = function () {} + const name2 = async function () {} + const name3 = async function abc() {} + export { name1 } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(3); + + checkFunction(targets[0], "name1", true, false); + checkFunction(targets[1], "name2", false, true); + checkFunction(targets[2], "name3", false, true); + }); + + it("FunctionExpression: functions overwritten", () => { + const source = ` + let name1 = function () {} + name1 = async function () {} + export { name1 } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(1); + + checkFunction(targets[0], "name1", true, true); + }); + + it("FunctionExpression: functions overwritten in subscope", () => { + const source = ` + let name1 = function () {} + + if (true) { + name1 = async function () {} + } + + export { name1 } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(1); + + checkFunction(targets[0], "name1", true, true); + }); + + it("FunctionDeclaration: two functions one exported", () => { + const source = ` + function name1() {} + function name2() {} + export { name1 } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(2); + + checkFunction(targets[0], "name1", true, false); + checkFunction(targets[1], "name2", false, false); + }); + + it("ClassExpression: one exported", () => { + const source = ` + const x = class name1 {} + export { x } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(1); + + checkClass(targets[0], "x", true); + }); + + it("ClassDeclaration: one exported", () => { + const source = ` + class name1 {} + export { name1 } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(1); + + checkClass(targets[0], "name1", true); + }); + + it("ClassMethod:", () => { + const source = ` + class name1 { + constructor() {} + method1() {} + static method2() {} + async method3() {} + static async method4() {} + + _prop1 = 1 + + get prop1() { + return this._prop1 + } + set prop1(value) { + this._prop1 = value + } + } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(8); + + checkClass(targets[0], "name1", false); + checkClassMethod( + targets[1], + "constructor", + "name1", + "constructor", + "public", + false, + false + ); + checkClassMethod( + targets[2], + "method1", + "name1", + "method", + "public", + false, + false + ); + checkClassMethod( + targets[3], + "method2", + "name1", + "method", + "public", + true, + false + ); + checkClassMethod( + targets[4], + "method3", + "name1", + "method", + "public", + false, + true + ); + checkClassMethod( + targets[5], + "method4", + "name1", + "method", + "public", + true, + true + ); + checkClassMethod( + targets[6], + "prop1", + "name1", + "get", + "public", + false, + false + ); + checkClassMethod( + targets[7], + "prop1", + "name1", + "set", + "public", + false, + false + ); + }); + + it("ArrowFunctionExpression: const", () => { + const source = ` + const x = () => {} + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(1); + + checkFunction(targets[0], "x", false, false); + }); + + it("ArrowFunctionExpression: as class property", () => { + const source = ` + class name1 { + method1 = () => {} + } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(2); + + checkClass(targets[0], "name1", false); + checkClassMethod( + targets[1], + "method1", + "name1", + "method", + "public", + false, + false + ); + }); + + it("ArrowFunctionExpression: as default class property", () => { + const source = ` + export default class { + method1 = () => {} + } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(2); + + checkClass(targets[0], "default", true); + checkClassMethod( + targets[1], + "method1", + "default", + "method", + "public", + false, + false + ); + }); + + it("ArrowFunctionExpression: as class expression property", () => { + const source = ` + const name1 = class name2 { + method1 = () => {} + } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(2); + + checkClass(targets[0], "name1", false); + checkClassMethod( + targets[1], + "method1", + "name1", + "method", + "public", + false, + false + ); + }); + + it("ArrowFunctionExpression: as class expression property where class expression is in object", () => { + const source = ` + const obj = { + name1: class name2 { + method1 = () => {} + } + } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(2); + + checkClass(targets[0], "name1", false); + checkClassMethod( + targets[1], + "method1", + "name1", + "method", + "public", + false, + false + ); + }); + + it("ArrowFunctionExpression: as class expression property where class expression is in object using literal", () => { + const source = ` + const obj = { + "name1": class name2 { + method1 = () => {} + } + } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(2); + + checkClass(targets[0], "name1", false); + checkClassMethod( + targets[1], + "method1", + "name1", + "method", + "public", + false, + false + ); + }); + + it("FunctionExpression: assignment computed", () => { + const source = ` + const x = {} + x[y] = function name1() {} + `; + expect(targetHelper(source)).to.deep.equal([]); + }); + + it("FunctionExpression: assignment memberexpression", () => { + const source = ` + const x = {} + x.y = function name1() {} + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(2); + + checkObject(targets[0], "x", false); + checkObjectFunction(targets[1], "y", "x", false); + }); + + it("ObjectFunction: assignment memberexpression using literal", () => { + const source = ` + const x = {} + x['y'] = function name1() {} + x['z'] = async () => {} + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(3); + + checkObject(targets[1], "x", false); + checkObjectFunction(targets[0], "y", "x", false); + checkObjectFunction(targets[2], "z", "x", true); + }); + + it("ObjectFunction: assignment memberexpression using literal", () => { + const source = ` + const x = {} + x['y'] = function name1() {} + export { x } + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(2); + + checkObject(targets[0], "x", true); + checkObjectFunction(targets[1], "y", "x", false); + }); + + it("ObjectFunction: assignment memberexpression using literal", () => { + const source = ` + const x = {} + x['y'] = function name1() {} + module.exports = x + `; + + const targets = targetHelper(source); + + expect(targets.length).to.equal(2); + + checkObject(targets[0], "x", true); + checkObjectFunction(targets[1], "y", "x", false); + }); +}); diff --git a/libraries/analysis-javascript/test/target/export/ExportVisitor.test.ts b/libraries/analysis-javascript/test/target/export/ExportVisitor.test.ts new file mode 100644 index 000000000..21f095048 --- /dev/null +++ b/libraries/analysis-javascript/test/target/export/ExportVisitor.test.ts @@ -0,0 +1,885 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { traverse } from "@babel/core"; +import * as chai from "chai"; + +import { AbstractSyntaxTreeFactory } from "../../../lib/ast/AbstractSyntaxTreeFactory"; +import { ExportVisitor } from "../../../lib/target/export/ExportVisitor"; + +const expect = chai.expect; + +function exportHelper(source: string) { + const generator = new AbstractSyntaxTreeFactory(); + const ast = generator.convert("", source); + + const visitor = new ExportVisitor(""); + + traverse(ast, visitor); + + return visitor.exports; +} + +/** + * Test cases are based on the following documentation: + * https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export + */ +describe("ExportVisitor test", () => { + // export declarations + it("export basic declaration", () => { + const source = `export let name1, name2/*, … */; // also var`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(2); + + expect(exports[0].name).to.equal("name1"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("name1"); + + expect(exports[1].name).to.equal("name2"); + expect(exports[1].default).to.equal(false); + expect(exports[1].module).to.equal(false); + expect(exports[1].renamedTo).to.equal("name2"); + }); + + it("export initialized declaration", () => { + const source = `export const name1 = 1, name2 = 2/*, … */; // also var, let`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(2); + + expect(exports[0].name).to.equal("name1"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("name1"); + + expect(exports[1].name).to.equal("name2"); + expect(exports[1].default).to.equal(false); + expect(exports[1].module).to.equal(false); + expect(exports[1].renamedTo).to.equal("name2"); + }); + + it("export initialized declaration renamed", () => { + const source = ` + const x = 1; + export const name1 = x, name2 = 2/*, … */; // also var, let`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(2); + + expect(exports[0].name).to.equal("x"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("name1"); + + expect(exports[1].name).to.equal("name2"); + expect(exports[1].default).to.equal(false); + expect(exports[1].module).to.equal(false); + expect(exports[1].renamedTo).to.equal("name2"); + }); + + it("export function declaration", () => { + const source = `export function functionName() { /* … */ }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("functionName"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("functionName"); + }); + + it("export class declaration", () => { + const source = `export class ClassName { /* … */ }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("ClassName"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("ClassName"); + }); + + it("export starred function declaration", () => { + const source = `export function* generatorFunctionName() { /* … */ }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("generatorFunctionName"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("generatorFunctionName"); + }); + + it("export ObjectPattern declaration", () => { + const source = `export const { name1, name2: bar } = { name1: 1, name2: 2};`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(2); + + expect(exports[0].name).to.equal("name1"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("name1"); + + expect(exports[1].name).to.equal("name2"); + expect(exports[1].default).to.equal(false); + expect(exports[1].module).to.equal(false); + expect(exports[1].renamedTo).to.equal("name2"); + }); + + it("export ObjectPattern declaration rename", () => { + const source = ` + const x = 1; + const a = 2; + export const { name1, name2: bar } = { name1: x, name2: a};`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(2); + + expect(exports[0].name).to.equal("x"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("name1"); + + expect(exports[1].name).to.equal("a"); + expect(exports[1].default).to.equal(false); + expect(exports[1].module).to.equal(false); + expect(exports[1].renamedTo).to.equal("name2"); + }); + + it("export ObjectPattern declaration to object", () => { + const source = `export const { name1, name2: bar } = o;`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export ObjectPattern declaration not equal amount of properties", () => { + const source = `export const { name1, name2 } = {name1: 1}`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export ObjectPattern declaration rest element", () => { + const source = `export const { name1, ...name2 } = {name1: 1, name2: 2}`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export ObjectPattern declaration spread element", () => { + const source = `export const { name1, name2 } = {name1: 1, ...o}`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export ObjectPattern declaration non matching props", () => { + const source = `export const { name1, name2 } = {name1: 1, b: 2}`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export ArrayPattern declaration", () => { + const source = `export const [ name1, name2 ] = [1, 2];`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(2); + + expect(exports[0].name).to.equal("name1"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("name1"); + + expect(exports[1].name).to.equal("name2"); + expect(exports[1].default).to.equal(false); + expect(exports[1].module).to.equal(false); + expect(exports[1].renamedTo).to.equal("name2"); + }); + + it("export ArrayPattern declaration rename", () => { + const source = ` + const x = 1; + const a = 2; + export const [ name1, name2 ] = [x, a];`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(2); + + expect(exports[0].name).to.equal("x"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("name1"); + + expect(exports[1].name).to.equal("a"); + expect(exports[1].default).to.equal(false); + expect(exports[1].module).to.equal(false); + expect(exports[1].renamedTo).to.equal("name2"); + }); + + it("export ArrayPattern declaration to array", () => { + const source = `export const [ name1, name2 ] = array;`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export ObjectPattern declaration not equal amount of properties", () => { + const source = `export const [ name1, name2 ] = [1]`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export ObjectPattern declaration rest element", () => { + const source = `export const [ name1, ...name2 ] = [1, 2]`; + + expect(() => exportHelper(source)).throw(); + }); + + // list exports + it("export basic specifier", () => { + const source = ` + const name1 = 1 + const nameN = 2 + export { name1, /* …, */ nameN };`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(2); + + expect(exports[0].name).to.equal("name1"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("name1"); + + expect(exports[1].name).to.equal("nameN"); + expect(exports[1].default).to.equal(false); + expect(exports[1].module).to.equal(false); + expect(exports[1].renamedTo).to.equal("nameN"); + }); + + it("export named specifier", () => { + const source = ` + const variable1 = 1 + const variable2 = 2 + const nameN = 3 + export { variable1 as name1, variable2 as name2, /* …, */ nameN };`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(3); + + expect(exports[0].name).to.equal("variable1"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("name1"); + + expect(exports[1].name).to.equal("variable2"); + expect(exports[1].default).to.equal(false); + expect(exports[1].module).to.equal(false); + expect(exports[1].renamedTo).to.equal("name2"); + + expect(exports[2].name).to.equal("nameN"); + expect(exports[2].default).to.equal(false); + expect(exports[2].module).to.equal(false); + expect(exports[2].renamedTo).to.equal("nameN"); + }); + + it("export named string specifier", () => { + const source = ` + const variable1 = 1 + export { variable1 as "string_name" };`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("variable1"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("string_name"); + }); + + it("export named default specifier", () => { + const source = ` + const name1 = 1 + export { name1 as default /*, … */ };`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("name1"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("default"); + }); + + // default exports + it("export default expression", () => { + const source = ` + const expression = 1 + export default expression;`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("expression"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("expression"); + }); + + it("export default function named", () => { + const source = `export default function functionName() { /* … */ }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("functionName"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("functionName"); + }); + + it("export default class named", () => { + const source = `export default class ClassName { /* … */ }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("ClassName"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("ClassName"); + }); + + it("export default starred function named", () => { + const source = `export default function* generatorFunctionName() { /* … */ }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("generatorFunctionName"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("generatorFunctionName"); + }); + + it("export default function unnamed", () => { + const source = `export default function () { /* … */ }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("default"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("default"); + }); + + it("export default class unnamed", () => { + const source = `export default class { /* … */ }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("default"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("default"); + }); + + it("export default starred function unnamed", () => { + const source = `export default function* () { /* … */ }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("default"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("default"); + }); + + it("export default const value", () => { + const source = `export default 1`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export default new expression non identifier", () => { + const source = `export default new x['a']()`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export default new expression", () => { + const source = `export default new Function()`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("Function"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("Function"); + }); + + // aggregate exports + it("export all from module", () => { + const source = `export * from "module-name";`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(0); + }); + + it("export all from module and rename", () => { + const source = `export * as name1 from "module-name";`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(0); + }); + + it("export specific from module", () => { + const source = `export { name1, /* …, */ nameN } from "module-name";`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(0); + }); + + it("export specific from module and rename", () => { + const source = `export { import1 as name1, import2 as name2, /* …, */ nameN } from "module-name";`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(0); + }); + + it("export default from module", () => { + const source = `export { default, /* …, */ } from "module-name";`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(0); + }); + + it("export default from module and rename", () => { + const source = `export { default as name1 } from "module-name";`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(0); + }); + + // module exports + it("export module default", () => { + const source = `module.exports = 5;`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("NumericLiteral"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("NumericLiteral"); + }); + + it("export module default object", () => { + const source = `module.exports = { a: 5, b: 5};`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(2); + + expect(exports[0].name).to.equal("a"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("a"); + + expect(exports[1].name).to.equal("b"); + expect(exports[1].default).to.equal(false); + expect(exports[1].module).to.equal(true); + expect(exports[1].renamedTo).to.equal("b"); + }); + + it("export module default object no init", () => { + const source = ` + const a = 1; + const b = 1; + module.exports = { a, b};`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(2); + + expect(exports[0].name).to.equal("a"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("a"); + + expect(exports[1].name).to.equal("b"); + expect(exports[1].default).to.equal(false); + expect(exports[1].module).to.equal(true); + expect(exports[1].renamedTo).to.equal("b"); + }); + + it("export module default array", () => { + const source = ` + const a = 1 + const b = 1 + module.exports = [ a, b ];`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("ArrayExpression"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("ArrayExpression"); + }); + + it("export module default identifier", () => { + const source = ` + const o = {} + module.exports = o;`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("o"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("o"); + }); + + it("export module default named function", () => { + const source = `module.exports = function x () {};`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("x"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("x"); + }); + + it("export module default unnamed function", () => { + const source = `module.exports = function () {};`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("anonymous"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("anonymous"); + }); + + it("export module default arrow function", () => { + const source = `module.exports = () => {};`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("anonymous"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("anonymous"); + }); + + it("export expression but not assignment", () => { + const source = `module.exports`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(0); + }); + + it("export exports equals const", () => { + const source = `exports = 5`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("NumericLiteral"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("NumericLiteral"); + }); + + it("export exports.x equals const", () => { + const source = `exports.x = 5`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("x"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("x"); + }); + + it("export exports.x equals a", () => { + const source = ` + const a = 1; + exports.x = a`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("a"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("x"); + }); + + it("export exports['x'] equals a", () => { + const source = ` + const a = 1; + exports['x'] = a + `; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("a"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("x"); + }); + + it("export exports[x] equals a", () => { + const source = ` + const a = 1; + exports[x] = a`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export module.x equals a", () => { + const source = ` + const a = 1 + module.x = a + `; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(0); + }); + + it("export module['exports'] equals a", () => { + const source = ` + const a = 1; + module['exports'] = a + `; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + expect(exports[0].name).to.equal("a"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("a"); + }); + + it("export module[exports] equals a", () => { + const source = ` + const a = 1 + module[exports] = a + `; + + expect(() => exportHelper(source)).throw(); + }); + + it("export module.exports.x equals a", () => { + const source = ` + const a = 1; + module.exports.x = a + `; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + expect(exports[0].name).to.equal("a"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("x"); + }); + + it("export func().x equals a", () => { + const source = ` + const a = 5; + func().x = a + `; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(0); + }); + + it("export module.x.x equals a", () => { + const source = ` + const a = 5; + module.x.x = a + `; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(0); + }); + + it("export module.exports['x'] equals a", () => { + const source = ` + const a = 5; + module.exports['x'] = a + `; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + expect(exports[0].name).to.equal("a"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("x"); + }); + + it("export module.exports[x] equals a", () => { + const source = `module.exports[x] = a`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export exports equals object expression with object method", () => { + const source = `exports = {a() {}}`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + expect(exports[0].name).to.equal("a"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("a"); + }); + + it("export exports equals object expression with spread element", () => { + const source = `exports = {...a}`; + + expect(() => exportHelper(source)).throw(); + }); + + it("export exports equals object expression with object property string literal", () => { + const source = `exports = { "a": 1 }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + expect(exports[0].name).to.equal("a"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("a"); + }); + + it("export exports equals object expression with object property number literal", () => { + const source = `exports = { 5: 1 }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + expect(exports[0].name).to.equal("5"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("5"); + }); + + it("export exports equals object expression with object property boolean literal", () => { + const source = `exports = { true: 1 }`; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + expect(exports[0].name).to.equal("true"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("true"); + }); + + it("export exports equals object expression with object property rename var", () => { + const source = ` + const b = 1; + exports = { a: b } + `; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + expect(exports[0].name).to.equal("b"); + expect(exports[0].default).to.equal(false); + expect(exports[0].module).to.equal(true); + expect(exports[0].renamedTo).to.equal("a"); + }); + + it("export short arrow", () => { + const source = ` + const at = (object, ...paths) => baseAt(object, baseFlatten(paths, 1)) + + export default at + `; + + const exports = exportHelper(source); + + expect(exports.length).to.equal(1); + + expect(exports[0].name).to.equal("at"); + expect(exports[0].default).to.equal(true); + expect(exports[0].module).to.equal(false); + expect(exports[0].renamedTo).to.equal("at"); + }); +}); diff --git a/libraries/analysis-javascript/test/type/ElementVisitor.test.ts b/libraries/analysis-javascript/test/type/ElementVisitor.test.ts new file mode 100644 index 000000000..8952c3dfa --- /dev/null +++ b/libraries/analysis-javascript/test/type/ElementVisitor.test.ts @@ -0,0 +1,323 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { traverse } from "@babel/core"; +import * as chai from "chai"; + +import { AbstractSyntaxTreeFactory } from "../../lib/ast/AbstractSyntaxTreeFactory"; + +import { ElementVisitor } from "../../lib/type/discovery/element/ElementVisitor"; +import { Identifier } from "../../lib/type/discovery/element/Element"; + +const expect = chai.expect; + +function elementHelper(source: string) { + const generator = new AbstractSyntaxTreeFactory(); + const ast = generator.convert("", source); + + const visitor = new ElementVisitor(""); + traverse(ast, visitor); + + return visitor.elementMap; +} + +describe("ElementVisitor test", () => { + it("Identifiers: Block", () => { + const source = ` + const name1 = function () {} + const name2 = async function () {} + const name3 = async function abc() {} + export { name1 } + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(5); + + for (const element of elements) { + expect(element.type).to.equal("identifier"); + } + + const name1 = elements.filter( + (element) => (element).name === "name1" + ); + expect(name1.length).to.equal(2); + expect((name1[0]).bindingId).to.equal( + (name1[1]).bindingId + ); + }); + + it("Identifiers: Block reuse", () => { + const source = ` + let name1 = function () {} + + function a () { + name1 = function () {} + } + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(3); + + for (const element of elements) { + expect(element.type).to.equal("identifier"); + } + + const name1 = elements.filter( + (element) => (element).name === "name1" + ); + expect(name1.length).to.equal(2); + expect((name1[0]).bindingId).to.equal( + (name1[1]).bindingId + ); + }); + + it("Identifiers: shadowing", () => { + const source = ` + const name1 = function () {} + + function a () { + const name1 = function () {} + } + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(3); + + for (const element of elements) { + expect(element.type).to.equal("identifier"); + } + + const name1 = elements.filter( + (element) => (element).name === "name1" + ); + expect(name1.length).to.equal(2); + expect((name1[0]).bindingId).to.not.equal( + (name1[1]).bindingId + ); + }); + + it("Identifiers: shadowing as function arg", () => { + const source = ` + const name1 = function () {} + + function a (name1) { + } + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(3); + + for (const element of elements) { + expect(element.type).to.equal("identifier"); + } + + const name1 = elements.filter( + (element) => (element).name === "name1" + ); + expect(name1.length).to.equal(2); + expect((name1[0]).bindingId).to.not.equal( + (name1[1]).bindingId + ); + }); + + it("Literal: undefined", () => { + const source = ` + const name1 = undefined + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("undefined"); + }); + + it("Literal: string", () => { + const source = ` + const name1 = "abc" + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("stringLiteral"); + }); + + it("Literal: number", () => { + const source = ` + const name1 = 0 + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("numericalLiteral"); + }); + + it("Literal: exponiated number", () => { + const source = ` + const name1 = 1e10 + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("numericalLiteral"); + }); + + it("Literal: decimal number", () => { + const source = ` + const name1 = 1_000_000_000_000 + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("numericalLiteral"); + }); + + it("Literal: binary number", () => { + const source = ` + const name1 = 0b1010_0001_1000_0101 + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("numericalLiteral"); + }); + + it("Literal: hex number", () => { + const source = ` + const name1 = 0xa0_b0_c0 + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("numericalLiteral"); + }); + + it("Literal: octal number", () => { + const source = ` + const name1 = 0o00100 + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("numericalLiteral"); + }); + + it("Literal: null", () => { + const source = ` + const name1 = null + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("nullLiteral"); + }); + + it("Literal: boolean", () => { + const source = ` + const name1 = true + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("booleanLiteral"); + }); + + it("Literal: regex", () => { + const source = ` + const name1 = /abc/ + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("regExpLiteral"); + }); + + it("Literal: template", () => { + const source = ` + const name1 = \`abc\${1}\` + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(4); + // we dont handle templates as elements but as relations + expect(elements[0].type).to.equal("identifier"); + }); + + it("Literal: bigint", () => { + const source = ` + const name1 = 1n + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + expect(elements[0].type).to.equal("identifier"); + expect(elements[1].type).to.equal("bigIntLiteral"); + }); + + it("Literal: decimal", () => { + // TODO no clue how to test this + // dont know what a decimal literal is in javascript + const source = ` + const name1 = true + `; + + const elements = [...elementHelper(source).values()]; + + expect(elements.length).to.equal(2); + + // expect(elements[0].type).to.equal("identifier"); + // expect(elements[1].type).to.equal("decimalLiteral"); + }); +}); diff --git a/libraries/analysis-javascript/test/type/RelationVisitor.test.ts b/libraries/analysis-javascript/test/type/RelationVisitor.test.ts new file mode 100644 index 000000000..d8711e43b --- /dev/null +++ b/libraries/analysis-javascript/test/type/RelationVisitor.test.ts @@ -0,0 +1,140 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { traverse } from "@babel/core"; +import * as chai from "chai"; + +import { AbstractSyntaxTreeFactory } from "../../lib/ast/AbstractSyntaxTreeFactory"; + +import { RelationVisitor } from "../../lib/type/discovery/relation/RelationVisitor"; + +const expect = chai.expect; + +function relationHelper(source: string) { + const generator = new AbstractSyntaxTreeFactory(); + const ast = generator.convert("", source); + + const visitor = new RelationVisitor(""); + traverse(ast, visitor); + + return visitor.relationMap; +} + +describe("RelationVisitor test", () => { + it("Assignment", () => { + const source = ` + const name1 = 1 + `; + + const relations = [...relationHelper(source).values()]; + + expect(relations.length).to.equal(1); + }); + + it("Function", () => { + const source = ` + function name1() {} + `; + + const relations = [...relationHelper(source).values()]; + + expect(relations.length).to.equal(1); + expect(relations[0].involved.length).to.equal(1); + }); + + it("Function anonymous", () => { + const source = ` + const a = function () {} + `; + + const relations = [...relationHelper(source).values()]; + + expect(relations.length).to.equal(2); + expect(relations[0].involved.length).to.equal(2); + expect(relations[1].involved.length).to.equal(1); + expect(relations[1].involved[0]).to.equal(`${relations[1].id}::anonymous`); + expect(relations[0].involved[1]).to.equal(relations[1].id); + }); + + it("Function with args", () => { + const source = ` + function name1(a, b) {} + `; + + const relations = [...relationHelper(source).values()]; + + expect(relations.length).to.equal(1); + expect(relations[0].involved.length).to.equal(3); + }); + + it("Function with return", () => { + const source = ` + function name1() { + return 1 + } + `; + + const relations = [...relationHelper(source).values()]; + + expect(relations.length).to.equal(2); + expect(relations[0].involved.length).to.equal(1); + expect(relations[1].involved.length).to.equal(2); + expect(relations[1].involved[0]).to.equal(relations[0].id); + }); + + // call expression + it("Call expression no args", () => { + const source = ` + abc() + `; + + const relations = [...relationHelper(source).values()]; + + expect(relations.length).to.equal(1); + expect(relations[0].involved.length).to.equal(1); + }); + + it("Call expression 2 args", () => { + const source = ` + abc(a, b) + `; + + const relations = [...relationHelper(source).values()]; + + expect(relations.length).to.equal(1); + expect(relations[0].involved.length).to.equal(3); + }); + + // Object + it("Object property", () => { + const source = ` + const a = { + b: 1 + } + `; + + const relations = [...relationHelper(source).values()]; + + expect(relations.length).to.equal(3); + expect(relations[0].involved.length).to.equal(2); + expect(relations[1].involved.length).to.equal(1); + expect(relations[2].involved.length).to.equal(2); + + expect(relations[0].involved[1]).to.equal(relations[1].id); + expect(relations[1].involved[0]).to.equal(relations[2].id); + }); +}); diff --git a/libraries/ast-javascript/lib/tsconfig.json b/libraries/analysis-javascript/tsconfig.json similarity index 58% rename from libraries/ast-javascript/lib/tsconfig.json rename to libraries/analysis-javascript/tsconfig.json index 4f4603271..97ea4a6a1 100644 --- a/libraries/ast-javascript/lib/tsconfig.json +++ b/libraries/analysis-javascript/tsconfig.json @@ -1,7 +1,7 @@ { - "extends": "../../../tsconfig-base.json", + "extends": "../../tsconfig-base.json", "compilerOptions": { - "outDir": "../dist", + "outDir": "./dist", "rootDir": ".", "composite": true }, diff --git a/libraries/ast-javascript/lib/AbstractSyntaxTreeVisitor.ts b/libraries/ast-javascript/lib/AbstractSyntaxTreeVisitor.ts deleted file mode 100644 index 2c69719db..000000000 --- a/libraries/ast-javascript/lib/AbstractSyntaxTreeVisitor.ts +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NodePath } from "@babel/core"; -import { TraverseOptions } from "@babel/traverse"; -import * as t from "@babel/types"; -import { Scope } from "./Scope"; -import { Element, ElementType } from "./Element"; - -export class AbstractSyntaxTreeVisitor implements TraverseOptions { - private _filePath: string; - - private _nodeId: number; - private _scopeIdOffset: number; - - private _thisScopes: Set = new Set([ - "ClassDeclaration", - "FunctionDeclaration", - ]); - private _thisScopeStack: number[] = []; - private _thisScopeStackNames: string[] = []; - - get filePath() { - return this._filePath; - } - - get nodeId() { - return this.nodeId; - } - - get scopeIdOffset() { - return this._scopeIdOffset; - } - - constructor(filePath: string) { - this._filePath = filePath; - this._nodeId = 0; - } - - enter = () => { - this._nodeId += 1; - }; - - Program = { - enter: (path: NodePath) => { - // console.log(path.scope) - if (this._scopeIdOffset === undefined) { - this._scopeIdOffset = path.scope["uid"]; - this._thisScopeStack.push(path.scope["uid"]); - this._thisScopeStackNames.push("global"); - } - }, - }; - - Scopable = { - enter: (path: NodePath) => { - if (!this._thisScopes.has(path.node.type)) { - return; - } - - const id: string = path.node["id"]?.name || "anon"; - this._thisScopeStack.push(path.scope["uid"]); - this._thisScopeStackNames.push(id); - }, - exit: (path: NodePath) => { - if (!this._thisScopes.has(path.node.type)) { - return; - } - - this._thisScopeStack.pop(); - this._thisScopeStackNames.pop(); - }, - }; - - private _getCurrentThisScopeId() { - if (!this._thisScopeStack.length) { - throw new Error("Invalid scope stack!"); - } - - return this._thisScopeStack[this._thisScopeStack.length - 1]; - } - - private _getCurrentThisScopeName() { - if (!this._thisScopeStackNames.length) { - throw new Error("Invalid scope stack!"); - } - - return this._thisScopeStackNames[this._thisScopeStackNames.length - 1]; - } - - _getScope(path): Scope { - if (path.node.type === "ThisExpression") { - return { - uid: `${this._getCurrentThisScopeId() - this.scopeIdOffset}`, - filePath: this.filePath, - }; - } - - if (path.node.type === "MemberExpression") { - const propertyName = path.node.property.name; - - const objectScope: Scope = this._getScope(path.get("object")); - - objectScope.uid += "-" + propertyName; - - return objectScope; - } else if (path.node.type === "CallExpression") { - return this._getScope(path.get("callee")); - } - - if ( - path.parent.type === "MemberExpression" && - path.parentPath.get("property") === path - ) { - const propertyName = path.node.name; - - const objectScope: Scope = this._getScope(path.parentPath.get("object")); - - objectScope.uid += "-" + propertyName; - - return objectScope; - } - - if (path.node.type === "Identifier") { - if (path.scope.hasGlobal(path.node.name)) { - return { - uid: "global", - filePath: this.filePath, - }; - } - - if ( - path.scope.hasBinding(path.node.name) && - path.scope.getBinding(path.node.name) - ) { - const variableScope = path.scope.getBinding(path.node.name).scope; - - return { - uid: `${variableScope.uid - this.scopeIdOffset}`, - filePath: this.filePath, - }; - } - - // if (path.scope.hasOwnBinding(node.name)) { - // const variableScope = path.scope.getOwnBinding(node.name).scope - // - // return { - // uid: variableScope.uid, - // filePath: filePath, - // } - // } - - // TODO these might be wrong - if ( - path.parent.type === "ClassMethod" || - path.parent.type === "ObjectMethod" || - path.parent.type === "AssignmentExpression" || - path.parent.type === "FunctionExpression" || - path.parent.type === "ObjectProperty" || - path.parent.type === "MetaProperty" - ) { - const uid = path.scope.getBlockParent()?.uid; - - return { - filePath: this.filePath, - uid: `${uid - this.scopeIdOffset}`, - }; - } - - throw new Error( - `Cannot find scope of Identifier ${path.node.name}\n${ - this.filePath - }\n${path.getSource()}` - ); - } - - // TODO super should be handled like this actually (kind off) - if ( - path.node.type === "Super" || - path.node.type.includes("Expression") || - path.node.type.includes("Literal") - ) { - const uid = path.scope.getBlockParent()?.uid; - - return { - filePath: this.filePath, - uid: `${uid - this.scopeIdOffset}`, - }; - } - - throw new Error( - `Cannot find scope of element of type ${path.node.type}\n${ - this.filePath - }\n${path.getSource()}` - ); - - // const uid = path.scope.getBlockParent()?.uid - // - // return { - // filePath: this.filePath, - // uid: `${uid - this.scopeIdOffset}` - // } - // const uid = path.scope.getBlockParent()?.uid - // - // return { - // filePath: this.filePath, - // uid: `${uid - this.scopeIdOffset}` - // } - } - - _getElement(path: NodePath): Element { - const uid = path.scope.getBlockParent()["uid"]; - - const scope: Scope = { - filePath: this.filePath, - uid: `${uid - this.scopeIdOffset}`, - }; - - if (path.node.type === "PrivateName") { - // TODO should be done differently maybe - return { - scope: scope, - type: ElementType.Identifier, - value: "#" + path.node.id.name, - }; - } - - switch (path.node.type) { - case "NullLiteral": - return { - scope: scope, - type: ElementType.NullConstant, - value: null, - }; - case "StringLiteral": - case "TemplateLiteral": - return { - scope: scope, - type: ElementType.StringConstant, - value: path.getSource(), - }; - case "NumericLiteral": - return { - scope: scope, - type: ElementType.NumericalConstant, - value: `${path.node.value}`, - }; - case "BooleanLiteral": - return { - scope: scope, - type: ElementType.BooleanConstant, - value: `${path.node.value}`, - }; - case "RegExpLiteral": - return { - scope: scope, - type: ElementType.RegexConstant, - value: path.node.pattern, - }; - case "Super": - return { - scope: scope, - type: ElementType.Identifier, - value: "super", - }; - } - - if (path.node.type === "Identifier") { - if (path.node.name === "undefined") { - return { - scope: scope, - type: ElementType.UndefinedConstant, - value: path.node.name, - }; - } - return { - scope: this._getScope(path), - type: ElementType.Identifier, - value: path.node.name, - }; - } else if (path.node.type === "ThisExpression") { - // TODO should be done differently maybe - return { - scope: this._getScope(path), - type: ElementType.Identifier, - value: "this", - }; - } else if (path.node.type === "MemberExpression") { - return { - scope: this._getScope(path), - type: ElementType.Relation, - value: `%-${this.filePath}-${path.node.start}-${path.node.end}`, - }; - } - - // all relation stuff - if ( - path.node.type === "UnaryExpression" || - path.node.type === "UpdateExpression" || - path.node.type === "CallExpression" || - path.node.type === "BinaryExpression" || - path.node.type === "LogicalExpression" || - path.node.type === "ConditionalExpression" || - path.node.type === "ArrowFunctionExpression" || - path.node.type === "FunctionExpression" || - path.node.type === "ClassExpression" || - path.node.type === "SpreadElement" || - path.node.type === "NewExpression" || - path.node.type === "SequenceExpression" || - path.node.type === "ObjectPattern" || - path.node.type === "RestElement" || - path.node.type === "ArrayExpression" || - path.node.type === "ObjectExpression" || - path.node.type === "AwaitExpression" || - path.node.type === "ObjectProperty" || - path.node.type === "ObjectMethod" || - path.node.type === "AssignmentExpression" || - path.node.type === "AssignmentPattern" || - path.node.type === "ArrayPattern" || - path.node.type === "MetaProperty" - ) { - // TODO should be default - return { - scope: scope, - type: ElementType.Relation, - value: `%-${this.filePath}-${path.node.start}-${path.node.end}`, - }; - } - throw new Error( - `Cannot get element: "${path.node["name"]}" -> ${path.node.type}\n${this.filePath}` - ); - } -} diff --git a/libraries/ast-javascript/lib/Element.ts b/libraries/ast-javascript/lib/Element.ts deleted file mode 100644 index 9a7ae2eb2..000000000 --- a/libraries/ast-javascript/lib/Element.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Scope } from "./Scope"; - -export interface Element { - scope: Scope; - type: ElementType; - value: string; -} - -// eslint-disable-next-line -export function isInstanceOfElement(object: any): object is Element { - return "scope" in object && "type" in object && "value" in object; -} - -export enum ElementType { - StringConstant = "stringConstant", - NumericalConstant = "numericalConstant", - BooleanConstant = "booleanConstant", - NullConstant = "nullConstant", - UndefinedConstant = "undefinedConstant", - RegexConstant = "regexConstant", - Identifier = "identifier", - Relation = "relation", -} - -export function getElementId(element: Element): string { - if (!element.scope) { - return `scope=null,type=${element.type},value=${element.value}`; - } - return `scope=(id=${element.scope.uid},filePath=${element.scope.filePath}),type=${element.type},value=${element.value}`; -} diff --git a/libraries/ast-javascript/tsconfig.json b/libraries/ast-javascript/tsconfig.json deleted file mode 100644 index 09f54c559..000000000 --- a/libraries/ast-javascript/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "../../tsconfig-base.json", - "files": [], - "include": [], - "references": [{ "path": "lib/" }] -} diff --git a/libraries/cfg-javascript/LICENSE.header.ts b/libraries/ast-visitor-javascript/LICENSE.header.ts similarity index 100% rename from libraries/cfg-javascript/LICENSE.header.ts rename to libraries/ast-visitor-javascript/LICENSE.header.ts diff --git a/libraries/cfg-javascript/NOTICE b/libraries/ast-visitor-javascript/NOTICE similarity index 100% rename from libraries/cfg-javascript/NOTICE rename to libraries/ast-visitor-javascript/NOTICE diff --git a/libraries/ast-javascript/README.md b/libraries/ast-visitor-javascript/README.md similarity index 100% rename from libraries/ast-javascript/README.md rename to libraries/ast-visitor-javascript/README.md diff --git a/libraries/javascript/lib/index.ts b/libraries/ast-visitor-javascript/index.ts similarity index 93% rename from libraries/javascript/lib/index.ts rename to libraries/ast-visitor-javascript/index.ts index 34dcb6c9c..8aded874c 100644 --- a/libraries/javascript/lib/index.ts +++ b/libraries/ast-visitor-javascript/index.ts @@ -16,4 +16,4 @@ * limitations under the License. */ -export * from "./JavaScriptLauncher"; +export * from "./lib/AbstractSyntaxTreeVisitor"; diff --git a/libraries/ast-visitor-javascript/lib/AbstractSyntaxTreeVisitor.ts b/libraries/ast-visitor-javascript/lib/AbstractSyntaxTreeVisitor.ts new file mode 100644 index 000000000..bc4ad46f3 --- /dev/null +++ b/libraries/ast-visitor-javascript/lib/AbstractSyntaxTreeVisitor.ts @@ -0,0 +1,365 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { NodePath } from "@babel/core"; +import { Scope as BabelScope, TraverseOptions } from "@babel/traverse"; +import * as t from "@babel/types"; + +import { getLogger, Logger } from "@syntest/logging"; +import * as globals from "globals"; + +const flatGlobals = new Set( + Object.values(globals).flatMap((value) => Object.keys(value)) +); +const reservedKeywords = new Set([ + "abstract", + "arguments", + "await*", + "boolean", + "break", + "byte", + "case", + "catch", + "char", + "class*", + "const", + "continue", + "debugger", + "default", + "delete", + "do", + "double", + "else", + "enum*", + "eval", + "export*", + "extends*", + "false", + "final", + "finally", + "float", + "for", + "function", + "goto", + "if", + "implements", + "import*", + "in", + "instanceof", + "int", + "interface", + "let*", + "long", + "native", + "new", + "null", + "package", + "private", + "protected", + "public", + "return", + "short", + "static", + "super*", + "switch", + "synchronized", + "this", + "throw", + "throws", + "transient", + "true", + "try", + "typeof", + "var", + "void", + "volatile", + "while", + "with", + "yield", +]); +export class AbstractSyntaxTreeVisitor implements TraverseOptions { + protected static LOGGER: Logger; + + protected _filePath: string; + + protected _scopeIdOffset: number; + + protected _thisScopes: Set = new Set([ + "ClassDeclaration", + "FunctionDeclaration", + ]); + protected _thisScopeStack: number[] = []; + protected _thisScopeStackNames: string[] = []; + + get filePath() { + return this._filePath; + } + + get scopeIdOffset() { + return this._scopeIdOffset; + } + + constructor(filePath: string) { + this._filePath = filePath; + AbstractSyntaxTreeVisitor.LOGGER = getLogger("AbstractSyntaxTreeVisitor"); + } + + protected _getUidFromScope(scope: BabelScope): number { + return (<{ uid: number }>(scope))["uid"]; + } + + public _getNodeId(path: NodePath): string { + if (path.node.loc === undefined) { + throw new Error( + `Node ${path.type} in file '${this._filePath}' does not have a location` + ); + } + + const startLine = (<{ line: number }>(path.node.loc.start)).line; + const startColumn = (<{ column: number }>(path.node.loc.start)) + .column; + const startIndex = (<{ index: number }>(path.node.loc.start)) + .index; + const endLine = (<{ line: number }>(path.node.loc.end)).line; + const endColumn = (<{ column: number }>(path.node.loc.end)).column; + const endIndex = (<{ index: number }>(path.node.loc.end)).index; + + return `${this._filePath}:${startLine}:${startColumn}:::${endLine}:${endColumn}:::${startIndex}:${endIndex}`; + } + + public _getBindingId(path: NodePath): string { + if ( + path.parentPath.isLabeledStatement() && + path.parentPath.get("label") === path + ) { + /** + * e.g. + * foo: + * while (true) { + * a = 2 + * continue foo + * } + */ + // not supported + AbstractSyntaxTreeVisitor.LOGGER.info(`Unsupported labeled statement`); + throw new Error("Cannot get binding for labeled statement"); + } + + if ( + path.parentPath.isMemberExpression() && + path.parentPath.get("property") === path + ) { + // we are the property of a member expression + // so the binding id is equal to the object of the member expression relation + the id of the property + // e.g. bar.foo + return ( + this._getBindingId(path.parentPath.get("object")) + + " " + + this._getNodeId(path) + ); + } + + if ( + path.parentPath.isClassMethod() && + path.parentPath.get("key") === path + ) { + // we are the key of a class method + // so this is the first definition of foo + // e.g. class Foo { foo() {} } + return this._getNodeId(path); + } + + if ( + (path.parentPath.isObjectProperty() || + path.parentPath.isObjectMethod()) && + path.parentPath.get("key") === path + ) { + // we are the key of an object property/method + // so this is the first definition of foo + // e.g. { foo: bar } + return this._getNodeId(path); + } + + if ( + path.parentPath.isImportSpecifier() && + path.parentPath.node.local.name !== + ("name" in path.parentPath.node.imported + ? path.parentPath.node.imported.name + : path.parentPath.node.imported.value) + ) { + // we import and rename + // so this is the first definition of foo + // e.g. import { foo as bar } from "./bar" + return this._getNodeId(path); + } + + if ( + path.parentPath.isExportSpecifier() && + path.parentPath.parentPath.has("source") + ) { + // we export from source + // so this is the first definition of foo + // e.g. export { foo } from "./bar" + return this._getNodeId(path); + } + + if (!path.isIdentifier()) { + // non identifier so we get the relation id + return this._getNodeId(path); + } + + const binding = path.scope.getBinding(path.node.name); + + if ( + binding === undefined && + (flatGlobals.has(path.node.name) || reservedKeywords.has(path.node.name)) + ) { + return `global::${path.node.name}`; + } else if (binding === undefined) { + throw new Error( + `Cannot find binding for ${path.node.name} at ${this._getNodeId(path)}` + ); + } else { + return this._getNodeId(binding.path); + } + } + + public _getThisParent( + path: NodePath + ): NodePath< + t.FunctionDeclaration | t.FunctionExpression | t.ObjectMethod | t.Class + > { + let parent = path.getFunctionParent(); + + if (parent === undefined || parent === null) { + throw new Error("ThisExpression must be inside a function"); + } + + while (parent.isArrowFunctionExpression()) { + // arrow functions are not thisable + parent = parent.getFunctionParent(); + + if (parent === undefined || parent === null) { + throw new Error("ThisExpression must be inside a function"); + } + } + + if (parent.isClassMethod() || parent.isClassPrivateMethod()) { + const classParent = path.findParent((p) => p.isClass()); + if (classParent === undefined || classParent === null) { + throw new Error("ThisExpression must be inside a class"); + } + return >classParent; + } + + if ( + parent.isFunctionDeclaration() || + parent.isFunctionExpression() || + parent.isObjectMethod() + ) { + return parent; + } + + throw new Error("ThisExpression must be inside a function"); + } + + enter = (path: NodePath) => { + AbstractSyntaxTreeVisitor.LOGGER.silly( + `Visiting node ${path.type} in file '${this._filePath}': location: ${path.node.loc?.start.line}:${path.node.loc?.start.column} - ${path.node.loc?.end.line}:${path.node.loc?.end.column} - type: ${path.node.type}` + ); + }; + + exit = (path: NodePath) => { + AbstractSyntaxTreeVisitor.LOGGER.silly( + `Exiting node ${path.type} in file '${this._filePath}': location: ${path.node.loc?.start.line}:${path.node.loc?.start.column} - ${path.node.loc?.end.line}:${path.node.loc?.end.column} - type: ${path.node.type}` + ); + }; + + public Program: (path: NodePath) => void = (path) => { + if (this._scopeIdOffset === undefined) { + this._scopeIdOffset = this._getUidFromScope(path.scope); + this._thisScopeStack.push(this._getUidFromScope(path.scope)); + this._thisScopeStackNames.push("global"); + } + }; + + Scopable = { + enter: (path: NodePath) => { + if (!this._thisScopes.has(path.node.type)) { + return; + } + + if (!("id" in path.node)) { + return; + } + + let id = "anonymous"; + + if (path.node.id !== null) { + id = path.node.id.name; + } + + const uid = this._getUidFromScope(path.scope); + this._thisScopeStack.push(uid); + this._thisScopeStackNames.push(id); + }, + exit: (path: NodePath) => { + if (!this._thisScopes.has(path.node.type)) { + return; + } + + this._thisScopeStack.pop(); + this._thisScopeStackNames.pop(); + }, + }; + + protected _getCurrentThisScopeId() { + if (this._thisScopeStack.length === 0) { + throw new Error("Invalid scope stack!"); + } + + return this._thisScopeStack[this._thisScopeStack.length - 1]; + } + + // protected _getCurrentThisScopeName() { + // if (this._thisScopeStackNames.length === 0) { + // throw new Error("Invalid scope stack!"); + // } + + // return this._thisScopeStackNames[this._thisScopeStackNames.length - 1]; + // } + + protected _getNameFromNode(node: t.Node): string { + if (node.type === "Identifier") { + return node.name; + } + + if ("name" in node) { + if (typeof node.name === "string") { + return node.name; + } else if (node.name.type === "JSXMemberExpression") { + return "anon"; + } else if (node.name.type === "JSXNamespacedName") { + return node.name.name.name; + } else { + return node.name.name; + } + } + + return "anon"; + } +} diff --git a/libraries/ast-javascript/package.json b/libraries/ast-visitor-javascript/package.json similarity index 84% rename from libraries/ast-javascript/package.json rename to libraries/ast-visitor-javascript/package.json index c3f6adf0c..f95330bc0 100644 --- a/libraries/ast-javascript/package.json +++ b/libraries/ast-visitor-javascript/package.json @@ -1,5 +1,5 @@ { - "name": "@syntest/ast-javascript", + "name": "@syntest/ast-visitor-javascript", "version": "0.1.0-beta.3", "description": "SynTest AST JavaScript is a library for visiting Abstract Syntax Trees for the JavaScript language", "keywords": [ @@ -19,8 +19,12 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ - "/dist", - "/NOTICE", + "dist/lib", + "dist/index.d.ts", + "dist/index.d.ts.map", + "dist/index.js", + "dist/index.js.map", + "NOTICE", "README.md" ], "repository": { @@ -42,15 +46,18 @@ "test:watch": "mocha --config ../../.mocharc.json --watch" }, "dependencies": { - "@babel/core": "7.20.12" - }, - "devDependencies": { - "@types/babel__core": "7.20.0" + "@babel/core": "7.20.12", + "@babel/traverse": "7.20.12", + "@syntest/logging": "^0.1.0-beta.6", + "globals": "^13.20.0" }, "engines": { "node": ">=10.24.0" }, "publishConfig": { "access": "public" + }, + "devDependencies": { + "@babel/types": "^7.21.5" } } diff --git a/libraries/ast-visitor-javascript/test/example.test.ts b/libraries/ast-visitor-javascript/test/example.test.ts new file mode 100644 index 000000000..b2eb8611e --- /dev/null +++ b/libraries/ast-visitor-javascript/test/example.test.ts @@ -0,0 +1,32 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import * as chai from "chai"; + +import { AbstractSyntaxTreeVisitor } from "../lib/AbstractSyntaxTreeVisitor"; + +const expect = chai.expect; + +/** + * This test is only added such that the github action does not fail. + */ +describe("example test", () => { + it("test", () => { + new AbstractSyntaxTreeVisitor(""); + expect(true); + }); +}); diff --git a/libraries/ast-visitor-javascript/test/helper.test.ts b/libraries/ast-visitor-javascript/test/helper.test.ts new file mode 100644 index 000000000..ddac08ae9 --- /dev/null +++ b/libraries/ast-visitor-javascript/test/helper.test.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { setupLogger } from "@syntest/logging"; + +before(() => { + // Set up the test environment + // ... + setupLogger("", [], "silly"); +}); diff --git a/libraries/instrumentation-javascript/lib/tsconfig.json b/libraries/ast-visitor-javascript/tsconfig.json similarity index 58% rename from libraries/instrumentation-javascript/lib/tsconfig.json rename to libraries/ast-visitor-javascript/tsconfig.json index 4f4603271..97ea4a6a1 100644 --- a/libraries/instrumentation-javascript/lib/tsconfig.json +++ b/libraries/ast-visitor-javascript/tsconfig.json @@ -1,7 +1,7 @@ { - "extends": "../../../tsconfig-base.json", + "extends": "../../tsconfig-base.json", "compilerOptions": { - "outDir": "../dist", + "outDir": "./dist", "rootDir": ".", "composite": true }, diff --git a/libraries/cfg-javascript/lib/ControlFlowGraphGenerator.ts b/libraries/cfg-javascript/lib/ControlFlowGraphGenerator.ts deleted file mode 100644 index db2437f86..000000000 --- a/libraries/cfg-javascript/lib/ControlFlowGraphGenerator.ts +++ /dev/null @@ -1,1349 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - BranchNode, - ControlFlowGraph, - ControlFlowGraphFactory, - Edge, - Node, - NodeType, - Operation, - PlaceholderNode, - RootNode, -} from "@syntest/cfg-core"; -import * as t from "@babel/types"; -import { prng } from "@syntest/core"; - -interface ReturnValue { - childNodes: Node[]; - breakNodes: Node[]; -} - -export class ControlFlowGraphGenerator implements ControlFlowGraphFactory { - private cfg: ControlFlowGraph; - - convertAST(ast: t.Node): ControlFlowGraph { - // TODO the imported stuff should also be resolved... - this.cfg = new ControlFlowGraph(); - - this.visitChild(ast, []); - - // if (!placeholder) { - // this.removePlaceholder(); - // } - - // if (compress) { - // this.compress(); - // } - - return this.cfg; - } - - removePlaceholder(): void { - const removableEdges = []; - const removableNodes = []; - this.cfg.nodes - // Find all placeholder nodes - .filter((n) => n.type === NodeType.Placeholder) - .forEach((placeholderNode) => { - this.cfg.edges - // Find all placeholder nodes that are not end nodes - .filter((edge) => edge.from === placeholderNode.id) - .forEach((outgoingEdge) => { - const targetNode = outgoingEdge.to; - this.cfg.edges - // Find all incoming edges from the current placeholder node - .filter((edge) => edge.to === placeholderNode.id) - // Connect the incoming and outgoing nodes together - .forEach((incomingEdge) => { - incomingEdge.to = targetNode; - }); - - // Only delete the edge from the placeholder node - // There could be other nodes pointing to the target node - removableEdges.push(outgoingEdge); - if (!removableNodes.includes(placeholderNode)) - removableNodes.push(placeholderNode); - }); - }); - - // Delete unneeded placeholder elements - removableEdges.forEach((edge) => { - this.cfg.edges.splice(this.cfg.edges.indexOf(edge), 1); - }); - removableNodes.forEach((node) => { - this.cfg.nodes.splice(this.cfg.nodes.indexOf(node), 1); - }); - } - - compress(): void { - const roots = this.cfg.nodes.filter((n) => n.type === NodeType.Root); - - // create node map for easy lookup - const nodeMap = new Map(); - for (const node of this.cfg.nodes) { - nodeMap[node.id] = node; - } - - // create outgoing edge map for easy lookup - const outEdgeMap = new Map(); - for (const edge of this.cfg.edges) { - if (!outEdgeMap[edge.from]) { - outEdgeMap[edge.from] = []; - } - outEdgeMap[edge.from].push(edge.to); - } - - const discoveredMap = new Map(); - - const removedNodes = []; - // const removedEdges = [] - - let possibleCompression = []; - for (const root of roots) { - const stack: Node[] = [root]; - while (stack.length != 0) { - const currentNode = stack.pop(); - const outGoingEdges = outEdgeMap[currentNode.id] || []; - - if (outGoingEdges.length === 1) { - // exactly one next node so compression might be possible - possibleCompression.push(currentNode); - } else if (outGoingEdges.length !== 1) { - // zero or more than one outgoing edges so the compression ends here - const description = []; - - const incomingEdges: Edge[][] = []; - - for (let i = 0; i < possibleCompression.length - 1; i++) { - const node = possibleCompression[i]; - if (node.root) { - // do not remove root nodes - continue; - } - - removedNodes.push(node); - description.push(node.line); - - incomingEdges.push(this.cfg.edges.filter((e) => e.to === node.id)); - } - - if (possibleCompression.length > 0) { - let nodeId = currentNode.id; - if (outGoingEdges.length === 0) { - // no next nodes so we can also remove the last one - const lastNode = - possibleCompression[possibleCompression.length - 1]; - // unless it is a root node - if (!lastNode.root) { - removedNodes.push(lastNode); - description.push(lastNode.line); - - incomingEdges.push( - this.cfg.edges.filter((e) => e.to === lastNode.id) - ); - } - - // change the current node to be the compressed version of all previous nodes - currentNode.description = description.join(", "); - } else { - // change the current node to be the compressed version of all previous nodes - possibleCompression[possibleCompression.length - 1].description = - description.join(", "); - nodeId = possibleCompression[possibleCompression.length - 1].id; - } - - // change the edges pointing to any of the removed nodes - for (const edges of incomingEdges) { - for (const edge of edges) { - edge.to = nodeId; - } - } - } - - // reset compression - possibleCompression = []; - } - - if (!discoveredMap[currentNode.id]) { - discoveredMap[currentNode.id] = true; - for (const to of outGoingEdges) { - stack.push(nodeMap[to]); - } - } - } - - // reset compressions before going to the next root - possibleCompression = []; - } - - this.cfg.nodes = this.cfg.nodes.filter((n) => !removedNodes.includes(n)); - // remove edges of which the to/from has been removed - this.cfg.edges = this.cfg.edges.filter( - (e) => !removedNodes.find((n) => n.id === e.to || n.id === e.from) - ); - - // TODO also remove unreachable code - } - - private createRootNode( - lines: number[], - statements: string[], - description?: string - ): RootNode { - const node: RootNode = { - id: `f-${lines[0]}-${prng.uniqueId()}`, - lines: lines, - statements: statements, - type: NodeType.Root, - description: description, - }; - - this.cfg.nodes.push(node); - - return node; - } - - /** - * This method creates a new node in the cfg - * @param lines - * @param statements - * @param branch whether this nodes is a branching node (i.e. multiple outgoing edges) - * @param probe - * @param condition if it is a branch node this is the condition to branch on - * @param placeholder - * @private - */ - private createNode(lines: number[], statements: string[]): Node { - const node: Node = { - type: NodeType.Intermediary, - id: `s-${lines[0]}-${prng.uniqueId()}`, - lines: lines, - statements: statements, - }; - - this.cfg.nodes.push(node); - - return node; - } - - private createPlaceholderNode( - lines: number[], - statements: string[] - ): PlaceholderNode { - const node: PlaceholderNode = { - type: NodeType.Placeholder, - id: `s-${lines[0]}-${prng.uniqueId()}`, - lines: lines, - statements: statements, - }; - - this.cfg.nodes.push(node); - - return node; - } - - private createBranchNode( - lines: number[], - statements: string[], - condition: Operation - ): BranchNode { - const node: BranchNode = { - condition: condition, - id: `b-${lines[0]}-${prng.uniqueId()}`, - lines: lines, - statements: statements, - type: NodeType.Branch, - probe: false, - }; - - this.cfg.nodes.push(node); - - return node; - } - - /** - * This method creates edges to connect the given parents to the given children - * @param cfg the cfg to add the edges to - * @param parents the parent nodes - * @param children the child nodes - * @private - */ - private connectParents(parents: Node[], children: Node[]) { - for (const parent of parents) { - for (const child of children) { - this.cfg.edges.push({ - from: parent.id, - to: child.id, - }); - } - } - } - - /** - * This method visit a child node in the ast using the visitor design pattern. - * - * @param child the child ast node - * @param parents the parents of the child - * @private - */ - private visitChild(child: t.Node, parents: Node[]): ReturnValue { - const skipable: string[] = [ - "ImportDeclaration", - "ClassProperty", - "EmptyStatement", - ]; - - if (skipable.includes(child.type)) { - return { - childNodes: parents, - breakNodes: [], - }; - } - - switch (child.type) { - // passthrough - case "File": - return this.visitChild(child.program, parents); - case "ExportDefaultDeclaration": - return this.visitChild(child.declaration, parents); - case "ExportSpecifier": - return this.visitChild(child.local, parents); - case "UnaryExpression": - return this.visitChild(child.argument, parents); - case "ExpressionStatement": - return this.visitChild(child.expression, parents); - - // - case "Program": - return this.visitProgram(child); - case "FunctionDeclaration": - return this.visitFunctionDeclaration(child); - case "CallExpression": - return this.visitCallExpression(child, parents); - case "ExportNamedDeclaration": - return this.visitExportNamedDeclaration(child, parents); - - case "Identifier": - - case "NumericLiteral": - case "BooleanLiteral": - case "StringLiteral": - case "NullLiteral": - case "TemplateLiteral": - case "RegExpLiteral": - - case "SpreadElement": - - case "BinaryExpression": - case "LogicalExpression": - case "MemberExpression": - case "AssignmentExpression": - case "ArrowFunctionExpression": - case "FunctionExpression": - case "ArrayExpression": - case "ThisExpression": - case "ObjectExpression": - case "NewExpression": - case "AwaitExpression": - case "UpdateExpression": - - case "VariableDeclarator": - return this.visitGeneralExpression(child, parents); - - case "VariableDeclaration": - return this.visitVariableDeclaration(child, parents); - - case "ReturnStatement": - return this.visitReturnStatement(child, parents); - case "ThrowStatement": - return this.visitThrowStatement(child, parents); - - case "BlockStatement": - return this.visitBlockStatement(child, parents); - - case "ClassDeclaration": - return this.visitClassDeclaration(child); - case "ClassMethod": - return this.visitClassMethod(child); - - case "IfStatement": - return this.visitIfStatement(child, parents); - case "ConditionalExpression": - return this.visitConditional(child, parents); - - case "TryStatement": - return this.visitTryStatement(child, parents); - - case "CatchClause": - return this.visitCatchClause(child, parents); - - case "WhileStatement": - return this.visitWhileStatement(child, parents); - case "DoWhileStatement": - return this.visitDoWhileStatement(child, parents); - case "ForOfStatement": - return this.visitForOfStatement(child, parents); - case "ForInStatement": - return this.visitForOfStatement(child, parents); - case "ForStatement": - return this.visitForStatement(child, parents); - - case "BreakStatement": - return this.visitBreakStatement(child, parents); - case "ContinueStatement": - return this.visitContinueStatement(child, parents); - - case "SwitchStatement": - return this.visitSwitchStatement(child, parents); - case "SwitchCase": - return this.visitSwitchCase(child, parents); - - // case "SourceUnit": - // return this.SourceUnit(cfg, child); - // case "ContractDefinition": - // return this.ContractDefinition(cfg, child); - // case "ModifierDefinition": - // return this.ModifierDefinition(cfg, child); - // case "FunctionDefinition": - // return this.FunctionDefinition(cfg, child, contractName); - // case "ModifierInvocation": - // return this.ModifierInvocation(cfg, child, parents); - // case "Block": - // return this.Block(cfg, child, parents); - // - // case "IfStatement": - // return this.IfStatement(cfg, child, parents); - - // case "WhileStatement": - // return this.WhileStatement(cfg, child, parents); - - // - // case "VariableDeclarationStatement": - // return this.VariableDeclarationStatement(cfg, child, parents); - // case "ExpressionStatement": - // return this.ExpressionStatement(cfg, child, parents); - // case "FunctionCall": - // return this.FunctionCall(cfg, child, parents); - // case "ReturnStatement": - // return this.ReturnStatement(cfg, child, parents); - // case "BreakStatement": - // return this.BreakStatement(cfg, child, parents); - - default: - throw new Error(`ast type: ${child.type} is not supported currently!`); - } - } - - private visitProgram(ast: t.Program): ReturnValue { - for (const child of ast.body) { - // TODO add more probably - // if (!['FunctionDeclaration', 'ClassDeclaration', 'ExpressionStatement'].includes(child.type)) { - - // if (['ImportDeclaration', 'ClassDeclaration', 'ExpressionStatement'].includes(child.type)) { - // continue - // } - this.visitChild(child, []); - } - - return { - childNodes: [], - breakNodes: [], - }; - } - - private visitFunctionDeclaration(ast: t.FunctionDeclaration): ReturnValue { - if (!ast.loc) { - return { - childNodes: [], - breakNodes: [], - }; - } - const node: RootNode = this.createRootNode( - [ast.loc.start.line], - [], - ast.id.name - ); - - const parents: Node[] = [node]; - - // const totalBreakNodes = []; - // if (ast.modifiers && Properties.modifier_extraction) { - // ast.modifiers.forEach((modifier) => { - // const { childNodes, breakNodes } = this.visitChild( - // cfg, - // modifier, - // parents - // ); - // if (childNodes.length > 0) { - // parents = childNodes; - // } - // totalBreakNodes.push(...breakNodes); - // }); - // } - - // Check if body is block - if (ast.body) { - // TODO: Add child nodes to results - this.visitChild(ast.body, parents); - } - - return { - childNodes: [], - breakNodes: [], - }; - } - - private visitCallExpression( - ast: t.CallExpression, - parents: Node[] - ): ReturnValue { - const node: Node = this.createNode([ast.loc.start.line], []); - this.connectParents(parents, [node]); - let nodes = [node]; - for (const arg of ast.arguments) { - const result = this.visitChild(arg, nodes); - - nodes = result.childNodes; - } - - return { - childNodes: [node], - breakNodes: [], - }; - } - - private visitExportNamedDeclaration( - ast: t.ExportNamedDeclaration, - parents: Node[] - ): ReturnValue { - if (ast.specifiers && ast.specifiers.length) { - let nodes = parents; - for (const specifier of ast.specifiers) { - const result = this.visitChild(specifier, nodes); - - nodes = result.childNodes; - } - - return { - childNodes: nodes, - breakNodes: [], - }; - } else { - return this.visitChild(ast.declaration, parents); - } - } - - private visitGeneralExpression( - ast: t.Expression | t.VariableDeclarator | t.SpreadElement, - parents: Node[] - ): ReturnValue { - if (ast.type === "BinaryExpression" || ast.type === "LogicalExpression") { - const left = this.visitChild(ast.left, parents); - const right = this.visitChild(ast.right, left.childNodes); - - return { - childNodes: [...right.childNodes], - breakNodes: [...left.breakNodes, ...right.breakNodes], - }; - } else if (ast.type === "AssignmentExpression") { - return this.visitChild(ast.right, parents); - } else if (ast.type === "VariableDeclarator") { - if (ast.init) { - return this.visitChild(ast.init, parents); - } - - const node: Node = this.createNode([ast.loc.start.line], []); - this.connectParents(parents, [node]); - - return { - childNodes: [node], - breakNodes: [], - }; - } else if ( - ast.type === "FunctionExpression" || - ast.type === "ArrowFunctionExpression" - ) { - const node: RootNode = this.createRootNode([ast.loc.start.line], []); - this.connectParents(parents, [node]); - - if (ast.body) { - return this.visitChild(ast.body, [node]); - } - - return { - childNodes: [], - breakNodes: [], - }; - } else { - const node: Node = this.createNode([ast.loc.start.line], []); - this.connectParents(parents, [node]); - - return { - childNodes: [node], - breakNodes: [], - }; - } - } - - private visitBlockStatement( - ast: t.BlockStatement, - parents: Node[] - ): ReturnValue { - let nodes = parents; - const totalBreakNodes = []; - for (const child of ast.body) { - const { childNodes, breakNodes } = this.visitChild(child, nodes); - nodes = childNodes; - totalBreakNodes.push(...breakNodes); - } - - return { - childNodes: nodes, - breakNodes: totalBreakNodes, - }; - } - - /** - * This is a terminating node - * @param ast - * @param parents - * @constructor - * @private - */ - private visitReturnStatement( - ast: t.ReturnStatement, - parents: Node[] - ): ReturnValue { - const count = this.cfg.edges.length; - - if (ast.argument) { - this.visitChild(ast.argument, parents); - } - - if (!this.cfg.edges[count]) { - // if no nodes are created we add one - const node: Node = this.createNode([ast.loc.start.line], []); - this.connectParents(parents, [node]); - } - - return { - childNodes: [], - breakNodes: [], - }; - } - - // TODO try catch support - private visitThrowStatement( - ast: t.ThrowStatement, - parents: Node[] - ): ReturnValue { - const node: Node = this.createNode([ast.loc.start.line], []); - this.connectParents(parents, [node]); - - return { - childNodes: [], - breakNodes: [], - }; - } - - private visitClassDeclaration(ast: t.ClassDeclaration): ReturnValue { - const classBody = ast.body; - for (const child of classBody.body) { - this.visitChild(child, []); - } - - return { - childNodes: [], - breakNodes: [], - }; - } - - private visitClassMethod(ast: t.ClassMethod): ReturnValue { - const node: RootNode = this.createRootNode( - [ast.loc.start.line], - [], - ast.key.type === "Identifier" ? ast.key.name : "" - ); - - const parents: Node[] = [node]; - - // Check if body is block - if (ast.body) { - this.visitChild(ast.body, parents); - } - - return { - childNodes: [], - breakNodes: [], - }; - } - - private visitVariableDeclaration( - ast: t.VariableDeclaration, - parents: Node[] - ): ReturnValue { - // const node: Node = this.createNode([ast.loc.start.line], []); - // this.connectParents(parents, [node]); - - let nodes = parents; - const totalBreakNodes = []; - for (const child of ast.declarations) { - const { childNodes, breakNodes } = this.visitChild(child, nodes); - nodes = childNodes; - totalBreakNodes.push(...breakNodes); - } - - return { - childNodes: [...nodes], - breakNodes: totalBreakNodes, - }; - } - - private visitIfStatement(ast: t.IfStatement, parents: Node[]): ReturnValue { - const node: BranchNode = this.createBranchNode([ast.loc.start.line], [], { - type: ast.test.type, - operator: - ast.test.type === "BinaryExpression" || - ast.test.type === "UnaryExpression" - ? ast.test.operator - : "", - }); - - this.connectParents(parents, [node]); - - // Store all break points - const totalBreakNodes = []; - - // Visit true flow - let count = this.cfg.edges.length; - const { childNodes, breakNodes } = this.visitChild(ast.consequent, [node]); - const trueNodes = childNodes; - - totalBreakNodes.push(...breakNodes); - - // Check if a child node was created - if (!this.cfg.edges[count]) { - // Add empty placeholder node - const emptyChildNode = this.createPlaceholderNode( - [ast.consequent.loc.start.line], - [] - ); - this.connectParents([node], [emptyChildNode]); - trueNodes.push(emptyChildNode); - - this.cfg.edges[count].branchType = true; - - // this.cfg.edges.push({ - // from: node.id, - // to: emptyChildNode.id, - // branchType: true, - // }); - } - // Add edge identifierDescription to first added edge - this.cfg.edges[count].branchType = true; - - // Visit false flow - if (ast.alternate) { - count = this.cfg.edges.length; - const { childNodes, breakNodes } = this.visitChild(ast.alternate, [node]); - const falseNodes = childNodes; - totalBreakNodes.push(...breakNodes); - - // Check if a child node was created - if (this.cfg.edges[count]) { - // Add edge identifierDescription to first added edge - this.cfg.edges[count].branchType = false; - } else { - // Add empty placeholder node - const emptyChildNode = this.createPlaceholderNode( - [ast.alternate.loc.start.line], - [] - ); - falseNodes.push(emptyChildNode); - - this.cfg.edges.push({ - from: node.id, - to: emptyChildNode.id, - branchType: false, - }); - } - - return { - childNodes: [...trueNodes, ...falseNodes], - breakNodes: totalBreakNodes, - }; - } else { - // Add empty placeholder node - const falseNode: Node = this.createPlaceholderNode( - [ast.loc.end.line], - [] - ); - - this.cfg.edges.push({ - from: node.id, - to: falseNode.id, - branchType: false, - }); - - return { - childNodes: [...trueNodes, falseNode], - breakNodes: totalBreakNodes, - }; - } - } - - private visitConditional(ast: t.Conditional, parents: Node[]): ReturnValue { - const node: BranchNode = this.createBranchNode([ast.loc.start.line], [], { - type: ast.test.type, - operator: - ast.test.type === "BinaryExpression" || - ast.test.type === "UnaryExpression" - ? ast.test.operator - : "", - }); - this.connectParents(parents, [node]); - - // Store all break points - const totalBreakNodes = []; - - // Visit true flow - let count = this.cfg.edges.length; - const { childNodes, breakNodes } = this.visitChild(ast.consequent, [node]); - const trueNodes = childNodes; - totalBreakNodes.push(...breakNodes); - - // Check if a child node was created - if (this.cfg.edges[count]) { - // Add edge type to first added edge - this.cfg.edges[count].branchType = true; - } else { - // Add empty placeholder node - const emptyChildNode = this.createPlaceholderNode( - [ast.consequent.loc.start.line], - [] - ); - trueNodes.push(emptyChildNode); - - this.cfg.edges.push({ - from: node.id, - to: emptyChildNode.id, - branchType: true, - }); - } - - // Visit false flow - if (ast.alternate) { - count = this.cfg.edges.length; - const { childNodes, breakNodes } = this.visitChild(ast.alternate, [node]); - const falseNodes = childNodes; - totalBreakNodes.push(...breakNodes); - - // Check if a child node was created - if (this.cfg.edges[count]) { - // Add edge type to first added edge - this.cfg.edges[count].branchType = false; - } else { - // Add empty placeholder node - const emptyChildNode = this.createPlaceholderNode( - [ast.alternate.loc.start.line], - [] - ); - falseNodes.push(emptyChildNode); - - this.cfg.edges.push({ - from: node.id, - to: emptyChildNode.id, - branchType: false, - }); - } - - return { - childNodes: [...trueNodes, ...falseNodes], - breakNodes: totalBreakNodes, - }; - } else { - // Add empty placeholder node - const falseNode = this.createPlaceholderNode([ast.loc.end.line], []); - - this.cfg.edges.push({ - from: node.id, - to: falseNode.id, - branchType: false, - }); - - return { - childNodes: [...trueNodes, falseNode], - breakNodes: totalBreakNodes, - }; - } - } - - private visitTryStatement(ast: t.TryStatement, parents: Node[]): ReturnValue { - // TODO finalizer try -> catch -> finally - const node: BranchNode = this.createBranchNode([ast.loc.start.line], [], { - type: ast.type, - operator: "exception", - }); - - this.connectParents(parents, [node]); - - // Store all break points - const totalBreakNodes = []; - - // Visit try flow - let count = this.cfg.edges.length; - const tryNodes = this.visitChild(ast.block, [node]); - const tryChildNodes = tryNodes.childNodes; - totalBreakNodes.push(...tryNodes.breakNodes); - - // Check if a child node was created - if (this.cfg.edges[count]) { - // Add edge identifierDescription to first added edge - this.cfg.edges[count].branchType = true; - } else { - // Add empty placeholder node - const emptyChildNode = this.createPlaceholderNode( - [ast.block.loc.start.line], - [] - ); - tryChildNodes.push(emptyChildNode); - - this.cfg.edges.push({ - from: node.id, - to: emptyChildNode.id, - branchType: true, - }); - } - - // Visit catch flow - count = this.cfg.edges.length; - const catchNodes = this.visitChild(ast.handler, [node]); - const catchChildNodes = catchNodes.childNodes; - totalBreakNodes.push(...catchNodes.breakNodes); - - // Check if a child node was created - if (this.cfg.edges[count]) { - // Add edge identifierDescription to first added edge - this.cfg.edges[count].branchType = false; - } else { - // Add empty placeholder node - const emptyChildNode = this.createPlaceholderNode( - [ast.handler.loc.start.line], - [] - ); - catchChildNodes.push(emptyChildNode); - - this.cfg.edges.push({ - from: node.id, - to: emptyChildNode.id, - branchType: false, - }); - } - - return { - childNodes: [...tryChildNodes, ...catchChildNodes], - breakNodes: totalBreakNodes, - }; - } - - private visitCatchClause(ast: t.CatchClause, parents: Node[]): ReturnValue { - const node: Node = this.createNode([ast.loc.start.line], []); - this.connectParents(parents, [node]); - - return { - childNodes: [node], - breakNodes: [], - }; - } - - private visitWhileStatement( - ast: t.WhileStatement, - parents: Node[] - ): ReturnValue { - const node: Node = this.createBranchNode([ast.loc.start.line], [], { - type: ast.test.type, - operator: - ast.test.type === "BinaryExpression" || - ast.test.type === "UnaryExpression" - ? ast.test.operator - : "", - }); - this.connectParents(parents, [node]); - - const count = this.cfg.edges.length; - const { childNodes, breakNodes } = this.visitChild(ast.body, [node]); - const trueNodes = childNodes; - - // Check if a child node was created - if (this.cfg.edges[count]) { - // Add edge identifierDescription to first added edge - this.cfg.edges[count].branchType = true; - } else { - // Add empty placeholder node - const emptyChildNode = this.createPlaceholderNode( - [ast.loc.start.line], - [] - ); - trueNodes.push(emptyChildNode); - - this.cfg.edges.push({ - from: node.id, - to: emptyChildNode.id, - branchType: true, - }); - } - - // Add empty placeholder node for the false flow - const falseNode = this.createPlaceholderNode([ast.loc.end.line], []); - this.cfg.edges.push({ - from: node.id, - to: falseNode.id, - branchType: false, - }); - - // Connect break points - for (const breakNode of breakNodes) { - this.cfg.edges.push({ - from: breakNode.id, - to: falseNode.id, - }); - } - - // Connect loop - this.connectParents(trueNodes, [node]); - - return { - childNodes: [falseNode], - breakNodes: [], - }; - } - - private visitForOfStatement( - ast: t.ForOfStatement | t.ForInStatement, - parents: Node[] - ): ReturnValue { - const node: Node = this.createBranchNode([ast.loc.start.line], [], { - type: "CallExpression", - operator: "isEmpty", - }); - this.connectParents(parents, [node]); - - const count = this.cfg.edges.length; - const { childNodes, breakNodes } = this.visitChild(ast.body, [node]); - const loopNodes = childNodes; - - // Check if a child node was created - if (this.cfg.edges[count]) { - // Add edge identifierDescription to first added edge - this.cfg.edges[count].branchType = true; - } else { - // Add empty placeholder node - const emptyChildNode = this.createPlaceholderNode( - [ast.loc.start.line], - [] - ); - loopNodes.push(emptyChildNode); - - this.cfg.edges.push({ - from: node.id, - to: emptyChildNode.id, - branchType: true, - }); - } - - // Add empty placeholder node for the false flow - const falseNode = this.createPlaceholderNode([ast.loc.end.line], []); - this.cfg.edges.push({ - from: node.id, - to: falseNode.id, - branchType: false, - }); - - // Connect break points - for (const breakNode of breakNodes) { - this.cfg.edges.push({ - from: breakNode.id, - to: falseNode.id, - }); - } - - // Connect loop - this.connectParents(loopNodes, [node]); - - return { - childNodes: [falseNode], - breakNodes: [], - }; - } - - /** - * This is a break statement - * @param ast - * @param parents - * @constructor - * @private - */ - private visitBreakStatement( - ast: t.BreakStatement, - parents: Node[] - ): ReturnValue { - const node: Node = this.createNode([ast.loc.start.line], []); - this.connectParents(parents, [node]); - - return { - childNodes: [], - breakNodes: [node], - }; - } - - // TODO currently incorrect is passthrough now - private visitContinueStatement( - ast: t.ContinueStatement, - parents: Node[] - ): ReturnValue { - const node: Node = this.createNode([ast.loc.start.line], []); - this.connectParents(parents, [node]); - - return { - childNodes: [], - breakNodes: [], - }; - } - - private visitDoWhileStatement( - ast: t.DoWhileStatement, - parents: Node[] - ): ReturnValue { - // entry node - const entryNode: Node = this.createBranchNode([ast.loc.start.line], [], { - type: ast.test.type, - operator: - ast.test.type === "BinaryExpression" || - ast.test.type === "UnaryExpression" - ? ast.test.operator - : "", - }); - this.connectParents(parents, [entryNode]); - - // TODO: We can check if a node is generated. This eliminates the need for entryNode - // 'do' block - const { childNodes, breakNodes } = this.visitChild(ast.body, [entryNode]); - const trueNodes = childNodes; - - // while check - const whileNode: Node = this.createBranchNode([ast.loc.start.line], [], { - type: ast.test.type, - operator: - ast.test.type === "BinaryExpression" || - ast.test.type === "UnaryExpression" - ? ast.test.operator - : "", - }); - this.connectParents(trueNodes, [whileNode]); - - // Connect back to the entry node and mark as true branch - this.cfg.edges.push({ - from: whileNode.id, - to: entryNode.id, - branchType: true, - }); - - // Add empty placeholder node for the false flow - const falseNode: Node = this.createPlaceholderNode([ast.loc.end.line], []); - this.cfg.edges.push({ - from: whileNode.id, - to: falseNode.id, - branchType: false, - }); - - // Connect break points - for (const breakNode of breakNodes) { - this.cfg.edges.push({ - from: breakNode.id, - to: falseNode.id, - }); - } - - return { - childNodes: [falseNode], - breakNodes: [], - }; - } - - private visitSwitchStatement( - ast: t.SwitchStatement, - parents: Node[] - ): ReturnValue { - // TODO currently incorrect - const node: Node = this.createBranchNode([ast.loc.start.line], [], { - type: "Switch", - operator: "==", - }); - this.connectParents(parents, [node]); - - // Add empty placeholder node for the false flow - const falseNode = this.createPlaceholderNode([ast.loc.end.line], []); - - let nodes = [node]; - for (const switchCase of ast.cases) { - const { childNodes, breakNodes } = this.visitChild(switchCase, nodes); - nodes = childNodes; - - // Connect break points - for (const breakNode of breakNodes) { - this.cfg.edges.push({ - from: breakNode.id, - to: falseNode.id, - }); - } - } - - for (const breakNode of nodes) { - this.cfg.edges.push({ - from: breakNode.id, - to: falseNode.id, - }); - } - - return { - childNodes: nodes, - breakNodes: [], - }; - } - - private visitSwitchCase(ast: t.SwitchCase, parents: Node[]): ReturnValue { - const node: Node = this.createBranchNode([ast.loc.start.line], [], { - type: "switchCase", - operator: "==", - }); - this.connectParents(parents, [node]); - - const count = this.cfg.edges.length; - - let nodes = [node]; - const totalBreakNodes = []; - for (const child of ast.consequent) { - const { childNodes, breakNodes } = this.visitChild(child, nodes); - nodes = childNodes; - totalBreakNodes.push(...breakNodes); - } - - const trueNodes = nodes; - const childNodes = []; - - // Check if a child node was created - if (this.cfg.edges[count]) { - // Add edge identifierDescription to first added edge - this.cfg.edges[count].branchType = true; - } else { - // Add empty placeholder node - const emptyChildNode = this.createPlaceholderNode( - [ast.loc.start.line], - [] - ); - trueNodes.push(emptyChildNode); - - this.cfg.edges.push({ - from: node.id, - to: emptyChildNode.id, - branchType: true, - }); - - childNodes.push(emptyChildNode); - } - - // Add empty placeholder node for the false flow - const falseNode = this.createPlaceholderNode([ast.loc.start.line], []); - this.cfg.edges.push({ - from: node.id, - to: falseNode.id, - branchType: false, - }); - - return { - childNodes: [...childNodes, falseNode], - breakNodes: totalBreakNodes, - }; - } - - private visitForStatement(ast: t.ForStatement, parents: Node[]): ReturnValue { - const node: Node = this.createBranchNode([ast.loc.start.line], [], { - type: ast.test.type, - operator: - ast.test.type === "BinaryExpression" || - ast.test.type === "UnaryExpression" - ? ast.test.operator - : "", - }); - this.connectParents(parents, [node]); - // TODO For each probably not supported - - // TODO init expression - // TODO condition expression - // TODO loopExpression - - const count = this.cfg.edges.length; - const { childNodes, breakNodes } = this.visitChild(ast.body, [node]); - const trueNodes = childNodes; - - // Check if a child node was created - if (this.cfg.edges[count]) { - // Add edge identifierDescription to first added edge - this.cfg.edges[count].branchType = true; - } else { - // Add empty placeholder node - const emptyChildNode = this.createPlaceholderNode( - [ast.loc.start.line], - [] - ); - trueNodes.push(emptyChildNode); - - this.cfg.edges.push({ - from: node.id, - to: emptyChildNode.id, - branchType: true, - }); - } - - // Add empty placeholder node for the false flow - const falseNode = this.createPlaceholderNode([ast.loc.end.line], []); - this.cfg.edges.push({ - from: node.id, - to: falseNode.id, - branchType: false, - }); - - // Connect break points - for (const breakNode of breakNodes) { - this.cfg.edges.push({ - from: breakNode.id, - to: falseNode.id, - }); - } - - // Connect loop - this.connectParents(trueNodes, [node]); - - return { - childNodes: [falseNode], - breakNodes: [], - }; - } -} diff --git a/libraries/cfg-javascript/lib/ControlFlowGraphVisitor.ts b/libraries/cfg-javascript/lib/ControlFlowGraphVisitor.ts deleted file mode 100644 index e002c3ca8..000000000 --- a/libraries/cfg-javascript/lib/ControlFlowGraphVisitor.ts +++ /dev/null @@ -1,490 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - BranchNode, - ControlFlowGraph, - Node, - NodeType, - Operation, - PlaceholderNode, - RootNode, -} from "@syntest/cfg-core"; - -export class ControlFlowGraphVisitor { - private _cfg: ControlFlowGraph; - - // private _nodeStack: Node[][] - // - // private _level = -1 - - private _lastVisitedNode: Node; - - private _trackingLeaves: Node[]; - private _firstExit: boolean; - private _connectToNext: boolean; - - private _nodeStack: Node[]; - - constructor() { - this._cfg = new ControlFlowGraph(); - - this._trackingLeaves = []; - this._firstExit = true; - this._connectToNext = false; - this._nodeStack = []; - } - - private _ignore = new Set([ - "Program", - "BooleanLiteral", - // 'BlockStatement', - // 'VariableDeclaration', - "VariableDeclarator", - "Identifier", - "NumericLiteral", - - "BinaryExpression", - "UpdateExpression", - "NumericLiteral", - - // 'BlockStatement' - ]); - - enter = (path) => { - if (this._ignore.has(path.node.type)) { - // console.log('ignore', path.node.type) - return; - } - console.log("enter", path.node.type); - - const node: Node = this._getNode(path); - - let isConnected = false; - - if (this._connectToNext) { - // connect tracking leaves to new child - this._connectParents(this._trackingLeaves, [node]); - // empty tracking leaves - this._trackingLeaves.length = 0; - isConnected = true; - } - - const parentPath = path.parentPath; - - if (!isConnected && parentPath) { - if ( - [ - "IfStatement", - "WhileStatement", - "ForStatement", - "SwitchStatement", - ].includes(parentPath.node.type) - ) { - // connect to parent branch node - const parent: Node = this._nodeStack[this._nodeStack.length - 1]; - - this._connectParents([parent], [node]); - isConnected = true; - } else if ( - parentPath.node.type === "BlockStatement" && - parentPath.get("body.0") === path - ) { - // if it is the first in the block statement we should connect it to the blockstatement node - const parent: Node = this._nodeStack[this._nodeStack.length - 1]; - - this._connectParents([parent], [node]); - isConnected = true; - } - } - - if (!isConnected && this._lastVisitedNode) { - // connect to last visited node - this._connectParents([this._lastVisitedNode], [node]); - isConnected = true; - } - - // reset first exit - this._firstExit = true; - this._nodeStack.push(node); - }; - - exit = (path) => { - if (this._ignore.has(path.node.type)) { - return; - } - console.log("exit", path.node.type); - - const node = this._nodeStack.pop(); - // deepest point - if (this._firstExit) { - // TODO check if return/break/continue - - const parentPath = path.parentPath; - // should only be added if there is no next node in the block statement - if ( - parentPath.node.type === "BlockStatement" && - !( - parentPath.get("body." + (parentPath.get("body").length - 1)) === path - ) - ) { - // pass - } else { - this._trackingLeaves.push(node); - } - } - - if (path.node.type === "IfStatement") { - this._connectToNext = true; - - if (!path.has("alternate")) { - // false node missing - const falseNode: Node = this._createPlaceholderNode( - [path.node.loc.end.line], - [] - ); - - this._trackingLeaves.push(falseNode); - - this._connectParents([node], [falseNode]); - } - } else if ( - path.node.type === "WhileStatement" || - path.node.type === "ForStatement" - ) { - this._connectToNext = true; - - // false node missing - const falseNode: Node = this._createPlaceholderNode( - [path.node.loc.end.line], - [] - ); - - // TODO intercept continue nodes - - // connect trackingleaves to while node - this._connectParents(this._trackingLeaves, [node]); - - this._trackingLeaves = [falseNode]; - - this._connectParents([node], [falseNode]); - } - - this._lastVisitedNode = node; - this._firstExit = false; - }; - - // enter = (path) => { - // if (this._ignore.has(path.node.type)) { - // // console.log('ignore', path.node.type) - // return - // } - // - // const node: Node = this._getNode(path) - // - // const parentPath = path.parentPath - // - // if (!parentPath) { - // // nothing - // } else if (parentPath.node.type === 'IfStatement') { - // // connect to parent branch node - // const parent: Node = this._parentStack[this._parentStack.length - 1] - // - // this._connectParents([parent], [node]) - // - // } else if (this._lastVisitedNode) { - // // connect to last visited node - // this._connectParents([this._lastVisitedNode], [node]) - // } - // - // console.log('enter', path.node.type) - // this._parentStack.push(node) - // this._lastVisitedNode = node - // } - // exit = (path) => { - // if (this._ignore.has(path.node.type)) { - // return - // } - // - // console.log('exit', path.node.type) - // const node = this._parentStack.pop() - // - // if (path.node.type === 'IfStatement') { - // if (!path.has('alternate')) { - // // false node missing - // const falseNode: Node = this._createPlaceholderNode( - // [path.node.loc.end.line], - // [] - // ); - // - // this._connectParents( - // [node], - // [falseNode] - // ) - // } - // } - // - // - // } - - _getNode(path): Node { - if ( - ["IfStatement", "WhileStatement", "ForStatement"].includes(path.node.type) - ) { - return this._createBranchNode([path.node.loc.start.line], [], { - type: path.node.test.type, - operator: path.get("test").getSource(), - }); - } else if (path.node.type === "SwitchStatement") { - return this._createBranchNode([path.node.loc.start.line], [], { - type: "Switch", - operator: "==", - }); - } - - // TODO - - return this._createNode([path.node.loc.start.line], []); - } - - // enter = (path) => { - // if (!(path.node.type in this)) { - // console.log('skip', path.node.type, this._level) - // - // return - // } - // if (this._ignore.has(path.node.type)) { - // console.log('ignore', path.node.type, this._level) - // - // return - // } - // - // this._level += 1 - // console.log('enter', path.node.type, this._level) - // - // // check if exists? - // if (this._nodeStack[this._level]) { - // return - // } - // this._nodeStack.push([]) - // } - // - // exit = (path) => { - // if (!(path.node.type in this)) { - // return - // } - // if (this._ignore.has(path.node.type)) { - // return - // } - // console.log('exit', path.node.type, this._level) - // - // const parents = this._nodeStack[this._level] - // const children = this._nodeStack[this._level + 1] - // this._connectParents(parents, children) - // - // this._level -= 1 - // } - // - // FunctionDeclaration = { - // enter: (path) => { - // const node: RootNode = this._createRootNode( - // [path.node.loc.start.line], - // [], - // path.node.id.name - // ); - // this._nodeStack[this._level].push(node) - // - // }, - // exit: (path) => { - // - // } - // } - // - // BlockStatement = { - // enter: (path) => { - // const blockNode: Node = this._createPlaceholderNode( - // [path.node.loc.start.line], - // [] - // ); - // this._nodeStack[this._level].push(blockNode) - // - // }, - // exit: (path) => { - // - // } - // } - // - // IfStatement = { - // enter: (path) => { - // const node: BranchNode = this._createBranchNode( - // [path.node.loc.start.line], - // [], - // { - // type: path.node.test.type, - // operator: path.node.test.operator, - // } - // ); - // - // this._nodeStack[this._level].push(node) - // }, - // exit: (path) => { - // const parents = this._nodeStack[this._level + 1] - // const children = this._nodeStack[this._level + 2] - // - // if (children.length === 1) { - // // false node missing - // const falseNode: Node = this._createPlaceholderNode( - // [path.node.loc.end.line], - // [] - // ); - // - // this._connectParents( - // parents, - // [falseNode] - // ) - // } - // - // // remove stacks above - // console.log(this._nodeStack) - // this._nodeStack.splice(this._level + 2) - // console.log(this._nodeStack) - // - // } - // } - // - // ReturnStatement = { - // enter: (path) => { - // const node: Node = this._createNode( - // [path.node.loc.start.line], - // [] - // ); - // - // this._nodeStack[this._level].push(node) - // }, - // exit: (path) => { - // } - // } - // - // VariableDeclaration = { - // enter: (path) => { - // const node: Node = this._createNode( - // [path.node.loc.start.line], - // [] - // ); - // - // this._nodeStack[this._level].push(node) - // }, - // exit: (path) => { - // - // } - // } - - _createRootNode( - lines: number[], - statements: string[], - description?: string - ): RootNode { - const node: RootNode = { - id: `f-${lines[0]}`, - lines: lines, - statements: statements, - type: NodeType.Root, - description: description, - }; - - this._cfg.nodes.push(node); - - return node; - } - - /** - * This method creates a new node in the cfg - * @param lines - * @param statements - * @param branch whether this nodes is a branching node (i.e. multiple outgoing edges) - * @param probe - * @param condition if it is a branch node this is the condition to branch on - * @param placeholder - * @private - */ - _createNode(lines: number[], statements: string[]): Node { - const node: Node = { - type: NodeType.Intermediary, - id: `s-${lines[0]}`, - lines: lines, - statements: statements, - }; - - this._cfg.nodes.push(node); - - return node; - } - - _createPlaceholderNode( - lines: number[], - statements: string[] - ): PlaceholderNode { - const node: PlaceholderNode = { - type: NodeType.Placeholder, - id: `s-${lines[0]}`, - lines: lines, - statements: statements, - }; - - this._cfg.nodes.push(node); - - return node; - } - - _createBranchNode( - lines: number[], - statements: string[], - condition: Operation - ): BranchNode { - const node: BranchNode = { - condition: condition, - id: `b-${lines[0]}`, - lines: lines, - statements: statements, - type: NodeType.Branch, - probe: false, - }; - - this._cfg.nodes.push(node); - - return node; - } - - _connectParents(parents: Node[], children: Node[]) { - if (children === undefined) { - return; - } - for (const parent of parents) { - for (const child of children) { - this._cfg.edges.push({ - from: parent.id, - to: child.id, - }); - } - } - } - - get cfg(): ControlFlowGraph { - return this._cfg; - } -} diff --git a/libraries/cfg-javascript/tsconfig.json b/libraries/cfg-javascript/tsconfig.json deleted file mode 100644 index 09f54c559..000000000 --- a/libraries/cfg-javascript/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "../../tsconfig-base.json", - "files": [], - "include": [], - "references": [{ "path": "lib/" }] -} diff --git a/libraries/ast-javascript/lib/index.ts b/libraries/instrumentation-javascript/index.ts similarity index 73% rename from libraries/ast-javascript/lib/index.ts rename to libraries/instrumentation-javascript/index.ts index a64a40515..046edcd1d 100644 --- a/libraries/ast-javascript/lib/index.ts +++ b/libraries/instrumentation-javascript/index.ts @@ -16,8 +16,9 @@ * limitations under the License. */ -export * from "./AbstractSyntaxTreeGenerator"; -export * from "./AbstractSyntaxTreeVisitor"; -export * from "./defaultBabelConfig"; -export * from "./Element"; -export * from "./Scope"; +export * from "./lib/datastructures/InstrumentationData"; +export * from "./lib/datastructures/MetaData"; + +export * from "./lib/instrumentation/Instrumenter"; +export * from "./lib/instrumentation/Visitor"; +export * from "./lib/instrumentation/VisitState"; diff --git a/libraries/instrumentation-javascript/lib/datastructures/InstrumentationData.ts b/libraries/instrumentation-javascript/lib/datastructures/InstrumentationData.ts new file mode 100644 index 000000000..8470fa441 --- /dev/null +++ b/libraries/instrumentation-javascript/lib/datastructures/InstrumentationData.ts @@ -0,0 +1,65 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export type Location = { + id: string; + start: { + line: number; + column: number; + index: number; + }; + end: { + line: number; + column: number; + index: number; + }; +}; + +export type InstrumentationData = { + [path: string]: { + hash: string; + statementMap: { + [id: string]: Location; + }; + branchMap: { + [id: string]: { + line: number; + type: string; + loc: Location; + locations: [Location, Location]; + }; + }; + fnMap: { + [id: string]: { + name: string; + line: number; + decl: Location; + loc: Location; + }; + }; + s: { + [id: string]: number; + }; + f: { + [id: string]: number; + }; + b: { + // 0 is true, 1 is false + [id: string]: [number, number]; + }; + }; +}; diff --git a/libraries/instrumentation-javascript/lib/datastructures/MetaData.ts b/libraries/instrumentation-javascript/lib/datastructures/MetaData.ts new file mode 100644 index 000000000..2614889dc --- /dev/null +++ b/libraries/instrumentation-javascript/lib/datastructures/MetaData.ts @@ -0,0 +1,31 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export type MetaData = { + [path: string]: { + hash: string; + meta: { + [id: string]: { + condition_ast: string; + condition: string; + variables: { + [id: string]: unknown; + }; + }; + }; + }; +}; diff --git a/libraries/instrumentation-javascript/lib/instrumentation/Instrumenter.ts b/libraries/instrumentation-javascript/lib/instrumentation/Instrumenter.ts index c8b022e26..5a270920a 100644 --- a/libraries/instrumentation-javascript/lib/instrumentation/Instrumenter.ts +++ b/libraries/instrumentation-javascript/lib/instrumentation/Instrumenter.ts @@ -16,9 +16,15 @@ * limitations under the License. */ -import { TransformOptions, transformSync } from "@babel/core"; +import { transformSync } from "@babel/core"; import { Visitor } from "./Visitor"; -import { defaultBabelOptions } from "@syntest/ast-javascript"; +import { + RootContext, + Target, + defaultBabelOptions, +} from "@syntest/analysis-javascript"; +import * as path from "node:path"; +import { copySync, outputFileSync } from "fs-extra"; export interface OutputObject { fileCoverage?: any; @@ -26,6 +32,38 @@ export interface OutputObject { } export class Instrumenter { + // TODO maybe the instrumenter should not be responsible for copying the files + async instrumentAll( + rootContext: RootContext, + targets: Target[], + temporaryInstrumentedDirectory: string + ): Promise { + const absoluteRootPath = path.resolve(rootContext.rootPath); + + const destinationPath = path.resolve( + temporaryInstrumentedDirectory, + path.basename(absoluteRootPath) + ); + + // copy everything + await copySync(absoluteRootPath, destinationPath); + + // overwrite the stuff that needs instrumentation + + const targetPaths = [...targets.values()].map((target) => target.path); + + for (const targetPath of targetPaths) { + const source = rootContext.getSource(targetPath); + const instrumentedSource = await this.instrument(source, targetPath); + + const _path = path + .normalize(targetPath) + .replace(absoluteRootPath, destinationPath); + + await outputFileSync(_path, instrumentedSource); + } + } + async instrument(code: string, filename: string) { const options = JSON.parse(JSON.stringify(defaultBabelOptions)); diff --git a/libraries/instrumentation-javascript/lib/instrumentation/VisitState.ts b/libraries/instrumentation-javascript/lib/instrumentation/VisitState.ts index 1581ceb20..1bd1c5fb7 100644 --- a/libraries/instrumentation-javascript/lib/instrumentation/VisitState.ts +++ b/libraries/instrumentation-javascript/lib/instrumentation/VisitState.ts @@ -18,9 +18,7 @@ import { createHash } from "crypto"; -const { - SourceCoverage, -} = require("istanbul-lib-instrument/src/source-coverage"); +import { SourceCoverage } from "./source-coverage"; const SHA = "sha1"; @@ -315,8 +313,8 @@ export class VisitState { }; } - const name = path.node.id ? path.node.id.name : path.node.name; - const index = this.cov.newFunction(name, dloc, path.node.body.loc); + const name = n.id ? n.id.name : n.name; + const index = this.cov.newFunction(name, dloc, n.body.loc); const increment = this.increase("f", index, null); const body = path.get("body"); /* istanbul ignore else: not expected */ @@ -330,8 +328,8 @@ export class VisitState { } } - getBranchIncrement(branchName, loc) { - const index = this.cov.addBranchPath(branchName, loc); + getBranchIncrement(ifPath, branchName, loc) { + const index = this.cov.addBranchPath(ifPath, branchName, loc); return this.increase("b", branchName, index); } @@ -392,8 +390,12 @@ export class VisitState { ]; } - insertBranchCounter(path, branchName, loc) { - const increment = this.getBranchIncrement(branchName, loc || path.node.loc); + insertBranchCounter(ifPath, path, branchName, loc) { + const increment = this.getBranchIncrement( + ifPath, + branchName, + loc || path.node.loc + ); this.insertCounter(path, increment); } diff --git a/libraries/instrumentation-javascript/lib/instrumentation/Visitor.ts b/libraries/instrumentation-javascript/lib/instrumentation/Visitor.ts index 1ee115c14..0ce06bb14 100644 --- a/libraries/instrumentation-javascript/lib/instrumentation/Visitor.ts +++ b/libraries/instrumentation-javascript/lib/instrumentation/Visitor.ts @@ -19,9 +19,10 @@ import { defaults } from "@istanbuljs/schema"; import { VisitState } from "./VisitState"; import { createHash } from "crypto"; -import { template } from "@babel/core"; +import { NodePath, template } from "@babel/core"; +import * as t from "@babel/types"; -const { name } = require("../../package.json"); +const name = "syntest"; // increment this version if there are schema changes // that are not backwards compatible: @@ -70,7 +71,7 @@ export class Visitor { exit(path) { if (alreadyInstrumented(path, this.visitState)) { - return; + return undefined; } this.visitState.cov.freeze(); const coverageData = this.visitState.cov.toJSON(); @@ -179,7 +180,7 @@ function coverStatement(path) { function coverAssignmentPattern(path) { const n = path.node; const b = this.cov.newBranch("default-arg", n.loc); - this.insertBranchCounter(path.get("right"), b); + this.insertBranchCounter(path, path.get("right"), b); } function coverFunction(path) { @@ -253,12 +254,12 @@ function coverIfBranches(path) { if (ignoreIf) { this.setAttr(n.consequent, "skip-all", true); } else { - this.insertBranchCounter(path.get("consequent"), branch, n.loc); + this.insertBranchCounter(path, path.get("consequent"), branch, n.loc); } if (ignoreElse) { this.setAttr(n.alternate, "skip-all", true); } else { - this.insertBranchCounter(path.get("alternate"), branch); + this.insertBranchCounter(path, path.get("alternate"), branch); } const T = this.types; @@ -302,11 +303,14 @@ function coverLoopBranch(path) { const n = path.node; const branch = this.cov.newBranch("loop", n.loc); - this.insertBranchCounter(path.get("body"), branch, n.loc); + this.insertBranchCounter(path, path.get("body"), branch, n.loc); const T = this.types; - const increment = this.getBranchIncrement(branch, path.node.loc); + const increment = this.getBranchIncrement(path, branch, { + start: path.node.loc.end, + end: path.node.loc.end, + }); path.insertAfter(T.expressionStatement(increment)); // TODO we should actually print what the just defined variable is set to @@ -370,7 +374,7 @@ function coverSwitchCase(path) { if (b === null) { throw new Error("Unable to get switch branch name"); } - const increment = this.getBranchIncrement(b, path.node.loc); + const increment = this.getBranchIncrement(path, b, path.node.loc); path.node.consequent.unshift(T.expressionStatement(increment)); } @@ -381,10 +385,10 @@ function coverTernary(path) { const aHint = this.hintFor(n.alternate); if (cHint !== "next") { - this.insertBranchCounter(path.get("consequent"), branch); + this.insertBranchCounter(path, path.get("consequent"), branch); } if (aHint !== "next") { - this.insertBranchCounter(path.get("alternate"), branch); + this.insertBranchCounter(path, path.get("alternate"), branch); } const T = this.types; @@ -576,7 +580,7 @@ const metaTemplate = template( // https://github.com/istanbuljs/babel-plugin-istanbul/issues/94 // we should only instrument code for coverage the first time // it's run through istanbul-lib-instrument. -function alreadyInstrumented(path, visitState) { +function alreadyInstrumented(path: NodePath, visitState) { return path.scope.hasBinding(visitState.varName); } function shouldIgnoreFile(programNode) { diff --git a/libraries/instrumentation-javascript/lib/instrumentation/source-coverage.ts b/libraries/instrumentation-javascript/lib/instrumentation/source-coverage.ts new file mode 100644 index 000000000..9b33eae05 --- /dev/null +++ b/libraries/instrumentation-javascript/lib/instrumentation/source-coverage.ts @@ -0,0 +1,189 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { NodePath } from "@babel/traverse"; +import * as t from "@babel/types"; +const { classes } = require("istanbul-lib-coverage"); + +/** + * SourceCoverage provides mutation methods to manipulate the structure of + * a file coverage object. Used by the instrumenter to create a full coverage + * object for a file incrementally. + * + * @private + * @param pathOrObj {String|Object} - see the argument for {@link FileCoverage} + * @extends FileCoverage + * @constructor + */ +export class SourceCoverage extends classes.FileCoverage { + private meta: any; + private data: any; + private _filePath: string; + constructor(pathOrObj) { + super(pathOrObj); + this._filePath = pathOrObj; + this.meta = { + last: { + s: 0, + f: 0, + b: 0, + }, + }; + } + + public _getNodeId(loc): string { + if (loc === undefined) { + throw new Error( + `Node * in file '${this._filePath}' does not have a location` + ); + } + + const startLine = (<{ line: number }>(loc.start)).line; + const startColumn = (<{ column: number }>(loc.start)).column; + const startIndex = (<{ index: number }>(loc.start)).index; + const endLine = (<{ line: number }>(loc.end)).line; + const endColumn = (<{ column: number }>(loc.end)).column; + const endIndex = (<{ index: number }>(loc.end)).index; + + return `${this._filePath}:${startLine}:${startColumn}:::${endLine}:${endColumn}:::${startIndex}:${endIndex}`; + } + + _cloneLocation(loc) { + return { + id: loc && this._getNodeId(loc), + start: { + line: loc && loc.start.line, + column: loc && loc.start.column, + index: loc && loc.start.index, + }, + end: { + line: loc && loc.end.line, + column: loc && loc.end.column, + index: loc && loc.end.index, + }, + }; + } + + newStatement(loc) { + const s = this.meta.last.s; + this.data.statementMap[s] = this._cloneLocation(loc); + this.data.s[s] = 0; + this.meta.last.s += 1; + return s; + } + + newFunction(name, decl, loc) { + const f = this.meta.last.f; + name = name || "(anonymous_" + f + ")"; + this.data.fnMap[f] = { + name, + decl: this._cloneLocation(decl), + loc: this._cloneLocation(loc), + // DEPRECATED: some legacy reports require this info. + line: loc && loc.start.line, + }; + this.data.f[f] = 0; + this.meta.last.f += 1; + return f; + } + + newBranch(type, loc, isReportLogic = false) { + const b = this.meta.last.b; + this.data.b[b] = []; + this.data.branchMap[b] = { + loc: this._cloneLocation(loc), + type, + locations: [], + // DEPRECATED: some legacy reports require this info. + line: loc && loc.start.line, + }; + this.meta.last.b += 1; + this.maybeNewBranchTrue(type, b, isReportLogic); + return b; + } + + maybeNewBranchTrue(type, name, isReportLogic) { + if (!isReportLogic) { + return; + } + if (type !== "binary-expr") { + return; + } + this.data.bT = this.data.bT || {}; + this.data.bT[name] = []; + } + + addBranchPath(ifPath: NodePath, name, location) { + const bMeta = this.data.branchMap[name]; + const counts = this.data.b[name]; + + /* istanbul ignore if: paranoid check */ + if (!bMeta) { + throw new Error( + "Invalid branch " + name + `${this._getNodeId(ifPath.node.loc)}` + ); + } + if (location !== undefined) { + bMeta.locations.push(this._cloneLocation(location)); + } else { + const clone = this._cloneLocation({ + start: ifPath.node.loc.end, + end: ifPath.node.loc.end, + }); + const id = this._getNodeId(ifPath.node.loc); + clone.id = `placeholder-${id}`; + bMeta.locations.push(clone); + } + counts.push(0); + this.maybeAddBranchTrue(name); + return counts.length - 1; + } + + maybeAddBranchTrue(name) { + if (!this.data.bT) { + return; + } + const countsTrue = this.data.bT[name]; + if (!countsTrue) { + return; + } + countsTrue.push(0); + } + + /** + * Assigns an input source map to the coverage that can be used + * to remap the coverage output to the original source + * @param sourceMap {object} the source map + */ + inputSourceMap(sourceMap) { + this.data.inputSourceMap = sourceMap; + } + + freeze() { + // prune empty branches + const map = this.data.branchMap; + const branches = this.data.b; + const branchesT = this.data.bT || {}; + Object.keys(map).forEach((b) => { + if (map[b].locations.length === 0) { + delete map[b]; + delete branches[b]; + delete branchesT[b]; + } + }); + } +} diff --git a/libraries/instrumentation-javascript/package.json b/libraries/instrumentation-javascript/package.json index 1a3bf0eb5..0294061e5 100644 --- a/libraries/instrumentation-javascript/package.json +++ b/libraries/instrumentation-javascript/package.json @@ -19,8 +19,12 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ - "/dist", - "/NOTICE", + "dist/lib", + "dist/index.d.ts", + "dist/index.d.ts.map", + "dist/index.js", + "dist/index.js.map", + "NOTICE", "README.md" ], "repository": { @@ -43,9 +47,15 @@ }, "dependencies": { "@babel/core": "7.20.12", - "@syntest/ast-javascript": "*" + "@babel/traverse": "^7.21.5", + "@istanbuljs/schema": "^0.1.3", + "@syntest/analysis-javascript": "^0.1.0-beta.4", + "@syntest/ast-visitor-javascript": "*", + "fs-extra": "^11.1.1", + "istanbul-lib-coverage": "^3.2.0" }, "devDependencies": { + "@babel/types": "^7.21.5", "@types/babel__core": "7.20.0" }, "engines": { diff --git a/libraries/instrumentation-javascript/test/example.test.ts b/libraries/instrumentation-javascript/test/example.test.ts index 293aec566..744b35563 100644 --- a/libraries/instrumentation-javascript/test/example.test.ts +++ b/libraries/instrumentation-javascript/test/example.test.ts @@ -16,14 +16,16 @@ * limitations under the License. */ import * as chai from "chai"; -import { Instrumenter } from "../lib"; + +import { Instrumenter } from "../lib/instrumentation/Instrumenter"; + const expect = chai.expect; /** * This test is only added such that the github action does not fail. */ describe("example test", () => { - it("test", async () => { + it("test", () => { new Instrumenter(); expect(true); }); diff --git a/libraries/instrumentation-javascript/tsconfig.json b/libraries/instrumentation-javascript/tsconfig.json index 09f54c559..e7722a3ce 100644 --- a/libraries/instrumentation-javascript/tsconfig.json +++ b/libraries/instrumentation-javascript/tsconfig.json @@ -1,6 +1,13 @@ { "extends": "../../tsconfig-base.json", - "files": [], - "include": [], - "references": [{ "path": "lib/" }] + "compilerOptions": { + "outDir": "./dist", + "rootDir": ".", + "composite": true, + // disable some because this is a library + "strict": false /* Enable all strict type-checking options. */, + "noImplicitAny": false /* Raise error on expressions and declarations with an implied 'any' type. */, + "noImplicitThis": false /* Raise error on 'this' expressions with an implied 'any' type. */ + }, + "include": ["**/*.ts"] } diff --git a/libraries/javascript/lib/JavaScriptLauncher.ts b/libraries/javascript/lib/JavaScriptLauncher.ts deleted file mode 100644 index 369de6fd9..000000000 --- a/libraries/javascript/lib/JavaScriptLauncher.ts +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - Archive, - ArgumentsObject, - BudgetManager, - clearDirectory, - CONFIG, - CoverageWriter, - createDirectoryStructure, - createSearchAlgorithmFromConfig, - createTempDirectoryStructure, - createTerminationManagerFromConfig, - deleteTempDirectories, - EvaluationBudget, - getSeed, - getUserInterface, - IterationBudget, - Launcher, - RuntimeVariable, - SearchTimeBudget, - setupLogger, - setUserInterface, - StatisticsCollector, - StatisticsSearchListener, - SummaryWriter, - TotalTimeBudget, -} from "@syntest/core"; - -import { JavaScriptTestCase } from "./testcase/JavaScriptTestCase"; -import { - JavaScriptTargetMetaData, - JavaScriptTargetPool, -} from "./analysis/static/JavaScriptTargetPool"; -import { AbstractSyntaxTreeGenerator } from "@syntest/ast-javascript"; -import * as path from "path"; -import { TargetMapGenerator } from "./analysis/static/map/TargetMapGenerator"; -import { JavaScriptSubject } from "./search/JavaScriptSubject"; -import { JavaScriptSuiteBuilder } from "./testbuilding/JavaScriptSuiteBuilder"; -import { JavaScriptDecoder } from "./testbuilding/JavaScriptDecoder"; -import { JavaScriptRunner } from "./testcase/execution/JavaScriptRunner"; -import { JavaScriptRandomSampler } from "./testcase/sampling/JavaScriptRandomSampler"; -import { JavaScriptTreeCrossover } from "./search/crossover/JavaScriptTreeCrossover"; -import { - collectCoverageData, - collectInitialVariables, - collectStatistics, -} from "./utils/collection"; -import Messages from "./ui/Messages"; -import { JavaScriptCommandLineInterface } from "./ui/JavaScriptCommandLineInterface"; -import { ControlFlowGraphGenerator } from "@syntest/cfg-javascript"; -import { ImportGenerator } from "./analysis/static/dependency/ImportGenerator"; -import { ExportGenerator } from "./analysis/static/dependency/ExportGenerator"; -import { Export } from "./analysis/static/dependency/ExportVisitor"; -import { TypeResolverInference } from "./analysis/static/types/resolving/logic/TypeResolverInference"; -import { TypeResolverUnknown } from "./analysis/static/types/resolving/TypeResolverUnknown"; -import { TypeResolver } from "./analysis/static/types/resolving/TypeResolver"; -import { ActionType } from "./analysis/static/parsing/ActionType"; -import { existsSync } from "fs"; -import Yargs = require("yargs"); - -export interface JavaScriptArguments extends ArgumentsObject { - incorporateExecutionInformation: boolean; - typeInferenceMode: string; - randomTypeProbability: number; -} - -export class JavaScriptLauncher extends Launcher { - private exports: Export[]; - private dependencyMap: Map; - - private coveredInPath = new Map>(); - - addOptions(yargs: Yargs.Argv) { - return yargs - .options("incorporate-execution-information", { - alias: [], - default: true, - description: "Incorporate execution information.", - group: "Type Inference Options:", - hidden: false, - type: "boolean", - }) - .options("type-inference-mode", { - alias: [], - default: "proportional", - description: "The type inference mode: [proportional, ranked, none].", - group: "Type Inference Options:", - hidden: false, - type: "string", - }) - .options("random-type-probability", { - alias: [], - default: 0.1, - description: - "The probability we use a random type regardless of the inferred type.", - group: "Type Inference Options:", - hidden: false, - type: "number", - }); - } - async initialize(): Promise { - setupLogger(); - if (existsSync(".syntest")) { - await deleteTempDirectories(); - } - - await createDirectoryStructure(); - await createTempDirectoryStructure(); - - const messages = new Messages(); - setUserInterface( - new JavaScriptCommandLineInterface( - CONFIG.consoleLogLevel === "silent", - CONFIG.consoleLogLevel === "verbose", - messages - ) - ); - - getUserInterface().report("clear", []); - getUserInterface().report("asciiArt", ["Syntest"]); - // eslint-disable-next-line - getUserInterface().report("version", [require("../package.json").version]); - - const abstractSyntaxTreeGenerator = new AbstractSyntaxTreeGenerator(); - const targetMapGenerator = new TargetMapGenerator(); - - let typeResolver: TypeResolver; - - if ((CONFIG).typeInferenceMode === "none") { - typeResolver = new TypeResolverUnknown(); - } else { - typeResolver = new TypeResolverInference(); - } - - const controlFlowGraphGenerator = new ControlFlowGraphGenerator(); - const importGenerator = new ImportGenerator(); - const exportGenerator = new ExportGenerator(); - const targetPool = new JavaScriptTargetPool( - this.eventManager, - abstractSyntaxTreeGenerator, - targetMapGenerator, - controlFlowGraphGenerator, - importGenerator, - exportGenerator, - typeResolver - ); - this.programState.targetPool = targetPool; - - getUserInterface().report("header", ["GENERAL INFO"]); - // TODO ui info messages - - getUserInterface().report("header", ["TARGETS"]); - - getUserInterface().report("property-set", [ - "Target Settings", - ( - ([["Target Root Directory", CONFIG.targetRootDirectory]]) - ), - ]); - } - - async preprocess(): Promise { - this.programState.targetPool.loadTargets(); - - if (!this.programState.targetPool.targets.length) { - // Shut server down - getUserInterface().error( - `No targets where selected! Try changing the 'include' parameter` - ); - await this.exit(); - } - - const names: string[] = []; - - this.programState.targetPool.targets.forEach((target) => - names.push( - `${path.basename(target.canonicalPath)} -> ${target.targetName}` - ) - ); - getUserInterface().report("targets", names); - - getUserInterface().report("header", ["CONFIGURATION"]); - - getUserInterface().report("single-property", ["Seed", getSeed()]); - getUserInterface().report("property-set", ["Budgets", ([ - ["Iteration Budget", `${CONFIG.iterationBudget} iterations`], - ["Evaluation Budget", `${CONFIG.evaluationBudget} evaluations`], - ["Search Time Budget", `${CONFIG.searchTimeBudget} seconds`], - ["Total Time Budget", `${CONFIG.totalTimeBudget} seconds`], - ])]); - getUserInterface().report("property-set", ["Algorithm", ([ - ["Algorithm", CONFIG.algorithm], - ["Population Size", CONFIG.populationSize], - ])]); - getUserInterface().report("property-set", [ - "Variation Probabilities", - ([ - ["Resampling", CONFIG.resampleGeneProbability], - ["Delta mutation", CONFIG.deltaMutationProbability], - ["Re-sampling from chromosome", CONFIG.sampleExistingValueProbability], - ["Crossover", CONFIG.crossoverProbability], - ]), - ]); - - getUserInterface().report("property-set", ["Sampling", ([ - ["Max Depth", CONFIG.maxDepth], - ["Explore Illegal Values", CONFIG.exploreIllegalValues], - [ - "Sample FUNCTION Result as Argument", - CONFIG.sampleFunctionOutputAsArgument, - ], - ["Crossover", CONFIG.crossoverProbability], - ])]); - - getUserInterface().report("property-set", ["Type Inference", (< - unknown - >[ - [ - "Incorporate Execution Information", - (CONFIG).incorporateExecutionInformation, - ], - [ - "Type Inference Mode", - (CONFIG).typeInferenceMode, - ], - [ - "Random Type Probability", - (CONFIG).randomTypeProbability, - ], - ])]); - - await (( - this.programState.targetPool - )).prepareAndInstrument(); - await (( - this.programState.targetPool - )).scanTargetRootDirectory(); - } - - async process(): Promise { - this.programState.archive = new Archive(); - this.exports = []; - this.dependencyMap = new Map(); - - for (const target of this.programState.targetPool.targets) { - const archive = await this.testTarget( - this.programState.targetPool, - target.canonicalPath, - (this.programState.targetPool) - .getTargetMap(target.canonicalPath) - .get(target.targetName) - ); - - const dependencies = (( - this.programState.targetPool - )).getDependencies(target.canonicalPath); - this.programState.archive.merge(archive); - - this.dependencyMap.set(target.targetName, dependencies); - this.exports.push( - ...(this.programState.targetPool).getExports( - target.canonicalPath - ) - ); - } - } - - async postprocess(): Promise { - const testDir = path.resolve(CONFIG.finalSuiteDirectory); - await clearDirectory(testDir); - - const decoder = new JavaScriptDecoder( - this.programState.targetPool, - this.dependencyMap, - this.exports - ); - const runner = new JavaScriptRunner(decoder); - - const suiteBuilder = new JavaScriptSuiteBuilder(decoder, runner); - - // TODO fix hardcoded paths - - const reducedArchive = suiteBuilder.reduceArchive( - this.programState.archive - ); - - let paths = await suiteBuilder.createSuite( - reducedArchive, - "../instrumented", - CONFIG.tempTestDirectory, - true, - false - ); - await suiteBuilder.runSuite( - paths, - false, - this.programState.targetPool - ); - - // reset states - await suiteBuilder.clearDirectory(CONFIG.tempTestDirectory); - - // run with assertions and report results - for (const key of reducedArchive.keys()) { - await suiteBuilder.gatherAssertions(reducedArchive.get(key)); - } - paths = await suiteBuilder.createSuite( - reducedArchive, - "../instrumented", - CONFIG.tempTestDirectory, - false, - true - ); - await suiteBuilder.runSuite( - paths, - true, - this.programState.targetPool - ); - - const originalSourceDir = path - .join("../../", path.relative(process.cwd(), CONFIG.targetRootDirectory)) - .replace(path.basename(CONFIG.targetRootDirectory), ""); - - // create final suite - await suiteBuilder.createSuite( - reducedArchive, - originalSourceDir, - CONFIG.finalSuiteDirectory, - false, - true - ); - } - - private async testTarget( - targetPool: JavaScriptTargetPool, - targetPath: string, - targetMeta: JavaScriptTargetMetaData - ): Promise> { - const cfg = targetPool.getCFG(targetPath, targetMeta.name); - - const functionMap = targetPool.getFunctionMapSpecific( - targetPath, - targetMeta.name - ); - - // couple types to parameters - // TODO do this type matching already in the target visitor - for (const func of functionMap.values()) { - for (const param of func.parameters) { - if (func.type === ActionType.FUNCTION) { - param.typeProbabilityMap = targetPool.typeResolver.getTyping( - func.scope, - param.name - ); - } else if ( - func.type === ActionType.METHOD || - func.type === ActionType.GET || - func.type === ActionType.SET || - func.type === ActionType.CONSTRUCTOR - ) { - param.typeProbabilityMap = targetPool.typeResolver.getTyping( - func.scope, - param.name - ); - } else { - throw new Error( - `Unimplemented action identifierDescription ${func.type}` - ); - } - } - // TODO return types - } - - const currentSubject = new JavaScriptSubject( - path.basename(targetPath), - targetMeta, - cfg, - [...functionMap.values()] - ); - - if (!currentSubject.getPossibleActions().length) { - // report skipped - return new Archive(); - } - - const dependencies = targetPool.getDependencies(targetPath); - const dependencyMap = new Map(); - dependencyMap.set(targetMeta.name, dependencies); - const exports = targetPool.getExports(targetPath); - - const decoder = new JavaScriptDecoder(targetPool, dependencyMap, exports); - const runner = new JavaScriptRunner(decoder); - - const suiteBuilder = new JavaScriptSuiteBuilder(decoder, runner); - - // TODO constant pool - - const sampler = new JavaScriptRandomSampler(currentSubject, targetPool); - const crossover = new JavaScriptTreeCrossover(); - const algorithm = createSearchAlgorithmFromConfig( - this.eventManager, - this.pluginManager, - null, - sampler, - runner, - crossover - ); - - await suiteBuilder.clearDirectory(CONFIG.tempTestDirectory); - - // allocate budget manager - const iterationBudget = new IterationBudget(CONFIG.iterationBudget); - const evaluationBudget = new EvaluationBudget(); - const searchBudget = new SearchTimeBudget(CONFIG.searchTimeBudget); - const totalTimeBudget = new TotalTimeBudget(CONFIG.totalTimeBudget); - const budgetManager = new BudgetManager(); - budgetManager.addBudget(iterationBudget); - budgetManager.addBudget(evaluationBudget); - budgetManager.addBudget(searchBudget); - budgetManager.addBudget(totalTimeBudget); - - // Termination - const terminationManager = createTerminationManagerFromConfig( - this.pluginManager - ); - - // Collector - const collector = new StatisticsCollector(totalTimeBudget); - collectInitialVariables(collector, currentSubject, targetPath); - - // Statistics listener - const statisticsSearchListener = new StatisticsSearchListener(collector); - algorithm.addListener(statisticsSearchListener); - - // This searches for a covering population - const archive = await algorithm.search( - currentSubject, - budgetManager, - terminationManager - ); - - if (this.coveredInPath.has(targetPath)) { - archive.merge(this.coveredInPath.get(targetPath)); - this.coveredInPath.set(targetPath, archive); - } else { - this.coveredInPath.set(targetPath, archive); - } - - // Gather statistics after the search - collectStatistics( - collector, - currentSubject, - archive, - totalTimeBudget, - searchBudget, - iterationBudget, - evaluationBudget - ); - - collector.recordVariable(RuntimeVariable.INSTRUMENTATION_TIME, `unknown`); - - collector.recordVariable(RuntimeVariable.TYPE_RESOLVING_TIME, `unknown`); - - collectCoverageData(collector, archive, "branch"); - collectCoverageData(collector, archive, "statement"); - collectCoverageData(collector, archive, "function"); - - const statisticsDirectory = path.resolve(CONFIG.statisticsDirectory); - - const summaryWriter = new SummaryWriter(); - summaryWriter.write(collector, statisticsDirectory + "/statistics.csv"); - - const coverageWriter = new CoverageWriter(); - coverageWriter.write(collector, statisticsDirectory + "/coverage.csv"); - - await clearDirectory(CONFIG.tempTestDirectory); - await clearDirectory(CONFIG.tempLogDirectory); - - return archive; - } - - async exit(): Promise { - // Finish - await deleteTempDirectories(); - - process.exit(0); - } -} diff --git a/libraries/javascript/lib/analysis/static/JavaScriptTargetPool.ts b/libraries/javascript/lib/analysis/static/JavaScriptTargetPool.ts deleted file mode 100644 index 03bf6a251..000000000 --- a/libraries/javascript/lib/analysis/static/JavaScriptTargetPool.ts +++ /dev/null @@ -1,589 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as path from "path"; -import { ControlFlowGraph } from "@syntest/cfg-core"; -import { getAllFiles, readFile } from "../../utils/fileSystem"; -import { AbstractSyntaxTreeGenerator } from "@syntest/ast-javascript"; -import { - CONFIG, - EventManager, - TargetMetaData, - TargetPool, -} from "@syntest/core"; -import { TargetMapGenerator } from "./map/TargetMapGenerator"; -import { ControlFlowGraphGenerator } from "@syntest/cfg-javascript"; -import { ImportGenerator } from "./dependency/ImportGenerator"; -import { ExportGenerator } from "./dependency/ExportGenerator"; -import { existsSync, lstatSync } from "fs"; -import { Export } from "./dependency/ExportVisitor"; -import { SubjectType } from "../../search/JavaScriptSubject"; -import { TypeResolver } from "./types/resolving/TypeResolver"; -import { VariableGenerator } from "./types/discovery/VariableGenerator"; -import { ObjectGenerator } from "./types/discovery/object/ObjectGenerator"; -import { ComplexObject } from "./types/discovery/object/ComplexObject"; -import { Relation } from "./types/discovery/Relation"; -import { Element } from "@syntest/ast-javascript"; -import { TypeEnum } from "./types/resolving/TypeEnum"; -import { TypeProbability } from "./types/resolving/TypeProbability"; -import { Instrumenter } from "@syntest/instrumentation-javascript"; -import { ExportType } from "./dependency/IdentifierVisitor"; -import * as t from "@babel/types"; -import { JavaScriptTestCase } from "../../testcase/JavaScriptTestCase"; -import { ActionDescription } from "./parsing/ActionDescription"; -import { ActionDescription as CoreActionDescription } from "@syntest/core/dist/analysis/static/ActionDescription"; - -// eslint-disable-next-line -const { outputFileSync, copySync } = require("fs-extra"); - -export interface JavaScriptTargetMetaData extends TargetMetaData { - type: SubjectType; - export: Export; -} - -export class JavaScriptTargetPool extends TargetPool { - protected abstractSyntaxTreeGenerator: AbstractSyntaxTreeGenerator; - protected targetMapGenerator: TargetMapGenerator; - protected controlFlowGraphGenerator: ControlFlowGraphGenerator; - protected importGenerator: ImportGenerator; - protected exportGenerator: ExportGenerator; - private _typeResolver: TypeResolver; - - // Mapping: filepath -> source code - protected _sources: Map; - - // Mapping: filepath -> AST - protected _abstractSyntaxTrees: Map; - - // Mapping: filepath -> target name -> target meta data - protected _targetMap: Map>; - - // Mapping: filepath -> target name -> function name -> function - protected _functionMaps: Map< - string, - Map> - >; - - // Mapping: filepath -> target name -> (function name -> CFG) - protected _controlFlowGraphs: Map>; - - // Mapping: filepath -> dependencies - protected _dependencyMaps: Map; - - // Mapping: filepath -> target name -> Exports - protected _exportMap: Map; - - constructor( - eventManager: EventManager, - abstractSyntaxTreeGenerator: AbstractSyntaxTreeGenerator, - targetMapGenerator: TargetMapGenerator, - controlFlowGraphGenerator: ControlFlowGraphGenerator, - importGenerator: ImportGenerator, - exportGenerator: ExportGenerator, - typeResolver: TypeResolver - ) { - super(eventManager); - this.abstractSyntaxTreeGenerator = abstractSyntaxTreeGenerator; - this.targetMapGenerator = targetMapGenerator; - this.controlFlowGraphGenerator = controlFlowGraphGenerator; - this.importGenerator = importGenerator; - this.exportGenerator = exportGenerator; - this._typeResolver = typeResolver; - - this._sources = new Map(); - this._abstractSyntaxTrees = new Map(); - this._targetMap = new Map>(); - this._functionMaps = new Map< - string, - Map> - >(); - this._controlFlowGraphs = new Map>(); - - this._dependencyMaps = new Map(); - - this._exportMap = new Map(); - } - - getSource(targetPath: string) { - let absoluteTargetPath = path.resolve(targetPath); - - if (!this._sources.has(absoluteTargetPath)) { - if (!existsSync(absoluteTargetPath)) { - if (existsSync(absoluteTargetPath + ".js")) { - absoluteTargetPath += ".js"; - } else if (existsSync(absoluteTargetPath + ".ts")) { - absoluteTargetPath += ".ts"; - } else { - throw new Error("Cannot find source: " + absoluteTargetPath); - } - } - - const stats = lstatSync(absoluteTargetPath); - - if (stats.isDirectory()) { - if (existsSync(absoluteTargetPath + "/index.js")) { - absoluteTargetPath += "/index.js"; - } else if (existsSync(absoluteTargetPath + "/index.ts")) { - absoluteTargetPath += "/index.ts"; - } else { - throw new Error("Cannot find source: " + absoluteTargetPath); - } - } - - return readFile(absoluteTargetPath); - // this._sources.set(absoluteTargetPath, readFile(absoluteTargetPath)); - } - - return this._sources.get(absoluteTargetPath); - } - - getAST(targetPath: string): t.Node { - const absoluteTargetPath = path.resolve(targetPath); - - // this takes up too much memory we should do some kind of garbage collection if we want to save it all - if (!this._abstractSyntaxTrees.has(absoluteTargetPath)) { - // this._abstractSyntaxTrees.set( - // absoluteTargetPath, - // this.abstractSyntaxTreeGenerator.generate( - // this.getSource(targetPath), - // absoluteTargetPath - // ) - // ); - return this.abstractSyntaxTreeGenerator.generate( - this.getSource(targetPath) - ); - } - - return this._abstractSyntaxTrees.get(absoluteTargetPath); - } - - getCFG(targetPath: string, targetName: string): ControlFlowGraph { - const absoluteTargetPath = path.resolve(targetPath); - - if (!this._controlFlowGraphs.has(absoluteTargetPath)) { - this._controlFlowGraphs.set( - absoluteTargetPath, - new Map() - ); - } - - if (!this._controlFlowGraphs.get(absoluteTargetPath).has(targetName)) { - // this._controlFlowGraphs.get(absoluteTargetPath).set( - // targetName, - // this.controlFlowGraphGenerator.convertAST( - // this.getAST(absoluteTargetPath) - // ) - // ); - return this.controlFlowGraphGenerator.convertAST( - this.getAST(absoluteTargetPath) - ); - } - - return this._controlFlowGraphs.get(absoluteTargetPath).get(targetName); - } - - getTargetMap(targetPath: string): Map { - const absoluteTargetPath = path.resolve(targetPath); - - if (!this._targetMap.has(absoluteTargetPath)) { - const targetAST = this.getAST(absoluteTargetPath); - const { targetMap, functionMap } = this.targetMapGenerator.generate( - absoluteTargetPath, - targetAST - ); - - const exports = this.getExports(targetPath); - - const finalTargetMap = new Map(); - - for (const key of targetMap.keys()) { - const name = targetMap.get(key).name; - const export_ = exports.find((e) => e.name === name); - - if (!export_) { - // No export found so we cannot import it and thus not test it - continue; - } - - if ( - export_.type === ExportType.const && - functionMap.get(key).size === 0 - ) { - throw new Error( - `Target cannot be constant: ${name} -> ${JSON.stringify(export_)}` - ); - } - - let isPrototypeClass = false; - for (const func of functionMap.get(key).values()) { - if (func.isConstructor) { - isPrototypeClass = true; - break; - } - } - - // let isClass = false - // if (functionMap.get(key).size > 1) { - // isClass = true - // } - - // threat everything as a function if we don't know - finalTargetMap.set(key, { - name: name, - type: - export_.type === ExportType.class || isPrototypeClass - ? SubjectType.class - : export_.type === ExportType.const - ? SubjectType.object - : SubjectType.function, - export: export_, - }); - } - - this._targetMap.set(absoluteTargetPath, finalTargetMap); - this._functionMaps.set(absoluteTargetPath, functionMap); - } - - return this._targetMap.get(absoluteTargetPath); - } - - getFunctionMapSpecific( - targetPath: string, - targetName: string - ): Map { - const absoluteTargetPath = path.resolve(targetPath); - - if (!this._functionMaps.has(absoluteTargetPath)) { - this.getTargetMap(absoluteTargetPath); - } - - if (this._functionMaps.get(absoluteTargetPath).has(targetName)) { - return this._functionMaps.get(absoluteTargetPath).get(targetName); - } else { - throw new Error( - `Target ${targetName} could not be found at ${targetPath}` - ); - } - } - - getFunctionMap( - targetPath: string, - targetName: string - ): Map { - const absoluteTargetPath = path.resolve(targetPath); - - if (!this._functionMaps.has(absoluteTargetPath)) { - this.getTargetMap(absoluteTargetPath); - } - - if (!this._functionMaps.get(absoluteTargetPath).has(targetName)) { - return new Map(); - } - - return >( - (this._functionMaps.get(absoluteTargetPath).get(targetName)) - ); - } - - getFunctionMaps( - targetPath: string - ): Map> { - const absoluteTargetPath = path.resolve(targetPath); - - if (!this._functionMaps.has(absoluteTargetPath)) { - this.getTargetMap(absoluteTargetPath); - } - - return >>( - (this._functionMaps.get(absoluteTargetPath)) - ); - } - - getExports(targetPath: string): Export[] { - const absoluteTargetPath = path.resolve(targetPath); - - if (!this._exportMap.has(absoluteTargetPath)) { - const exports = this.exportGenerator.generate( - absoluteTargetPath, - this.getAST(absoluteTargetPath) - ); - - // this._exportMap.set(absoluteTargetPath, exports); - return exports; - } - - return this._exportMap.get(absoluteTargetPath); - } - - getDependencies(targetPath: string): Export[] { - const absoluteTargetPath = path.resolve(targetPath); - - if (!this._dependencyMaps.has(absoluteTargetPath)) { - // Find all external imports in the file under test - const imports = this.importGenerator.generate( - absoluteTargetPath, - this.getAST(targetPath) - ); - - // For each external import scan the file for libraries with exported functions - const libraries: Export[] = []; - imports.forEach((importPath: string) => { - // Full path to the imported file - const pathLib = path.join(path.dirname(targetPath), importPath); - - // External libraries have a different path! - try { - this.getSource(pathLib); - } catch (e) { - if (e.message.includes("Cannot find source")) { - // TODO would be nice if we could get the actual path! (node modules) - return; - // pathLib = path.join - } else { - throw e; - } - } - - // Scan for libraries with public or external functions - const exports = this.getExports(pathLib); - - // Import the found libraries - // TODO: check for duplicates in libraries - libraries.push(...exports); - }); - - return libraries; - // this._dependencyMaps.set(targetPath, libraries); - } - - return this._dependencyMaps.get(absoluteTargetPath); - } - - async prepareAndInstrument(): Promise { - const absoluteRootPath = path.resolve(CONFIG.targetRootDirectory); - - const destinationPath = path.resolve( - CONFIG.tempInstrumentedDirectory, - path.basename(CONFIG.targetRootDirectory) - ); - - // copy everything - await copySync(absoluteRootPath, destinationPath); - - // overwrite the stuff that needs instrumentation - const instrumenter = new Instrumenter(); - - const targetPaths = this.targets.map((x) => x.canonicalPath); - - for (const targetPath of targetPaths) { - const source = this.getSource(targetPath); - const instrumentedSource = await instrumenter.instrument( - source, - targetPath - ); - - const _path = path - .normalize(targetPath) - .replace(absoluteRootPath, destinationPath); - - await outputFileSync(_path, instrumentedSource); - } - } - - scanTargetRootDirectory(): void { - const absoluteRootPath = path.resolve(CONFIG.targetRootDirectory); - - // TODO remove the filters - const files = getAllFiles(absoluteRootPath, ".js").filter( - (x) => - !x.includes("/test/") && - !x.includes(".test.js") && - !x.includes("node_modules") - ); // maybe we should also take those into account - - const objects: ComplexObject[] = []; - const objectGenerator = new ObjectGenerator(); - - for (const file of files) { - const exports = this.getExports(file); - objects.push( - ...objectGenerator.generate(file, this.getAST(file), exports) - ); - } - - // standard stuff - // function https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function - objects.push({ - name: "function", - properties: new Set([ - "arguments", - "caller", - "displayName", - "length", - "name", - ]), - functions: new Set(["apply", "bind", "call", "toString"]), - propertyType: new Map([ - ["arguments", new TypeProbability([[TypeEnum.ARRAY, 1, null]])], - ["caller", new TypeProbability([[TypeEnum.FUNCTION, 1, null]])], - ["displayName", new TypeProbability([[TypeEnum.STRING, 1, null]])], - ["length", new TypeProbability([[TypeEnum.NUMERIC, 1, null]])], - ["name", new TypeProbability([[TypeEnum.STRING, 1, null]])], - ]), - }); - - // array https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array - objects.push({ - name: "array", - properties: new Set(["length"]), - functions: new Set([ - "at", - "concat", - "copyWithin", - "entries", - "fill", - "filter", - "find", - "findIndex", - "flat", - "flatMap", - "includes", - "indexOf", - "join", - "keys", - "lastIndexOf", - "map", - "pop", - "push", - "reduce", - "reduceRight", - "reverse", - "shift", - "slice", - "toLocaleString", - "toString", - "unshift", - "values", - ]), - propertyType: new Map([ - ["length", new TypeProbability([[TypeEnum.NUMERIC, 1, null]])], - ]), - }); - - // string - objects.push({ - name: "string", - properties: new Set(["length"]), - functions: new Set([ - "at", - "charAt", - "charCodeAt", - "codePointAt", - "concat", - "includes", - "endsWith", - "indexOf", - "lastIndexOf", - "localeCompare", - "match", - "matchAll", - "normalize", - "padEnd", - "padStart", - "repeat", - "replace", - "replaceAll", - "search", - "slice", - "split", - "startsWith", - "substring", - "toLocaleLowerCase", - "toLocaleUpperCase", - "toLowerCase", - "toString", - "toUpperCase", - "trim", - "trimStart", - "trimEnd", - "valueOf", - ]), - propertyType: new Map([ - ["length", new TypeProbability([[TypeEnum.NUMERIC, 1, null]])], - ]), - }); - - // TODO npm dependencies - // TODO get rid of duplicates - - const finalObjects = []; - - function eqSet(as, bs) { - if (as.size !== bs.size) return false; - for (const a of as) if (!bs.has(a)) return false; - return true; - } - - objects.forEach((o) => { - if (!o.properties.size && !o.functions.size) { - return; - } - - const found = finalObjects.find((o2) => { - return ( - o.export === o2.export && // TODO not sure if you can compare exports like this - o.name === o2.name && - eqSet(o.properties, o2.properties) && - eqSet(o.functions, o2.functions) - ); - }); - - if (!found) { - finalObjects.push(o); - } - }); - - const generator = new VariableGenerator(); - const elements: Element[] = []; - const relations: Relation[] = []; - const wrapperElementIsRelation: Map = new Map(); - - for (const file of files) { - const [_elements, _relations, _wrapperElementIsRelation] = - generator.generate(file, this.getAST(file)); - - elements.push(..._elements); - relations.push(..._relations); - - for (const key of _wrapperElementIsRelation.keys()) { - wrapperElementIsRelation.set(key, _wrapperElementIsRelation.get(key)); - } - } - - this._typeResolver.resolveTypes( - elements, - relations, - wrapperElementIsRelation, - finalObjects - ); - } - - get typeResolver(): TypeResolver { - return this._typeResolver; - } -} diff --git a/libraries/javascript/lib/analysis/static/dependency/ExportGenerator.ts b/libraries/javascript/lib/analysis/static/dependency/ExportGenerator.ts deleted file mode 100644 index cd05da277..000000000 --- a/libraries/javascript/lib/analysis/static/dependency/ExportGenerator.ts +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { traverse } from "@babel/core"; -import { Export, ExportVisitor } from "./ExportVisitor"; -import { IdentifierVisitor } from "./IdentifierVisitor"; -import * as t from "@babel/types"; - -/** - * Exports generator for targets. - * - * @author Dimitri Stallenberg - */ -export class ExportGenerator { - /** - * Generate function map for specified target. - * - * @param targetPath The path of the AST - * @param targetAST The AST of the target - */ - generate(targetPath: string, targetAST: t.Node): Export[] { - const identifierVisitor = new IdentifierVisitor(targetPath); - traverse(targetAST, identifierVisitor); - - const visitor = new ExportVisitor( - targetPath, - identifierVisitor.identifiers - ); - - traverse(targetAST, visitor); - - return visitor.exports; - } -} diff --git a/libraries/javascript/lib/analysis/static/dependency/ExportVisitor.ts b/libraries/javascript/lib/analysis/static/dependency/ExportVisitor.ts deleted file mode 100644 index bbbe6d4c4..000000000 --- a/libraries/javascript/lib/analysis/static/dependency/ExportVisitor.ts +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ExportType } from "./IdentifierVisitor"; -import { AbstractSyntaxTreeVisitor } from "@syntest/ast-javascript"; - -export interface Export { - name: string; - type: ExportType; - default: boolean; - module: boolean; - filePath: string; -} - -export class ExportVisitor extends AbstractSyntaxTreeVisitor { - // TODO other export types such as module.export or exports. - - private _exports: Export[]; - private _identifiers: Map; - - constructor(filePath: string, identifiers: Map) { - super(filePath); - this._exports = []; - this._identifiers = identifiers; - } - - // exports - public ExportNamedDeclaration: (path) => void = (path) => { - if (path.node.declaration) { - if (path.node.declaration.declarations) { - for (const declaration of path.node.declaration.declarations) { - this._exports.push({ - name: declaration.id.name, - type: this._getType(declaration.init?.type, declaration), - default: false, - module: false, - filePath: this.filePath, - }); - } - } else { - this._exports.push({ - name: path.node.declaration.id.name, - type: this._getType( - path.node.declaration.type, - path.node.declaration - ), - default: false, - module: false, - filePath: this.filePath, - }); - } - } else if (path.node.specifiers) { - if (path.node.source) { - // TODO skip because we already tested it in another file - return; - } - - for (const specifier of path.node.specifiers) { - this._exports.push({ - name: specifier.local.name, - type: this._getType(specifier.local.type, specifier.local), - default: - specifier.local.name === "default" || - specifier.exported.name === "default", - module: false, - filePath: this.filePath, - }); - } - } - - // throw new Error('ANY named export') - }; - - public ExportDefaultDeclaration: (path) => void = (path) => { - let name: string; - - if (path.node.declaration.type === "Identifier") { - name = path.node.declaration.name; - } else if (path.node.declaration.type === "NewExpression") { - name = path.node.declaration.callee.name; - } else { - name = path.node.declaration.id?.name; - } - - if (!name) { - return; - } - - this._exports.push({ - name: name, - type: this._getType(path.node.declaration.type, path.node.declaration), - default: true, - module: false, - filePath: this.filePath, - }); - }; - - public ExpressionStatement: (path) => void = (path) => { - if (path.node.expression.type !== "AssignmentExpression") { - return; - } - - const left = path.get("expression").get("left"); - const right = path.get("expression").get("right"); - - let name: string; - let default_ = false; - - if (left.isIdentifier() && left.node.name === "exports") { - name = this._getName(right.node); - default_ = true; - } else if (left.isMemberExpression()) { - const object = left.get("object"); - const property = left.get("property"); - - if (object.isIdentifier()) { - if (object.node.name === "exports") { - name = this._getName(property.node); - } else if ( - object.node.name === "module" && - property.node.name === "exports" - ) { - name = this._getName(right.node); - default_ = true; - } - } else if (object.isMemberExpression()) { - const higherObject = object.get("object"); - const higherProperty = object.get("property"); - - if (higherObject.isIdentifier()) { - if ( - higherObject.node.name === "module" && - higherProperty.node.name === "exports" - ) { - name = this._getName(property.node); - } - } - } - } - - if (!name) { - return; - } - - if (right.isObjectExpression()) { - for (const property of right.node.properties) { - this._exports.push({ - name: this._getName(property.key), - type: this._getType(property.key.type, property.key), - default: default_, - module: true, - filePath: this.filePath, - }); - } - } else if (right.isArrayExpression()) { - for (const element of right.node.elements) { - this._exports.push({ - name: this._getName(element), - type: this._getType(element.type, element), - default: default_, - module: true, - filePath: this.filePath, - }); - } - } else { - this._exports.push({ - name: name, - type: this._getType(right.node.type, right.node), - default: default_, - module: true, - filePath: this.filePath, - }); - } - }; - - private _getName(node): string { - switch (node.type) { - case "Identifier": - return node.name; - case "Literal": - case "ArrayExpression": - case "ObjectExpression": - return `${node.type}`; - case "FunctionExpression": - case "ArrowFunctionExpression": - return node.id?.name || "anon"; - } - - // throw new Error(`Cannot get name of node of type ${node.type}`) - return "anon"; - } - - // util function - _getType(type: string, node): ExportType { - if ( - type === "FunctionDeclaration" || - type === "FunctionExpression" || - type === "ArrowFunctionExpression" - ) { - return ExportType.function; - } else if ( - type === "VariableDeclaration" || - type === "VariableDeclarator" - ) { - return ExportType.const; - } else if (type === "NewExpression") { - return ExportType.const; - } else if (type === "ClassDeclaration") { - return ExportType.class; - } else if (type === "Identifier") { - if (!this._identifiers.has(node.name)) { - // TODO for now we just assume const when we have not found such an identifier - return ExportType.const; - // throw new Error("Cannot find identifier that is exported: " + name + " - " + type) - } - - return this._identifiers.get(node.name); - } else if ( - type === "StringLiteral" || - type === "TemplateLiteral" || - type === "NumericLiteral" || - type === "BooleanLiteral" || - type === "RegExpLiteral" || - type === "NullLiteral" - ) { - return ExportType.const; - } - - // we dont know what this returns - // default is const - return ExportType.unknown; - } - - // getters - get exports(): Export[] { - return this._exports; - } -} diff --git a/libraries/javascript/lib/analysis/static/dependency/IdentifierVisitor.ts b/libraries/javascript/lib/analysis/static/dependency/IdentifierVisitor.ts deleted file mode 100644 index c58b0f4bd..000000000 --- a/libraries/javascript/lib/analysis/static/dependency/IdentifierVisitor.ts +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { AbstractSyntaxTreeVisitor } from "@syntest/ast-javascript"; - -export enum ExportType { - function, - class, - const, - unknown, -} - -export class IdentifierVisitor extends AbstractSyntaxTreeVisitor { - private _identifiers: Map; - - get identifiers(): Map { - return this._identifiers; - } - - constructor(filePath: string) { - super(filePath); - this._identifiers = new Map(); - } - - // identifiable stuff - public FunctionDeclaration: (path) => void = (path) => { - let identifier = path.node.id?.name; - - if (path.parent.type === "ObjectPattern") { - identifier = path.parent.key.name; - } else if (path.parent.type === "ExportDefaultDeclaration") { - identifier = "default"; - } - - if (!identifier) { - throw new Error( - `Unsupported identifier declaration: ${path.parent.type}` - ); - } - - this._identifiers.set(identifier, ExportType.function); - }; - - public ClassDeclaration: (path) => void = (path) => { - const identifier = path.node.id.name; - this._identifiers.set(identifier, ExportType.class); - }; - - public VariableDeclaration: (path) => void = (path) => { - for (const declaration of path.node.declarations) { - const identifier = declaration.id.name; - - if (declaration.id.type === "ObjectPattern") { - // TODO support this - continue; - } - - if (!declaration.init) { - this._identifiers.set(identifier, ExportType.unknown); - } else if ( - declaration.init.type === "ArrowFunctionExpression" || - declaration.init.type === "FunctionExpression" - ) { - this._identifiers.set(identifier, ExportType.function); // not always the case - } else { - this._identifiers.set(identifier, ExportType.const); // not always the case - } - } - }; -} diff --git a/libraries/javascript/lib/analysis/static/dependency/ImportVisitor.ts b/libraries/javascript/lib/analysis/static/dependency/ImportVisitor.ts deleted file mode 100644 index a310e4663..000000000 --- a/libraries/javascript/lib/analysis/static/dependency/ImportVisitor.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { AbstractSyntaxTreeVisitor } from "@syntest/ast-javascript"; - -export class ImportVisitor extends AbstractSyntaxTreeVisitor { - private _imports: Set; - - constructor(filePath) { - super(filePath); - this._imports = new Set(); - } - - public ImportDeclaration: (path) => void = (path) => { - this._imports.add(path.node.source.value); - }; - - public CallExpression: (path) => void = (path) => { - if (path.node.callee.name === "require") { - if (path.node.arguments[0].type === "StringLiteral") { - this._imports.add(path.node.arguments[0].value); - } else { - // This tool does not support dynamic require statements. - // throw new Error("This tool does not support dynamic require statements.") - } - } - }; - - get imports(): Set { - return this._imports; - } -} diff --git a/libraries/javascript/lib/analysis/static/map/TargetVisitor.ts b/libraries/javascript/lib/analysis/static/map/TargetVisitor.ts deleted file mode 100644 index e207031eb..000000000 --- a/libraries/javascript/lib/analysis/static/map/TargetVisitor.ts +++ /dev/null @@ -1,497 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { TargetMetaData } from "@syntest/core"; -import { ActionType } from "../parsing/ActionType"; -import { ActionVisibility } from "../parsing/ActionVisibility"; -import { ActionDescription } from "../parsing/ActionDescription"; -import { TypeProbability } from "../types/resolving/TypeProbability"; -import { AbstractSyntaxTreeVisitor } from "@syntest/ast-javascript"; -import { IdentifierDescription } from "../parsing/IdentifierDescription"; -import { ComplexObject } from "../types/discovery/object/ComplexObject"; -import * as t from "@babel/types"; - -export class TargetVisitor extends AbstractSyntaxTreeVisitor { - private _targetMap: Map; - private _functionMap: Map>; - - constructor(filePath: string) { - super(filePath); - this._targetMap = new Map(); - this._functionMap = new Map>(); - } - - _createMaps(targetName) { - if (!this._targetMap.has(targetName)) { - this._targetMap.set(targetName, { - name: targetName, - }); - - this._functionMap.set(targetName, new Map()); - } - } - - // classic function declarations - public FunctionExpression: (path) => void = (path) => { - if ( - path.parent.type === "CallExpression" || - path.parent.type === "NewExpression" || - path.parent.type === "ReturnStatement" || - path.parent.type === "LogicalExpression" || - path.parent.type === "ConditionalExpression" || - path.parent.type === "AssignmentExpression" - ) { - // anonymous argument function cannot call is not target - return; - } - - let targetName; - - if (path.node.id) { - targetName = path.node.id.name; - } else if (path.parent.type === "ObjectProperty") { - // get identifier from assignment expression - if (path.parent.key.type === "Identifier") { - targetName = path.parent.key.name; - } else if (path.parent.key.type === "StringLiteral") { - targetName = path.parent.key.value; - } else { - console.log(path); - throw new Error("unknown function expression name"); - } - } else if (path.parent.type === "VariableDeclarator") { - // get identifier from assignment expression - if (path.parent.id.type === "Identifier") { - targetName = path.parent.id.name; - } else { - throw new Error("unknown function expression name"); - } - } else { - throw new Error("unknown function expression name"); - } - - const functionName = targetName; - - this._createMaps(targetName); - - this._functionMap.get(targetName).set(functionName, { - scope: { - uid: `${path.scope.uid - this.scopeIdOffset}`, - filePath: this.filePath, - }, - name: functionName, - type: ActionType.FUNCTION, - visibility: ActionVisibility.PUBLIC, - isConstructor: false, - parameters: path.node.params.map((x) => this._extractParam(x)), - returnParameter: { - name: "returnValue", - typeProbabilityMap: new TypeProbability(), // TODO unknown because javascript! (check how this looks in typescript) - }, - isStatic: path.node.static, - isAsync: path.node.async, - }); - }; - - // Program: (path) => void = (path) => { - // if (this.scopeIdOffset === undefined) { - // this.scopeIdOffset = path.scope.uid - // } - // - // for (const key of Object.keys(path.scope.bindings)) { - // const binding = path.scope.bindings[key] - // - // const newScopeUid = binding.path.scope.uid - // - // const node = binding.path.node - // - // if (node.type === 'VariableDeclarator') { - // let init = node.init - // - // if (!init) { - // continue - // } - // - // // - // // while (init.type === 'Identifier') { - // // if (!path.scope.hasBinding(init.name)) { - // // break - // // } - // // init = path.scope.bindings[init.name].path.node - // // } - // // - // if (init.type === "ArrowFunctionExpression") { - // const targetName = binding.identifier.name - // this._createMaps(targetName) - // this._createFunction(newScopeUid, targetName, targetName, init) - // } - // - // } else if (node.type === 'ClassDeclaration') { - // const targetName = node.id.name; - // this._createMaps(targetName) - // } else if (node.type === 'FunctionDeclaration') { - // const targetName = node.id.name; - // this._createMaps(targetName) - // this._createFunction(newScopeUid, targetName, targetName, node) - // } - // } - // } - - public ClassDeclaration: (path) => void = (path) => { - const targetName = path.node.id.name; - - this._createMaps(targetName); - }; - - public FunctionDeclaration: (path) => void = (path) => { - const targetName = path.node.id.name; - const functionName = targetName; - - this._createMaps(targetName); - - this._functionMap.get(targetName).set(functionName, { - scope: { - uid: `${path.scope.uid - this.scopeIdOffset}`, - filePath: this.filePath, - }, - name: functionName, - type: ActionType.FUNCTION, - visibility: ActionVisibility.PUBLIC, - isConstructor: false, - parameters: path.node.params.map((x) => this._extractParam(x)), - returnParameter: { - name: "returnValue", - typeProbabilityMap: new TypeProbability(), - }, - isStatic: path.node.static, - isAsync: path.node.async, - }); - }; - - public ClassMethod: (path) => void = (path) => { - const targetName = path.parentPath.parentPath.node.id.name; - const functionName = path.node.key.name; - - let visibility = ActionVisibility.PUBLIC; - if (path.node.access === "private") { - visibility = ActionVisibility.PRIVATE; - } else if (path.node.access === "protected") { - visibility = ActionVisibility.PROTECTED; - } - - this._functionMap.get(targetName).set(`${path.node.kind}#${functionName}`, { - scope: { - uid: `${path.scope.uid - this.scopeIdOffset}`, - filePath: this.filePath, - }, - name: functionName, - type: path.node.kind, - visibility: visibility, - isConstructor: path.node.kind === "constructor", - parameters: path.node.params.map((x) => this._extractParam(x)), - returnParameter: { - name: "returnValue", - typeProbabilityMap: new TypeProbability(), // TODO unknown because javascript! (check how this looks in typescript) - }, - isStatic: path.node.static, - isAsync: path.node.async, - }); - }; - - public VariableDeclarator: (path) => void = (path) => { - if (!path.node.init) { - return; - } - - if ( - !( - path.node.init.type === "ArrowFunctionExpression" || - path.node.init.type === "FunctionExpression" - ) - ) { - return; - } - - const targetName = path.node.id.name; - const functionName = targetName; - - this._createMaps(targetName); - - let scope; - path.traverse({ - ArrowFunctionExpression: { - enter: (p) => { - scope = { - uid: `${p.scope.uid - this.scopeIdOffset}`, - filePath: this.filePath, - }; - }, - }, - FunctionExpression: { - enter: (p) => { - scope = { - uid: `${p.scope.uid - this.scopeIdOffset}`, - filePath: this.filePath, - }; - }, - }, - }); - - this._functionMap.get(targetName).set(functionName, { - scope: scope, - name: functionName, - type: ActionType.FUNCTION, - visibility: ActionVisibility.PUBLIC, - isConstructor: false, - parameters: path.node.init.params.map((x) => this._extractParam(x)), - returnParameter: { - name: "returnValue", - typeProbabilityMap: new TypeProbability(), // TODO unknown because javascript! (check how this looks in typescript) - }, - isStatic: path.node.init.static, - isAsync: path.node.init.async, - }); - }; - - // prototyping - public AssignmentExpression: (path) => void = (path) => { - if (path.node.right.type !== "FunctionExpression") { - return; - } - - let scope; - path.traverse({ - FunctionExpression: { - enter: (p) => { - scope = { - uid: `${p.scope.uid - this.scopeIdOffset}`, - filePath: this.filePath, - }; - }, - }, - }); - - let targetName; - - if (path.node.left.type === "MemberExpression") { - if ( - path.node.left.object.name === "module" && - path.node.left.property.name === "exports" - ) { - targetName = path.node.right.id?.name; - - if (!targetName) { - targetName = "anon"; - } - } else if (path.node.left.object.name === "exports") { - targetName = path.node.left.property.name; - } else if ( - path.node.left.object.type === "MemberExpression" && - path.node.left.object.property.name === "prototype" - ) { - targetName = path.node.left.object.object.name; - const functionName = path.node.left.property.name; - - if (path.node.left.computed) { - // we cannot know the name of computed properties unless we find out what the identifier refers to - // see line 136 of Axios.js as example - // Axios.prototype[method] = ? - return; - } - - if (functionName === "method") { - throw new Error("Invalid functionName"); - } - - if (!this._functionMap.has(targetName)) { - this._createMaps(targetName); - // modify original - // but there is no original so... no constructor? - } else { - // modify original - this._functionMap.get(targetName).get(targetName).type = - ActionType.CONSTRUCTOR; - this._functionMap.get(targetName).get(targetName).isConstructor = - true; - } - - // TODO this one is probably wrong - - this._functionMap.get(targetName).set(functionName, { - scope: scope, - name: functionName, - type: - functionName === "constructor" - ? ActionType.CONSTRUCTOR - : ActionType.METHOD, - visibility: ActionVisibility.PUBLIC, - isConstructor: functionName === "constructor", - parameters: path.node.right.params.map((x) => this._extractParam(x)), - returnParameter: { - name: "returnValue", - typeProbabilityMap: new TypeProbability(), // TODO unknown because javascript! (check how this looks in typescript) - }, - isStatic: path.node.right.static, - isAsync: path.node.right.async, - }); - return; - } else { - targetName = path.node.left.object.name; - const functionName = path.node.left.property.name; - - if (path.node.left.computed) { - // we cannot know the name of computed properties unless we find out what the identifier refers to - // see line 136 of Axios.js as example - // Axios.prototype[method] = ? - return; - } - - if (functionName === "method") { - throw new Error("Invalid functionName"); - } - - if (!this._functionMap.has(targetName)) { - this._createMaps(targetName); - // modify original - // but there is no original so... no constructor? - } - - if (this.functionMap.get(targetName).has(targetName)) { - // modify original - this._functionMap.get(targetName).get(targetName).type = - ActionType.CONSTRUCTOR; - this._functionMap.get(targetName).get(targetName).isConstructor = - true; - } - - // TODO this one is probably wrong - - this._functionMap.get(targetName).set(functionName, { - scope: scope, - name: functionName, - type: ActionType.METHOD, - visibility: ActionVisibility.PUBLIC, - isConstructor: false, - parameters: path.node.right.params.map((x) => this._extractParam(x)), - returnParameter: { - name: "returnValue", - typeProbabilityMap: new TypeProbability(), // TODO unknown because javascript! (check how this looks in typescript) - }, - isStatic: path.node.right.static, - isAsync: path.node.right.async, - }); - return; - } - } else if (path.node.left.type === "Identifier") { - targetName = path.node.left.name; - } else { - throw new Error("unknown function expression name"); - } - - if (!this.targetMap.has(targetName)) { - this._createMaps(targetName); - } - - this._functionMap.get(targetName).set(targetName, { - scope: scope, - name: targetName, - type: ActionType.FUNCTION, - visibility: ActionVisibility.PUBLIC, - isConstructor: false, - parameters: path.node.right.params.map((x) => this._extractParam(x)), - returnParameter: { - name: "returnValue", - typeProbabilityMap: new TypeProbability(), // TODO unknown because javascript! (check how this looks in typescript) - }, - isStatic: path.node.right.static, - isAsync: path.node.right.async, - }); - }; - - _extractParam(param: t.Node): IdentifierDescription { - if (param.type === "RestElement") { - // TODO this can actually be an infinite amount of arguments... - return this._extractParam(param.argument); - } - - if (param.type === "AssignmentPattern") { - return this._extractParam(param.left); - } - - if (param.type === "ObjectPattern") { - const typeProbability = new TypeProbability(); - - const object: ComplexObject = { - name: "objectPattern", - properties: new Set( - param.properties.map( - (x) => - this._extractParam( - x.type === "ObjectProperty" ? x.key : x.argument - ).name - ) - ), // TODO resolve these types - functions: new Set(), - }; - - typeProbability.addType("object", 1, object); - return { - name: `objectPattern`, - typeProbabilityMap: typeProbability, - }; - } - - if (param.type === "ArrayPattern") { - const typeProbability = new TypeProbability(); - - const object: ComplexObject = { - name: "arrayPattern", - properties: new Set( - param.elements.map((x) => this._extractParam(x).name) - ), // TODO resolve these types - functions: new Set(), - }; - - typeProbability.addType("array", 1, object); - - return { - name: `arrayPattern`, - typeProbabilityMap: typeProbability, - }; - } - - if (param.type === "Identifier") { - return { - name: param.name, - typeProbabilityMap: undefined, - }; - } - - throw new Error( - `Unknown param ${JSON.stringify(param)}\n ${this.filePath}` - ); - } - - get targetMap(): Map { - return this._targetMap; - } - - get functionMap(): Map> { - return this._functionMap; - } -} diff --git a/libraries/javascript/lib/analysis/static/parsing/ActionDescription.ts b/libraries/javascript/lib/analysis/static/parsing/ActionDescription.ts deleted file mode 100644 index b52275f13..000000000 --- a/libraries/javascript/lib/analysis/static/parsing/ActionDescription.ts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { IdentifierDescription } from "./IdentifierDescription"; -import { ActionType } from "./ActionType"; -import { ActionVisibility } from "./ActionVisibility"; -import { Scope } from "@syntest/ast-javascript"; -import { ActionDescription as CoreActionDescription } from "@syntest/core/dist/analysis/static/ActionDescription"; - -/** - * Interface for a Action Description. - * - * @author Dimitri Stallenberg - */ -export interface ActionDescription extends CoreActionDescription { - scope: Scope; - type: ActionType; - - visibility: ActionVisibility; - - isConstructor: boolean; - isStatic: boolean; - isAsync: boolean; - - parameters: IdentifierDescription[]; - returnParameter: IdentifierDescription; -} diff --git a/libraries/javascript/lib/analysis/static/types/discovery/ElementTypeMap.ts b/libraries/javascript/lib/analysis/static/types/discovery/ElementTypeMap.ts deleted file mode 100644 index d79aeb09a..000000000 --- a/libraries/javascript/lib/analysis/static/types/discovery/ElementTypeMap.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Element } from "@syntest/ast-javascript"; -import { TypeProbability } from "../resolving/TypeProbability"; - -export class ElementTypeMap { - private elementMap: Map; - private typeMap: Map; - - constructor() { - this.elementMap = new Map(); - this.typeMap = new Map(); - } - - elementAsString(element: Element) { - if (!element.scope) { - return `scope=null; - type=${element.type}; - value=${element.value}`; - } - return `scope={ - name=${element.scope.uid}; - filePath=${element.scope.filePath} - }; - type=${element.type}; - value=${element.value}`; - } - - set(element: Element, typeProbability: TypeProbability) { - const elString = this.elementAsString(element); - - this.elementMap.set(elString, element); - this.typeMap.set(elString, typeProbability); - } - - has(element: Element): boolean { - const elString = this.elementAsString(element); - - return this.elementMap.has(elString); - } - - get(element: Element): TypeProbability { - const elString = this.elementAsString(element); - - return this.typeMap.get(elString); - } - - keys(): IterableIterator { - return this.elementMap.values(); - } - - values(): IterableIterator { - return this.typeMap.values(); - } -} diff --git a/libraries/javascript/lib/analysis/static/types/discovery/Relation.ts b/libraries/javascript/lib/analysis/static/types/discovery/Relation.ts deleted file mode 100644 index a00901fdd..000000000 --- a/libraries/javascript/lib/analysis/static/types/discovery/Relation.ts +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Element } from "@syntest/ast-javascript"; - -// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators -// TODO add missing - -export interface Relation { - relation: RelationType; - involved: Element[]; - computed?: boolean; -} - -export enum RelationType { - // Primary Expressions - // TODO others - FunctionDefinition = "L_R", - ClassDefinition = "class L", - - Await = "await L", - - // object - Object = "{L}", // TODO not correct L doesnt matter - ObjectProperty = "L:R", - - // array - Array = "[L]", - Sequence = "(L,R)", - - // Left-hand-side Expressions - PropertyAccessor = "L.R", - New = "new L()", - // TODO new.target - // TODO import.meta - // TODO super - Spread = "...L", - - // UNARY - // Increment and Decrement - PlusPlusPostFix = "L++", - MinusMinusPostFix = "L--", - PlusPlusPrefix = "++L", - MinusMinusPrefix = "--L", - - // Unary - Delete = "delete L", - Void = "void L", - TypeOf = "typeof L", - PlusUnary = "+L", - MinusUnary = "-L", - BitwiseNotUnary = "~L", - LogicalNotUnary = "!L", - - // BINARY - // Arithmetic - Addition = "L+R", - Subtraction = "L-R", - Division = "L/R", - Multiplication = "L*R", - Remainder = "L%R", - Exponentiation = "L**R", - - // Relation - In = "L in R", - InstanceOf = "L instanceof R", - Less = "L": - return RelationType.Greater; - case "<=": - return RelationType.LessOrEqual; - case ">=": - return RelationType.GreaterOrEqual; - - case "==": - return RelationType.Equality; - case "!=": - return RelationType.InEquality; - case "===": - return RelationType.StrictEquality; - case "!==": - return RelationType.StrictInequality; - - case "<<": - return RelationType.BitwiseLeftShift; - case ">>": - return RelationType.BitwiseRightShift; - case ">>>": - return RelationType.BitwiseUnsignedRightShift; - - case "&": - return RelationType.BitwiseAnd; - case "|": - return RelationType.BitwiseOr; - case "^": - return RelationType.BitwiseXor; - - case "&&": - return RelationType.LogicalAnd; - case "||": - return RelationType.LogicalAnd; - case "??": - return RelationType.NullishCoalescing; - } - } else if (type === "assignment") { - switch (operator) { - case "=": - return RelationType.Assignment; - case "*=": - return RelationType.MultiplicationAssignment; - case "**=": - return RelationType.ExponentiationAssignment; - case "/=": - return RelationType.DivisionAssignment; - case "%=": - return RelationType.RemainderAssigment; - case "+=": - return RelationType.AdditionAssignment; - case "-=": - return RelationType.SubtractionAssignment; - case "<<=": - return RelationType.LeftShiftAssignment; - case ">>=": - return RelationType.RightShiftAssignment; - case ">>>=": - return RelationType.UnSignedRightShiftAssignment; - case "&=": - return RelationType.BitwiseAndAssignment; - case "^=": - return RelationType.BitwiseXorAssignment; - case "|=": - return RelationType.BitwiseOrAssignment; - case "&&=": - return RelationType.LogicalAndAssignment; - case "||=": - return RelationType.LogicalOrAssignment; - case "??=": - return RelationType.LogicalNullishAssignment; - } - } - - throw new Error(`Unsupported relation type operator: ${type} -> ${operator}`); -} diff --git a/libraries/javascript/lib/analysis/static/types/discovery/VariableGenerator.ts b/libraries/javascript/lib/analysis/static/types/discovery/VariableGenerator.ts deleted file mode 100644 index 92ad0eab9..000000000 --- a/libraries/javascript/lib/analysis/static/types/discovery/VariableGenerator.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { traverse } from "@babel/core"; -import { VariableVisitor } from "./VariableVisitor"; -import * as t from "@babel/types"; -import { Element } from "@syntest/ast-javascript"; -import { Relation } from "./Relation"; -/** - * Typing generator for targets. - * - * @author Dimitri Stallenberg - */ -export class VariableGenerator { - /** - * Generate function map for specified target. - * - * @param filePath the path of the current file - * @param targetAST The AST of the target - */ - generate( - filePath: string, - targetAST: t.Node - ): [Element[], Relation[], Map] { - const visitor = new VariableVisitor(filePath); - - traverse(targetAST, visitor); - - return [ - visitor.elements, - visitor.relations, - visitor.wrapperElementIsRelation, - ]; - } -} diff --git a/libraries/javascript/lib/analysis/static/types/discovery/VariableVisitor.ts b/libraries/javascript/lib/analysis/static/types/discovery/VariableVisitor.ts deleted file mode 100644 index d0fe5dbd7..000000000 --- a/libraries/javascript/lib/analysis/static/types/discovery/VariableVisitor.ts +++ /dev/null @@ -1,563 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Element, ElementType, getElementId } from "@syntest/ast-javascript"; -import { getRelationType, Relation, RelationType } from "./Relation"; -import { AbstractSyntaxTreeVisitor } from "@syntest/ast-javascript"; - -// TODO return -export class VariableVisitor extends AbstractSyntaxTreeVisitor { - private _relations: Relation[]; - private _wrapperElementIsRelation: Map; - - private _elementStore: Map; - - get wrapperElementIsRelation(): Map { - return this._wrapperElementIsRelation; - } - - get elements(): Element[] { - const _elements: Set = new Set(); - - // todo maybe not return relation elements - for (const relation of this.relations) { - for (const element of relation.involved) { - _elements.add(element); - } - } - - return [..._elements]; - } - - get relations(): Relation[] { - return this._relations; - } - - constructor(filePath: string) { - super(filePath); - this._relations = []; - this._wrapperElementIsRelation = new Map(); - - this._elementStore = new Map(); - } - - // context - // eslint-disable-next-line - public ClassDeclaration: (path) => void = (path) => {}; - - public ClassMethod: (path) => void = (path) => { - if (path.node.kind === "constructor") { - // TODO - return; - } - - const involved: Element[] = [this._getElement(path.get("key"))]; - - for (const param of path.get("params")) { - involved.push(this._getElement(param)); - } - - const relation: Relation = { - relation: RelationType.FunctionDefinition, - involved: involved, - }; - - this.relations.push(relation); - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - }; - - public FunctionDeclaration: (path) => void = (path) => { - const involved: Element[] = [this._getElement(path.get("id"))]; - - for (const param of path.get("params")) { - involved.push(this._getElement(param)); - } - - const relation: Relation = { - relation: RelationType.FunctionDefinition, - involved: involved, - }; - - this.relations.push(relation); - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - }; - - public ArrowFunctionExpression: (path) => void = (path) => { - const involved: Element[] = [this._getElement(path)]; - - for (const param of path.get("params")) { - involved.push(this._getElement(param)); - } - - const relation: Relation = { - relation: RelationType.FunctionDefinition, - involved: involved, - }; - - this.relations.push(relation); - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - }; - - public FunctionExpression: (path) => void = (path) => { - const involved: Element[] = [this._getElement(path)]; - - for (const param of path.get("params")) { - involved.push(this._getElement(param)); - } - - const relation: Relation = { - relation: RelationType.FunctionDefinition, - involved: involved, - }; - - this.relations.push(relation); - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - }; - - public ClassExpression: (path) => void = (path) => { - const involved: Element[] = [this._getElement(path)]; - - const relation: Relation = { - relation: RelationType.ClassDefinition, - involved: involved, - }; - - this.relations.push(relation); - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - }; - - public CallExpression: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.Call, - involved: [ - this._getElement(path.get("callee")), - ...path.get("arguments").map((a) => { - return this._getElement(a); - }), - ], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public VariableDeclarator: (path) => void = (path) => { - if (!path.node.init) { - // if the variable is not instantiated we skip it - return; - } - const relation: Relation = { - relation: getRelationType("assignment", "="), - involved: [ - this._getElement(path.get("id")), - this._getElement(path.get("init")), - ], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - // operations - // public ReturnStatement: (path) => void = (path) => { - // // get the name of the function that we are returning - // const functionScope = [...this._currentScopeStack].reverse().find((s) => s.identifierDescription === ScopeType.Method || s.identifierDescription === ScopeType.FUNCTION) - // // get the corresponding variable of the function - // const variable = this._getVariableInScope(functionScope.name) - // - // variable.usage.push({ - // identifierDescription: UsageType.Return, - // operation: "", - // usedVariable: `${path.node.argument.start}-${path.node.argument.end}` - // }) - // } - - // unary - public UnaryExpression: (path) => void = (path) => { - const relation: Relation = { - relation: getRelationType("unary", path.node.operator, path.node.prefix), - involved: [this._getElement(path.get("argument"))], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public UpdateExpression: (path) => void = (path) => { - const relation: Relation = { - relation: getRelationType("unary", path.node.operator), - involved: [this._getElement(path.get("argument"))], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public RestElement: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.Spread, - involved: [this._getElement(path.get("argument"))], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public ArrayExpression: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.Array, - involved: path.get("elements").map((e) => { - if (!e.node) { - return { - type: ElementType.NullConstant, - value: null, - }; - } - return this._getElement(e); - }), - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public ObjectExpression: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.Object, - involved: path.get("properties").map((p) => { - return this._getElement(p); - }), - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public AssignmentExpression: (path) => void = (path) => { - const relation: Relation = { - relation: getRelationType("assignment", path.node.operator), - involved: [ - this._getElement(path.get("left")), - this._getElement(path.get("right")), - ], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public AwaitExpression: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.Await, - involved: [this._getElement(path.get("argument"))], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - // binary - public BinaryExpression: (path) => void = (path) => { - const relation: Relation = { - relation: getRelationType("binary", path.node.operator), - involved: [ - this._getElement(path.get("left")), - this._getElement(path.get("right")), - ], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public LogicalExpression: (path) => void = (path) => { - const relation: Relation = { - relation: getRelationType("binary", path.node.operator), - involved: [ - this._getElement(path.get("left")), - this._getElement(path.get("right")), - ], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public MemberExpression: (path) => void = (path) => { - // if (path.node.object.type === "ThisExpression") { - // // set the scope to the first "thisable" scope - // scope = this._scopes - // .reverse() - // .find((s) => - // s.type === ScopeType.Object - // || s.type === ScopeType.Class - // || s.type === ScopeType.Function - // ) - // } - - const relation: Relation = { - relation: RelationType.PropertyAccessor, - involved: [ - this._getElement(path.get("object")), - this._getElement(path.get("property")), - ], - computed: path.node.computed, - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - // ternary - public ConditionalExpression: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.Conditional, - involved: [ - this._getElement(path.get("test")), - this._getElement(path.get("consequent")), - this._getElement(path.get("alternate")), - ], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public SpreadElement: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.Spread, - involved: [this._getElement(path.get("argument"))], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public NewExpression: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.New, - involved: [ - this._getElement(path.get("callee")), - ...path.get("arguments").map((a) => this._getElement(a)), - ], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public SequenceExpression: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.Sequence, - involved: [...path.get("expressions").map((e) => this._getElement(e))], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public ObjectProperty: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.ObjectProperty, - involved: [ - this._getElement(path.get("key")), - this._getElement(path.get("value")), - ], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public ObjectMethod: (path) => void = (path) => { - const involved: Element[] = [this._getElement(path.get("key"))]; - - for (const param of path.get("params")) { - involved.push(this._getElement(param)); - } - - const relation: Relation = { - relation: RelationType.FunctionDefinition, - involved: involved, - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public AssignmentPattern: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.Assignment, - involved: [ - this._getElement(path.get("left")), - this._getElement(path.get("right")), - ], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public ObjectPattern: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.Object, - involved: [...path.get("properties").map((p) => this._getElement(p))], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public ArrayPattern: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.Array, - involved: [ - ...path.get("elements").map((e) => { - if (!e.node) { - return { - type: ElementType.NullConstant, - value: null, - }; - } - return this._getElement(e); - }), - ], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public PrivateName: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.PrivateName, - involved: [this._getElement(path.get("id"))], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - public MetaProperty: (path) => void = (path) => { - const relation: Relation = { - relation: RelationType.PropertyAccessor, - involved: [ - this._getElement(path.get("meta")), - this._getElement(path.get("property")), - ], - }; - - this._wrapperElementIsRelation.set( - `%-${this.filePath}-${path.node.start}-${path.node.end}`, - relation - ); - this.relations.push(relation); - }; - - _getElement(path) { - const element = super._getElement(path); - const elementId = getElementId(element); - - if (!this._elementStore.has(elementId)) { - this._elementStore.set(elementId, element); - } - - return this._elementStore.get(elementId); - } -} diff --git a/libraries/javascript/lib/analysis/static/types/discovery/object/ComplexObject.ts b/libraries/javascript/lib/analysis/static/types/discovery/object/ComplexObject.ts deleted file mode 100644 index 2d713a709..000000000 --- a/libraries/javascript/lib/analysis/static/types/discovery/object/ComplexObject.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { TypeProbability } from "../../resolving/TypeProbability"; -import { Export } from "../../../dependency/ExportVisitor"; - -export interface ComplexObject { - export?: Export; - name: string; - properties: Set; - functions: Set; - propertyType?: Map; -} diff --git a/libraries/javascript/lib/analysis/static/types/discovery/object/ObjectGenerator.ts b/libraries/javascript/lib/analysis/static/types/discovery/object/ObjectGenerator.ts deleted file mode 100644 index 6494bc35c..000000000 --- a/libraries/javascript/lib/analysis/static/types/discovery/object/ObjectGenerator.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { traverse } from "@babel/core"; -import { ObjectVisitor } from "./ObjectVisitor"; -import { ComplexObject } from "./ComplexObject"; -import { Export } from "../../../dependency/ExportVisitor"; -import * as t from "@babel/types"; - -/** - * Typing generator for targets. - * - * @author Dimitri Stallenberg - */ -export class ObjectGenerator { - /** - * Generate function map for specified target. - * - * @param filePath the path of the current file - * @param targetAST The AST of the target - */ - generate( - filePath: string, - targetAST: t.Node, - exports: Export[] - ): ComplexObject[] { - const visitor = new ObjectVisitor(filePath, exports); - - traverse(targetAST, visitor); - - return visitor.objects; - } -} diff --git a/libraries/javascript/lib/analysis/static/types/discovery/object/ObjectVisitor.ts b/libraries/javascript/lib/analysis/static/types/discovery/object/ObjectVisitor.ts deleted file mode 100644 index db00187ed..000000000 --- a/libraries/javascript/lib/analysis/static/types/discovery/object/ObjectVisitor.ts +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ComplexObject } from "./ComplexObject"; -import { AbstractSyntaxTreeVisitor } from "@syntest/ast-javascript"; -import { Export } from "../../../dependency/ExportVisitor"; - -export class ObjectVisitor extends AbstractSyntaxTreeVisitor { - private _exports: Export[]; - private _objects: ComplexObject[]; - private _objectStack: ComplexObject[]; - - get objects(): ComplexObject[] { - return this._objects; - } - - constructor(filePath: string, exports: Export[]) { - super(filePath); - this._exports = exports; - this._objects = []; - this._objectStack = []; - - const object: ComplexObject = { - name: "global", - properties: new Set(), - functions: new Set(), - }; - - this._objects.push(object); - this._objectStack.push(object); - } - - private _enterObject(_object: ComplexObject) { - this._objectStack.push(_object); - } - - private _exitObject(node) { - if ((node.id ? node.id.name : "anon") !== this._currentObject().name) { - throw new Error("Exiting wrong object!"); - } - this._objectStack.pop(); - } - - private _currentObject() { - if (!this._objectStack.length) { - throw new Error("No current object available! " + this.filePath); - } - - return this._objectStack[this._objectStack.length - 1]; - } - - // context - public ClassDeclaration = { - enter: (path) => { - const name = path.node.id.name; - const _export = this._exports.find((e) => e.name === name); - - const _object: ComplexObject = { - export: _export, - name: name, - properties: new Set(), - functions: new Set(), - }; - - for (const classElement of path.node.body.body) { - if ( - classElement.type === "ClassProperty" || - classElement.type === "ClassPrivateProperty" - ) { - _object.properties.add(classElement.key.name); - } else if (classElement.type === "ClassMethod") { - _object.functions.add(classElement.key.name); - } else { - throw new Error( - `unsupported class element: ${classElement.type}\n${this.filePath}` - ); - } - } - - this._objects.push(_object); - this._enterObject(_object); - }, - exit: (path) => this._exitObject(path.node), - }; - - public FunctionDeclaration = { - enter: (path) => { - const name = path.node.id?.name || "anon"; - const _export = this._exports.find((e) => e.name === name); - - const _object: ComplexObject = { - export: _export, - name: name, - properties: new Set(), - functions: new Set(), - }; - - this._objects.push(_object); - this._enterObject(_object); - }, - exit: (path) => this._exitObject(path.node), - }; - - public FunctionExpression = { - enter: (path) => { - const name = path.node.id?.name || "anon"; - const _export = this._exports.find((e) => e.name === name); - // TODO find the object where we are assigning to if its an assignment - const _object: ComplexObject = { - export: _export, - name: name, - properties: new Set(), - functions: new Set(), - }; - - this._objects.push(_object); - this._enterObject(_object); - }, - exit: (path) => this._exitObject(path.node), - }; - - public ObjectExpression = { - enter: (path) => { - const name = path.node.id?.name || "anon"; - const _export = this._exports.find((e) => e.name === name); - // TODO find the object where we are assigning to if its an assignment - const _object: ComplexObject = { - export: _export, - name: name, - properties: new Set(), - functions: new Set(), - }; - - for (const prop of path.node.properties) { - if (prop.type === "ObjectMethod") { - _object.functions.add(prop.key.name); - } else if (prop.type === "ObjectProperty") { - _object.properties.add(prop.key.name); - } else { - // TODO spread element - } - } - - this._objects.push(_object); - this._enterObject(_object); - }, - exit: (path) => this._exitObject(path.node), - }; - - public MemberExpression: (path) => void = (path) => { - if (path.node.computed) { - return; - } - - // TODO support for prototyping (./axios/lib/cancel/Cancel.js) - if (path.node.object.type === "ThisExpression") { - const _object = this._currentObject(); - - if (path.parent.type === "CallExpression") { - _object.functions.add(path.node.property.name); - } else { - _object.properties.add(path.node.property.name); - } - } - }; - - // TODO add interface stuff -} diff --git a/libraries/javascript/lib/analysis/static/types/resolving/TypeProbability.ts b/libraries/javascript/lib/analysis/static/types/resolving/TypeProbability.ts deleted file mode 100644 index 782a356d3..000000000 --- a/libraries/javascript/lib/analysis/static/types/resolving/TypeProbability.ts +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { TypeEnum } from "./TypeEnum"; -import { CONFIG, prng } from "@syntest/core"; -import { ComplexObject } from "../discovery/object/ComplexObject"; -import { JavaScriptArguments } from "../../../../JavaScriptLauncher"; - -/** - * Type Probability Map - * Stores information about the probability a certain element/relation is a certain identifierDescription - * - * @author Dimitri Stallenberg - */ - -export class TypeProbability { - private id: string; - objectDescription: Map; - private objectPropertyTypes: Map>; - - private scores: Map; - private probabilities: Map; - - private typeIsTypeProbability: Map; - - totalScores: number; - scoresChanged: boolean; - - private executionScores: Map; - - getObjectDescription(type: string): ComplexObject { - return this.objectDescription.get(type); - } - - getPropertyTypes(type: string): Map { - return this.objectPropertyTypes.get(type); - } - - /** - * Constructor - */ - constructor( - initialTypes?: [string | TypeProbability, number, ComplexObject | null][] - ) { - this.id = prng.uniqueId(); - - this.objectDescription = new Map(); - this.objectPropertyTypes = new Map(); - this.scores = new Map(); - this.probabilities = new Map(); - this.typeIsTypeProbability = new Map(); - this.totalScores = 0; - this.scoresChanged = true; - - this.executionScores = new Map(); - - if (initialTypes) { - initialTypes.forEach((x) => this.addType(x[0], x[1], x[2])); - } - } - - /** - * Add a (new) identifierDescription to the probability map - * @param type the (new) identifierDescription - * @param score the score of identifierDescription (higher score means higher probability) - */ - addType( - type: string | TypeProbability, - score, - objectDescription: ComplexObject = null, - propertyTypes: Map = null - ) { - if (score <= 0) { - throw new Error("Type must be compatible"); - } - - if (type instanceof TypeProbability) { - const id = type.getIdentifier(); - - this.typeIsTypeProbability.set(id, type); - - type = id; - } - - if (!this.scores.has(type)) { - this.scores.set(type, 0); - } - - if (objectDescription) { - this.objectDescription.set(type, objectDescription); - - if (propertyTypes) { - this.objectPropertyTypes.set(type, propertyTypes); - } else { - this.objectPropertyTypes.set(type, new Map()); - } - } - - this.scores.set(type, this.scores.get(type) + score); - - this.totalScores += score; - this.scoresChanged = true; - } - - /** - * Calculates the actual probabilities for each identifierDescription based on the given scores - */ - calculateProbabilities() { - if (!this.scoresChanged) { - return; - } - - if (this.scores.size === 0) { - this.probabilities.set(TypeEnum.ANY, 1); - return; - } - - const total = this.totalScores; - this.probabilities = new Map(); - - const preliminaryProbabilities = new Map(); - // recalculate probabilityMap - for (const identifier of this.scores.keys()) { - preliminaryProbabilities.set( - identifier, - this.scores.get(identifier) / total - ); - } - this.scoresChanged = false; - - // return - - for (const identifier of this.scores.keys()) { - if (this.typeIsTypeProbability.has(identifier)) { - this.typeIsTypeProbability.get(identifier).calculateProbabilities(); - const probs = this.typeIsTypeProbability.get(identifier).probabilities; - - let divider = 1; - if (probs.has(this.id)) { - divider = 1 - probs.get(this.id); - } - - for (const key of probs.keys()) { - if (this.id === key) { - continue; - } - if (!this.probabilities.has(key)) { - this.probabilities.set(key, 0); - } - - this.probabilities.set( - key, - this.probabilities.get(key) + - preliminaryProbabilities.get(identifier) * - (probs.get(key) / divider) - ); - } - } else { - if (!this.probabilities.has(identifier)) { - this.probabilities.set(identifier, 0); - } - - this.probabilities.set( - identifier, - this.probabilities.get(identifier) + - preliminaryProbabilities.get(identifier) - ); - } - } - - // incorporate execution scores - // get min value - let minValue = 0; - for (const key of this.executionScores.keys()) { - minValue = Math.min(minValue, this.executionScores.get(key)); - } - - if ( - (CONFIG).incorporateExecutionInformation && - this.executionScores.size - ) { - // calculate total - let totalScore = 0; - for (const key of this.probabilities.keys()) { - let value = this.executionScores.has(key) - ? this.executionScores.get(key) - : 0; - value += -minValue; - totalScore += value; - } - - if (totalScore) { - // calculate probability and incorporate - for (const key of this.probabilities.keys()) { - let value = this.executionScores.has(key) - ? this.executionScores.get(key) - : 0; - value += -minValue; - - const probability = value / totalScore; - - this.probabilities.set( - key, - this.probabilities.get(key) * probability - ); - } - } - } - - // normalize to one - let totalProb = 0; - for (const key of this.probabilities.keys()) { - totalProb += this.probabilities.get(key); - } - - if (totalProb) { - for (const key of this.probabilities.keys()) { - this.probabilities.set(key, this.probabilities.get(key) / totalProb); - } - } - } - - addExecutionScore(type: string, score: number) { - if (!this.executionScores.has(type)) { - this.executionScores.set(type, score); - } - - this.scoresChanged = true; - this.executionScores.set(type, this.executionScores.get(type) + score); - } - - /** - * Gets a random identifierDescription from the probability map based on their likelyhood - */ - getRandomType(): string { - this.calculateProbabilities(); - - if (!this.probabilities.size) { - return TypeEnum.ANY; - } - - const choice = prng.nextDouble(0, 1); - let index = 0; - - for (const type of this.probabilities.keys()) { - const probability = this.probabilities.get(type); - - if (choice <= index + probability) { - if (this.typeIsTypeProbability.has(type)) { - return this.typeIsTypeProbability.get(type).getRandomType(); - } - return type; - } - - index += probability; - } - - const type = this.probabilities.keys().next().value; - - if (this.typeIsTypeProbability.has(type)) { - return this.typeIsTypeProbability.get(type).getRandomType(); - } - - return type; - } - - getHighestProbabilityType(): string { - this.calculateProbabilities(); - - if (!this.probabilities.size) { - return TypeEnum.ANY; - } - - let best: string = this.probabilities.keys().next().value; - - for (const obj of this.probabilities.keys()) { - if (this.probabilities.get(obj) > this.probabilities.get(best)) { - best = obj; - } - } - - if (this.typeIsTypeProbability.has(best)) { - return this.typeIsTypeProbability.get(best).getHighestProbabilityType(); - } - - return best; - } - - keys = () => this.scores.keys(); - - getIdentifier(): string { - return this.id; - } -} diff --git a/libraries/javascript/lib/analysis/static/types/resolving/TypeResolver.ts b/libraries/javascript/lib/analysis/static/types/resolving/TypeResolver.ts deleted file mode 100644 index bd21a2635..000000000 --- a/libraries/javascript/lib/analysis/static/types/resolving/TypeResolver.ts +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Element, ElementType, Scope } from "@syntest/ast-javascript"; -import { Relation, RelationType } from "../discovery/Relation"; -import { ComplexObject } from "../discovery/object/ComplexObject"; -import { TypeProbability } from "./TypeProbability"; - -/** - * Abstract TypeResolver class - * - * @author Dimitri Stallenberg - */ -export abstract class TypeResolver { - private _relationTyping: Map; - private _elementTyping: Map; - - private _relationFullyResolved: Set; - - private _wrapperElementIsRelation: Map; - - private processed: Map>; - - /** - * Constructor - */ - constructor() { - this._relationTyping = new Map(); - this._elementTyping = new Map(); - this._relationFullyResolved = new Set(); - - this.processed = new Map>(); - } - - get availableTypes() { - return [...this.elementTyping.values()]; //, ...this.relationTyping.values()]) - } - - /** - * Resolves the types of all given elements and relations - * @param scopes the available scopes - * @param elements the elements to resolve the types of - * @param relations the relations to resolve the types of - * @param wrapperElementIsRelation a map that specifies which elements are which relations - * @param objects the user defined objects that are available to the file under evaluation - */ - abstract resolveTypes( - elements: Element[], - relations: Relation[], - wrapperElementIsRelation: Map, - objects: ComplexObject[] - ); - - /** - * Returns the identifierDescription of the variable in the given scope - * @param scope the scope the variable is in - * @param variableName the name of the variable - */ - abstract getTyping(scope: Scope, variableName: string): TypeProbability; - - /** - * Sets the identifierDescription of the specified relation - * @param relation the relation to set the identifierDescription of - * @param type the identifierDescription of the relation - * @param value the score of identifierDescription (higher score means higher probability) - */ - setRelationType( - relation: Relation, - type: string | TypeProbability, - value: number - ) { - if (relation.relation === RelationType.PropertyAccessor) { - this.setElementType(relation, relation.involved[1], type, 1); - this.setProcessed(relation, relation.involved[1]); - } - - if (this.relationTyping.has(relation)) { - const probabilities = this.relationTyping.get(relation); - probabilities.addType(type, value); - } else { - const probabilities = new TypeProbability(); - this.relationTyping.set(relation, probabilities); - probabilities.addType(type, value); - } - } - - setElementTypeToElement( - relation: Relation, - element: Element, - typeElement: Element, - value: number - ) { - if (!this.elementTyping.has(typeElement)) { - this.elementTyping.set(typeElement, new TypeProbability()); - } - - if (typeElement.type === ElementType.Relation) { - const relation = this._wrapperElementIsRelation.get(typeElement.value); - - if (!relation) { - throw new Error(`Cannot find relation: ${typeElement.value}`); - } - - this.setElementType( - relation, - element, - this.relationTyping.get(relation), - value - ); - } else { - this.setElementType( - relation, - element, - this.elementTyping.get(typeElement), - value - ); - } - } - - setElementType( - relation: Relation, - element: Element, - type: string | TypeProbability, - value: number, - object: ComplexObject = null, - propertyTypings: Map = null - ) { - if (!this.processed.has(relation)) { - this.processed.set(relation, new Set()); - } - - if (this.processed.get(relation).has(element)) { - return; - } - - this._setElementType(element, type, value, object, propertyTypings); - } - - setProcessed(relation: Relation, element: Element) { - if (!this.processed.has(relation)) { - this.processed.set(relation, new Set()); - } - - this.processed.get(relation).add(element); - } - - /** - * Sets the identifierDescription of the specified element - * @param element the element to set the identifierDescription of - * @param type the type of the element - * @param value the score of type (higher score means higher probability) - */ - _setElementType( - element: Element, - type: string | TypeProbability, - value: number, - object: ComplexObject = null, - propertyTypings: Map = null - ) { - if (element.type === ElementType.Relation) { - const relation = this._wrapperElementIsRelation.get(element.value); - - if (!relation) { - throw new Error(`Cannot find relation: ${element.value}`); - } - - this.setRelationType(relation, type, 1); - } - - if (!this.elementTyping.has(element)) { - this.elementTyping.set(element, new TypeProbability()); - } - - const typeMap = this.elementTyping.get(element); - typeMap.addType(type, value, object, propertyTypings); - } - - getRelationType(relation: Relation) { - if (!this.relationTyping.has(relation)) { - this.relationTyping.set(relation, new TypeProbability()); - } - - return this.relationTyping.get(relation); - } - - getElementType(element: Element) { - if (element.type === "relation") { - const relation: Relation = this.wrapperElementIsRelation.get( - element.value - ); - return this.getRelationType(relation); - } - - if (!this.elementTyping.has(element)) { - this.elementTyping.set(element, new TypeProbability()); - } - - return this.elementTyping.get(element); - } - - get elements() { - return [...this.elementTyping.keys()]; - } - - private get relationTyping(): Map { - return this._relationTyping; - } - - get elementTyping(): Map { - return this._elementTyping; - } - - get relationFullyResolved(): Set { - return this._relationFullyResolved; - } - - get wrapperElementIsRelation(): Map { - return this._wrapperElementIsRelation; - } - - set wrapperElementIsRelation(value: Map) { - this._wrapperElementIsRelation = value; - } -} diff --git a/libraries/javascript/lib/analysis/static/types/resolving/logic/ObjectMatcher.ts b/libraries/javascript/lib/analysis/static/types/resolving/logic/ObjectMatcher.ts deleted file mode 100644 index 4d32cb406..000000000 --- a/libraries/javascript/lib/analysis/static/types/resolving/logic/ObjectMatcher.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ComplexObject } from "../../discovery/object/ComplexObject"; -import { TypeProbability } from "../TypeProbability"; -import { Element, ElementType } from "@syntest/ast-javascript"; -import { Relation, RelationType } from "../../discovery/Relation"; -import { TypeEnum } from "../TypeEnum"; - -export function createAnonObject( - properties: Element[], - wrapperElementIsRelation: Map, - elementTyping: Map -) { - const anonObject: ComplexObject = { - name: "anon", - properties: new Set(), - functions: new Set(), - propertyType: new Map(), - }; - - properties.forEach((p) => { - if (p.type === ElementType.Relation) { - if (wrapperElementIsRelation.has(p.value)) { - const relation: Relation = wrapperElementIsRelation.get(p.value); - - if (relation.relation === RelationType.Call) { - const call = relation.involved[0]; - anonObject.functions.add(call.value); - if (elementTyping.has(call)) { - anonObject.propertyType.set(call.value, elementTyping.get(call)); - } else { - anonObject.propertyType.set( - call.value, - new TypeProbability([[TypeEnum.FUNCTION, 1, null]]) - ); - } - } else { - return; - } - } - - return; - } - - anonObject.properties.add(p.value); - if (elementTyping.has(p)) { - anonObject.propertyType.set(p.value, elementTyping.get(p)); - } - }); - - return anonObject; -} diff --git a/libraries/javascript/lib/analysis/static/types/resolving/logic/TypeResolverInference.ts b/libraries/javascript/lib/analysis/static/types/resolving/logic/TypeResolverInference.ts deleted file mode 100644 index 636736009..000000000 --- a/libraries/javascript/lib/analysis/static/types/resolving/logic/TypeResolverInference.ts +++ /dev/null @@ -1,679 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { TypeResolver } from "../TypeResolver"; -import { elementTypeToTypingType, TypeEnum } from "../TypeEnum"; -import { Relation, RelationType } from "../../discovery/Relation"; -import { Element, Scope } from "@syntest/ast-javascript"; -import { ComplexObject } from "../../discovery/object/ComplexObject"; -import { TypeProbability } from "../TypeProbability"; -import { createAnonObject } from "./ObjectMatcher"; - -export class TypeResolverInference extends TypeResolver { - /** - * This function resolves constant elements such as numerical constants or other primitives - * @param elements the elements to resolve - */ - resolvePrimitiveElements(elements: Element[]): boolean { - let somethingSolved = false; - for (const element of elements) { - const typingsType = elementTypeToTypingType(element.type); - - if (typingsType) { - this._setElementType(element, typingsType, 1); - somethingSolved = true; - } - } - return somethingSolved; - } - - resolveRelations(elements: Element[], relations: Relation[]): boolean { - let somethingSolved = false; - for (const relation of relations) { - if (this.relationFullyResolved.has(relation)) { - continue; - } - - this.resolveRelationElements(relation); - - const involved: TypeProbability[] = relation.involved.map((e) => - this.getElementType(e) - ); - - const relationResolved = this.resolveRelation(relation, involved); - - if (relationResolved) { - somethingSolved = true; - this.relationFullyResolved.add(relation); - } - } - return somethingSolved; - } - - resolveComplexElements( - elements: Element[], - relations: Relation[], - wrapperElementIsRelation: Map, - objects: ComplexObject[] - ): boolean { - let somethingSolved = false; - - // filter relations by property accessors - // we cannot do anything with computed propertyAccessors since we don't know the computed value - const propertyAccessors = relations.filter( - (r) => r.relation === RelationType.PropertyAccessor && !r.computed - ); - - for (const element of elements) { - const isRelation = - element.type === "relation" && - wrapperElementIsRelation.has(element.value); - if (isRelation) { - const relation = wrapperElementIsRelation.get(element.value); - - if (relation.relation !== RelationType.PropertyAccessor) { - continue; - } - } else if (element.type !== "identifier" || element.value === "this") { - continue; - } - - let props = propertyAccessors.filter( - (r) => r.involved[0].scope.filePath === element.scope.filePath - ); - - props = props.filter( - (r) => r.involved[0].scope.uid === element.scope.uid - ); - - props = props.filter((r) => { - if ( - isRelation && - r.involved[0].type === "relation" && - wrapperElementIsRelation.has(r.involved[0].value) - ) { - const elRelation = wrapperElementIsRelation.get(element.value); - const propRelation = wrapperElementIsRelation.get( - r.involved[0].value - ); - if (propRelation.relation === RelationType.PropertyAccessor) { - return ( - propRelation.involved[0].value === elRelation.involved[0].value && - propRelation.involved[1].value === elRelation.involved[1].value - ); - } - } - return r.involved[0].value === element.value; - }); - - const properties = props - .map((r) => r.involved[1]) - // remove duplicates - .reduce((unique: Element[], item) => { - const found = unique.find((uniqueItem: Element) => { - return ( - uniqueItem.value === item.value && - uniqueItem.scope.uid === item.scope.uid - ); - // && uniqueItem.scope.type === item.scope.type - }); - if (found) { - return unique; - } else { - return [...unique, item]; - } - }, []); - - if (!properties.length) { - continue; - } - - // TODO find out wether function property or regular property - - // TODO can be improved by comparing property types - - const objects_ = [ - createAnonObject( - properties, - wrapperElementIsRelation, - this.elementTyping - ), - ...objects, - ]; - - // find matching objects - for (const object of objects_) { - let score = 0; - for (const prop of properties) { - if ( - object.properties.has(prop.value) || - object.functions.has(prop.value) - ) { - score += 1; - } - } - - // atleast score of one - if (score > 0) { - let type: string; - - if (object.name === "function") { - type = TypeEnum.FUNCTION; - } else if (object.name === "string") { - type = TypeEnum.STRING; - } else if (object.name === "array") { - type = TypeEnum.ARRAY; - } else { - type = - object.name === "anon" || !object.name - ? TypeEnum.OBJECT - : object.name; - } - - const propertyTypings: Map = new Map(); - - object.functions.forEach((func) => { - const typeMap = new TypeProbability([[TypeEnum.FUNCTION, 1, null]]); - - propertyTypings.set(func, typeMap); - }); - - object.properties.forEach((prop) => { - if (object.propertyType && object.propertyType.has(prop)) { - const typeMap = new TypeProbability([ - [object.propertyType.get(prop), 1, null], - ]); - propertyTypings.set(prop, typeMap); - return; - } - // TODO scope? - const element = properties.find((p) => p.value === prop); - - if (element) { - propertyTypings.set(element.value, this.getElementType(element)); - return; - } - - // get type info from the object definition - const relevantRelations = relations - .filter((r) => r.relation === RelationType.PropertyAccessor) - .filter( - (r) => r.involved[1].scope.filePath === object.export?.filePath - ) - .filter((r) => - r.involved[1].scope.uid.split("-").includes(object.name) - ) - .filter((r) => r.involved[0].value === "this") - .filter((r) => r.involved[1].value === prop) - .filter((r) => r.involved[1].type === "identifier"); - - elements = relevantRelations.map((r) => r.involved[1]); - - if (elements.length > 2) { - const el1 = elements[0]; - - for (const el2 of elements) { - if (el1 !== el2) { - throw new Error( - `Elements are not equal! \n${JSON.stringify( - el1 - )} \n${JSON.stringify(el2)}` - ); - } - } - } - - if (elements.length) { - propertyTypings.set( - elements[0].value, - this.getElementType(elements[0]) - ); - return; - } - }); - - // properties.forEach((p) => { - // if (this.elementTyping.has(p)) { - // found += 1 - // propertyTypings.set(p.value, this.elementTyping.get(p)) - // } else { - // const typeMap = new TypeProbabilityMap() - // // standard types - // if (object.functions.has(p.value)) { - // found += 1 - // typeMap.addType({ - // type: TypeEnum.FUNCTION - // }) - // } else if (object.propertyType && object.propertyType.has(p.value)) { - // found += 1 - // typeMap.addType(object.propertyType.get(p.value)) - // } - // - // propertyTypings.set(p.value, typeMap) - // } - // }) - - this._setElementType(element, type, score, object, propertyTypings); - - somethingSolved = true; // TODO should be here right? - } - } - } - - return somethingSolved; - } - - resolveTypes( - elements: Element[], - relations: Relation[], - wrapperElementIsRelation: Map, - objects: ComplexObject[] - ) { - this.wrapperElementIsRelation = wrapperElementIsRelation; - - this.resolvePrimitiveElements(elements); - this.resolveRelations(elements, relations); - this.resolveComplexElements( - elements, - relations, - wrapperElementIsRelation, - objects - ); - } - - getTyping(scope: Scope, variableName: string): TypeProbability { - const elements = this.elements.filter((e) => !!e.scope); - - const correctFile = elements.filter( - (e) => e.scope.filePath === scope.filePath - ); - - const correctVariable = correctFile.filter((e) => e.value === variableName); - - const correctScope = correctVariable.filter( - (e) => `${e.scope.uid}` === `${scope.uid}` - ); - - const element = correctScope[0]; - - if (!element) { - // throw new Error("Invalid!") - return new TypeProbability(); - } - - const probabilities = this.getElementType(element); - - return probabilities; - } - - resolveRelationElements(rel: Relation): boolean { - const relation: RelationType = rel.relation; - const involved: Element[] = rel.involved; - - switch (relation) { - case RelationType.Await: - // often function? - this.setElementType(rel, involved[0], TypeEnum.FUNCTION, 1); - this.setProcessed(rel, involved[0]); - return true; - - case RelationType.FunctionDefinition: // could be multiple things - // but we do know that the first involved element is a function - this.setElementType(rel, involved[0], TypeEnum.FUNCTION, 1); - this.setProcessed(rel, involved[0]); - return false; - case RelationType.ClassDefinition: - this.setElementType(rel, involved[0], TypeEnum.OBJECT, 1); - this.setProcessed(rel, involved[0]); - return true; - - case RelationType.Object: // could be multiple things - case RelationType.ObjectProperty: // could be multiple things - case RelationType.Array: // could be multiple things - case RelationType.Sequence: // could be multiple things - return false; - - case RelationType.PropertyAccessor: // could be multiple things - // although the first has to an object/array - this.setElementType(rel, involved[0], TypeEnum.OBJECT, 1); - this.setElementType(rel, involved[0], TypeEnum.ARRAY, 1); - this.setElementType(rel, involved[0], TypeEnum.FUNCTION, 1); - this.setElementType(rel, involved[0], TypeEnum.STRING, 1); - this.setProcessed(rel, involved[0]); - return false; - case RelationType.New: // - return false; - case RelationType.Spread: // should be iterable - this.setElementType(rel, involved[0], TypeEnum.OBJECT, 1); - this.setElementType(rel, involved[0], TypeEnum.ARRAY, 1); - this.setProcessed(rel, involved[0]); - return true; - - case RelationType.PlusPlusPrefix: // must be numerical - case RelationType.MinusMinusPrefix: // must be numerical - case RelationType.PlusPlusPostFix: // must be numerical - case RelationType.MinusMinusPostFix: // must be numerical - this.setElementType(rel, involved[0], TypeEnum.NUMERIC, 1); - this.setProcessed(rel, involved[0]); - return true; - - // Unary - case RelationType.Delete: // could be multiple things - return false; - case RelationType.Void: // could be multiple things - return false; - case RelationType.TypeOf: // could be multiple things - return false; - case RelationType.PlusUnary: // could be multiple things - return false; - case RelationType.MinusUnary: // could be multiple things - return false; - case RelationType.BitwiseNotUnary: // could be multiple things - return false; - case RelationType.LogicalNotUnary: // could be multiple things - return false; - - // binary - case RelationType.Addition: - this.setElementType(rel, involved[0], TypeEnum.NUMERIC, 1); - this.setElementType(rel, involved[0], TypeEnum.STRING, 1); - this.setElementType(rel, involved[1], TypeEnum.NUMERIC, 1); - this.setElementType(rel, involved[1], TypeEnum.STRING, 1); - this.setProcessed(rel, involved[0]); - this.setProcessed(rel, involved[1]); - return false; // could be multiple things - case RelationType.Subtraction: // must be numerical - case RelationType.Division: // must be numerical - case RelationType.Multiplication: // must be numerical - case RelationType.Remainder: // must be numerical - case RelationType.Exponentiation: // must be numerical - this.setElementType(rel, involved[0], TypeEnum.NUMERIC, 1); - this.setElementType(rel, involved[1], TypeEnum.NUMERIC, 1); - this.setProcessed(rel, involved[0]); - this.setProcessed(rel, involved[1]); - return true; - - case RelationType.In: // could be multiple things - this.setElementType(rel, involved[1], TypeEnum.OBJECT, 1); - this.setProcessed(rel, involved[1]); - return false; - case RelationType.InstanceOf: // could be multiple things - this.setElementType(rel, involved[1], TypeEnum.STRING, 1); - this.setProcessed(rel, involved[1]); - return false; - case RelationType.Less: // must be numeric - case RelationType.Greater: // must be numeric - case RelationType.LessOrEqual: // must be numeric - case RelationType.GreaterOrEqual: // must be numeric - // TODO not actually true this can also be other things - this.setElementType(rel, involved[0], TypeEnum.NUMERIC, 1); - this.setElementType(rel, involved[1], TypeEnum.NUMERIC, 1); - this.setProcessed(rel, involved[0]); - this.setProcessed(rel, involved[1]); - return true; - - case RelationType.Equality: // could be multiple things - case RelationType.InEquality: // could be multiple things - case RelationType.StrictEquality: // could be multiple things - case RelationType.StrictInequality: // could be multiple things - this.setElementTypeToElement(rel, involved[0], involved[1], 1); - this.setElementTypeToElement(rel, involved[1], involved[0], 1); - this.setProcessed(rel, involved[0]); - this.setProcessed(rel, involved[1]); - return true; - - case RelationType.BitwiseLeftShift: // must be numeric - case RelationType.BitwiseRightShift: // must be numeric - case RelationType.BitwiseUnsignedRightShift: // must be numeric - - case RelationType.BitwiseAnd: // must be numeric - case RelationType.BitwiseOr: // must be numeric - case RelationType.BitwiseXor: // must be numeric - this.setElementType(rel, involved[0], TypeEnum.NUMERIC, 1); - this.setElementType(rel, involved[1], TypeEnum.NUMERIC, 1); - this.setProcessed(rel, involved[0]); - this.setProcessed(rel, involved[1]); - return true; - - case RelationType.LogicalAnd: // could be multiple things - case RelationType.LogicalOr: // could be multiple things - case RelationType.NullishCoalescing: // Could be multiple things - // left and right are likely booleans though - return false; - - // ternary - case RelationType.Conditional: // could be multiple things - // C is probably boolean though - return false; - - case RelationType.Assignment: // must be the same - this.setElementTypeToElement(rel, involved[0], involved[1], 1); - this.setElementTypeToElement(rel, involved[1], involved[0], 1); - this.setProcessed(rel, involved[0]); - this.setProcessed(rel, involved[1]); - return true; - case RelationType.MultiplicationAssignment: // must be numeric - case RelationType.ExponentiationAssignment: // must be numeric - case RelationType.DivisionAssignment: // must be numeric - case RelationType.RemainderAssigment: // must be numeric - case RelationType.SubtractionAssignment: // must be numeric - case RelationType.LeftShiftAssignment: // must be numeric - case RelationType.RightShiftAssignment: // must be numeric - case RelationType.UnSignedRightShiftAssignment: // must be numeric - case RelationType.BitwiseAndAssignment: // must be numeric - case RelationType.BitwiseXorAssignment: // must be numeric - case RelationType.BitwiseOrAssignment: // must be numeric - this.setElementType(rel, involved[0], TypeEnum.NUMERIC, 1); - this.setElementType(rel, involved[1], TypeEnum.NUMERIC, 1); - this.setProcessed(rel, involved[0]); - this.setProcessed(rel, involved[1]); - - return true; - case RelationType.AdditionAssignment: // must be numeric or string - this.setElementType(rel, involved[0], TypeEnum.NUMERIC, 1); - this.setElementType(rel, involved[1], TypeEnum.NUMERIC, 1); - this.setElementType(rel, involved[0], TypeEnum.STRING, 1); - this.setElementType(rel, involved[1], TypeEnum.STRING, 1); - this.setProcessed(rel, involved[0]); - this.setProcessed(rel, involved[1]); - - return true; - - case RelationType.LogicalAndAssignment: // could be multiple things - case RelationType.LogicalOrAssignment: // could be multiple things - case RelationType.LogicalNullishAssignment: // could be multiple things - // left is boolean - // right is probably boolean - this.setElementType(rel, involved[0], TypeEnum.BOOLEAN, 1); - this.setProcessed(rel, involved[0]); - return false; - - case RelationType.Return: // could be multiple things - - // multi - case RelationType.Call: // could be multiple things - // but we do know that the first involved element is a function - this.setElementType(rel, involved[0], TypeEnum.FUNCTION, 1); - this.setProcessed(rel, involved[0]); - return false; - - case RelationType.PrivateName: - return false; - } - - throw new Error(`Unimplemented relation type: ${relation}`); - } - - resolveRelation(relation: Relation, involved: TypeProbability[]): boolean { - // TODO - - switch (relation.relation) { - case RelationType.Await: - // It should be equal to the result of the function return type - return false; - case RelationType.FunctionDefinition: - this.setRelationType(relation, TypeEnum.FUNCTION, 1); - return true; - case RelationType.ClassDefinition: - this.setRelationType(relation, TypeEnum.OBJECT, 1); - return true; - // Unary - case RelationType.PropertyAccessor: // must be equal to the identifierDescription of the member element - this.setRelationType(relation, involved[1], 1); - return true; - case RelationType.New: // always an object - this.setRelationType(relation, TypeEnum.OBJECT, 1); - this.setRelationType(relation, involved[0], 1); - return true; - case RelationType.Spread: // must be array i think - this.setRelationType(relation, TypeEnum.ARRAY, 1); - return true; - - case RelationType.ObjectProperty: // could be multiple things - case RelationType.Sequence: // could be multiple things - return false; - - case RelationType.PlusPlusPostFix: // must be numerical - case RelationType.MinusMinusPostFix: // must be numerical - case RelationType.PlusPlusPrefix: // must be numerical - case RelationType.MinusMinusPrefix: // must be numerical - this.setRelationType(relation, TypeEnum.NUMERIC, 1); - return true; - - case RelationType.Delete: // must be void - this.setRelationType(relation, TypeEnum.UNDEFINED, 1); - return true; - case RelationType.Void: // must be void - this.setRelationType(relation, TypeEnum.UNDEFINED, 1); - return true; - - case RelationType.TypeOf: // must be string - this.setRelationType(relation, TypeEnum.STRING, 1); - return true; - case RelationType.PlusUnary: // must be numerical - case RelationType.MinusUnary: // must be numerical - this.setRelationType(relation, TypeEnum.NUMERIC, 1); - return true; - case RelationType.BitwiseNotUnary: - // todo - return false; - case RelationType.LogicalNotUnary: // must be boolean - this.setRelationType(relation, TypeEnum.BOOLEAN, 1); - return true; - - // binary - case RelationType.Addition: - // TODO can be more - // TODO should be based on what the involved values are - this.setRelationType(relation, TypeEnum.NUMERIC, 1); - this.setRelationType(relation, TypeEnum.STRING, 1); - return true; - case RelationType.Subtraction: // must be numerical - case RelationType.Division: // must be numerical - case RelationType.Multiplication: // must be numerical - case RelationType.Remainder: // must be numerical - case RelationType.Exponentiation: // must be numerical - this.setRelationType(relation, TypeEnum.NUMERIC, 1); - return true; // todo - - case RelationType.In: // must be boolean - case RelationType.InstanceOf: // must be boolean - case RelationType.Less: // must be boolean - case RelationType.Greater: // must be boolean - case RelationType.LessOrEqual: // must be boolean - case RelationType.GreaterOrEqual: // must be boolean - this.setRelationType(relation, TypeEnum.BOOLEAN, 1); - return true; - - case RelationType.Equality: // must be boolean - case RelationType.InEquality: // must be boolean - case RelationType.StrictEquality: // must be boolean - case RelationType.StrictInequality: // must be boolean - this.setRelationType(relation, TypeEnum.BOOLEAN, 1); - return true; - - case RelationType.BitwiseLeftShift: // must be numeric - case RelationType.BitwiseRightShift: // must be numeric - case RelationType.BitwiseUnsignedRightShift: // must be numeric - this.setRelationType(relation, TypeEnum.NUMERIC, 1); - return true; - - case RelationType.BitwiseAnd: // must be numeric - case RelationType.BitwiseOr: // must be numeric - case RelationType.BitwiseXor: // must be numeric - this.setRelationType(relation, TypeEnum.NUMERIC, 1); - return true; - - case RelationType.LogicalOr: // can be the identifierDescription of the first or second one depending on if the first is not false/null/undefined - this.setRelationType(relation, involved[0], 1); - this.setRelationType(relation, involved[1], 1); - return true; - - case RelationType.LogicalAnd: //can be the boolean or the identifierDescription of the second one depending on if the first and second are not false/null/undefined - this.setRelationType(relation, involved[0], 1); - this.setRelationType(relation, involved[1], 1); - return true; - case RelationType.NullishCoalescing: //?? - return false; // todo - - // ternary - case RelationType.Conditional: // could be multiple things - this.setRelationType(relation, involved[0], 1); - this.setRelationType(relation, involved[1], 1); - return true; - - case RelationType.Assignment: // no relation identifierDescription - case RelationType.MultiplicationAssignment: // no relation identifierDescription - case RelationType.ExponentiationAssignment: // no relation identifierDescription - case RelationType.DivisionAssignment: // no relation identifierDescription - case RelationType.RemainderAssigment: // no relation identifierDescription - case RelationType.AdditionAssignment: // no relation identifierDescription - case RelationType.SubtractionAssignment: // no relation identifierDescription - case RelationType.LeftShiftAssignment: // no relation identifierDescription - case RelationType.RightShiftAssignment: // no relation identifierDescription - case RelationType.UnSignedRightShiftAssignment: // no relation identifierDescription - case RelationType.BitwiseAndAssignment: // no relation identifierDescription - case RelationType.BitwiseXorAssignment: // no relation identifierDescription - case RelationType.BitwiseOrAssignment: // no relation identifierDescription - case RelationType.LogicalAndAssignment: // no relation identifierDescription - case RelationType.LogicalOrAssignment: // no relation identifierDescription - case RelationType.LogicalNullishAssignment: // no relation identifierDescription - this.setRelationType(relation, TypeEnum.UNDEFINED, 1); - return true; - - // TODO - - case RelationType.Return: // must be equal to the identifierDescription of the returned element - this.setRelationType(relation, involved[1], 1); - return true; - - case RelationType.Call: // must be the return identifierDescription of the called function - return false; - case RelationType.Object: // could be multiple things - this.setRelationType(relation, TypeEnum.OBJECT, 1); - return true; - case RelationType.Array: // could be multiple things - this.setRelationType(relation, TypeEnum.ARRAY, 1); - return true; - case RelationType.PrivateName: - return false; - } - - throw new Error(`Unimplemented relation type: ${relation.relation}`); - } -} diff --git a/libraries/javascript/lib/criterion/BranchDistance.ts b/libraries/javascript/lib/criterion/BranchDistance.ts deleted file mode 100644 index dce1a5bb3..000000000 --- a/libraries/javascript/lib/criterion/BranchDistance.ts +++ /dev/null @@ -1,346 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as t from "@babel/types"; - -export class BranchDistance { - private K = 1; // punishment factor - - public static branchDistance( - condition: string, - condition_ast: string, - variables: Record, - target: boolean - ): number { - if ( - condition === undefined || - condition_ast === undefined || - variables === undefined - ) { - return 1; - } - - const ast = JSON.parse(condition_ast); - - const branchDistance = new BranchDistance(); - - const { value, direct } = branchDistance.resolve(ast, variables); - let distance = value; - - if (direct) { - distance = distance ? 0 : 1; - } - - if (!target) { - distance = 1 - distance; - } - - if (distance > 1 || distance < 0) { - throw new Error("Invalid distance!"); - } - - return distance; - } - - evaluate( - ast: t.Node, - variables: Record - // eslint-disable-next-line - ): { value: any; direct: boolean } { - if (!this[ast.type]) { - throw new Error(`Unimplemented ast type ${ast.type}`); - } - - return this[ast.type](ast, variables); - } - - resolve( - ast: t.Node, - variables: Record - // eslint-disable-next-line - ): { value: any; direct: boolean } { - switch (ast.type) { - case "StringLiteral": - case "NumericLiteral": - case "BooleanLiteral": - return { value: ast.value, direct: true }; - case "RegExpLiteral": - return { value: ast.pattern, direct: true }; - case "NullLiteral": - return { value: null, direct: true }; - - case "Identifier": - // TODO check if this is actually primitive? - return { value: variables[ast.name], direct: true }; - - case "MemberExpression": - if ( - ast.object.type === "Identifier" && - ast.property.type === "Identifier" - ) { - const value = variables[`${ast.object.name}.${ast.property.name}`]; - return { value: value, direct: true }; - } - - case "ThisExpression": - // TODO not sure how to handle this - // TODO the result would be cool but functions that alter state (side-effects) ruin the idea - case "AssignmentExpression": - case "CallExpression": - return { value: undefined, direct: true }; - } - - return this.evaluate(ast, variables); - } - - // eslint-disable-next-line - UpdateExpression( - ast: t.UpdateExpression, - variables: Record - ): { value: number; direct: boolean } { - const { value, direct } = this.resolve(ast.argument, variables); - if (direct) { - switch (ast.operator) { - // TODO postfix/prefix - case "++": - return { value: value + 1, direct: true }; - case "--": - return { value: value - 1, direct: true }; - } - } - - throw new Error( - `Unknown update operator: "${ast.operator}" for direct=${direct}` - ); - } - - UnaryExpression( - ast: t.UnaryExpression, - variables: Record - // eslint-disable-next-line - ): { value: any; direct: boolean } { - const { value, direct } = this.resolve(ast.argument, variables); - - if (direct) { - switch (ast.operator) { - case "!": - if (typeof value === "number") { - return { - value: BranchDistance.normalize(Math.abs(0 - value)), - direct: false, - }; - } else { - return { value: value ? 1 : 0, direct: false }; - } - case "typeof": - return { value: typeof value, direct: true }; - case "-": - return { value: -value, direct: true }; - case "+": - return { value: +value, direct: true }; - case "~": - return { value: ~value, direct: true }; - } - } else { - switch (ast.operator) { - case "!": - return { value: 1 - value, direct: false }; - } - } - - throw new Error( - `Unknown unary operator: "${ast.operator}" for direct=${direct}` - ); - } - - BinaryExpression( - ast: t.BinaryExpression, - variables: Record - // eslint-disable-next-line - ): { value: any; direct: boolean } { - // eslint-disable-next-line - const { value: left, direct: lDirect } = this.resolve(ast.left, variables); - // eslint-disable-next-line - const { value: right, direct: rDirect } = this.resolve( - ast.right, - variables - ); - - if (!lDirect) { - throw new Error("left should be direct"); - } - if (!rDirect) { - throw new Error("right not be direct"); - } - - switch (ast.operator) { - // should both be direct : returns direct - case "+": - return { value: left + right, direct: true }; - case "-": - return { value: left - right, direct: true }; - case "*": - return { value: left * right, direct: true }; - case "/": - return { value: left / right, direct: true }; - case "%": - return { value: left % right, direct: true }; - case "**": - return { value: left ** right, direct: true }; - - case "&": - return { value: left & right, direct: true }; - case "|": - return { value: left | right, direct: true }; - case "^": - return { value: left ^ right, direct: true }; - } - - switch (ast.operator) { - // should both be direct : returns not direct - - case "==": - // TODO - case "===": - if (typeof left === "number" && typeof right === "number") { - return { - value: BranchDistance.normalize(Math.abs(left - right)), - direct: false, - }; - } else if (typeof left === "string" && typeof right === "string") { - return { - value: BranchDistance.normalize(this.editDistDP(left, right)), - direct: false, - }; - } else if (typeof left === "boolean" && typeof right === "boolean") { - return { value: left === right ? 0 : 1, direct: false }; - } else { - // TODO type difference?! - } - return { value: left === right ? 0 : 1, direct: false }; - - case "!=": - // TODO - case "!==": - return { value: left !== right ? 0 : 1, direct: false }; - case "<": - return { - value: - left < right ? 0 : BranchDistance.normalize(left - right + this.K), - direct: false, - }; - case "<=": - return { - value: left <= right ? 0 : BranchDistance.normalize(left - right), - direct: false, - }; - case ">": - return { - value: - left > right ? 0 : BranchDistance.normalize(right - left + this.K), - direct: false, - }; - case ">=": - return { - value: left >= right ? 0 : BranchDistance.normalize(right - left), - direct: false, - }; - - case "instanceof": - return { value: left instanceof right ? 0 : 1, direct: false }; - case "in": - return { value: left in right ? 0 : 1, direct: false }; - } - - throw new Error(`Unknown binary operator: ${ast.operator}`); - } - - LogicalExpression( - ast: t.LogicalExpression, - variables: Record - // eslint-disable-next-line - ): { value: any; direct: boolean } { - // eslint-disable-next-line - let { value: left, direct: lDirect } = this.resolve(ast.left, variables); - // eslint-disable-next-line - let { value: right, direct: rDirect } = this.resolve(ast.right, variables); - - const operator = ast.operator; - - if (lDirect) { - left = left ? 0 : 1; - } - - if (rDirect) { - right = right ? 0 : 1; - } - - switch (operator) { - // should both NOT be direct : returns not direct - case "&&": - return { value: BranchDistance.normalize(left + right), direct: false }; - case "||": - return { - value: BranchDistance.normalize(Math.min(left, right)), - direct: false, - }; - // case "" - } - - throw new Error(`Unknown logical operator: ${ast.operator}`); - } - - private editDistDP(str1: string, str2: string) { - const m = str1.length; - const n = str2.length; - const table = []; - - for (let i = 0; i <= m; i++) { - table.push([]); - for (let j = 0; j <= n; j++) { - table[i].push(0); - } - } - - for (let i = 0; i <= m; i++) { - for (let j = 0; j <= n; j++) { - if (i == 0) { - table[i][j] = j; - } else if (j == 0) { - table[i][j] = i; - } else if (str1.charAt(i - 1) === str2.charAt(j - 1)) { - table[i][j] = table[i - 1][j - 1]; - } else { - table[i][j] = - 1 + - Math.min( - table[i][j - 1], - Math.min(table[i - 1][j], table[i - 1][j - 1]) - ); - } - } - } - - return table[m][n]; - } - - private static normalize(x: number): number { - // return 1 - Math.pow(1.001, -x) - return x / (x + 1); - } -} diff --git a/libraries/javascript/lib/criterion/JavaScriptBranchObjectiveFunction.ts b/libraries/javascript/lib/criterion/JavaScriptBranchObjectiveFunction.ts deleted file mode 100644 index 26c431be7..000000000 --- a/libraries/javascript/lib/criterion/JavaScriptBranchObjectiveFunction.ts +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { - ApproachLevel, - BranchObjectiveFunction, - Encoding, -} from "@syntest/core"; -import { BranchDistance } from "./BranchDistance"; -import { Node, NodeType } from "@syntest/cfg-core"; - -export class JavaScriptBranchObjectiveFunction< - T extends Encoding -> extends BranchObjectiveFunction { - calculateDistance(encoding: T): number { - const executionResult = encoding.getExecutionResult(); - - if (executionResult === undefined) { - return Number.MAX_VALUE; - } - - // let's check if the line is covered - if (executionResult.coversLine(this._line)) { - const branchTrace = executionResult - .getTraces() - .find( - (trace) => - trace.type === "branch" && - trace.line === this._line && - trace.branchType === this._type - ); - - if (!branchTrace) { - // TODO fix this should not happen - return Number.MAX_VALUE; - } - - if (branchTrace.hits > 0) { - return 0; - } else { - const oppositeBranch = executionResult.getTraces().find( - (trace) => - trace.type === "branch" && - trace.id === branchTrace.id && // Same branch id - trace.branchType !== this._type // The opposite branch type - ); - - return BranchDistance.branchDistance( - oppositeBranch.condition, - oppositeBranch.condition_ast, - >oppositeBranch.variables, - this._type - ); - } - } - - // find the corresponding branch node inside the cfg - const branchNode = this._subject.cfg.nodes.find((n: Node) => { - return n.type === NodeType.Branch && n.lines.includes(this._line); - }); - const childEdge = this._subject.cfg.edges.find((edge) => { - return edge.from === branchNode.id && edge.branchType === this._type; - }); - const childNode = this._subject.cfg.nodes.find((node) => { - return node.id === childEdge.to; - }); - - // Find approach level and ancestor based on node and covered nodes - const { approachLevel, closestCoveredBranchTrace } = - ApproachLevel.calculate( - this._subject.cfg, - childNode, - executionResult.getTraces() - ); - - // if closer node (branch or probe) is not found, we return the distance to the root branch - if (!closestCoveredBranchTrace) { - return Number.MAX_VALUE; - } - - let branchDistance: number; - - if (closestCoveredBranchTrace.type === "function") branchDistance = 1; - else { - const oppositeBranch = executionResult.getTraces().find( - (trace) => - trace.type === "branch" && - trace.id === closestCoveredBranchTrace.id && // Same branch id - trace.branchType !== closestCoveredBranchTrace.branchType // The opposite branch type - ); - branchDistance = BranchDistance.branchDistance( - closestCoveredBranchTrace.condition, - oppositeBranch.condition_ast, - >oppositeBranch.variables, - this._type - ); - } - - // add the distances - const distance = approachLevel + branchDistance; - return distance; - } -} diff --git a/libraries/javascript/lib/search/JavaScriptSubject.ts b/libraries/javascript/lib/search/JavaScriptSubject.ts deleted file mode 100644 index 079f02ab0..000000000 --- a/libraries/javascript/lib/search/JavaScriptSubject.ts +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ControlFlowGraph, NodeType } from "@syntest/cfg-core"; -import { - FunctionObjectiveFunction, - ObjectiveFunction, - SearchSubject, -} from "@syntest/core"; -import { JavaScriptTestCase } from "../testcase/JavaScriptTestCase"; -import { JavaScriptTargetMetaData } from "../analysis/static/JavaScriptTargetPool"; -import { ActionDescription } from "../analysis/static/parsing/ActionDescription"; -import { IdentifierDescription } from "../analysis/static/parsing/IdentifierDescription"; -import { ActionVisibility } from "../analysis/static/parsing/ActionVisibility"; -import { ActionType } from "../analysis/static/parsing/ActionType"; -import { JavaScriptBranchObjectiveFunction } from "../criterion/JavaScriptBranchObjectiveFunction"; - -export enum SubjectType { - class, - function, - object, -} - -export interface TypeScore { - types: string[]; - failed: boolean; -} - -export class JavaScriptSubject extends SearchSubject { - private _functions: ActionDescription[]; - private _type: SubjectType; - - private _typeScores: Map; - - reevaluateTypes() { - // TODO find correlations - // maybe look at bayesian inference - } - - get functions(): ActionDescription[] { - return this._functions; - } - - constructor( - path: string, - targetMeta: JavaScriptTargetMetaData, - cfg: ControlFlowGraph, - functions: ActionDescription[] - ) { - super(path, targetMeta.name, cfg); - // TODO SearchSubject should just use the targetMetaData - this._type = targetMeta.type; - this._functions = functions; - this._typeScores = new Map(); - } - - protected _extractObjectives(): void { - // Branch objectives - // Find all branch nodes - const branches = this._cfg.nodes.filter( - (node) => node.type === NodeType.Branch - ); - - branches.forEach((branchNode) => { - this._cfg.edges - // Find all edges from the branch node - .filter((edge) => edge.from === branchNode.id) - .forEach((edge) => { - this._cfg.nodes - // Find nodes with incoming edge from branch node - .filter((node) => node.id === edge.to) - .forEach((childNode) => { - // Add objective function - this._objectives.set( - new JavaScriptBranchObjectiveFunction( - this, - childNode.id, - branchNode.lines[0], - edge.branchType - ), - [] - ); - }); - }); - }); - - for (const objective of this._objectives.keys()) { - const childrenObj = this.findChildren(objective); - this._objectives.get(objective).push(...childrenObj); - } - - // FUNCTION objectives - this._cfg.nodes - // Find all root function nodes - .filter((node) => node.type === NodeType.Root) - .forEach((node) => { - // Add objective - const functionObjective = new FunctionObjectiveFunction( - this, - node.id, - node.lines[0] - ); - const childrenObj = this.findChildren(functionObjective); - this._objectives.set(functionObjective, childrenObj); - }); - } - - findChildren( - obj: ObjectiveFunction - ): ObjectiveFunction[] { - let childrenObj = []; - - let edges2Visit = this._cfg.edges.filter( - (edge) => edge.from === obj.getIdentifier() - ); - const visitedEdges = []; - - while (edges2Visit.length > 0) { - const edge = edges2Visit.pop(); - - if (visitedEdges.includes(edge)) - // this condition is made to avoid infinite loops - continue; - - visitedEdges.push(edge); - - const found = this.getObjectives().filter( - (child) => child.getIdentifier() === edge.to - ); - if (found.length == 0) { - const additionalEdges = this._cfg.edges.filter( - (nextEdge) => nextEdge.from === edge.to - ); - edges2Visit = edges2Visit.concat(additionalEdges); - } else { - childrenObj = childrenObj.concat(found); - } - } - - return childrenObj; - } - - getPossibleActions( - type?: ActionType, - returnType?: IdentifierDescription - ): ActionDescription[] { - return this.functions.filter((f) => { - if (returnType) { - // TODO this will not work (comparing typeprobability maps) - if ( - returnType.typeProbabilityMap !== f.returnParameter.typeProbabilityMap - ) { - return false; - } - } - - return ( - (type === undefined || f.type === type) && - f.visibility === ActionVisibility.PUBLIC && - f.name !== "" // fallback function has no name - ); - }); - } - - get type(): SubjectType { - return this._type; - } -} diff --git a/libraries/javascript/lib/testbuilding/JavaScriptSuiteBuilder.ts b/libraries/javascript/lib/testbuilding/JavaScriptSuiteBuilder.ts deleted file mode 100644 index d5ca8dceb..000000000 --- a/libraries/javascript/lib/testbuilding/JavaScriptSuiteBuilder.ts +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Archive, CONFIG, getUserInterface } from "@syntest/core"; -import { JavaScriptTestCase } from "../testcase/JavaScriptTestCase"; -import { - readdirSync, - readFileSync, - rmdirSync, - unlinkSync, - writeFileSync, -} from "fs"; -import * as path from "path"; -import { JavaScriptDecoder } from "./JavaScriptDecoder"; -import cloneDeep = require("lodash.clonedeep"); - -import { Runner } from "mocha"; -import { JavaScriptRunner } from "../testcase/execution/JavaScriptRunner"; -import { JavaScriptTargetPool } from "../analysis/static/JavaScriptTargetPool"; - -export class JavaScriptSuiteBuilder { - private decoder: JavaScriptDecoder; - private runner: JavaScriptRunner; - - constructor(decoder: JavaScriptDecoder, runner: JavaScriptRunner) { - this.decoder = decoder; - this.runner = runner; - } - - /** - * Removes all files that match the given regex within a certain directory - * @param dirPath the directory to clear - * @param match the regex to which the files must match - */ - async clearDirectory(dirPath: string, match = /.*\.(js)/g) { - const dirContent = await readdirSync(dirPath); - - for (const file of dirContent.filter((el: string) => el.match(match))) { - await unlinkSync(path.resolve(dirPath, file)); - } - } - - async createSuite( - archive: Map, - sourceDir: string, - testDir: string, - addLogs: boolean, - compact: boolean - ): Promise { - const paths: string[] = []; - // write the test cases with logs to know what to assert - if (!compact) { - for (const key of archive.keys()) { - for (const testCase of archive.get(key)) { - const testPath = path.join( - testDir, - `test${key}${testCase.id}.spec.js` - ); - paths.push(testPath); - await writeFileSync( - testPath, - this.decoder.decode(testCase, "", addLogs, sourceDir) - ); - } - } - } else { - for (const key of archive.keys()) { - const testPath = path.join(testDir, `test-${key}.spec.js`); - paths.push(testPath); - await writeFileSync( - testPath, - this.decoder.decode(archive.get(key), `${key}`, addLogs, sourceDir) - ); - } - } - - return paths; - } - - async runSuite( - paths: string[], - report: boolean, - targetPool: JavaScriptTargetPool - ) { - const runner: Runner = await this.runner.run(paths); - - const stats = runner.stats; - - if (report) { - if (stats.failures > 0) { - getUserInterface().error("Test case has failed!"); - } - - getUserInterface().report("header", ["SEARCH RESULTS"]); - const instrumentationData = cloneDeep(global.__coverage__); - - getUserInterface().report("report-coverage", [ - "Coverage report", - ({ - branch: "Branch", - statement: "Statement", - function: "Function", - }), - "true", - ]); - - const overall = { - branch: 0, - statement: 0, - function: 0, - }; - let totalBranches = 0; - let totalStatements = 0; - let totalFunctions = 0; - for (const file of Object.keys(instrumentationData)) { - if (!targetPool.targets.find((t) => t.canonicalPath === file)) { - continue; - } - - const data = instrumentationData[file]; - - const summary = { - branch: 0, - statement: 0, - function: 0, - }; - - for (const statementKey of Object.keys(data.s)) { - summary["statement"] += data.s[statementKey] ? 1 : 0; - overall["statement"] += data.s[statementKey] ? 1 : 0; - } - - for (const branchKey of Object.keys(data.b)) { - summary["branch"] += data.b[branchKey][0] ? 1 : 0; - overall["branch"] += data.b[branchKey][0] ? 1 : 0; - summary["branch"] += data.b[branchKey][1] ? 1 : 0; - overall["branch"] += data.b[branchKey][1] ? 1 : 0; - } - - for (const functionKey of Object.keys(data.f)) { - summary["function"] += data.f[functionKey] ? 1 : 0; - overall["function"] += data.f[functionKey] ? 1 : 0; - } - - totalStatements += Object.keys(data.s).length; - totalBranches += Object.keys(data.b).length * 2; - totalFunctions += Object.keys(data.f).length; - - getUserInterface().report("report-coverage", [file, ({ - statement: - summary["statement"] + " / " + Object.keys(data.s).length, - branch: summary["branch"] + " / " + Object.keys(data.b).length * 2, - function: summary["function"] + " / " + Object.keys(data.f).length, - }), "false"]); - } - - overall["statement"] /= totalStatements; - overall["branch"] /= totalBranches; - overall["function"] /= totalFunctions; - - getUserInterface().report("report-coverage", ["Total", ({ - statement: overall["statement"] * 100 + " %", - branch: overall["branch"] * 100 + " %", - function: overall["function"] * 100 + " %", - }), "true"]); - } - - this.runner.resetInstrumentationData(); - } - - async gatherAssertions(testCases: JavaScriptTestCase[]): Promise { - for (const testCase of testCases) { - const assertions = new Map(); - try { - // extract the log statements - const dir = await readdirSync( - path.join(CONFIG.tempLogDirectory, testCase.id) - ); - - for (const file of dir) { - const assertionValue = await readFileSync( - path.join(CONFIG.tempLogDirectory, testCase.id, file), - "utf8" - ); - assertions.set(file, assertionValue); - } - } catch (error) { - continue; - } - - await this.clearDirectory( - path.join(CONFIG.tempLogDirectory, testCase.id), - /.*/g - ); - await rmdirSync(path.join(CONFIG.tempLogDirectory, testCase.id)); - - testCase.assertions = assertions; - } - } - - reduceArchive( - archive: Archive - ): Map { - const reducedArchive = new Map(); - - for (const objective of archive.getObjectives()) { - const targetName = objective - .getSubject() - .name.split("/") - .pop() - .split(".")[0]; - - if (!reducedArchive.has(targetName)) { - reducedArchive.set(targetName, []); - } - - if ( - reducedArchive - .get(targetName) - .includes(archive.getEncoding(objective) as JavaScriptTestCase) - ) { - // skip duplicate individuals (i.e. individuals which cover multiple objectives - continue; - } - - reducedArchive - .get(targetName) - .push(archive.getEncoding(objective) as JavaScriptTestCase); - } - - return reducedArchive; - } -} diff --git a/libraries/javascript/lib/testcase/execution/ExecutionInformationIntegrator.ts b/libraries/javascript/lib/testcase/execution/ExecutionInformationIntegrator.ts deleted file mode 100644 index d6ab56787..000000000 --- a/libraries/javascript/lib/testcase/execution/ExecutionInformationIntegrator.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { JavaScriptTestCase } from "../JavaScriptTestCase"; -import { Statement } from "../statements/Statement"; -import Mocha = require("mocha"); - -export default class ExecutionInformationIntegrator { - // eslint-disable-next-line - processSuccess(testCase: JavaScriptTestCase, testResult: Mocha.Test) { - // TODO - // const queue: Statement[] = [testCase.root] - // - // while (queue.length) { - // const root = queue.pop() - // const children = root.getChildren() - // - // for (const child of children) { - // child.identifierDescription.typeProbabilityMap.addExecutionScore(child.type, 1) - // queue.push(child) - // } - // } - } - - processError(testCase: JavaScriptTestCase, testResult: Mocha.Test) { - // console.log(testResult.err.name) - // console.log(testResult.err.message) - // console.log() - - // if (!testResult.err.stack.split('\n')[2].includes('tempTest.spec.js')) { - // // console.log(testResult.err) - // // console.log() - // return - // } - // - // if (testResult.err.name !== 'TypeError') { - // return - // } - - // console.log(testResult.err) - - const queue: Statement[] = [testCase.root]; - - while (queue.length) { - const root = queue.pop(); - const children = root.getChildren(); - - for (const child of children) { - if (testResult.err.message.includes(child.identifierDescription.name)) { - // console.log(child.identifierDescription.typeProbabilityMap) - // console.log(testResult.err) - child.identifierDescription.typeProbabilityMap.addExecutionScore( - child.type, - -1 - ); - } - queue.push(child); - } - } - } -} diff --git a/libraries/javascript/lib/testcase/sampling/JavaScriptRandomSampler.ts b/libraries/javascript/lib/testcase/sampling/JavaScriptRandomSampler.ts deleted file mode 100644 index 40d6a7800..000000000 --- a/libraries/javascript/lib/testcase/sampling/JavaScriptRandomSampler.ts +++ /dev/null @@ -1,726 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { JavaScriptTestCaseSampler } from "./JavaScriptTestCaseSampler"; -import { JavaScriptTestCase } from "../JavaScriptTestCase"; -import { CONFIG, prng } from "@syntest/core"; -import { ConstructorCall } from "../statements/root/ConstructorCall"; -import { MethodCall } from "../statements/action/MethodCall"; -import { BoolStatement } from "../statements/primitive/BoolStatement"; -import { StringStatement } from "../statements/primitive/StringStatement"; -import { NumericStatement } from "../statements/primitive/NumericStatement"; -import { RootStatement } from "../statements/root/RootStatement"; -import { Statement } from "../statements/Statement"; -import { FunctionCall } from "../statements/root/FunctionCall"; -import { JavaScriptSubject, SubjectType } from "../../search/JavaScriptSubject"; -import { ArrowFunctionStatement } from "../statements/complex/ArrowFunctionStatement"; -import { ActionDescription } from "../../analysis/static/parsing/ActionDescription"; -import { ActionType } from "../../analysis/static/parsing/ActionType"; -import { IdentifierDescription } from "../../analysis/static/parsing/IdentifierDescription"; -import { ArrayStatement } from "../statements/complex/ArrayStatement"; -import { ObjectStatement } from "../statements/complex/ObjectStatement"; -import { TypeProbability } from "../../analysis/static/types/resolving/TypeProbability"; -import { TypeEnum } from "../../analysis/static/types/resolving/TypeEnum"; -import { NullStatement } from "../statements/primitive/NullStatement"; -import { UndefinedStatement } from "../statements/primitive/UndefinedStatement"; -import { ActionVisibility } from "../../analysis/static/parsing/ActionVisibility"; -import { JavaScriptTargetPool } from "../../analysis/static/JavaScriptTargetPool"; -import { RootObject } from "../statements/root/RootObject"; -import { JavaScriptArguments } from "../../JavaScriptLauncher"; -import { Getter } from "../statements/action/Getter"; -import { Setter } from "../statements/action/Setter"; - -export class JavaScriptRandomSampler extends JavaScriptTestCaseSampler { - private targetPool: JavaScriptTargetPool; - - constructor(subject: JavaScriptSubject, targetPool: JavaScriptTargetPool) { - super(subject); - this.targetPool = targetPool; - } - - sample(): JavaScriptTestCase { - let root: RootStatement; - - if ((this._subject).type === SubjectType.function) { - root = this.sampleFunctionCall(0); - } else if ((this._subject).type === SubjectType.class) { - root = this.sampleConstructor(0); - } else if ((this._subject).type === SubjectType.object) { - root = this.sampleRootObject(0); - } - - return new JavaScriptTestCase(root); - } - - sampleFunctionCall(depth: number): FunctionCall { - const action = ( - prng.pickOne( - (this._subject).getPossibleActions( - ActionType.FUNCTION - ) - ) - ); - - const args: Statement[] = action.parameters.map((param) => - this.sampleArgument(depth + 1, param) - ); - - return new FunctionCall( - action.returnParameter, - action.returnParameter.typeProbabilityMap.getRandomType(), - prng.uniqueId(), - action.name, - args - ); - } - - sampleConstructor(depth: number): ConstructorCall { - const constructors = (this._subject).getPossibleActions( - ActionType.CONSTRUCTOR - ); - - // TODO - const typeMap = new TypeProbability([ - [ - this.subject.name, - 1, - { - name: this.subject.name, - properties: new Set(), // TODO - functions: new Set(), // tODO - }, - ], - ]); - - if (constructors.length > 0) { - const action = prng.pickOne(constructors); - - const args: Statement[] = action.parameters.map((param) => - this.sampleArgument(depth + 1, param) - ); - - const calls: Statement[] = []; - const methods = (this._subject).getPossibleActions( - ActionType.METHOD - ); - const getters = (this._subject).getPossibleActions( - ActionType.GET - ); - const setters = (this._subject).getPossibleActions( - ActionType.SET - ); - - const nCalls = - methods.length + getters.length + setters.length && - prng.nextInt(1, CONFIG.maxActionStatements); - for (let i = 0; i < nCalls; i++) { - calls.push(this.sampleMethodCall(depth + 1)); - } - - return new ConstructorCall( - { typeProbabilityMap: typeMap, name: this.subject.name }, - this.subject.name, - prng.uniqueId(), - args, - calls, - `${this.subject.name}` - ); - } else { - // if no constructors is available, we invoke the default (implicit) constructor - - const calls: Statement[] = []; - const methods = (this._subject).getPossibleActions( - ActionType.METHOD - ); - const nCalls = - methods.length && prng.nextInt(1, CONFIG.maxActionStatements); - for (let i = 0; i < nCalls; i++) { - calls.push(this.sampleMethodCall(depth + 1)); - } - - return new ConstructorCall( - { typeProbabilityMap: typeMap, name: this.subject.name }, - this.subject.name, - prng.uniqueId(), - [], - calls, - `${this._subject.name}` - ); - } - } - - sampleRootObject(depth: number): RootObject { - const constructors = (this._subject).getPossibleActions( - ActionType.CONSTRUCTOR - ); - - // TODO - const typeMap = new TypeProbability([ - [ - this.subject.name, - 1, - { - name: this.subject.name, - properties: new Set(), // TODO - functions: new Set(), // tODO - }, - ], - ]); - - if (constructors.length > 0) { - const calls: Statement[] = []; - const methods = (this._subject).getPossibleActions( - ActionType.METHOD - ); - const nCalls = - methods.length && prng.nextInt(1, CONFIG.maxActionStatements); - for (let i = 0; i < nCalls; i++) { - calls.push(this.sampleMethodCall(depth + 1)); - } - - return new RootObject( - { typeProbabilityMap: typeMap, name: this.subject.name }, - this.subject.name, - prng.uniqueId(), - calls - ); - } else { - // if no constructors is available, we invoke the default (implicit) constructor - const calls: Statement[] = []; - const methods = (this._subject).getPossibleActions( - ActionType.METHOD - ); - const nCalls = - methods.length && prng.nextInt(1, CONFIG.maxActionStatements); - for (let i = 0; i < nCalls; i++) { - calls.push(this.sampleMethodCall(depth + 1)); - } - - return new RootObject( - { typeProbabilityMap: typeMap, name: this.subject.name }, - this.subject.name, - prng.uniqueId(), - calls - ); - } - } - - sampleMethodCall(depth: number): MethodCall | Getter | Setter { - const action = ( - prng.pickOne([ - ...(this._subject).getPossibleActions( - ActionType.METHOD - ), - ...(this._subject).getPossibleActions( - ActionType.GET - ), - ...(this._subject).getPossibleActions( - ActionType.SET - ), - ]) - ); - - if (action.type === ActionType.METHOD) { - const args: Statement[] = action.parameters.map((param) => { - return this.sampleArgument(depth + 1, param); - }); - - return new MethodCall( - action.returnParameter, - action.returnParameter.typeProbabilityMap.getRandomType(), - prng.uniqueId(), - action.name, - args - ); - } else if (action.type === ActionType.GET) { - return new Getter( - action.returnParameter, - action.returnParameter.typeProbabilityMap.getRandomType(), - prng.uniqueId(), - action.name - ); - } else if (action.type === ActionType.SET) { - // always one argument - const args: Statement[] = action.parameters.map((param) => { - return this.sampleArgument(depth + 1, param); - }); - return new Setter( - action.returnParameter, - action.returnParameter.typeProbabilityMap.getRandomType(), - prng.uniqueId(), - action.name, - args[0] - ); - } - - throw new Error("Invalid action type: " + action.type); - } - - sampleArgument( - depth: number, - identifierDescription: IdentifierDescription - ): Statement { - if (!identifierDescription) { - identifierDescription = { - name: "unnamed", - typeProbabilityMap: new TypeProbability(), - }; - } - - // console.log(identifierDescription.name) - // console.log(identifierDescription.typeProbabilityMap) - let chosenType: string; - - if ( - (CONFIG).typeInferenceMode === "proportional" || - (CONFIG).typeInferenceMode === "none" - ) { - chosenType = identifierDescription.typeProbabilityMap.getRandomType(); - } else if ((CONFIG).typeInferenceMode === "ranked") { - chosenType = - identifierDescription.typeProbabilityMap.getHighestProbabilityType(); - } else { - throw new Error("Invalid identifierDescription inference mode selected"); - } - - // this ensures that there is a chance of trying a random other identifierDescription - if (prng.nextBoolean((CONFIG).randomTypeProbability)) { - chosenType = "any"; - } - - if (chosenType === "any") { - // TODO other types would also be nice (complex type especially) - const typeOptions = [ - "function", - "array", - "boolean", - "string", - "numeric", - "null", - "undefined", - "object", - ]; - chosenType = prng.pickOne(typeOptions); - - // if (depth <= Properties.max_depth) { - // const complexObjects = new Map() - // - // this.targetPool.typeResolver.availableTypes.forEach((t) => { - // [...t.objectDescription.keys()].forEach((o) => { - // complexObjects.set(o, t) - // typeOptions.push(o) - // }) - // }) - // chosenType = prng.pickOne(typeOptions) - // - // if (complexObjects.has(chosenType)) { - // identifierDescription = { - // name: identifierDescription.name, - // typeProbabilityMap: complexObjects.get(chosenType) - // } - // } - // } - } - - // TODO REGEX - if (chosenType === "function") { - return this.sampleArrowFunction(identifierDescription, chosenType, depth); - } else if (chosenType === "array") { - return this.sampleArray(identifierDescription, chosenType, depth); - } else if (chosenType === "boolean") { - return this.sampleBool(identifierDescription, chosenType); - } else if (chosenType === "string") { - return this.sampleString(identifierDescription, chosenType); - } else if (chosenType === "numeric") { - return this.sampleNumber(identifierDescription, chosenType); - } else if (chosenType === "null") { - return this.sampleNull(identifierDescription, chosenType); - } else if (chosenType === "undefined") { - return this.sampleUndefined(identifierDescription, chosenType); - } else { - // must be object - return this.sampleObject(identifierDescription, chosenType, depth); - } - - throw new Error(`Unknown type!\n${JSON.stringify(chosenType, null, 2)}`); - } - - sampleObject( - identifierDescription: IdentifierDescription, - type: string, - depth: number - ) { - const keys: StringStatement[] = []; - const values: Statement[] = []; - - const object = - identifierDescription.typeProbabilityMap.getObjectDescription(type); - - if (identifierDescription.name.includes("%")) { - throw new Error( - `Identifiers should not include % in their names: ${identifierDescription.name}` - ); - } - if (object) { - // TODO WIP - - if (object.export) { - const functionMap = this.targetPool.getFunctionMapSpecific( - object.export.filePath, - object.name - ); - - for (const key of functionMap.keys()) { - const func = functionMap.get(key); - for (const param of func.parameters) { - if (func.type === ActionType.FUNCTION) { - param.typeProbabilityMap = this.targetPool.typeResolver.getTyping( - func.scope, - param.name - ); - } else if ( - func.type === ActionType.METHOD || - func.type === ActionType.CONSTRUCTOR - ) { - param.typeProbabilityMap = this.targetPool.typeResolver.getTyping( - func.scope, - param.name - ); - } else { - throw new Error( - `Unimplemented action identifierDescription ${func.type}` - ); - } - } - // TODO return types - } - - const constructors = [...functionMap.values()].filter( - (a) => - a.type === ActionType.CONSTRUCTOR && - a.visibility === ActionVisibility.PUBLIC - ); - const constructor = constructors.find( - (c) => c.scope.filePath === object.export.filePath - ); - - if (constructor) { - const args: Statement[] = constructor.parameters.map((param) => - this.sampleArgument(depth + 1, param) - ); - - const calls: Statement[] = []; - - const methods = [...functionMap.values()].filter( - (a) => - a.type === ActionType.METHOD && - a.visibility === ActionVisibility.PUBLIC - ); - const nCalls = - methods.length && prng.nextInt(1, CONFIG.maxActionStatements); - for (let i = 0; i < nCalls; i++) { - const action: ActionDescription = prng.pickOne(methods); - const args: Statement[] = action.parameters.map((param) => { - return this.sampleArgument(depth + 1, param); - }); - - calls.push( - new MethodCall( - action.returnParameter, - action.returnParameter.typeProbabilityMap.getRandomType(), - prng.uniqueId(), - action.name, - args - ) - ); - } - - return new ConstructorCall( - identifierDescription, - object.name, - prng.uniqueId(), - args, - calls, - `${object.name}` - ); - } - } - - object.properties.forEach((p) => { - if (object.functions.has(p)) { - // prefer functions over property types - return; - } - - const typeMap = new TypeProbability(); - typeMap.addType(TypeEnum.STRING, 1, null); - - const identifierDescriptionKey = { - typeProbabilityMap: typeMap, - name: p, - }; - keys.push( - new StringStatement( - identifierDescriptionKey, - TypeEnum.STRING, - prng.uniqueId(), - p, - CONFIG.stringAlphabet, - CONFIG.stringMaxLength - ) - ); - - const propertyTypings = - identifierDescription.typeProbabilityMap.getPropertyTypes(type); - - if (propertyTypings && propertyTypings.has(p)) { - values.push( - this.sampleArgument(depth + 1, { - name: `${p}`, - typeProbabilityMap: propertyTypings.get(p), - }) - ); - } else { - values.push( - this.sampleArgument(depth + 1, { - name: `${p}`, - typeProbabilityMap: new TypeProbability(), - }) - ); - } - }); - object.functions.forEach((f) => { - const typeMap = new TypeProbability(); - typeMap.addType(TypeEnum.STRING, 1, null); - - const identifierDescriptionKey = { - typeProbabilityMap: typeMap, - name: f, - }; - keys.push( - new StringStatement( - identifierDescriptionKey, - TypeEnum.STRING, - prng.uniqueId(), - f, - CONFIG.stringAlphabet, - CONFIG.stringMaxLength - ) - ); - - const propertyTypings = - identifierDescription.typeProbabilityMap.getPropertyTypes(type); - - if (propertyTypings && propertyTypings.has(f)) { - values.push( - this.sampleArgument(depth + 1, { - name: f, - typeProbabilityMap: propertyTypings.get(f), - }) - ); - } else { - values.push( - this.sampleArrowFunction( - { name: f, typeProbabilityMap: new TypeProbability() }, - null, - depth + 1 - ) - ); - } - }); - } else { - // TODO random properties or none - } - - if (identifierDescription.name.includes("%")) { - throw new Error("XXX"); - } - - return new ObjectStatement( - identifierDescription, - type, - prng.uniqueId(), - keys, - values - ); - } - - sampleArray( - identifierDescription: IdentifierDescription, - type: string, - depth: number - ) { - const children = []; - - for (let i = 0; i < prng.nextInt(0, 5); i++) { - children.push( - this.sampleArgument(depth + 1, { - name: "arrayValue", - typeProbabilityMap: new TypeProbability(), - }) - ); - } - return new ArrayStatement( - identifierDescription, - type, - prng.uniqueId(), - children - ); - } - - sampleString( - identifierDescription: IdentifierDescription = null, - type: string = null, - alphabet = CONFIG.stringAlphabet, - maxlength = CONFIG.stringMaxLength - ): StringStatement { - if (!type) { - type = TypeEnum.STRING; - } - - if (!identifierDescription) { - const typeMap = new TypeProbability(); - typeMap.addType(type, 1, null); - identifierDescription = { typeProbabilityMap: typeMap, name: "noname" }; - } - - const valueLength = prng.nextInt(0, maxlength - 1); - let value = ""; - - for (let i = 0; i < valueLength; i++) { - value += prng.pickOne(alphabet.split("")); - } - - return new StringStatement( - identifierDescription, - type, - prng.uniqueId(), - value, - alphabet, - maxlength - ); - } - - sampleNull( - identifierDescription: IdentifierDescription = null, - type: string = null - ): NullStatement { - if (!type) { - type = TypeEnum.NULL; - } - - if (!identifierDescription) { - const typeMap = new TypeProbability(); - typeMap.addType(type, 1, null); - identifierDescription = { typeProbabilityMap: typeMap, name: "noname" }; - } - - return new NullStatement(identifierDescription, type, prng.uniqueId()); - } - - sampleArrowFunction( - identifierDescription: IdentifierDescription = null, - type: string = null, - depth: number - ): ArrowFunctionStatement { - if (!type) { - type = TypeEnum.FUNCTION; - } - if (!identifierDescription) { - const typeMap = new TypeProbability(); - typeMap.addType(type, 1, null); - identifierDescription = { typeProbabilityMap: typeMap, name: "noname" }; - } - - // TODO expectation of return value - return new ArrowFunctionStatement( - identifierDescription, - type, - prng.uniqueId(), - this.sampleArgument(depth + 1, { - name: "returnValue", - typeProbabilityMap: new TypeProbability(), - }) - ); - } - - sampleUndefined( - identifierDescription: IdentifierDescription = null, - type: string = null - ): UndefinedStatement { - if (!type) { - type = TypeEnum.UNDEFINED; - } - - if (!identifierDescription) { - const typeMap = new TypeProbability(); - typeMap.addType(type, 1, null); - identifierDescription = { typeProbabilityMap: typeMap, name: "noname" }; - } - - return new UndefinedStatement(identifierDescription, type, prng.uniqueId()); - } - - sampleBool( - identifierDescription: IdentifierDescription = null, - type: string = null - ): BoolStatement { - if (!type) { - type = TypeEnum.BOOLEAN; - } - - if (!identifierDescription) { - const typeMap = new TypeProbability(); - typeMap.addType(type, 1, null); - identifierDescription = { typeProbabilityMap: typeMap, name: "noname" }; - } - - return new BoolStatement( - identifierDescription, - type, - prng.uniqueId(), - prng.nextBoolean() - ); - } - - sampleNumber( - identifierDescription: IdentifierDescription = null, - type: string = null - ): NumericStatement { - if (!type) { - type = TypeEnum.NUMERIC; - } - - if (!identifierDescription) { - const typeMap = new TypeProbability(); - typeMap.addType(type, 1, null); - identifierDescription = { typeProbabilityMap: typeMap, name: "noname" }; - } - - // by default we create small numbers (do we need very large numbers?) - const max = 10; - const min = -10; - - return new NumericStatement( - identifierDescription, - type, - prng.uniqueId(), - prng.nextDouble(min, max) - ); - } -} diff --git a/libraries/javascript/lib/testcase/sampling/JavaScriptTestCaseSampler.ts b/libraries/javascript/lib/testcase/sampling/JavaScriptTestCaseSampler.ts deleted file mode 100644 index 010c208a4..000000000 --- a/libraries/javascript/lib/testcase/sampling/JavaScriptTestCaseSampler.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { EncodingSampler } from "@syntest/core"; - -import { JavaScriptTestCase } from "../JavaScriptTestCase"; -import { ConstructorCall } from "../statements/root/ConstructorCall"; -import { MethodCall } from "../statements/action/MethodCall"; -import { Statement } from "../statements/Statement"; -import { JavaScriptSubject } from "../../search/JavaScriptSubject"; -import { IdentifierDescription } from "../../analysis/static/parsing/IdentifierDescription"; -import { StringStatement } from "../statements/primitive/StringStatement"; -import { Getter } from "../statements/action/Getter"; -import { Setter } from "../statements/action/Setter"; - -/** - * JavaScriptRandomSampler class - * - * @author Dimitri Stallenberg - */ -export abstract class JavaScriptTestCaseSampler extends EncodingSampler { - protected constructor(subject: JavaScriptSubject) { - super(subject); - } - - abstract sampleConstructor(depth: number): ConstructorCall; - abstract sampleMethodCall(depth: number): MethodCall | Getter | Setter; - abstract sampleArgument( - depth: number, - type: IdentifierDescription - ): Statement; - - // TODO - // abstract sampleStaticMethodCall(depth: number): MethodCall; - // abstract sampleFunctionCall(depth: number): FunctionCall; - - abstract sampleString( - identifierDescription?: IdentifierDescription, - type?: string, - alphabet?: string, - maxlength?: number - ): StringStatement; - - abstract sampleBool( - identifierDescription?: IdentifierDescription, - type?: string - ); - - abstract sampleNumber( - identifierDescription?: IdentifierDescription, - type?: string - ); -} diff --git a/libraries/javascript/lib/testcase/statements/complex/ObjectStatement.ts b/libraries/javascript/lib/testcase/statements/complex/ObjectStatement.ts deleted file mode 100644 index e4593fdf6..000000000 --- a/libraries/javascript/lib/testcase/statements/complex/ObjectStatement.ts +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CONFIG, prng } from "@syntest/core"; -import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; -import { Decoding, Statement } from "../Statement"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; -import * as path from "path"; -import { StringStatement } from "../primitive/StringStatement"; -import { TypeProbability } from "../../../analysis/static/types/resolving/TypeProbability"; - -/** - * @author Dimitri Stallenberg - */ -// TODO object subtypes (get the current chosen one from the typeprobability map or something -export class ObjectStatement extends Statement { - private _keys: StringStatement[]; - private _values: Statement[]; - - constructor( - identifierDescription: IdentifierDescription, - type: string, - uniqueId: string, - keys: StringStatement[], - values: Statement[] - ) { - super(identifierDescription, type, uniqueId); - this._keys = keys; - this._values = values; - this._classType = "ObjectStatement"; - } - - mutate(sampler: JavaScriptTestCaseSampler, depth: number): ObjectStatement { - const keys = [...this._keys.map((a: Statement) => a.copy())]; - const values = [...this._values.map((a: Statement) => a.copy())]; - - // - // if (children.length !== 0) { - // const index = prng.nextInt(0, children.length - 1); - // if (prng.nextBoolean(Properties.resample_gene_probability)) { // TODO should be different property - // children[index] = sampler.sampleArgument(depth + 1, children[index].identifierDescription) - // } else { - // children[index] = children[index].mutate(sampler, depth + 1); - // } - // } - - const finalKeys = []; - const finalValues = []; - - if (finalKeys.length === 0) { - // add a child - const key = sampler.sampleString(); - finalKeys.push(key); - finalValues.push( - sampler.sampleArgument(depth + 1, { - name: key.varName, - typeProbabilityMap: new TypeProbability(), - }) - ); - } else { - // go over each child - for (let i = 0; i < finalKeys.length; i++) { - if (prng.nextBoolean(1 / finalKeys.length)) { - // Mutate this position - const choice = prng.nextDouble(); - - if (choice < 0.1) { - // 10% chance to add a call on this position - - // TODO should also look if we can add back one of the deleted ones - - const key = sampler.sampleString(); - finalKeys.push(key); - finalValues.push( - sampler.sampleArgument(depth + 1, { - name: key.varName, - typeProbabilityMap: new TypeProbability(), - }) - ); - finalKeys.push(keys[i]); - finalValues.push(values[i]); - } else if (choice < 0.2) { - // 10% chance to delete the call - } else { - // 80% chance to just mutate the call - - finalKeys.push(keys[i]); - - if (CONFIG.resampleGeneProbability) { - const propertyType = this.identifierDescription.typeProbabilityMap - .getPropertyTypes(this.type) - .get(keys[i].varName); - finalValues.push( - sampler.sampleArgument(depth + 1, { - name: keys[i].varName, - typeProbabilityMap: propertyType, - }) - ); - } else { - finalValues.push(values[i].mutate(sampler, depth + 1)); - } - } - } - } - } - - return new ObjectStatement( - this.identifierDescription, - this.type, - prng.uniqueId(), - finalKeys, - finalValues - ); - } - - copy(): ObjectStatement { - return new ObjectStatement( - this.identifierDescription, - this.type, - this.id, - this._keys.map((a) => a.copy()), - this._values.map((a) => a.copy()) - ); - } - - decode( - id: string, - options: { addLogs: boolean; exception: boolean } - ): Decoding[] { - const children = this._values - .map((a, i) => `\t"${this._keys[i].value}": ${a.varName}`) - .join(",\n\t"); - - const childStatements: Decoding[] = this._values.flatMap((a) => - a.decode(id, options) - ); - - let decoded = `const ${this.varName} = {\n${children}\n\t}`; - - if (options.addLogs) { - const logDir = path.join(CONFIG.tempLogDirectory, id, this.varName); - decoded += `\nawait fs.writeFileSync('${logDir}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; - } - - return [ - ...childStatements, - { - decoded: decoded, - reference: this, - }, - ]; - } - - getChildren(): Statement[] { - return [...this.children]; - } - - hasChildren(): boolean { - return !!this._keys.length; - } - - setChild(index: number, newChild: Statement) { - if (!newChild) { - throw new Error("Invalid new child!"); - } - - if (index >= this.children.length) { - throw new Error("Invalid child location!"); - } - - this.children[index] = newChild; - } - - get children(): Statement[] { - return this._values; - } - - getFlatTypes(): string[] { - return ["object", ...this.children.flatMap((a) => a.getFlatTypes())]; - } -} diff --git a/libraries/javascript/lib/testcase/statements/root/ConstructorCall.ts b/libraries/javascript/lib/testcase/statements/root/ConstructorCall.ts deleted file mode 100644 index 81827de02..000000000 --- a/libraries/javascript/lib/testcase/statements/root/ConstructorCall.ts +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CONFIG, prng } from "@syntest/core"; -import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; -import { RootStatement } from "./RootStatement"; -import { Decoding, Statement } from "../Statement"; -import { MethodCall } from "../action/MethodCall"; -import * as path from "path"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; -import { JavaScriptSubject } from "../../../search/JavaScriptSubject"; -import { ActionType } from "../../../analysis/static/parsing/ActionType"; -import { Setter } from "../action/Setter"; -import { Getter } from "../action/Getter"; - -/** - * @author Dimitri Stallenberg - */ -export class ConstructorCall extends RootStatement { - private readonly _constructorName: string; - - /** - * Constructor - * @param type the return identifierDescription of the constructor - * @param uniqueId optional argument - * @param args the arguments of the constructor - * @param calls the child calls on the object - * @param constructorName the name of the constructor - */ - constructor( - identifierDescription: IdentifierDescription, - type: string, - uniqueId: string, - args: Statement[], - calls: Statement[], - constructorName: string - ) { - super(identifierDescription, type, uniqueId, args, calls); - this._classType = "ConstructorCall"; - - this._constructorName = constructorName; - - for (const arg of args) { - if (arg instanceof MethodCall) { - throw new Error( - "Constructor args cannot be of identifierDescription MethodCall" - ); - } - } - - for (const call of calls) { - if ( - !( - call instanceof MethodCall || - call instanceof Getter || - call instanceof Setter - ) - ) { - throw new Error( - "Constructor children must be of identifierDescription MethodCall, Getter, or Setter" - ); - } - } - } - - mutate(sampler: JavaScriptTestCaseSampler, depth: number): ConstructorCall { - // TODO replace entire constructor? - const args = [...this.args.map((a: Statement) => a.copy())]; - const calls = [...this.children.map((a: Statement) => a.copy())]; - - if (args.length !== 0) { - // go over each arg - for (let i = 0; i < args.length; i++) { - if (prng.nextBoolean(1 / args.length)) { - if (prng.nextBoolean(CONFIG.resampleGeneProbability)) { - // TODO should be different property - args[i] = sampler.sampleArgument( - depth + 1, - args[i].identifierDescription - ); - } else { - args[i] = args[i].mutate(sampler, depth + 1); - } - } - } - } - - const methodsAvailable = !!(( - sampler.subject - )).getPossibleActions(ActionType.METHOD).length; - - const finalCalls = []; - if (calls.length === 0 && methodsAvailable) { - // add a call - finalCalls.push(sampler.sampleMethodCall(depth + 1)); - } else { - // go over each call - for (let i = 0; i < calls.length; i++) { - if (prng.nextBoolean(1 / calls.length)) { - // Mutate this position - const choice = prng.nextDouble(); - - if (choice < 0.1 && methodsAvailable) { - // 10% chance to add a call on this position - finalCalls.push(sampler.sampleMethodCall(depth + 1)); - finalCalls.push(calls[i]); - } else if (choice < 0.2) { - // 10% chance to delete the call - } else { - // 80% chance to just mutate the call - if (CONFIG.resampleGeneProbability) { - finalCalls.push(sampler.sampleMethodCall(depth + 1)); - } else { - finalCalls.push(calls[i].mutate(sampler, depth + 1)); - } - } - } - } - } - - // if (args.length > 0) { - // const index = prng.nextInt(0, args.length - 1); - // if (args[index] !== undefined) - // args[index] = args[index].mutate(sampler, depth + 1); - // } - - return new ConstructorCall( - this.identifierDescription, - this.type, - prng.uniqueId(), - args, - finalCalls, - this.constructorName - ); - } - - copy(): ConstructorCall { - const deepCopyArgs = [...this.args.map((a: Statement) => a.copy())]; - const deepCopyChildren = [...this.children.map((a: Statement) => a.copy())]; - - return new ConstructorCall( - this.identifierDescription, - this.type, - this.id, - deepCopyArgs, - deepCopyChildren, - this.constructorName - ); - } - - get constructorName(): string { - return this._constructorName; - } - - decode( - id: string, - options: { addLogs: boolean; exception: boolean } - ): Decoding[] { - const args = this.args.map((a) => a.varName).join(", "); - - const argStatements: Decoding[] = this.args.flatMap((a) => - a.decode(id, options) - ); - - const childStatements: Decoding[] = this.children.flatMap((a: MethodCall) => - a.decodeWithObject(id, options, this.varName) - ); - - let decoded = `const ${this.varName} = new ${this.constructorName}(${args})`; - - if (options.addLogs) { - const logDir = path.join(CONFIG.tempLogDirectory, id, this.varName); - decoded += `\nawait fs.writeFileSync('${logDir}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; - } - - return [ - ...argStatements, - { - decoded: decoded, - reference: this, - }, - ...childStatements, - ]; - } -} diff --git a/libraries/javascript/lib/testcase/statements/root/RootObject.ts b/libraries/javascript/lib/testcase/statements/root/RootObject.ts deleted file mode 100644 index 1378208ea..000000000 --- a/libraries/javascript/lib/testcase/statements/root/RootObject.ts +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CONFIG, prng } from "@syntest/core"; -import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; -import { RootStatement } from "./RootStatement"; -import { Decoding, Statement } from "../Statement"; -import { MethodCall } from "../action/MethodCall"; -import * as path from "path"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; -import { JavaScriptSubject } from "../../../search/JavaScriptSubject"; -import { ActionType } from "../../../analysis/static/parsing/ActionType"; - -/** - * @author Dimitri Stallenberg - */ -export class RootObject extends RootStatement { - /** - * Constructor - * @param type the return identifierDescription of the constructor - * @param uniqueId optional argument - * @param calls the child calls on the object - */ - constructor( - identifierDescription: IdentifierDescription, - type: string, - uniqueId: string, - calls: Statement[] - ) { - super(identifierDescription, type, uniqueId, [], calls); - this._classType = "RootObject"; - - for (const call of calls) { - if (!(call instanceof MethodCall)) { - throw new Error( - "Constructor children must be of identifierDescription MethodCall" - ); - } - } - } - - mutate(sampler: JavaScriptTestCaseSampler, depth: number): RootObject { - // TODO replace entire constructor? - const calls = [...this.children.map((a: Statement) => a.copy())]; - - const methodsAvailable = !!(( - sampler.subject - )).getPossibleActions(ActionType.METHOD).length; - - const finalCalls = []; - if (calls.length === 0 && methodsAvailable) { - // add a call - finalCalls.push(sampler.sampleMethodCall(depth + 1)); - } else { - // go over each call - for (let i = 0; i < calls.length; i++) { - if (prng.nextBoolean(1 / calls.length)) { - // Mutate this position - const choice = prng.nextDouble(); - - if (choice < 0.1 && methodsAvailable) { - // 10% chance to add a call on this position - finalCalls.push(sampler.sampleMethodCall(depth + 1)); - finalCalls.push(calls[i]); - } else if (choice < 0.2) { - // 10% chance to delete the call - } else { - // 80% chance to just mutate the call - if (CONFIG.resampleGeneProbability) { - finalCalls.push(sampler.sampleMethodCall(depth + 1)); - } else { - finalCalls.push(calls[i].mutate(sampler, depth + 1)); - } - } - } - } - } - - // if (args.length > 0) { - // const index = prng.nextInt(0, args.length - 1); - // if (args[index] !== undefined) - // args[index] = args[index].mutate(sampler, depth + 1); - // } - - return new RootObject( - this.identifierDescription, - this.type, - prng.uniqueId(), - finalCalls - ); - } - - copy(): RootObject { - const deepCopyChildren = [...this.children.map((a: Statement) => a.copy())]; - - return new RootObject( - this.identifierDescription, - this.type, - this.id, - deepCopyChildren - ); - } - - decode( - id: string, - options: { addLogs: boolean; exception: boolean } - ): Decoding[] { - const childStatements: Decoding[] = this.children.flatMap((a: MethodCall) => - a.decodeWithObject(id, options, this.varName) - ); - - let decoded = `const ${this.varName} = ${this.type}`; - - if (options.addLogs) { - const logDir = path.join(CONFIG.tempLogDirectory, id, this.varName); - decoded += `\nawait fs.writeFileSync('${logDir}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; - } - - return [ - { - decoded: decoded, - reference: this, - }, - ...childStatements, - ]; - } -} diff --git a/libraries/javascript/lib/ui/JavaScriptCommandLineInterface.ts b/libraries/javascript/lib/ui/JavaScriptCommandLineInterface.ts deleted file mode 100644 index cdc3e06b2..000000000 --- a/libraries/javascript/lib/ui/JavaScriptCommandLineInterface.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CommandLineInterface } from "@syntest/core"; - -import Messages from "./Messages"; - -import * as clear from "clear"; - -/** - * A javascript specific command line interface. - * @author Dimitri - */ -export class JavaScriptCommandLineInterface extends CommandLineInterface { - private messages: Messages; - - constructor(silent = false, verbose = false, messages: Messages) { - super(silent, verbose); - this.messages = messages; - } - - report(text: string, args = []): void { - switch (text) { - case "clear": - return clear(); - case "asciiArt": - return console.log(this.messages.asciiArt(args[0])); - case "version": - return console.log(this.messages.version(args[0])); - case "skip-files": - if (!args.length) { - return; - } - return console.log(this.messages.skipFiles(args)); - case "targets": - return console.log(this.messages.targets(args)); - case "single-property": - return console.log(this.messages.singleProperty(args[0], args[1])); - case "property-set": - return console.log(this.messages.propertySet(args[0], args[1])); - case "header": - return console.log(this.messages.header(args[0])); - case "skipping": - return console.log( - `Skipping '${args[0]}' no possible function calls found!` - ); - case "report-coverage": - return console.log( - this.messages.reportCoverage(args[0], args[1], args[2]) - ); - } - - throw new Error(`Message not supported by UI: "${text}"`); - } -} diff --git a/libraries/javascript/lib/ui/Messages.ts b/libraries/javascript/lib/ui/Messages.ts deleted file mode 100644 index 15994c793..000000000 --- a/libraries/javascript/lib/ui/Messages.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as chalk from "chalk"; -import { textSync } from "figlet"; - -/** - * This class contains standardized functions that create colored and formatted messages to be used by the user-interface. - * @author Dimitri - */ -export default class Messages { - private ct: string = chalk.bold.green(">"); - private ds: string = chalk.bold.yellow(">"); - - asciiArt(text: string): string { - return chalk.yellow(textSync(text, { horizontalLayout: "full" })); - } - - version(syntestJavaScript: string): string { - return `\n${this.ct} ${chalk.bold( - "syntest-javascript" - )}: v${syntestJavaScript}`; - } - - skipFiles(files: string[]): string { - return ( - `\n${chalk.bold("Excluded:")}` + - `\n${chalk.bold("=====================")}\n` + - files.map((t) => `${this.ds} ${chalk.grey(t)}`).join("\n") + - `\n${chalk.bold("=====================")}` - ); - } - - targets(targets: string[]): string { - return ( - `${chalk.bold("Included:")}` + - `\n${chalk.bold("=====================")}\n` + - targets.map((t) => `${this.ct} ${t}`).join("\n") + - `\n${chalk.bold("=====================")}` - ); - } - - singleProperty(property: string, value: string): string { - return chalk.bold(`${property}: `) + `${value}`; - } - - propertySet(setName: string, props: [string, string][]): string { - return ( - `\n${chalk.bold(setName)}: \n` + - props.map((p) => `${this.ct} ${p[0]}: ${p[1]}`).join("\n") - ); - } - - header(header: string): string { - return "\n" + chalk.green(chalk.bold(`${header}`)) + "\n"; - } - - // eslint-disable-next-line - reportCoverage(name: string, report: any, bold = false): string { - if (bold) { - return chalk.bold( - `${String(report["branch"]).padStart(20, " ")} | ${String( - report["statement"] - ).padStart(20, " ")} | ${String(report["function"]).padStart( - 20, - " " - )} | ${name}` - ); - } - return `${String(report["branch"]).padStart(20, " ")} | ${String( - report["statement"] - ).padStart(20, " ")} | ${String(report["function"]).padStart( - 20, - " " - )} | ${name}`; - } -} diff --git a/libraries/javascript/lib/utils/collection.ts b/libraries/javascript/lib/utils/collection.ts deleted file mode 100644 index d61ad59d1..000000000 --- a/libraries/javascript/lib/utils/collection.ts +++ /dev/null @@ -1,200 +0,0 @@ -/* - * Copyright 2020-2023 Delft University of Technology and SynTest contributors - * - * This file is part of SynTest Framework - SynTest Javascript. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as path from "path"; -import { - Archive, - EvaluationBudget, - ExceptionObjectiveFunction, - ExecutionResult, - getSeed, - IterationBudget, - RuntimeVariable, - SearchTimeBudget, - StatisticsCollector, - TotalTimeBudget, - Encoding, - CONFIG, -} from "@syntest/core"; -import { JavaScriptSubject } from "../search/JavaScriptSubject"; - -export function collectInitialVariables( - collector: StatisticsCollector, - currentSubject: JavaScriptSubject, - targetPath: string -) { - collector.recordVariable(RuntimeVariable.VERSION, "1"); - collector.recordVariable(RuntimeVariable.CONFIGURATION, CONFIG.configuration); - collector.recordVariable(RuntimeVariable.SEED, getSeed()); - collector.recordVariable(RuntimeVariable.SUBJECT, path.basename(targetPath)); - collector.recordVariable( - RuntimeVariable.CONSTANT_POOL_ENABLED, - `${CONFIG.constantPool}` - ); - collector.recordVariable(RuntimeVariable.ALGORITHM, CONFIG.algorithm); - collector.recordVariable( - RuntimeVariable.TOTAL_OBJECTIVES, - `${currentSubject.getObjectives().length}` - ); -} - -export function collectStatistics( - collector: StatisticsCollector, - currentSubject: JavaScriptSubject, - archive: Archive, - totalTimeBudget: TotalTimeBudget, - searchBudget: SearchTimeBudget, - iterationBudget: IterationBudget, - evaluationBudget: EvaluationBudget -) { - collector.recordVariable( - RuntimeVariable.COVERED_OBJECTIVES, - `${archive.getObjectives().length}` - ); - - collector.recordVariable( - RuntimeVariable.INITIALIZATION_TIME, - `${totalTimeBudget.getUsedBudget() - searchBudget.getUsedBudget()}` - ); - collector.recordVariable( - RuntimeVariable.SEARCH_TIME, - `${searchBudget.getUsedBudget()}` - ); - collector.recordVariable( - RuntimeVariable.TOTAL_TIME, - `${totalTimeBudget.getUsedBudget()}` - ); - collector.recordVariable( - RuntimeVariable.ITERATIONS, - `${iterationBudget.getUsedBudget()}` - ); - collector.recordVariable( - RuntimeVariable.EVALUATIONS, - `${evaluationBudget.getUsedBudget()}` - ); - - const numOfExceptions = archive - .getObjectives() - .filter( - (objective) => objective instanceof ExceptionObjectiveFunction - ).length; - - collector.recordVariable( - RuntimeVariable.COVERED_EXCEPTIONS, - `${numOfExceptions}` - ); - - collector.recordVariable( - RuntimeVariable.COVERAGE, - `${ - (archive.getObjectives().length - numOfExceptions) / - currentSubject.getObjectives().length - }` - ); -} - -export function collectCoverageData( - collector: StatisticsCollector, - archive: Archive, - objectiveType: string -): void { - const total = new Set(); - const covered = new Set(); - - for (const key of archive.getObjectives()) { - const test = archive.getEncoding(key); - const result: ExecutionResult = test.getExecutionResult(); - // TODO this does not work when there are files with the same name in different directories!! - const paths = key.getSubject().path.split("/"); - const fileName = paths[paths.length - 1]; - - result - .getTraces() - .filter((element) => element.type.includes(objectiveType)) - .filter((element) => element.path.includes(fileName)) - .forEach((current) => { - total.add(current.id + "_" + current.branchType); - - if (current.hits > 0) - covered.add(current.id + "_" + current.branchType); - }); - } - - switch (objectiveType) { - case "branch": - { - collector.recordVariable( - RuntimeVariable.COVERED_BRANCHES, - `${covered.size}` - ); - collector.recordVariable( - RuntimeVariable.TOTAL_BRANCHES, - `${total.size}` - ); - - if (total.size > 0.0) { - collector.recordVariable( - RuntimeVariable.BRANCH_COVERAGE, - `${covered.size / total.size}` - ); - } else { - collector.recordVariable(RuntimeVariable.BRANCH_COVERAGE, "0"); - } - } - break; - case "statement": - { - collector.recordVariable( - RuntimeVariable.COVERED_LINES, - `${covered.size}` - ); - collector.recordVariable(RuntimeVariable.TOTAL_LINES, `${total.size}`); - - if (total.size > 0.0) { - collector.recordVariable( - RuntimeVariable.LINE_COVERAGE, - `${covered.size / total.size}` - ); - } else { - collector.recordVariable(RuntimeVariable.LINE_COVERAGE, "0"); - } - } - break; - case "function": - { - collector.recordVariable( - RuntimeVariable.COVERED_FUNCTIONS, - `${covered.size}` - ); - collector.recordVariable( - RuntimeVariable.TOTAL_FUNCTIONS, - `${total.size}` - ); - - if (total.size > 0.0) { - collector.recordVariable( - RuntimeVariable.FUNCTION_COVERAGE, - `${covered.size / total.size}` - ); - } else { - collector.recordVariable(RuntimeVariable.FUNCTION_COVERAGE, "0"); - } - } - break; - } -} diff --git a/libraries/javascript/tsconfig.json b/libraries/javascript/tsconfig.json deleted file mode 100644 index 09f54c559..000000000 --- a/libraries/javascript/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "../../tsconfig-base.json", - "files": [], - "include": [], - "references": [{ "path": "lib/" }] -} diff --git a/libraries/javascript/Dockerfile b/libraries/search-javascript/Dockerfile similarity index 100% rename from libraries/javascript/Dockerfile rename to libraries/search-javascript/Dockerfile diff --git a/libraries/javascript/LICENSE.header.ts b/libraries/search-javascript/LICENSE.header.ts similarity index 100% rename from libraries/javascript/LICENSE.header.ts rename to libraries/search-javascript/LICENSE.header.ts diff --git a/libraries/javascript/NOTICE b/libraries/search-javascript/NOTICE similarity index 100% rename from libraries/javascript/NOTICE rename to libraries/search-javascript/NOTICE diff --git a/libraries/javascript/README.md b/libraries/search-javascript/README.md similarity index 100% rename from libraries/javascript/README.md rename to libraries/search-javascript/README.md diff --git a/libraries/search-javascript/index.ts b/libraries/search-javascript/index.ts new file mode 100644 index 000000000..c37a677fa --- /dev/null +++ b/libraries/search-javascript/index.ts @@ -0,0 +1,59 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from "./lib/criterion/BranchDistance"; + +export * from "./lib/search/crossover/TreeCrossover"; + +export * from "./lib/search/JavaScriptExecutionResult"; +export * from "./lib/search/JavaScriptSubject"; + +export * from "./lib/testbuilding/JavaScriptDecoder"; +export * from "./lib/testbuilding/JavaScriptSuiteBuilder"; + +export * from "./lib/testcase/execution/ExecutionInformationIntegrator"; +export * from "./lib/testcase/execution/JavaScriptRunner"; +export * from "./lib/testcase/execution/SilentMochaReporter"; + +export * from "./lib/testcase/sampling/JavaScriptRandomSampler"; +export * from "./lib/testcase/sampling/JavaScriptTestCaseSampler"; + +export * from "./lib/testcase/statements/action/ActionStatement"; +export * from "./lib/testcase/statements/action/Getter"; +export * from "./lib/testcase/statements/action/MethodCall"; +export * from "./lib/testcase/statements/action/Setter"; + +export * from "./lib/testcase/statements/complex/ArrayStatement"; +export * from "./lib/testcase/statements/complex/ArrowFunctionStatement"; +export * from "./lib/testcase/statements/complex/ObjectStatement"; + +export * from "./lib/testcase/statements/primitive/BoolStatement"; +export * from "./lib/testcase/statements/primitive/NullStatement"; +export * from "./lib/testcase/statements/primitive/NumericStatement"; +export * from "./lib/testcase/statements/primitive/PrimitiveStatement"; +export * from "./lib/testcase/statements/primitive/StringStatement"; +export * from "./lib/testcase/statements/primitive/UndefinedStatement"; + +export * from "./lib/testcase/statements/root/ConstructorCall"; +export * from "./lib/testcase/statements/root/FunctionCall"; +export * from "./lib/testcase/statements/root/RootObject"; +export * from "./lib/testcase/statements/root/RootStatement"; + +export * from "./lib/testcase/statements/Statement"; + +export * from "./lib/testcase/JavaScriptTestCase"; diff --git a/libraries/search-javascript/lib/criterion/BranchDistance.ts b/libraries/search-javascript/lib/criterion/BranchDistance.ts new file mode 100644 index 000000000..8a46608c2 --- /dev/null +++ b/libraries/search-javascript/lib/criterion/BranchDistance.ts @@ -0,0 +1,56 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { BranchDistance as CoreBranchDistance } from "@syntest/search"; +import { BranchDistanceVisitor } from "./BranchDistanceVisitor"; +import { transformSync, traverse } from "@babel/core"; +import { defaultBabelOptions } from "@syntest/analysis-javascript"; + +export class BranchDistance extends CoreBranchDistance { + calculate( + conditionAST: string, + condition: string, + variables: Record, + trueOrFalse: boolean + ): number { + if ( + condition === undefined || + conditionAST === undefined || + variables === undefined + ) { + return 1; + } + const options: unknown = JSON.parse(JSON.stringify(defaultBabelOptions)); + + const ast = transformSync(condition, options).ast; + const visitor = new BranchDistanceVisitor(variables); + + traverse(ast, visitor); + let distance = visitor.distance; + + if (!trueOrFalse) { + distance = 1 - distance; + } + + if (distance > 1 || distance < 0) { + throw new Error("Invalid distance!"); + } + + return distance; + } +} diff --git a/libraries/search-javascript/lib/criterion/BranchDistanceVisitor.ts b/libraries/search-javascript/lib/criterion/BranchDistanceVisitor.ts new file mode 100644 index 000000000..d003795ba --- /dev/null +++ b/libraries/search-javascript/lib/criterion/BranchDistanceVisitor.ts @@ -0,0 +1,545 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { NodePath } from "@babel/core"; +import * as t from "@babel/types"; +import { AbstractSyntaxTreeVisitor } from "@syntest/ast-visitor-javascript"; +import generate from "@babel/generator"; + +export class BranchDistanceVisitor extends AbstractSyntaxTreeVisitor { + private _K = 1; // punishment factor + + private _variables: Record; + private _valueMap: Map; + private _isDistanceMap: Map; + private _distance: number; + + constructor(variables: Record) { + super(""); + this._variables = variables; + this._valueMap = new Map(); + this._isDistanceMap = new Map(); + this._distance = -1; + } + + get distance(): number { + return this._distance; + } + + public Statement: (path: NodePath) => void = (path) => { + if ( + path.isConditionalExpression() || + path.isIfStatement() || + path.isDoWhileStatement() || + path.isWhileStatement() + ) { + const test = >path.get("test"); + + test.visit(); + + const testId = this._getNodeId(test); + + if (this._isDistanceMap.get(testId)) { + this._distance = this._valueMap.get(this._getNodeId(path)); + } else { + this._distance = this._valueMap.get(this._getNodeId(path)) ? 0 : 1; + } + } + + if (path.isSwitchCase() || path.isForStatement()) { + const test = >path.get("test"); + + if (test) { + test.visit(); + const testId = this._getNodeId(test); + + if (this._isDistanceMap.get(testId)) { + this._distance = this._valueMap.get(this._getNodeId(path)); + } else { + this._distance = this._valueMap.get(this._getNodeId(path)) ? 0 : 1; + } + } else { + this._distance = 0; + } + } + + if (path.isExpressionStatement()) { + path.get("expression").visit(); + + const expression = >path.get("expression"); + const expressionId = this._getNodeId(expression); + + if (this._isDistanceMap.get(expressionId)) { + this._distance = this._valueMap.get(this._getNodeId(path)); + } else { + this._distance = this._valueMap.get(this._getNodeId(path)) ? 0 : 1; + } + } + + // TODO for in and for of + + path.skip(); + }; + + public Literal: (path: NodePath) => void = (path) => { + switch (path.node.type) { + case "NullLiteral": { + // eslint-disable-next-line unicorn/no-null + this._valueMap.set(this._getNodeId(path), null); + + break; + } + case "RegExpLiteral": { + this._valueMap.set(this._getNodeId(path), path.node.pattern); + + break; + } + case "TemplateLiteral": { + // should evaluate the template literal... not really possible with the current setup + this._valueMap.set(this._getNodeId(path), ""); + + break; + } + default: { + this._valueMap.set(this._getNodeId(path), path.node.value); + } + } + + this._isDistanceMap.set(this._getNodeId(path), false); + }; + + public Identifier: (path: NodePath) => void = (path) => { + if (this._variables[path.node.name] === undefined) { + // we dont know what this variable is... + this._valueMap.set(this._getNodeId(path), undefined); + } else { + this._valueMap.set( + this._getNodeId(path), + this._variables[path.node.name] + ); + } + this._isDistanceMap.set(this._getNodeId(path), false); + }; + + public MemberExpression: (path: NodePath) => void = ( + path + ) => { + const result = generate(path.node); + const value = this._variables[result.code]; + // might be undefined + this._valueMap.set(this._getNodeId(path), value); + this._isDistanceMap.set(this._getNodeId(path), false); + }; + + public UpdateExpression: (path: NodePath) => void = ( + path + ) => { + const argument = path.get("argument"); + argument.visit(); + + const argumentValue = this._valueMap.get(this._getNodeId(argument)); + + // should not be distance + if (this._isDistanceMap.get(this._getNodeId(argument)) === true) { + throw new Error("Argument should not result in distance value!"); + } + + let value: unknown; + // we update the arguments value afterwards + if (path.node.prefix) { + switch (path.node.operator) { + case "++": { + value = argumentValue + 1; + this._valueMap.set(this._getNodeId(argument), value); + break; + } + case "--": { + value = argumentValue - 1; + this._valueMap.set(this._getNodeId(argument), value); + break; + } + } + } else { + // postfix so it only happens after the expression is evaluated + switch (path.node.operator) { + case "++": { + value = argumentValue; + this._valueMap.set(this._getNodeId(argument), argumentValue + 1); + break; + } + case "--": { + value = argumentValue; + this._valueMap.set(this._getNodeId(argument), argumentValue - 1); + break; + } + default: { + // should be unreachable + throw new Error("Invalid operator!"); + } + } + } + + this._valueMap.set(this._getNodeId(path), value); + this._isDistanceMap.set(this._getNodeId(path), false); + path.skip(); + }; + + public UnaryExpression: (path: NodePath) => void = ( + path + ) => { + const argument = path.get("argument"); + argument.visit(); + + const argumentValue = this._valueMap.get(this._getNodeId(argument)); + + const argumentIsDistance = this._isDistanceMap.get( + this._getNodeId(argument) + ); + + if (argumentIsDistance && path.node.operator !== "!") { + throw new Error("Argument should not result in distance value!"); + } + + let value: unknown; + switch (path.node.operator) { + case "void": { + // TODO no clue + value = 0; + break; + } + case "throw": { + // TODO no clue + value = 0; + break; + } + case "delete": { + // TODO no clue + value = 0; + break; + } + case "!": { + if (argumentIsDistance) { + value = 1 - argumentValue; + } else { + value = + typeof argumentValue === "number" + ? this._normalize(Math.abs(0 - argumentValue)) + : argumentValue + ? 1 + : 0; + } + break; + } + case "+": { + value = +argumentValue; + break; + } + case "-": { + value = -argumentValue; + break; + } + case "~": { + value = ~argumentValue; + break; + } + case "typeof": { + value = typeof argumentValue; + break; + } + default: { + // should be unreachable + throw new Error("Invalid operator!"); + } + } + + if (path.node.operator === "!") { + this._isDistanceMap.set(this._getNodeId(path), true); + } else { + this._isDistanceMap.set(this._getNodeId(path), false); + } + + this._valueMap.set(this._getNodeId(path), value); + path.skip(); + }; + + public BinaryExpression: (path: NodePath) => void = ( + path + ) => { + const left = path.get("left"); + const right = path.get("right"); + + left.visit(); + right.visit(); + + const leftValue = this._valueMap.get(this._getNodeId(left)); + const rightValue = this._valueMap.get(this._getNodeId(right)); + + if (this._isDistanceMap.get(this._getNodeId(left))) { + throw new Error("Left should not result in distance value!"); + } + + if (this._isDistanceMap.get(this._getNodeId(right))) { + throw new Error("Right should not result in distance value!"); + } + + let value: unknown; + switch (path.node.operator) { + // values + case "+": { + // could also be something else + value = leftValue + rightValue; + break; + } + case "-": { + value = leftValue - rightValue; + break; + } + case "/": { + value = leftValue / rightValue; + break; + } + case "%": { + value = leftValue % rightValue; + break; + } + case "*": { + value = leftValue * rightValue; + break; + } + case "**": { + value = leftValue ** rightValue; + break; + } + + case "&": { + value = leftValue & rightValue; + break; + } + case "|": { + value = leftValue | rightValue; + break; + } + case ">>": { + value = leftValue >> rightValue; + break; + } + case ">>>": { + value = leftValue >>> rightValue; + break; + } + case "<<": { + value = leftValue << rightValue; + break; + } + case "^": { + value = leftValue ^ rightValue; + break; + } + + // distance + case "==": + // TODO + case "===": { + if (typeof leftValue === "number" && typeof rightValue === "number") { + value = this._normalize(Math.abs(leftValue - rightValue)); + } else if ( + typeof leftValue === "string" && + typeof rightValue === "string" + ) { + value = this._normalize(this._editDistDP(leftValue, rightValue)); + } else if ( + typeof leftValue === "boolean" && + typeof rightValue === "boolean" + ) { + value = leftValue === rightValue ? 0 : 1; + } else { + // TODO type difference?! + value = leftValue === rightValue ? 0 : 1; + } + break; + } + case "!=": + // TODO + case "!==": { + value = leftValue === rightValue ? 1 : 0; + break; + } + case "in": { + if (rightValue === undefined || rightValue === null) { + value = 1; + } else { + value = leftValue in rightValue ? 0 : 1; + } + break; + } + case "instanceof": { + value = leftValue instanceof rightValue ? 0 : 1; + break; + } + case ">": { + value = + leftValue > rightValue + ? 0 + : this._normalize(rightValue - leftValue + this._K); + break; + } + case "<": { + value = + leftValue < rightValue + ? 0 + : this._normalize(leftValue - rightValue + this._K); + break; + } + case ">=": { + value = + leftValue >= rightValue ? 0 : this._normalize(rightValue - leftValue); + break; + } + case "<=": { + value = + leftValue <= rightValue ? 0 : this._normalize(leftValue - rightValue); + break; + } + case "|>": { + // pipeline operator idk what to do with this + value = 0; + break; + } + default: { + // should be unreachable + throw new Error("Invalid operator!"); + } + } + + this._valueMap.set(this._getNodeId(path), value); + + if ( + [ + "==", + "===", + "!=", + "!==", + "in", + "instanceof", + ">", + "<", + ">=", + "<=", + "|>", + ].includes(path.node.operator) + ) { + this._isDistanceMap.set(this._getNodeId(path), true); + } else { + this._isDistanceMap.set(this._getNodeId(path), false); + } + + path.skip(); + }; + + public LogicalExpression: (path: NodePath) => void = ( + path + ) => { + const left = path.get("left"); + const right = path.get("right"); + + left.visit(); + right.visit(); + + let leftValue = this._valueMap.get(this._getNodeId(left)); + let rightValue = this._valueMap.get(this._getNodeId(right)); + + if (!this._isDistanceMap.get(this._getNodeId(left))) { + leftValue = leftValue ? 0 : 1; + } + + if (!this._isDistanceMap.get(this._getNodeId(right))) { + rightValue = rightValue ? 0 : 1; + } + + let value: unknown; + switch (path.node.operator) { + case "||": { + value = this._normalize(Math.min(leftValue, rightValue)); + break; + } + case "&&": { + value = this._normalize(leftValue + rightValue); + break; + } + case "??": { + // TODO no clue + value = 0; + break; + } + default: { + // should be unreachable + throw new Error("Invalid operator!"); + } + } + + this._valueMap.set(this._getNodeId(path), value); + this._isDistanceMap.set(this._getNodeId(path), true); + + path.skip(); + }; + + private _editDistDP(string1: string, string2: string) { + const m = string1.length; + const n = string2.length; + const table = []; + + for (let index = 0; index <= m; index++) { + table.push([]); + for (let index_ = 0; index_ <= n; index_++) { + table[index].push(0); + } + } + + for (let index = 0; index <= m; index++) { + for (let index_ = 0; index_ <= n; index_++) { + if (index == 0) { + table[index][index_] = index_; + } else if (index_ == 0) { + table[index][index_] = index; + } else if (string1.charAt(index - 1) === string2.charAt(index_ - 1)) { + table[index][index_] = table[index - 1][index_ - 1]; + } else { + table[index][index_] = + 1 + + Math.min( + table[index][index_ - 1], + Math.min(table[index - 1][index_], table[index - 1][index_ - 1]) + ); + } + } + } + + return table[m][n]; + } + + /** + * Based on doi:10.1109/icstw.2011.100 + * + * @param x + * @returns + */ + private _normalize(x: number): number { + // return 1 - Math.pow(1.001, -x) + return x / (x + 1); + } +} diff --git a/libraries/javascript/lib/search/JavaScriptExecutionResult.ts b/libraries/search-javascript/lib/search/JavaScriptExecutionResult.ts similarity index 89% rename from libraries/javascript/lib/search/JavaScriptExecutionResult.ts rename to libraries/search-javascript/lib/search/JavaScriptExecutionResult.ts index 928d10169..6ee6d7912 100644 --- a/libraries/javascript/lib/search/JavaScriptExecutionResult.ts +++ b/libraries/search-javascript/lib/search/JavaScriptExecutionResult.ts @@ -16,7 +16,7 @@ * limitations under the License. */ -import { ExecutionResult, Datapoint } from "@syntest/core"; +import { Datapoint, ExecutionResult } from "@syntest/search"; export enum JavaScriptExecutionStatus { PASSED, @@ -66,7 +66,7 @@ export class JavaScriptExecutionResult implements ExecutionResult { status: JavaScriptExecutionStatus, traces: Datapoint[], duration: number, - exception: string = null + exception?: string | undefined ) { this._status = status; this._traces = traces; @@ -77,6 +77,13 @@ export class JavaScriptExecutionResult implements ExecutionResult { /** * @inheritDoc */ + public coversId(id: string): boolean { + return !!this._traces.some((trace) => trace.id === id && trace.hits > 0); + } + + /** + * @deprecated + */ public coversLine(line: number): boolean { for (const trace of this._traces) { if ( @@ -116,7 +123,7 @@ export class JavaScriptExecutionResult implements ExecutionResult { * @inheritDoc */ public hasExceptions(): boolean { - return this._exception !== null; + return this._exception !== null && this._exception !== undefined; } /** diff --git a/libraries/search-javascript/lib/search/JavaScriptSubject.ts b/libraries/search-javascript/lib/search/JavaScriptSubject.ts new file mode 100644 index 000000000..caea92528 --- /dev/null +++ b/libraries/search-javascript/lib/search/JavaScriptSubject.ts @@ -0,0 +1,148 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { RootContext, SubTarget, Target } from "@syntest/analysis-javascript"; +import { TargetType } from "@syntest/analysis"; +import { ControlFlowGraph, Edge } from "@syntest/cfg"; +import { + FunctionObjectiveFunction, + ObjectiveFunction, + SearchSubject, + ApproachLevel, + shouldNeverHappen, + BranchObjectiveFunction, +} from "@syntest/search"; + +import { JavaScriptTestCase } from "../testcase/JavaScriptTestCase"; +import { BranchDistance } from "../criterion/BranchDistance"; + +export class JavaScriptSubject extends SearchSubject { + constructor(target: Target, rootContext: RootContext) { + super(target, rootContext); + } + + protected _extractObjectives(): void { + const functions = this._rootContext.getControlFlowProgram( + this._target.path + ).functions; + + // FUNCTION objectives + for (const function_ of functions) { + const graph = function_.graph; + // Branch objectives + // Find all control nodes + // I.E. nodes that have more than one outgoing edge + const controlNodeIds = [...graph.nodes.keys()].filter( + (node) => graph.getOutgoingEdges(node).length > 1 + ); + + for (const controlNodeId of controlNodeIds) { + const outGoingEdges = graph.getOutgoingEdges(controlNodeId); + + for (const edge of outGoingEdges) { + // Add objective function + this._objectives.set( + new BranchObjectiveFunction( + new ApproachLevel(), + new BranchDistance(), + this, + edge.target + ), + [] + ); + } + } + + for (const objective of this._objectives.keys()) { + const childrenObject = this.findChildren(graph, objective); + this._objectives.get(objective).push(...childrenObject); + } + + const entry = function_.graph.entry; + + const children = function_.graph.getChildren(entry.id); + + if (children.length !== 1) { + throw new Error(shouldNeverHappen("JavaScriptSubject")); //, "entry node has more than one child")) + } + + // Add objective + const functionObjective = new FunctionObjectiveFunction( + new ApproachLevel(), + new BranchDistance(), + this, + children[0].id + ); + const childObjectives = this.findChildren( + function_.graph, + functionObjective + ); + this._objectives.set(functionObjective, childObjectives); + } + } + + findChildren( + graph: ControlFlowGraph, + object: ObjectiveFunction + ): ObjectiveFunction[] { + let childObjectives: ObjectiveFunction[] = []; + + let edges2Visit = [...graph.getOutgoingEdges(object.getIdentifier())]; + + const visitedEdges: Edge[] = []; + + while (edges2Visit.length > 0) { + const edge = edges2Visit.pop(); + + if (visitedEdges.includes(edge)) + // this condition is made to avoid infinite loops + continue; + + visitedEdges.push(edge); + + const found = this.getObjectives().filter( + (child) => child.getIdentifier() === edge.target + ); + if (found.length === 0) { + const additionalEdges = graph.edges.filter( + (nextEdge) => nextEdge.source === edge.target + ); + edges2Visit = [...edges2Visit, ...additionalEdges]; + } else { + childObjectives = [...childObjectives, ...found]; + } + } + + return childObjectives; + } + + getActionableTargets(): SubTarget[] { + return this._target.subTargets.filter((t) => { + return ( + t.type === TargetType.FUNCTION || + t.type === TargetType.CLASS || + t.type === TargetType.METHOD || + t.type === TargetType.OBJECT || + t.type === TargetType.OBJECT_FUNCTION + ); + }); + } + + getActionableTargetsByType(type: TargetType): SubTarget[] { + return this.getActionableTargets().filter((t) => t.type === type); + } +} diff --git a/libraries/javascript/lib/search/crossover/JavaScriptTreeCrossover.ts b/libraries/search-javascript/lib/search/crossover/TreeCrossover.ts similarity index 70% rename from libraries/javascript/lib/search/crossover/JavaScriptTreeCrossover.ts rename to libraries/search-javascript/lib/search/crossover/TreeCrossover.ts index f89907abc..4af3806ab 100644 --- a/libraries/javascript/lib/search/crossover/JavaScriptTreeCrossover.ts +++ b/libraries/search-javascript/lib/search/crossover/TreeCrossover.ts @@ -16,11 +16,12 @@ * limitations under the License. */ -import { prng, Crossover, CONFIG } from "@syntest/core"; +import { Crossover, prng } from "@syntest/search"; import { JavaScriptTestCase } from "../../testcase/JavaScriptTestCase"; import { RootStatement } from "../../testcase/statements/root/RootStatement"; import { Statement } from "../../testcase/statements/Statement"; +import { ActionStatement } from "../../testcase/statements/action/ActionStatement"; interface QueueEntry { parent: Statement; @@ -42,41 +43,41 @@ interface QueueEntry { * @author Dimitri Stallenberg */ // TODO check if this still works -export class JavaScriptTreeCrossover implements Crossover { +export class TreeCrossover extends Crossover { public crossOver(parents: JavaScriptTestCase[]): JavaScriptTestCase[] { if (parents.length !== 2) { throw new Error("Expected exactly 2 parents, got: " + parents.length); } - const rootA: RootStatement = parents[0].copy().root; - const rootB: RootStatement = parents[1].copy().root; + const rootA: RootStatement = (parents[0].copy()).root; + const rootB: RootStatement = (parents[1].copy()).root; const queueA: QueueEntry[] = []; - for (let i = 0; i < rootA.getChildren().length; i++) { + for (let index = 0; index < rootA.getChildren().length; index++) { queueA.push({ parent: rootA, - childIndex: i, - child: rootA.getChildren()[i], + childIndex: index, + child: rootA.getChildren()[index], }); } const crossoverOptions = []; - while (queueA.length) { + while (queueA.length > 0) { const pair = queueA.shift(); if (pair.child.hasChildren()) { - pair.child.getChildren().forEach((child: Statement, index: number) => { + for (let index = 0; index < pair.child.getChildren().length; index++) { queueA.push({ parent: pair.child, childIndex: index, - child: child, + child: pair.child.getChildren()[index], }); - }); + } } - if (prng.nextBoolean(CONFIG.crossoverProbability)) { + if (prng.nextBoolean(this.crossoverStatementProbability)) { // crossover const donorSubtrees = this.findSimilarSubtree(pair.child, rootB); @@ -89,13 +90,19 @@ export class JavaScriptTreeCrossover implements Crossover { } } - if (crossoverOptions.length) { + if (crossoverOptions.length > 0) { const crossoverChoice = prng.pickOne(crossoverOptions); const pair = crossoverChoice.p1; const donorTree = crossoverChoice.p2; - pair.parent.setChild(pair.childIndex, donorTree.child.copy()); - donorTree.parent.setChild(donorTree.childIndex, pair.child.copy()); + (pair.parent).setChild( + pair.childIndex, + donorTree.child.copy() + ); + (donorTree.parent).setChild( + donorTree.childIndex, + pair.child.copy() + ); } return [new JavaScriptTestCase(rootA), new JavaScriptTestCase(rootB)]; @@ -113,32 +120,33 @@ export class JavaScriptTreeCrossover implements Crossover { const queue: QueueEntry[] = []; const similar = []; - for (let i = 0; i < tree.getChildren().length; i++) { + for (let index = 0; index < tree.getChildren().length; index++) { queue.push({ parent: tree, - childIndex: i, - child: tree.getChildren()[i], + childIndex: index, + child: tree.getChildren()[index], }); } - while (queue.length) { + while (queue.length > 0) { const pair = queue.shift(); if (pair.child.hasChildren()) { - pair.child.getChildren().forEach((child: Statement, index: number) => { + for (let index = 0; index < pair.child.getChildren().length; index++) { queue.push({ parent: pair.child, childIndex: index, - child: child, + child: pair.child.getChildren()[index], }); - }); + } } if (!wanted.classType || !pair.child.classType) { throw new Error("All statements require a classType!"); } - if (wanted.identifierDescription === pair.child.identifierDescription) { + // TODO not sure about the ids + if (wanted.id === pair.child.id) { // && wanted.classType === pair.child.classType) { TODO this might be necessary similar.push(pair); } diff --git a/libraries/javascript/lib/testbuilding/JavaScriptDecoder.ts b/libraries/search-javascript/lib/testbuilding/JavaScriptDecoder.ts similarity index 71% rename from libraries/javascript/lib/testbuilding/JavaScriptDecoder.ts rename to libraries/search-javascript/lib/testbuilding/JavaScriptDecoder.ts index f4b00ce0b..d39f78a29 100644 --- a/libraries/javascript/lib/testbuilding/JavaScriptDecoder.ts +++ b/libraries/search-javascript/lib/testbuilding/JavaScriptDecoder.ts @@ -16,36 +16,35 @@ * limitations under the License. */ -import { CONFIG, Decoder } from "@syntest/core"; +import * as path from "node:path"; + +import { Export } from "@syntest/analysis-javascript"; +import { Decoder } from "@syntest/search"; + import { JavaScriptTestCase } from "../testcase/JavaScriptTestCase"; -import * as path from "path"; -import { ConstructorCall } from "../testcase/statements/root/ConstructorCall"; -import { Decoding } from "../testcase/statements/Statement"; -import { Export } from "../analysis/static/dependency/ExportVisitor"; -import { FunctionCall } from "../testcase/statements/root/FunctionCall"; import { RootStatement } from "../testcase/statements/root/RootStatement"; -import { JavaScriptTargetPool } from "../analysis/static/JavaScriptTargetPool"; +import { Decoding } from "../testcase/statements/Statement"; export class JavaScriptDecoder implements Decoder { - private targetPool: JavaScriptTargetPool; - private dependencies: Map; private exports: Export[]; + private targetRootDirectory: string; + private tempLogDirectory: string; constructor( - targetPool: JavaScriptTargetPool, - dependencies: Map, - exports: Export[] + exports: Export[], + targetRootDirectory: string, + temporaryLogDirectory: string ) { - this.targetPool = targetPool; - this.dependencies = dependencies; this.exports = exports; + this.targetRootDirectory = targetRootDirectory; + this.tempLogDirectory = temporaryLogDirectory; } decode( testCases: JavaScriptTestCase | JavaScriptTestCase[], targetName: string, addLogs = false, - sourceDir = "../instrumented" + sourceDirectory = "../instrumented" ): string { if (testCases instanceof JavaScriptTestCase) { testCases = [testCases]; @@ -58,7 +57,7 @@ export class JavaScriptDecoder implements Decoder { const root = testCase.root; const importableGenes: RootStatement[] = []; - let statements: Decoding[] = root.decode(testCase.id, { + let statements: Decoding[] = root.decode(this, testCase.id, { addLogs, exception: false, }); @@ -67,7 +66,7 @@ export class JavaScriptDecoder implements Decoder { if (addLogs) { testString.push( `\t\tawait fs.mkdirSync('${path.join( - CONFIG.tempLogDirectory, + this.tempLogDirectory, testCase.id )}', { recursive: true })\n \t\tlet count = 0; @@ -75,8 +74,9 @@ export class JavaScriptDecoder implements Decoder { ); } - if (testCase.assertions.size !== 0 && testCase.assertions.has("error")) { - const index = parseInt(testCase.assertions.get("error")); + if (testCase.assertions.size > 0 && testCase.assertions.has("error")) { + const index = Number.parseInt(testCase.assertions.get("error")); + // TODO does not work // the .to.throw stuff does not work somehow // const decoded = statements[index].reference instanceof MethodCall @@ -88,32 +88,32 @@ export class JavaScriptDecoder implements Decoder { statements = statements.slice(0, index + 1); } - statements.forEach((value, i) => { + for (const [index, value] of statements.entries()) { if (value.reference instanceof RootStatement) { importableGenes.push(value.reference); } if (addLogs) { // add log per statement - testString.push("\t\t" + `count = ${i};`); + testString.push("\t\t" + `count = ${index};`); } testString.push("\t\t" + value.decoded.replace("\n", "\n\t\t")); - }); + } if (addLogs) { - testString.push(`} catch (e) {`); testString.push( + `} catch (e) {`, `await fs.writeFileSync('${path.join( - CONFIG.tempLogDirectory, + this.tempLogDirectory, testCase.id, "error" - )}', '' + count)` + )}', '' + count)`, + "}" ); - testString.push("}"); } const importsOfTest = this.gatherImports( - sourceDir, + sourceDirectory, testString, importableGenes ); @@ -123,30 +123,30 @@ export class JavaScriptDecoder implements Decoder { imports.push(`import * as fs from 'fs'`); } - if (testCase.assertions.size) { - imports.push(`import chai from 'chai'`); - imports.push(`import chaiAsPromised from 'chai-as-promised'`); - - imports.push(`const expect = chai.expect;`); - imports.push(`chai.use(chaiAsPromised);`); + if (testCase.assertions.size > 0) { + imports.push( + `import chai from 'chai'`, + `import chaiAsPromised from 'chai-as-promised'`, + `const expect = chai.expect;`, + `chai.use(chaiAsPromised);` + ); } const assertions: string[] = this.generateAssertions(testCase); const body = []; - if (testString.length) { + if (testString.length > 0) { let errorStatement: string; if ( - assertions.length && - testCase.assertions.size !== 0 && + assertions.length > 0 && + testCase.assertions.size > 0 && testCase.assertions.has("error") ) { errorStatement = testString.pop(); } - body.push(`${testString.join("\n")}`); - body.push(`${assertions.join("\n")}`); + body.push(`${testString.join("\n")}`, `${assertions.join("\n")}`); if (errorStatement) { body.push( @@ -163,9 +163,10 @@ export class JavaScriptDecoder implements Decoder { ); } - if (imports.find((x) => x.includes("import") && !x.includes("require"))) { + if (imports.some((x) => x.includes("import") && !x.includes("require"))) { const importsString = imports + // remove duplicates .filter((value, index, self) => self.indexOf(value) === index) .join("\n") + `\n\n`; @@ -179,6 +180,7 @@ export class JavaScriptDecoder implements Decoder { } else { const importsString = imports + // remove duplicates .filter((value, index, self) => self.indexOf(value) === index) .join("\n\t") + `\n\n`; @@ -193,7 +195,7 @@ export class JavaScriptDecoder implements Decoder { } gatherImports( - sourceDir: string, + sourceDirectory: string, testStrings: string[], importableGenes: RootStatement[] ): string[] { @@ -201,23 +203,23 @@ export class JavaScriptDecoder implements Decoder { const importedDependencies: Set = new Set(); for (const gene of importableGenes) { - const importName = - gene instanceof FunctionCall - ? gene.functionName - : gene instanceof ConstructorCall - ? gene.constructorName - : gene.type; - const complexObject = - gene.identifierDescription.typeProbabilityMap.getObjectDescription( - importName + // TODO how to get the export of a variable? + // the below does not work with duplicate exports + let export_: Export = this.exports.find((x) => x.id === gene.id); + + if (!export_) { + // dirty hack to fix certain exports + export_ = this.exports.find( + (x) => + gene.id.split(":")[0] === x.filePath && + (x.name === gene.name || x.renamedTo === gene.name) ); - const export_: Export = - complexObject?.export || - this.exports.find((x) => x.name === importName); + } + if (!export_) { throw new Error( "Cannot find an export corresponding to the importable gene: " + - importName + gene.id ); } @@ -228,11 +230,11 @@ export class JavaScriptDecoder implements Decoder { importedDependencies.add(export_.name); // skip non-used imports - if (!testStrings.find((s) => s.includes(export_.name))) { + if (!testStrings.some((s) => s.includes(export_.name))) { continue; } - const importString: string = this.getImport(sourceDir, export_); + const importString: string = this.getImport(sourceDirectory, export_); if (imports.includes(importString) || importString.length === 0) { continue; @@ -268,29 +270,30 @@ export class JavaScriptDecoder implements Decoder { return imports; } - getImport(sourceDir: string, dependency: Export): string { + getImport(sourceDirectory: string, dependency: Export): string { const _path = dependency.filePath.replace( - path.resolve(CONFIG.targetRootDirectory), - path.join(sourceDir, path.basename(CONFIG.targetRootDirectory)) + path.resolve(this.targetRootDirectory), + path.join(sourceDirectory, path.basename(this.targetRootDirectory)) ); + // if (dependency.module) { + // return dependency.default + // ? `import * as ${dependency.name} from "${_path}";` + // : `import {${dependency.name}} from "${_path}";`; + // } if (dependency.module) { - if (dependency.default) { - return `import * as ${dependency.name} from "${_path}";`; - } else { - return `import {${dependency.name}} from "${_path}";`; - } - } - if (dependency.default) { - return `import ${dependency.name} from "${_path}";`; - } else { - return `import {${dependency.name}} from "${_path}";`; + return dependency.default + ? `const ${dependency.name} = require("${_path}");` + : `const {${dependency.name}} = require("${_path}");`; } + return dependency.default + ? `import ${dependency.name} from "${_path}";` + : `import {${dependency.name}} from "${_path}";`; } generateAssertions(testCase: JavaScriptTestCase): string[] { const assertions: string[] = []; - if (testCase.assertions.size !== 0) { + if (testCase.assertions.size > 0) { for (const variableName of testCase.assertions.keys()) { if (variableName === "error") { continue; @@ -313,6 +316,7 @@ export class JavaScriptDecoder implements Decoder { stringified = stringified.replace("undefined", "null"); stringified = stringified.replace("NaN", "null"); + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const value = JSON.parse(stringified); if (typeof value === "object" || typeof value === "function") { @@ -329,4 +333,8 @@ export class JavaScriptDecoder implements Decoder { return assertions; } + + getLogDirectory(id: string, variableName: string): string { + return path.join(this.tempLogDirectory, id, variableName); + } } diff --git a/libraries/search-javascript/lib/testbuilding/JavaScriptSuiteBuilder.ts b/libraries/search-javascript/lib/testbuilding/JavaScriptSuiteBuilder.ts new file mode 100644 index 000000000..05116229b --- /dev/null +++ b/libraries/search-javascript/lib/testbuilding/JavaScriptSuiteBuilder.ts @@ -0,0 +1,182 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + readdirSync, + readFileSync, + rmdirSync, + unlinkSync, + writeFileSync, +} from "node:fs"; +import * as path from "node:path"; + +import { Archive } from "@syntest/search"; +import { InstrumentationData } from "@syntest/instrumentation-javascript"; +import cloneDeep = require("lodash.clonedeep"); +import { Runner } from "mocha"; + +import { JavaScriptRunner } from "../testcase/execution/JavaScriptRunner"; +import { JavaScriptTestCase } from "../testcase/JavaScriptTestCase"; + +import { JavaScriptDecoder } from "./JavaScriptDecoder"; + +export class JavaScriptSuiteBuilder { + private decoder: JavaScriptDecoder; + private runner: JavaScriptRunner; + private tempLogDirectory: string; + + constructor( + decoder: JavaScriptDecoder, + runner: JavaScriptRunner, + temporaryLogDirectory: string + ) { + this.decoder = decoder; + this.runner = runner; + this.tempLogDirectory = temporaryLogDirectory; + } + + /** + * Removes all files that match the given regex within a certain directory + * @param directoryPath the directory to clear + * @param match the regex to which the files must match + */ + clearDirectory(directoryPath: string, match = /.*\.(js)/g): void { + const directoryContent = readdirSync(directoryPath); + + for (const file of directoryContent.filter((element: string) => + element.match(match) + )) { + unlinkSync(path.resolve(directoryPath, file)); + } + } + + createSuite( + archive: Map, + sourceDirectory: string, + testDirectory: string, + addLogs: boolean, + compact: boolean + ): string[] { + const paths: string[] = []; + + // write the test cases with logs to know what to assert + if (compact) { + for (const key of archive.keys()) { + const testPath = path.join(testDirectory, `test-${key}.spec.js`); + paths.push(testPath); + writeFileSync( + testPath, + this.decoder.decode( + archive.get(key), + `${key}`, + addLogs, + sourceDirectory + ) + ); + } + } else { + for (const key of archive.keys()) { + for (const testCase of archive.get(key)) { + const testPath = path.join( + testDirectory, + `test${key}${testCase.id}.spec.js` + ); + paths.push(testPath); + writeFileSync( + testPath, + this.decoder.decode(testCase, "", addLogs, sourceDirectory) + ); + } + } + } + + return paths; + } + + async runSuite(paths: string[]) { + const runner: Runner = await this.runner.run(paths); + + const stats = runner.stats; + + const instrumentationData = ( + cloneDeep( + (<{ __coverage__: InstrumentationData }>(global)).__coverage__ + ) + ); + + this.runner.resetInstrumentationData(); + + return { stats, instrumentationData }; + } + + gatherAssertions(testCases: JavaScriptTestCase[]): void { + for (const testCase of testCases) { + const assertions = new Map(); + try { + // extract the log statements + const logDirectory = readdirSync( + path.join(this.tempLogDirectory, testCase.id) + ); + + for (const file of logDirectory) { + const assertionValue = readFileSync( + path.join(this.tempLogDirectory, testCase.id, file), + "utf8" + ); + assertions.set(file, assertionValue); + } + } catch { + continue; + } + + this.clearDirectory(path.join(this.tempLogDirectory, testCase.id), /.*/g); + rmdirSync(path.join(this.tempLogDirectory, testCase.id)); + + testCase.assertions = assertions; + } + } + + reduceArchive( + archive: Archive + ): Map { + const reducedArchive = new Map(); + + for (const objective of archive.getObjectives()) { + const targetName = objective + .getSubject() + .name.split("/") + .pop() + .split(".")[0]; + + if (!reducedArchive.has(targetName)) { + reducedArchive.set(targetName, []); + } + + if ( + reducedArchive.get(targetName).includes(archive.getEncoding(objective)) + ) { + // skip duplicate individuals (i.e. individuals which cover multiple objectives + continue; + } + + reducedArchive.get(targetName).push(archive.getEncoding(objective)); + } + + return reducedArchive; + } +} diff --git a/libraries/javascript/lib/testcase/JavaScriptTestCase.ts b/libraries/search-javascript/lib/testcase/JavaScriptTestCase.ts similarity index 69% rename from libraries/javascript/lib/testcase/JavaScriptTestCase.ts rename to libraries/search-javascript/lib/testcase/JavaScriptTestCase.ts index 7239e449f..76166bba5 100644 --- a/libraries/javascript/lib/testcase/JavaScriptTestCase.ts +++ b/libraries/search-javascript/lib/testcase/JavaScriptTestCase.ts @@ -16,9 +16,11 @@ * limitations under the License. */ -import { getUserInterface, Encoding, Decoder, CONFIG } from "@syntest/core"; -import { JavaScriptTestCaseSampler } from "./sampling/JavaScriptTestCaseSampler"; +import { Decoder, Encoding } from "@syntest/search"; +import { getLogger, Logger } from "@syntest/logging"; + import { RootStatement } from "./statements/root/RootStatement"; +import { JavaScriptTestCaseSampler } from "./sampling/JavaScriptTestCaseSampler"; /** * JavaScriptTestCase class @@ -26,6 +28,8 @@ import { RootStatement } from "./statements/root/RootStatement"; * @author Dimitri Stallenberg */ export class JavaScriptTestCase extends Encoding { + protected static LOGGER: Logger; + private _root: RootStatement; /** @@ -35,31 +39,30 @@ export class JavaScriptTestCase extends Encoding { */ constructor(root: RootStatement) { super(); + JavaScriptTestCase.LOGGER = getLogger(JavaScriptTestCase.name); this._root = root; } - mutate(sampler: JavaScriptTestCaseSampler) { - getUserInterface().debug(`Mutating test case: ${this._id}`); - if (CONFIG.resampleGeneProbability) { - return sampler.sample(); - } else { - return new JavaScriptTestCase(this._root.mutate(sampler, 0)); - } + mutate(sampler: JavaScriptTestCaseSampler): JavaScriptTestCase { + JavaScriptTestCase.LOGGER.debug(`Mutating test case: ${this._id}`); + return sampler.resampleGeneProbability + ? sampler.sample() + : new JavaScriptTestCase(this._root.mutate(sampler, 0)); } hashCode(decoder: Decoder): number { const string = decoder.decode(this, `${this.id}`); let hash = 0; - for (let i = 0; i < string.length; i++) { - const character = string.charCodeAt(i); + for (let index = 0; index < string.length; index++) { + const character = string.codePointAt(index); hash = (hash << 5) - hash + character; hash = hash & hash; // Convert to 32bit integer } return hash; } - copy(): JavaScriptTestCase { - return new JavaScriptTestCase(this.root.copy()); + copy(): E { + return (new JavaScriptTestCase(this.root.copy())); } getLength(): number { diff --git a/libraries/search-javascript/lib/testcase/execution/ExecutionInformationIntegrator.ts b/libraries/search-javascript/lib/testcase/execution/ExecutionInformationIntegrator.ts new file mode 100644 index 000000000..13f6ea6eb --- /dev/null +++ b/libraries/search-javascript/lib/testcase/execution/ExecutionInformationIntegrator.ts @@ -0,0 +1,55 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import Mocha = require("mocha"); + +import { JavaScriptTestCase } from "../JavaScriptTestCase"; +import { Statement } from "../statements/Statement"; +import { TypeModel } from "@syntest/analysis-javascript"; + +export class ExecutionInformationIntegrator { + private _typeModel: TypeModel; + + constructor(typeModel: TypeModel) { + this._typeModel = typeModel; + } + + process( + testCase: JavaScriptTestCase, + testResult: Mocha.Test, + stats: Mocha.Stats + ) { + if (stats.failures === 0) { + return; + } + + const queue: Statement[] = [testCase.root]; + + while (queue.length > 0) { + const root = queue.pop(); + const children = root.getChildren(); + + for (const child of children) { + if (testResult.err.message.includes(child.name)) { + this._typeModel.addExecutionScore(child.id, child.type, -1); + } + queue.push(child); + } + } + } +} diff --git a/libraries/javascript/lib/testcase/execution/JavaScriptRunner.ts b/libraries/search-javascript/lib/testcase/execution/JavaScriptRunner.ts similarity index 51% rename from libraries/javascript/lib/testcase/execution/JavaScriptRunner.ts rename to libraries/search-javascript/lib/testcase/execution/JavaScriptRunner.ts index f259b8d81..8824e0943 100644 --- a/libraries/javascript/lib/testcase/execution/JavaScriptRunner.ts +++ b/libraries/search-javascript/lib/testcase/execution/JavaScriptRunner.ts @@ -16,55 +16,65 @@ * limitations under the License. */ +import { unlinkSync, writeFileSync } from "node:fs"; +import * as path from "node:path"; + +import { Datapoint, EncodingRunner, ExecutionResult } from "@syntest/search"; import { - CONFIG, - Datapoint, - EncodingRunner, - ExecutionResult, - getUserInterface, -} from "@syntest/core"; -import { JavaScriptTestCase } from "../JavaScriptTestCase"; -import { JavaScriptSubject } from "../../search/JavaScriptSubject"; -import * as path from "path"; + InstrumentationData, + MetaData, +} from "@syntest/instrumentation-javascript"; +import { getLogger, Logger } from "@syntest/logging"; +import cloneDeep = require("lodash.clonedeep"); +import { Runner } from "mocha"; +import Mocha = require("mocha"); + import { JavaScriptExecutionResult, JavaScriptExecutionStatus, } from "../../search/JavaScriptExecutionResult"; -import cloneDeep = require("lodash.clonedeep"); -import { SilentMochaReporter } from "./SilentMochaReporter"; -import ExecutionInformationIntegrator from "./ExecutionInformationIntegrator"; - -import { Runner } from "mocha"; -import { unlinkSync, writeFileSync } from "fs"; +import { JavaScriptSubject } from "../../search/JavaScriptSubject"; import { JavaScriptDecoder } from "../../testbuilding/JavaScriptDecoder"; -import Mocha = require("mocha"); -import originalrequire = require("original-require"); +import { JavaScriptTestCase } from "../JavaScriptTestCase"; + +import { ExecutionInformationIntegrator } from "./ExecutionInformationIntegrator"; +import { SilentMochaReporter } from "./SilentMochaReporter"; export class JavaScriptRunner implements EncodingRunner { - protected decoder: JavaScriptDecoder; - protected errorProcessor: ExecutionInformationIntegrator; + protected static LOGGER: Logger; - constructor(decoder: JavaScriptDecoder) { + protected decoder: JavaScriptDecoder; + protected tempTestDirectory: string; + protected executionInformationIntegrator: ExecutionInformationIntegrator; + + constructor( + decoder: JavaScriptDecoder, + executionInformationIntergrator: ExecutionInformationIntegrator, + temporaryTestDirectory: string + ) { + JavaScriptRunner.LOGGER = getLogger(JavaScriptRunner.name); this.decoder = decoder; - this.errorProcessor = new ExecutionInformationIntegrator(); - - process.on("uncaughtException", (reason) => { - throw reason; - }); - process.on("unhandledRejection", (reason) => { - throw reason; - }); + this.executionInformationIntegrator = executionInformationIntergrator; + this.tempTestDirectory = temporaryTestDirectory; + + // process.on("uncaughtException", (reason) => { + // throw reason; + // }); + // process.on("unhandledRejection", (reason) => { + // throw reason; + // }); } - async writeTestCase( + writeTestCase( filePath: string, testCase: JavaScriptTestCase, targetName: string, addLogs = false - ): Promise { + ): void { + JavaScriptRunner.LOGGER.silly(`Writing test case to ${filePath}`); const decodedTestCase = this.decoder.decode(testCase, targetName, addLogs); - await writeFileSync(filePath, decodedTestCase); + writeFileSync(filePath, decodedTestCase); } /** @@ -72,11 +82,11 @@ export class JavaScriptRunner implements EncodingRunner { * * @param filepath the filepath of the file to delete */ - async deleteTestCase(filepath: string) { + deleteTestCase(filepath: string): void { try { - await unlinkSync(filepath); + unlinkSync(filepath); } catch (error) { - getUserInterface().debug(error); + JavaScriptRunner.LOGGER.debug(error); } } @@ -90,26 +100,28 @@ export class JavaScriptRunner implements EncodingRunner { const mocha = new Mocha(argv); // require('ts-node/register') - // eslint-disable-next-line + // eslint-disable-next-line unicorn/prefer-module require("regenerator-runtime/runtime"); - // eslint-disable-next-line + // eslint-disable-next-line unicorn/prefer-module, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-var-requires require("@babel/register")({ + // eslint-disable-next-line unicorn/prefer-module presets: [require.resolve("@babel/preset-env")], }); for (const _path of paths) { - delete originalrequire.cache[_path]; + // eslint-disable-next-line unicorn/prefer-module + delete require.cache[_path]; mocha.addFile(_path); } - let runner: Runner = null; + let runner: Runner; // Finally, run mocha. await new Promise((resolve) => { runner = mocha.run((failures) => resolve(failures)); }); - await mocha.dispose(); + mocha.dispose(); return runner; } @@ -117,40 +129,42 @@ export class JavaScriptRunner implements EncodingRunner { subject: JavaScriptSubject, testCase: JavaScriptTestCase ): Promise { + JavaScriptRunner.LOGGER.silly("Executing test case"); const testPath = path.resolve( - path.join(CONFIG.tempTestDirectory, "tempTest.spec.js") + path.join(this.tempTestDirectory, "tempTest.spec.js") ); - await this.writeTestCase(testPath, testCase, subject.name); + this.writeTestCase(testPath, testCase, subject.name); const runner = await this.run([testPath]); - - const stats = runner.stats; - const test = runner.suite.suites[0].tests[0]; + const stats = runner.stats; // If one of the executions failed, log it - if (stats.failures > 0) { - this.errorProcessor.processError(testCase, test); - } else { - this.errorProcessor.processSuccess(testCase, test); - } + this.executionInformationIntegrator.process(testCase, test, stats); // Retrieve execution traces - const instrumentationData = cloneDeep(global.__coverage__); - const metaData = cloneDeep(global.__meta__); + const instrumentationData = ( + cloneDeep( + (<{ __coverage__: InstrumentationData }>(global)).__coverage__ + ) + ); + const metaData = ( + cloneDeep((<{ __meta__: MetaData }>(global)).__meta__) + ); const traces: Datapoint[] = []; + for (const key of Object.keys(instrumentationData)) { for (const functionKey of Object.keys(instrumentationData[key].fnMap)) { - const fn = instrumentationData[key].fnMap[functionKey]; + const function_ = instrumentationData[key].fnMap[functionKey]; const hits = instrumentationData[key].f[functionKey]; traces.push({ - id: `f-${fn.line}`, + id: function_.loc.id, type: "function", path: key, - line: fn.line, + line: function_.line, hits: hits, }); @@ -163,7 +177,7 @@ export class JavaScriptRunner implements EncodingRunner { const hits = instrumentationData[key].s[statementKey]; traces.push({ - id: `s-${statement.start.line}`, + id: statement.id, type: "statement", path: key, line: statement.start.line, @@ -174,18 +188,16 @@ export class JavaScriptRunner implements EncodingRunner { for (const branchKey of Object.keys(instrumentationData[key].branchMap)) { const branch = instrumentationData[key].branchMap[branchKey]; - const hits = instrumentationData[key].b[branchKey]; - const meta = metaData?.[key]?.meta?.[branchKey]; + const hits = instrumentationData[key].b[branchKey]; + const meta = + metaData === undefined ? undefined : metaData[key]?.meta?.[branchKey]; traces.push({ - id: `b-${branch.line}`, + id: branch.locations[0].id, path: key, type: "branch", line: branch.line, - locationIdx: 0, - branchType: true, - hits: hits[0], condition_ast: meta?.condition_ast, @@ -193,21 +205,59 @@ export class JavaScriptRunner implements EncodingRunner { variables: meta?.variables, }); - traces.push({ - id: `b-${branch.line}`, - path: key, - type: "branch", - line: branch.line, - - locationIdx: 1, - branchType: false, - - hits: hits[1], - - condition_ast: meta?.condition_ast, - condition: meta?.condition, - variables: meta?.variables, - }); + if (branch.locations.length > 2) { + // switch case + for (const [index, location] of branch.locations.entries()) { + traces.push({ + id: location.id, + path: key, + type: branch.type, + line: branch.line, + + hits: hits[index], + + condition_ast: meta?.condition_ast, + condition: meta?.condition, + variables: meta?.variables, + }); + } + } else if (branch.locations.length === 2) { + // normal branch + // or small switch + traces.push({ + id: branch.locations[1].id, + path: key, + type: branch.type, + line: branch.line, + + hits: hits[1], + + condition_ast: meta?.condition_ast, + condition: meta?.condition, + variables: meta?.variables, + }); + } else if ( + branch.locations.length === 1 && + branch.type === "default-arg" + ) { + // this is the default-arg branch it only has one location + traces.push({ + id: branch.locations[0].id, + path: key, + type: "branch", + line: branch.line, + + hits: hits[0] ? 0 : 1, + + condition_ast: meta?.condition_ast, + condition: meta?.condition, + variables: meta?.variables, + }); + } else { + throw new Error( + `Invalid number of locations for branch type: ${branch.type}` + ); + } } } @@ -220,7 +270,7 @@ export class JavaScriptRunner implements EncodingRunner { const test = runner.suite.suites[0].tests[0]; let status: JavaScriptExecutionStatus; - let exception: string = null; + let exception: string; if (test.isPassed()) { status = JavaScriptExecutionStatus.PASSED; @@ -251,21 +301,28 @@ export class JavaScriptRunner implements EncodingRunner { this.resetInstrumentationData(); // Remove test file - await this.deleteTestCase(testPath); + this.deleteTestCase(testPath); return executionResult; } resetInstrumentationData() { - for (const key of Object.keys(global.__coverage__)) { - for (const statementKey of Object.keys(global.__coverage__[key].s)) { - global.__coverage__[key].s[statementKey] = 0; + const coverage = (<{ __coverage__: InstrumentationData }>(global)) + .__coverage__; + + if (coverage === undefined) { + return; + } + + for (const key of Object.keys(coverage)) { + for (const statementKey of Object.keys(coverage[key].s)) { + coverage[key].s[statementKey] = 0; } - for (const functionKey of Object.keys(global.__coverage__[key].f)) { - global.__coverage__[key].f[functionKey] = 0; + for (const functionKey of Object.keys(coverage[key].f)) { + coverage[key].f[functionKey] = 0; } - for (const branchKey of Object.keys(global.__coverage__[key].b)) { - global.__coverage__[key].b[branchKey] = [0, 0]; + for (const branchKey of Object.keys(coverage[key].b)) { + coverage[key].b[branchKey] = [0, 0]; } } } diff --git a/libraries/javascript/lib/testcase/execution/SilentMochaReporter.ts b/libraries/search-javascript/lib/testcase/execution/SilentMochaReporter.ts similarity index 79% rename from libraries/javascript/lib/testcase/execution/SilentMochaReporter.ts rename to libraries/search-javascript/lib/testcase/execution/SilentMochaReporter.ts index ae23ca9ba..9ef5590df 100644 --- a/libraries/javascript/lib/testcase/execution/SilentMochaReporter.ts +++ b/libraries/search-javascript/lib/testcase/execution/SilentMochaReporter.ts @@ -29,9 +29,10 @@ const { export class SilentMochaReporter { private _indents: number; - private failures; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private failures: any[]; - constructor(runner) { + constructor(runner: Mocha.Runner) { this._indents = 0; this.failures = []; @@ -58,15 +59,19 @@ export class SilentMochaReporter { test.speed = "fast"; } }) - .on(EVENT_TEST_FAIL, (test, err) => { + .on(EVENT_TEST_FAIL, (test, error) => { // if (showDiff(err)) { // stringifyDiffObjs(err); // } // more than one error per test - if (test.err && err instanceof Error) { - test.err.multiple = (test.err.multiple || []).concat(err); + if (test.err && error instanceof Error) { + (<{ multiple: unknown[] }>(test.err)).multiple = ( + (<{ multiple: unknown[] }>(test.err)).multiple || [] + ) + // eslint-disable-next-line unicorn/prefer-spread + .concat(error); } else { - test.err = err; + test.err = error; } this.failures.push(test); @@ -80,7 +85,7 @@ export class SilentMochaReporter { } indent() { - return Array(this._indents).join(" "); + return Array.from({ length: this._indents }).join(" "); } increaseIndent() { diff --git a/libraries/search-javascript/lib/testcase/sampling/JavaScriptRandomSampler.ts b/libraries/search-javascript/lib/testcase/sampling/JavaScriptRandomSampler.ts new file mode 100644 index 000000000..67580225b --- /dev/null +++ b/libraries/search-javascript/lib/testcase/sampling/JavaScriptRandomSampler.ts @@ -0,0 +1,894 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { + ClassTarget, + FunctionTarget, + getRelationName, + isExported, + MethodTarget, + ObjectFunctionTarget, + ObjectTarget, + RootContext, + TypeEnum, +} from "@syntest/analysis-javascript"; +import { prng } from "@syntest/search"; + +import { JavaScriptSubject } from "../../search/JavaScriptSubject"; +import { JavaScriptTestCase } from "../JavaScriptTestCase"; +import { Getter } from "../statements/action/Getter"; +import { MethodCall } from "../statements/action/MethodCall"; +import { Setter } from "../statements/action/Setter"; +import { ArrayStatement } from "../statements/complex/ArrayStatement"; +import { ArrowFunctionStatement } from "../statements/complex/ArrowFunctionStatement"; +import { ObjectStatement } from "../statements/complex/ObjectStatement"; +import { BoolStatement } from "../statements/primitive/BoolStatement"; +import { NullStatement } from "../statements/primitive/NullStatement"; +import { NumericStatement } from "../statements/primitive/NumericStatement"; +import { StringStatement } from "../statements/primitive/StringStatement"; +import { UndefinedStatement } from "../statements/primitive/UndefinedStatement"; +import { ConstructorCall } from "../statements/root/ConstructorCall"; +import { FunctionCall } from "../statements/root/FunctionCall"; +import { RootObject } from "../statements/root/RootObject"; +import { RootStatement } from "../statements/root/RootStatement"; +import { Statement } from "../statements/Statement"; + +import { JavaScriptTestCaseSampler } from "./JavaScriptTestCaseSampler"; +import { TargetType } from "@syntest/analysis"; +import { ObjectFunctionCall } from "../statements/action/ObjectFunctionCall"; +import { + ArrayType, + FunctionType, + ObjectType, + Type, +} from "@syntest/analysis-javascript/lib/type/resolving/Type"; + +export class JavaScriptRandomSampler extends JavaScriptTestCaseSampler { + private _rootContext: RootContext; + + constructor( + subject: JavaScriptSubject, + typeInferenceMode: string, + randomTypeProbability: number, + incorporateExecutionInformation: boolean, + maxActionStatements: number, + stringAlphabet: string, + stringMaxLength: number, + resampleGeneProbability: number, + deltaMutationProbability: number, + exploreIllegalValues: boolean + ) { + super( + subject, + typeInferenceMode, + randomTypeProbability, + incorporateExecutionInformation, + maxActionStatements, + stringAlphabet, + stringMaxLength, + resampleGeneProbability, + deltaMutationProbability, + exploreIllegalValues + ); + } + + /** + * Set the root context + * + * this cannot be part of the constructor because the root context is not available at that point + * because of the plugin structure. + */ + set rootContext(rootContext: RootContext) { + this._rootContext = rootContext; + } + + get rootContext(): RootContext { + return this._rootContext; + } + + sample(): JavaScriptTestCase { + let root: RootStatement; + + const actionableTargets = (( + this._subject + )).getActionableTargets(); + + const rootTargets = actionableTargets + .filter( + (target) => + target.type === TargetType.FUNCTION || + target.type === TargetType.CLASS || + target.type === TargetType.OBJECT + ) + .filter((target) => isExported(target)); + + if (rootTargets.length === 0) { + throw new Error( + `No root targets found in file ${this.subject.name} ${this.subject.path}` + ); + } + + const rootTarget = prng.pickOne(rootTargets); + + switch (rootTarget.type) { + case TargetType.FUNCTION: { + root = this.sampleFunctionCall(0); + + break; + } + case TargetType.CLASS: { + root = this.sampleClass(0); + + break; + } + case TargetType.OBJECT: { + root = this.sampleRootObject(0); + + break; + } + // No default + } + + return new JavaScriptTestCase(root); + } + + // sampleRoot(depth: number) { + + // } + + sampleFunctionCall(depth: number): FunctionCall { + // get a random function + const function_ = ( + prng.pickOne( + (this._subject) + .getActionableTargetsByType(TargetType.FUNCTION) + .filter((target) => isExported(target)) + ) + ); + + return this.sampleSpecificFunctionCall(depth, function_.id, function_.name); + } + + sampleSpecificFunctionCall( + depth: number, + id: string, + name: string + ): FunctionCall { + const type_ = ( + this.rootContext + .getTypeModel() + .getRandomType( + this.incorporateExecutionInformation, + id, + TypeEnum.FUNCTION + ) + ); + + const arguments_: Statement[] = this._sampleArguments(depth, type_); + + return new FunctionCall( + id, + name, + TypeEnum.FUNCTION, + prng.uniqueId(), + arguments_ + ); + } + + sampleClass(depth: number): ConstructorCall { + // get a random class + const class_ = ( + prng.pickOne( + (this._subject) + .getActionableTargetsByType(TargetType.CLASS) + .filter((target) => isExported(target)) + ) + ); + + return this.sampleSpecificClass(depth, class_.id, class_.name); + } + + sampleSpecificClass( + depth: number, + id: string, + name: string + ): ConstructorCall { + // get the constructor of the class + const constructor_ = (this._subject) + .getActionableTargetsByType(TargetType.METHOD) + .filter( + (method) => + (method).className === name && + (method).methodType === "constructor" + ); + + if (constructor_.length > 1) { + throw new Error("Multiple constructors found for class"); + } + let arguments_: Statement[] = []; + if (constructor_.length === 0) { + // default constructor no args + } else { + const action = constructor_[0]; + + const type_ = ( + this.rootContext + .getTypeModel() + .getRandomType( + this.incorporateExecutionInformation, + action.id, + TypeEnum.FUNCTION + ) + ); + + arguments_ = this._sampleArguments(depth, type_); + } + + const calls: Statement[] = []; + const methods = (this._subject) + .getActionableTargetsByType(TargetType.METHOD) + .filter( + (method) => + (method).className === name && + (method).methodType === "method" + ); + const getters = (this._subject) + .getActionableTargetsByType(TargetType.METHOD) + .filter( + (method) => + (method).className === name && + (method).methodType === "get" + ); + const setters = (this._subject) + .getActionableTargetsByType(TargetType.METHOD) + .filter( + (method) => + (method).className === name && + (method).methodType === "set" + ); + + const nCalls = + methods.length + getters.length + setters.length && + prng.nextInt(1, this.maxActionStatements); + for (let index = 0; index < nCalls; index++) { + const randomMethod = ( + prng.pickOne([...methods, ...getters, ...setters]) + ); + switch (randomMethod.methodType) { + case "method": { + calls.push( + this.sampleSpecificMethodCall( + depth + 1, + randomMethod.id, + randomMethod.name, + name + ) + ); + + break; + } + case "get": { + calls.push( + this.sampleSpecificGetter( + depth + 1, + randomMethod.id, + randomMethod.name, + name + ) + ); + + break; + } + case "set": { + calls.push( + this.sampleSpecificSetter( + depth + 1, + randomMethod.id, + randomMethod.name, + name + ) + ); + + break; + } + // No default + } + } + + return new ConstructorCall( + id, + name, + TypeEnum.OBJECT, + prng.uniqueId(), + arguments_, + calls + ); + } + + sampleClassCall( + depth: number, + className: string + ): MethodCall | Getter | Setter { + const methods = (this._subject) + .getActionableTargetsByType(TargetType.METHOD) + .filter( + (method) => + (method).className === className && + (method).methodType === "method" + ); + const getters = (this._subject) + .getActionableTargetsByType(TargetType.METHOD) + .filter( + (method) => + (method).className === className && + (method).methodType === "get" + ); + const setters = (this._subject) + .getActionableTargetsByType(TargetType.METHOD) + .filter( + (method) => + (method).className === className && + (method).methodType === "set" + ); + + const randomMethod = ( + prng.pickOne([...methods, ...getters, ...setters]) + ); + switch (randomMethod.methodType) { + case "method": { + return this.sampleSpecificMethodCall( + depth + 1, + randomMethod.id, + randomMethod.name, + className + ); + } + case "get": { + return this.sampleSpecificGetter( + depth + 1, + randomMethod.id, + randomMethod.name, + className + ); + } + case "set": { + return this.sampleSpecificSetter( + depth + 1, + randomMethod.id, + randomMethod.name, + className + ); + } + // No default + } + + throw new Error("No method found"); + } + + sampleMethodCall(depth: number, className: string): MethodCall { + const methods = (this._subject) + .getActionableTargetsByType(TargetType.METHOD) + .filter( + (method) => + (method).className === className && + (method).methodType === "method" + ); + + const method = prng.pickOne(methods); + + return this.sampleSpecificMethodCall( + depth, + method.id, + method.name, + className + ); + } + + sampleSpecificMethodCall( + depth: number, + id: string, + name: string, + className: string + ): MethodCall { + const type_ = ( + this.rootContext + .getTypeModel() + .getRandomType( + this.incorporateExecutionInformation, + id, + TypeEnum.FUNCTION + ) + ); + + const arguments_: Statement[] = this._sampleArguments(depth, type_); + + return new MethodCall( + id, + name, + TypeEnum.FUNCTION, + prng.uniqueId(), + className, + arguments_ + ); + } + + sampleGetter(depth: number, className: string): Getter { + const methods = (this._subject) + .getActionableTargetsByType(TargetType.METHOD) + .filter( + (method) => + (method).className === className && + (method).methodType === "get" + ); + + const method = prng.pickOne(methods); + + return this.sampleSpecificGetter(depth, method.id, method.name, className); + } + + sampleSpecificGetter( + depth: number, + id: string, + name: string, + className: string + ): Getter { + return new Getter(id, name, TypeEnum.FUNCTION, prng.uniqueId(), className); + } + + sampleSetter(depth: number, className: string): Setter { + const methods = (this._subject) + .getActionableTargetsByType(TargetType.METHOD) + .filter( + (method) => + (method).className === className && + (method).methodType === "set" + ); + + const method = prng.pickOne(methods); + + return this.sampleSpecificSetter(depth, method.id, method.name, className); + } + + sampleSpecificSetter( + depth: number, + id: string, + name: string, + className: string + ): Setter { + const type_ = ( + this.rootContext + .getTypeModel() + .getRandomType( + this.incorporateExecutionInformation, + id, + TypeEnum.FUNCTION + ) + ); + + const arguments_: Statement[] = this._sampleArguments(depth, type_); + + if (arguments_.length !== 1) { + throw new Error("Setter must have exactly one argument"); + } + + return new Setter( + id, + name, + TypeEnum.FUNCTION, + prng.uniqueId(), + className, + arguments_[0] + ); + } + + sampleRootObject(depth: number): RootObject { + // get a random object + const object_ = ( + prng.pickOne( + (this._subject) + .getActionableTargetsByType(TargetType.OBJECT) + .filter((target) => isExported(target)) + ) + ); + + return this.sampleSpecificRootObject(depth, object_.id, object_.name); + } + + sampleSpecificRootObject( + depth: number, + id: string, + name: string + ): RootObject { + const calls: Statement[] = []; + const functions = (this._subject) + .getActionableTargetsByType(TargetType.OBJECT_FUNCTION) + .filter( + (function_) => (function_).objectName === name + ); + + const nCalls = + functions.length > 0 && prng.nextInt(1, this.maxActionStatements); + for (let index = 0; index < nCalls; index++) { + const randomFunction = prng.pickOne(functions); + calls.push( + this.sampleSpecificObjectFunctionCall( + depth + 1, + randomFunction.id, + randomFunction.name, + name + ) + ); + } + + return new RootObject(id, name, TypeEnum.OBJECT, prng.uniqueId(), calls); + } + + sampleObjectFunctionCall( + depth: number, + objectName: string + ): ObjectFunctionCall { + const functions = (this._subject) + .getActionableTargetsByType(TargetType.OBJECT_FUNCTION) + .filter( + (function_) => + (function_).objectName === objectName + ); + + const randomFunction = prng.pickOne(functions); + return this.sampleSpecificObjectFunctionCall( + depth + 1, + randomFunction.id, + randomFunction.name, + objectName + ); + } + + sampleSpecificObjectFunctionCall( + depth: number, + id: string, + name: string, + objectName: string + ): ObjectFunctionCall { + const type_ = ( + this.rootContext + .getTypeModel() + .getRandomType( + this.incorporateExecutionInformation, + id, + TypeEnum.FUNCTION + ) + ); + + const arguments_: Statement[] = this._sampleArguments(depth, type_); + + return new ObjectFunctionCall( + id, + name, + TypeEnum.FUNCTION, + prng.uniqueId(), + objectName, + arguments_ + ); + } + + // arguments + sampleArrayArgument( + depth: number, + arrayId: string, + index: number + ): Statement { + const arrayType = ( + this.rootContext + .getTypeModel() + .getRandomType( + this.incorporateExecutionInformation, + arrayId, + TypeEnum.ARRAY + ) + ); + + const element = arrayType.elements.get(index); + if (element) { + return this.sampleArgument(depth, element, String(index)); + } + + const childIds = [...arrayType.elements.values()]; + + return this.sampleArgument(depth, prng.pickOne(childIds), String(index)); + } + + sampleObjectArgument( + depth: number, + objectId: string, + property: string + ): Statement { + const objectType = ( + this.rootContext + .getTypeModel() + .getRandomType( + this.incorporateExecutionInformation, + objectId, + TypeEnum.OBJECT + ) + ); + + const value = objectType.properties.get(property); + if (!value) { + throw new Error(`Property ${property} not found in object ${objectId}`); + } + + return this.sampleArgument(depth, value, property); + } + + sampleArgument(depth: number, id: string, name: string): Statement { + let chosenType: Type; + + if ( + this.typeInferenceMode === "proportional" || + this.typeInferenceMode === "none" + ) { + chosenType = this.rootContext + .getTypeModel() + .getRandomType(this.incorporateExecutionInformation, id); + } else if (this.typeInferenceMode === "ranked") { + chosenType = this.rootContext + .getTypeModel() + .getHighestProbabilityType(this.incorporateExecutionInformation, id); + } else { + throw new Error("Invalid identifierDescription inference mode selected"); + } + + switch (chosenType.type) { + case "function": { + return this.sampleArrowFunction(depth, id, name); + } + case "array": { + return this.sampleArray(depth, id, name); + } + case "boolean": { + return this.sampleBool(id, name); + } + case "string": { + return this.sampleString(id, name); + } + case "numeric": { + return this.sampleNumber(id, name); + } + case "null": { + return this.sampleNull(id, name); + } + case "undefined": { + return this.sampleUndefined(id, name); + } + case "regex": { + // TODO REGEX + return this.sampleString(id, name); + } + default: { + // must be object + return this.sampleObject(depth, id, name); + } + } + } + + sampleObject(depth: number, id: string, name: string) { + const type = TypeEnum.OBJECT; + const typeObject = ( + this.rootContext + .getTypeModel() + .getRandomType(this.incorporateExecutionInformation, id, type) + ); + + const object_: { [key: string]: Statement } = {}; + + for (const [key, id] of typeObject.properties.entries()) { + object_[key] = this.sampleArgument(depth + 1, id, key); + } + + return new ObjectStatement(id, name, type, prng.uniqueId(), object_); + } + + sampleArray(depth: number, id: string, name: string) { + const type = TypeEnum.ARRAY; + const typeObject = ( + this.rootContext + .getTypeModel() + .getRandomType(this.incorporateExecutionInformation, id, type) + ); + + const children: Statement[] = []; + + for (const [index, elementId] of typeObject.elements.entries()) { + children[index] = this.sampleArgument( + depth + 1, + elementId, + String(index) + ); + } + + // if some children are missing, fill them with fake params + const childIds = [...typeObject.elements.values()]; + for (let index = 0; index < children.length; index++) { + if (!children[index]) { + children[index] = this.sampleArgument( + depth + 1, + prng.pickOne(childIds), + String(index) + ); + } + } + + return new ArrayStatement(id, name, type, prng.uniqueId(), children); + } + + sampleArrowFunction( + depth: number, + id: string, + name: string + ): ArrowFunctionStatement { + const type = TypeEnum.FUNCTION; + const typeObject = ( + this.rootContext + .getTypeModel() + .getRandomType(this.incorporateExecutionInformation, id, type) + ); + + const parameters: string[] = []; + + for (const [index, parameterId] of typeObject.parameters.entries()) { + const element = this.rootContext.getElement(parameterId); + + const name = "name" in element ? element.name : element.value; + + parameters[index] = name; + } + + // if some params are missing, fill them with fake params + for (let index = 0; index < parameters.length; index++) { + if (!parameters[index]) { + parameters[index] = `param${index}`; + } + } + + if (typeObject.return.size === 0) { + return new ArrowFunctionStatement( + id, + name, + TypeEnum.FUNCTION, + prng.uniqueId(), + parameters, + undefined + ); + } + + const chosenReturn = prng.pickOne([...typeObject.return]); + + return new ArrowFunctionStatement( + id, + name, + TypeEnum.FUNCTION, + prng.uniqueId(), + parameters, + this.sampleArgument(depth + 1, chosenReturn, "return") + ); + } + + sampleString( + id: string, + name: string, + alphabet = this.stringAlphabet, + maxlength = this.stringMaxLength + ): StringStatement { + const valueLength = prng.nextInt(0, maxlength - 1); + let value = ""; + + for (let index = 0; index < valueLength; index++) { + value += prng.pickOne([...alphabet]); + } + + return new StringStatement( + id, + name, + TypeEnum.STRING, + prng.uniqueId(), + value, + alphabet, + maxlength + ); + } + + // primitives + sampleBool(id: string, name: string): BoolStatement { + return new BoolStatement( + id, + name, + TypeEnum.BOOLEAN, + prng.uniqueId(), + prng.nextBoolean() + ); + } + + sampleNull(id: string, name: string): NullStatement { + return new NullStatement(id, name, TypeEnum.NULL, prng.uniqueId()); + } + + sampleNumber(id: string, name: string): NumericStatement { + // by default we create small numbers (do we need very large numbers?) + const max = 10; + const min = -10; + + return new NumericStatement( + id, + name, + TypeEnum.NUMERIC, + prng.uniqueId(), + prng.nextDouble(min, max) + ); + } + + sampleUndefined(id: string, name: string): UndefinedStatement { + return new UndefinedStatement( + id, + name, + TypeEnum.UNDEFINED, + prng.uniqueId() + ); + } + + private _sampleArguments(depth: number, type_: FunctionType): Statement[] { + const arguments_: Statement[] = []; + + for (const [index, parameterId] of type_.parameters.entries()) { + const element = this.rootContext.getElement(parameterId); + + if (element) { + const name = "name" in element ? element.name : element.value; + + arguments_[index] = this.sampleArgument(depth + 1, parameterId, name); + continue; + } + + const relation = this.rootContext.getRelation(parameterId); + + if (relation) { + const name = getRelationName(relation.type); + + arguments_[index] = this.sampleArgument(depth + 1, parameterId, name); + continue; + } + + throw new Error( + `Could not find element or relation with id ${parameterId}` + ); + } + + // if some params are missing, fill them with fake params + const parameterIds = [...type_.parameters.values()]; + for (let index = 0; index < arguments_.length; index++) { + if (!arguments_[index]) { + arguments_[index] = this.sampleArgument( + depth + 1, + prng.pickOne(parameterIds), + String(index) + ); + } + } + + return arguments_; + } +} diff --git a/libraries/search-javascript/lib/testcase/sampling/JavaScriptTestCaseSampler.ts b/libraries/search-javascript/lib/testcase/sampling/JavaScriptTestCaseSampler.ts new file mode 100644 index 000000000..862909ee5 --- /dev/null +++ b/libraries/search-javascript/lib/testcase/sampling/JavaScriptTestCaseSampler.ts @@ -0,0 +1,180 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { EncodingSampler } from "@syntest/search"; + +import { JavaScriptSubject } from "../../search/JavaScriptSubject"; +import { JavaScriptTestCase } from "../JavaScriptTestCase"; +import { Getter } from "../statements/action/Getter"; +import { MethodCall } from "../statements/action/MethodCall"; +import { Setter } from "../statements/action/Setter"; +import { BoolStatement } from "../statements/primitive/BoolStatement"; +import { NumericStatement } from "../statements/primitive/NumericStatement"; +import { StringStatement } from "../statements/primitive/StringStatement"; +import { ConstructorCall } from "../statements/root/ConstructorCall"; +import { Statement } from "../statements/Statement"; +import { RootObject } from "../statements/root/RootObject"; +import { ObjectFunctionCall } from "../statements/action/ObjectFunctionCall"; +import { NullStatement } from "../statements/primitive/NullStatement"; +import { UndefinedStatement } from "../statements/primitive/UndefinedStatement"; +import { ArrowFunctionStatement } from "../statements/complex/ArrowFunctionStatement"; +import { ArrayStatement } from "../statements/complex/ArrayStatement"; +import { ObjectStatement } from "../statements/complex/ObjectStatement"; + +/** + * JavaScriptRandomSampler class + * + * @author Dimitri Stallenberg + */ +export abstract class JavaScriptTestCaseSampler extends EncodingSampler { + private _typeInferenceMode: string; + private _randomTypeProbability: number; + private _incorporateExecutionInformation: boolean; + private _maxActionStatements: number; + private _stringAlphabet: string; + private _stringMaxLength: number; + private _resampleGeneProbability: number; + private _deltaMutationProbability: number; + private _exploreIllegalValues: boolean; + + constructor( + subject: JavaScriptSubject, + typeInferenceMode: string, + randomTypeProbability: number, + incorporateExecutionInformation: boolean, + maxActionStatements: number, + stringAlphabet: string, + stringMaxLength: number, + resampleGeneProbability: number, + deltaMutationProbability: number, + exploreIllegalValues: boolean + ) { + super(subject); + this._typeInferenceMode = typeInferenceMode; + this._randomTypeProbability = randomTypeProbability; + this._incorporateExecutionInformation = incorporateExecutionInformation; + this._maxActionStatements = maxActionStatements; + this._stringAlphabet = stringAlphabet; + this._stringMaxLength = stringMaxLength; + this._resampleGeneProbability = resampleGeneProbability; + this._deltaMutationProbability = deltaMutationProbability; + this._exploreIllegalValues = exploreIllegalValues; + } + + abstract sampleClass(depth: number): ConstructorCall; + // TODO sampleConstructor + abstract sampleClassCall( + depth: number, + className: string + ): MethodCall | Getter | Setter; + abstract sampleMethodCall(depth: number, className: string): MethodCall; + + abstract sampleGetter(depth: number, className: string): Getter; + + abstract sampleSetter(depth: number, className: string): Setter; + + abstract sampleRootObject(depth: number): RootObject; + abstract sampleObjectFunctionCall( + depth: number, + objectName: string + ): ObjectFunctionCall; + + // TODO + // abstract sampleStaticMethodCall(depth: number): MethodCall; + // abstract sampleFunctionCall(depth: number): FunctionCall; + + abstract sampleArrayArgument( + depth: number, + arrayId: string, + index?: number + ): Statement; + + abstract sampleObjectArgument( + depth: number, + objectId: string, + property?: string + ): Statement; + + abstract sampleArgument(depth: number, id: string, name: string): Statement; + + abstract sampleObject( + depth: number, + id: string, + name: string + ): ObjectStatement; + + abstract sampleArray(depth: number, id: string, name: string): ArrayStatement; + + abstract sampleArrowFunction( + depth: number, + id: string, + name: string + ): ArrowFunctionStatement; + + abstract sampleString( + id: string, + name: string, + alphabet?: string, + maxlength?: number + ): StringStatement; + + // primitive types + abstract sampleBool(id: string, name: string): BoolStatement; + + abstract sampleNull(id: string, name: string): NullStatement; + + abstract sampleNumber(id: string, name: string): NumericStatement; + + abstract sampleUndefined(id: string, name: string): UndefinedStatement; + + get typeInferenceMode(): string { + return this._typeInferenceMode; + } + + get randomTypeProbability(): number { + return this._randomTypeProbability; + } + + get incorporateExecutionInformation(): boolean { + return this._incorporateExecutionInformation; + } + + get maxActionStatements(): number { + return this._maxActionStatements; + } + + get stringAlphabet(): string { + return this._stringAlphabet; + } + + get stringMaxLength(): number { + return this._stringMaxLength; + } + + get resampleGeneProbability(): number { + return this._resampleGeneProbability; + } + + get deltaMutationProbability(): number { + return this._deltaMutationProbability; + } + + get exploreIllegalValues(): boolean { + return this._exploreIllegalValues; + } +} diff --git a/libraries/javascript/lib/testcase/statements/Statement.ts b/libraries/search-javascript/lib/testcase/statements/Statement.ts similarity index 82% rename from libraries/javascript/lib/testcase/statements/Statement.ts rename to libraries/search-javascript/lib/testcase/statements/Statement.ts index e70d9dd3e..934d9a892 100644 --- a/libraries/javascript/lib/testcase/statements/Statement.ts +++ b/libraries/search-javascript/lib/testcase/statements/Statement.ts @@ -16,37 +16,46 @@ * limitations under the License. */ -import { Encoding, EncodingSampler, prng } from "@syntest/core"; -import { IdentifierDescription } from "../../analysis/static/parsing/IdentifierDescription"; +import { Encoding, EncodingSampler, prng } from "@syntest/search"; + +import { JavaScriptDecoder } from "../../testbuilding/JavaScriptDecoder"; /** * @author Dimitri Stallenberg */ export abstract class Statement { - public get varName(): string { - return this._varName; - } + private _id: string; + private _name: string; + private _type: string; + private _uniqueId: string; + private _varName: string; + + protected _classType: string; + public get id(): string { - return this._uniqueId; + return this._id; } - public get identifierDescription(): IdentifierDescription { - return this._identifierDescription; + + public get name(): string { + return this._name; } get type(): string { return this._type; } + public get uniqueId(): string { + return this._uniqueId; + } + + public get varName(): string { + return this._varName; + } + get classType(): string { return this._classType; } - protected _classType: string; - private _varName: string; - private _identifierDescription: IdentifierDescription; - private _type: string; - private _uniqueId: string; - /** * Constructor * @param identifierDescription @@ -54,15 +63,16 @@ export abstract class Statement { * @param uniqueId */ protected constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string ) { - this._identifierDescription = identifierDescription; + this._id = id; + this._name = name; this._type = type; this._uniqueId = uniqueId; - this._varName = - identifierDescription.name + "_" + type + "_" + prng.uniqueId(4); + this._varName = name + "_" + type + "_" + prng.uniqueId(4); this._varName = "_" + this.varName; } @@ -96,6 +106,7 @@ export abstract class Statement { * Decodes the statement */ abstract decode( + decoder: JavaScriptDecoder, id: string, options: { addLogs: boolean; exception: boolean } ): Decoding[]; diff --git a/libraries/javascript/lib/testcase/statements/action/ActionStatement.ts b/libraries/search-javascript/lib/testcase/statements/action/ActionStatement.ts similarity index 74% rename from libraries/javascript/lib/testcase/statements/action/ActionStatement.ts rename to libraries/search-javascript/lib/testcase/statements/action/ActionStatement.ts index 217e574e5..dd4457ad3 100644 --- a/libraries/javascript/lib/testcase/statements/action/ActionStatement.ts +++ b/libraries/search-javascript/lib/testcase/statements/action/ActionStatement.ts @@ -16,9 +16,9 @@ * limitations under the License. */ +import { Encoding, EncodingSampler } from "@syntest/search"; + import { Statement } from "../Statement"; -import { Encoding, EncodingSampler } from "@syntest/core"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; /** * @author Dimitri Stallenberg @@ -27,28 +27,29 @@ export abstract class ActionStatement extends Statement { private _args: Statement[]; protected constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, - args: Statement[] + arguments_: Statement[] ) { - super(identifierDescription, type, uniqueId); - this._args = args; + super(id, name, type, uniqueId); + this._args = arguments_; } - abstract mutate( + abstract override mutate( sampler: EncodingSampler, depth: number ): ActionStatement; - abstract copy(): ActionStatement; + abstract override copy(): ActionStatement; setChild(index: number, newChild: Statement) { this.args[index] = newChild; } hasChildren(): boolean { - return !!this._args.length; + return this._args.length > 0; } getChildren(): Statement[] { @@ -60,6 +61,6 @@ export abstract class ActionStatement extends Statement { } getFlatTypes(): string[] { - return [...this.args.flatMap((a) => a.getFlatTypes())]; + return this.args.flatMap((a) => a.getFlatTypes()); } } diff --git a/libraries/javascript/lib/testcase/statements/action/Getter.ts b/libraries/search-javascript/lib/testcase/statements/action/Getter.ts similarity index 59% rename from libraries/javascript/lib/testcase/statements/action/Getter.ts rename to libraries/search-javascript/lib/testcase/statements/action/Getter.ts index 1a01f476f..bc4e07855 100644 --- a/libraries/javascript/lib/testcase/statements/action/Getter.ts +++ b/libraries/search-javascript/lib/testcase/statements/action/Getter.ts @@ -16,18 +16,21 @@ * limitations under the License. */ -import { CONFIG, prng } from "@syntest/core"; +import { prng } from "@syntest/search"; + +import { JavaScriptDecoder } from "../../../testbuilding/JavaScriptDecoder"; import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; -import { ActionStatement } from "./ActionStatement"; import { Decoding, Statement } from "../Statement"; -import * as path from "path"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; + +import { ActionStatement } from "./ActionStatement"; +import { MethodCall } from "./MethodCall"; +import { Setter } from "./Setter"; /** * @author Dimitri Stallenberg */ export class Getter extends ActionStatement { - private readonly _property: string; + private readonly _className: string; /** * Constructor @@ -37,52 +40,54 @@ export class Getter extends ActionStatement { * @param property the name of the property */ constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, - property: string + className: string ) { - super(identifierDescription, type, uniqueId, []); + super(id, name, type, uniqueId, []); this._classType = "Getter"; - this._property = property; + this._className = className; } - mutate(sampler: JavaScriptTestCaseSampler, depth: number): Getter { - const args = [...this.args.map((a: Statement) => a.copy())]; - - if (args.length !== 0) { - const index = prng.nextInt(0, args.length - 1); - - if (prng.nextBoolean(CONFIG.resampleGeneProbability)) { - // TODO should be different property - args[index] = sampler.sampleArgument( - depth + 1, - args[index].identifierDescription - ); - } else { - args[index] = args[index].mutate(sampler, depth + 1); - } + mutate( + sampler: JavaScriptTestCaseSampler, + depth: number + ): Getter | Setter | MethodCall { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleClassCall(depth, this._className); + } + + const arguments_ = this.args.map((a: Statement) => a.copy()); + + if (arguments_.length > 0) { + const index = prng.nextInt(0, arguments_.length - 1); + + arguments_[index] = arguments_[index].mutate(sampler, depth + 1); } return new Getter( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), - this.property + this.className ); } copy(): Getter { return new Getter( - this.identifierDescription, - this.type, this.id, - this.property + this.name, + this.type, + this.uniqueId, + this.className ); } - get property(): string { - return this._property; + get className(): string { + return this._className; } decode(): Decoding[] { @@ -90,15 +95,16 @@ export class Getter extends ActionStatement { } decodeWithObject( + decoder: JavaScriptDecoder, id: string, options: { addLogs: boolean; exception: boolean }, objectVariable: string ): Decoding[] { - let decoded = `const ${this.varName} = await ${objectVariable}.${this.property}`; + let decoded = `const ${this.varName} = await ${objectVariable}.${this.name}`; if (options.addLogs) { - const logDir = path.join(CONFIG.tempLogDirectory, id, this.varName); - decoded += `\nawait fs.writeFileSync('${logDir}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; + const logDirectory = decoder.getLogDirectory(id, this.varName); + decoded += `\nawait fs.writeFileSync('${logDirectory}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; } return [ @@ -112,6 +118,6 @@ export class Getter extends ActionStatement { // TODO decodeErroring(objectVariable: string): string { - return `await expect(${objectVariable}.${this.property}).to.be.rejectedWith(Error);`; + return `await expect(${objectVariable}.${this.name}).to.be.rejectedWith(Error);`; } } diff --git a/libraries/javascript/lib/testcase/statements/action/MethodCall.ts b/libraries/search-javascript/lib/testcase/statements/action/MethodCall.ts similarity index 51% rename from libraries/javascript/lib/testcase/statements/action/MethodCall.ts rename to libraries/search-javascript/lib/testcase/statements/action/MethodCall.ts index 00e94a05e..fc4bac93e 100644 --- a/libraries/javascript/lib/testcase/statements/action/MethodCall.ts +++ b/libraries/search-javascript/lib/testcase/statements/action/MethodCall.ts @@ -16,79 +16,87 @@ * limitations under the License. */ -import { CONFIG, prng } from "@syntest/core"; +import { prng } from "@syntest/search"; + +import { JavaScriptDecoder } from "../../../testbuilding/JavaScriptDecoder"; import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; -import { ActionStatement } from "./ActionStatement"; import { Decoding, Statement } from "../Statement"; -import * as path from "path"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; + +import { ActionStatement } from "./ActionStatement"; +import { Getter } from "./Getter"; +import { Setter } from "./Setter"; /** * @author Dimitri Stallenberg */ export class MethodCall extends ActionStatement { - private readonly _functionName: string; + private readonly _className: string; /** * Constructor * @param identifierDescription the return type options of the function * @param type the return type of the function * @param uniqueId id of the gene - * @param functionName the name of the function + * @param methodName the name of the function * @param args the arguments of the function */ constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, - functionName: string, - args: Statement[] + className: string, + arguments_: Statement[] ) { - super(identifierDescription, type, uniqueId, args); + super(id, name, type, uniqueId, arguments_); this._classType = "MethodCall"; - this._functionName = functionName; + this._className = className; } - mutate(sampler: JavaScriptTestCaseSampler, depth: number): MethodCall { - const args = [...this.args.map((a: Statement) => a.copy())]; + mutate( + sampler: JavaScriptTestCaseSampler, + depth: number + ): Getter | Setter | MethodCall { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleClassCall(depth, this._className); + } - if (args.length !== 0) { - const index = prng.nextInt(0, args.length - 1); + const arguments_ = this.args.map((a: Statement) => a.copy()); - if (prng.nextBoolean(CONFIG.resampleGeneProbability)) { - // TODO should be different property - args[index] = sampler.sampleArgument( - depth + 1, - args[index].identifierDescription - ); - } else { - args[index] = args[index].mutate(sampler, depth + 1); + if (arguments_.length > 0) { + // go over each arg + for (let index = 0; index < arguments_.length; index++) { + if (prng.nextBoolean(1 / arguments_.length)) { + arguments_[index] = arguments_[index].mutate(sampler, depth + 1); + } } } return new MethodCall( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), - this.functionName, - args + this.className, + arguments_ ); } copy(): MethodCall { - const deepCopyArgs = [...this.args.map((a: Statement) => a.copy())]; + const deepCopyArguments = this.args.map((a: Statement) => a.copy()); return new MethodCall( - this.identifierDescription, - this.type, this.id, - this.functionName, - deepCopyArgs + this.name, + this.type, + this.uniqueId, + this.className, + deepCopyArguments ); } - get functionName(): string { - return this._functionName; + get className(): string { + return this._className; } decode(): Decoding[] { @@ -96,25 +104,26 @@ export class MethodCall extends ActionStatement { } decodeWithObject( + decoder: JavaScriptDecoder, id: string, options: { addLogs: boolean; exception: boolean }, objectVariable: string ): Decoding[] { - const args = this.args.map((a) => a.varName).join(", "); + const arguments_ = this.args.map((a) => a.varName).join(", "); - const argStatements: Decoding[] = this.args.flatMap((a) => - a.decode(id, options) + const argumentStatements: Decoding[] = this.args.flatMap((a) => + a.decode(decoder, id, options) ); - let decoded = `const ${this.varName} = await ${objectVariable}.${this.functionName}(${args})`; + let decoded = `const ${this.varName} = await ${objectVariable}.${this.name}(${arguments_})`; if (options.addLogs) { - const logDir = path.join(CONFIG.tempLogDirectory, id, this.varName); - decoded += `\nawait fs.writeFileSync('${logDir}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; + const logDirectory = decoder.getLogDirectory(id, this.varName); + decoded += `\nawait fs.writeFileSync('${logDirectory}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; } return [ - ...argStatements, + ...argumentStatements, { decoded: decoded, reference: this, @@ -125,7 +134,7 @@ export class MethodCall extends ActionStatement { // TODO decodeErroring(objectVariable: string): string { - const args = this.args.map((a) => a.varName).join(", "); - return `await expect(${objectVariable}.${this.functionName}(${args})).to.be.rejectedWith(Error);`; + const arguments_ = this.args.map((a) => a.varName).join(", "); + return `await expect(${objectVariable}.${this.name}(${arguments_})).to.be.rejectedWith(Error);`; } } diff --git a/libraries/search-javascript/lib/testcase/statements/action/ObjectFunctionCall.ts b/libraries/search-javascript/lib/testcase/statements/action/ObjectFunctionCall.ts new file mode 100644 index 000000000..d47689046 --- /dev/null +++ b/libraries/search-javascript/lib/testcase/statements/action/ObjectFunctionCall.ts @@ -0,0 +1,135 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { prng } from "@syntest/search"; + +import { JavaScriptDecoder } from "../../../testbuilding/JavaScriptDecoder"; +import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; +import { Decoding, Statement } from "../Statement"; + +import { ActionStatement } from "./ActionStatement"; + +/** + * @author Dimitri Stallenberg + */ +export class ObjectFunctionCall extends ActionStatement { + private readonly _objectName: string; + + /** + * Constructor + * @param identifierDescription the return type options of the function + * @param type the return type of the function + * @param uniqueId id of the gene + * @param methodName the name of the function + * @param args the arguments of the function + */ + constructor( + id: string, + name: string, + type: string, + uniqueId: string, + objectName: string, + arguments_: Statement[] + ) { + super(id, name, type, uniqueId, arguments_); + this._classType = "ObjectFunctionCall"; + this._objectName = objectName; + } + + mutate( + sampler: JavaScriptTestCaseSampler, + depth: number + ): ObjectFunctionCall { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleObjectFunctionCall(depth, this._objectName); + } + + const arguments_ = this.args.map((a: Statement) => a.copy()); + + if (arguments_.length > 0) { + const index = prng.nextInt(0, arguments_.length - 1); + + arguments_[index] = arguments_[index].mutate(sampler, depth + 1); + } + + return new ObjectFunctionCall( + this.id, + this.name, + this.type, + prng.uniqueId(), + this.className, + arguments_ + ); + } + + copy(): ObjectFunctionCall { + const deepCopyArguments = this.args.map((a: Statement) => a.copy()); + + return new ObjectFunctionCall( + this.id, + this.name, + this.type, + this.uniqueId, + this.className, + deepCopyArguments + ); + } + + get className(): string { + return this._objectName; + } + + decode(): Decoding[] { + throw new Error("Cannot call decode on method calls!"); + } + + decodeWithObject( + decoder: JavaScriptDecoder, + id: string, + options: { addLogs: boolean; exception: boolean }, + objectVariable: string + ): Decoding[] { + const arguments_ = this.args.map((a) => a.varName).join(", "); + + const argumentStatements: Decoding[] = this.args.flatMap((a) => + a.decode(decoder, id, options) + ); + + let decoded = `const ${this.varName} = await ${objectVariable}.${this.name}(${arguments_})`; + + if (options.addLogs) { + const logDirectory = decoder.getLogDirectory(id, this.varName); + decoded += `\nawait fs.writeFileSync('${logDirectory}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; + } + + return [ + ...argumentStatements, + { + decoded: decoded, + reference: this, + objectVariable: objectVariable, + }, + ]; + } + + // TODO + decodeErroring(objectVariable: string): string { + const arguments_ = this.args.map((a) => a.varName).join(", "); + return `await expect(${objectVariable}.${this.name}(${arguments_})).to.be.rejectedWith(Error);`; + } +} diff --git a/libraries/javascript/lib/testcase/statements/action/Setter.ts b/libraries/search-javascript/lib/testcase/statements/action/Setter.ts similarity index 54% rename from libraries/javascript/lib/testcase/statements/action/Setter.ts rename to libraries/search-javascript/lib/testcase/statements/action/Setter.ts index 052a13cef..d93c284e2 100644 --- a/libraries/javascript/lib/testcase/statements/action/Setter.ts +++ b/libraries/search-javascript/lib/testcase/statements/action/Setter.ts @@ -16,18 +16,21 @@ * limitations under the License. */ -import { CONFIG, prng } from "@syntest/core"; +import { prng } from "@syntest/search"; + +import { JavaScriptDecoder } from "../../../testbuilding/JavaScriptDecoder"; import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; -import { ActionStatement } from "./ActionStatement"; import { Decoding, Statement } from "../Statement"; -import * as path from "path"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; + +import { ActionStatement } from "./ActionStatement"; +import { Getter } from "./Getter"; +import { MethodCall } from "./MethodCall"; /** * @author Dimitri Stallenberg */ export class Setter extends ActionStatement { - private readonly _property: string; + private readonly _className: string; /** * Constructor @@ -38,50 +41,55 @@ export class Setter extends ActionStatement { * @param arg the argument of the setter */ constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, - property: string, - arg: Statement + className: string, + argument: Statement ) { - super(identifierDescription, type, uniqueId, [arg]); + super(id, name, type, uniqueId, [argument]); this._classType = "Setter"; - this._property = property; + this._className = className; } - mutate(sampler: JavaScriptTestCaseSampler, depth: number): Setter { - let arg = [...this.args.map((a: Statement) => a.copy())][0]; - - if (prng.nextBoolean(CONFIG.resampleGeneProbability)) { - // TODO should be different property - arg = sampler.sampleArgument(depth + 1, arg.identifierDescription); - } else { - arg = arg.mutate(sampler, depth + 1); + mutate( + sampler: JavaScriptTestCaseSampler, + depth: number + ): Getter | Setter | MethodCall { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleClassCall(depth, this._className); } + let argument = this.args.map((a: Statement) => a.copy())[0]; + + argument = argument.mutate(sampler, depth + 1); + return new Setter( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), - this.property, - arg + this.className, + argument ); } copy(): Setter { - const deepCopyArg = [...this.args.map((a: Statement) => a.copy())][0]; + const deepCopyArgument = this.args.map((a: Statement) => a.copy())[0]; return new Setter( - this.identifierDescription, - this.type, this.id, - this.property, - deepCopyArg + this.name, + this.type, + this.uniqueId, + this.className, + deepCopyArgument ); } - get property(): string { - return this._property; + get className(): string { + return this._className; } decode(): Decoding[] { @@ -89,25 +97,26 @@ export class Setter extends ActionStatement { } decodeWithObject( + decoder: JavaScriptDecoder, id: string, options: { addLogs: boolean; exception: boolean }, objectVariable: string ): Decoding[] { - const arg = this.args.map((a) => a.varName).join(", "); + const argument = this.args.map((a) => a.varName).join(", "); - const argStatement: Decoding[] = this.args.flatMap((a) => - a.decode(id, options) + const argumentStatement: Decoding[] = this.args.flatMap((a) => + a.decode(decoder, id, options) ); - let decoded = `${objectVariable}.${this.property} = ${arg}`; + let decoded = `${objectVariable}.${this.name} = ${argument}`; if (options.addLogs) { - const logDir = path.join(CONFIG.tempLogDirectory, id, this.varName); - decoded += `\nawait fs.writeFileSync('${logDir}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; + const logDirectory = decoder.getLogDirectory(id, this.varName); + decoded += `\nawait fs.writeFileSync('${logDirectory}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; } return [ - ...argStatement, + ...argumentStatement, { decoded: decoded, reference: this, @@ -118,7 +127,7 @@ export class Setter extends ActionStatement { // TODO decodeErroring(objectVariable: string): string { - const arg = this.args.map((a) => a.varName).join(", "); - return `await expect(${objectVariable}.${this.property} = ${arg}).to.be.rejectedWith(Error);`; + const argument = this.args.map((a) => a.varName).join(", "); + return `await expect(${objectVariable}.${this.name} = ${argument}).to.be.rejectedWith(Error);`; } } diff --git a/libraries/javascript/lib/testcase/statements/complex/ArrayStatement.ts b/libraries/search-javascript/lib/testcase/statements/complex/ArrayStatement.ts similarity index 57% rename from libraries/javascript/lib/testcase/statements/complex/ArrayStatement.ts rename to libraries/search-javascript/lib/testcase/statements/complex/ArrayStatement.ts index 99cc3d024..cffae2a62 100644 --- a/libraries/javascript/lib/testcase/statements/complex/ArrayStatement.ts +++ b/libraries/search-javascript/lib/testcase/statements/complex/ArrayStatement.ts @@ -16,12 +16,11 @@ * limitations under the License. */ -import { CONFIG, prng } from "@syntest/core"; +import { prng } from "@syntest/search"; + +import { JavaScriptDecoder } from "../../../testbuilding/JavaScriptDecoder"; import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; import { Decoding, Statement } from "../Statement"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; -import * as path from "path"; -import { TypeProbability } from "../../../analysis/static/types/resolving/TypeProbability"; /** * @author Dimitri Stallenberg @@ -31,18 +30,23 @@ export class ArrayStatement extends Statement { private _children: Statement[]; constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, children: Statement[] ) { - super(identifierDescription, type, uniqueId); + super(id, name, type, uniqueId); this._children = children; this._classType = "ArrayStatement"; } - mutate(sampler: JavaScriptTestCaseSampler, depth: number): ArrayStatement { - const children = [...this._children.map((a: Statement) => a.copy())]; + mutate(sampler: JavaScriptTestCaseSampler, depth: number): Statement { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleArgument(depth, this.id, this.type); + } + const children = this._children.map((a: Statement) => a.copy()); + // // if (children.length !== 0) { // const index = prng.nextInt(0, children.length - 1); @@ -55,51 +59,44 @@ export class ArrayStatement extends Statement { const finalChildren = []; + // If there are no children, add one if (children.length === 0) { - // add a call - finalChildren.push( - sampler.sampleArgument(depth + 1, { - name: "arrayValue", - typeProbabilityMap: new TypeProbability(), - }) + // add a item + finalChildren.push(sampler.sampleArrayArgument(depth + 1, this.id, 0)); + + return new ArrayStatement( + this.id, + this.name, + this.type, + prng.uniqueId(), + finalChildren ); - } else { - // go over each call - for (let i = 0; i < children.length; i++) { - if (prng.nextBoolean(1 / children.length)) { - // Mutate this position - const choice = prng.nextDouble(); - - if (choice < 0.1) { - // 10% chance to add a call on this position - finalChildren.push( - sampler.sampleArgument(depth + 1, { - name: "arrayValue", - typeProbabilityMap: new TypeProbability(), - }) - ); - finalChildren.push(children[i]); - } else if (choice < 0.2) { - // 10% chance to delete the child - } else { - // 80% chance to just mutate the child - if (CONFIG.resampleGeneProbability) { - finalChildren.push( - sampler.sampleArgument(depth + 1, { - name: "arrayValue", - typeProbabilityMap: new TypeProbability(), - }) - ); - } else { - finalChildren.push(children[i].mutate(sampler, depth + 1)); - } - } + } + + // go over each call + for (let index = 0; index < children.length; index++) { + if (prng.nextBoolean(1 / children.length)) { + // Mutate this position + const choice = prng.nextDouble(); + + if (choice < 0.1) { + // 10% chance to add a argument on this position + finalChildren.push( + sampler.sampleArrayArgument(depth + 1, this.id, index), + children[index] + ); + } else if (choice < 0.2) { + // 10% chance to delete the child + } else { + // 80% chance to just mutate the child + finalChildren.push(children[index].mutate(sampler, depth + 1)); } } } return new ArrayStatement( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), finalChildren @@ -108,28 +105,30 @@ export class ArrayStatement extends Statement { copy(): ArrayStatement { return new ArrayStatement( - this.identifierDescription, - this.type, this.id, + this.name, + this.type, + this.uniqueId, this._children.map((a) => a.copy()) ); } decode( + decoder: JavaScriptDecoder, id: string, options: { addLogs: boolean; exception: boolean } ): Decoding[] { const children = this._children.map((a) => a.varName).join(", "); const childStatements: Decoding[] = this._children.flatMap((a) => - a.decode(id, options) + a.decode(decoder, id, options) ); let decoded = `const ${this.varName} = [${children}]`; if (options.addLogs) { - const logDir = path.join(CONFIG.tempLogDirectory, id, this.varName); - decoded += `\nawait fs.writeFileSync('${logDir}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; + const logDirectory = decoder.getLogDirectory(id, this.varName); + decoded += `\nawait fs.writeFileSync('${logDirectory}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; } return [ @@ -146,7 +145,7 @@ export class ArrayStatement extends Statement { } hasChildren(): boolean { - return !!this._children.length; + return this._children.length > 0; } setChild(index: number, newChild: Statement) { diff --git a/libraries/javascript/lib/testcase/statements/complex/ArrowFunctionStatement.ts b/libraries/search-javascript/lib/testcase/statements/complex/ArrowFunctionStatement.ts similarity index 59% rename from libraries/javascript/lib/testcase/statements/complex/ArrowFunctionStatement.ts rename to libraries/search-javascript/lib/testcase/statements/complex/ArrowFunctionStatement.ts index 31a13a064..60ec95fe6 100644 --- a/libraries/javascript/lib/testcase/statements/complex/ArrowFunctionStatement.ts +++ b/libraries/search-javascript/lib/testcase/statements/complex/ArrowFunctionStatement.ts @@ -17,78 +17,97 @@ */ // TODO -import { CONFIG, prng } from "@syntest/core"; + +import { prng } from "@syntest/search"; + +import { JavaScriptDecoder } from "../../../testbuilding/JavaScriptDecoder"; import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; import { Decoding, Statement } from "../Statement"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; /** * @author Dimitri Stallenberg */ export class ArrowFunctionStatement extends Statement { - private _returnValue: Statement; + private _parameters: string[]; + private _returnValue: Statement | undefined; constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, - returnValue: Statement + parameters: string[], + returnValue: Statement | undefined ) { - super(identifierDescription, type, uniqueId); + super(id, name, type, uniqueId); + this._parameters = parameters; this._returnValue = returnValue; this._classType = "ArrowFunctionStatement"; } - mutate( - sampler: JavaScriptTestCaseSampler, - depth: number - ): ArrowFunctionStatement { - // TODO mutate returnvalue identifierDescription - if (prng.nextBoolean(CONFIG.resampleGeneProbability)) { - // TODO should be different property - return new ArrowFunctionStatement( - this.identifierDescription, - this.type, - prng.uniqueId(), - sampler.sampleArgument( - depth + 1, - this._returnValue.identifierDescription - ) - ); + mutate(sampler: JavaScriptTestCaseSampler, depth: number): Statement { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleArgument(depth, this.id, this.name); } return new ArrowFunctionStatement( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), - this._returnValue.mutate(sampler, depth + 1) + this._parameters, + this.returnValue + ? this._returnValue.mutate(sampler, depth + 1) + : undefined ); } copy(): ArrowFunctionStatement { return new ArrowFunctionStatement( - this.identifierDescription, - this.type, this.id, + this.name, + this.type, + this.uniqueId, + this._parameters, this._returnValue ); } decode( + decoder: JavaScriptDecoder, id: string, options: { addLogs: boolean; exception: boolean } ): Decoding[] { - const returnStatement: Decoding[] = this._returnValue.decode(id, options); + if (this._returnValue === undefined) { + return [ + { + decoded: `const ${this.varName} = (${this._parameters.join( + ", " + )}) => { };`, + reference: this, + }, + ]; + } + const returnStatement: Decoding[] = this._returnValue.decode( + decoder, + id, + options + ); return [ ...returnStatement, { - decoded: `const ${this.varName} = () => { return ${this.returnValue.varName} };`, + decoded: `const ${this.varName} = (${this._parameters.join( + ", " + )}) => { return ${this.returnValue.varName} };`, reference: this, }, ]; } getChildren(): Statement[] { + if (this._returnValue === undefined) { + return []; + } return [this.returnValue]; } diff --git a/libraries/search-javascript/lib/testcase/statements/complex/ObjectStatement.ts b/libraries/search-javascript/lib/testcase/statements/complex/ObjectStatement.ts new file mode 100644 index 000000000..fa69f7fe8 --- /dev/null +++ b/libraries/search-javascript/lib/testcase/statements/complex/ObjectStatement.ts @@ -0,0 +1,165 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { prng } from "@syntest/search"; + +import { JavaScriptDecoder } from "../../../testbuilding/JavaScriptDecoder"; +import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; +import { Decoding, Statement } from "../Statement"; + +/** + * @author Dimitri Stallenberg + */ +type ObjectType = { + [key: string]: Statement | undefined; +}; +export class ObjectStatement extends Statement { + private _object: ObjectType; + + constructor( + id: string, + name: string, + type: string, + uniqueId: string, + object: ObjectType + ) { + super(id, name, type, uniqueId); + this._object = object; + this._classType = "ObjectStatement"; + } + + mutate(sampler: JavaScriptTestCaseSampler, depth: number): Statement { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleArgument(depth, this.id, this.name); + } + + const object: ObjectType = {}; + + for (const key of Object.keys(this._object)) { + object[key] = this._object[key].copy(); + } + + const keys = Object.keys(object); + // go over each child + for (let index = 0; index < keys.length; index++) { + if (prng.nextBoolean(1 / keys.length)) { + const key = keys[index]; + // Mutate this position + const choice = prng.nextDouble(); + + if (choice < 0.1) { + // 10% chance to add a call on this position + + object[key] = sampler.sampleObjectArgument(depth + 1, this.id, key); + } else if (choice < 0.2) { + // 10% chance to delete the call + object[key] = undefined; + } else { + // 80% chance to just mutate the call + object[key] = object[key].mutate(sampler, depth + 1); + } + } + } + + return new ObjectStatement( + this.id, + this.name, + this.type, + prng.uniqueId(), + object + ); + } + + copy(): ObjectStatement { + const object: ObjectType = {}; + + for (const key of Object.keys(this._object)) { + object[key] = this._object[key].copy(); + } + + return new ObjectStatement( + this.id, + this.name, + this.type, + this.uniqueId, + this._object + ); + } + + decode( + decoder: JavaScriptDecoder, + id: string, + options: { addLogs: boolean; exception: boolean } + ): Decoding[] { + const children = Object.keys(this._object) + .filter((key) => this._object[key] !== undefined) + .map((key) => `\t"${key}": ${this._object[key].varName}`) + .join(",\n\t"); + + const childStatements: Decoding[] = Object.values(this._object).flatMap( + (a) => a.decode(decoder, id, options) + ); + + let decoded = `const ${this.varName} = {\n${children}\n\t}`; + + if (options.addLogs) { + const logDirectory = decoder.getLogDirectory(id, this.varName); + decoded += `\nawait fs.writeFileSync('${logDirectory}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; + } + + return [ + ...childStatements, + { + decoded: decoded, + reference: this, + }, + ]; + } + + getChildren(): Statement[] { + return [...this.children]; + } + + hasChildren(): boolean { + return Object.keys(this._object).some( + (key) => this._object[key] !== undefined + ); + } + + setChild(index: number, newChild: Statement) { + if (!newChild) { + throw new Error("Invalid new child!"); + } + + if (index >= this.children.length) { + throw new Error("Invalid child location!"); + } + + this.children[index] = newChild; + } + + get children(): Statement[] { + return Object.keys(this._object) + .filter((key) => this._object[key] !== undefined) + .map((key) => this._object[key]); + } + + getFlatTypes(): string[] { + return ["object", ...this.children.flatMap((a) => a.getFlatTypes())]; + } +} diff --git a/libraries/javascript/lib/testcase/statements/primitive/BoolStatement.ts b/libraries/search-javascript/lib/testcase/statements/primitive/BoolStatement.ts similarity index 72% rename from libraries/javascript/lib/testcase/statements/primitive/BoolStatement.ts rename to libraries/search-javascript/lib/testcase/statements/primitive/BoolStatement.ts index c0aabf5af..e5c54b472 100644 --- a/libraries/javascript/lib/testcase/statements/primitive/BoolStatement.ts +++ b/libraries/search-javascript/lib/testcase/statements/primitive/BoolStatement.ts @@ -16,32 +16,36 @@ * limitations under the License. */ -import { CONFIG, prng } from "@syntest/core"; +import { prng } from "@syntest/search"; + import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; + import { PrimitiveStatement } from "./PrimitiveStatement"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; +import { Statement } from "../Statement"; /** * @author Dimitri Stallenberg */ export class BoolStatement extends PrimitiveStatement { constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, value: boolean ) { - super(identifierDescription, type, uniqueId, value); + super(id, name, type, uniqueId, value); this._classType = "BoolStatement"; } - mutate(sampler: JavaScriptTestCaseSampler): BoolStatement { - if (prng.nextBoolean(CONFIG.resampleGeneProbability)) { - return sampler.sampleBool(this.identifierDescription, this.type); + mutate(sampler: JavaScriptTestCaseSampler, depth: number): Statement { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleArgument(depth + 1, this.id, this.name); } return new BoolStatement( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), !this.value @@ -50,9 +54,10 @@ export class BoolStatement extends PrimitiveStatement { copy(): BoolStatement { return new BoolStatement( - this.identifierDescription, - this.type, this.id, + this.name, + this.type, + this.uniqueId, this.value ); } diff --git a/libraries/javascript/lib/testcase/statements/primitive/NullStatement.ts b/libraries/search-javascript/lib/testcase/statements/primitive/NullStatement.ts similarity index 59% rename from libraries/javascript/lib/testcase/statements/primitive/NullStatement.ts rename to libraries/search-javascript/lib/testcase/statements/primitive/NullStatement.ts index fe4f3db5d..49fa9a92f 100644 --- a/libraries/javascript/lib/testcase/statements/primitive/NullStatement.ts +++ b/libraries/search-javascript/lib/testcase/statements/primitive/NullStatement.ts @@ -16,33 +16,32 @@ * limitations under the License. */ -import { prng } from "@syntest/core"; +import { prng } from "@syntest/search"; + import { PrimitiveStatement } from "./PrimitiveStatement"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; +import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; +import { Statement } from "../Statement"; /** * @author Dimitri Stallenberg */ export class NullStatement extends PrimitiveStatement { - constructor( - identifierDescription: IdentifierDescription, - type: string, - uniqueId: string - ) { - super(identifierDescription, type, uniqueId, null); + constructor(id: string, name: string, type: string, uniqueId: string) { + // eslint-disable-next-line unicorn/no-null + super(id, name, type, uniqueId, null); this._classType = "NullStatement"; } - mutate(): NullStatement { - return new NullStatement( - this.identifierDescription, - this.type, - prng.uniqueId() - ); + mutate(sampler: JavaScriptTestCaseSampler, depth: number): Statement { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleArgument(depth + 1, this.id, this.name); + } + + return new NullStatement(this.id, this.name, this.type, prng.uniqueId()); } copy(): NullStatement { - return new NullStatement(this.identifierDescription, this.type, this.id); + return new NullStatement(this.id, this.name, this.type, this.uniqueId); } getFlatTypes(): string[] { diff --git a/libraries/javascript/lib/testcase/statements/primitive/NumericStatement.ts b/libraries/search-javascript/lib/testcase/statements/primitive/NumericStatement.ts similarity index 70% rename from libraries/javascript/lib/testcase/statements/primitive/NumericStatement.ts rename to libraries/search-javascript/lib/testcase/statements/primitive/NumericStatement.ts index a55d529e2..4f2992b6d 100644 --- a/libraries/javascript/lib/testcase/statements/primitive/NumericStatement.ts +++ b/libraries/search-javascript/lib/testcase/statements/primitive/NumericStatement.ts @@ -16,10 +16,12 @@ * limitations under the License. */ -import { CONFIG, prng } from "@syntest/core"; +import { prng } from "@syntest/search"; + import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; + import { PrimitiveStatement } from "./PrimitiveStatement"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; +import { Statement } from "../Statement"; /** * Generic number class @@ -28,35 +30,36 @@ import { IdentifierDescription } from "../../../analysis/static/parsing/Identifi */ export class NumericStatement extends PrimitiveStatement { constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, value: number ) { - super(identifierDescription, type, uniqueId, value); + super(id, name, type, uniqueId, value); this._classType = "NumericStatement"; } - mutate(sampler: JavaScriptTestCaseSampler): NumericStatement { - if (prng.nextBoolean(CONFIG.resampleGeneProbability)) { - return sampler.sampleNumber(this.identifierDescription, this.type); + mutate(sampler: JavaScriptTestCaseSampler, depth: number): Statement { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleArgument(depth + 1, this.id, this.name); } - if (prng.nextBoolean(CONFIG.deltaMutationProbability)) { - return this.deltaMutation(); + if (prng.nextBoolean(sampler.deltaMutationProbability)) { + return this.deltaMutation(sampler); } - return sampler.sampleNumber(this.identifierDescription, this.type); + return sampler.sampleNumber(this.id, this.name); } - deltaMutation(): NumericStatement { + deltaMutation(sampler: JavaScriptTestCaseSampler): NumericStatement { // small mutation const change = prng.nextGaussian(0, 20); let newValue = this.value + change; // If illegal values are not allowed we make sure the value does not exceed the specified bounds - if (!CONFIG.exploreIllegalValues) { + if (!sampler.exploreIllegalValues) { const max = Number.MAX_SAFE_INTEGER; const min = Number.MIN_SAFE_INTEGER; @@ -68,7 +71,8 @@ export class NumericStatement extends PrimitiveStatement { } return new NumericStatement( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), newValue @@ -77,7 +81,8 @@ export class NumericStatement extends PrimitiveStatement { copy(): NumericStatement { return new NumericStatement( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), this.value diff --git a/libraries/javascript/lib/testcase/statements/primitive/PrimitiveStatement.ts b/libraries/search-javascript/lib/testcase/statements/primitive/PrimitiveStatement.ts similarity index 80% rename from libraries/javascript/lib/testcase/statements/primitive/PrimitiveStatement.ts rename to libraries/search-javascript/lib/testcase/statements/primitive/PrimitiveStatement.ts index bd1b7501a..067cac9ca 100644 --- a/libraries/javascript/lib/testcase/statements/primitive/PrimitiveStatement.ts +++ b/libraries/search-javascript/lib/testcase/statements/primitive/PrimitiveStatement.ts @@ -16,9 +16,8 @@ * limitations under the License. */ -import { Decoding, Statement } from "../Statement"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; +import { Decoding, Statement } from "../Statement"; /** * @author Dimitri Stallenberg @@ -30,21 +29,22 @@ export abstract class PrimitiveStatement extends Statement { private _value: T; constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, value: T ) { - super(identifierDescription, type, uniqueId); + super(id, name, type, uniqueId); this._value = value; } - abstract mutate( + abstract override mutate( sampler: JavaScriptTestCaseSampler, depth: number - ): PrimitiveStatement; + ): Statement; - abstract copy(): PrimitiveStatement; + abstract override copy(): Statement; hasChildren(): boolean { return false; @@ -59,9 +59,10 @@ export abstract class PrimitiveStatement extends Statement { } decode(): Decoding[] { + const asString = String(this.value); return [ { - decoded: `const ${this.varName} = ${this.value};`, + decoded: `const ${this.varName} = ${asString};`, reference: this, }, ]; diff --git a/libraries/javascript/lib/testcase/statements/primitive/StringStatement.ts b/libraries/search-javascript/lib/testcase/statements/primitive/StringStatement.ts similarity index 66% rename from libraries/javascript/lib/testcase/statements/primitive/StringStatement.ts rename to libraries/search-javascript/lib/testcase/statements/primitive/StringStatement.ts index 53c70cf4d..21bfaefa0 100644 --- a/libraries/javascript/lib/testcase/statements/primitive/StringStatement.ts +++ b/libraries/search-javascript/lib/testcase/statements/primitive/StringStatement.ts @@ -16,11 +16,12 @@ * limitations under the License. */ -import { CONFIG, prng } from "@syntest/core"; +import { prng } from "@syntest/search"; + import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; +import { Decoding, Statement } from "../Statement"; + import { PrimitiveStatement } from "./PrimitiveStatement"; -import { Decoding } from "../Statement"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; /** * @author Dimitri Stallenberg @@ -30,41 +31,42 @@ export class StringStatement extends PrimitiveStatement { private readonly maxlength: number; constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, value: string, alphabet: string, maxlength: number ) { - super(identifierDescription, type, uniqueId, value); + super(id, name, type, uniqueId, value); this._classType = "StringStatement"; this.alphabet = alphabet; this.maxlength = maxlength; } - mutate(sampler: JavaScriptTestCaseSampler): StringStatement { - if (prng.nextBoolean(CONFIG.resampleGeneProbability)) { - return sampler.sampleString( - this.identifierDescription, - this.type, - this.alphabet, - this.maxlength - ); + mutate(sampler: JavaScriptTestCaseSampler, depth: number): Statement { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleArgument(depth + 1, this.id, this.name); } if (this.value.length > 0 && this.value.length < this.maxlength) { const value = prng.nextInt(0, 3); - if (value === 0) { - return this.addMutation(); - } else if (value === 1) { - return this.removeMutation(); - } else if (value === 2) { - return this.replaceMutation(); - } else { - return this.deltaMutation(); + switch (value) { + case 0: { + return this.addMutation(); + } + case 1: { + return this.removeMutation(); + } + case 2: { + return this.replaceMutation(); + } + default: { + return this.deltaMutation(); + } } } else if (this.value.length > 0) { const value = prng.nextInt(0, 2); @@ -83,21 +85,22 @@ export class StringStatement extends PrimitiveStatement { addMutation(): StringStatement { const position = prng.nextInt(0, this.value.length - 1); - const addedChar = prng.pickOne(this.alphabet.split("")); + const addedChar = prng.pickOne([...this.alphabet]); let newValue = ""; - for (let i = 0; i < this.value.length; i++) { - if (i < position || i > position) { - newValue += this.value[i]; + for (let index = 0; index < this.value.length; index++) { + if (index < position || index > position) { + newValue += this.value[index]; } else { newValue += addedChar; - newValue += this.value[i]; + newValue += this.value[index]; } } return new StringStatement( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), newValue, @@ -111,15 +114,16 @@ export class StringStatement extends PrimitiveStatement { let newValue = ""; - for (let i = 0; i < this.value.length; i++) { - if (i === position) { + for (let index = 0; index < this.value.length; index++) { + if (index === position) { continue; } - newValue += this.value[i]; + newValue += this.value[index]; } return new StringStatement( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), newValue, @@ -130,20 +134,18 @@ export class StringStatement extends PrimitiveStatement { replaceMutation(): StringStatement { const position = prng.nextInt(0, this.value.length - 1); - const newChar = prng.pickOne(this.alphabet.split("")); + const newChar = prng.pickOne([...this.alphabet]); let newValue = ""; - for (let i = 0; i < this.value.length; i++) { - if (i < position || i > position) { - newValue += this.value[i]; - } else { - newValue += newChar; - } + for (let index = 0; index < this.value.length; index++) { + newValue += + index < position || index > position ? this.value[index] : newChar; } return new StringStatement( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), newValue, @@ -162,16 +164,14 @@ export class StringStatement extends PrimitiveStatement { let newValue = ""; - for (let i = 0; i < this.value.length; i++) { - if (i < position || i > position) { - newValue += this.value[i]; - } else { - newValue += newChar; - } + for (let index = 0; index < this.value.length; index++) { + newValue += + index < position || index > position ? this.value[index] : newChar; } return new StringStatement( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), newValue, @@ -182,16 +182,17 @@ export class StringStatement extends PrimitiveStatement { copy(): StringStatement { return new StringStatement( - this.identifierDescription, - this.type, this.id, + this.name, + this.type, + this.uniqueId, this.value, this.alphabet, this.maxlength ); } - decode(): Decoding[] { + override decode(): Decoding[] { return [ { decoded: `const ${this.varName} = "${this.value}";`, diff --git a/libraries/javascript/lib/testcase/statements/primitive/UndefinedStatement.ts b/libraries/search-javascript/lib/testcase/statements/primitive/UndefinedStatement.ts similarity index 62% rename from libraries/javascript/lib/testcase/statements/primitive/UndefinedStatement.ts rename to libraries/search-javascript/lib/testcase/statements/primitive/UndefinedStatement.ts index dbc24b18f..50c14f303 100644 --- a/libraries/javascript/lib/testcase/statements/primitive/UndefinedStatement.ts +++ b/libraries/search-javascript/lib/testcase/statements/primitive/UndefinedStatement.ts @@ -16,37 +16,36 @@ * limitations under the License. */ -import { prng } from "@syntest/core"; +import { prng } from "@syntest/search"; + import { PrimitiveStatement } from "./PrimitiveStatement"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; +import { Statement } from "../Statement"; +import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; /** * @author Dimitri Stallenberg */ export class UndefinedStatement extends PrimitiveStatement { - constructor( - identifierDescription: IdentifierDescription, - type: string, - uniqueId: string - ) { - super(identifierDescription, type, uniqueId, undefined); + constructor(id: string, name: string, type: string, uniqueId: string) { + // eslint-disable-next-line unicorn/no-useless-undefined + super(id, name, type, uniqueId, undefined); this._classType = "UndefinedStatement"; } - mutate(): UndefinedStatement { + mutate(sampler: JavaScriptTestCaseSampler, depth: number): Statement { + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + return sampler.sampleArgument(depth + 1, this.id, this.name); + } return new UndefinedStatement( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId() ); } copy(): UndefinedStatement { - return new UndefinedStatement( - this.identifierDescription, - this.type, - this.id - ); + return new UndefinedStatement(this.id, this.name, this.type, this.uniqueId); } getFlatTypes(): string[] { diff --git a/libraries/search-javascript/lib/testcase/statements/root/ConstructorCall.ts b/libraries/search-javascript/lib/testcase/statements/root/ConstructorCall.ts new file mode 100644 index 000000000..565857769 --- /dev/null +++ b/libraries/search-javascript/lib/testcase/statements/root/ConstructorCall.ts @@ -0,0 +1,193 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { prng } from "@syntest/search"; +import { TargetType } from "@syntest/analysis"; + +import { JavaScriptSubject } from "../../../search/JavaScriptSubject"; +import { JavaScriptDecoder } from "../../../testbuilding/JavaScriptDecoder"; +import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; +import { Getter } from "../action/Getter"; +import { MethodCall } from "../action/MethodCall"; +import { Setter } from "../action/Setter"; +import { Decoding, Statement } from "../Statement"; + +import { RootStatement } from "./RootStatement"; + +/** + * @author Dimitri Stallenberg + */ +export class ConstructorCall extends RootStatement { + /** + * Constructor + * @param type the return identifierDescription of the constructor + * @param uniqueId optional argument + * @param args the arguments of the constructor + * @param calls the child calls on the object + */ + constructor( + id: string, + name: string, + type: string, + uniqueId: string, + arguments_: Statement[], + calls: Statement[] + ) { + super(id, name, type, uniqueId, arguments_, calls); + this._classType = "ConstructorCall"; + + for (const argument of arguments_) { + if (argument instanceof MethodCall) { + throw new TypeError( + "Constructor args cannot be of identifierDescription MethodCall" + ); + } + } + + for (const call of calls) { + if ( + !( + call instanceof MethodCall || + call instanceof Getter || + call instanceof Setter + ) + ) { + throw new TypeError( + "Constructor children must be of identifierDescription MethodCall, Getter, or Setter" + ); + } + } + } + + mutate(sampler: JavaScriptTestCaseSampler, depth: number): ConstructorCall { + // TODO replace entire constructor? + + const arguments_ = this.args.map((a: Statement) => a.copy()); + const calls = this.children.map((a: Statement) => a.copy()); + + if (arguments_.length > 0) { + // go over each arg + for (let index = 0; index < arguments_.length; index++) { + if (prng.nextBoolean(1 / arguments_.length)) { + arguments_[index] = arguments_[index].mutate(sampler, depth + 1); + } + } + } + + const methodsAvailable = + (sampler.subject).getActionableTargetsByType( + TargetType.METHOD + ).length > 0; + + const finalCalls = []; + + // if there are no calls, add one if there are methods available + if (calls.length === 0 && methodsAvailable) { + // add a call + finalCalls.push(sampler.sampleMethodCall(depth + 1, this.name)); + return new ConstructorCall( + this.id, + this.name, + this.type, + prng.uniqueId(), + arguments_, + finalCalls + ); + } + + // go over each call + for (let index = 0; index < calls.length; index++) { + if (prng.nextBoolean(1 / calls.length)) { + // Mutate this position + const choice = prng.nextDouble(); + + if (choice < 0.1 && methodsAvailable) { + // 10% chance to add a call on this position + finalCalls.push( + sampler.sampleMethodCall(depth + 1, this.name), + calls[index] + ); + } else if (choice < 0.2) { + // 10% chance to delete the call + } else { + // 80% chance to just mutate the call + if (sampler.resampleGeneProbability) { + finalCalls.push(sampler.sampleMethodCall(depth + 1, this.name)); + } else { + finalCalls.push(calls[index].mutate(sampler, depth + 1)); + } + } + } + } + + return new ConstructorCall( + this.id, + this.name, + this.type, + prng.uniqueId(), + arguments_, + finalCalls + ); + } + + copy(): ConstructorCall { + const deepCopyArguments = this.args.map((a: Statement) => a.copy()); + const deepCopyChildren = this.children.map((a: Statement) => a.copy()); + + return new ConstructorCall( + this.id, + this.name, + this.type, + this.uniqueId, + deepCopyArguments, + deepCopyChildren + ); + } + + decode( + decoder: JavaScriptDecoder, + id: string, + options: { addLogs: boolean; exception: boolean } + ): Decoding[] { + const arguments_ = this.args.map((a) => a.varName).join(", "); + + const argumentStatements: Decoding[] = this.args.flatMap((a) => + a.decode(decoder, id, options) + ); + + const childStatements: Decoding[] = this.children.flatMap((a) => + (a).decodeWithObject(decoder, id, options, this.varName) + ); + + let decoded = `const ${this.varName} = new ${this.name}(${arguments_})`; + + if (options.addLogs) { + const logDirectory = decoder.getLogDirectory(id, this.varName); + decoded += `\nawait fs.writeFileSync('${logDirectory}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; + } + + return [ + ...argumentStatements, + { + decoded: decoded, + reference: this, + }, + ...childStatements, + ]; + } +} diff --git a/libraries/javascript/lib/testcase/statements/root/FunctionCall.ts b/libraries/search-javascript/lib/testcase/statements/root/FunctionCall.ts similarity index 51% rename from libraries/javascript/lib/testcase/statements/root/FunctionCall.ts rename to libraries/search-javascript/lib/testcase/statements/root/FunctionCall.ts index a1fac79c0..363033a3a 100644 --- a/libraries/javascript/lib/testcase/statements/root/FunctionCall.ts +++ b/libraries/search-javascript/lib/testcase/statements/root/FunctionCall.ts @@ -16,19 +16,18 @@ * limitations under the License. */ -import { CONFIG, prng } from "@syntest/core"; +import { prng } from "@syntest/search"; + +import { JavaScriptDecoder } from "../../../testbuilding/JavaScriptDecoder"; import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; import { Decoding, Statement } from "../Statement"; + import { RootStatement } from "./RootStatement"; -import * as path from "path"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; /** * @author Dimitri Stallenberg */ export class FunctionCall extends RootStatement { - private readonly _functionName: string; - /** * Constructor * @param type the return identifierDescription of the function @@ -37,78 +36,70 @@ export class FunctionCall extends RootStatement { * @param args the arguments of the function */ constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, - functionName: string, - args: Statement[] + arguments_: Statement[] ) { - super(identifierDescription, type, uniqueId, args, []); + super(id, name, type, uniqueId, arguments_, []); this._classType = "FunctionCall"; - - this._functionName = functionName; } mutate(sampler: JavaScriptTestCaseSampler, depth: number): FunctionCall { - const args = [...this.args.map((a: Statement) => a.copy())]; - - if (args.length !== 0) { - const index = prng.nextInt(0, args.length - 1); - if (prng.nextBoolean(CONFIG.resampleGeneProbability)) { - // TODO should be different property - args[index] = sampler.sampleArgument( - depth + 1, - args[index].identifierDescription - ); - } else { - args[index] = args[index].mutate(sampler, depth + 1); + // replace entire function call + const arguments_ = this.args.map((a: Statement) => a.copy()); + + if (arguments_.length > 0) { + // go over each arg + for (let index = 0; index < arguments_.length; index++) { + if (prng.nextBoolean(1 / arguments_.length)) { + arguments_[index] = arguments_[index].mutate(sampler, depth + 1); + } } } return new FunctionCall( - this.identifierDescription, + this.id, + this.name, this.type, prng.uniqueId(), - this.functionName, - args + arguments_ ); } copy(): FunctionCall { - const deepCopyArgs = [...this.args.map((a: Statement) => a.copy())]; + const deepCopyArguments = this.args.map((a: Statement) => a.copy()); return new FunctionCall( - this.identifierDescription, - this.type, this.id, - this.functionName, - deepCopyArgs + this.name, + this.type, + this.uniqueId, + deepCopyArguments ); } - get functionName(): string { - return this._functionName; - } - decode( + decoder: JavaScriptDecoder, id: string, options: { addLogs: boolean; exception: boolean } ): Decoding[] { - const args = this.args.map((a) => a.varName).join(", "); + const arguments_ = this.args.map((a) => a.varName).join(", "); - const argStatements: Decoding[] = this.args.flatMap((a) => - a.decode(id, options) + const argumentStatements: Decoding[] = this.args.flatMap((a) => + a.decode(decoder, id, options) ); - let decoded = `const ${this.varName} = await ${this.functionName}(${args})`; + let decoded = `const ${this.varName} = await ${this.name}(${arguments_})`; if (options.addLogs) { - const logDir = path.join(CONFIG.tempLogDirectory, id, this.varName); - decoded += `\nawait fs.writeFileSync('${logDir}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; + const logDirectory = decoder.getLogDirectory(id, this.varName); + decoded += `\nawait fs.writeFileSync('${logDirectory}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; } return [ - ...argStatements, + ...argumentStatements, { decoded: decoded, reference: this, @@ -117,7 +108,7 @@ export class FunctionCall extends RootStatement { } decodeErroring(): string { - const args = this.args.map((a) => a.varName).join(", "); - return `await expect(${this.functionName}(${args})).to.be.rejectedWith(Error);`; + const arguments_ = this.args.map((a) => a.varName).join(", "); + return `await expect(${this.name}(${arguments_})).to.be.rejectedWith(Error);`; } } diff --git a/libraries/search-javascript/lib/testcase/statements/root/RootObject.ts b/libraries/search-javascript/lib/testcase/statements/root/RootObject.ts new file mode 100644 index 000000000..eed3e7b0c --- /dev/null +++ b/libraries/search-javascript/lib/testcase/statements/root/RootObject.ts @@ -0,0 +1,160 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { prng } from "@syntest/search"; +import { TargetType } from "@syntest/analysis"; + +import { JavaScriptSubject } from "../../../search/JavaScriptSubject"; +import { JavaScriptDecoder } from "../../../testbuilding/JavaScriptDecoder"; +import { JavaScriptTestCaseSampler } from "../../sampling/JavaScriptTestCaseSampler"; +import { Decoding, Statement } from "../Statement"; + +import { RootStatement } from "./RootStatement"; +import { ObjectFunctionCall } from "../action/ObjectFunctionCall"; + +/** + * @author Dimitri Stallenberg + */ +export class RootObject extends RootStatement { + /** + * Constructor + * @param type the return identifierDescription of the constructor + * @param uniqueId optional argument + * @param calls the child calls on the object + */ + constructor( + id: string, + name: string, + type: string, + uniqueId: string, + calls: Statement[] + ) { + super(id, name, type, uniqueId, [], calls); + this._classType = "RootObject"; + + for (const call of calls) { + if (!(call instanceof ObjectFunctionCall)) { + throw new TypeError( + "Constructor children must be of identifierDescription MethodCall" + ); + } + } + } + + mutate(sampler: JavaScriptTestCaseSampler, depth: number): RootObject { + // TODO replace entire constructor? + const calls = this.children.map((a: Statement) => a.copy()); + + const methodsAvailable = + (sampler.subject).getActionableTargetsByType( + TargetType.METHOD + ).length > 0; + + const finalCalls = []; + + // If there are no calls, add one if there are methods available + if (calls.length === 0 && methodsAvailable) { + // add a call + finalCalls.push(sampler.sampleObjectFunctionCall(depth + 1, this.name)); + return new RootObject( + this.id, + this.name, + this.type, + prng.uniqueId(), + finalCalls + ); + } + + // go over each call + for (let index = 0; index < calls.length; index++) { + if (prng.nextBoolean(1 / calls.length)) { + // Mutate this position + const choice = prng.nextDouble(); + + if (choice < 0.1 && methodsAvailable) { + // 10% chance to add a call on this position + finalCalls.push( + sampler.sampleObjectFunctionCall(depth + 1, this.name), + calls[index] + ); + } else if (choice < 0.2) { + // 10% chance to delete the call + } else { + // 80% chance to just mutate the call + if (prng.nextBoolean(sampler.resampleGeneProbability)) { + finalCalls.push( + sampler.sampleObjectFunctionCall(depth + 1, this.name) + ); + } else { + finalCalls.push(calls[index].mutate(sampler, depth + 1)); + } + } + } + } + + return new RootObject( + this.id, + this.name, + this.type, + prng.uniqueId(), + finalCalls + ); + } + + copy(): RootObject { + const deepCopyChildren = this.children.map((a: Statement) => a.copy()); + + return new RootObject( + this.id, + this.name, + this.type, + this.uniqueId, + deepCopyChildren + ); + } + + decode( + decoder: JavaScriptDecoder, + id: string, + options: { addLogs: boolean; exception: boolean } + ): Decoding[] { + const childStatements: Decoding[] = this.children.flatMap( + (a: Statement) => { + if (a instanceof ObjectFunctionCall) { + return a.decodeWithObject(decoder, id, options, this.varName); + } + return a.decode(decoder, id, options); + } + ); + + let decoded = `const ${this.varName} = ${this.name}`; + + if (options.addLogs) { + const logDirectory = decoder.getLogDirectory(id, this.varName); + decoded += `\nawait fs.writeFileSync('${logDirectory}', '' + ${this.varName} + ';sep;' + JSON.stringify(${this.varName}))`; + } + + return [ + { + decoded: decoded, + reference: this, + }, + ...childStatements, + ]; + } +} diff --git a/libraries/javascript/lib/testcase/statements/root/RootStatement.ts b/libraries/search-javascript/lib/testcase/statements/root/RootStatement.ts similarity index 77% rename from libraries/javascript/lib/testcase/statements/root/RootStatement.ts rename to libraries/search-javascript/lib/testcase/statements/root/RootStatement.ts index 7b110eeb1..3b27fc3a0 100644 --- a/libraries/javascript/lib/testcase/statements/root/RootStatement.ts +++ b/libraries/search-javascript/lib/testcase/statements/root/RootStatement.ts @@ -16,10 +16,10 @@ * limitations under the License. */ +import { Encoding, EncodingSampler } from "@syntest/search"; + import { ActionStatement } from "../action/ActionStatement"; import { Statement } from "../Statement"; -import { Encoding, EncodingSampler } from "@syntest/core"; -import { IdentifierDescription } from "../../../analysis/static/parsing/IdentifierDescription"; /** * @author Dimitri Stallenberg @@ -28,28 +28,29 @@ export abstract class RootStatement extends ActionStatement { private _children: Statement[]; protected constructor( - identifierDescription: IdentifierDescription, + id: string, + name: string, type: string, uniqueId: string, - args: Statement[], + arguments_: Statement[], children: Statement[] ) { - super(identifierDescription, type, uniqueId, args); + super(id, name, type, uniqueId, arguments_); this._children = children; } - abstract mutate( + abstract override mutate( sampler: EncodingSampler, depth: number ): RootStatement; - abstract copy(): RootStatement; + abstract override copy(): RootStatement; - hasChildren(): boolean { - return !!this.args.length || !!this._children.length; + override hasChildren(): boolean { + return this.args.length > 0 || this._children.length > 0; } - getChildren(): Statement[] { + override getChildren(): Statement[] { return [...this.args, ...this._children]; } @@ -57,7 +58,7 @@ export abstract class RootStatement extends ActionStatement { return this._children; } - setChild(index: number, newChild: Statement) { + override setChild(index: number, newChild: Statement) { if (!newChild) { throw new Error("Invalid new child!"); } @@ -74,7 +75,7 @@ export abstract class RootStatement extends ActionStatement { } } - getFlatTypes(): string[] { + override getFlatTypes(): string[] { return [ ...this.args.flatMap((a) => a.getFlatTypes()), ...this.children.flatMap((a) => a.getFlatTypes()), diff --git a/libraries/javascript/package.json b/libraries/search-javascript/package.json similarity index 77% rename from libraries/javascript/package.json rename to libraries/search-javascript/package.json index 1a0de757a..dfdd4770b 100644 --- a/libraries/javascript/package.json +++ b/libraries/search-javascript/package.json @@ -1,6 +1,6 @@ { - "name": "@syntest/javascript", - "version": "0.1.0-beta.4", + "name": "@syntest/search-javascript", + "version": "0.0.0", "description": "SynTest JavaScript is a tool for automatically generating test cases for the JavaScript language", "keywords": [ "syntest", @@ -19,17 +19,18 @@ "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ - "/dist", - "/NOTICE", - "/README.md" + "dist/lib", + "dist/index.d.ts", + "dist/index.d.ts.map", + "dist/index.js", + "dist/index.js.map", + "NOTICE", + "README.md" ], "repository": { "type": "git", "url": "git+https://github.com/syntest-framework/syntest-javascript.git" }, - "bin": { - "syntest-javascript": "/dist/bin.js" - }, "scripts": { "build": "tsc --build", "build:watch": "tsc --build --watch", @@ -45,14 +46,18 @@ "test:watch": "mocha --config ../../.mocharc.json --watch" }, "dependencies": { - "@babel/core": "7.16.5", + "@babel/core": "7.20.12", + "@babel/generator": "^7.21.9", "@babel/preset-env": "7.19.1", "@babel/register": "7.18.9", "@istanbuljs/schema": "0.1.3", - "@syntest/ast-javascript": "^0.1.0-beta.3", - "@syntest/cfg-javascript": "^0.1.0-beta.4", - "@syntest/core": "^0.3.1-beta.0", - "@syntest/instrumentation-javascript": "^0.1.0-beta.2", + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/analysis-javascript": "*", + "@syntest/ast-visitor-javascript": "*", + "@syntest/cfg": "^0.3.0-beta.16", + "@syntest/instrumentation-javascript": "*", + "@syntest/logging": "^0.1.0-beta.6", + "@syntest/search": "^0.4.0-beta.25", "chai": "4.3.7", "chai-as-promised": "7.1.1", "chalk": "4.1.1", @@ -62,7 +67,6 @@ "istanbul-lib-instrument": "5.1.0", "lodash.clonedeep": "4.5.0", "mocha": "10.2.0", - "original-require": "1.0.1", "regenerator-runtime": "0.13.9" }, "engines": { @@ -70,5 +74,8 @@ }, "publishConfig": { "access": "public" + }, + "devDependencies": { + "@babel/types": "^7.21.5" } } diff --git a/libraries/javascript/test/example.test.ts b/libraries/search-javascript/test/example.test.ts similarity index 78% rename from libraries/javascript/test/example.test.ts rename to libraries/search-javascript/test/example.test.ts index ee212a982..0ef2bbf38 100644 --- a/libraries/javascript/test/example.test.ts +++ b/libraries/search-javascript/test/example.test.ts @@ -16,11 +16,13 @@ * limitations under the License. */ import { expect } from "chai"; -import ExecutionInformationIntegrator from "../lib/testcase/execution/ExecutionInformationIntegrator"; + +import { ExecutionInformationIntegrator } from "../lib/testcase/execution/ExecutionInformationIntegrator"; +import { TypeModel } from "@syntest/analysis-javascript"; describe("Temp", () => { it("temp", () => { - new ExecutionInformationIntegrator(); + new ExecutionInformationIntegrator(new TypeModel()); expect(true); }); }); diff --git a/libraries/javascript/test/helper.test.ts b/libraries/search-javascript/test/helper.test.ts similarity index 83% rename from libraries/javascript/test/helper.test.ts rename to libraries/search-javascript/test/helper.test.ts index b0a3e3d92..2ac3a3905 100644 --- a/libraries/javascript/test/helper.test.ts +++ b/libraries/search-javascript/test/helper.test.ts @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Configuration, ArgumentsObject } from "@syntest/core"; + // globals // setup @@ -23,8 +23,8 @@ import { Configuration, ArgumentsObject } from "@syntest/core"; before(() => { // This will set the configuration singleton for all test cases. // The configuration singleton is required for running certain parts of the code. - const configuration = new Configuration(); - configuration.initialize(({ - seed: "0.1", - })); + // const configuration = new Configuration(); + // configuration.initialize(({ + // seed: "0.1", + // })); }); diff --git a/libraries/cfg-javascript/lib/tsconfig.json b/libraries/search-javascript/tsconfig.json similarity index 58% rename from libraries/cfg-javascript/lib/tsconfig.json rename to libraries/search-javascript/tsconfig.json index 4f4603271..97ea4a6a1 100644 --- a/libraries/cfg-javascript/lib/tsconfig.json +++ b/libraries/search-javascript/tsconfig.json @@ -1,7 +1,7 @@ { - "extends": "../../../tsconfig-base.json", + "extends": "../../tsconfig-base.json", "compilerOptions": { - "outDir": "../dist", + "outDir": "./dist", "rootDir": ".", "composite": true }, diff --git a/link.sh b/link.sh new file mode 100755 index 000000000..31d7e8947 --- /dev/null +++ b/link.sh @@ -0,0 +1,56 @@ +# this file is used for local development +# it links the syntest-core libraries to the syntest-javascript libraries + +rm -rf node_modules/@syntest/analysis +rm -rf node_modules/@syntest/base-language +rm -rf node_modules/@syntest/cfg +rm -rf node_modules/@syntest/cli +rm -rf node_modules/@syntest/cli-graphics +rm -rf node_modules/@syntest/search +rm -rf node_modules/@syntest/logging +rm -rf node_modules/@syntest/metric +rm -rf node_modules/@syntest/module + +cd node_modules/@syntest + +ln -s ../../../syntest-core/libraries/analysis analysis +ln -s ../../../syntest-core/libraries/cfg cfg +ln -s ../../../syntest-core/libraries/cli cli +ln -s ../../../syntest-core/libraries/cli-graphics cli-graphics +ln -s ../../../syntest-core/libraries/logging logging +ln -s ../../../syntest-core/libraries/metric metric +ln -s ../../../syntest-core/libraries/module module +ln -s ../../../syntest-core/libraries/search search + +ln -s ../../../syntest-core/tools/base-language base-language + + +# cp -r ../syntest-core/libraries/analysis node_modules/@syntest/analysis +# cp -r ../syntest-core/libraries/base-testing-tool node_modules/@syntest/base-language +# cp -r ../syntest-core/libraries/cfg-core node_modules/@syntest/cfg +# cp -r ../syntest-core/libraries/cli node_modules/@syntest/cli +# cp -r ../syntest-core/libraries/cli-graphics node_modules/@syntest/cli-graphics +# cp -r ../syntest-core/libraries/core node_modules/@syntest/search +# cp -r ../syntest-core/libraries/logging node_modules/@syntest/logging +# cp -r ../syntest-core/libraries/metric node_modules/@syntest/metric +# cp -r ../syntest-core/libraries/module node_modules/@syntest/module + +# npm link ../syntest-core/libraries/analysis +# npm link ../syntest-core/libraries/base-testing-tool +# npm link ../syntest-core/libraries/cfg-core +# npm link ../syntest-core/libraries/cli +# npm link ../syntest-core/libraries/cli-graphics +# npm link ../syntest-core/libraries/core +# npm link ../syntest-core/libraries/logging +# npm link ../syntest-core/libraries/metric +# npm link ../syntest-core/libraries/module + +# npm link @syntest/analysis +# npm link @syntest/base-language +# npm link @syntest/cfg +# npm link @syntest/cli +# npm link @syntest/cli-graphics +# npm link @syntest/search +# npm link @syntest/logging +# npm link @syntest/metric +# npm link @syntest/module \ No newline at end of file diff --git a/nx.json b/nx.json index 565e31b82..e7bef4a75 100644 --- a/nx.json +++ b/nx.json @@ -1,4 +1,9 @@ { + "pluginsConfig": { + "@nrwl/js": { + "analyzeSourceFiles": true + } + }, "tasksRunnerOptions": { "default": { "runner": "nx/tasks-runners/default", @@ -18,41 +23,62 @@ } }, "namedInputs": { - "default": [ + "build-system": [ + "{workspaceRoot}/nx.json", + "{workspaceRoot}/lerna.json", + "{workspaceRoot}/package.json", + "{projectRoot}/package.json" + ], + "eslint": [ + "{workspaceRoot}/.eslintignore", + "{workspaceRoot}/.eslintrc.json" + ], + "mocha": ["{workspaceRoot}/.mocharc.json"], + "prettier": [ + "{workspaceRoot}/.prettierignore", + "{workspaceRoot}/.prettierrc.json" + ], + "typescript": [ + "{workspaceRoot}/tsconfig-base.json", + "{projectRoot}/tsconfig.json", + "{projectRoot}/*/tsconfig.json", "{projectRoot}/**/*.ts", - "{projectRoot}/**/*.js", - "{projectRoot}/**/*.json" + "{projectRoot}/**/*.js" ] }, "targetDefaults": { "build": { - "dependsOn": ["^build"], - "inputs": ["default"], + "dependsOn": ["clean:dist", "^build"], + "inputs": ["build-system", "typescript", "^typescript"], "outputs": ["{projectRoot}/dist"] }, "format": { + "inputs": ["build-system", "prettier", "typescript"], "outputs": ["{projectRoot}/lib"] }, + "format:check": { + "inputs": ["build-system", "prettier", "typescript"] + }, + "lint": { + "inputs": ["build-system", "eslint", "typescript"] + }, "lint:fix": { + "inputs": ["build-system", "eslint", "typescript"], "outputs": ["{projectRoot}/lib"] }, "test": { - "dependsOn": ["build", "^build"], - "inputs": ["default"] + "dependsOn": ["^build"], + "inputs": ["build-system", "mocha", "typescript"] }, "test:coverage": { "dependsOn": ["build", "^build"], - "inputs": ["default"], + "inputs": ["build-system", "mocha", "typescript"], "outputs": ["{projectRoot}/coverage"] }, "test:coverage:ci": { "dependsOn": ["build", "^build"], - "inputs": ["default"], + "inputs": ["build-system", "mocha", "typescript"], "outputs": ["{projectRoot}/coverage"] - }, - "test:watch": { - "dependsOn": ["build", "^build"], - "inputs": ["default"] } } } diff --git a/package-lock.json b/package-lock.json index 9019a53fa..62401134d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,15 +12,16 @@ "workspaces": [ "libraries/*", "plugins/*", - "presets/*", "tools/*" ], "devDependencies": { "@commitlint/cli": "17.4.2", "@commitlint/config-conventional": "17.4.2", - "@types/babel__core": "7.1.20", + "@types/babel__core": "7.20.0", + "@types/babel__traverse": "^7.18.3", "@types/chai": "4.3.4", "@types/figlet": "1.5.4", + "@types/lodash.clonedeep": "^4.5.7", "@types/mocha": "10.0.1", "@types/node": "18.11.18", "@types/yargs": "17.0.20", @@ -28,9 +29,15 @@ "@typescript-eslint/parser": "5.45.1", "chai": "4.3.7", "commitlint": "17.4.2", - "eslint": "8.29.0", + "eslint": "^8.36.0", "eslint-config-prettier": "8.5.0", + "eslint-import-resolver-typescript": "^3.5.3", + "eslint-plugin-import": "^2.27.5", "eslint-plugin-notice": "^0.9.10", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-sonarjs": "^0.19.0", + "eslint-plugin-unicorn": "^45.0.2", + "eslint-plugin-unused-imports": "^2.0.0", "husky": "8.0.3", "lerna": "6.4.1", "lint-staged": "13.1.0", @@ -40,48 +47,77 @@ "prettier": "2.8.1", "sinon": "15.0.1", "ts-node": "10.9.1", - "typescript": "4.9.4" + "typed-emitter": "^2.1.0", + "typescript": "4.9.4", + "winston": "3.8.2" + }, + "engines": { + "node": ">=16" + } + }, + "libraries/analysis-javascript": { + "name": "@syntest/analysis-javascript", + "version": "0.1.0-beta.4", + "license": "Apache-2.0", + "dependencies": { + "@babel/core": "7.20.12", + "@babel/traverse": "^7.21.5", + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/ast-visitor-javascript": "*", + "@syntest/cfg": "^0.3.0-beta.16", + "@syntest/logging": "^0.1.0-beta.6", + "@syntest/search": "^0.4.0-beta.25" + }, + "devDependencies": { + "@babel/types": "^7.21.5" }, "engines": { "node": ">=10.24.0" } }, - "libraries/ast-javascript": { - "name": "@syntest/ast-javascript", + "libraries/ast-visitor-javascript": { + "name": "@syntest/ast-visitor-javascript", "version": "0.1.0-beta.3", "license": "Apache-2.0", "dependencies": { - "@babel/core": "7.20.12" + "@babel/core": "7.20.12", + "@babel/traverse": "7.20.12", + "@syntest/logging": "^0.1.0-beta.6", + "globals": "^13.20.0" }, "devDependencies": { - "@types/babel__core": "7.20.0" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=10.24.0" } }, - "libraries/ast-javascript/node_modules/@types/babel__core": { - "version": "7.20.0", - "dev": true, - "license": "MIT", + "libraries/ast-visitor-javascript/node_modules/@babel/traverse": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", + "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" } }, - "libraries/cfg-javascript": { - "name": "@syntest/cfg-javascript", - "version": "0.1.0-beta.4", - "license": "Apache-2.0", - "dependencies": { - "@syntest/cfg-core": "*", - "@syntest/core": "*" - }, + "libraries/ast-visitor-javascript/node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { - "node": ">=10.24.0" + "node": ">=4" } }, "libraries/instrumentation-javascript": { @@ -90,40 +126,51 @@ "license": "Apache-2.0", "dependencies": { "@babel/core": "7.20.12", - "@syntest/ast-javascript": "*" + "@babel/traverse": "^7.21.5", + "@istanbuljs/schema": "^0.1.3", + "@syntest/analysis-javascript": "^0.1.0-beta.4", + "@syntest/ast-visitor-javascript": "*", + "fs-extra": "^11.1.1", + "istanbul-lib-coverage": "^3.2.0" }, "devDependencies": { + "@babel/types": "^7.21.5", "@types/babel__core": "7.20.0" }, "engines": { "node": ">=10.24.0" } }, - "libraries/instrumentation-javascript/node_modules/@types/babel__core": { - "version": "7.20.0", - "dev": true, - "license": "MIT", + "libraries/instrumentation-javascript/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" } }, - "libraries/javascript": { - "name": "@syntest/javascript", - "version": "0.1.0-beta.4", + "libraries/search-javascript": { + "name": "@syntest/search-javascript", + "version": "0.0.0", "license": "Apache-2.0", "dependencies": { - "@babel/core": "7.16.5", + "@babel/core": "7.20.12", + "@babel/generator": "^7.21.9", "@babel/preset-env": "7.19.1", "@babel/register": "7.18.9", "@istanbuljs/schema": "0.1.3", - "@syntest/ast-javascript": "^0.1.0-beta.3", - "@syntest/cfg-javascript": "^0.1.0-beta.4", - "@syntest/core": "^0.3.1-beta.0", - "@syntest/instrumentation-javascript": "^0.1.0-beta.2", + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/analysis-javascript": "*", + "@syntest/ast-visitor-javascript": "*", + "@syntest/cfg": "^0.3.0-beta.16", + "@syntest/instrumentation-javascript": "*", + "@syntest/logging": "^0.1.0-beta.6", + "@syntest/search": "^0.4.0-beta.25", "chai": "4.3.7", "chai-as-promised": "7.1.1", "chalk": "4.1.1", @@ -133,49 +180,36 @@ "istanbul-lib-instrument": "5.1.0", "lodash.clonedeep": "4.5.0", "mocha": "10.2.0", - "original-require": "1.0.1", "regenerator-runtime": "0.13.9" }, - "bin": { - "syntest-javascript": "dist/bin.js" + "devDependencies": { + "@babel/types": "^7.21.5" }, "engines": { "node": ">=10.24.0" } }, - "libraries/javascript/node_modules/@babel/core": { - "version": "7.16.5", - "license": "MIT", + "libraries/search-javascript/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.5", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helpers": "^7.16.5", - "@babel/parser": "^7.16.5", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "license": "Apache-2.0", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -183,8 +217,9 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "license": "MIT", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dependencies": { "@babel/highlight": "^7.18.6" }, @@ -193,15 +228,17 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.0", - "license": "MIT", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.9.tgz", + "integrity": "sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.20.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", @@ -228,10 +265,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.1", - "license": "MIT", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", + "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", "dependencies": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.21.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -240,21 +278,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "dependencies": { "@babel/types": "^7.18.6" }, @@ -263,22 +290,23 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", + "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" @@ -291,17 +319,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.0", - "license": "MIT", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", + "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.5", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-replace-supers": "^7.21.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-split-export-declaration": "^7.18.6", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -311,11 +341,13 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", - "license": "MIT", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", + "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" + "regexpu-core": "^5.3.1", + "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" @@ -326,7 +358,8 @@ }, "node_modules/@babel/helper-define-polyfill-provider": { "version": "0.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -340,25 +373,17 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.18.6" - }, + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.21.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dependencies": { "@babel/template": "^7.20.7", "@babel/types": "^7.21.0" @@ -369,7 +394,8 @@ }, "node_modules/@babel/helper-hoist-variables": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dependencies": { "@babel/types": "^7.18.6" }, @@ -378,37 +404,40 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", + "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", "dependencies": { - "@babel/types": "^7.21.0" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "license": "MIT", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -416,7 +445,8 @@ }, "node_modules/@babel/helper-optimise-call-expression": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "dependencies": { "@babel/types": "^7.18.6" }, @@ -425,15 +455,17 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { "version": "7.18.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", @@ -448,25 +480,27 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.20.7", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", + "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-member-expression-to-functions": "^7.21.5", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -474,7 +508,8 @@ }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { "version": "7.20.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "dependencies": { "@babel/types": "^7.20.0" }, @@ -484,7 +519,8 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dependencies": { "@babel/types": "^7.18.6" }, @@ -493,29 +529,33 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.19.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.21.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { "version": "7.20.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "dependencies": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", @@ -527,12 +567,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", "dependencies": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -540,7 +581,8 @@ }, "node_modules/@babel/highlight": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -552,7 +594,8 @@ }, "node_modules/@babel/highlight/node_modules/ansi-styles": { "version": "3.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { "color-convert": "^1.9.0" }, @@ -562,7 +605,8 @@ }, "node_modules/@babel/highlight/node_modules/chalk": { "version": "2.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -574,32 +618,37 @@ }, "node_modules/@babel/highlight/node_modules/color-convert": { "version": "1.9.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { "color-name": "1.1.3" } }, "node_modules/@babel/highlight/node_modules/color-name": { "version": "1.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/supports-color": { "version": "5.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { "has-flag": "^3.0.0" }, @@ -608,8 +657,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.2", - "license": "MIT", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", + "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", "bin": { "parser": "bin/babel-parser.js" }, @@ -619,7 +669,8 @@ }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -632,7 +683,8 @@ }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.20.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", @@ -647,7 +699,8 @@ }, "node_modules/@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", @@ -663,7 +716,8 @@ }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -677,7 +731,8 @@ }, "node_modules/@babel/plugin-proposal-class-static-block": { "version": "7.21.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.21.0", "@babel/helper-plugin-utils": "^7.20.2", @@ -692,7 +747,8 @@ }, "node_modules/@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -706,7 +762,8 @@ }, "node_modules/@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -720,7 +777,8 @@ }, "node_modules/@babel/plugin-proposal-json-strings": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -734,7 +792,8 @@ }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -748,7 +807,8 @@ }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -762,7 +822,8 @@ }, "node_modules/@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -776,7 +837,8 @@ }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dependencies": { "@babel/compat-data": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.7", @@ -793,7 +855,8 @@ }, "node_modules/@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -807,7 +870,8 @@ }, "node_modules/@babel/plugin-proposal-optional-chaining": { "version": "7.21.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", @@ -822,7 +886,8 @@ }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -836,7 +901,8 @@ }, "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", + "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.21.0", @@ -852,7 +918,8 @@ }, "node_modules/@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -866,7 +933,8 @@ }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -876,7 +944,8 @@ }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -886,7 +955,8 @@ }, "node_modules/@babel/plugin-syntax-class-static-block": { "version": "7.14.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -899,7 +969,8 @@ }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -909,7 +980,8 @@ }, "node_modules/@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -919,7 +991,8 @@ }, "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.20.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.19.0" }, @@ -932,7 +1005,8 @@ }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -942,7 +1016,8 @@ }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -952,7 +1027,8 @@ }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -962,7 +1038,8 @@ }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -972,7 +1049,8 @@ }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -982,7 +1060,8 @@ }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -992,7 +1071,8 @@ }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1002,7 +1082,8 @@ }, "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1015,7 +1096,8 @@ }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1027,10 +1109,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1041,7 +1124,8 @@ }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.20.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", @@ -1056,7 +1140,8 @@ }, "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1069,7 +1154,8 @@ }, "node_modules/@babel/plugin-transform-block-scoping": { "version": "7.21.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, @@ -1082,7 +1168,8 @@ }, "node_modules/@babel/plugin-transform-classes": { "version": "7.21.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-compilation-targets": "^7.20.7", @@ -1101,11 +1188,20 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-classes/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/template": "^7.20.7" }, "engines": { @@ -1116,8 +1212,9 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.20.7", - "license": "MIT", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, @@ -1130,7 +1227,8 @@ }, "node_modules/@babel/plugin-transform-dotall-regex": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1144,7 +1242,8 @@ }, "node_modules/@babel/plugin-transform-duplicate-keys": { "version": "7.18.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1157,7 +1256,8 @@ }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1170,10 +1270,11 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.0", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1184,7 +1285,8 @@ }, "node_modules/@babel/plugin-transform-function-name": { "version": "7.18.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "dependencies": { "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-function-name": "^7.18.9", @@ -1199,7 +1301,8 @@ }, "node_modules/@babel/plugin-transform-literals": { "version": "7.18.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1212,7 +1315,8 @@ }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1225,7 +1329,8 @@ }, "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.20.11", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "dependencies": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2" @@ -1238,12 +1343,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1254,7 +1360,8 @@ }, "node_modules/@babel/plugin-transform-modules-systemjs": { "version": "7.20.11", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.20.11", @@ -1270,7 +1377,8 @@ }, "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1284,7 +1392,8 @@ }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.20.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2" @@ -1298,7 +1407,8 @@ }, "node_modules/@babel/plugin-transform-new-target": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1311,7 +1421,8 @@ }, "node_modules/@babel/plugin-transform-object-super": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" @@ -1324,8 +1435,9 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.20.7", - "license": "MIT", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2" }, @@ -1338,7 +1450,8 @@ }, "node_modules/@babel/plugin-transform-property-literals": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1350,10 +1463,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "regenerator-transform": "^0.15.1" }, "engines": { @@ -1365,7 +1479,8 @@ }, "node_modules/@babel/plugin-transform-reserved-words": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1378,7 +1493,8 @@ }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1391,7 +1507,8 @@ }, "node_modules/@babel/plugin-transform-spread": { "version": "7.20.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "dependencies": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" @@ -1405,7 +1522,8 @@ }, "node_modules/@babel/plugin-transform-sticky-regex": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1418,7 +1536,8 @@ }, "node_modules/@babel/plugin-transform-template-literals": { "version": "7.18.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1431,7 +1550,8 @@ }, "node_modules/@babel/plugin-transform-typeof-symbol": { "version": "7.18.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "dependencies": { "@babel/helper-plugin-utils": "^7.18.9" }, @@ -1443,10 +1563,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1457,7 +1578,8 @@ }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.18.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1471,7 +1593,8 @@ }, "node_modules/@babel/preset-env": { "version": "7.19.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", + "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", "dependencies": { "@babel/compat-data": "^7.19.1", "@babel/helper-compilation-targets": "^7.19.1", @@ -1558,7 +1681,8 @@ }, "node_modules/@babel/preset-modules": { "version": "0.1.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -1572,7 +1696,8 @@ }, "node_modules/@babel/register": { "version": "7.18.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz", + "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==", "dependencies": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", @@ -1589,11 +1714,13 @@ }, "node_modules/@babel/regjsgen": { "version": "0.8.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -1603,32 +1730,35 @@ }, "node_modules/@babel/runtime/node_modules/regenerator-runtime": { "version": "0.13.11", - "license": "MIT" + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/@babel/template": { - "version": "7.20.7", - "license": "MIT", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.2", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1636,11 +1766,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { - "version": "7.21.2", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, @@ -1650,15 +1789,17 @@ }, "node_modules/@colors/colors": { "version": "1.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "engines": { "node": ">=0.1.90" } }, "node_modules/@commitlint/cli": { "version": "17.4.2", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.4.2.tgz", + "integrity": "sha512-0rPGJ2O1owhpxMIXL9YJ2CgPkdrFLKZElIZHXDN8L8+qWK1DGH7Q7IelBT1pchXTYTuDlqkOTdh//aTvT3bSUA==", "dev": true, - "license": "MIT", "dependencies": { "@commitlint/format": "^17.4.0", "@commitlint/lint": "^17.4.2", @@ -1680,8 +1821,9 @@ }, "node_modules/@commitlint/config-conventional": { "version": "17.4.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.4.2.tgz", + "integrity": "sha512-JVo1moSj5eDMoql159q8zKCU8lkOhQ+b23Vl3LVVrS6PXDLQIELnJ34ChQmFVbBdSSRNAbbXnRDhosFU+wnuHw==", "dev": true, - "license": "MIT", "dependencies": { "conventional-changelog-conventionalcommits": "^5.0.0" }, @@ -1691,8 +1833,9 @@ }, "node_modules/@commitlint/config-validator": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.4.tgz", + "integrity": "sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==", "dev": true, - "license": "MIT", "dependencies": { "@commitlint/types": "^17.4.4", "ajv": "^8.11.0" @@ -1703,8 +1846,9 @@ }, "node_modules/@commitlint/ensure": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.4.tgz", + "integrity": "sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==", "dev": true, - "license": "MIT", "dependencies": { "@commitlint/types": "^17.4.4", "lodash.camelcase": "^4.3.0", @@ -1719,16 +1863,18 @@ }, "node_modules/@commitlint/execute-rule": { "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", + "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", "dev": true, - "license": "MIT", "engines": { "node": ">=v14" } }, "node_modules/@commitlint/format": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", + "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", "dev": true, - "license": "MIT", "dependencies": { "@commitlint/types": "^17.4.4", "chalk": "^4.1.0" @@ -1738,12 +1884,13 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "17.4.4", + "version": "17.6.3", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.6.3.tgz", + "integrity": "sha512-LQbNdnPbxrpbcrVKR5yf51SvquqktpyZJwqXx3lUMF6+nT9PHB8xn3wLy8pi2EQv5Zwba484JnUwDE1ygVYNQA==", "dev": true, - "license": "MIT", "dependencies": { "@commitlint/types": "^17.4.4", - "semver": "7.3.8" + "semver": "7.5.0" }, "engines": { "node": ">=v14" @@ -1751,8 +1898,9 @@ }, "node_modules/@commitlint/is-ignored/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -1761,9 +1909,10 @@ } }, "node_modules/@commitlint/is-ignored/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -1776,17 +1925,19 @@ }, "node_modules/@commitlint/is-ignored/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@commitlint/lint": { - "version": "17.4.4", + "version": "17.6.3", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.3.tgz", + "integrity": "sha512-fBlXwt6SHJFgm3Tz+luuo3DkydAx9HNC5y4eBqcKuDuMVqHd2ugMNr+bQtx6riv9mXFiPoKp7nE4Xn/ls3iVDA==", "dev": true, - "license": "MIT", "dependencies": { - "@commitlint/is-ignored": "^17.4.4", + "@commitlint/is-ignored": "^17.6.3", "@commitlint/parse": "^17.4.4", - "@commitlint/rules": "^17.4.4", + "@commitlint/rules": "^17.6.1", "@commitlint/types": "^17.4.4" }, "engines": { @@ -1794,9 +1945,10 @@ } }, "node_modules/@commitlint/load": { - "version": "17.4.4", + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.5.0.tgz", + "integrity": "sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==", "dev": true, - "license": "MIT", "dependencies": { "@commitlint/config-validator": "^17.4.4", "@commitlint/execute-rule": "^17.4.0", @@ -1811,7 +1963,7 @@ "lodash.uniq": "^4.5.0", "resolve-from": "^5.0.0", "ts-node": "^10.8.1", - "typescript": "^4.6.4" + "typescript": "^4.6.4 || ^5.0.0" }, "engines": { "node": ">=v14" @@ -1819,16 +1971,18 @@ }, "node_modules/@commitlint/message": { "version": "17.4.2", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", + "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=v14" } }, "node_modules/@commitlint/parse": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.4.4.tgz", + "integrity": "sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==", "dev": true, - "license": "MIT", "dependencies": { "@commitlint/types": "^17.4.4", "conventional-changelog-angular": "^5.0.11", @@ -1839,14 +1993,15 @@ } }, "node_modules/@commitlint/read": { - "version": "17.4.4", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", + "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", "dev": true, - "license": "MIT", "dependencies": { "@commitlint/top-level": "^17.4.0", "@commitlint/types": "^17.4.4", "fs-extra": "^11.0.0", - "git-raw-commits": "^2.0.0", + "git-raw-commits": "^2.0.11", "minimist": "^1.2.6" }, "engines": { @@ -1855,8 +2010,9 @@ }, "node_modules/@commitlint/resolve-extends": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz", + "integrity": "sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==", "dev": true, - "license": "MIT", "dependencies": { "@commitlint/config-validator": "^17.4.4", "@commitlint/types": "^17.4.4", @@ -1870,9 +2026,10 @@ } }, "node_modules/@commitlint/rules": { - "version": "17.4.4", + "version": "17.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.6.1.tgz", + "integrity": "sha512-lUdHw6lYQ1RywExXDdLOKxhpp6857/4c95Dc/1BikrHgdysVUXz26yV0vp1GL7Gv+avx9WqZWTIVB7pNouxlfw==", "dev": true, - "license": "MIT", "dependencies": { "@commitlint/ensure": "^17.4.4", "@commitlint/message": "^17.4.2", @@ -1886,16 +2043,18 @@ }, "node_modules/@commitlint/to-lines": { "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", + "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", "dev": true, - "license": "MIT", "engines": { "node": ">=v14" } }, "node_modules/@commitlint/top-level": { "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", + "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^5.0.0" }, @@ -1905,8 +2064,9 @@ }, "node_modules/@commitlint/types": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", + "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.1.0" }, @@ -1916,8 +2076,9 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -1927,8 +2088,9 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1936,28 +2098,47 @@ }, "node_modules/@dabh/diagnostics": { "version": "2.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "dependencies": { "colorspace": "1.1.x", "enabled": "2.0.x", "kuler": "^2.0.0" } }, - "node_modules/@dagrejs/graphlib": { - "version": "2.1.4", - "license": "MIT", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "dependencies": { - "lodash": "^4.11.1" + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1974,8 +2155,9 @@ }, "node_modules/@eslint/eslintrc/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1987,78 +2169,32 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", + "node_modules/@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@fast-csv/format": { - "version": "4.3.5", - "license": "MIT", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isboolean": "^3.0.3", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0" - } - }, - "node_modules/@fast-csv/format/node_modules/@types/node": { - "version": "14.18.37", - "license": "MIT" - }, - "node_modules/@fast-csv/parse": { - "version": "4.3.6", - "license": "MIT", - "dependencies": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fast-csv/parse/node_modules/@types/node": { - "version": "14.18.37", - "license": "MIT" - }, "node_modules/@gar/promisify": { "version": "1.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -2070,8 +2206,9 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -2082,26 +2219,30 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true }, "node_modules/@hutson/parse-repository-url": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=6.9.0" } }, "node_modules/@isaacs/string-locale-compare": { "version": "1.1.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -2115,16 +2256,18 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -2135,8 +2278,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -2147,8 +2291,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -2158,8 +2303,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -2172,8 +2318,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -2183,17 +2330,20 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "license": "MIT", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -2201,34 +2351,44 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "license": "MIT" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "license": "MIT", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, "node_modules/@lerna/add": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-6.4.1.tgz", + "integrity": "sha512-YSRnMcsdYnQtQQK0NSyrS9YGXvB3jzvx183o+JTH892MKzSlBqwpBHekCknSibyxga1HeZ0SNKQXgsHAwWkrRw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/bootstrap": "6.4.1", "@lerna/command": "6.4.1", @@ -2247,8 +2407,9 @@ }, "node_modules/@lerna/add/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2257,9 +2418,10 @@ } }, "node_modules/@lerna/add/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2272,13 +2434,15 @@ }, "node_modules/@lerna/add/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@lerna/bootstrap": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-6.4.1.tgz", + "integrity": "sha512-64cm0mnxzxhUUjH3T19ZSjPdn28vczRhhTXhNAvOhhU0sQgHrroam1xQC1395qbkV3iosSertlu8e7xbXW033w==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/command": "6.4.1", "@lerna/filter-options": "6.4.1", @@ -2309,8 +2473,9 @@ }, "node_modules/@lerna/bootstrap/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2319,9 +2484,10 @@ } }, "node_modules/@lerna/bootstrap/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2334,13 +2500,15 @@ }, "node_modules/@lerna/bootstrap/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@lerna/changed": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-6.4.1.tgz", + "integrity": "sha512-Z/z0sTm3l/iZW0eTSsnQpcY5d6eOpNO0g4wMOK+hIboWG0QOTc8b28XCnfCUO+33UisKl8PffultgoaHMKkGgw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/collect-updates": "6.4.1", "@lerna/command": "6.4.1", @@ -2353,8 +2521,9 @@ }, "node_modules/@lerna/check-working-tree": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-6.4.1.tgz", + "integrity": "sha512-EnlkA1wxaRLqhJdn9HX7h+JYxqiTK9aWEFOPqAE8lqjxHn3RpM9qBp1bAdL7CeUk3kN1lvxKwDEm0mfcIyMbPA==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/collect-uncommitted": "6.4.1", "@lerna/describe-ref": "6.4.1", @@ -2366,8 +2535,9 @@ }, "node_modules/@lerna/child-process": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-6.4.1.tgz", + "integrity": "sha512-dvEKK0yKmxOv8pccf3I5D/k+OGiLxQp5KYjsrDtkes2pjpCFfQAMbmpol/Tqx6w/2o2rSaRrLsnX8TENo66FsA==", "dev": true, - "license": "MIT", "dependencies": { "chalk": "^4.1.0", "execa": "^5.0.0", @@ -2379,8 +2549,9 @@ }, "node_modules/@lerna/clean": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-6.4.1.tgz", + "integrity": "sha512-FuVyW3mpos5ESCWSkQ1/ViXyEtsZ9k45U66cdM/HnteHQk/XskSQw0sz9R+whrZRUDu6YgYLSoj1j0YAHVK/3A==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/command": "6.4.1", "@lerna/filter-options": "6.4.1", @@ -2397,8 +2568,9 @@ }, "node_modules/@lerna/cli": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-6.4.1.tgz", + "integrity": "sha512-2pNa48i2wzFEd9LMPKWI3lkW/3widDqiB7oZUM1Xvm4eAOuDWc9I3RWmAUIVlPQNf3n4McxJCvsZZ9BpQN50Fg==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/global-options": "6.4.1", "dedent": "^0.7.0", @@ -2411,8 +2583,9 @@ }, "node_modules/@lerna/cli/node_modules/yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -2428,8 +2601,9 @@ }, "node_modules/@lerna/collect-uncommitted": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-6.4.1.tgz", + "integrity": "sha512-5IVQGhlLrt7Ujc5ooYA1Xlicdba/wMcDSnbQwr8ufeqnzV2z4729pLCVk55gmi6ZienH/YeBPHxhB5u34ofE0Q==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "chalk": "^4.1.0", @@ -2441,8 +2615,9 @@ }, "node_modules/@lerna/collect-updates": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-6.4.1.tgz", + "integrity": "sha512-pzw2/FC+nIqYkknUHK9SMmvP3MsLEjxI597p3WV86cEDN3eb1dyGIGuHiKShtjvT08SKSwpTX+3bCYvLVxtC5Q==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "@lerna/describe-ref": "6.4.1", @@ -2456,8 +2631,9 @@ }, "node_modules/@lerna/command": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-6.4.1.tgz", + "integrity": "sha512-3Lifj8UTNYbRad8JMP7IFEEdlIyclWyyvq/zvNnTS9kCOEymfmsB3lGXr07/AFoi6qDrvN64j7YSbPZ6C6qonw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "@lerna/package-graph": "6.4.1", @@ -2476,8 +2652,9 @@ }, "node_modules/@lerna/conventional-commits": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-6.4.1.tgz", + "integrity": "sha512-NIvCOjStjQy5O8VojB7/fVReNNDEJOmzRG2sTpgZ/vNS4AzojBQZ/tobzhm7rVkZZ43R9srZeuhfH9WgFsVUSA==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/validation-error": "6.4.1", "conventional-changelog-angular": "^5.0.12", @@ -2496,8 +2673,9 @@ }, "node_modules/@lerna/conventional-commits/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -2510,8 +2688,9 @@ }, "node_modules/@lerna/conventional-commits/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2520,9 +2699,10 @@ } }, "node_modules/@lerna/conventional-commits/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2535,13 +2715,15 @@ }, "node_modules/@lerna/conventional-commits/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@lerna/create": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-6.4.1.tgz", + "integrity": "sha512-qfQS8PjeGDDlxEvKsI/tYixIFzV2938qLvJohEKWFn64uvdLnXCamQ0wvRJST8p1ZpHWX4AXrB+xEJM3EFABrA==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "@lerna/command": "6.4.1", @@ -2566,8 +2748,9 @@ }, "node_modules/@lerna/create-symlink": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-6.4.1.tgz", + "integrity": "sha512-rNivHFYV1GAULxnaTqeGb2AdEN2OZzAiZcx5CFgj45DWXQEGwPEfpFmCSJdXhFZbyd3K0uiDlAXjAmV56ov3FQ==", "dev": true, - "license": "MIT", "dependencies": { "cmd-shim": "^5.0.0", "fs-extra": "^9.1.0", @@ -2579,8 +2762,9 @@ }, "node_modules/@lerna/create-symlink/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -2593,8 +2777,9 @@ }, "node_modules/@lerna/create/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -2607,8 +2792,9 @@ }, "node_modules/@lerna/create/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2617,9 +2803,10 @@ } }, "node_modules/@lerna/create/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2632,13 +2819,15 @@ }, "node_modules/@lerna/create/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@lerna/describe-ref": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-6.4.1.tgz", + "integrity": "sha512-MXGXU8r27wl355kb1lQtAiu6gkxJ5tAisVJvFxFM1M+X8Sq56icNoaROqYrvW6y97A9+3S8Q48pD3SzkFv31Xw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "npmlog": "^6.0.2" @@ -2649,8 +2838,9 @@ }, "node_modules/@lerna/diff": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-6.4.1.tgz", + "integrity": "sha512-TnzJsRPN2fOjUrmo5Boi43fJmRtBJDsVgwZM51VnLoKcDtO1kcScXJ16Od2Xx5bXbp5dES5vGDLL/USVVWfeAg==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "@lerna/command": "6.4.1", @@ -2663,8 +2853,9 @@ }, "node_modules/@lerna/exec": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-6.4.1.tgz", + "integrity": "sha512-KAWfuZpoyd3FMejHUORd0GORMr45/d9OGAwHitfQPVs4brsxgQFjbbBEEGIdwsg08XhkDb4nl6IYVASVTq9+gA==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "@lerna/command": "6.4.1", @@ -2680,8 +2871,9 @@ }, "node_modules/@lerna/filter-options": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-6.4.1.tgz", + "integrity": "sha512-efJh3lP2T+9oyNIP2QNd9EErf0Sm3l3Tz8CILMsNJpjSU6kO43TYWQ+L/ezu2zM99KVYz8GROLqDcHRwdr8qUA==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/collect-updates": "6.4.1", "@lerna/filter-packages": "6.4.1", @@ -2694,8 +2886,9 @@ }, "node_modules/@lerna/filter-packages": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-6.4.1.tgz", + "integrity": "sha512-LCMGDGy4b+Mrb6xkcVzp4novbf5MoZEE6ZQF1gqG0wBWqJzNcKeFiOmf352rcDnfjPGZP6ct5+xXWosX/q6qwg==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/validation-error": "6.4.1", "multimatch": "^5.0.0", @@ -2707,8 +2900,9 @@ }, "node_modules/@lerna/get-npm-exec-opts": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-6.4.1.tgz", + "integrity": "sha512-IvN/jyoklrWcjssOf121tZhOc16MaFPOu5ii8a+Oy0jfTriIGv929Ya8MWodj75qec9s+JHoShB8yEcMqZce4g==", "dev": true, - "license": "MIT", "dependencies": { "npmlog": "^6.0.2" }, @@ -2718,8 +2912,9 @@ }, "node_modules/@lerna/get-packed": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-6.4.1.tgz", + "integrity": "sha512-uaDtYwK1OEUVIXn84m45uPlXShtiUcw6V9TgB3rvHa3rrRVbR7D4r+JXcwVxLGrAS7LwxVbYWEEO/Z/bX7J/Lg==", "dev": true, - "license": "MIT", "dependencies": { "fs-extra": "^9.1.0", "ssri": "^9.0.1", @@ -2731,8 +2926,9 @@ }, "node_modules/@lerna/get-packed/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -2745,8 +2941,9 @@ }, "node_modules/@lerna/github-client": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-6.4.1.tgz", + "integrity": "sha512-ridDMuzmjMNlcDmrGrV9mxqwUKzt9iYqCPwVYJlRYrnE3jxyg+RdooquqskVFj11djcY6xCV2Q2V1lUYwF+PmA==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "@octokit/plugin-enterprise-rest": "^6.0.1", @@ -2760,8 +2957,9 @@ }, "node_modules/@lerna/gitlab-client": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-6.4.1.tgz", + "integrity": "sha512-AdLG4d+jbUvv0jQyygQUTNaTCNSMDxioJso6aAjQ/vkwyy3fBJ6FYzX74J4adSfOxC2MQZITFyuG+c9ggp7pyQ==", "dev": true, - "license": "MIT", "dependencies": { "node-fetch": "^2.6.1", "npmlog": "^6.0.2" @@ -2772,16 +2970,18 @@ }, "node_modules/@lerna/global-options": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-6.4.1.tgz", + "integrity": "sha512-UTXkt+bleBB8xPzxBPjaCN/v63yQdfssVjhgdbkQ//4kayaRA65LyEtJTi9rUrsLlIy9/rbeb+SAZUHg129fJg==", "dev": true, - "license": "MIT", "engines": { "node": "^14.15.0 || >=16.0.0" } }, "node_modules/@lerna/has-npm-version": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-6.4.1.tgz", + "integrity": "sha512-vW191w5iCkwNWWWcy4542ZOpjKYjcP/pU3o3+w6NM1J3yBjWZcNa8lfzQQgde2QkGyNi+i70o6wIca1o0sdKwg==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "semver": "^7.3.4" @@ -2792,8 +2992,9 @@ }, "node_modules/@lerna/has-npm-version/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -2802,9 +3003,10 @@ } }, "node_modules/@lerna/has-npm-version/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -2817,13 +3019,15 @@ }, "node_modules/@lerna/has-npm-version/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@lerna/import": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/import/-/import-6.4.1.tgz", + "integrity": "sha512-oDg8g1PNrCM1JESLsG3rQBtPC+/K9e4ohs0xDKt5E6p4l7dc0Ib4oo0oCCT/hGzZUlNwHxrc2q9JMRzSAn6P/Q==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "@lerna/command": "6.4.1", @@ -2840,8 +3044,9 @@ }, "node_modules/@lerna/import/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -2854,8 +3059,9 @@ }, "node_modules/@lerna/info": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/info/-/info-6.4.1.tgz", + "integrity": "sha512-Ks4R7IndIr4vQXz+702gumPVhH6JVkshje0WKA3+ew2qzYZf68lU1sBe1OZsQJU3eeY2c60ax+bItSa7aaIHGw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/command": "6.4.1", "@lerna/output": "6.4.1", @@ -2867,8 +3073,9 @@ }, "node_modules/@lerna/init": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/init/-/init-6.4.1.tgz", + "integrity": "sha512-CXd/s/xgj0ZTAoOVyolOTLW2BG7uQOhWW4P/ktlwwJr9s3c4H/z+Gj36UXw3q5X1xdR29NZt7Vc6fvROBZMjUQ==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "@lerna/command": "6.4.1", @@ -2883,8 +3090,9 @@ }, "node_modules/@lerna/init/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -2897,8 +3105,9 @@ }, "node_modules/@lerna/link": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/link/-/link-6.4.1.tgz", + "integrity": "sha512-O8Rt7MAZT/WT2AwrB/+HY76ktnXA9cDFO9rhyKWZGTHdplbzuJgfsGzu8Xv0Ind+w+a8xLfqtWGPlwiETnDyrw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/command": "6.4.1", "@lerna/package-graph": "6.4.1", @@ -2913,8 +3122,9 @@ }, "node_modules/@lerna/list": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/list/-/list-6.4.1.tgz", + "integrity": "sha512-7a6AKgXgC4X7nK6twVPNrKCiDhrCiAhL/FE4u9HYhHqw9yFwyq8Qe/r1RVOkAOASNZzZ8GuBvob042bpunupCw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/command": "6.4.1", "@lerna/filter-options": "6.4.1", @@ -2927,8 +3137,9 @@ }, "node_modules/@lerna/listable": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-6.4.1.tgz", + "integrity": "sha512-L8ANeidM10aoF8aL3L/771Bb9r/TRkbEPzAiC8Iy2IBTYftS87E3rT/4k5KBEGYzMieSKJaskSFBV0OQGYV1Cw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/query-graph": "6.4.1", "chalk": "^4.1.0", @@ -2940,8 +3151,9 @@ }, "node_modules/@lerna/log-packed": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-6.4.1.tgz", + "integrity": "sha512-Pwv7LnIgWqZH4vkM1rWTVF+pmWJu7d0ZhVwyhCaBJUsYbo+SyB2ZETGygo3Z/A+vZ/S7ImhEEKfIxU9bg5lScQ==", "dev": true, - "license": "MIT", "dependencies": { "byte-size": "^7.0.0", "columnify": "^1.6.0", @@ -2954,8 +3166,9 @@ }, "node_modules/@lerna/npm-conf": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-6.4.1.tgz", + "integrity": "sha512-Q+83uySGXYk3n1pYhvxtzyGwBGijYgYecgpiwRG1YNyaeGy+Mkrj19cyTWubT+rU/kM5c6If28+y9kdudvc7zQ==", "dev": true, - "license": "MIT", "dependencies": { "config-chain": "^1.1.12", "pify": "^5.0.0" @@ -2966,8 +3179,9 @@ }, "node_modules/@lerna/npm-dist-tag": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-6.4.1.tgz", + "integrity": "sha512-If1Hn4q9fn0JWuBm455iIZDWE6Fsn4Nv8Tpqb+dYf0CtoT5Hn+iT64xSiU5XJw9Vc23IR7dIujkEXm2MVbnvZw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/otplease": "6.4.1", "npm-package-arg": "8.1.1", @@ -2980,8 +3194,9 @@ }, "node_modules/@lerna/npm-install": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-6.4.1.tgz", + "integrity": "sha512-7gI1txMA9qTaT3iiuk/8/vL78wIhtbbOLhMf8m5yQ2G+3t47RUA8MNgUMsq4Zszw9C83drayqesyTf0u8BzVRg==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "@lerna/get-npm-exec-opts": "6.4.1", @@ -2997,8 +3212,9 @@ }, "node_modules/@lerna/npm-install/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3011,8 +3227,9 @@ }, "node_modules/@lerna/npm-publish": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-6.4.1.tgz", + "integrity": "sha512-lbNEg+pThPAD8lIgNArm63agtIuCBCF3umxvgTQeLzyqUX6EtGaKJFyz/6c2ANcAuf8UfU7WQxFFbOiolibXTQ==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/otplease": "6.4.1", "@lerna/run-lifecycle": "6.4.1", @@ -3029,8 +3246,9 @@ }, "node_modules/@lerna/npm-publish/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3043,8 +3261,9 @@ }, "node_modules/@lerna/npm-run-script": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-6.4.1.tgz", + "integrity": "sha512-HyvwuyhrGqDa1UbI+pPbI6v+wT6I34R0PW3WCADn6l59+AyqLOCUQQr+dMW7jdYNwjO6c/Ttbvj4W58EWsaGtQ==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "@lerna/get-npm-exec-opts": "6.4.1", @@ -3056,8 +3275,9 @@ }, "node_modules/@lerna/otplease": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-6.4.1.tgz", + "integrity": "sha512-ePUciFfFdythHNMp8FP5K15R/CoGzSLVniJdD50qm76c4ATXZHnGCW2PGwoeAZCy4QTzhlhdBq78uN0wAs75GA==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/prompt": "6.4.1" }, @@ -3067,8 +3287,9 @@ }, "node_modules/@lerna/output": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/output/-/output-6.4.1.tgz", + "integrity": "sha512-A1yRLF0bO+lhbIkrryRd6hGSD0wnyS1rTPOWJhScO/Zyv8vIPWhd2fZCLR1gI2d/Kt05qmK3T/zETTwloK7Fww==", "dev": true, - "license": "MIT", "dependencies": { "npmlog": "^6.0.2" }, @@ -3078,8 +3299,9 @@ }, "node_modules/@lerna/pack-directory": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-6.4.1.tgz", + "integrity": "sha512-kBtDL9bPP72/Nl7Gqa2CA3Odb8CYY1EF2jt801f+B37TqRLf57UXQom7yF3PbWPCPmhoU+8Fc4RMpUwSbFC46Q==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/get-packed": "6.4.1", "@lerna/package": "6.4.1", @@ -3095,8 +3317,9 @@ }, "node_modules/@lerna/package": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/package/-/package-6.4.1.tgz", + "integrity": "sha512-TrOah58RnwS9R8d3+WgFFTu5lqgZs7M+e1dvcRga7oSJeKscqpEK57G0xspvF3ycjfXQwRMmEtwPmpkeEVLMzA==", "dev": true, - "license": "MIT", "dependencies": { "load-json-file": "^6.2.0", "npm-package-arg": "8.1.1", @@ -3108,8 +3331,9 @@ }, "node_modules/@lerna/package-graph": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-6.4.1.tgz", + "integrity": "sha512-fQvc59stRYOqxT3Mn7g/yI9/Kw5XetJoKcW5l8XeqKqcTNDURqKnN0qaNBY6lTTLOe4cR7gfXF2l1u3HOz0qEg==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/prerelease-id-from-version": "6.4.1", "@lerna/validation-error": "6.4.1", @@ -3123,8 +3347,9 @@ }, "node_modules/@lerna/package-graph/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3133,9 +3358,10 @@ } }, "node_modules/@lerna/package-graph/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3148,13 +3374,15 @@ }, "node_modules/@lerna/package-graph/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@lerna/prerelease-id-from-version": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-6.4.1.tgz", + "integrity": "sha512-uGicdMFrmfHXeC0FTosnUKRgUjrBJdZwrmw7ZWMb5DAJGOuTzrvJIcz5f0/eL3XqypC/7g+9DoTgKjX3hlxPZA==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.3.4" }, @@ -3164,8 +3392,9 @@ }, "node_modules/@lerna/prerelease-id-from-version/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3174,9 +3403,10 @@ } }, "node_modules/@lerna/prerelease-id-from-version/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3189,13 +3419,15 @@ }, "node_modules/@lerna/prerelease-id-from-version/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@lerna/profiler": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-6.4.1.tgz", + "integrity": "sha512-dq2uQxcu0aq6eSoN+JwnvHoAnjtZAVngMvywz5bTAfzz/sSvIad1v8RCpJUMBQHxaPtbfiNvOIQgDZOmCBIM4g==", "dev": true, - "license": "MIT", "dependencies": { "fs-extra": "^9.1.0", "npmlog": "^6.0.2", @@ -3207,8 +3439,9 @@ }, "node_modules/@lerna/profiler/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3221,8 +3454,9 @@ }, "node_modules/@lerna/project": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/project/-/project-6.4.1.tgz", + "integrity": "sha512-BPFYr4A0mNZ2jZymlcwwh7PfIC+I6r52xgGtJ4KIrIOB6mVKo9u30dgYJbUQxmSuMRTOnX7PJZttQQzSda4gEg==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/package": "6.4.1", "@lerna/validation-error": "6.4.1", @@ -3244,8 +3478,9 @@ }, "node_modules/@lerna/project/node_modules/cosmiconfig": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, - "license": "MIT", "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -3259,8 +3494,9 @@ }, "node_modules/@lerna/project/node_modules/dot-prop": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dev": true, - "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -3273,8 +3509,9 @@ }, "node_modules/@lerna/project/node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3284,16 +3521,18 @@ }, "node_modules/@lerna/project/node_modules/yaml": { "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true, - "license": "ISC", "engines": { "node": ">= 6" } }, "node_modules/@lerna/prompt": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-6.4.1.tgz", + "integrity": "sha512-vMxCIgF9Vpe80PnargBGAdS/Ib58iYEcfkcXwo7mYBCxEVcaUJFKZ72FEW8rw+H5LkxBlzrBJyfKRoOe0ks9gQ==", "dev": true, - "license": "MIT", "dependencies": { "inquirer": "^8.2.4", "npmlog": "^6.0.2" @@ -3304,8 +3543,9 @@ }, "node_modules/@lerna/publish": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-6.4.1.tgz", + "integrity": "sha512-/D/AECpw2VNMa1Nh4g29ddYKRIqygEV1ftV8PYXVlHpqWN7VaKrcbRU6pn0ldgpFlMyPtESfv1zS32F5CQ944w==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/check-working-tree": "6.4.1", "@lerna/child-process": "6.4.1", @@ -3342,8 +3582,9 @@ }, "node_modules/@lerna/publish/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3356,8 +3597,9 @@ }, "node_modules/@lerna/publish/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3366,9 +3608,10 @@ } }, "node_modules/@lerna/publish/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3381,13 +3624,15 @@ }, "node_modules/@lerna/publish/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@lerna/pulse-till-done": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-6.4.1.tgz", + "integrity": "sha512-efAkOC1UuiyqYBfrmhDBL6ufYtnpSqAG+lT4d/yk3CzJEJKkoCwh2Hb692kqHHQ5F74Uusc8tcRB7GBcfNZRWA==", "dev": true, - "license": "MIT", "dependencies": { "npmlog": "^6.0.2" }, @@ -3397,8 +3642,9 @@ }, "node_modules/@lerna/query-graph": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-6.4.1.tgz", + "integrity": "sha512-gBGZLgu2x6L4d4ZYDn4+d5rxT9RNBC+biOxi0QrbaIq83I+JpHVmFSmExXK3rcTritrQ3JT9NCqb+Yu9tL9adQ==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/package-graph": "6.4.1" }, @@ -3408,8 +3654,9 @@ }, "node_modules/@lerna/resolve-symlink": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-6.4.1.tgz", + "integrity": "sha512-gnqltcwhWVLUxCuwXWe/ch9WWTxXRI7F0ZvCtIgdfOpbosm3f1g27VO1LjXeJN2i6ks03qqMowqy4xB4uMR9IA==", "dev": true, - "license": "MIT", "dependencies": { "fs-extra": "^9.1.0", "npmlog": "^6.0.2", @@ -3421,8 +3668,9 @@ }, "node_modules/@lerna/resolve-symlink/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3435,8 +3683,9 @@ }, "node_modules/@lerna/rimraf-dir": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-6.4.1.tgz", + "integrity": "sha512-5sDOmZmVj0iXIiEgdhCm0Prjg5q2SQQKtMd7ImimPtWKkV0IyJWxrepJFbeQoFj5xBQF7QB5jlVNEfQfKhD6pQ==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/child-process": "6.4.1", "npmlog": "^6.0.2", @@ -3449,8 +3698,9 @@ }, "node_modules/@lerna/run": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/run/-/run-6.4.1.tgz", + "integrity": "sha512-HRw7kS6KNqTxqntFiFXPEeBEct08NjnL6xKbbOV6pXXf+lXUQbJlF8S7t6UYqeWgTZ4iU9caIxtZIY+EpW93mQ==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/command": "6.4.1", "@lerna/filter-options": "6.4.1", @@ -3470,8 +3720,9 @@ }, "node_modules/@lerna/run-lifecycle": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-6.4.1.tgz", + "integrity": "sha512-42VopI8NC8uVCZ3YPwbTycGVBSgukJltW5Saein0m7TIqFjwSfrcP0n7QJOr+WAu9uQkk+2kBstF5WmvKiqgEA==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/npm-conf": "6.4.1", "@npmcli/run-script": "^4.1.7", @@ -3484,8 +3735,9 @@ }, "node_modules/@lerna/run-topologically": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-6.4.1.tgz", + "integrity": "sha512-gXlnAsYrjs6KIUGDnHM8M8nt30Amxq3r0lSCNAt+vEu2sMMEOh9lffGGaJobJZ4bdwoXnKay3uER/TU8E9owMw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/query-graph": "6.4.1", "p-queue": "^6.6.2" @@ -3496,8 +3748,9 @@ }, "node_modules/@lerna/run/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3510,8 +3763,9 @@ }, "node_modules/@lerna/symlink-binary": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-6.4.1.tgz", + "integrity": "sha512-poZX90VmXRjL/JTvxaUQPeMDxFUIQvhBkHnH+dwW0RjsHB/2Tu4QUAsE0OlFnlWQGsAtXF4FTtW8Xs57E/19Kw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/create-symlink": "6.4.1", "@lerna/package": "6.4.1", @@ -3524,8 +3778,9 @@ }, "node_modules/@lerna/symlink-binary/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3538,8 +3793,9 @@ }, "node_modules/@lerna/symlink-dependencies": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-6.4.1.tgz", + "integrity": "sha512-43W2uLlpn3TTYuHVeO/2A6uiTZg6TOk/OSKi21ujD7IfVIYcRYCwCV+8LPP12R3rzyab0JWkWnhp80Z8A2Uykw==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/create-symlink": "6.4.1", "@lerna/resolve-symlink": "6.4.1", @@ -3554,8 +3810,9 @@ }, "node_modules/@lerna/symlink-dependencies/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3568,8 +3825,9 @@ }, "node_modules/@lerna/temp-write": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/temp-write/-/temp-write-6.4.1.tgz", + "integrity": "sha512-7uiGFVoTyos5xXbVQg4bG18qVEn9dFmboXCcHbMj5mc/+/QmU9QeNz/Cq36O5TY6gBbLnyj3lfL5PhzERWKMFg==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.15", "is-stream": "^2.0.0", @@ -3580,8 +3838,9 @@ }, "node_modules/@lerna/temp-write/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -3594,16 +3853,18 @@ }, "node_modules/@lerna/timer": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-6.4.1.tgz", + "integrity": "sha512-ogmjFTWwRvevZr76a2sAbhmu3Ut2x73nDIn0bcwZwZ3Qc3pHD8eITdjs/wIKkHse3J7l3TO5BFJPnrvDS7HLnw==", "dev": true, - "license": "MIT", "engines": { "node": "^14.15.0 || >=16.0.0" } }, "node_modules/@lerna/validation-error": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-6.4.1.tgz", + "integrity": "sha512-fxfJvl3VgFd7eBfVMRX6Yal9omDLs2mcGKkNYeCEyt4Uwlz1B5tPAXyk/sNMfkKV2Aat/mlK5tnY13vUrMKkyA==", "dev": true, - "license": "MIT", "dependencies": { "npmlog": "^6.0.2" }, @@ -3613,8 +3874,9 @@ }, "node_modules/@lerna/version": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/version/-/version-6.4.1.tgz", + "integrity": "sha512-1/krPq0PtEqDXtaaZsVuKev9pXJCkNC1vOo2qCcn6PBkODw/QTAvGcUi0I+BM2c//pdxge9/gfmbDo1lC8RtAQ==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/check-working-tree": "6.4.1", "@lerna/child-process": "6.4.1", @@ -3650,8 +3912,9 @@ }, "node_modules/@lerna/version/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3660,9 +3923,10 @@ } }, "node_modules/@lerna/version/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3675,13 +3939,15 @@ }, "node_modules/@lerna/version/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@lerna/write-log-file": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-6.4.1.tgz", + "integrity": "sha512-LE4fueQSDrQo76F4/gFXL0wnGhqdG7WHVH8D8TrKouF2Afl4NHltObCm4WsSMPjcfciVnZQFfx1ruxU4r/enHQ==", "dev": true, - "license": "MIT", "dependencies": { "npmlog": "^6.0.2", "write-file-atomic": "^4.0.1" @@ -3692,7 +3958,9 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3703,14 +3971,18 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3721,8 +3993,9 @@ }, "node_modules/@npmcli/arborist": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-5.3.0.tgz", + "integrity": "sha512-+rZ9zgL1lnbl8Xbb1NQdMjveOMwj4lIYfcDtyJHHi5x4X8jtR6m8SXooJMZy5vmFVZ8w7A2Bnd/oX9eTuU8w5A==", "dev": true, - "license": "ISC", "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/installed-package-contents": "^1.0.7", @@ -3768,8 +4041,9 @@ }, "node_modules/@npmcli/arborist/node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -3779,16 +4053,18 @@ }, "node_modules/@npmcli/arborist/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/@npmcli/arborist/node_modules/npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^5.0.0", "proc-log": "^2.0.1", @@ -3800,9 +4076,10 @@ } }, "node_modules/@npmcli/arborist/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3815,8 +4092,9 @@ }, "node_modules/@npmcli/arborist/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3826,13 +4104,15 @@ }, "node_modules/@npmcli/arborist/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@npmcli/fs": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, - "license": "ISC", "dependencies": { "@gar/promisify": "^1.1.3", "semver": "^7.3.5" @@ -3843,8 +4123,9 @@ }, "node_modules/@npmcli/fs/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3853,9 +4134,10 @@ } }, "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3868,13 +4150,15 @@ }, "node_modules/@npmcli/fs/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@npmcli/git": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", + "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", "dev": true, - "license": "ISC", "dependencies": { "@npmcli/promise-spawn": "^3.0.0", "lru-cache": "^7.4.4", @@ -3892,16 +4176,18 @@ }, "node_modules/@npmcli/git/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/@npmcli/git/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3914,8 +4200,9 @@ }, "node_modules/@npmcli/git/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -3925,13 +4212,15 @@ }, "node_modules/@npmcli/git/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@npmcli/installed-package-contents": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", "dev": true, - "license": "ISC", "dependencies": { "npm-bundled": "^1.1.1", "npm-normalize-package-bin": "^1.0.1" @@ -3945,8 +4234,9 @@ }, "node_modules/@npmcli/map-workspaces": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-2.0.4.tgz", + "integrity": "sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==", "dev": true, - "license": "ISC", "dependencies": { "@npmcli/name-from-folder": "^1.0.1", "glob": "^8.0.1", @@ -3959,16 +4249,18 @@ }, "node_modules/@npmcli/map-workspaces/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -3978,8 +4270,9 @@ }, "node_modules/@npmcli/metavuln-calculator": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.1.tgz", + "integrity": "sha512-n69ygIaqAedecLeVH3KnO39M6ZHiJ2dEv5A7DGvcqCB8q17BGUgW8QaanIkbWUo2aYGZqJaOORTLAlIvKjNDKA==", "dev": true, - "license": "ISC", "dependencies": { "cacache": "^16.0.0", "json-parse-even-better-errors": "^2.3.1", @@ -3992,8 +4285,9 @@ }, "node_modules/@npmcli/metavuln-calculator/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -4002,9 +4296,10 @@ } }, "node_modules/@npmcli/metavuln-calculator/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4017,13 +4312,16 @@ }, "node_modules/@npmcli/metavuln-calculator/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@npmcli/move-file": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, - "license": "MIT", "dependencies": { "mkdirp": "^1.0.4", "rimraf": "^3.0.2" @@ -4034,21 +4332,24 @@ }, "node_modules/@npmcli/name-from-folder": { "version": "1.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", + "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", + "dev": true }, "node_modules/@npmcli/node-gyp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", "dev": true, - "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/@npmcli/package-json": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-2.0.0.tgz", + "integrity": "sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA==", "dev": true, - "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^2.3.1" }, @@ -4058,8 +4359,9 @@ }, "node_modules/@npmcli/promise-spawn": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", "dev": true, - "license": "ISC", "dependencies": { "infer-owner": "^1.0.4" }, @@ -4069,8 +4371,9 @@ }, "node_modules/@npmcli/run-script": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", + "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", "dev": true, - "license": "ISC", "dependencies": { "@npmcli/node-gyp": "^2.0.0", "@npmcli/promise-spawn": "^3.0.0", @@ -4084,18 +4387,19 @@ }, "node_modules/@nrwl/cli": { "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.7.1.tgz", + "integrity": "sha512-33RcH5Af2BidQvnTGlDTrUWJ6Eul5aA0LeqYmEavYb+I0kzYMqdBzBCLgQT/13gAdoQauTWUO4g3eFhoHnCNrg==", "dev": true, - "license": "MIT", "dependencies": { "nx": "15.7.1" } }, "node_modules/@nrwl/devkit": { - "version": "15.8.5", + "version": "15.9.4", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.9.4.tgz", + "integrity": "sha512-mUX1kXTuPMdTzFxIzH+MsSNvdppOmstPDOEtiGFZJTuJ625ki0HhNJILO3N2mJ7MeMrLqIlAiNdvelQaObxYsQ==", "dev": true, - "license": "MIT", "dependencies": { - "@phenomnomnominal/tsquery": "4.1.1", "ejs": "^3.1.7", "ignore": "^5.0.4", "semver": "7.3.4", @@ -4108,8 +4412,9 @@ }, "node_modules/@nrwl/devkit/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -4119,8 +4424,9 @@ }, "node_modules/@nrwl/devkit/node_modules/semver": { "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4133,11 +4439,14 @@ }, "node_modules/@nrwl/devkit/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@nrwl/nx-darwin-arm64": { "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.7.1.tgz", + "integrity": "sha512-YaNq1kP0xoaG2SDTjAzc0ZXAzRHE4obnEtVbisMzGRJkMld7SiOzYZAoaLJI6mZJuc7cIzUlA+wFkE2e21q5tQ==", "cpu": [ "arm64" ], @@ -4150,21 +4459,151 @@ "node": ">= 10" } }, - "node_modules/@nrwl/tao": { + "node_modules/@nrwl/nx-darwin-x64": { "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.7.1.tgz", + "integrity": "sha512-G/0joeAQfZm4FuqaDyOAam912EfVS6mlG1gFrzp3P/kzzE+gxt/I+iQHNmEOl8Dnp4ercTgW6epUEQ03teRLOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/nx-linux-arm-gnueabihf": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-15.7.1.tgz", + "integrity": "sha512-WeZndiNyAPolRc08C4LLY7y+b3g9wAsJVVTWugW9PyaTMD19KY6oFkNG5gg1W0InoGISazW5fUissE+911kgog==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/nx-linux-arm64-gnu": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-15.7.1.tgz", + "integrity": "sha512-efDPQl2Z1YLnUlEKyu7lsvRnFIRXmvnbkH2nRv3HNHVufnHjjQ41UBw2Gqz4WUrEpmBz2Xq31cYUZluUP7/o6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/nx-linux-arm64-musl": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm64-musl/-/nx-linux-arm64-musl-15.7.1.tgz", + "integrity": "sha512-Esv+ko6vMrI0HLnIXs76up7zUCaDfjArgn2TfMxvPjDEp4qmExiI8gmSh5JM1kC0MkHb4HghCnsSQ86Gg1BRiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/nx-linux-x64-gnu": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-x64-gnu/-/nx-linux-x64-gnu-15.7.1.tgz", + "integrity": "sha512-9ZkeCHhk+a3ok8CBEcbIheWrlp+gY1KdhmHOksJuDsHTcRMirbZ9HWm+/UIYB2FVaEENCBgcA4akwXRDaxrmYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/nx-linux-x64-musl": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-x64-musl/-/nx-linux-x64-musl-15.7.1.tgz", + "integrity": "sha512-FOs8FhcACKfYjL5l/mIHUESs25KPsZsp3TWrpCYgQNkrvNV9lWbrQ+h9acWf23hR2FYVk7xKVo4wFYsUqF+DbA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/nx-win32-arm64-msvc": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-15.7.1.tgz", + "integrity": "sha512-JEhy0ac+ivhIdAPWqEfAN9EqFznKA5vt4oVjIqjDysqgzN9GBKOeo7gphdii9WyqrIKEbOs1L++ADWXw1gev6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/nx-win32-x64-msvc": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-win32-x64-msvc/-/nx-win32-x64-msvc-15.7.1.tgz", + "integrity": "sha512-GLh5TXKViRb55jBviZSZweavilUr2frmb/8iv3Fz7MPS6VvA+axIqNhuVcTJP1H3C/1yt3Nx5wwsXdWgg3mZpw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nrwl/tao": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.7.1.tgz", + "integrity": "sha512-pCKIijUGUAht+Lfy9P4WaHxTHnqqr+vaC00vX6XSlkRoFAUFYh7lhbOHDSKOwBG016ZoG73P1IIMg0um4ybd5w==", + "dev": true, + "dependencies": { + "nx": "15.7.1" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@octokit/auth-token": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", + "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", "dev": true, - "license": "MIT", - "dependencies": { - "nx": "15.7.1" - }, - "bin": { - "tao": "index.js" - } - }, - "node_modules/@octokit/auth-token": { - "version": "3.0.3", - "dev": true, - "license": "MIT", "dependencies": { "@octokit/types": "^9.0.0" }, @@ -4173,9 +4612,10 @@ } }, "node_modules/@octokit/core": { - "version": "4.2.0", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz", + "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==", "dev": true, - "license": "MIT", "dependencies": { "@octokit/auth-token": "^3.0.0", "@octokit/graphql": "^5.0.0", @@ -4191,8 +4631,9 @@ }, "node_modules/@octokit/endpoint": { "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", + "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", "dev": true, - "license": "MIT", "dependencies": { "@octokit/types": "^9.0.0", "is-plain-object": "^5.0.0", @@ -4204,16 +4645,18 @@ }, "node_modules/@octokit/endpoint/node_modules/is-plain-object": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@octokit/graphql": { - "version": "5.0.5", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", "dev": true, - "license": "MIT", "dependencies": { "@octokit/request": "^6.0.0", "@octokit/types": "^9.0.0", @@ -4224,21 +4667,25 @@ } }, "node_modules/@octokit/openapi-types": { - "version": "16.0.0", - "dev": true, - "license": "MIT" + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", + "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==", + "dev": true }, "node_modules/@octokit/plugin-enterprise-rest": { "version": "6.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", + "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", + "dev": true }, "node_modules/@octokit/plugin-paginate-rest": { - "version": "6.0.0", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0" + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" }, "engines": { "node": ">= 14" @@ -4249,18 +4696,20 @@ }, "node_modules/@octokit/plugin-request-log": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", "dev": true, - "license": "MIT", "peerDependencies": { "@octokit/core": ">=3" } }, "node_modules/@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.2.tgz", + "integrity": "sha512-R0oJ7j6f/AdqPLtB9qRXLO+wjI9pctUn8Ka8UGfGaFCcCv3Otx14CshQ89K4E88pmyYZS8p0rNTiprML/81jig==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^9.2.3", "deprecation": "^2.3.1" }, "engines": { @@ -4271,9 +4720,10 @@ } }, "node_modules/@octokit/request": { - "version": "6.2.3", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", + "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", "dev": true, - "license": "MIT", "dependencies": { "@octokit/endpoint": "^7.0.0", "@octokit/request-error": "^3.0.0", @@ -4288,8 +4738,9 @@ }, "node_modules/@octokit/request-error": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", "dev": true, - "license": "MIT", "dependencies": { "@octokit/types": "^9.0.0", "deprecation": "^2.0.0", @@ -4301,39 +4752,49 @@ }, "node_modules/@octokit/request/node_modules/is-plain-object": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@octokit/rest": { - "version": "19.0.7", + "version": "19.0.11", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", + "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" }, "engines": { "node": ">= 14" } }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, "node_modules/@octokit/types": { - "version": "9.0.0", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", + "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^16.0.0" + "@octokit/openapi-types": "^17.2.0" } }, "node_modules/@parcel/watcher": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", "dev": true, "hasInstallScript": true, - "license": "MIT", "dependencies": { "node-addon-api": "^3.2.1", "node-gyp-build": "^4.3.0" @@ -4346,37 +4807,79 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@phenomnomnominal/tsquery": { - "version": "4.1.1", + "node_modules/@pkgr/utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==", "dev": true, - "license": "MIT", "dependencies": { - "esquery": "^1.0.1" + "cross-spawn": "^7.0.3", + "fast-glob": "^3.2.12", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.5.0" }, - "peerDependencies": { - "typescript": "^3 || ^4" + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pkgr/utils/node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@sinonjs/commons": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0" } }, "node_modules/@sinonjs/samsam": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", @@ -4385,125 +4888,197 @@ }, "node_modules/@sinonjs/text-encoding": { "version": "0.7.2", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@syntest/analysis": { + "version": "0.1.0-beta.4", + "resolved": "https://registry.npmjs.org/@syntest/analysis/-/analysis-0.1.0-beta.4.tgz", + "integrity": "sha512-RSajGGvsVA1ILrvDBJe95RtGMfe9fFWhCqjrBmh1rjZuLqLyy7rDDLeaM1rcMrhmASyhmZyt1VpcwPkXzlERXw==", + "dependencies": { + "@syntest/cfg": "^0.3.0-beta.15", + "@syntest/logging": "^0.1.0-beta.6", + "lodash.clonedeep": "^4.5.0" + }, + "engines": { + "node": ">=16" + } }, - "node_modules/@syntest/ast-javascript": { - "resolved": "libraries/ast-javascript", + "node_modules/@syntest/analysis-javascript": { + "resolved": "libraries/analysis-javascript", "link": true }, - "node_modules/@syntest/cfg-core": { - "version": "0.2.1-beta.3", - "license": "Apache-2.0", + "node_modules/@syntest/ast-visitor-javascript": { + "resolved": "libraries/ast-visitor-javascript", + "link": true + }, + "node_modules/@syntest/base-language": { + "version": "0.2.0-beta.28", + "resolved": "https://registry.npmjs.org/@syntest/base-language/-/base-language-0.2.0-beta.28.tgz", + "integrity": "sha512-M2aeblXmpnyxEQ0YcHUyXyP60Gbi+LKnnbKBsiCBmB9MTuzXlo/bNSkB+mcKoUPVXkoHxo+RYwk3v66WFHEvQw==", + "dependencies": { + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/logging": "^0.1.0-beta.6", + "@syntest/metric": "^0.1.0-beta.5", + "@syntest/module": "^0.1.0-beta.15", + "@syntest/search": "^0.4.0-beta.25", + "yargs": "^17.7.1" + }, "engines": { - "node": ">=10.24.0" + "node": ">=16" } }, - "node_modules/@syntest/cfg-javascript": { - "resolved": "libraries/cfg-javascript", - "link": true + "node_modules/@syntest/cfg": { + "version": "0.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@syntest/cfg/-/cfg-0.3.0-beta.16.tgz", + "integrity": "sha512-17q6QN1Xa/yqnqds/56gtdZDiKkluJ7P1tSVW6EAgST2Ws8fFmUsI2JjD+oguWvY+NqWBnjYQEp+C1GIBPaghA==", + "dependencies": { + "@syntest/logging": "^0.1.0-beta.6", + "lodash.clonedeep": "^4.5.0" + }, + "engines": { + "node": ">=16" + } }, - "node_modules/@syntest/core": { - "version": "0.3.1-beta.3", - "license": "Apache-2.0", + "node_modules/@syntest/cli-graphics": { + "version": "0.1.0-beta.3", + "resolved": "https://registry.npmjs.org/@syntest/cli-graphics/-/cli-graphics-0.1.0-beta.3.tgz", + "integrity": "sha512-JID6ubVmyHJhjckYE0TyTbs5zYOhzSOXYT/xlJwGXuhz1/tXXa6JmOX5rQSrV0CJJsiTCRGhUE3Mnh0Hpz80xw==", "dependencies": { - "@dagrejs/graphlib": "2.1.4", - "@syntest/cfg-core": "^0.2.1-beta.3", - "bignumber.js": "9.0.1", + "@syntest/logging": "*", "chalk": "4.1.1", "clear": "0.1.0", "cli-progress": "3.11.2", - "d3": "^4.13.0", - "fast-csv": "4.3.6", "figlet": "1.5.2", - "globby": "^11.0.4", - "jsdom": "20.0.3", - "seedrandom": "3.0.5", - "shelljs": "0.8.5", - "winston": "3.8.2", - "yargs": "17.6.2" + "table": "^6.8.1" }, "engines": { - "node": ">=10.24.0" + "node": ">=16" } }, - "node_modules/@syntest/core/node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", + "node_modules/@syntest/cli-graphics/node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@syntest/core/node_modules/yargs": { - "version": "17.6.2", - "license": "MIT", + "node_modules/@syntest/instrumentation-javascript": { + "resolved": "libraries/instrumentation-javascript", + "link": true + }, + "node_modules/@syntest/javascript": { + "resolved": "tools/javascript", + "link": true + }, + "node_modules/@syntest/logging": { + "version": "0.1.0-beta.6", + "resolved": "https://registry.npmjs.org/@syntest/logging/-/logging-0.1.0-beta.6.tgz", + "integrity": "sha512-fmKuuE8XQpInN24AHk3RNG3tDZ2nu6oqOfYlHolQiKGR42ZBPSMuM1Ozhsw/9itQuW4vV0Pcfm1wmLSbwpAtCA==", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "winston": "3.8.2", + "yargs": "^17.7.1" }, "engines": { - "node": ">=12" + "node": ">=16" } }, - "node_modules/@syntest/core/node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", + "node_modules/@syntest/metric": { + "version": "0.1.0-beta.5", + "resolved": "https://registry.npmjs.org/@syntest/metric/-/metric-0.1.0-beta.5.tgz", + "integrity": "sha512-+vmD1E8aickD/lfXalvvppV6RzOCvjwrwz5SEUqEXz3juE6BYH8iIxOaMSa+d+TQzHBSHUGl+cFlBZDmDjTvBA==", + "dependencies": { + "@syntest/logging": "*", + "yargs": "^17.7.1" + }, "engines": { - "node": ">=12" + "node": ">=16" } }, - "node_modules/@syntest/instrumentation-javascript": { - "resolved": "libraries/instrumentation-javascript", - "link": true + "node_modules/@syntest/module": { + "version": "0.1.0-beta.15", + "resolved": "https://registry.npmjs.org/@syntest/module/-/module-0.1.0-beta.15.tgz", + "integrity": "sha512-K3GpVm9C76+3DPm6ao90qhq1xJU0ov3Z+x+UNgw1aMWhoC2cYWfKzUsPWn6fcXwMjEIjrMH6CqBVvcp0rCPkRg==", + "dependencies": { + "@syntest/cli-graphics": "^0.1.0-beta.3", + "@syntest/logging": "*", + "@syntest/metric": "^0.1.0-beta.5", + "global-modules": "2.0.0", + "yargs": "^17.7.1" + }, + "engines": { + "node": ">=16" + } }, - "node_modules/@syntest/javascript": { - "resolved": "libraries/javascript", + "node_modules/@syntest/search": { + "version": "0.4.0-beta.25", + "resolved": "https://registry.npmjs.org/@syntest/search/-/search-0.4.0-beta.25.tgz", + "integrity": "sha512-BbwleCv9JvXcFw8nyNPI7VMT61iLyfHz+JDIIVnrYCo0KMP1JRvCV59Eemn4dGRWOjUFYZ2STwJJNk6HjqnEfA==", + "dependencies": { + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/cfg": "*", + "@syntest/logging": "*", + "bignumber.js": "9.0.1", + "seedrandom": "3.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@syntest/search-javascript": { + "resolved": "libraries/search-javascript", "link": true }, "node_modules/@tootallnate/once": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, "engines": { "node": ">= 10" } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "dev": true, - "license": "MIT" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true }, "node_modules/@types/babel__core": { - "version": "7.1.20", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -4511,100 +5086,138 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { - "version": "7.18.3", + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", + "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.3.0" } }, "node_modules/@types/chai": { "version": "4.3.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true }, "node_modules/@types/figlet": { "version": "1.5.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/figlet/-/figlet-1.5.4.tgz", + "integrity": "sha512-cskPTju7glYgzvkJy/hftqw7Fen3fsd0yrPOqcbBLJu+YdDQuA438akS1g+2XVKGzsQOnXGV2I9ePv6xUBnKMQ==", + "dev": true }, "node_modules/@types/json-schema": { "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", + "dev": true + }, + "node_modules/@types/lodash.clonedeep": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.7.tgz", + "integrity": "sha512-ccNqkPptFIXrpVqUECi60/DFxjNKsfoQxSQsgcBJCX/fuX1wgyQieojkcWH/KpE3xzLoWN/2k+ZeGqIN3paSvw==", "dev": true, - "license": "MIT" + "dependencies": { + "@types/lodash": "*" + } }, "node_modules/@types/minimatch": { "version": "3.0.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true }, "node_modules/@types/minimist": { "version": "1.2.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true }, "node_modules/@types/mocha": { "version": "10.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true }, "node_modules/@types/node": { "version": "18.11.18", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", + "dev": true }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true }, "node_modules/@types/parse-json": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true }, "node_modules/@types/semver": { - "version": "7.3.13", - "dev": true, - "license": "MIT" + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true }, "node_modules/@types/triple-beam": { "version": "1.3.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", + "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" }, "node_modules/@types/yargs": { "version": "17.0.20", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.20.tgz", + "integrity": "sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==", "dev": true, - "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.1.tgz", + "integrity": "sha512-cOizjPlKEh0bXdFrBLTrI/J6B/QMlhwE9auOov53tgB+qMukH6/h8YAK/qw+QJGct/PTbdh2lytGyipxCcEtAw==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/scope-manager": "5.45.1", "@typescript-eslint/type-utils": "5.45.1", @@ -4635,8 +5248,9 @@ }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -4645,9 +5259,10 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4660,13 +5275,15 @@ }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@typescript-eslint/parser": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.1.tgz", + "integrity": "sha512-JQ3Ep8bEOXu16q0ztsatp/iQfDCtvap7sp/DKo7DWltUquj5AfCOpX2zSzJ8YkAVnrQNqQ5R62PBz2UtrfmCkA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "5.45.1", "@typescript-eslint/types": "5.45.1", @@ -4691,8 +5308,9 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.1.tgz", + "integrity": "sha512-D6fCileR6Iai7E35Eb4Kp+k0iW7F1wxXYrOhX/3dywsOJpJAQ20Fwgcf+P/TDtvQ7zcsWsrJaglaQWDhOMsspQ==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.45.1", "@typescript-eslint/visitor-keys": "5.45.1" @@ -4707,8 +5325,9 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.1.tgz", + "integrity": "sha512-aosxFa+0CoYgYEl3aptLe1svP910DJq68nwEJzyQcrtRhC4BN0tJAvZGAe+D0tzjJmFXe+h4leSsiZhwBa2vrA==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "5.45.1", "@typescript-eslint/utils": "5.45.1", @@ -4733,8 +5352,9 @@ }, "node_modules/@typescript-eslint/types": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.1.tgz", + "integrity": "sha512-HEW3U0E5dLjUT+nk7b4lLbOherS1U4ap+b9pfu2oGsW3oPu7genRaY9dDv3nMczC1rbnRY2W/D7SN05wYoGImg==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4745,8 +5365,9 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.1.tgz", + "integrity": "sha512-76NZpmpCzWVrrb0XmYEpbwOz/FENBi+5W7ipVXAsG3OoFrQKJMiaqsBMbvGRyLtPotGqUfcY7Ur8j0dksDJDng==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.45.1", "@typescript-eslint/visitor-keys": "5.45.1", @@ -4771,8 +5392,9 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -4781,9 +5403,10 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4796,13 +5419,15 @@ }, "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@typescript-eslint/utils": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.1.tgz", + "integrity": "sha512-rlbC5VZz68+yjAzQBc4I7KDYVzWG2X/OrqoZrMahYq3u8FFtmQYc+9rovo/7wlJH5kugJ+jQXV5pJMnofGmPRw==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", @@ -4826,8 +5451,9 @@ }, "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -4836,9 +5462,10 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4851,13 +5478,15 @@ }, "node_modules/@typescript-eslint/utils/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.1.tgz", + "integrity": "sha512-cy9ln+6rmthYWjH9fmx+5FU/JDpjQb586++x2FZlveq7GdGuLLW9a2Jcst2TGekH82bXpfmRNSwP9tyEs6RjvQ==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.45.1", "eslint-visitor-keys": "^3.3.0" @@ -4872,13 +5501,15 @@ }, "node_modules/@yarnpkg/lockfile": { "version": "1.1.0", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true }, "node_modules/@yarnpkg/parsers": { - "version": "3.0.0-rc.40", + "version": "3.0.0-rc.44", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.44.tgz", + "integrity": "sha512-UVAt9Icc8zfGXioeYJ8XMoSTxOYVmlal2TRNxy9Uh91taS72kQFalK7LpIslcvEBKy4XtarmfIwcFIU3ZY64lw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "js-yaml": "^3.10.0", "tslib": "^2.4.0" @@ -4889,16 +5520,18 @@ }, "node_modules/@yarnpkg/parsers/node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/@yarnpkg/parsers/node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -4909,8 +5542,9 @@ }, "node_modules/@zkochan/js-yaml": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -4918,18 +5552,17 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/abab": { - "version": "2.0.6", - "license": "BSD-3-Clause" - }, "node_modules/abbrev": { "version": "1.1.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true }, "node_modules/acorn": { "version": "8.8.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -4937,37 +5570,35 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-globals": { - "version": "7.0.1", - "license": "MIT", - "dependencies": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/add-stream": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true }, "node_modules/agent-base": { "version": "6.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "dependencies": { "debug": "4" }, @@ -4977,8 +5608,9 @@ }, "node_modules/agentkeepalive": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^4.1.0", "depd": "^2.0.0", @@ -4990,8 +5622,9 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, - "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -5002,8 +5635,8 @@ }, "node_modules/ajv": { "version": "8.12.0", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -5017,15 +5650,17 @@ }, "node_modules/ansi-colors": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -5036,16 +5671,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -5058,7 +5707,8 @@ }, "node_modules/anymatch": { "version": "3.1.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5069,8 +5719,9 @@ }, "node_modules/append-transform": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, - "license": "MIT", "dependencies": { "default-require-extensions": "^3.0.0" }, @@ -5080,18 +5731,21 @@ }, "node_modules/aproba": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true }, "node_modules/archy": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true }, "node_modules/are-we-there-yet": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "dev": true, - "license": "ISC", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -5102,81 +5756,175 @@ }, "node_modules/arg": { "version": "4.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, "node_modules/argparse": { "version": "2.0.1", - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/array-differ": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array-ify": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, - "license": "MIT" + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/array-union": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, "engines": { "node": ">=8" } }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arrify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/asap": { "version": "2.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true }, "node_modules/assertion-error": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "engines": { "node": "*" } }, "node_modules/astral-regex": { "version": "2.0.0", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "engines": { "node": ">=8" } }, "node_modules/async": { "version": "3.2.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "node_modules/asynckit": { "version": "0.4.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/at-least-node": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "license": "ISC", "engines": { "node": ">= 4.0.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/axios": { - "version": "1.3.4", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dev": true, - "license": "MIT", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -5185,7 +5933,8 @@ }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "dependencies": { "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.3", @@ -5197,7 +5946,8 @@ }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.3", "core-js-compat": "^3.25.1" @@ -5208,7 +5958,8 @@ }, "node_modules/babel-plugin-polyfill-regenerator": { "version": "0.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.3" }, @@ -5218,10 +5969,13 @@ }, "node_modules/balanced-match": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true, "funding": [ { @@ -5236,25 +5990,36 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/before-after-hook": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", "dev": true, - "license": "Apache-2.0" + "engines": { + "node": ">=0.6" + } }, "node_modules/bignumber.js": { "version": "9.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", "engines": { "node": "*" } }, "node_modules/bin-links": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-3.0.3.tgz", + "integrity": "sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==", "dev": true, - "license": "ISC", "dependencies": { "cmd-shim": "^5.0.0", "mkdirp-infer-owner": "^2.0.0", @@ -5269,32 +6034,48 @@ }, "node_modules/bin-links/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, - "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/binary-extensions": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" } }, "node_modules/bl": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, - "license": "MIT", "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", - "license": "MIT", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5302,7 +6083,8 @@ }, "node_modules/braces": { "version": "3.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, @@ -5312,10 +6094,13 @@ }, "node_modules/browser-stdout": { "version": "1.3.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "node_modules/browserslist": { "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "funding": [ { "type": "opencollective", @@ -5326,7 +6111,6 @@ "url": "https://tidelift.com/funding/github/npm/browserslist" } ], - "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001449", "electron-to-chromium": "^1.4.284", @@ -5342,6 +6126,8 @@ }, "node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "funding": [ { @@ -5357,7 +6143,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -5365,20 +6150,35 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/builtins": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.0.0" } }, "node_modules/builtins/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -5387,9 +6187,10 @@ } }, "node_modules/builtins/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -5402,21 +6203,39 @@ }, "node_modules/builtins/node_modules/yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, - "license": "ISC" + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/byte-size": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-7.0.1.tgz", + "integrity": "sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/cacache": { "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, - "license": "ISC", "dependencies": { "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^2.0.0", @@ -5443,16 +6262,18 @@ }, "node_modules/cacache/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/caching-transform": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, - "license": "MIT", "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", @@ -5465,8 +6286,9 @@ }, "node_modules/caching-transform/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -5479,8 +6301,9 @@ }, "node_modules/caching-transform/node_modules/write-file-atomic": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -5488,26 +6311,42 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase-keys": { "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, - "license": "MIT", "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -5521,7 +6360,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001462", + "version": "1.0.30001489", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", + "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", "funding": [ { "type": "opencollective", @@ -5530,13 +6371,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/chai": { "version": "4.3.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -5552,7 +6397,8 @@ }, "node_modules/chai-as-promised": { "version": "7.1.1", - "license": "WTFPL", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "dependencies": { "check-error": "^1.0.2" }, @@ -5561,8 +6407,9 @@ } }, "node_modules/chalk": { - "version": "4.1.1", - "license": "MIT", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5576,25 +6423,28 @@ }, "node_modules/chardet": { "version": "0.7.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true }, "node_modules/check-error": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", "engines": { "node": "*" } }, "node_modules/chokidar": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -5613,7 +6463,8 @@ }, "node_modules/chokidar/node_modules/glob-parent": { "version": "5.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, @@ -5623,35 +6474,71 @@ }, "node_modules/chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true, - "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/ci-info": { - "version": "2.0.0", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=0.8.0" + } }, "node_modules/clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/clear": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", + "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==", "engines": { "node": "*" } }, "node_modules/cli-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, - "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -5661,7 +6548,8 @@ }, "node_modules/cli-progress": { "version": "3.11.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.11.2.tgz", + "integrity": "sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA==", "dependencies": { "string-width": "^4.2.3" }, @@ -5671,8 +6559,9 @@ }, "node_modules/cli-spinners": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -5682,8 +6571,9 @@ }, "node_modules/cli-truncate": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, - "license": "MIT", "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^5.0.0" @@ -5697,8 +6587,9 @@ }, "node_modules/cli-truncate/node_modules/ansi-regex": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -5708,13 +6599,15 @@ }, "node_modules/cli-truncate/node_modules/emoji-regex": { "version": "9.2.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true }, "node_modules/cli-truncate/node_modules/string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -5729,8 +6622,9 @@ }, "node_modules/cli-truncate/node_modules/strip-ansi": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^6.0.1" }, @@ -5743,15 +6637,17 @@ }, "node_modules/cli-width": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true, - "license": "ISC", "engines": { "node": ">= 10" } }, "node_modules/cliui": { "version": "7.0.4", - "license": "ISC", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -5760,15 +6656,17 @@ }, "node_modules/clone": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/clone-deep": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -5780,8 +6678,9 @@ }, "node_modules/cmd-shim": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz", + "integrity": "sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==", "dev": true, - "license": "ISC", "dependencies": { "mkdirp-infer-owner": "^2.0.0" }, @@ -5791,7 +6690,8 @@ }, "node_modules/color": { "version": "3.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dependencies": { "color-convert": "^1.9.3", "color-string": "^1.6.0" @@ -5799,7 +6699,8 @@ }, "node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -5809,11 +6710,13 @@ }, "node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { "version": "1.9.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -5821,31 +6724,36 @@ }, "node_modules/color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true, - "license": "ISC", "bin": { "color-support": "bin.js" } }, "node_modules/color/node_modules/color-convert": { "version": "1.9.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { "color-name": "1.1.3" } }, "node_modules/color/node_modules/color-name": { "version": "1.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/colorette": { - "version": "2.0.19", - "dev": true, - "license": "MIT" + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true }, "node_modules/colorspace": { "version": "1.1.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "dependencies": { "color": "^3.1.3", "text-hex": "1.0.x" @@ -5853,8 +6761,9 @@ }, "node_modules/columnify": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "dev": true, - "license": "MIT", "dependencies": { "strip-ansi": "^6.0.1", "wcwidth": "^1.0.0" @@ -5865,7 +6774,9 @@ }, "node_modules/combined-stream": { "version": "1.0.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -5874,13 +6785,19 @@ } }, "node_modules/commander": { - "version": "2.20.3", - "license": "MIT" + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } }, "node_modules/commitlint": { "version": "17.4.2", + "resolved": "https://registry.npmjs.org/commitlint/-/commitlint-17.4.2.tgz", + "integrity": "sha512-1UQecX+vSJHQXTKFMRZmf8EG3BYYjkT26JLe6FTQhu7N67FiWdWbqXMpcQSpqx/kWNz9a+DX2au2e61IH89PDA==", "dev": true, - "license": "MIT", "dependencies": { "@commitlint/cli": "^17.4.2", "@commitlint/types": "^17.4.0" @@ -5894,17 +6811,20 @@ }, "node_modules/common-ancestor-path": { "version": "1.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true }, "node_modules/commondir": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/compare-func": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, - "license": "MIT", "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" @@ -5912,15 +6832,17 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "engines": [ "node >= 6.0" ], - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -5930,8 +6852,9 @@ }, "node_modules/config-chain": { "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, - "license": "MIT", "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" @@ -5939,13 +6862,15 @@ }, "node_modules/console-control-strings": { "version": "1.1.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true }, "node_modules/conventional-changelog-angular": { "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "dev": true, - "license": "ISC", "dependencies": { "compare-func": "^2.0.0", "q": "^1.5.1" @@ -5956,8 +6881,9 @@ }, "node_modules/conventional-changelog-conventionalcommits": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", + "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", "dev": true, - "license": "ISC", "dependencies": { "compare-func": "^2.0.0", "lodash": "^4.17.15", @@ -5969,8 +6895,9 @@ }, "node_modules/conventional-changelog-core": { "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", "dev": true, - "license": "MIT", "dependencies": { "add-stream": "^1.0.0", "conventional-changelog-writer": "^5.0.0", @@ -5991,18 +6918,100 @@ "node": ">=10" } }, + "node_modules/conventional-changelog-core/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/conventional-changelog-preset-loader": { "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/conventional-changelog-writer": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", "dev": true, - "license": "MIT", "dependencies": { "conventional-commits-filter": "^2.0.7", "dateformat": "^3.0.0", @@ -6023,8 +7032,9 @@ }, "node_modules/conventional-commits-filter": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", "dev": true, - "license": "MIT", "dependencies": { "lodash.ismatch": "^4.4.0", "modify-values": "^1.0.0" @@ -6035,8 +7045,9 @@ }, "node_modules/conventional-commits-parser": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, - "license": "MIT", "dependencies": { "is-text-path": "^1.0.1", "JSONStream": "^1.0.4", @@ -6054,8 +7065,9 @@ }, "node_modules/conventional-recommended-bump": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", "dev": true, - "license": "MIT", "dependencies": { "concat-stream": "^2.0.0", "conventional-changelog-preset-loader": "^2.3.4", @@ -6075,11 +7087,13 @@ }, "node_modules/convert-source-map": { "version": "1.9.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/core-js-compat": { - "version": "3.29.0", - "license": "MIT", + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", + "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", "dependencies": { "browserslist": "^4.21.5" }, @@ -6090,13 +7104,15 @@ }, "node_modules/core-util-is": { "version": "1.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true }, "node_modules/cosmiconfig": { - "version": "8.1.0", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, - "license": "MIT", "dependencies": { "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", @@ -6112,8 +7128,9 @@ }, "node_modules/cosmiconfig-typescript-loader": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", + "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=12", "npm": ">=6" @@ -6127,13 +7144,15 @@ }, "node_modules/create-require": { "version": "1.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, "node_modules/cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6143,290 +7162,28 @@ "node": ">= 8" } }, - "node_modules/cssom": { - "version": "0.5.0", - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "cssom": "~0.3.6" - }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, "engines": { "node": ">=8" } }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "license": "MIT" - }, - "node_modules/d3": { - "version": "4.13.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1.2.1", - "d3-axis": "1.0.8", - "d3-brush": "1.0.4", - "d3-chord": "1.0.4", - "d3-collection": "1.0.4", - "d3-color": "1.0.3", - "d3-dispatch": "1.0.3", - "d3-drag": "1.2.1", - "d3-dsv": "1.0.8", - "d3-ease": "1.0.3", - "d3-force": "1.1.0", - "d3-format": "1.2.2", - "d3-geo": "1.9.1", - "d3-hierarchy": "1.1.5", - "d3-interpolate": "1.1.6", - "d3-path": "1.0.5", - "d3-polygon": "1.0.3", - "d3-quadtree": "1.0.3", - "d3-queue": "3.0.7", - "d3-random": "1.1.0", - "d3-request": "1.0.6", - "d3-scale": "1.0.7", - "d3-selection": "1.3.0", - "d3-shape": "1.2.0", - "d3-time": "1.0.8", - "d3-time-format": "2.1.1", - "d3-timer": "1.0.7", - "d3-transition": "1.1.1", - "d3-voronoi": "1.1.2", - "d3-zoom": "1.7.1" - } - }, - "node_modules/d3-array": { - "version": "1.2.1", - "license": "BSD-3-Clause" - }, - "node_modules/d3-axis": { - "version": "1.0.8", - "license": "BSD-3-Clause" - }, - "node_modules/d3-brush": { - "version": "1.0.4", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/d3-chord": { - "version": "1.0.4", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1", - "d3-path": "1" - } - }, - "node_modules/d3-collection": { - "version": "1.0.4", - "license": "BSD-3-Clause" - }, - "node_modules/d3-color": { - "version": "1.0.3", - "license": "BSD-3-Clause" - }, - "node_modules/d3-dispatch": { - "version": "1.0.3", - "license": "BSD-3-Clause" - }, - "node_modules/d3-drag": { - "version": "1.2.1", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "node_modules/d3-dsv": { - "version": "1.0.8", - "license": "BSD-3-Clause", - "dependencies": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json", - "csv2tsv": "bin/dsv2dsv", - "dsv2dsv": "bin/dsv2dsv", - "dsv2json": "bin/dsv2json", - "json2csv": "bin/json2dsv", - "json2dsv": "bin/json2dsv", - "json2tsv": "bin/json2dsv", - "tsv2csv": "bin/dsv2dsv", - "tsv2json": "bin/dsv2json" - } - }, - "node_modules/d3-ease": { - "version": "1.0.3", - "license": "BSD-3-Clause" - }, - "node_modules/d3-force": { - "version": "1.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "node_modules/d3-format": { - "version": "1.2.2", - "license": "BSD-3-Clause" - }, - "node_modules/d3-geo": { - "version": "1.9.1", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "1" - } - }, - "node_modules/d3-hierarchy": { - "version": "1.1.5", - "license": "BSD-3-Clause" - }, - "node_modules/d3-interpolate": { - "version": "1.1.6", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1" - } - }, - "node_modules/d3-path": { - "version": "1.0.5", - "license": "BSD-3-Clause" - }, - "node_modules/d3-polygon": { - "version": "1.0.3", - "license": "BSD-3-Clause" - }, - "node_modules/d3-quadtree": { - "version": "1.0.3", - "license": "BSD-3-Clause" - }, - "node_modules/d3-queue": { - "version": "3.0.7", - "license": "BSD-3-Clause" - }, - "node_modules/d3-random": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/d3-request": { - "version": "1.0.6", - "license": "BSD-3-Clause", - "dependencies": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-dsv": "1", - "xmlhttprequest": "1" - } - }, - "node_modules/d3-scale": { - "version": "1.0.7", - "license": "BSD-3-Clause", - "dependencies": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-color": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" - } - }, - "node_modules/d3-selection": { - "version": "1.3.0", - "license": "BSD-3-Clause" - }, - "node_modules/d3-shape": { - "version": "1.2.0", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-time": { - "version": "1.0.8", - "license": "BSD-3-Clause" - }, - "node_modules/d3-time-format": { - "version": "2.1.1", - "license": "BSD-3-Clause", - "dependencies": { - "d3-time": "1" - } - }, - "node_modules/d3-timer": { - "version": "1.0.7", - "license": "BSD-3-Clause" - }, - "node_modules/d3-transition": { - "version": "1.1.1", - "license": "BSD-3-Clause", - "dependencies": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "node_modules/d3-voronoi": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/d3-zoom": { - "version": "1.7.1", - "license": "BSD-3-Clause", - "dependencies": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "node_modules/dargs": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/data-urls": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/dateformat": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true, - "license": "MIT", "engines": { "node": "*" } }, "node_modules/debug": { "version": "4.3.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -6441,24 +7198,27 @@ }, "node_modules/debuglog": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", "dev": true, - "license": "MIT", "engines": { "node": "*" } }, "node_modules/decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decamelize-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, - "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -6472,24 +7232,23 @@ }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/decimal.js": { - "version": "10.4.3", - "license": "MIT" - }, "node_modules/dedent": { "version": "0.7.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", + "dev": true }, "node_modules/deep-eql": { "version": "4.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dependencies": { "type-detect": "^4.0.0" }, @@ -6499,12 +7258,159 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/default-require-extensions": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, - "license": "MIT", "dependencies": { "strip-bom": "^4.0.0" }, @@ -6517,8 +7423,9 @@ }, "node_modules/defaults": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, - "license": "MIT", "dependencies": { "clone": "^1.0.2" }, @@ -6528,49 +7435,73 @@ }, "node_modules/define-lazy-prop": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/delegates": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true }, "node_modules/depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/deprecation": { "version": "2.3.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true }, "node_modules/detect-indent": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/dezalgo": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, - "license": "ISC", "dependencies": { "asap": "^2.0.0", "wrappy": "1" @@ -6578,14 +7509,17 @@ }, "node_modules/diff": { "version": "5.0.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "engines": { "node": ">=0.3.1" } }, "node_modules/dir-glob": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -6595,8 +7529,9 @@ }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -6604,20 +7539,11 @@ "node": ">=6.0.0" } }, - "node_modules/domexception": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/dot-prop": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, - "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -6627,26 +7553,30 @@ }, "node_modules/dotenv": { "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=10" } }, "node_modules/duplexer": { "version": "0.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true }, "node_modules/eastasianwidth": { "version": "0.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true }, "node_modules/ejs": { - "version": "3.1.8", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -6658,21 +7588,25 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.324", - "license": "ISC" + "version": "1.4.404", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.404.tgz", + "integrity": "sha512-te57sWvQdpxmyd1GiswaodKdXdPgn9cN4ht8JlNa04QgtrfnUdWEo1261rY2vaC6TKaiHn0E7QerJWPKFCvMVw==" }, "node_modules/emoji-regex": { "version": "8.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/enabled": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, "node_modules/encoding": { "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -6680,8 +7614,9 @@ }, "node_modules/encoding/node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -6692,16 +7627,31 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, - "license": "MIT", "dependencies": { "once": "^1.4.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/enquirer": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1" }, @@ -6709,28 +7659,20 @@ "node": ">=8.6" } }, - "node_modules/entities": { - "version": "4.4.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/envinfo": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true, - "license": "MIT", "bin": { "envinfo": "dist/cli.js" }, @@ -6740,123 +7682,143 @@ }, "node_modules/err-code": { "version": "2.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true }, "node_modules/error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, - "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, - "node_modules/es6-error": { - "version": "4.1.1", - "dev": true, - "license": "MIT" - }, - "node_modules/escalade": { - "version": "3.1.1", - "license": "MIT", + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escodegen": { - "version": "2.0.0", - "license": "BSD-2-Clause", + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "5.3.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "node": ">= 0.4" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "license": "MIT", + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" + "has": "^1.0.3" } }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "license": "MIT", + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "engines": { - "node": ">= 0.8.0" - } + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "optional": true, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "license": "MIT", - "dependencies": { - "prelude-ls": "~1.1.2" - }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">= 0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { - "version": "8.29.0", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, - "license": "MIT", "dependencies": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -6865,24 +7827,22 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -6890,7 +7850,6 @@ "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "regexpp": "^3.2.0", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" @@ -6907,8 +7866,9 @@ }, "node_modules/eslint-config-prettier": { "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -6916,6 +7876,159 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint-plugin-notice": { "version": "0.9.10", "resolved": "https://registry.npmjs.org/eslint-plugin-notice/-/eslint-plugin-notice-0.9.10.tgz", @@ -6930,10 +8043,143 @@ "eslint": ">=3.0.0" } }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-sonarjs": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.19.0.tgz", + "integrity": "sha512-6+s5oNk5TFtVlbRxqZN7FIGmjdPCYQKaTzFPmqieCmsU1kBYDzndTeQav0xtQNwZJWu5awWfTGe8Srq9xFOGnw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "45.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.2.tgz", + "integrity": "sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.19.1", + "@eslint-community/eslint-utils": "^4.1.2", + "ci-info": "^3.6.1", + "clean-regexp": "^1.0.0", + "esquery": "^1.4.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.2.0", + "jsesc": "^3.0.2", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.24", + "regjsparser": "^0.9.1", + "safe-regex": "^2.1.1", + "semver": "^7.3.8", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=8.28.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/eslint-plugin-unused-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", + "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", + "dev": true, + "dependencies": { + "eslint-rule-composer": "^0.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + } + } + }, + "node_modules/eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -6944,8 +8190,9 @@ }, "node_modules/eslint-utils": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -6961,24 +8208,30 @@ }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6991,63 +8244,45 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/espree": { - "version": "9.4.1", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7058,7 +8293,9 @@ }, "node_modules/esprima": { "version": "4.0.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -7069,8 +8306,9 @@ }, "node_modules/esquery": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -7080,16 +8318,18 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -7099,36 +8339,41 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "engines": { "node": ">=0.10.0" } }, "node_modules/eventemitter3": { "version": "4.0.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true }, "node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -7149,8 +8394,9 @@ }, "node_modules/external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, - "license": "MIT", "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -7162,8 +8408,9 @@ }, "node_modules/external-editor/node_modules/tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, - "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -7171,25 +8418,16 @@ "node": ">=0.6.0" } }, - "node_modules/fast-csv": { - "version": "4.3.6", - "license": "MIT", - "dependencies": { - "@fast-csv/format": "4.3.5", - "@fast-csv/parse": "4.3.6" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { "version": "3.2.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -7203,7 +8441,9 @@ }, "node_modules/fast-glob/node_modules/glob-parent": { "version": "5.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -7213,35 +8453,43 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fastq": { "version": "1.15.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fecha": { "version": "4.2.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "node_modules/figlet": { "version": "1.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.2.tgz", + "integrity": "sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==", "engines": { "node": ">= 0.4.0" } }, "node_modules/figures": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, - "license": "MIT", "dependencies": { "escape-string-regexp": "^1.0.5" }, @@ -7254,16 +8502,18 @@ }, "node_modules/figures/node_modules/escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -7273,24 +8523,27 @@ }, "node_modules/filelist": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, - "license": "Apache-2.0", "dependencies": { "minimatch": "^5.0.1" } }, "node_modules/filelist/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/filelist/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7300,7 +8553,8 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -7310,7 +8564,8 @@ }, "node_modules/find-cache-dir": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -7328,7 +8583,8 @@ }, "node_modules/find-up": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -7342,15 +8598,17 @@ }, "node_modules/flat": { "version": "5.0.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -7361,15 +8619,19 @@ }, "node_modules/flatted": { "version": "3.2.7", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true }, "node_modules/fn.name": { "version": "1.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "node_modules/follow-redirects": { "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true, "funding": [ { @@ -7377,7 +8639,6 @@ "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -7387,10 +8648,20 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" @@ -7401,7 +8672,9 @@ }, "node_modules/form-data": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -7413,6 +8686,8 @@ }, "node_modules/fromentries": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true, "funding": [ { @@ -7427,17 +8702,18 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/fs-constants": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true }, "node_modules/fs-extra": { "version": "11.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -7449,8 +8725,9 @@ }, "node_modules/fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -7460,11 +8737,14 @@ }, "node_modules/fs.realpath": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -7475,12 +8755,41 @@ }, "node_modules/function-bind": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/gauge": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, - "license": "ISC", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", @@ -7497,37 +8806,57 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "license": "ISC", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-func-name": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", "engines": { "node": "*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-pkg-repo": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", "dev": true, - "license": "MIT", "dependencies": { "@hutson/parse-repository-url": "^3.0.0", "hosted-git-info": "^4.0.0", @@ -7543,13 +8872,15 @@ }, "node_modules/get-pkg-repo/node_modules/isarray": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true }, "node_modules/get-pkg-repo/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7562,21 +8893,24 @@ }, "node_modules/get-pkg-repo/node_modules/safe-buffer": { "version": "5.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/get-pkg-repo/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "license": "MIT", "dependencies": { "safe-buffer": "~5.1.0" } }, "node_modules/get-pkg-repo/node_modules/through2": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, - "license": "MIT", "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -7584,8 +8918,9 @@ }, "node_modules/get-pkg-repo/node_modules/yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -7601,8 +8936,9 @@ }, "node_modules/get-port": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -7612,8 +8948,9 @@ }, "node_modules/get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -7621,10 +8958,36 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/git-raw-commits": { "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", "dev": true, - "license": "MIT", "dependencies": { "dargs": "^7.0.0", "lodash": "^4.17.15", @@ -7641,8 +9004,9 @@ }, "node_modules/git-remote-origin-url": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", "dev": true, - "license": "MIT", "dependencies": { "gitconfiglocal": "^1.0.0", "pify": "^2.3.0" @@ -7653,16 +9017,18 @@ }, "node_modules/git-remote-origin-url/node_modules/pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/git-semver-tags": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, - "license": "MIT", "dependencies": { "meow": "^8.0.0", "semver": "^6.0.0" @@ -7676,8 +9042,9 @@ }, "node_modules/git-up": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, - "license": "MIT", "dependencies": { "is-ssh": "^1.4.0", "parse-url": "^8.1.0" @@ -7685,24 +9052,27 @@ }, "node_modules/git-url-parse": { "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", "dev": true, - "license": "MIT", "dependencies": { "git-up": "^7.0.0" } }, "node_modules/gitconfiglocal": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", "dev": true, - "license": "BSD", "dependencies": { "ini": "^1.3.2" } }, "node_modules/glob": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7719,8 +9089,9 @@ }, "node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -7730,16 +9101,18 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/glob/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -7749,8 +9122,9 @@ }, "node_modules/global-dirs": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, - "license": "MIT", "dependencies": { "ini": "^1.3.4" }, @@ -7758,16 +9132,75 @@ "node": ">=4" } }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { - "version": "11.12.0", - "license": "MIT", + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/globby": { "version": "11.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -7783,19 +9216,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { - "version": "4.2.10", - "license": "ISC" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "dev": true, - "license": "MIT" + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/handlebars": { "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.0", @@ -7812,48 +9260,105 @@ "uglify-js": "^3.1.4" } }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, - "license": "BSD-3-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=6" + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has": { + "node_modules/has-symbols": { "version": "1.0.3", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, "engines": { - "node": ">= 0.4.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-unicode": { "version": "2.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true }, "node_modules/hasha": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, - "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -7867,23 +9372,26 @@ }, "node_modules/hasha/node_modules/type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/he": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "bin": { "he": "bin/he" } }, "node_modules/hosted-git-info": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -7893,8 +9401,9 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -7904,32 +9413,27 @@ }, "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/html-encoding-sniffer": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "whatwg-encoding": "^2.0.0" - }, - "engines": { - "node": ">=12" - } + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/html-escaper": { "version": "2.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "dev": true, - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true }, "node_modules/http-proxy-agent": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, "dependencies": { "@tootallnate/once": "2", "agent-base": "6", @@ -7941,7 +9445,9 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "dependencies": { "agent-base": "6", "debug": "4" @@ -7952,24 +9458,27 @@ }, "node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.0.0" } }, "node_modules/husky": { "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true, - "license": "MIT", "bin": { "husky": "lib/bin.js" }, @@ -7982,7 +9491,9 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -7992,6 +9503,8 @@ }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true, "funding": [ { @@ -8006,20 +9519,22 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { "version": "5.2.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", "dev": true, - "license": "ISC", "dependencies": { "minimatch": "^5.0.1" }, @@ -8029,16 +9544,18 @@ }, "node_modules/ignore-walk/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/ignore-walk/node_modules/minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -8048,8 +9565,9 @@ }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -8063,16 +9581,18 @@ }, "node_modules/import-fresh/node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/import-local": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, - "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -8089,8 +9609,9 @@ }, "node_modules/import-local/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -8101,8 +9622,9 @@ }, "node_modules/import-local/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -8112,8 +9634,9 @@ }, "node_modules/import-local/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -8126,8 +9649,9 @@ }, "node_modules/import-local/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -8137,8 +9661,9 @@ }, "node_modules/import-local/node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -8148,28 +9673,32 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/infer-owner": { "version": "1.0.4", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true }, "node_modules/inflight": { "version": "1.0.6", - "license": "ISC", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8177,17 +9706,19 @@ }, "node_modules/inherits": { "version": "2.0.4", - "license": "ISC" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/init-package-json": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-3.0.2.tgz", + "integrity": "sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A==", "dev": true, - "license": "ISC", "dependencies": { "npm-package-arg": "^9.0.1", "promzard": "^0.3.0", @@ -8203,8 +9734,9 @@ }, "node_modules/init-package-json/node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -8214,16 +9746,18 @@ }, "node_modules/init-package-json/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/init-package-json/node_modules/npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^5.0.0", "proc-log": "^2.0.1", @@ -8235,9 +9769,10 @@ } }, "node_modules/init-package-json/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -8250,8 +9785,9 @@ }, "node_modules/init-package-json/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -8261,13 +9797,15 @@ }, "node_modules/init-package-json/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/inquirer": { "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", @@ -8289,26 +9827,62 @@ "node": ">=12.0.0" } }, - "node_modules/interpret": { - "version": "1.4.0", - "license": "MIT", + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, "engines": { - "node": ">= 0.10" + "node": ">= 0.4" } }, "node_modules/ip": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, - "license": "MIT" + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT" + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-binary-path": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -8316,10 +9890,54 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-ci": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, - "license": "MIT", "dependencies": { "ci-info": "^2.0.0" }, @@ -8327,9 +9945,16 @@ "is-ci": "bin.js" } }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, "node_modules/is-core-module": { - "version": "2.11.0", - "license": "MIT", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { "has": "^1.0.3" }, @@ -8337,10 +9962,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -8353,15 +9994,17 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -8371,7 +10014,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -8379,53 +10023,120 @@ "node": ">=0.10.0" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-lambda": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "license": "MIT" + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-number": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-obj": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-plain-object": { "version": "2.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dependencies": { "isobject": "^3.0.1" }, @@ -8433,21 +10144,47 @@ "node": ">=0.10.0" } }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "license": "MIT" + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/is-ssh": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "dev": true, - "license": "MIT", "dependencies": { "protocols": "^2.0.1" } }, "node_modules/is-stream": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "engines": { "node": ">=8" }, @@ -8455,10 +10192,41 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-text-path": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, - "license": "MIT", "dependencies": { "text-extensions": "^1.0.0" }, @@ -8466,14 +10234,35 @@ "node": ">=0.10.0" } }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "engines": { "node": ">=10" }, @@ -8481,18 +10270,32 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-windows": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -8502,32 +10305,36 @@ }, "node_modules/isarray": { "version": "0.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", "engines": { "node": ">=0.10.0" } }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-hook": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "append-transform": "^2.0.0" }, @@ -8537,7 +10344,8 @@ }, "node_modules/istanbul-lib-instrument": { "version": "5.1.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -8551,8 +10359,9 @@ }, "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, - "license": "ISC", "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", @@ -8567,8 +10376,9 @@ }, "node_modules/istanbul-lib-processinfo/node_modules/p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -8578,8 +10388,9 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", @@ -8591,8 +10402,9 @@ }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -8605,8 +10417,9 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -8616,18 +10429,11 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/istanbul-reports": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -8637,14 +10443,15 @@ } }, "node_modules/jake": { - "version": "10.8.5", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.6.tgz", + "integrity": "sha512-G43Ub9IYEFfu72sua6rzooi8V8Gz2lkfk48rW20vEWCGizeaEPlKB1Kh8JIA84yQbiAEfqlPmSpGgCKKxH3rDA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" @@ -8653,22 +10460,15 @@ "node": ">=10" } }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-tokens": { "version": "4.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { "argparse": "^2.0.1" }, @@ -8676,52 +10476,10 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsdom": { - "version": "20.0.3", - "license": "MIT", - "dependencies": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, "node_modules/jsesc": { "version": "2.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "bin": { "jsesc": "bin/jsesc" }, @@ -8731,40 +10489,46 @@ }, "node_modules/json-parse-better-errors": { "version": "1.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema-traverse": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true }, "node_modules/json-stringify-nice": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", "dev": true, - "license": "ISC", "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true }, "node_modules/json5": { "version": "2.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -8774,12 +10538,14 @@ }, "node_modules/jsonc-parser": { "version": "3.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true }, "node_modules/jsonfile": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { "universalify": "^2.0.0" }, @@ -8789,16 +10555,18 @@ }, "node_modules/jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true, "engines": [ "node >= 0.2.0" - ], - "license": "MIT" + ] }, "node_modules/JSONStream": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, - "license": "(MIT OR Apache-2.0)", "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" @@ -8812,34 +10580,40 @@ }, "node_modules/just-diff": { "version": "5.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-5.2.0.tgz", + "integrity": "sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==", + "dev": true }, "node_modules/just-diff-apply": { "version": "5.5.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "dev": true }, "node_modules/just-extend": { "version": "4.2.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true }, "node_modules/kind-of": { "version": "6.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "engines": { "node": ">=0.10.0" } }, "node_modules/kuler": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, "node_modules/lerna": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-6.4.1.tgz", + "integrity": "sha512-0t8TSG4CDAn5+vORjvTFn/ZEGyc4LOEsyBUpzcdIxODHPKM4TVOGvbW9dBs1g40PhOrQfwhHS+3fSx/42j42dQ==", "dev": true, - "license": "MIT", "dependencies": { "@lerna/add": "6.4.1", "@lerna/bootstrap": "6.4.1", @@ -8876,8 +10650,9 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -8888,8 +10663,9 @@ }, "node_modules/libnpmaccess": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-6.0.4.tgz", + "integrity": "sha512-qZ3wcfIyUoW0+qSFkMBovcTrSGJ3ZeyvpR7d5N9pEYv/kXs8sHP2wiqEIXBKLFrZlmM0kR0RJD7mtfLngtlLag==", "dev": true, - "license": "ISC", "dependencies": { "aproba": "^2.0.0", "minipass": "^3.1.1", @@ -8902,8 +10678,9 @@ }, "node_modules/libnpmaccess/node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -8913,16 +10690,18 @@ }, "node_modules/libnpmaccess/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/libnpmaccess/node_modules/npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^5.0.0", "proc-log": "^2.0.1", @@ -8934,9 +10713,10 @@ } }, "node_modules/libnpmaccess/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -8949,8 +10729,9 @@ }, "node_modules/libnpmaccess/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -8960,13 +10741,15 @@ }, "node_modules/libnpmaccess/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/libnpmpublish": { "version": "6.0.5", + "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-6.0.5.tgz", + "integrity": "sha512-LUR08JKSviZiqrYTDfywvtnsnxr+tOvBU0BF8H+9frt7HMvc6Qn6F8Ubm72g5hDTHbq8qupKfDvDAln2TVPvFg==", "dev": true, - "license": "ISC", "dependencies": { "normalize-package-data": "^4.0.0", "npm-package-arg": "^9.0.1", @@ -8980,8 +10763,9 @@ }, "node_modules/libnpmpublish/node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -8991,16 +10775,18 @@ }, "node_modules/libnpmpublish/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/libnpmpublish/node_modules/normalize-package-data": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^5.0.0", "is-core-module": "^2.8.1", @@ -9013,8 +10799,9 @@ }, "node_modules/libnpmpublish/node_modules/npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^5.0.0", "proc-log": "^2.0.1", @@ -9026,9 +10813,10 @@ } }, "node_modules/libnpmpublish/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -9041,8 +10829,9 @@ }, "node_modules/libnpmpublish/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9052,29 +10841,33 @@ }, "node_modules/libnpmpublish/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/lilconfig": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/lines-and-columns": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/lint-staged": { "version": "13.1.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.0.tgz", + "integrity": "sha512-pn/sR8IrcF/T0vpWLilih8jmVouMlxqXxKuAojmbiGX5n/gDnz+abdPptlj0vYnbfE0SQNl3CY/HwtM0+yfOVQ==", "dev": true, - "license": "MIT", "dependencies": { "cli-truncate": "^3.1.0", "colorette": "^2.0.19", @@ -9100,18 +10893,11 @@ "url": "https://opencollective.com/lint-staged" } }, - "node_modules/lint-staged/node_modules/commander": { - "version": "9.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, "node_modules/lint-staged/node_modules/execa": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -9132,16 +10918,18 @@ }, "node_modules/lint-staged/node_modules/human-signals": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.20.0" } }, "node_modules/lint-staged/node_modules/is-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -9151,8 +10939,9 @@ }, "node_modules/lint-staged/node_modules/mimic-fn": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -9162,8 +10951,9 @@ }, "node_modules/lint-staged/node_modules/npm-run-path": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -9176,8 +10966,9 @@ }, "node_modules/lint-staged/node_modules/onetime": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -9190,8 +10981,9 @@ }, "node_modules/lint-staged/node_modules/path-key": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -9201,8 +10993,9 @@ }, "node_modules/lint-staged/node_modules/strip-final-newline": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -9211,9 +11004,10 @@ } }, "node_modules/listr2": { - "version": "5.0.7", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, - "license": "MIT", "dependencies": { "cli-truncate": "^2.1.0", "colorette": "^2.0.19", @@ -9238,8 +11032,9 @@ }, "node_modules/listr2/node_modules/cli-truncate": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, - "license": "MIT", "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" @@ -9253,16 +11048,18 @@ }, "node_modules/listr2/node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/listr2/node_modules/slice-ansi": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -9274,8 +11071,9 @@ }, "node_modules/load-json-file": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", + "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.15", "parse-json": "^5.0.0", @@ -9288,15 +11086,17 @@ }, "node_modules/load-json-file/node_modules/type-fest": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/locate-path": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { "p-locate": "^5.0.0" }, @@ -9309,106 +11109,107 @@ }, "node_modules/lodash": { "version": "4.17.21", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true }, "node_modules/lodash.clonedeep": { "version": "4.5.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, "node_modules/lodash.debounce": { "version": "4.0.8", - "license": "MIT" - }, - "node_modules/lodash.escaperegexp": { - "version": "4.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.flattendeep": { "version": "4.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true }, "node_modules/lodash.get": { "version": "4.4.2", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.groupby": { - "version": "4.6.0", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "license": "MIT" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true }, "node_modules/lodash.isfunction": { "version": "3.0.9", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true }, "node_modules/lodash.ismatch": { "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isnil": { - "version": "4.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true }, "node_modules/lodash.isplainobject": { "version": "4.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isundefined": { - "version": "3.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true }, "node_modules/lodash.kebabcase": { "version": "4.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/lodash.mergewith": { "version": "4.6.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true }, "node_modules/lodash.snakecase": { "version": "4.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true }, "node_modules/lodash.startcase": { "version": "4.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, "node_modules/lodash.uniq": { "version": "4.5.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true }, "node_modules/lodash.upperfirst": { "version": "4.3.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true }, "node_modules/log-symbols": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -9422,8 +11223,9 @@ }, "node_modules/log-update": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, - "license": "MIT", "dependencies": { "ansi-escapes": "^4.3.0", "cli-cursor": "^3.1.0", @@ -9439,16 +11241,18 @@ }, "node_modules/log-update/node_modules/is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/log-update/node_modules/slice-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -9463,8 +11267,9 @@ }, "node_modules/log-update/node_modules/wrap-ansi": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -9476,7 +11281,8 @@ }, "node_modules/logform": { "version": "2.5.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", "dependencies": { "@colors/colors": "1.5.0", "@types/triple-beam": "^1.3.2", @@ -9488,21 +11294,24 @@ }, "node_modules/loupe": { "version": "2.3.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "dependencies": { "get-func-name": "^2.0.0" } }, "node_modules/lru-cache": { "version": "5.1.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/make-dir": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -9513,27 +11322,31 @@ }, "node_modules/make-dir/node_modules/pify": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "engines": { "node": ">=6" } }, "node_modules/make-dir/node_modules/semver": { "version": "5.7.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "bin": { "semver": "bin/semver" } }, "node_modules/make-error": { "version": "1.3.6", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true }, "node_modules/make-fetch-happen": { "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, - "license": "ISC", "dependencies": { "agentkeepalive": "^4.2.1", "cacache": "^16.1.0", @@ -9558,16 +11371,18 @@ }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/map-obj": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -9577,8 +11392,9 @@ }, "node_modules/meow": { "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -9599,128 +11415,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, - "node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, "node_modules/meow/node_modules/type-fest": { "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -9730,12 +11429,15 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, "engines": { "node": ">= 8" } @@ -9748,7 +11450,9 @@ }, "node_modules/micromatch": { "version": "4.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -9759,14 +11463,18 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -9776,23 +11484,27 @@ }, "node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/min-indent": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/minimatch": { "version": "3.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9802,16 +11514,18 @@ }, "node_modules/minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minimist-options": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, - "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -9823,8 +11537,9 @@ }, "node_modules/minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -9834,8 +11549,9 @@ }, "node_modules/minipass-collect": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -9845,8 +11561,9 @@ }, "node_modules/minipass-fetch": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, - "license": "MIT", "dependencies": { "minipass": "^3.1.6", "minipass-sized": "^1.0.3", @@ -9861,8 +11578,9 @@ }, "node_modules/minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -9872,8 +11590,9 @@ }, "node_modules/minipass-json-stream": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", "dev": true, - "license": "MIT", "dependencies": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" @@ -9881,8 +11600,9 @@ }, "node_modules/minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -9892,8 +11612,9 @@ }, "node_modules/minipass-sized": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.0.0" }, @@ -9903,13 +11624,15 @@ }, "node_modules/minipass/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, - "license": "MIT", "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -9920,13 +11643,15 @@ }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" }, @@ -9936,8 +11661,9 @@ }, "node_modules/mkdirp-infer-owner": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", + "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", "dev": true, - "license": "ISC", "dependencies": { "chownr": "^2.0.0", "infer-owner": "^1.0.4", @@ -9949,7 +11675,8 @@ }, "node_modules/mocha": { "version": "10.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -9987,7 +11714,8 @@ }, "node_modules/mocha/node_modules/glob": { "version": "7.2.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10005,7 +11733,8 @@ }, "node_modules/mocha/node_modules/glob/node_modules/minimatch": { "version": "3.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10015,7 +11744,8 @@ }, "node_modules/mocha/node_modules/minimatch": { "version": "5.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10025,18 +11755,21 @@ }, "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { "has-flag": "^4.0.0" }, @@ -10049,7 +11782,8 @@ }, "node_modules/mocha/node_modules/yargs": { "version": "16.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -10065,20 +11799,23 @@ }, "node_modules/modify-values": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/ms": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multimatch": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", "dev": true, - "license": "MIT", "dependencies": { "@types/minimatch": "^3.0.3", "array-differ": "^3.0.0", @@ -10095,20 +11832,23 @@ }, "node_modules/multimatch/node_modules/arrify": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/mute-stream": { "version": "0.0.8", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true }, "node_modules/nanoid": { "version": "3.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10118,31 +11858,36 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/natural-compare-lite": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true }, "node_modules/negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true }, "node_modules/nise": { "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^10.0.2", @@ -10153,13 +11898,15 @@ }, "node_modules/node-addon-api": { "version": "3.2.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true }, "node_modules/node-fetch": { - "version": "2.6.9", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dev": true, - "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -10175,29 +11922,11 @@ } } }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-gyp": { "version": "9.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", + "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", "dev": true, - "license": "MIT", "dependencies": { "env-paths": "^2.2.0", "glob": "^7.1.4", @@ -10219,8 +11948,9 @@ }, "node_modules/node-gyp-build": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", "dev": true, - "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -10229,8 +11959,9 @@ }, "node_modules/node-gyp/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10248,8 +11979,9 @@ }, "node_modules/node-gyp/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -10259,8 +11991,9 @@ }, "node_modules/node-gyp/node_modules/nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, - "license": "ISC", "dependencies": { "abbrev": "^1.0.0" }, @@ -10272,9 +12005,10 @@ } }, "node_modules/node-gyp/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10287,13 +12021,15 @@ }, "node_modules/node-gyp/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/node-preload": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, - "license": "MIT", "dependencies": { "process-on-spawn": "^1.0.0" }, @@ -10302,13 +12038,15 @@ } }, "node_modules/node-releases": { - "version": "2.0.10", - "license": "MIT" + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.11.tgz", + "integrity": "sha512-+M0PwXeU80kRohZ3aT4J/OnR+l9/KD2nVLNNoRgFtnf+umQVFdGBAO2N8+nCnEi0xlh/Wk3zOGC+vNNx+uM79Q==" }, "node_modules/nopt": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, - "license": "ISC", "dependencies": { "abbrev": "1" }, @@ -10321,8 +12059,9 @@ }, "node_modules/normalize-package-data": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -10335,8 +12074,9 @@ }, "node_modules/normalize-package-data/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -10345,9 +12085,10 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10360,28 +12101,32 @@ }, "node_modules/normalize-package-data/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/normalize-path": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-bundled": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "dev": true, - "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^1.0.1" } }, "node_modules/npm-install-checks": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "semver": "^7.1.1" }, @@ -10391,8 +12136,9 @@ }, "node_modules/npm-install-checks/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -10401,9 +12147,10 @@ } }, "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10416,18 +12163,21 @@ }, "node_modules/npm-install-checks/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/npm-normalize-package-bin": { "version": "1.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true }, "node_modules/npm-package-arg": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.1.tgz", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", "dev": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^3.0.6", "semver": "^7.0.0", @@ -10439,13 +12189,15 @@ }, "node_modules/npm-package-arg/node_modules/builtins": { "version": "1.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", + "dev": true }, "node_modules/npm-package-arg/node_modules/hosted-git-info": { "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10455,8 +12207,9 @@ }, "node_modules/npm-package-arg/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -10465,9 +12218,10 @@ } }, "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10480,21 +12234,24 @@ }, "node_modules/npm-package-arg/node_modules/validate-npm-package-name": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, - "license": "ISC", "dependencies": { "builtins": "^1.0.3" } }, "node_modules/npm-package-arg/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/npm-packlist": { "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^8.0.1", "ignore-walk": "^5.0.1", @@ -10510,8 +12267,9 @@ }, "node_modules/npm-packlist/node_modules/npm-bundled": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", "dev": true, - "license": "ISC", "dependencies": { "npm-normalize-package-bin": "^2.0.0" }, @@ -10521,16 +12279,18 @@ }, "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, - "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/npm-pick-manifest": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz", + "integrity": "sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw==", "dev": true, - "license": "ISC", "dependencies": { "npm-install-checks": "^5.0.0", "npm-normalize-package-bin": "^2.0.0", @@ -10543,8 +12303,9 @@ }, "node_modules/npm-pick-manifest/node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -10554,24 +12315,27 @@ }, "node_modules/npm-pick-manifest/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, - "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/npm-pick-manifest/node_modules/npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^5.0.0", "proc-log": "^2.0.1", @@ -10583,9 +12347,10 @@ } }, "node_modules/npm-pick-manifest/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10598,8 +12363,9 @@ }, "node_modules/npm-pick-manifest/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -10609,13 +12375,15 @@ }, "node_modules/npm-pick-manifest/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/npm-registry-fetch": { "version": "13.3.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", "dev": true, - "license": "ISC", "dependencies": { "make-fetch-happen": "^10.0.6", "minipass": "^3.1.6", @@ -10631,8 +12399,9 @@ }, "node_modules/npm-registry-fetch/node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -10642,16 +12411,18 @@ }, "node_modules/npm-registry-fetch/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^5.0.0", "proc-log": "^2.0.1", @@ -10663,9 +12434,10 @@ } }, "node_modules/npm-registry-fetch/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10678,8 +12450,9 @@ }, "node_modules/npm-registry-fetch/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -10689,13 +12462,15 @@ }, "node_modules/npm-registry-fetch/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -10705,8 +12480,9 @@ }, "node_modules/npmlog": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, - "license": "ISC", "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", @@ -10717,15 +12493,12 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/nwsapi": { - "version": "2.2.2", - "license": "MIT" - }, "node_modules/nx": { "version": "15.7.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.7.1.tgz", + "integrity": "sha512-8Gtqazww3rCWxJ+pgB3JDU6hQeA+qRMYh77mXvf5CFQPszqEqvvuiJtKzcieWjxn/IZpeyVRjmPypkEOM6BbHw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "dependencies": { "@nrwl/cli": "15.7.1", "@nrwl/tao": "15.7.1", @@ -10792,8 +12565,9 @@ }, "node_modules/nx/node_modules/fast-glob": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -10807,8 +12581,9 @@ }, "node_modules/nx/node_modules/glob": { "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10823,8 +12598,9 @@ }, "node_modules/nx/node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -10834,8 +12610,9 @@ }, "node_modules/nx/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -10845,8 +12622,9 @@ }, "node_modules/nx/node_modules/minimatch": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10856,8 +12634,9 @@ }, "node_modules/nx/node_modules/semver": { "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -10868,23 +12647,49 @@ "node": ">=10" } }, + "node_modules/nx/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nx/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/nx/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/nx/node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/nyc": { "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", @@ -10923,8 +12728,9 @@ }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -10933,8 +12739,9 @@ }, "node_modules/nyc/node_modules/find-cache-dir": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -10949,8 +12756,9 @@ }, "node_modules/nyc/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -10961,8 +12769,9 @@ }, "node_modules/nyc/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10980,8 +12789,9 @@ }, "node_modules/nyc/node_modules/istanbul-lib-instrument": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", @@ -10994,8 +12804,9 @@ }, "node_modules/nyc/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -11005,8 +12816,9 @@ }, "node_modules/nyc/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -11019,8 +12831,9 @@ }, "node_modules/nyc/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -11033,8 +12846,9 @@ }, "node_modules/nyc/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -11044,8 +12858,9 @@ }, "node_modules/nyc/node_modules/p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -11055,8 +12870,9 @@ }, "node_modules/nyc/node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -11066,8 +12882,9 @@ }, "node_modules/nyc/node_modules/wrap-ansi": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11079,13 +12896,15 @@ }, "node_modules/nyc/node_modules/y18n": { "version": "4.0.3", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true }, "node_modules/nyc/node_modules/yargs": { "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -11105,8 +12924,9 @@ }, "node_modules/nyc/node_modules/yargs-parser": { "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -11117,30 +12937,78 @@ }, "node_modules/object-inspect": { "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, - "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { "version": "1.4.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } }, "node_modules/one-time": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "dependencies": { "fn.name": "1.x.x" } }, "node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -11153,8 +13021,9 @@ }, "node_modules/open": { "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, - "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -11169,8 +13038,9 @@ }, "node_modules/optionator": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -11185,8 +13055,9 @@ }, "node_modules/ora": { "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, - "license": "MIT", "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", @@ -11205,29 +13076,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/original-require": { - "version": "1.0.1", - "license": "MIT" - }, "node_modules/os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/p-finally": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/p-limit": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -11240,7 +13110,8 @@ }, "node_modules/p-locate": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { "p-limit": "^3.0.2" }, @@ -11253,8 +13124,9 @@ }, "node_modules/p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -11267,16 +13139,18 @@ }, "node_modules/p-map-series": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", + "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/p-pipe": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -11286,8 +13160,9 @@ }, "node_modules/p-queue": { "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", "dev": true, - "license": "MIT", "dependencies": { "eventemitter3": "^4.0.4", "p-timeout": "^3.2.0" @@ -11301,16 +13176,18 @@ }, "node_modules/p-reduce": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/p-timeout": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "dev": true, - "license": "MIT", "dependencies": { "p-finally": "^1.0.0" }, @@ -11320,15 +13197,17 @@ }, "node_modules/p-try": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "engines": { "node": ">=6" } }, "node_modules/p-waterfall": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz", + "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", "dev": true, - "license": "MIT", "dependencies": { "p-reduce": "^2.0.0" }, @@ -11341,8 +13220,9 @@ }, "node_modules/package-hash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, - "license": "ISC", "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", @@ -11355,8 +13235,9 @@ }, "node_modules/pacote": { "version": "13.6.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", + "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", "dev": true, - "license": "ISC", "dependencies": { "@npmcli/git": "^3.0.0", "@npmcli/installed-package-contents": "^1.0.7", @@ -11389,8 +13270,9 @@ }, "node_modules/pacote/node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -11400,16 +13282,18 @@ }, "node_modules/pacote/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/pacote/node_modules/npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, - "license": "ISC", "dependencies": { "hosted-git-info": "^5.0.0", "proc-log": "^2.0.1", @@ -11421,9 +13305,10 @@ } }, "node_modules/pacote/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -11436,8 +13321,9 @@ }, "node_modules/pacote/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -11447,13 +13333,15 @@ }, "node_modules/pacote/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -11463,8 +13351,9 @@ }, "node_modules/parse-conflict-json": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz", + "integrity": "sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==", "dev": true, - "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^2.3.1", "just-diff": "^5.0.1", @@ -11476,8 +13365,9 @@ }, "node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -11493,90 +13383,93 @@ }, "node_modules/parse-json/node_modules/lines-and-columns": { "version": "1.2.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/parse-path": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, - "license": "MIT", "dependencies": { "protocols": "^2.0.0" } }, "node_modules/parse-url": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, - "license": "MIT", "dependencies": { "parse-path": "^7.0.0" } }, - "node_modules/parse5": { - "version": "7.1.2", - "license": "MIT", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, "node_modules/path-exists": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, - "license": "MIT", "dependencies": { "isarray": "0.0.1" } }, "node_modules/path-type": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, "engines": { "node": ">=8" } }, "node_modules/pathval": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "engines": { "node": "*" } }, "node_modules/picocolors": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -11586,8 +13479,9 @@ }, "node_modules/pidtree": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true, - "license": "MIT", "bin": { "pidtree": "bin/pidtree.js" }, @@ -11597,8 +13491,9 @@ }, "node_modules/pify": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -11608,14 +13503,16 @@ }, "node_modules/pirates": { "version": "4.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dependencies": { "find-up": "^3.0.0" }, @@ -11625,7 +13522,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dependencies": { "locate-path": "^3.0.0" }, @@ -11635,7 +13533,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -11646,7 +13545,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { "p-try": "^2.0.0" }, @@ -11659,7 +13559,8 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dependencies": { "p-limit": "^2.0.0" }, @@ -11669,23 +13570,35 @@ }, "node_modules/pkg-dir/node_modules/path-exists": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, "engines": { "node": ">=4" } }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -11698,21 +13611,24 @@ }, "node_modules/proc-log": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "dev": true, - "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/process-nextick-args": { "version": "2.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true }, "node_modules/process-on-spawn": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, - "license": "MIT", "dependencies": { "fromentries": "^1.2.0" }, @@ -11722,29 +13638,33 @@ }, "node_modules/promise-all-reject-late": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", "dev": true, - "license": "ISC", "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/promise-call-limit": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", + "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", "dev": true, - "license": "ISC", "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/promise-inflight": { "version": "1.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true }, "node_modules/promise-retry": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, - "license": "MIT", "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -11755,53 +13675,54 @@ }, "node_modules/promzard": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", + "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==", "dev": true, - "license": "ISC", "dependencies": { "read": "1" } }, "node_modules/proto-list": { "version": "1.2.4", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true }, "node_modules/protocols": { "version": "2.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", + "dev": true }, "node_modules/proxy-from-env": { "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/psl": { - "version": "1.9.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true }, "node_modules/punycode": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { "node": ">=6" } }, "node_modules/q": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6.0", "teleport": ">=0.2.0" } }, - "node_modules/querystringify": { - "version": "2.2.0", - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -11815,28 +13736,30 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/quick-lru": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/randombytes": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/read": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", "dev": true, - "license": "ISC", "dependencies": { "mute-stream": "~0.0.4" }, @@ -11846,16 +13769,18 @@ }, "node_modules/read-cmd-shim": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-3.0.1.tgz", + "integrity": "sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==", "dev": true, - "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/read-package-json": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", + "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^8.0.1", "json-parse-even-better-errors": "^2.3.1", @@ -11868,8 +13793,9 @@ }, "node_modules/read-package-json-fast": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", "dev": true, - "license": "ISC", "dependencies": { "json-parse-even-better-errors": "^2.3.0", "npm-normalize-package-bin": "^1.0.1" @@ -11880,8 +13806,9 @@ }, "node_modules/read-package-json/node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -11891,16 +13818,18 @@ }, "node_modules/read-package-json/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/read-package-json/node_modules/normalize-package-data": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^5.0.0", "is-core-module": "^2.8.1", @@ -11913,16 +13842,18 @@ }, "node_modules/read-package-json/node_modules/npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true, - "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/read-package-json/node_modules/semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -11935,8 +13866,9 @@ }, "node_modules/read-package-json/node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -11946,13 +13878,15 @@ }, "node_modules/read-package-json/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/read-pkg": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, - "license": "MIT", "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", @@ -11963,87 +13897,145 @@ } }, "node_modules/read-pkg-up": { - "version": "3.0.0", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, - "license": "MIT", "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { - "locate-path": "^2.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, + "node_modules/read-pkg-up/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { - "p-try": "^1.0.0" + "p-try": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { - "p-limit": "^1.1.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, - "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", + "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "node_modules/read-pkg/node_modules/load-json-file": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -12056,8 +14048,9 @@ }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -12067,8 +14060,9 @@ }, "node_modules/read-pkg/node_modules/parse-json": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, - "license": "MIT", "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -12079,8 +14073,9 @@ }, "node_modules/read-pkg/node_modules/path-type": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^3.0.0" }, @@ -12090,31 +14085,35 @@ }, "node_modules/read-pkg/node_modules/pify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/read-pkg/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/readable-stream": { - "version": "3.6.1", - "license": "MIT", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -12126,8 +14125,10 @@ }, "node_modules/readdir-scoped-modules": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, - "license": "ISC", "dependencies": { "debuglog": "^1.0.1", "dezalgo": "^1.0.0", @@ -12137,7 +14138,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -12145,19 +14147,11 @@ "node": ">=8.10.0" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/redent": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, - "license": "MIT", "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -12168,11 +14162,13 @@ }, "node_modules/regenerate": { "version": "1.4.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { "version": "10.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dependencies": { "regenerate": "^1.4.2" }, @@ -12182,19 +14178,48 @@ }, "node_modules/regenerator-runtime": { "version": "0.13.9", - "license": "MIT" + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "node_modules/regenerator-transform": { "version": "0.15.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dependencies": { "@babel/runtime": "^7.8.4" } }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -12203,8 +14228,9 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.1", - "license": "MIT", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", @@ -12219,7 +14245,8 @@ }, "node_modules/regjsparser": { "version": "0.9.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dependencies": { "jsesc": "~0.5.0" }, @@ -12229,14 +14256,17 @@ }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "bin": { "jsesc": "bin/jsesc" } }, "node_modules/release-zalgo": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, - "license": "ISC", "dependencies": { "es6-error": "^4.0.1" }, @@ -12246,33 +14276,32 @@ }, "node_modules/require-directory": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "dev": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/requires-port": { - "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "node_modules/resolve": { - "version": "1.22.1", - "license": "MIT", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -12285,8 +14314,9 @@ }, "node_modules/resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, - "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, @@ -12296,16 +14326,18 @@ }, "node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-global": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, - "license": "MIT", "dependencies": { "global-dirs": "^0.1.1" }, @@ -12315,8 +14347,9 @@ }, "node_modules/restore-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "license": "MIT", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -12327,15 +14360,18 @@ }, "node_modules/retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/reusify": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -12343,13 +14379,15 @@ }, "node_modules/rfdc": { "version": "1.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -12362,8 +14400,9 @@ }, "node_modules/rimraf/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12379,16 +14418,35 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -12403,25 +14461,23 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, - "node_modules/rw": { - "version": "1.3.3", - "license": "BSD-3-Clause" - }, "node_modules/rxjs": { - "version": "7.8.0", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -12435,56 +14491,76 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] + }, + "node_modules/safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "dependencies": { + "regexp-tree": "~0.1.1" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/safe-stable-stringify": { - "version": "2.4.2", - "license": "MIT", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", "engines": { "node": ">=10" } }, "node_modules/safer-buffer": { "version": "2.1.2", - "license": "MIT" - }, - "node_modules/saxes": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "node_modules/seedrandom": { "version": "3.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" }, "node_modules/semver": { "version": "6.3.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/serialize-javascript": { "version": "6.0.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/set-blocking": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true }, "node_modules/shallow-clone": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dependencies": { "kind-of": "^6.0.2" }, @@ -12494,8 +14570,9 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -12505,65 +14582,51 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "license": "BSD-3-Clause", - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/shelljs/node_modules/glob": { - "version": "7.2.3", - "license": "ISC", + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { "version": "3.0.7", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/simple-swizzle": { "version": "0.2.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dependencies": { "is-arrayish": "^0.3.1" } }, "node_modules/simple-swizzle/node_modules/is-arrayish": { "version": "0.3.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" }, "node_modules/sinon": { "version": "15.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz", + "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "10.0.2", @@ -12579,15 +14642,18 @@ }, "node_modules/slash": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" @@ -12601,8 +14667,9 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -12612,8 +14679,9 @@ }, "node_modules/smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -12621,8 +14689,9 @@ }, "node_modules/socks": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, - "license": "MIT", "dependencies": { "ip": "^2.0.0", "smart-buffer": "^4.2.0" @@ -12634,8 +14703,9 @@ }, "node_modules/socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.3", @@ -12647,8 +14717,9 @@ }, "node_modules/sort-keys": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", + "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", "dev": true, - "license": "MIT", "dependencies": { "is-plain-obj": "^2.0.0" }, @@ -12661,38 +14732,35 @@ }, "node_modules/sort-keys/node_modules/is-plain-obj": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", - "license": "MIT", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/spawn-wrap": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", @@ -12707,8 +14775,9 @@ }, "node_modules/spawn-wrap/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -12721,8 +14790,9 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -12730,27 +14800,31 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", - "dev": true, - "license": "CC-BY-3.0" + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.12", - "dev": true, - "license": "CC0-1.0" + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true }, "node_modules/split": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, - "license": "MIT", "dependencies": { "through": "2" }, @@ -12760,21 +14834,24 @@ }, "node_modules/split2": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, - "license": "ISC", "dependencies": { "readable-stream": "^3.0.0" } }, "node_modules/sprintf-js": { "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, "node_modules/ssri": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, - "license": "ISC", "dependencies": { "minipass": "^3.1.1" }, @@ -12784,29 +14861,33 @@ }, "node_modules/stack-trace": { "version": "0.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "engines": { "node": "*" } }, "node_modules/string_decoder": { "version": "1.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string-argv": { - "version": "0.3.1", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6.19" } }, "node_modules/string-width": { "version": "4.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -12818,14 +14899,61 @@ }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -12835,24 +14963,27 @@ }, "node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/strip-indent": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, - "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -12862,7 +14993,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "engines": { "node": ">=8" }, @@ -12872,8 +15004,9 @@ }, "node_modules/strong-log-transformer": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "duplexer": "^0.1.1", "minimist": "^1.2.0", @@ -12888,7 +15021,8 @@ }, "node_modules/supports-color": { "version": "7.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, @@ -12898,7 +15032,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { "node": ">= 0.4" }, @@ -12906,18 +15041,79 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "license": "MIT" + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/tar": { - "version": "6.1.13", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, - "license": "ISC", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -12928,8 +15124,9 @@ }, "node_modules/tar-stream": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, - "license": "MIT", "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -12942,30 +15139,34 @@ } }, "node_modules/tar/node_modules/minipass": { - "version": "4.2.4", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "license": "ISC", "engines": { "node": ">=8" } }, "node_modules/tar/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/temp-dir": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -12977,8 +15178,9 @@ }, "node_modules/test-exclude/node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -12996,38 +15198,56 @@ }, "node_modules/text-extensions": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/text-hex": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, "node_modules/text-table": { "version": "0.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/through": { "version": "2.3.8", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true }, "node_modules/through2": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, - "license": "MIT", "dependencies": { "readable-stream": "3" } }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tmp": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, - "license": "MIT", "dependencies": { "rimraf": "^3.0.0" }, @@ -13037,14 +15257,16 @@ }, "node_modules/to-fast-properties": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { "is-number": "^7.0.0" }, @@ -13052,60 +15274,40 @@ "node": ">=8.0" } }, - "node_modules/tough-cookie": { - "version": "4.1.2", - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/tr46": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/treeverse": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-2.0.0.tgz", + "integrity": "sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A==", "dev": true, - "license": "ISC", "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/trim-newlines": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/triple-beam": { "version": "1.3.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, "node_modules/ts-node": { "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, - "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -13146,42 +15348,57 @@ }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/tsconfig-paths": { - "version": "4.1.2", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, - "license": "MIT", "dependencies": { - "json5": "^2.2.2", + "@types/json5": "^0.0.29", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" }, - "engines": { - "node": ">=6" + "bin": { + "json5": "lib/cli.js" } }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { - "version": "2.5.0", - "dev": true, - "license": "0BSD" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==", + "dev": true }, "node_modules/tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -13194,13 +15411,15 @@ }, "node_modules/tsutils/node_modules/tslib": { "version": "1.14.1", - "dev": true, - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -13210,15 +15429,16 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "engines": { "node": ">=4" } }, "node_modules/type-fest": { - "version": "0.21.3", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "engines": { "node": ">=10" }, @@ -13226,23 +15446,49 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", + "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", + "dev": true, + "optionalDependencies": { + "rxjs": "*" + } + }, "node_modules/typedarray": { "version": "0.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, - "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typescript": { "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13253,8 +15499,9 @@ }, "node_modules/uglify-js": { "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -13263,16 +15510,33 @@ "node": ">=0.8.0" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -13283,22 +15547,25 @@ }, "node_modules/unicode-match-property-value-ecmascript": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "engines": { "node": ">=4" } }, "node_modules/unique-filename": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, - "license": "ISC", "dependencies": { "unique-slug": "^3.0.0" }, @@ -13308,8 +15575,9 @@ }, "node_modules/unique-slug": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4" }, @@ -13319,27 +15587,41 @@ }, "node_modules/universal-user-agent": { "version": "6.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true }, "node_modules/universalify": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { "node": ">= 10.0.0" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/upath": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "dev": true, - "license": "MIT", "engines": { "node": ">=4", "yarn": "*" } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "funding": [ { "type": "opencollective", @@ -13348,15 +15630,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -13364,46 +15649,43 @@ }, "node_modules/uri-js": { "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/url-parse": { - "version": "1.5.10", - "license": "MIT", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true, - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache": { "version": "2.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true }, "node_modules/validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -13411,8 +15693,9 @@ }, "node_modules/validate-npm-package-name": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, - "license": "ISC", "dependencies": { "builtins": "^5.0.0" }, @@ -13420,78 +15703,42 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/w3c-xmlserializer": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/walk-up-path": { "version": "1.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", + "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", + "dev": true }, "node_modules/wcwidth": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, - "license": "MIT", "dependencies": { "defaults": "^1.0.3" } }, "node_modules/webidl-conversions": { - "version": "7.0.0", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "iconv-lite": "0.6.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - } + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/whatwg-url": { - "version": "11.0.0", - "license": "MIT", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -13502,22 +15749,61 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-module": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "dev": true, - "license": "ISC" + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "node_modules/winston": { "version": "3.8.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", + "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", "dependencies": { "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", @@ -13537,7 +15823,8 @@ }, "node_modules/winston-transport": { "version": "4.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "dependencies": { "logform": "^2.3.2", "readable-stream": "^3.6.0", @@ -13549,23 +15836,28 @@ }, "node_modules/word-wrap": { "version": "1.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/wordwrap": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true }, "node_modules/workerpool": { "version": "6.2.1", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "node_modules/wrap-ansi": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -13580,12 +15872,14 @@ }, "node_modules/wrappy": { "version": "1.0.2", - "license": "ISC" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -13596,8 +15890,9 @@ }, "node_modules/write-json-file": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-4.3.0.tgz", + "integrity": "sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ==", "dev": true, - "license": "MIT", "dependencies": { "detect-indent": "^6.0.0", "graceful-fs": "^4.1.15", @@ -13615,16 +15910,18 @@ }, "node_modules/write-json-file/node_modules/is-plain-obj": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/write-json-file/node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -13637,8 +15934,9 @@ }, "node_modules/write-json-file/node_modules/write-file-atomic": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -13648,8 +15946,9 @@ }, "node_modules/write-pkg": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", + "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", "dev": true, - "license": "MIT", "dependencies": { "sort-keys": "^2.0.0", "type-fest": "^0.4.1", @@ -13661,24 +15960,27 @@ }, "node_modules/write-pkg/node_modules/detect-indent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/write-pkg/node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/write-pkg/node_modules/sort-keys": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", "dev": true, - "license": "MIT", "dependencies": { "is-plain-obj": "^1.0.0" }, @@ -13688,16 +15990,18 @@ }, "node_modules/write-pkg/node_modules/type-fest": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=6" } }, "node_modules/write-pkg/node_modules/write-file-atomic": { "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, - "license": "ISC", "dependencies": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", @@ -13706,8 +16010,9 @@ }, "node_modules/write-pkg/node_modules/write-json-file": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", + "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", "dev": true, - "license": "MIT", "dependencies": { "detect-indent": "^5.0.0", "graceful-fs": "^4.1.15", @@ -13720,74 +16025,41 @@ "node": ">=6" } }, - "node_modules/ws": { - "version": "8.12.1", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "license": "Apache-2.0", - "engines": { - "node": ">=12" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/xtend": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4" } }, "node_modules/y18n": { "version": "5.0.8", - "license": "ISC", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "engines": { "node": ">=10" } }, "node_modules/yallist": { "version": "3.1.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { - "version": "2.2.1", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", "dev": true, - "license": "ISC", "engines": { "node": ">= 14" } }, "node_modules/yargs": { - "version": "17.7.1", - "dev": true, - "license": "MIT", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -13803,14 +16075,16 @@ }, "node_modules/yargs-parser": { "version": "20.2.4", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "engines": { "node": ">=10" } }, "node_modules/yargs-unparser": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -13823,7 +16097,8 @@ }, "node_modules/yargs-unparser/node_modules/camelcase": { "version": "6.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { "node": ">=10" }, @@ -13833,7 +16108,8 @@ }, "node_modules/yargs-unparser/node_modules/decamelize": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "engines": { "node": ">=10" }, @@ -13843,15 +16119,16 @@ }, "node_modules/yargs-unparser/node_modules/is-plain-obj": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/cliui": { "version": "8.0.1", - "dev": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -13863,50 +16140,81 @@ }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", - "dev": true, - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "tools/javascript": { + "name": "@syntest/javascript", + "version": "0.0.1", + "license": "Apache-2.0", + "dependencies": { + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/analysis-javascript": "^0.1.0-beta.4", + "@syntest/base-language": "^0.2.0-beta.28", + "@syntest/cli-graphics": "^0.1.0-beta.3", + "@syntest/instrumentation-javascript": "^0.1.0-beta.2", + "@syntest/logging": "^0.1.0-beta.6", + "@syntest/metric": "^0.1.0-beta.5", + "@syntest/module": "^0.1.0-beta.15", + "@syntest/search": "^0.4.0-beta.25", + "@syntest/search-javascript": "*", + "yargs": "^17.7.2" + }, + "engines": { + "node": ">=10.24.0" + } } }, "dependencies": { "@ampproject/remapping": { - "version": "2.2.0", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@babel/code-frame": { - "version": "7.18.6", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "requires": { "@babel/highlight": "^7.18.6" } }, "@babel/compat-data": { - "version": "7.21.0" + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.9.tgz", + "integrity": "sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==" }, "@babel/core": { "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", @@ -13926,69 +16234,74 @@ } }, "@babel/generator": { - "version": "7.21.1", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", + "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", "requires": { - "@babel/types": "^7.21.0", + "@babel/types": "^7.21.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@babel/helper-annotate-as-pure": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", + "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/types": "^7.21.5" } }, "@babel/helper-compilation-targets": { - "version": "7.20.7", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", + "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", + "@babel/compat-data": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.21.0", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", + "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", + "@babel/helper-member-expression-to-functions": "^7.21.5", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-replace-supers": "^7.21.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-split-export-declaration": "^7.18.6", + "semver": "^6.3.0" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.21.0", + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", + "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" + "regexpu-core": "^5.3.1", + "semver": "^6.3.0" } }, "@babel/helper-define-polyfill-provider": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", + "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", "requires": { "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", @@ -13999,16 +16312,14 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9" - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "requires": { - "@babel/types": "^7.18.6" - } + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==" }, "@babel/helper-function-name": { "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "requires": { "@babel/template": "^7.20.7", "@babel/types": "^7.21.0" @@ -14016,46 +16327,60 @@ }, "@babel/helper-hoist-variables": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.21.0", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", + "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", "requires": { - "@babel/types": "^7.21.0" + "@babel/types": "^7.21.5" } }, "@babel/helper-module-imports": { - "version": "7.18.6", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" } }, "@babel/helper-module-transforms": { - "version": "7.21.2", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" } }, "@babel/helper-optimise-call-expression": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-plugin-utils": { - "version": "7.20.2" + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==" }, "@babel/helper-remap-async-to-generator": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", + "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.9", @@ -14064,45 +16389,61 @@ } }, "@babel/helper-replace-supers": { - "version": "7.20.7", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", + "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-member-expression-to-functions": "^7.21.5", "@babel/helper-optimise-call-expression": "^7.18.6", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" } }, "@babel/helper-simple-access": { - "version": "7.20.2", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "requires": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.21.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", "requires": { "@babel/types": "^7.20.0" } }, "@babel/helper-split-export-declaration": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "requires": { "@babel/types": "^7.18.6" } }, "@babel/helper-string-parser": { - "version": "7.19.4" + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==" }, "@babel/helper-validator-identifier": { - "version": "7.19.1" + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/helper-validator-option": { - "version": "7.21.0" + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==" }, "@babel/helper-wrap-function": { "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", + "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", "requires": { "@babel/helper-function-name": "^7.19.0", "@babel/template": "^7.18.10", @@ -14111,15 +16452,19 @@ } }, "@babel/helpers": { - "version": "7.21.0", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", + "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", "requires": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" } }, "@babel/highlight": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "requires": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -14128,12 +16473,16 @@ "dependencies": { "ansi-styles": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -14142,21 +16491,31 @@ }, "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.3" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "escape-string-regexp": { - "version": "1.0.5" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "has-flag": { - "version": "3.0.0" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" }, "supports-color": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "requires": { "has-flag": "^3.0.0" } @@ -14164,16 +16523,22 @@ } }, "@babel/parser": { - "version": "7.21.2" + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", + "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==" }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", + "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", + "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", @@ -14182,6 +16547,8 @@ }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-plugin-utils": "^7.20.2", @@ -14191,6 +16558,8 @@ }, "@babel/plugin-proposal-class-properties": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -14198,6 +16567,8 @@ }, "@babel/plugin-proposal-class-static-block": { "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", + "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", "requires": { "@babel/helper-create-class-features-plugin": "^7.21.0", "@babel/helper-plugin-utils": "^7.20.2", @@ -14206,6 +16577,8 @@ }, "@babel/plugin-proposal-dynamic-import": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", + "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -14213,6 +16586,8 @@ }, "@babel/plugin-proposal-export-namespace-from": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", + "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", "requires": { "@babel/helper-plugin-utils": "^7.18.9", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -14220,6 +16595,8 @@ }, "@babel/plugin-proposal-json-strings": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", + "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -14227,6 +16604,8 @@ }, "@babel/plugin-proposal-logical-assignment-operators": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", + "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -14234,6 +16613,8 @@ }, "@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -14241,6 +16622,8 @@ }, "@babel/plugin-proposal-numeric-separator": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -14248,6 +16631,8 @@ }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "requires": { "@babel/compat-data": "^7.20.5", "@babel/helper-compilation-targets": "^7.20.7", @@ -14258,6 +16643,8 @@ }, "@babel/plugin-proposal-optional-catch-binding": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", + "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -14265,6 +16652,8 @@ }, "@babel/plugin-proposal-optional-chaining": { "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", @@ -14273,6 +16662,8 @@ }, "@babel/plugin-proposal-private-methods": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -14280,6 +16671,8 @@ }, "@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", + "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.21.0", @@ -14289,6 +16682,8 @@ }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -14296,102 +16691,136 @@ }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-class-static-block": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-export-namespace-from": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.3" } }, "@babel/plugin-syntax-import-assertions": { "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", + "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", "requires": { "@babel/helper-plugin-utils": "^7.19.0" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", + "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-async-to-generator": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", + "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", "requires": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.20.2", @@ -14400,18 +16829,24 @@ }, "@babel/plugin-transform-block-scoped-functions": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", + "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-block-scoping": { "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", + "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-classes": { "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", + "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-compilation-targets": "^7.20.7", @@ -14422,23 +16857,36 @@ "@babel/helper-replace-supers": "^7.20.7", "@babel/helper-split-export-declaration": "^7.18.6", "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.20.7", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", + "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", "requires": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/template": "^7.20.7" } }, "@babel/plugin-transform-destructuring": { - "version": "7.20.7", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", + "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-dotall-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", + "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -14446,25 +16894,33 @@ }, "@babel/plugin-transform-duplicate-keys": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", + "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-exponentiation-operator": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", + "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-for-of": { - "version": "7.21.0", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", + "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", "requires": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-function-name": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", + "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", "requires": { "@babel/helper-compilation-targets": "^7.18.9", "@babel/helper-function-name": "^7.18.9", @@ -14473,33 +16929,43 @@ }, "@babel/plugin-transform-literals": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", + "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-member-expression-literals": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", + "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-modules-amd": { "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", + "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", "requires": { "@babel/helper-module-transforms": "^7.20.11", "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", "requires": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" } }, "@babel/plugin-transform-modules-systemjs": { "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", + "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", "requires": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.20.11", @@ -14509,6 +16975,8 @@ }, "@babel/plugin-transform-modules-umd": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", + "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -14516,6 +16984,8 @@ }, "@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", + "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.20.5", "@babel/helper-plugin-utils": "^7.20.2" @@ -14523,50 +16993,66 @@ }, "@babel/plugin-transform-new-target": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", + "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-object-super": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", + "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" } }, "@babel/plugin-transform-parameters": { - "version": "7.20.7", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", + "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", "requires": { "@babel/helper-plugin-utils": "^7.20.2" } }, "@babel/plugin-transform-property-literals": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", + "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-regenerator": { - "version": "7.20.5", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", + "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", "requires": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "regenerator-transform": "^0.15.1" } }, "@babel/plugin-transform-reserved-words": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", + "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-shorthand-properties": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", + "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-spread": { "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", + "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", "requires": { "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" @@ -14574,30 +17060,40 @@ }, "@babel/plugin-transform-sticky-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", + "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", "requires": { "@babel/helper-plugin-utils": "^7.18.6" } }, "@babel/plugin-transform-template-literals": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", + "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-typeof-symbol": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", + "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", "requires": { "@babel/helper-plugin-utils": "^7.18.9" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", + "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.21.5" } }, "@babel/plugin-transform-unicode-regex": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", + "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -14605,6 +17101,8 @@ }, "@babel/preset-env": { "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz", + "integrity": "sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA==", "requires": { "@babel/compat-data": "^7.19.1", "@babel/helper-compilation-targets": "^7.19.1", @@ -14685,6 +17183,8 @@ }, "@babel/preset-modules": { "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -14695,6 +17195,8 @@ }, "@babel/register": { "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz", + "integrity": "sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==", "requires": { "clone-deep": "^4.0.1", "find-cache-dir": "^2.0.0", @@ -14704,55 +17206,78 @@ } }, "@babel/regjsgen": { - "version": "0.8.0" + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "@babel/runtime": { - "version": "7.21.0", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", + "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", "requires": { "regenerator-runtime": "^0.13.11" }, "dependencies": { "regenerator-runtime": { - "version": "0.13.11" + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" } } }, "@babel/template": { - "version": "7.20.7", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" } }, "@babel/traverse": { - "version": "7.21.2", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.1", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.2", - "@babel/types": "^7.21.2", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + } } }, "@babel/types": { - "version": "7.21.2", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "requires": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, "@colors/colors": { - "version": "1.5.0" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" }, "@commitlint/cli": { "version": "17.4.2", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.4.2.tgz", + "integrity": "sha512-0rPGJ2O1owhpxMIXL9YJ2CgPkdrFLKZElIZHXDN8L8+qWK1DGH7Q7IelBT1pchXTYTuDlqkOTdh//aTvT3bSUA==", "dev": true, "requires": { "@commitlint/format": "^17.4.0", @@ -14769,6 +17294,8 @@ }, "@commitlint/config-conventional": { "version": "17.4.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.4.2.tgz", + "integrity": "sha512-JVo1moSj5eDMoql159q8zKCU8lkOhQ+b23Vl3LVVrS6PXDLQIELnJ34ChQmFVbBdSSRNAbbXnRDhosFU+wnuHw==", "dev": true, "requires": { "conventional-changelog-conventionalcommits": "^5.0.0" @@ -14776,6 +17303,8 @@ }, "@commitlint/config-validator": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.4.tgz", + "integrity": "sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==", "dev": true, "requires": { "@commitlint/types": "^17.4.4", @@ -14784,6 +17313,8 @@ }, "@commitlint/ensure": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.4.tgz", + "integrity": "sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==", "dev": true, "requires": { "@commitlint/types": "^17.4.4", @@ -14796,10 +17327,14 @@ }, "@commitlint/execute-rule": { "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", + "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", "dev": true }, "@commitlint/format": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", + "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", "dev": true, "requires": { "@commitlint/types": "^17.4.4", @@ -14807,22 +17342,28 @@ } }, "@commitlint/is-ignored": { - "version": "17.4.4", + "version": "17.6.3", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.6.3.tgz", + "integrity": "sha512-LQbNdnPbxrpbcrVKR5yf51SvquqktpyZJwqXx3lUMF6+nT9PHB8xn3wLy8pi2EQv5Zwba484JnUwDE1ygVYNQA==", "dev": true, "requires": { "@commitlint/types": "^17.4.4", - "semver": "7.3.8" + "semver": "7.5.0" }, "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -14830,22 +17371,28 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@commitlint/lint": { - "version": "17.4.4", + "version": "17.6.3", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.3.tgz", + "integrity": "sha512-fBlXwt6SHJFgm3Tz+luuo3DkydAx9HNC5y4eBqcKuDuMVqHd2ugMNr+bQtx6riv9mXFiPoKp7nE4Xn/ls3iVDA==", "dev": true, "requires": { - "@commitlint/is-ignored": "^17.4.4", + "@commitlint/is-ignored": "^17.6.3", "@commitlint/parse": "^17.4.4", - "@commitlint/rules": "^17.4.4", + "@commitlint/rules": "^17.6.1", "@commitlint/types": "^17.4.4" } }, "@commitlint/load": { - "version": "17.4.4", + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.5.0.tgz", + "integrity": "sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==", "dev": true, "requires": { "@commitlint/config-validator": "^17.4.4", @@ -14861,15 +17408,19 @@ "lodash.uniq": "^4.5.0", "resolve-from": "^5.0.0", "ts-node": "^10.8.1", - "typescript": "^4.6.4" + "typescript": "^4.6.4 || ^5.0.0" } }, "@commitlint/message": { "version": "17.4.2", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", + "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", "dev": true }, "@commitlint/parse": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.4.4.tgz", + "integrity": "sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==", "dev": true, "requires": { "@commitlint/types": "^17.4.4", @@ -14878,18 +17429,22 @@ } }, "@commitlint/read": { - "version": "17.4.4", + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", + "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", "dev": true, "requires": { "@commitlint/top-level": "^17.4.0", "@commitlint/types": "^17.4.4", "fs-extra": "^11.0.0", - "git-raw-commits": "^2.0.0", + "git-raw-commits": "^2.0.11", "minimist": "^1.2.6" } }, "@commitlint/resolve-extends": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz", + "integrity": "sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==", "dev": true, "requires": { "@commitlint/config-validator": "^17.4.4", @@ -14901,7 +17456,9 @@ } }, "@commitlint/rules": { - "version": "17.4.4", + "version": "17.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.6.1.tgz", + "integrity": "sha512-lUdHw6lYQ1RywExXDdLOKxhpp6857/4c95Dc/1BikrHgdysVUXz26yV0vp1GL7Gv+avx9WqZWTIVB7pNouxlfw==", "dev": true, "requires": { "@commitlint/ensure": "^17.4.4", @@ -14913,10 +17470,14 @@ }, "@commitlint/to-lines": { "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", + "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", "dev": true }, "@commitlint/top-level": { "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", + "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", "dev": true, "requires": { "find-up": "^5.0.0" @@ -14924,6 +17485,8 @@ }, "@commitlint/types": { "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", + "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", "dev": true, "requires": { "chalk": "^4.1.0" @@ -14931,6 +17494,8 @@ }, "@cspotcode/source-map-support": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" @@ -14938,6 +17503,8 @@ "dependencies": { "@jridgewell/trace-mapping": { "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", @@ -14948,25 +17515,38 @@ }, "@dabh/diagnostics": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "requires": { "colorspace": "1.1.x", "enabled": "2.0.x", "kuler": "^2.0.0" } }, - "@dagrejs/graphlib": { - "version": "2.1.4", + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "requires": { - "lodash": "^4.11.1" + "eslint-visitor-keys": "^3.3.0" } }, + "@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true + }, "@eslint/eslintrc": { - "version": "1.4.1", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -14977,6 +17557,8 @@ "dependencies": { "ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -14985,62 +17567,30 @@ "uri-js": "^4.2.2" } }, - "globals": { - "version": "13.20.0", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, "json-schema-traverse": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true - }, - "type-fest": { - "version": "0.20.2", - "dev": true - } - } - }, - "@fast-csv/format": { - "version": "4.3.5", - "requires": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.isboolean": "^3.0.3", - "lodash.isequal": "^4.5.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0" - }, - "dependencies": { - "@types/node": { - "version": "14.18.37" } } }, - "@fast-csv/parse": { - "version": "4.3.6", - "requires": { - "@types/node": "^14.0.1", - "lodash.escaperegexp": "^4.1.2", - "lodash.groupby": "^4.6.0", - "lodash.isfunction": "^3.0.9", - "lodash.isnil": "^4.0.0", - "lodash.isundefined": "^3.0.1", - "lodash.uniq": "^4.5.0" - }, - "dependencies": { - "@types/node": { - "version": "14.18.37" - } - } + "@eslint/js": { + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "dev": true }, "@gar/promisify": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "dev": true }, "@humanwhocodes/config-array": { "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -15050,22 +17600,32 @@ }, "@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, "@humanwhocodes/object-schema": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, "@hutson/parse-repository-url": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true }, "@isaacs/string-locale-compare": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", "dev": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -15077,6 +17637,8 @@ "dependencies": { "argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" @@ -15084,6 +17646,8 @@ }, "find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -15092,6 +17656,8 @@ }, "js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -15100,6 +17666,8 @@ }, "locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -15107,6 +17675,8 @@ }, "p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -15114,6 +17684,8 @@ }, "p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -15122,33 +17694,55 @@ } }, "@istanbuljs/schema": { - "version": "0.1.3" + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" }, "@jridgewell/gen-mapping": { - "version": "0.1.1", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/resolve-uri": { - "version": "3.1.0" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { - "version": "1.1.2" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { - "version": "0.3.17", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + } } }, "@lerna/add": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-6.4.1.tgz", + "integrity": "sha512-YSRnMcsdYnQtQQK0NSyrS9YGXvB3jzvx183o+JTH892MKzSlBqwpBHekCknSibyxga1HeZ0SNKQXgsHAwWkrRw==", "dev": true, "requires": { "@lerna/bootstrap": "6.4.1", @@ -15165,13 +17759,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15179,12 +17777,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/bootstrap": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-6.4.1.tgz", + "integrity": "sha512-64cm0mnxzxhUUjH3T19ZSjPdn28vczRhhTXhNAvOhhU0sQgHrroam1xQC1395qbkV3iosSertlu8e7xbXW033w==", "dev": true, "requires": { "@lerna/command": "6.4.1", @@ -15213,13 +17815,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15227,12 +17833,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/changed": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-6.4.1.tgz", + "integrity": "sha512-Z/z0sTm3l/iZW0eTSsnQpcY5d6eOpNO0g4wMOK+hIboWG0QOTc8b28XCnfCUO+33UisKl8PffultgoaHMKkGgw==", "dev": true, "requires": { "@lerna/collect-updates": "6.4.1", @@ -15243,6 +17853,8 @@ }, "@lerna/check-working-tree": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-6.4.1.tgz", + "integrity": "sha512-EnlkA1wxaRLqhJdn9HX7h+JYxqiTK9aWEFOPqAE8lqjxHn3RpM9qBp1bAdL7CeUk3kN1lvxKwDEm0mfcIyMbPA==", "dev": true, "requires": { "@lerna/collect-uncommitted": "6.4.1", @@ -15252,6 +17864,8 @@ }, "@lerna/child-process": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-6.4.1.tgz", + "integrity": "sha512-dvEKK0yKmxOv8pccf3I5D/k+OGiLxQp5KYjsrDtkes2pjpCFfQAMbmpol/Tqx6w/2o2rSaRrLsnX8TENo66FsA==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -15261,6 +17875,8 @@ }, "@lerna/clean": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-6.4.1.tgz", + "integrity": "sha512-FuVyW3mpos5ESCWSkQ1/ViXyEtsZ9k45U66cdM/HnteHQk/XskSQw0sz9R+whrZRUDu6YgYLSoj1j0YAHVK/3A==", "dev": true, "requires": { "@lerna/command": "6.4.1", @@ -15275,6 +17891,8 @@ }, "@lerna/cli": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-6.4.1.tgz", + "integrity": "sha512-2pNa48i2wzFEd9LMPKWI3lkW/3widDqiB7oZUM1Xvm4eAOuDWc9I3RWmAUIVlPQNf3n4McxJCvsZZ9BpQN50Fg==", "dev": true, "requires": { "@lerna/global-options": "6.4.1", @@ -15285,6 +17903,8 @@ "dependencies": { "yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -15300,6 +17920,8 @@ }, "@lerna/collect-uncommitted": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/collect-uncommitted/-/collect-uncommitted-6.4.1.tgz", + "integrity": "sha512-5IVQGhlLrt7Ujc5ooYA1Xlicdba/wMcDSnbQwr8ufeqnzV2z4729pLCVk55gmi6ZienH/YeBPHxhB5u34ofE0Q==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15309,6 +17931,8 @@ }, "@lerna/collect-updates": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-6.4.1.tgz", + "integrity": "sha512-pzw2/FC+nIqYkknUHK9SMmvP3MsLEjxI597p3WV86cEDN3eb1dyGIGuHiKShtjvT08SKSwpTX+3bCYvLVxtC5Q==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15320,6 +17944,8 @@ }, "@lerna/command": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-6.4.1.tgz", + "integrity": "sha512-3Lifj8UTNYbRad8JMP7IFEEdlIyclWyyvq/zvNnTS9kCOEymfmsB3lGXr07/AFoi6qDrvN64j7YSbPZ6C6qonw==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15336,6 +17962,8 @@ }, "@lerna/conventional-commits": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-6.4.1.tgz", + "integrity": "sha512-NIvCOjStjQy5O8VojB7/fVReNNDEJOmzRG2sTpgZ/vNS4AzojBQZ/tobzhm7rVkZZ43R9srZeuhfH9WgFsVUSA==", "dev": true, "requires": { "@lerna/validation-error": "6.4.1", @@ -15352,6 +17980,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -15362,13 +17992,17 @@ }, "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15376,12 +18010,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/create": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-6.4.1.tgz", + "integrity": "sha512-qfQS8PjeGDDlxEvKsI/tYixIFzV2938qLvJohEKWFn64uvdLnXCamQ0wvRJST8p1ZpHWX4AXrB+xEJM3EFABrA==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15404,6 +18042,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -15414,13 +18054,17 @@ }, "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15428,12 +18072,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/create-symlink": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-6.4.1.tgz", + "integrity": "sha512-rNivHFYV1GAULxnaTqeGb2AdEN2OZzAiZcx5CFgj45DWXQEGwPEfpFmCSJdXhFZbyd3K0uiDlAXjAmV56ov3FQ==", "dev": true, "requires": { "cmd-shim": "^5.0.0", @@ -15443,6 +18091,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -15455,6 +18105,8 @@ }, "@lerna/describe-ref": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-6.4.1.tgz", + "integrity": "sha512-MXGXU8r27wl355kb1lQtAiu6gkxJ5tAisVJvFxFM1M+X8Sq56icNoaROqYrvW6y97A9+3S8Q48pD3SzkFv31Xw==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15463,6 +18115,8 @@ }, "@lerna/diff": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-6.4.1.tgz", + "integrity": "sha512-TnzJsRPN2fOjUrmo5Boi43fJmRtBJDsVgwZM51VnLoKcDtO1kcScXJ16Od2Xx5bXbp5dES5vGDLL/USVVWfeAg==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15473,6 +18127,8 @@ }, "@lerna/exec": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-6.4.1.tgz", + "integrity": "sha512-KAWfuZpoyd3FMejHUORd0GORMr45/d9OGAwHitfQPVs4brsxgQFjbbBEEGIdwsg08XhkDb4nl6IYVASVTq9+gA==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15486,6 +18142,8 @@ }, "@lerna/filter-options": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-6.4.1.tgz", + "integrity": "sha512-efJh3lP2T+9oyNIP2QNd9EErf0Sm3l3Tz8CILMsNJpjSU6kO43TYWQ+L/ezu2zM99KVYz8GROLqDcHRwdr8qUA==", "dev": true, "requires": { "@lerna/collect-updates": "6.4.1", @@ -15496,6 +18154,8 @@ }, "@lerna/filter-packages": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-6.4.1.tgz", + "integrity": "sha512-LCMGDGy4b+Mrb6xkcVzp4novbf5MoZEE6ZQF1gqG0wBWqJzNcKeFiOmf352rcDnfjPGZP6ct5+xXWosX/q6qwg==", "dev": true, "requires": { "@lerna/validation-error": "6.4.1", @@ -15505,6 +18165,8 @@ }, "@lerna/get-npm-exec-opts": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-6.4.1.tgz", + "integrity": "sha512-IvN/jyoklrWcjssOf121tZhOc16MaFPOu5ii8a+Oy0jfTriIGv929Ya8MWodj75qec9s+JHoShB8yEcMqZce4g==", "dev": true, "requires": { "npmlog": "^6.0.2" @@ -15512,6 +18174,8 @@ }, "@lerna/get-packed": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/get-packed/-/get-packed-6.4.1.tgz", + "integrity": "sha512-uaDtYwK1OEUVIXn84m45uPlXShtiUcw6V9TgB3rvHa3rrRVbR7D4r+JXcwVxLGrAS7LwxVbYWEEO/Z/bX7J/Lg==", "dev": true, "requires": { "fs-extra": "^9.1.0", @@ -15521,6 +18185,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -15533,6 +18199,8 @@ }, "@lerna/github-client": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/github-client/-/github-client-6.4.1.tgz", + "integrity": "sha512-ridDMuzmjMNlcDmrGrV9mxqwUKzt9iYqCPwVYJlRYrnE3jxyg+RdooquqskVFj11djcY6xCV2Q2V1lUYwF+PmA==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15544,6 +18212,8 @@ }, "@lerna/gitlab-client": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/gitlab-client/-/gitlab-client-6.4.1.tgz", + "integrity": "sha512-AdLG4d+jbUvv0jQyygQUTNaTCNSMDxioJso6aAjQ/vkwyy3fBJ6FYzX74J4adSfOxC2MQZITFyuG+c9ggp7pyQ==", "dev": true, "requires": { "node-fetch": "^2.6.1", @@ -15552,10 +18222,14 @@ }, "@lerna/global-options": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-6.4.1.tgz", + "integrity": "sha512-UTXkt+bleBB8xPzxBPjaCN/v63yQdfssVjhgdbkQ//4kayaRA65LyEtJTi9rUrsLlIy9/rbeb+SAZUHg129fJg==", "dev": true }, "@lerna/has-npm-version": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-6.4.1.tgz", + "integrity": "sha512-vW191w5iCkwNWWWcy4542ZOpjKYjcP/pU3o3+w6NM1J3yBjWZcNa8lfzQQgde2QkGyNi+i70o6wIca1o0sdKwg==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15564,13 +18238,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15578,12 +18256,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/import": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/import/-/import-6.4.1.tgz", + "integrity": "sha512-oDg8g1PNrCM1JESLsG3rQBtPC+/K9e4ohs0xDKt5E6p4l7dc0Ib4oo0oCCT/hGzZUlNwHxrc2q9JMRzSAn6P/Q==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15598,6 +18280,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -15610,6 +18294,8 @@ }, "@lerna/info": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/info/-/info-6.4.1.tgz", + "integrity": "sha512-Ks4R7IndIr4vQXz+702gumPVhH6JVkshje0WKA3+ew2qzYZf68lU1sBe1OZsQJU3eeY2c60ax+bItSa7aaIHGw==", "dev": true, "requires": { "@lerna/command": "6.4.1", @@ -15619,6 +18305,8 @@ }, "@lerna/init": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/init/-/init-6.4.1.tgz", + "integrity": "sha512-CXd/s/xgj0ZTAoOVyolOTLW2BG7uQOhWW4P/ktlwwJr9s3c4H/z+Gj36UXw3q5X1xdR29NZt7Vc6fvROBZMjUQ==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15631,6 +18319,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -15643,6 +18333,8 @@ }, "@lerna/link": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/link/-/link-6.4.1.tgz", + "integrity": "sha512-O8Rt7MAZT/WT2AwrB/+HY76ktnXA9cDFO9rhyKWZGTHdplbzuJgfsGzu8Xv0Ind+w+a8xLfqtWGPlwiETnDyrw==", "dev": true, "requires": { "@lerna/command": "6.4.1", @@ -15655,6 +18347,8 @@ }, "@lerna/list": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/list/-/list-6.4.1.tgz", + "integrity": "sha512-7a6AKgXgC4X7nK6twVPNrKCiDhrCiAhL/FE4u9HYhHqw9yFwyq8Qe/r1RVOkAOASNZzZ8GuBvob042bpunupCw==", "dev": true, "requires": { "@lerna/command": "6.4.1", @@ -15665,6 +18359,8 @@ }, "@lerna/listable": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-6.4.1.tgz", + "integrity": "sha512-L8ANeidM10aoF8aL3L/771Bb9r/TRkbEPzAiC8Iy2IBTYftS87E3rT/4k5KBEGYzMieSKJaskSFBV0OQGYV1Cw==", "dev": true, "requires": { "@lerna/query-graph": "6.4.1", @@ -15674,6 +18370,8 @@ }, "@lerna/log-packed": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-6.4.1.tgz", + "integrity": "sha512-Pwv7LnIgWqZH4vkM1rWTVF+pmWJu7d0ZhVwyhCaBJUsYbo+SyB2ZETGygo3Z/A+vZ/S7ImhEEKfIxU9bg5lScQ==", "dev": true, "requires": { "byte-size": "^7.0.0", @@ -15684,6 +18382,8 @@ }, "@lerna/npm-conf": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-6.4.1.tgz", + "integrity": "sha512-Q+83uySGXYk3n1pYhvxtzyGwBGijYgYecgpiwRG1YNyaeGy+Mkrj19cyTWubT+rU/kM5c6If28+y9kdudvc7zQ==", "dev": true, "requires": { "config-chain": "^1.1.12", @@ -15692,6 +18392,8 @@ }, "@lerna/npm-dist-tag": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-6.4.1.tgz", + "integrity": "sha512-If1Hn4q9fn0JWuBm455iIZDWE6Fsn4Nv8Tpqb+dYf0CtoT5Hn+iT64xSiU5XJw9Vc23IR7dIujkEXm2MVbnvZw==", "dev": true, "requires": { "@lerna/otplease": "6.4.1", @@ -15702,6 +18404,8 @@ }, "@lerna/npm-install": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-6.4.1.tgz", + "integrity": "sha512-7gI1txMA9qTaT3iiuk/8/vL78wIhtbbOLhMf8m5yQ2G+3t47RUA8MNgUMsq4Zszw9C83drayqesyTf0u8BzVRg==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15715,6 +18419,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -15727,6 +18433,8 @@ }, "@lerna/npm-publish": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-6.4.1.tgz", + "integrity": "sha512-lbNEg+pThPAD8lIgNArm63agtIuCBCF3umxvgTQeLzyqUX6EtGaKJFyz/6c2ANcAuf8UfU7WQxFFbOiolibXTQ==", "dev": true, "requires": { "@lerna/otplease": "6.4.1", @@ -15741,6 +18449,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -15753,6 +18463,8 @@ }, "@lerna/npm-run-script": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-6.4.1.tgz", + "integrity": "sha512-HyvwuyhrGqDa1UbI+pPbI6v+wT6I34R0PW3WCADn6l59+AyqLOCUQQr+dMW7jdYNwjO6c/Ttbvj4W58EWsaGtQ==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -15762,6 +18474,8 @@ }, "@lerna/otplease": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/otplease/-/otplease-6.4.1.tgz", + "integrity": "sha512-ePUciFfFdythHNMp8FP5K15R/CoGzSLVniJdD50qm76c4ATXZHnGCW2PGwoeAZCy4QTzhlhdBq78uN0wAs75GA==", "dev": true, "requires": { "@lerna/prompt": "6.4.1" @@ -15769,6 +18483,8 @@ }, "@lerna/output": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/output/-/output-6.4.1.tgz", + "integrity": "sha512-A1yRLF0bO+lhbIkrryRd6hGSD0wnyS1rTPOWJhScO/Zyv8vIPWhd2fZCLR1gI2d/Kt05qmK3T/zETTwloK7Fww==", "dev": true, "requires": { "npmlog": "^6.0.2" @@ -15776,6 +18492,8 @@ }, "@lerna/pack-directory": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/pack-directory/-/pack-directory-6.4.1.tgz", + "integrity": "sha512-kBtDL9bPP72/Nl7Gqa2CA3Odb8CYY1EF2jt801f+B37TqRLf57UXQom7yF3PbWPCPmhoU+8Fc4RMpUwSbFC46Q==", "dev": true, "requires": { "@lerna/get-packed": "6.4.1", @@ -15789,6 +18507,8 @@ }, "@lerna/package": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/package/-/package-6.4.1.tgz", + "integrity": "sha512-TrOah58RnwS9R8d3+WgFFTu5lqgZs7M+e1dvcRga7oSJeKscqpEK57G0xspvF3ycjfXQwRMmEtwPmpkeEVLMzA==", "dev": true, "requires": { "load-json-file": "^6.2.0", @@ -15798,6 +18518,8 @@ }, "@lerna/package-graph": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-6.4.1.tgz", + "integrity": "sha512-fQvc59stRYOqxT3Mn7g/yI9/Kw5XetJoKcW5l8XeqKqcTNDURqKnN0qaNBY6lTTLOe4cR7gfXF2l1u3HOz0qEg==", "dev": true, "requires": { "@lerna/prerelease-id-from-version": "6.4.1", @@ -15809,13 +18531,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15823,12 +18549,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/prerelease-id-from-version": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-6.4.1.tgz", + "integrity": "sha512-uGicdMFrmfHXeC0FTosnUKRgUjrBJdZwrmw7ZWMb5DAJGOuTzrvJIcz5f0/eL3XqypC/7g+9DoTgKjX3hlxPZA==", "dev": true, "requires": { "semver": "^7.3.4" @@ -15836,13 +18566,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15850,12 +18584,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/profiler": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-6.4.1.tgz", + "integrity": "sha512-dq2uQxcu0aq6eSoN+JwnvHoAnjtZAVngMvywz5bTAfzz/sSvIad1v8RCpJUMBQHxaPtbfiNvOIQgDZOmCBIM4g==", "dev": true, "requires": { "fs-extra": "^9.1.0", @@ -15865,6 +18603,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -15877,6 +18617,8 @@ }, "@lerna/project": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/project/-/project-6.4.1.tgz", + "integrity": "sha512-BPFYr4A0mNZ2jZymlcwwh7PfIC+I6r52xgGtJ4KIrIOB6mVKo9u30dgYJbUQxmSuMRTOnX7PJZttQQzSda4gEg==", "dev": true, "requires": { "@lerna/package": "6.4.1", @@ -15896,6 +18638,8 @@ "dependencies": { "cosmiconfig": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", "dev": true, "requires": { "@types/parse-json": "^4.0.0", @@ -15907,6 +18651,8 @@ }, "dot-prop": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", "dev": true, "requires": { "is-obj": "^2.0.0" @@ -15914,6 +18660,8 @@ }, "glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -15921,12 +18669,16 @@ }, "yaml": { "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "dev": true } } }, "@lerna/prompt": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-6.4.1.tgz", + "integrity": "sha512-vMxCIgF9Vpe80PnargBGAdS/Ib58iYEcfkcXwo7mYBCxEVcaUJFKZ72FEW8rw+H5LkxBlzrBJyfKRoOe0ks9gQ==", "dev": true, "requires": { "inquirer": "^8.2.4", @@ -15935,6 +18687,8 @@ }, "@lerna/publish": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-6.4.1.tgz", + "integrity": "sha512-/D/AECpw2VNMa1Nh4g29ddYKRIqygEV1ftV8PYXVlHpqWN7VaKrcbRU6pn0ldgpFlMyPtESfv1zS32F5CQ944w==", "dev": true, "requires": { "@lerna/check-working-tree": "6.4.1", @@ -15969,6 +18723,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -15979,13 +18735,17 @@ }, "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15993,12 +18753,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/pulse-till-done": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-6.4.1.tgz", + "integrity": "sha512-efAkOC1UuiyqYBfrmhDBL6ufYtnpSqAG+lT4d/yk3CzJEJKkoCwh2Hb692kqHHQ5F74Uusc8tcRB7GBcfNZRWA==", "dev": true, "requires": { "npmlog": "^6.0.2" @@ -16006,6 +18770,8 @@ }, "@lerna/query-graph": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/query-graph/-/query-graph-6.4.1.tgz", + "integrity": "sha512-gBGZLgu2x6L4d4ZYDn4+d5rxT9RNBC+biOxi0QrbaIq83I+JpHVmFSmExXK3rcTritrQ3JT9NCqb+Yu9tL9adQ==", "dev": true, "requires": { "@lerna/package-graph": "6.4.1" @@ -16013,6 +18779,8 @@ }, "@lerna/resolve-symlink": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-6.4.1.tgz", + "integrity": "sha512-gnqltcwhWVLUxCuwXWe/ch9WWTxXRI7F0ZvCtIgdfOpbosm3f1g27VO1LjXeJN2i6ks03qqMowqy4xB4uMR9IA==", "dev": true, "requires": { "fs-extra": "^9.1.0", @@ -16022,6 +18790,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -16034,6 +18804,8 @@ }, "@lerna/rimraf-dir": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-6.4.1.tgz", + "integrity": "sha512-5sDOmZmVj0iXIiEgdhCm0Prjg5q2SQQKtMd7ImimPtWKkV0IyJWxrepJFbeQoFj5xBQF7QB5jlVNEfQfKhD6pQ==", "dev": true, "requires": { "@lerna/child-process": "6.4.1", @@ -16044,6 +18816,8 @@ }, "@lerna/run": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/run/-/run-6.4.1.tgz", + "integrity": "sha512-HRw7kS6KNqTxqntFiFXPEeBEct08NjnL6xKbbOV6pXXf+lXUQbJlF8S7t6UYqeWgTZ4iU9caIxtZIY+EpW93mQ==", "dev": true, "requires": { "@lerna/command": "6.4.1", @@ -16061,6 +18835,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -16073,6 +18849,8 @@ }, "@lerna/run-lifecycle": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-6.4.1.tgz", + "integrity": "sha512-42VopI8NC8uVCZ3YPwbTycGVBSgukJltW5Saein0m7TIqFjwSfrcP0n7QJOr+WAu9uQkk+2kBstF5WmvKiqgEA==", "dev": true, "requires": { "@lerna/npm-conf": "6.4.1", @@ -16083,6 +18861,8 @@ }, "@lerna/run-topologically": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/run-topologically/-/run-topologically-6.4.1.tgz", + "integrity": "sha512-gXlnAsYrjs6KIUGDnHM8M8nt30Amxq3r0lSCNAt+vEu2sMMEOh9lffGGaJobJZ4bdwoXnKay3uER/TU8E9owMw==", "dev": true, "requires": { "@lerna/query-graph": "6.4.1", @@ -16091,6 +18871,8 @@ }, "@lerna/symlink-binary": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-6.4.1.tgz", + "integrity": "sha512-poZX90VmXRjL/JTvxaUQPeMDxFUIQvhBkHnH+dwW0RjsHB/2Tu4QUAsE0OlFnlWQGsAtXF4FTtW8Xs57E/19Kw==", "dev": true, "requires": { "@lerna/create-symlink": "6.4.1", @@ -16101,6 +18883,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -16113,6 +18897,8 @@ }, "@lerna/symlink-dependencies": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-6.4.1.tgz", + "integrity": "sha512-43W2uLlpn3TTYuHVeO/2A6uiTZg6TOk/OSKi21ujD7IfVIYcRYCwCV+8LPP12R3rzyab0JWkWnhp80Z8A2Uykw==", "dev": true, "requires": { "@lerna/create-symlink": "6.4.1", @@ -16125,6 +18911,8 @@ "dependencies": { "fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", @@ -16137,6 +18925,8 @@ }, "@lerna/temp-write": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/temp-write/-/temp-write-6.4.1.tgz", + "integrity": "sha512-7uiGFVoTyos5xXbVQg4bG18qVEn9dFmboXCcHbMj5mc/+/QmU9QeNz/Cq36O5TY6gBbLnyj3lfL5PhzERWKMFg==", "dev": true, "requires": { "graceful-fs": "^4.1.15", @@ -16148,6 +18938,8 @@ "dependencies": { "make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -16157,10 +18949,14 @@ }, "@lerna/timer": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/timer/-/timer-6.4.1.tgz", + "integrity": "sha512-ogmjFTWwRvevZr76a2sAbhmu3Ut2x73nDIn0bcwZwZ3Qc3pHD8eITdjs/wIKkHse3J7l3TO5BFJPnrvDS7HLnw==", "dev": true }, "@lerna/validation-error": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-6.4.1.tgz", + "integrity": "sha512-fxfJvl3VgFd7eBfVMRX6Yal9omDLs2mcGKkNYeCEyt4Uwlz1B5tPAXyk/sNMfkKV2Aat/mlK5tnY13vUrMKkyA==", "dev": true, "requires": { "npmlog": "^6.0.2" @@ -16168,6 +18964,8 @@ }, "@lerna/version": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/version/-/version-6.4.1.tgz", + "integrity": "sha512-1/krPq0PtEqDXtaaZsVuKev9pXJCkNC1vOo2qCcn6PBkODw/QTAvGcUi0I+BM2c//pdxge9/gfmbDo1lC8RtAQ==", "dev": true, "requires": { "@lerna/check-working-tree": "6.4.1", @@ -16201,13 +18999,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -16215,12 +19017,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@lerna/write-log-file": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-6.4.1.tgz", + "integrity": "sha512-LE4fueQSDrQo76F4/gFXL0wnGhqdG7WHVH8D8TrKouF2Afl4NHltObCm4WsSMPjcfciVnZQFfx1ruxU4r/enHQ==", "dev": true, "requires": { "npmlog": "^6.0.2", @@ -16229,16 +19035,25 @@ }, "@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.5" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true }, "@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -16246,6 +19061,8 @@ }, "@npmcli/arborist": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-5.3.0.tgz", + "integrity": "sha512-+rZ9zgL1lnbl8Xbb1NQdMjveOMwj4lIYfcDtyJHHi5x4X8jtR6m8SXooJMZy5vmFVZ8w7A2Bnd/oX9eTuU8w5A==", "dev": true, "requires": { "@isaacs/string-locale-compare": "^1.1.0", @@ -16286,6 +19103,8 @@ "dependencies": { "hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "requires": { "lru-cache": "^7.5.1" @@ -16293,10 +19112,14 @@ }, "lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -16306,7 +19129,9 @@ } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -16314,6 +19139,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -16323,12 +19150,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@npmcli/fs": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "requires": { "@gar/promisify": "^1.1.3", @@ -16337,13 +19168,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -16351,12 +19186,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@npmcli/git": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", + "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", "dev": true, "requires": { "@npmcli/promise-spawn": "^3.0.0", @@ -16372,10 +19211,14 @@ "dependencies": { "lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -16383,6 +19226,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -16392,12 +19237,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@npmcli/installed-package-contents": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", "dev": true, "requires": { "npm-bundled": "^1.1.1", @@ -16406,6 +19255,8 @@ }, "@npmcli/map-workspaces": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-2.0.4.tgz", + "integrity": "sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==", "dev": true, "requires": { "@npmcli/name-from-folder": "^1.0.1", @@ -16416,6 +19267,8 @@ "dependencies": { "brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -16423,6 +19276,8 @@ }, "minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -16432,6 +19287,8 @@ }, "@npmcli/metavuln-calculator": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-3.1.1.tgz", + "integrity": "sha512-n69ygIaqAedecLeVH3KnO39M6ZHiJ2dEv5A7DGvcqCB8q17BGUgW8QaanIkbWUo2aYGZqJaOORTLAlIvKjNDKA==", "dev": true, "requires": { "cacache": "^16.0.0", @@ -16442,13 +19299,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -16456,12 +19317,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@npmcli/move-file": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", "dev": true, "requires": { "mkdirp": "^1.0.4", @@ -16470,14 +19335,20 @@ }, "@npmcli/name-from-folder": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", + "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", "dev": true }, "@npmcli/node-gyp": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", + "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", "dev": true }, "@npmcli/package-json": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-2.0.0.tgz", + "integrity": "sha512-42jnZ6yl16GzjWSH7vtrmWyJDGVa/LXPdpN2rcUWolFjc9ON2N3uz0qdBbQACfmhuJZ2lbKYtmK5qx68ZPLHMA==", "dev": true, "requires": { "json-parse-even-better-errors": "^2.3.1" @@ -16485,6 +19356,8 @@ }, "@npmcli/promise-spawn": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", + "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", "dev": true, "requires": { "infer-owner": "^1.0.4" @@ -16492,6 +19365,8 @@ }, "@npmcli/run-script": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", + "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", "dev": true, "requires": { "@npmcli/node-gyp": "^2.0.0", @@ -16503,16 +19378,19 @@ }, "@nrwl/cli": { "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/cli/-/cli-15.7.1.tgz", + "integrity": "sha512-33RcH5Af2BidQvnTGlDTrUWJ6Eul5aA0LeqYmEavYb+I0kzYMqdBzBCLgQT/13gAdoQauTWUO4g3eFhoHnCNrg==", "dev": true, "requires": { "nx": "15.7.1" } }, "@nrwl/devkit": { - "version": "15.8.5", + "version": "15.9.4", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.9.4.tgz", + "integrity": "sha512-mUX1kXTuPMdTzFxIzH+MsSNvdppOmstPDOEtiGFZJTuJ625ki0HhNJILO3N2mJ7MeMrLqIlAiNdvelQaObxYsQ==", "dev": true, "requires": { - "@phenomnomnominal/tsquery": "4.1.1", "ejs": "^3.1.7", "ignore": "^5.0.4", "semver": "7.3.4", @@ -16522,6 +19400,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -16529,6 +19409,8 @@ }, "semver": { "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -16536,17 +19418,79 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@nrwl/nx-darwin-arm64": { "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.7.1.tgz", + "integrity": "sha512-YaNq1kP0xoaG2SDTjAzc0ZXAzRHE4obnEtVbisMzGRJkMld7SiOzYZAoaLJI6mZJuc7cIzUlA+wFkE2e21q5tQ==", + "dev": true, + "optional": true + }, + "@nrwl/nx-darwin-x64": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.7.1.tgz", + "integrity": "sha512-G/0joeAQfZm4FuqaDyOAam912EfVS6mlG1gFrzp3P/kzzE+gxt/I+iQHNmEOl8Dnp4ercTgW6epUEQ03teRLOA==", + "dev": true, + "optional": true + }, + "@nrwl/nx-linux-arm-gnueabihf": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-15.7.1.tgz", + "integrity": "sha512-WeZndiNyAPolRc08C4LLY7y+b3g9wAsJVVTWugW9PyaTMD19KY6oFkNG5gg1W0InoGISazW5fUissE+911kgog==", + "dev": true, + "optional": true + }, + "@nrwl/nx-linux-arm64-gnu": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-15.7.1.tgz", + "integrity": "sha512-efDPQl2Z1YLnUlEKyu7lsvRnFIRXmvnbkH2nRv3HNHVufnHjjQ41UBw2Gqz4WUrEpmBz2Xq31cYUZluUP7/o6Q==", + "dev": true, + "optional": true + }, + "@nrwl/nx-linux-arm64-musl": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-arm64-musl/-/nx-linux-arm64-musl-15.7.1.tgz", + "integrity": "sha512-Esv+ko6vMrI0HLnIXs76up7zUCaDfjArgn2TfMxvPjDEp4qmExiI8gmSh5JM1kC0MkHb4HghCnsSQ86Gg1BRiQ==", + "dev": true, + "optional": true + }, + "@nrwl/nx-linux-x64-gnu": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-x64-gnu/-/nx-linux-x64-gnu-15.7.1.tgz", + "integrity": "sha512-9ZkeCHhk+a3ok8CBEcbIheWrlp+gY1KdhmHOksJuDsHTcRMirbZ9HWm+/UIYB2FVaEENCBgcA4akwXRDaxrmYw==", + "dev": true, + "optional": true + }, + "@nrwl/nx-linux-x64-musl": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-linux-x64-musl/-/nx-linux-x64-musl-15.7.1.tgz", + "integrity": "sha512-FOs8FhcACKfYjL5l/mIHUESs25KPsZsp3TWrpCYgQNkrvNV9lWbrQ+h9acWf23hR2FYVk7xKVo4wFYsUqF+DbA==", + "dev": true, + "optional": true + }, + "@nrwl/nx-win32-arm64-msvc": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-15.7.1.tgz", + "integrity": "sha512-JEhy0ac+ivhIdAPWqEfAN9EqFznKA5vt4oVjIqjDysqgzN9GBKOeo7gphdii9WyqrIKEbOs1L++ADWXw1gev6Q==", + "dev": true, + "optional": true + }, + "@nrwl/nx-win32-x64-msvc": { + "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/nx-win32-x64-msvc/-/nx-win32-x64-msvc-15.7.1.tgz", + "integrity": "sha512-GLh5TXKViRb55jBviZSZweavilUr2frmb/8iv3Fz7MPS6VvA+axIqNhuVcTJP1H3C/1yt3Nx5wwsXdWgg3mZpw==", "dev": true, "optional": true }, "@nrwl/tao": { "version": "15.7.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.7.1.tgz", + "integrity": "sha512-pCKIijUGUAht+Lfy9P4WaHxTHnqqr+vaC00vX6XSlkRoFAUFYh7lhbOHDSKOwBG016ZoG73P1IIMg0um4ybd5w==", "dev": true, "requires": { "nx": "15.7.1" @@ -16554,13 +19498,17 @@ }, "@octokit/auth-token": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz", + "integrity": "sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA==", "dev": true, "requires": { "@octokit/types": "^9.0.0" } }, "@octokit/core": { - "version": "4.2.0", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.1.tgz", + "integrity": "sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw==", "dev": true, "requires": { "@octokit/auth-token": "^3.0.0", @@ -16574,6 +19522,8 @@ }, "@octokit/endpoint": { "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz", + "integrity": "sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA==", "dev": true, "requires": { "@octokit/types": "^9.0.0", @@ -16583,12 +19533,16 @@ "dependencies": { "is-plain-object": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true } } }, "@octokit/graphql": { - "version": "5.0.5", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", "dev": true, "requires": { "@octokit/request": "^6.0.0", @@ -16597,35 +19551,48 @@ } }, "@octokit/openapi-types": { - "version": "16.0.0", + "version": "17.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.2.0.tgz", + "integrity": "sha512-MazrFNx4plbLsGl+LFesMo96eIXkFgEtaKbnNpdh4aQ0VM10aoylFsTYP1AEjkeoRNZiiPe3T6Gl2Hr8dJWdlQ==", "dev": true }, "@octokit/plugin-enterprise-rest": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz", + "integrity": "sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==", "dev": true }, "@octokit/plugin-paginate-rest": { - "version": "6.0.0", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", "dev": true, "requires": { - "@octokit/types": "^9.0.0" + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" } }, "@octokit/plugin-request-log": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", "dev": true, "requires": {} }, "@octokit/plugin-rest-endpoint-methods": { - "version": "7.0.1", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.1.2.tgz", + "integrity": "sha512-R0oJ7j6f/AdqPLtB9qRXLO+wjI9pctUn8Ka8UGfGaFCcCv3Otx14CshQ89K4E88pmyYZS8p0rNTiprML/81jig==", "dev": true, "requires": { - "@octokit/types": "^9.0.0", + "@octokit/types": "^9.2.3", "deprecation": "^2.3.1" } }, "@octokit/request": { - "version": "6.2.3", + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", + "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", "dev": true, "requires": { "@octokit/endpoint": "^7.0.0", @@ -16638,12 +19605,16 @@ "dependencies": { "is-plain-object": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true } } }, "@octokit/request-error": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", "dev": true, "requires": { "@octokit/types": "^9.0.0", @@ -16652,39 +19623,80 @@ } }, "@octokit/rest": { - "version": "19.0.7", + "version": "19.0.11", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", + "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", "dev": true, "requires": { - "@octokit/core": "^4.1.0", - "@octokit/plugin-paginate-rest": "^6.0.0", + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.0.0" + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" } }, + "@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, "@octokit/types": { - "version": "9.0.0", + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", + "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", "dev": true, "requires": { - "@octokit/openapi-types": "^16.0.0" + "@octokit/openapi-types": "^17.2.0" } }, "@parcel/watcher": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", "dev": true, "requires": { "node-addon-api": "^3.2.1", "node-gyp-build": "^4.3.0" } }, - "@phenomnomnominal/tsquery": { - "version": "4.1.1", + "@pkgr/utils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.0.tgz", + "integrity": "sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==", "dev": true, "requires": { - "esquery": "^1.0.1" + "cross-spawn": "^7.0.3", + "fast-glob": "^3.2.12", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.5.0" + }, + "dependencies": { + "define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true + }, + "open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "requires": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + } + } } }, "@sinonjs/commons": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, "requires": { "type-detect": "4.0.8" @@ -16692,6 +19704,8 @@ }, "@sinonjs/fake-timers": { "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", "dev": true, "requires": { "@sinonjs/commons": "^2.0.0" @@ -16699,6 +19713,8 @@ }, "@sinonjs/samsam": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", "dev": true, "requires": { "@sinonjs/commons": "^2.0.0", @@ -16708,80 +19724,112 @@ }, "@sinonjs/text-encoding": { "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, - "@syntest/ast-javascript": { - "version": "file:libraries/ast-javascript", + "@syntest/analysis": { + "version": "0.1.0-beta.4", + "resolved": "https://registry.npmjs.org/@syntest/analysis/-/analysis-0.1.0-beta.4.tgz", + "integrity": "sha512-RSajGGvsVA1ILrvDBJe95RtGMfe9fFWhCqjrBmh1rjZuLqLyy7rDDLeaM1rcMrhmASyhmZyt1VpcwPkXzlERXw==", + "requires": { + "@syntest/cfg": "^0.3.0-beta.15", + "@syntest/logging": "^0.1.0-beta.6", + "lodash.clonedeep": "^4.5.0" + } + }, + "@syntest/analysis-javascript": { + "version": "file:libraries/analysis-javascript", "requires": { "@babel/core": "7.20.12", - "@types/babel__core": "7.20.0" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/ast-visitor-javascript": "*", + "@syntest/cfg": "^0.3.0-beta.16", + "@syntest/logging": "^0.1.0-beta.6", + "@syntest/search": "^0.4.0-beta.25" + } + }, + "@syntest/ast-visitor-javascript": { + "version": "file:libraries/ast-visitor-javascript", + "requires": { + "@babel/core": "7.20.12", + "@babel/traverse": "7.20.12", + "@babel/types": "^7.21.5", + "@syntest/logging": "^0.1.0-beta.6", + "globals": "^13.20.0" }, "dependencies": { - "@types/babel__core": { - "version": "7.20.0", - "dev": true, + "@babel/traverse": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.12.tgz", + "integrity": "sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ==", "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + } } } } }, - "@syntest/cfg-core": { - "version": "0.2.1-beta.3" + "@syntest/base-language": { + "version": "0.2.0-beta.28", + "resolved": "https://registry.npmjs.org/@syntest/base-language/-/base-language-0.2.0-beta.28.tgz", + "integrity": "sha512-M2aeblXmpnyxEQ0YcHUyXyP60Gbi+LKnnbKBsiCBmB9MTuzXlo/bNSkB+mcKoUPVXkoHxo+RYwk3v66WFHEvQw==", + "requires": { + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/logging": "^0.1.0-beta.6", + "@syntest/metric": "^0.1.0-beta.5", + "@syntest/module": "^0.1.0-beta.15", + "@syntest/search": "^0.4.0-beta.25", + "yargs": "^17.7.1" + } }, - "@syntest/cfg-javascript": { - "version": "file:libraries/cfg-javascript", + "@syntest/cfg": { + "version": "0.3.0-beta.16", + "resolved": "https://registry.npmjs.org/@syntest/cfg/-/cfg-0.3.0-beta.16.tgz", + "integrity": "sha512-17q6QN1Xa/yqnqds/56gtdZDiKkluJ7P1tSVW6EAgST2Ws8fFmUsI2JjD+oguWvY+NqWBnjYQEp+C1GIBPaghA==", "requires": { - "@syntest/cfg-core": "*", - "@syntest/core": "*" + "@syntest/logging": "^0.1.0-beta.6", + "lodash.clonedeep": "^4.5.0" } }, - "@syntest/core": { - "version": "0.3.1-beta.3", + "@syntest/cli-graphics": { + "version": "0.1.0-beta.3", + "resolved": "https://registry.npmjs.org/@syntest/cli-graphics/-/cli-graphics-0.1.0-beta.3.tgz", + "integrity": "sha512-JID6ubVmyHJhjckYE0TyTbs5zYOhzSOXYT/xlJwGXuhz1/tXXa6JmOX5rQSrV0CJJsiTCRGhUE3Mnh0Hpz80xw==", "requires": { - "@dagrejs/graphlib": "2.1.4", - "@syntest/cfg-core": "^0.2.1-beta.3", - "bignumber.js": "9.0.1", + "@syntest/logging": "*", "chalk": "4.1.1", "clear": "0.1.0", "cli-progress": "3.11.2", - "d3": "^4.13.0", - "fast-csv": "4.3.6", "figlet": "1.5.2", - "globby": "^11.0.4", - "jsdom": "20.0.3", - "seedrandom": "3.0.5", - "shelljs": "0.8.5", - "winston": "3.8.2", - "yargs": "17.6.2" + "table": "^6.8.1" }, "dependencies": { - "cliui": { - "version": "8.0.1", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "yargs": { - "version": "17.6.2", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } - }, - "yargs-parser": { - "version": "21.1.1" } } }, @@ -16789,34 +19837,102 @@ "version": "file:libraries/instrumentation-javascript", "requires": { "@babel/core": "7.20.12", - "@syntest/ast-javascript": "*", - "@types/babel__core": "7.20.0" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", + "@istanbuljs/schema": "^0.1.3", + "@syntest/analysis-javascript": "^0.1.0-beta.4", + "@syntest/ast-visitor-javascript": "*", + "@types/babel__core": "7.20.0", + "fs-extra": "^11.1.1", + "istanbul-lib-coverage": "^3.2.0" }, "dependencies": { - "@types/babel__core": { - "version": "7.20.0", - "dev": true, + "fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" } } } }, "@syntest/javascript": { - "version": "file:libraries/javascript", + "version": "file:tools/javascript", + "requires": { + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/analysis-javascript": "^0.1.0-beta.4", + "@syntest/base-language": "^0.2.0-beta.28", + "@syntest/cli-graphics": "^0.1.0-beta.3", + "@syntest/instrumentation-javascript": "^0.1.0-beta.2", + "@syntest/logging": "^0.1.0-beta.6", + "@syntest/metric": "^0.1.0-beta.5", + "@syntest/module": "^0.1.0-beta.15", + "@syntest/search": "^0.4.0-beta.25", + "@syntest/search-javascript": "*", + "yargs": "^17.7.2" + } + }, + "@syntest/logging": { + "version": "0.1.0-beta.6", + "resolved": "https://registry.npmjs.org/@syntest/logging/-/logging-0.1.0-beta.6.tgz", + "integrity": "sha512-fmKuuE8XQpInN24AHk3RNG3tDZ2nu6oqOfYlHolQiKGR42ZBPSMuM1Ozhsw/9itQuW4vV0Pcfm1wmLSbwpAtCA==", + "requires": { + "winston": "3.8.2", + "yargs": "^17.7.1" + } + }, + "@syntest/metric": { + "version": "0.1.0-beta.5", + "resolved": "https://registry.npmjs.org/@syntest/metric/-/metric-0.1.0-beta.5.tgz", + "integrity": "sha512-+vmD1E8aickD/lfXalvvppV6RzOCvjwrwz5SEUqEXz3juE6BYH8iIxOaMSa+d+TQzHBSHUGl+cFlBZDmDjTvBA==", + "requires": { + "@syntest/logging": "*", + "yargs": "^17.7.1" + } + }, + "@syntest/module": { + "version": "0.1.0-beta.15", + "resolved": "https://registry.npmjs.org/@syntest/module/-/module-0.1.0-beta.15.tgz", + "integrity": "sha512-K3GpVm9C76+3DPm6ao90qhq1xJU0ov3Z+x+UNgw1aMWhoC2cYWfKzUsPWn6fcXwMjEIjrMH6CqBVvcp0rCPkRg==", + "requires": { + "@syntest/cli-graphics": "^0.1.0-beta.3", + "@syntest/logging": "*", + "@syntest/metric": "^0.1.0-beta.5", + "global-modules": "2.0.0", + "yargs": "^17.7.1" + } + }, + "@syntest/search": { + "version": "0.4.0-beta.25", + "resolved": "https://registry.npmjs.org/@syntest/search/-/search-0.4.0-beta.25.tgz", + "integrity": "sha512-BbwleCv9JvXcFw8nyNPI7VMT61iLyfHz+JDIIVnrYCo0KMP1JRvCV59Eemn4dGRWOjUFYZ2STwJJNk6HjqnEfA==", + "requires": { + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/cfg": "*", + "@syntest/logging": "*", + "bignumber.js": "9.0.1", + "seedrandom": "3.0.5" + } + }, + "@syntest/search-javascript": { + "version": "file:libraries/search-javascript", "requires": { - "@babel/core": "7.16.5", + "@babel/core": "7.20.12", + "@babel/generator": "^7.21.9", "@babel/preset-env": "7.19.1", "@babel/register": "7.18.9", + "@babel/types": "^7.21.5", "@istanbuljs/schema": "0.1.3", - "@syntest/ast-javascript": "^0.1.0-beta.3", - "@syntest/cfg-javascript": "^0.1.0-beta.4", - "@syntest/core": "^0.3.1-beta.0", - "@syntest/instrumentation-javascript": "^0.1.0-beta.2", + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/analysis-javascript": "*", + "@syntest/ast-visitor-javascript": "*", + "@syntest/cfg": "^0.3.0-beta.16", + "@syntest/instrumentation-javascript": "*", + "@syntest/logging": "^0.1.0-beta.6", + "@syntest/search": "^0.4.0-beta.25", "chai": "4.3.7", "chai-as-promised": "7.1.1", "chalk": "4.1.1", @@ -16826,57 +19942,58 @@ "istanbul-lib-instrument": "5.1.0", "lodash.clonedeep": "4.5.0", "mocha": "10.2.0", - "original-require": "1.0.1", "regenerator-runtime": "0.13.9" }, "dependencies": { - "@babel/core": { - "version": "7.16.5", + "chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.5", - "@babel/helper-compilation-targets": "^7.16.3", - "@babel/helper-module-transforms": "^7.16.5", - "@babel/helpers": "^7.16.5", - "@babel/parser": "^7.16.5", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.5", - "@babel/types": "^7.16.0", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.1.2", - "semver": "^6.3.0", - "source-map": "^0.5.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } } } }, "@tootallnate/once": { - "version": "2.0.0" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true }, "@tsconfig/node10": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true }, "@tsconfig/node12": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true }, "@tsconfig/node14": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, "@tsconfig/node16": { - "version": "1.0.3", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "@types/babel__core": { - "version": "7.1.20", + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", + "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", "dev": true, "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" @@ -16884,6 +20001,8 @@ }, "@types/babel__generator": { "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", "dev": true, "requires": { "@babel/types": "^7.0.0" @@ -16891,6 +20010,8 @@ }, "@types/babel__template": { "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -16898,7 +20019,9 @@ } }, "@types/babel__traverse": { - "version": "7.18.3", + "version": "7.18.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", + "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -16906,49 +20029,94 @@ }, "@types/chai": { "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", "dev": true }, "@types/figlet": { "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/figlet/-/figlet-1.5.4.tgz", + "integrity": "sha512-cskPTju7glYgzvkJy/hftqw7Fen3fsd0yrPOqcbBLJu+YdDQuA438akS1g+2XVKGzsQOnXGV2I9ePv6xUBnKMQ==", + "dev": true + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "@types/json-schema": { - "version": "7.0.11", + "@types/lodash": { + "version": "4.14.194", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", + "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", "dev": true }, + "@types/lodash.clonedeep": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@types/lodash.clonedeep/-/lodash.clonedeep-4.5.7.tgz", + "integrity": "sha512-ccNqkPptFIXrpVqUECi60/DFxjNKsfoQxSQsgcBJCX/fuX1wgyQieojkcWH/KpE3xzLoWN/2k+ZeGqIN3paSvw==", + "dev": true, + "requires": { + "@types/lodash": "*" + } + }, "@types/minimatch": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@types/minimist": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, "@types/mocha": { "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", "dev": true }, "@types/node": { "version": "18.11.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", "dev": true }, "@types/normalize-package-data": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, "@types/parse-json": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, "@types/semver": { - "version": "7.3.13", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "@types/triple-beam": { - "version": "1.3.2" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", + "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==" }, "@types/yargs": { "version": "17.0.20", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.20.tgz", + "integrity": "sha512-eknWrTHofQuPk2iuqDm1waA7V6xPlbgBoaaXEgYkClhLOnB0TtbW+srJaOToAgawPxPlHQzwypFA2bhZaUGP5A==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -16956,10 +20124,14 @@ }, "@types/yargs-parser": { "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "@typescript-eslint/eslint-plugin": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.45.1.tgz", + "integrity": "sha512-cOizjPlKEh0bXdFrBLTrI/J6B/QMlhwE9auOov53tgB+qMukH6/h8YAK/qw+QJGct/PTbdh2lytGyipxCcEtAw==", "dev": true, "requires": { "@typescript-eslint/scope-manager": "5.45.1", @@ -16975,13 +20147,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -16989,12 +20165,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@typescript-eslint/parser": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.45.1.tgz", + "integrity": "sha512-JQ3Ep8bEOXu16q0ztsatp/iQfDCtvap7sp/DKo7DWltUquj5AfCOpX2zSzJ8YkAVnrQNqQ5R62PBz2UtrfmCkA==", "dev": true, "requires": { "@typescript-eslint/scope-manager": "5.45.1", @@ -17005,6 +20185,8 @@ }, "@typescript-eslint/scope-manager": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.45.1.tgz", + "integrity": "sha512-D6fCileR6Iai7E35Eb4Kp+k0iW7F1wxXYrOhX/3dywsOJpJAQ20Fwgcf+P/TDtvQ7zcsWsrJaglaQWDhOMsspQ==", "dev": true, "requires": { "@typescript-eslint/types": "5.45.1", @@ -17013,6 +20195,8 @@ }, "@typescript-eslint/type-utils": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.45.1.tgz", + "integrity": "sha512-aosxFa+0CoYgYEl3aptLe1svP910DJq68nwEJzyQcrtRhC4BN0tJAvZGAe+D0tzjJmFXe+h4leSsiZhwBa2vrA==", "dev": true, "requires": { "@typescript-eslint/typescript-estree": "5.45.1", @@ -17023,10 +20207,14 @@ }, "@typescript-eslint/types": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.45.1.tgz", + "integrity": "sha512-HEW3U0E5dLjUT+nk7b4lLbOherS1U4ap+b9pfu2oGsW3oPu7genRaY9dDv3nMczC1rbnRY2W/D7SN05wYoGImg==", "dev": true }, "@typescript-eslint/typescript-estree": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.45.1.tgz", + "integrity": "sha512-76NZpmpCzWVrrb0XmYEpbwOz/FENBi+5W7ipVXAsG3OoFrQKJMiaqsBMbvGRyLtPotGqUfcY7Ur8j0dksDJDng==", "dev": true, "requires": { "@typescript-eslint/types": "5.45.1", @@ -17040,13 +20228,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -17054,12 +20246,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@typescript-eslint/utils": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.45.1.tgz", + "integrity": "sha512-rlbC5VZz68+yjAzQBc4I7KDYVzWG2X/OrqoZrMahYq3u8FFtmQYc+9rovo/7wlJH5kugJ+jQXV5pJMnofGmPRw==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", @@ -17074,13 +20270,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -17088,12 +20288,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "@typescript-eslint/visitor-keys": { "version": "5.45.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.45.1.tgz", + "integrity": "sha512-cy9ln+6rmthYWjH9fmx+5FU/JDpjQb586++x2FZlveq7GdGuLLW9a2Jcst2TGekH82bXpfmRNSwP9tyEs6RjvQ==", "dev": true, "requires": { "@typescript-eslint/types": "5.45.1", @@ -17102,10 +20306,14 @@ }, "@yarnpkg/lockfile": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", "dev": true }, "@yarnpkg/parsers": { - "version": "3.0.0-rc.40", + "version": "3.0.0-rc.44", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.44.tgz", + "integrity": "sha512-UVAt9Icc8zfGXioeYJ8XMoSTxOYVmlal2TRNxy9Uh91taS72kQFalK7LpIslcvEBKy4XtarmfIwcFIU3ZY64lw==", "dev": true, "requires": { "js-yaml": "^3.10.0", @@ -17114,6 +20322,8 @@ "dependencies": { "argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" @@ -17121,6 +20331,8 @@ }, "js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -17131,48 +20343,57 @@ }, "@zkochan/js-yaml": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", "dev": true, "requires": { "argparse": "^2.0.1" } }, - "abab": { - "version": "2.0.6" - }, "abbrev": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "acorn": { - "version": "8.8.2" - }, - "acorn-globals": { - "version": "7.0.1", - "requires": { - "acorn": "^8.1.0", - "acorn-walk": "^8.0.2" - } + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true }, "acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "requires": {} }, "acorn-walk": { - "version": "8.2.0" + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true }, "add-stream": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", "dev": true }, "agent-base": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, "requires": { "debug": "4" } }, "agentkeepalive": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", + "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", "dev": true, "requires": { "debug": "^4.1.0", @@ -17182,6 +20403,8 @@ }, "aggregate-error": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dev": true, "requires": { "clean-stack": "^2.0.0", @@ -17190,7 +20413,8 @@ }, "ajv": { "version": "8.12.0", - "dev": true, + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -17199,26 +20423,44 @@ } }, "ansi-colors": { - "version": "4.1.1" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-escapes": { "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } } }, "ansi-regex": { - "version": "5.0.1" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { "color-convert": "^2.0.1" } }, "anymatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -17226,6 +20468,8 @@ }, "append-transform": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, "requires": { "default-require-extensions": "^3.0.0" @@ -17233,14 +20477,20 @@ }, "aproba": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, "archy": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true }, "are-we-there-yet": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "dev": true, "requires": { "delegates": "^1.0.0", @@ -17249,49 +20499,129 @@ }, "arg": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "argparse": { - "version": "2.0.1" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } }, "array-differ": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", "dev": true }, "array-ify": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, "array-union": { - "version": "2.1.0" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } }, "arrify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true }, "asap": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true }, "assertion-error": { - "version": "1.1.0" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" }, "astral-regex": { "version": "2.0.0", - "dev": true + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" }, "async": { - "version": "3.2.4" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "asynckit": { - "version": "0.4.0" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "at-least-node": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, "axios": { - "version": "1.3.4", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dev": true, "requires": { "follow-redirects": "^1.15.0", @@ -17301,6 +20631,8 @@ }, "babel-plugin-polyfill-corejs2": { "version": "0.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", + "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", "requires": { "@babel/compat-data": "^7.17.7", "@babel/helper-define-polyfill-provider": "^0.3.3", @@ -17309,6 +20641,8 @@ }, "babel-plugin-polyfill-corejs3": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", + "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", "requires": { "@babel/helper-define-polyfill-provider": "^0.3.3", "core-js-compat": "^3.25.1" @@ -17316,26 +20650,44 @@ }, "babel-plugin-polyfill-regenerator": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", + "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", "requires": { "@babel/helper-define-polyfill-provider": "^0.3.3" } }, "balanced-match": { - "version": "1.0.2" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, "before-after-hook": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", "dev": true }, "bignumber.js": { - "version": "9.0.1" + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" }, "bin-links": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-3.0.3.tgz", + "integrity": "sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==", "dev": true, "requires": { "cmd-shim": "^5.0.0", @@ -17348,15 +20700,21 @@ "dependencies": { "npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true } } }, "binary-extensions": { - "version": "2.2.0" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "bl": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, "requires": { "buffer": "^5.5.0", @@ -17364,8 +20722,19 @@ "readable-stream": "^3.4.0" } }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, "brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -17373,15 +20742,21 @@ }, "braces": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { "fill-range": "^7.0.1" } }, "browser-stdout": { - "version": "1.3.1" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "browserslist": { "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "requires": { "caniuse-lite": "^1.0.30001449", "electron-to-chromium": "^1.4.284", @@ -17391,6 +20766,8 @@ }, "buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, "requires": { "base64-js": "^1.3.1", @@ -17398,10 +20775,20 @@ } }, "buffer-from": { - "version": "1.1.2" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true }, "builtins": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", "dev": true, "requires": { "semver": "^7.0.0" @@ -17409,13 +20796,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -17423,16 +20814,31 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, + "bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "requires": { + "run-applescript": "^5.0.0" + } + }, "byte-size": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-7.0.1.tgz", + "integrity": "sha512-crQdqyCwhokxwV1UyDzLZanhkugAgft7vt0qbbdt60C6Zf3CAiGmtUCylbtYwrU6loOUw3euGrNtW1J651ot1A==", "dev": true }, "cacache": { "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", "dev": true, "requires": { "@npmcli/fs": "^2.1.0", @@ -17457,12 +20863,16 @@ "dependencies": { "lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true } } }, "caching-transform": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, "requires": { "hasha": "^5.0.0", @@ -17473,6 +20883,8 @@ "dependencies": { "make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -17480,6 +20892,8 @@ }, "write-file-atomic": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -17490,16 +20904,32 @@ } } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "camelcase-keys": { "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, "requires": { "camelcase": "^5.3.1", @@ -17508,10 +20938,14 @@ } }, "caniuse-lite": { - "version": "1.0.30001462" + "version": "1.0.30001489", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", + "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==" }, "chai": { "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -17524,12 +20958,16 @@ }, "chai-as-promised": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "requires": { "check-error": "^1.0.2" } }, "chalk": { - "version": "4.1.1", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -17537,13 +20975,19 @@ }, "chardet": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, "check-error": { - "version": "1.0.2" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==" }, "chokidar": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -17557,6 +21001,8 @@ "dependencies": { "glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { "is-glob": "^4.0.1" } @@ -17565,21 +21011,48 @@ }, "chownr": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, "ci-info": { - "version": "2.0.0", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + } + } + }, "clean-stack": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, "clear": { - "version": "0.1.0" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", + "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==" }, "cli-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { "restore-cursor": "^3.1.0" @@ -17587,16 +21060,22 @@ }, "cli-progress": { "version": "3.11.2", + "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.11.2.tgz", + "integrity": "sha512-lCPoS6ncgX4+rJu5bS3F/iCz17kZ9MPZ6dpuTtI0KXKABkhyXIdYB3Inby1OpaGti3YlI3EeEkM9AuWpelJrVA==", "requires": { "string-width": "^4.2.3" } }, "cli-spinners": { "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", "dev": true }, "cli-truncate": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "requires": { "slice-ansi": "^5.0.0", @@ -17605,14 +21084,20 @@ "dependencies": { "ansi-regex": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, "emoji-regex": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "string-width": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "requires": { "eastasianwidth": "^0.2.0", @@ -17622,6 +21107,8 @@ }, "strip-ansi": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", "dev": true, "requires": { "ansi-regex": "^6.0.1" @@ -17631,10 +21118,14 @@ }, "cli-width": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, "cliui": { "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -17643,10 +21134,14 @@ }, "clone": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true }, "clone-deep": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "requires": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -17655,6 +21150,8 @@ }, "cmd-shim": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz", + "integrity": "sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==", "dev": true, "requires": { "mkdirp-infer-owner": "^2.0.0" @@ -17662,6 +21159,8 @@ }, "color": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "requires": { "color-convert": "^1.9.3", "color-string": "^1.6.0" @@ -17669,26 +21168,36 @@ "dependencies": { "color-convert": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.3" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" } } }, "color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.4" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "color-string": { "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "requires": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -17696,14 +21205,20 @@ }, "color-support": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "dev": true }, "colorette": { - "version": "2.0.19", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, "colorspace": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", "requires": { "color": "^3.1.3", "text-hex": "1.0.x" @@ -17711,6 +21226,8 @@ }, "columnify": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", "dev": true, "requires": { "strip-ansi": "^6.0.1", @@ -17719,15 +21236,23 @@ }, "combined-stream": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.20.3" + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true }, "commitlint": { "version": "17.4.2", + "resolved": "https://registry.npmjs.org/commitlint/-/commitlint-17.4.2.tgz", + "integrity": "sha512-1UQecX+vSJHQXTKFMRZmf8EG3BYYjkT26JLe6FTQhu7N67FiWdWbqXMpcQSpqx/kWNz9a+DX2au2e61IH89PDA==", "dev": true, "requires": { "@commitlint/cli": "^17.4.2", @@ -17736,13 +21261,19 @@ }, "common-ancestor-path": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", "dev": true }, "commondir": { - "version": "1.0.1" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "compare-func": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", "dev": true, "requires": { "array-ify": "^1.0.0", @@ -17750,10 +21281,14 @@ } }, "concat-map": { - "version": "0.0.1" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "concat-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -17764,6 +21299,8 @@ }, "config-chain": { "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", "dev": true, "requires": { "ini": "^1.3.4", @@ -17772,10 +21309,14 @@ }, "console-control-strings": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", "dev": true }, "conventional-changelog-angular": { "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", "dev": true, "requires": { "compare-func": "^2.0.0", @@ -17784,6 +21325,8 @@ }, "conventional-changelog-conventionalcommits": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", + "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", "dev": true, "requires": { "compare-func": "^2.0.0", @@ -17793,6 +21336,8 @@ }, "conventional-changelog-core": { "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", "dev": true, "requires": { "add-stream": "^1.0.0", @@ -17809,14 +21354,79 @@ "read-pkg": "^3.0.0", "read-pkg-up": "^3.0.0", "through2": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + } } }, "conventional-changelog-preset-loader": { "version": "2.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", + "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", "dev": true }, "conventional-changelog-writer": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", "dev": true, "requires": { "conventional-commits-filter": "^2.0.7", @@ -17832,6 +21442,8 @@ }, "conventional-commits-filter": { "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", "dev": true, "requires": { "lodash.ismatch": "^4.4.0", @@ -17840,310 +21452,125 @@ }, "conventional-commits-parser": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", "dev": true, "requires": { "is-text-path": "^1.0.1", "JSONStream": "^1.0.4", "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "conventional-recommended-bump": { - "version": "6.1.0", - "dev": true, - "requires": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - } - }, - "convert-source-map": { - "version": "1.9.0" - }, - "core-js-compat": { - "version": "3.29.0", - "requires": { - "browserslist": "^4.21.5" - } - }, - "core-util-is": { - "version": "1.0.3", - "dev": true - }, - "cosmiconfig": { - "version": "8.1.0", - "dev": true, - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - }, - "cosmiconfig-typescript-loader": { - "version": "4.3.0", - "dev": true, - "requires": {} - }, - "create-require": { - "version": "1.1.1", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "cssom": { - "version": "0.5.0" - }, - "cssstyle": { - "version": "2.3.0", - "requires": { - "cssom": "~0.3.6" - }, - "dependencies": { - "cssom": { - "version": "0.3.8" - } - } - }, - "d3": { - "version": "4.13.0", - "requires": { - "d3-array": "1.2.1", - "d3-axis": "1.0.8", - "d3-brush": "1.0.4", - "d3-chord": "1.0.4", - "d3-collection": "1.0.4", - "d3-color": "1.0.3", - "d3-dispatch": "1.0.3", - "d3-drag": "1.2.1", - "d3-dsv": "1.0.8", - "d3-ease": "1.0.3", - "d3-force": "1.1.0", - "d3-format": "1.2.2", - "d3-geo": "1.9.1", - "d3-hierarchy": "1.1.5", - "d3-interpolate": "1.1.6", - "d3-path": "1.0.5", - "d3-polygon": "1.0.3", - "d3-quadtree": "1.0.3", - "d3-queue": "3.0.7", - "d3-random": "1.1.0", - "d3-request": "1.0.6", - "d3-scale": "1.0.7", - "d3-selection": "1.3.0", - "d3-shape": "1.2.0", - "d3-time": "1.0.8", - "d3-time-format": "2.1.1", - "d3-timer": "1.0.7", - "d3-transition": "1.1.1", - "d3-voronoi": "1.1.2", - "d3-zoom": "1.7.1" - } - }, - "d3-array": { - "version": "1.2.1" - }, - "d3-axis": { - "version": "1.0.8" - }, - "d3-brush": { - "version": "1.0.4", - "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" - } - }, - "d3-chord": { - "version": "1.0.4", - "requires": { - "d3-array": "1", - "d3-path": "1" - } - }, - "d3-collection": { - "version": "1.0.4" - }, - "d3-color": { - "version": "1.0.3" - }, - "d3-dispatch": { - "version": "1.0.3" - }, - "d3-drag": { - "version": "1.2.1", - "requires": { - "d3-dispatch": "1", - "d3-selection": "1" - } - }, - "d3-dsv": { - "version": "1.0.8", - "requires": { - "commander": "2", - "iconv-lite": "0.4", - "rw": "1" - } - }, - "d3-ease": { - "version": "1.0.3" - }, - "d3-force": { - "version": "1.1.0", - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "d3-format": { - "version": "1.2.2" - }, - "d3-geo": { - "version": "1.9.1", - "requires": { - "d3-array": "1" - } - }, - "d3-hierarchy": { - "version": "1.1.5" - }, - "d3-interpolate": { - "version": "1.1.6", - "requires": { - "d3-color": "1" - } - }, - "d3-path": { - "version": "1.0.5" - }, - "d3-polygon": { - "version": "1.0.3" - }, - "d3-quadtree": { - "version": "1.0.3" - }, - "d3-queue": { - "version": "3.0.7" - }, - "d3-random": { - "version": "1.1.0" - }, - "d3-request": { - "version": "1.0.6", - "requires": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-dsv": "1", - "xmlhttprequest": "1" + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" } }, - "d3-scale": { - "version": "1.0.7", + "conventional-recommended-bump": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", + "dev": true, "requires": { - "d3-array": "^1.2.0", - "d3-collection": "1", - "d3-color": "1", - "d3-format": "1", - "d3-interpolate": "1", - "d3-time": "1", - "d3-time-format": "2" + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" } }, - "d3-selection": { - "version": "1.3.0" + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, - "d3-shape": { - "version": "1.2.0", + "core-js-compat": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", + "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", "requires": { - "d3-path": "1" + "browserslist": "^4.21.5" } }, - "d3-time": { - "version": "1.0.8" + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true }, - "d3-time-format": { - "version": "2.1.1", + "cosmiconfig": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", + "dev": true, "requires": { - "d3-time": "1" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" } }, - "d3-timer": { - "version": "1.0.7" + "cosmiconfig-typescript-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", + "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", + "dev": true, + "requires": {} }, - "d3-transition": { + "create-require": { "version": "1.1.1", - "requires": { - "d3-color": "1", - "d3-dispatch": "1", - "d3-ease": "1", - "d3-interpolate": "1", - "d3-selection": "^1.1.0", - "d3-timer": "1" - } - }, - "d3-voronoi": { - "version": "1.1.2" + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, - "d3-zoom": { - "version": "1.7.1", + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "requires": { - "d3-dispatch": "1", - "d3-drag": "1", - "d3-interpolate": "1", - "d3-selection": "1", - "d3-transition": "1" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "dargs": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", "dev": true }, - "data-urls": { - "version": "3.0.2", - "requires": { - "abab": "^2.0.6", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0" - } - }, "dateformat": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true }, "debug": { "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } }, "debuglog": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", "dev": true }, "decamelize": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true }, "decamelize-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, "requires": { "decamelize": "^1.1.0", @@ -18152,28 +21579,125 @@ "dependencies": { "map-obj": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true } } }, - "decimal.js": { - "version": "10.4.3" - }, "dedent": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, "deep-eql": { "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "requires": { "type-detect": "^4.0.0" } }, "deep-is": { - "version": "0.1.4" + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "requires": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "dependencies": { + "execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + } + } + }, + "default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + } }, "default-require-extensions": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, "requires": { "strip-bom": "^4.0.0" @@ -18181,6 +21705,8 @@ }, "defaults": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "requires": { "clone": "^1.0.2" @@ -18188,29 +21714,54 @@ }, "define-lazy-prop": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "delayed-stream": { - "version": "1.0.0" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true }, "delegates": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", "dev": true }, "depd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, "deprecation": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", "dev": true }, "detect-indent": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true }, "dezalgo": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, "requires": { "asap": "^2.0.0", @@ -18218,29 +21769,32 @@ } }, "diff": { - "version": "5.0.0" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" }, "dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, "requires": { "path-type": "^4.0.0" } }, "doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" } }, - "domexception": { - "version": "4.0.0", - "requires": { - "webidl-conversions": "^7.0.0" - } - }, "dot-prop": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, "requires": { "is-obj": "^2.0.0" @@ -18248,34 +21802,50 @@ }, "dotenv": { "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", "dev": true }, "duplexer": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, "eastasianwidth": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, "ejs": { - "version": "3.1.8", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dev": true, "requires": { "jake": "^10.8.5" } }, "electron-to-chromium": { - "version": "1.4.324" + "version": "1.4.404", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.404.tgz", + "integrity": "sha512-te57sWvQdpxmyd1GiswaodKdXdPgn9cN4ht8JlNa04QgtrfnUdWEo1261rY2vaC6TKaiHn0E7QerJWPKFCvMVw==" }, "emoji-regex": { - "version": "8.0.0" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "enabled": { - "version": "2.0.0" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, "encoding": { "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "optional": true, "requires": { @@ -18284,6 +21854,8 @@ "dependencies": { "iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "optional": true, "requires": { @@ -18294,102 +21866,159 @@ }, "end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { "once": "^1.4.0" } }, + "enhanced-resolve": { + "version": "5.14.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", + "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, "enquirer": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dev": true, "requires": { "ansi-colors": "^4.1.1" } }, - "entities": { - "version": "4.4.0" - }, "env-paths": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "dev": true }, "envinfo": { "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true }, "err-code": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true }, "error-ex": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es6-error": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", "dev": true }, "escalade": { - "version": "3.1.1" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-string-regexp": { - "version": "4.0.0" - }, - "escodegen": { - "version": "2.0.0", - "requires": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0" - }, - "levn": { - "version": "0.3.0", - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "prelude-ls": { - "version": "1.1.2" - }, - "source-map": { - "version": "0.6.1", - "optional": true - }, - "type-check": { - "version": "0.3.2", - "requires": { - "prelude-ls": "~1.1.2" - } - } - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { - "version": "8.29.0", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.3.3", - "@humanwhocodes/config-array": "^0.11.6", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -18398,94 +22027,299 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", - "globals": "^13.15.0", - "grapheme-splitter": "^1.0.4", + "globals": "^13.19.0", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + } + } + }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-import-resolver-typescript": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.5" + }, + "dependencies": { + "globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" }, "dependencies": { - "ajv": { - "version": "6.12.6", + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "ms": "^2.1.1" } }, - "eslint-scope": { - "version": "7.1.1", + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "esutils": "^2.0.2" } - }, - "estraverse": { - "version": "5.3.0", + } + } + }, + "eslint-plugin-notice": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/eslint-plugin-notice/-/eslint-plugin-notice-0.9.10.tgz", + "integrity": "sha512-rF79EuqdJKu9hhTmwUkNeSvLmmq03m/NXq/NHwUENHbdJ0wtoyOjxZBhW4QCug8v5xYE6cGe3AWkGqSIe9KUbQ==", + "dev": true, + "requires": { + "find-root": "^1.1.0", + "lodash": "^4.17.15", + "metric-lcs": "^0.1.2" + } + }, + "eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "requires": {} + }, + "eslint-plugin-sonarjs": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.19.0.tgz", + "integrity": "sha512-6+s5oNk5TFtVlbRxqZN7FIGmjdPCYQKaTzFPmqieCmsU1kBYDzndTeQav0xtQNwZJWu5awWfTGe8Srq9xFOGnw==", + "dev": true, + "requires": {} + }, + "eslint-plugin-unicorn": { + "version": "45.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-45.0.2.tgz", + "integrity": "sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.19.1", + "@eslint-community/eslint-utils": "^4.1.2", + "ci-info": "^3.6.1", + "clean-regexp": "^1.0.0", + "esquery": "^1.4.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.2.0", + "jsesc": "^3.0.2", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.24", + "regjsparser": "^0.9.1", + "safe-regex": "^2.1.1", + "semver": "^7.3.8", + "strip-indent": "^3.0.0" + }, + "dependencies": { + "jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "dev": true }, - "globals": { - "version": "13.20.0", + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { - "type-fest": "^0.20.2" + "yallist": "^4.0.0" } }, - "json-schema-traverse": { - "version": "0.4.1", - "dev": true + "semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, - "type-fest": { - "version": "0.20.2", + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, - "eslint-config-prettier": { - "version": "8.5.0", - "dev": true, - "requires": {} - }, - "eslint-plugin-notice": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/eslint-plugin-notice/-/eslint-plugin-notice-0.9.10.tgz", - "integrity": "sha512-rF79EuqdJKu9hhTmwUkNeSvLmmq03m/NXq/NHwUENHbdJ0wtoyOjxZBhW4QCug8v5xYE6cGe3AWkGqSIe9KUbQ==", + "eslint-plugin-unused-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz", + "integrity": "sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==", "dev": true, "requires": { - "find-root": "^1.1.0", - "lodash": "^4.17.15", - "metric-lcs": "^0.1.2" + "eslint-rule-composer": "^0.3.0" } }, + "eslint-rule-composer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", + "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", + "dev": true + }, "eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -18494,6 +22328,8 @@ }, "eslint-utils": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { "eslint-visitor-keys": "^2.0.0" @@ -18501,28 +22337,39 @@ "dependencies": { "eslint-visitor-keys": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true } } }, "eslint-visitor-keys": { - "version": "3.3.0", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.4.1", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { - "version": "4.0.1" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true }, "esquery": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -18530,12 +22377,16 @@ "dependencies": { "estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { "estraverse": "^5.2.0" @@ -18543,23 +22394,33 @@ "dependencies": { "estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true } } }, "estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { - "version": "2.0.3" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "eventemitter3": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -18575,6 +22436,8 @@ }, "external-editor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { "chardet": "^0.7.0", @@ -18584,6 +22447,8 @@ "dependencies": { "tmp": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "~1.0.2" @@ -18591,19 +22456,16 @@ } } }, - "fast-csv": { - "version": "4.3.6", - "requires": { - "@fast-csv/format": "4.3.5", - "@fast-csv/parse": "4.3.6" - } - }, "fast-deep-equal": { "version": "3.1.3", - "dev": true + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -18614,6 +22476,9 @@ "dependencies": { "glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -18622,25 +22487,39 @@ }, "fast-json-stable-stringify": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { - "version": "2.0.6" + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "fastq": { "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, "requires": { "reusify": "^1.0.4" } }, "fecha": { - "version": "4.2.3" + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, "figlet": { - "version": "1.5.2" + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.2.tgz", + "integrity": "sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==" }, "figures": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" @@ -18648,12 +22527,16 @@ "dependencies": { "escape-string-regexp": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true } } }, "file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { "flat-cache": "^3.0.4" @@ -18661,6 +22544,8 @@ }, "filelist": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dev": true, "requires": { "minimatch": "^5.0.1" @@ -18668,6 +22553,8 @@ "dependencies": { "brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -18675,6 +22562,8 @@ }, "minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -18684,12 +22573,16 @@ }, "fill-range": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "requires": { "to-regex-range": "^5.0.1" } }, "find-cache-dir": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "requires": { "commondir": "^1.0.1", "make-dir": "^2.0.0", @@ -18704,16 +22597,22 @@ }, "find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "flat": { - "version": "5.0.2" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==" }, "flat-cache": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { "flatted": "^3.1.0", @@ -18722,17 +22621,34 @@ }, "flatted": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, "fn.name": { - "version": "1.1.0" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" }, "follow-redirects": { "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, "foreground-child": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -18741,6 +22657,9 @@ }, "form-data": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -18749,14 +22668,20 @@ }, "fromentries": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true }, "fs-constants": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", "dev": true }, "fs-extra": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", + "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -18765,23 +22690,51 @@ }, "fs-minipass": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", "dev": true, "requires": { "minipass": "^3.0.0" } }, "fs.realpath": { - "version": "1.0.0" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, "function-bind": { - "version": "1.1.1" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true }, "gauge": { "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", "dev": true, "requires": { "aproba": "^1.0.3 || ^2.0.0", @@ -18795,20 +22748,42 @@ } }, "gensync": { - "version": "1.0.0-beta.2" + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { - "version": "2.0.5" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-func-name": { - "version": "2.0.0" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } }, "get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, "get-pkg-repo": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", "dev": true, "requires": { "@hutson/parse-repository-url": "^3.0.0", @@ -18819,10 +22794,14 @@ "dependencies": { "isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "requires": { "core-util-is": "~1.0.0", @@ -18836,10 +22815,14 @@ }, "safe-buffer": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, "string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { "safe-buffer": "~5.1.0" @@ -18847,6 +22830,8 @@ }, "through2": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { "readable-stream": "~2.3.6", @@ -18855,6 +22840,8 @@ }, "yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "requires": { "cliui": "^7.0.2", @@ -18870,14 +22857,36 @@ }, "get-port": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", "dev": true }, "get-stream": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-tsconfig": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", "dev": true }, "git-raw-commits": { "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", "dev": true, "requires": { "dargs": "^7.0.0", @@ -18889,6 +22898,8 @@ }, "git-remote-origin-url": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", "dev": true, "requires": { "gitconfiglocal": "^1.0.0", @@ -18897,12 +22908,16 @@ "dependencies": { "pify": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true } } }, "git-semver-tags": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, "requires": { "meow": "^8.0.0", @@ -18911,6 +22926,8 @@ }, "git-up": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, "requires": { "is-ssh": "^1.4.0", @@ -18919,6 +22936,8 @@ }, "git-url-parse": { "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", "dev": true, "requires": { "git-up": "^7.0.0" @@ -18926,6 +22945,8 @@ }, "gitconfiglocal": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", "dev": true, "requires": { "ini": "^1.3.2" @@ -18933,6 +22954,8 @@ }, "glob": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -18944,6 +22967,8 @@ "dependencies": { "brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -18951,6 +22976,8 @@ }, "minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -18960,6 +22987,8 @@ }, "glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { "is-glob": "^4.0.3" @@ -18967,16 +22996,63 @@ }, "global-dirs": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "requires": { "ini": "^1.3.4" } }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, "globals": { - "version": "11.12.0" + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } }, "globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, "requires": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -18986,15 +23062,30 @@ "slash": "^3.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { - "version": "4.2.10" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "grapheme-splitter": { - "version": "1.0.4", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "handlebars": { "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "requires": { "minimist": "^1.2.5", @@ -19002,33 +23093,73 @@ "source-map": "^0.6.1", "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "dev": true - } } }, "hard-rejection": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true }, "has": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-flag": { - "version": "4.0.0" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } }, "has-unicode": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, "hasha": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, "requires": { "is-stream": "^2.0.0", @@ -19037,15 +23168,21 @@ "dependencies": { "type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true } } }, "he": { - "version": "1.2.0" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "hosted-git-info": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -19053,6 +23190,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -19060,26 +23199,29 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, - "html-encoding-sniffer": { - "version": "3.0.0", - "requires": { - "whatwg-encoding": "^2.0.0" - } - }, "html-escaper": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "http-cache-semantics": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "http-proxy-agent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, "requires": { "@tootallnate/once": "2", "agent-base": "6", @@ -19088,6 +23230,9 @@ }, "https-proxy-agent": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, "requires": { "agent-base": "6", "debug": "4" @@ -19095,10 +23240,14 @@ }, "human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "humanize-ms": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", "dev": true, "requires": { "ms": "^2.0.0" @@ -19106,23 +23255,35 @@ }, "husky": { "version": "8.0.3", + "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", + "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", "dev": true }, "iconv-lite": { "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "ignore": { - "version": "5.2.4" + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true }, "ignore-walk": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", + "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", "dev": true, "requires": { "minimatch": "^5.0.1" @@ -19130,6 +23291,8 @@ "dependencies": { "brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -19137,6 +23300,8 @@ }, "minimatch": { "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -19146,6 +23311,8 @@ }, "import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -19154,12 +23321,16 @@ "dependencies": { "resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true } } }, "import-local": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -19168,6 +23339,8 @@ "dependencies": { "find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -19176,6 +23349,8 @@ }, "locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -19183,6 +23358,8 @@ }, "p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -19190,6 +23367,8 @@ }, "p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -19197,6 +23376,8 @@ }, "pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" @@ -19206,32 +23387,45 @@ }, "imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, "indent-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, "infer-owner": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, "inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { - "version": "2.0.4" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", - "dev": true + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "init-package-json": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-3.0.2.tgz", + "integrity": "sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A==", "dev": true, "requires": { "npm-package-arg": "^9.0.1", @@ -19245,6 +23439,8 @@ "dependencies": { "hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "requires": { "lru-cache": "^7.5.1" @@ -19252,10 +23448,14 @@ }, "lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -19265,7 +23465,9 @@ } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -19273,6 +23475,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -19282,12 +23486,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "inquirer": { "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", "dev": true, "requires": { "ansi-escapes": "^4.2.1", @@ -19307,115 +23515,319 @@ "wrap-ansi": "^7.0.0" } }, - "interpret": { - "version": "1.4.0" + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } }, "ip": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "requires": { + "builtin-modules": "^3.3.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, "is-ci": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dev": true, "requires": { "ci-info": "^2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + } } }, "is-core-module": { - "version": "2.11.0", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "requires": { "has": "^1.0.3" } }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, "is-extglob": { - "version": "2.1.1" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true }, "is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } }, + "is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "requires": { + "is-docker": "^3.0.0" + }, + "dependencies": { + "is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true + } + } + }, "is-interactive": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, "is-lambda": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, "is-number": { - "version": "7.0.0" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-obj": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true }, "is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, "is-plain-obj": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true }, "is-plain-object": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "requires": { "isobject": "^3.0.1" } }, - "is-potential-custom-element-name": { - "version": "1.0.1" + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } }, "is-ssh": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "dev": true, "requires": { "protocols": "^2.0.1" } }, "is-stream": { - "version": "2.0.1" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } }, "is-text-path": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", "dev": true, "requires": { "text-extensions": "^1.0.0" } }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, "is-typedarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "is-unicode-supported": { - "version": "0.1.0" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } }, "is-windows": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, "is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "requires": { "is-docker": "^2.0.0" @@ -19423,20 +23835,29 @@ }, "isarray": { "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", "dev": true }, "isexe": { "version": "2.0.0", - "dev": true + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "isobject": { - "version": "3.0.1" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, "istanbul-lib-coverage": { - "version": "3.2.0" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" }, "istanbul-lib-hook": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, "requires": { "append-transform": "^2.0.0" @@ -19444,6 +23865,8 @@ }, "istanbul-lib-instrument": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", @@ -19454,6 +23877,8 @@ }, "istanbul-lib-processinfo": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, "requires": { "archy": "^1.0.0", @@ -19466,6 +23891,8 @@ "dependencies": { "p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" @@ -19475,6 +23902,8 @@ }, "istanbul-lib-report": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", @@ -19484,6 +23913,8 @@ "dependencies": { "make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -19493,21 +23924,19 @@ }, "istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "dev": true - } } }, "istanbul-reports": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -19515,95 +23944,85 @@ } }, "jake": { - "version": "10.8.5", + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.6.tgz", + "integrity": "sha512-G43Ub9IYEFfu72sua6rzooi8V8Gz2lkfk48rW20vEWCGizeaEPlKB1Kh8JIA84yQbiAEfqlPmSpGgCKKxH3rDA==", "dev": true, "requires": { "async": "^3.2.3", "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "filelist": "^1.0.4", + "minimatch": "^3.1.2" } }, - "js-sdsl": { - "version": "4.3.0", - "dev": true - }, "js-tokens": { - "version": "4.0.0" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "requires": { "argparse": "^2.0.1" } }, - "jsdom": { - "version": "20.0.3", - "requires": { - "abab": "^2.0.6", - "acorn": "^8.8.1", - "acorn-globals": "^7.0.0", - "cssom": "^0.5.0", - "cssstyle": "^2.3.0", - "data-urls": "^3.0.2", - "decimal.js": "^10.4.2", - "domexception": "^4.0.0", - "escodegen": "^2.0.0", - "form-data": "^4.0.0", - "html-encoding-sniffer": "^3.0.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.2", - "parse5": "^7.1.1", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.1.2", - "w3c-xmlserializer": "^4.0.0", - "webidl-conversions": "^7.0.0", - "whatwg-encoding": "^2.0.0", - "whatwg-mimetype": "^3.0.0", - "whatwg-url": "^11.0.0", - "ws": "^8.11.0", - "xml-name-validator": "^4.0.0" - } - }, "jsesc": { - "version": "2.5.2" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" }, "json-parse-better-errors": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema-traverse": { "version": "1.0.0", - "dev": true + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json-stringify-nice": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", "dev": true }, "json-stringify-safe": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json5": { - "version": "2.2.3" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonc-parser": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "jsonfile": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "requires": { "graceful-fs": "^4.1.6", "universalify": "^2.0.0" @@ -19611,10 +24030,14 @@ }, "jsonparse": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, "JSONStream": { "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { "jsonparse": "^1.2.0", @@ -19623,24 +24046,36 @@ }, "just-diff": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-5.2.0.tgz", + "integrity": "sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==", "dev": true }, "just-diff-apply": { "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", "dev": true }, "just-extend": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", "dev": true }, "kind-of": { - "version": "6.0.3" + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "kuler": { - "version": "2.0.0" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, "lerna": { "version": "6.4.1", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-6.4.1.tgz", + "integrity": "sha512-0t8TSG4CDAn5+vORjvTFn/ZEGyc4LOEsyBUpzcdIxODHPKM4TVOGvbW9dBs1g40PhOrQfwhHS+3fSx/42j42dQ==", "dev": true, "requires": { "@lerna/add": "6.4.1", @@ -19672,6 +24107,8 @@ }, "levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { "prelude-ls": "^1.2.1", @@ -19680,6 +24117,8 @@ }, "libnpmaccess": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-6.0.4.tgz", + "integrity": "sha512-qZ3wcfIyUoW0+qSFkMBovcTrSGJ3ZeyvpR7d5N9pEYv/kXs8sHP2wiqEIXBKLFrZlmM0kR0RJD7mtfLngtlLag==", "dev": true, "requires": { "aproba": "^2.0.0", @@ -19690,6 +24129,8 @@ "dependencies": { "hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "requires": { "lru-cache": "^7.5.1" @@ -19697,10 +24138,14 @@ }, "lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -19710,7 +24155,9 @@ } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -19718,6 +24165,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -19727,12 +24176,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "libnpmpublish": { "version": "6.0.5", + "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-6.0.5.tgz", + "integrity": "sha512-LUR08JKSviZiqrYTDfywvtnsnxr+tOvBU0BF8H+9frt7HMvc6Qn6F8Ubm72g5hDTHbq8qupKfDvDAln2TVPvFg==", "dev": true, "requires": { "normalize-package-data": "^4.0.0", @@ -19744,6 +24197,8 @@ "dependencies": { "hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "requires": { "lru-cache": "^7.5.1" @@ -19751,10 +24206,14 @@ }, "lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "normalize-package-data": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -19765,6 +24224,8 @@ }, "npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -19774,7 +24235,9 @@ } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -19782,6 +24245,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -19791,20 +24256,28 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "lilconfig": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", + "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", "dev": true }, "lines-and-columns": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", "dev": true }, "lint-staged": { "version": "13.1.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.1.0.tgz", + "integrity": "sha512-pn/sR8IrcF/T0vpWLilih8jmVouMlxqXxKuAojmbiGX5n/gDnz+abdPptlj0vYnbfE0SQNl3CY/HwtM0+yfOVQ==", "dev": true, "requires": { "cli-truncate": "^3.1.0", @@ -19822,12 +24295,10 @@ "yaml": "^2.1.3" }, "dependencies": { - "commander": { - "version": "9.5.0", - "dev": true - }, "execa": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz", + "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==", "dev": true, "requires": { "cross-spawn": "^7.0.3", @@ -19843,18 +24314,26 @@ }, "human-signals": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", + "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==", "dev": true }, "is-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true }, "mimic-fn": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true }, "npm-run-path": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "requires": { "path-key": "^4.0.0" @@ -19862,6 +24341,8 @@ }, "onetime": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "requires": { "mimic-fn": "^4.0.0" @@ -19869,16 +24350,22 @@ }, "path-key": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true }, "strip-final-newline": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true } } }, "listr2": { - "version": "5.0.7", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, "requires": { "cli-truncate": "^2.1.0", @@ -19893,6 +24380,8 @@ "dependencies": { "cli-truncate": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "requires": { "slice-ansi": "^3.0.0", @@ -19901,10 +24390,14 @@ }, "is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "slice-ansi": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -19916,6 +24409,8 @@ }, "load-json-file": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", + "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", "dev": true, "requires": { "graceful-fs": "^4.1.15", @@ -19926,95 +24421,123 @@ "dependencies": { "type-fest": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true } } }, "locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "requires": { "p-locate": "^5.0.0" } }, "lodash": { - "version": "4.17.21" + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true }, "lodash.camelcase": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, "lodash.clonedeep": { - "version": "4.5.0" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" }, "lodash.debounce": { - "version": "4.0.8" - }, - "lodash.escaperegexp": { - "version": "4.1.2" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "lodash.flattendeep": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", "dev": true }, "lodash.get": { "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, - "lodash.groupby": { - "version": "4.6.0" - }, - "lodash.isboolean": { - "version": "3.0.3" - }, - "lodash.isequal": { - "version": "4.5.0" - }, "lodash.isfunction": { - "version": "3.0.9" + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true }, "lodash.ismatch": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", "dev": true }, - "lodash.isnil": { - "version": "4.0.0" - }, "lodash.isplainobject": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", "dev": true }, - "lodash.isundefined": { - "version": "3.0.1" - }, "lodash.kebabcase": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", "dev": true }, "lodash.merge": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "lodash.mergewith": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", "dev": true }, "lodash.snakecase": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", "dev": true }, "lodash.startcase": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", "dev": true }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, "lodash.uniq": { - "version": "4.5.0" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true }, "lodash.upperfirst": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", "dev": true }, "log-symbols": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "requires": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -20022,6 +24545,8 @@ }, "log-update": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "requires": { "ansi-escapes": "^4.3.0", @@ -20032,10 +24557,14 @@ "dependencies": { "is-fullwidth-code-point": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "slice-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -20045,6 +24574,8 @@ }, "wrap-ansi": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -20056,6 +24587,8 @@ }, "logform": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", + "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", "requires": { "@colors/colors": "1.5.0", "@types/triple-beam": "^1.3.2", @@ -20067,37 +24600,51 @@ }, "loupe": { "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "requires": { "get-func-name": "^2.0.0" } }, "lru-cache": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { "yallist": "^3.0.2" } }, "make-dir": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "requires": { "pify": "^4.0.1", "semver": "^5.6.0" }, "dependencies": { "pify": { - "version": "4.0.1" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "semver": { - "version": "5.7.1" + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, "make-error": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "make-fetch-happen": { "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", "dev": true, "requires": { "agentkeepalive": "^4.2.1", @@ -20120,16 +24667,22 @@ "dependencies": { "lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true } } }, "map-obj": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, "meow": { "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", "dev": true, "requires": { "@types/minimist": "^1.2.0", @@ -20145,96 +24698,25 @@ "yargs-parser": "^20.2.3" }, "dependencies": { - "find-up": { - "version": "4.1.0", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "dev": true - }, - "locate-path": { - "version": "5.0.0", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "read-pkg": { - "version": "5.2.0", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "normalize-package-data": { - "version": "2.5.0", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "type-fest": { - "version": "0.6.0", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "dev": true - } - } - }, - "semver": { - "version": "5.7.1", - "dev": true - }, "type-fest": { "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true } } }, "merge-stream": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "merge2": { - "version": "1.4.1" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true }, "metric-lcs": { "version": "0.1.2", @@ -20244,40 +24726,60 @@ }, "micromatch": { "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" } }, "mime-db": { - "version": "1.52.0" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true }, "mime-types": { "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "requires": { "mime-db": "1.52.0" } }, "mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "min-indent": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true }, "minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "minimist-options": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, "requires": { "arrify": "^1.0.1", @@ -20287,6 +24789,8 @@ }, "minipass": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -20294,12 +24798,16 @@ "dependencies": { "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "minipass-collect": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -20307,6 +24815,8 @@ }, "minipass-fetch": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", "dev": true, "requires": { "encoding": "^0.1.13", @@ -20317,6 +24827,8 @@ }, "minipass-flush": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -20324,6 +24836,8 @@ }, "minipass-json-stream": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", "dev": true, "requires": { "jsonparse": "^1.3.1", @@ -20332,6 +24846,8 @@ }, "minipass-pipeline": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -20339,6 +24855,8 @@ }, "minipass-sized": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", "dev": true, "requires": { "minipass": "^3.0.0" @@ -20346,6 +24864,8 @@ }, "minizlib": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", "dev": true, "requires": { "minipass": "^3.0.0", @@ -20354,16 +24874,22 @@ "dependencies": { "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true }, "mkdirp-infer-owner": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", + "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -20373,6 +24899,8 @@ }, "mocha": { "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "requires": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -20399,6 +24927,8 @@ "dependencies": { "glob": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -20410,6 +24940,8 @@ "dependencies": { "minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "requires": { "brace-expansion": "^1.1.7" } @@ -20418,12 +24950,16 @@ }, "minimatch": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "requires": { "brace-expansion": "^2.0.1" }, "dependencies": { "brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "requires": { "balanced-match": "^1.0.0" } @@ -20431,16 +24967,22 @@ } }, "ms": { - "version": "2.1.3" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "requires": { "has-flag": "^4.0.0" } }, "yargs": { "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "requires": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -20455,13 +24997,19 @@ }, "modify-values": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, "ms": { - "version": "2.1.2" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multimatch": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", "dev": true, "requires": { "@types/minimatch": "^3.0.3", @@ -20473,35 +25021,51 @@ "dependencies": { "arrify": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true } } }, "mute-stream": { "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, "nanoid": { - "version": "3.3.3" + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==" }, "natural-compare": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "natural-compare-lite": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true }, "negotiator": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, "nise": { "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, "requires": { "@sinonjs/commons": "^2.0.0", @@ -20513,35 +25077,23 @@ }, "node-addon-api": { "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", "dev": true }, "node-fetch": { - "version": "2.6.9", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dev": true, "requires": { "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } } }, "node-gyp": { "version": "9.3.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", + "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", "dev": true, "requires": { "env-paths": "^2.2.0", @@ -20558,6 +25110,8 @@ "dependencies": { "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -20570,6 +25124,8 @@ }, "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -20577,13 +25133,17 @@ }, "nopt": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", "dev": true, "requires": { "abbrev": "^1.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20591,26 +25151,36 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "node-gyp-build": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", "dev": true }, "node-preload": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, "requires": { "process-on-spawn": "^1.0.0" } }, "node-releases": { - "version": "2.0.10" + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.11.tgz", + "integrity": "sha512-+M0PwXeU80kRohZ3aT4J/OnR+l9/KD2nVLNNoRgFtnf+umQVFdGBAO2N8+nCnEi0xlh/Wk3zOGC+vNNx+uM79Q==" }, "nopt": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", "dev": true, "requires": { "abbrev": "1" @@ -20618,6 +25188,8 @@ }, "normalize-package-data": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, "requires": { "hosted-git-info": "^4.0.1", @@ -20628,13 +25200,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20642,15 +25218,21 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "normalize-path": { - "version": "3.0.0" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "npm-bundled": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", "dev": true, "requires": { "npm-normalize-package-bin": "^1.0.1" @@ -20658,6 +25240,8 @@ }, "npm-install-checks": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", + "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", "dev": true, "requires": { "semver": "^7.1.1" @@ -20665,13 +25249,17 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20679,16 +25267,22 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "npm-normalize-package-bin": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", "dev": true }, "npm-package-arg": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.1.tgz", + "integrity": "sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg==", "dev": true, "requires": { "hosted-git-info": "^3.0.6", @@ -20698,10 +25292,14 @@ "dependencies": { "builtins": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", "dev": true }, "hosted-git-info": { "version": "3.0.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", + "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20709,13 +25307,17 @@ }, "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20723,6 +25325,8 @@ }, "validate-npm-package-name": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", "dev": true, "requires": { "builtins": "^1.0.3" @@ -20730,12 +25334,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "npm-packlist": { "version": "5.1.3", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", + "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", "dev": true, "requires": { "glob": "^8.0.1", @@ -20746,6 +25354,8 @@ "dependencies": { "npm-bundled": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", + "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", "dev": true, "requires": { "npm-normalize-package-bin": "^2.0.0" @@ -20753,12 +25363,16 @@ }, "npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true } } }, "npm-pick-manifest": { "version": "7.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.2.tgz", + "integrity": "sha512-gk37SyRmlIjvTfcYl6RzDbSmS9Y4TOBXfsPnoYqTHARNgWbyDiCSMLUpmALDj4jjcTZpURiEfsSHJj9k7EV4Rw==", "dev": true, "requires": { "npm-install-checks": "^5.0.0", @@ -20769,6 +25383,8 @@ "dependencies": { "hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "requires": { "lru-cache": "^7.5.1" @@ -20776,14 +25392,20 @@ }, "lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true }, "npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -20793,7 +25415,9 @@ } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20801,6 +25425,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -20810,12 +25436,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "npm-registry-fetch": { "version": "13.3.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", + "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", "dev": true, "requires": { "make-fetch-happen": "^10.0.6", @@ -20829,6 +25459,8 @@ "dependencies": { "hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "requires": { "lru-cache": "^7.5.1" @@ -20836,10 +25468,14 @@ }, "lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -20849,7 +25485,9 @@ } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -20857,6 +25495,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -20866,12 +25506,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" @@ -20879,6 +25523,8 @@ }, "npmlog": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", "dev": true, "requires": { "are-we-there-yet": "^3.0.0", @@ -20887,11 +25533,10 @@ "set-blocking": "^2.0.0" } }, - "nwsapi": { - "version": "2.2.2" - }, "nx": { "version": "15.7.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-15.7.1.tgz", + "integrity": "sha512-8Gtqazww3rCWxJ+pgB3JDU6hQeA+qRMYh77mXvf5CFQPszqEqvvuiJtKzcieWjxn/IZpeyVRjmPypkEOM6BbHw==", "dev": true, "requires": { "@nrwl/cli": "15.7.1", @@ -20942,6 +25587,8 @@ "dependencies": { "fast-glob": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -20953,6 +25600,8 @@ }, "glob": { "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -20965,6 +25614,8 @@ }, "glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" @@ -20972,6 +25623,8 @@ }, "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -20979,6 +25632,8 @@ }, "minimatch": { "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" @@ -20986,23 +25641,48 @@ }, "semver": { "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", "dev": true, "requires": { "lru-cache": "^6.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, "yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } }, "nyc": { "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, "requires": { "@istanbuljs/load-nyc-config": "^1.0.0", @@ -21036,6 +25716,8 @@ "dependencies": { "cliui": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { "string-width": "^4.2.0", @@ -21045,6 +25727,8 @@ }, "find-cache-dir": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, "requires": { "commondir": "^1.0.1", @@ -21054,6 +25738,8 @@ }, "find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", @@ -21062,6 +25748,8 @@ }, "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -21074,6 +25762,8 @@ }, "istanbul-lib-instrument": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, "requires": { "@babel/core": "^7.7.5", @@ -21084,6 +25774,8 @@ }, "locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" @@ -21091,6 +25783,8 @@ }, "make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -21098,6 +25792,8 @@ }, "p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -21105,6 +25801,8 @@ }, "p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" @@ -21112,6 +25810,8 @@ }, "p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" @@ -21119,6 +25819,8 @@ }, "pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" @@ -21126,6 +25828,8 @@ }, "wrap-ansi": { "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { "ansi-styles": "^4.0.0", @@ -21135,10 +25839,14 @@ }, "y18n": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true }, "yargs": { "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, "requires": { "cliui": "^6.0.0", @@ -21156,6 +25864,8 @@ }, "yargs-parser": { "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, "requires": { "camelcase": "^5.0.0", @@ -21166,22 +25876,59 @@ }, "object-inspect": { "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } }, "one-time": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", "requires": { "fn.name": "1.x.x" } }, "onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" @@ -21189,6 +25936,8 @@ }, "open": { "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "requires": { "define-lazy-prop": "^2.0.0", @@ -21198,6 +25947,8 @@ }, "optionator": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { "deep-is": "^0.1.3", @@ -21210,6 +25961,8 @@ }, "ora": { "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "requires": { "bl": "^4.1.0", @@ -21223,31 +25976,38 @@ "wcwidth": "^1.0.1" } }, - "original-require": { - "version": "1.0.1" - }, "os-tmpdir": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, "p-finally": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true }, "p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "requires": { "p-limit": "^3.0.2" } }, "p-map": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, "requires": { "aggregate-error": "^3.0.0" @@ -21255,14 +26015,20 @@ }, "p-map-series": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", + "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", "dev": true }, "p-pipe": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", "dev": true }, "p-queue": { "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", "dev": true, "requires": { "eventemitter3": "^4.0.4", @@ -21271,20 +26037,28 @@ }, "p-reduce": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", "dev": true }, "p-timeout": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", "dev": true, "requires": { "p-finally": "^1.0.0" } }, "p-try": { - "version": "2.2.0" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "p-waterfall": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz", + "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", "dev": true, "requires": { "p-reduce": "^2.0.0" @@ -21292,6 +26066,8 @@ }, "package-hash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, "requires": { "graceful-fs": "^4.1.15", @@ -21302,6 +26078,8 @@ }, "pacote": { "version": "13.6.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", + "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", "dev": true, "requires": { "@npmcli/git": "^3.0.0", @@ -21329,6 +26107,8 @@ "dependencies": { "hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "requires": { "lru-cache": "^7.5.1" @@ -21336,10 +26116,14 @@ }, "lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "npm-package-arg": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", + "integrity": "sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -21349,7 +26133,9 @@ } }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21357,6 +26143,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -21366,12 +26154,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" @@ -21379,6 +26171,8 @@ }, "parse-conflict-json": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-2.0.2.tgz", + "integrity": "sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==", "dev": true, "requires": { "json-parse-even-better-errors": "^2.3.1", @@ -21388,6 +26182,8 @@ }, "parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -21398,12 +26194,16 @@ "dependencies": { "lines-and-columns": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true } } }, "parse-path": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, "requires": { "protocols": "^2.0.0" @@ -21411,74 +26211,101 @@ }, "parse-url": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, "requires": { "parse-path": "^7.0.0" } }, - "parse5": { - "version": "7.1.2", - "requires": { - "entities": "^4.4.0" - } - }, "path-exists": { - "version": "4.0.0" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { - "version": "1.0.1" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { - "version": "1.0.7" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "requires": { "isarray": "0.0.1" } }, "path-type": { - "version": "4.0.0" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true }, "pathval": { - "version": "1.1.1" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" }, "picocolors": { - "version": "1.0.0" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { - "version": "2.3.1" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pidtree": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", "dev": true }, "pify": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", "dev": true }, "pirates": { - "version": "4.0.5" + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" }, "pkg-dir": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "requires": { "find-up": "^3.0.0" }, "dependencies": { "find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "requires": { "locate-path": "^3.0.0" } }, "locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -21486,39 +26313,61 @@ }, "p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "requires": { "p-limit": "^2.0.0" } }, "path-exists": { - "version": "3.0.0" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" } } }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, "prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prettier": { "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", "dev": true }, "proc-log": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", + "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", "dev": true }, "process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, "process-on-spawn": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, "requires": { "fromentries": "^1.2.0" @@ -21526,18 +26375,26 @@ }, "promise-all-reject-late": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", "dev": true }, "promise-call-limit": { - "version": "1.0.1", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", + "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", "dev": true }, "promise-inflight": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", "dev": true }, "promise-retry": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", "dev": true, "requires": { "err-code": "^2.0.2", @@ -21546,6 +26403,8 @@ }, "promzard": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", + "integrity": "sha512-JZeYqd7UAcHCwI+sTOeUDYkvEU+1bQ7iE0UT1MgB/tERkAPkesW46MrpIySzODi+owTjZtiF8Ay5j9m60KmMBw==", "dev": true, "requires": { "read": "1" @@ -21553,44 +26412,57 @@ }, "proto-list": { "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, "protocols": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true }, "proxy-from-env": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "psl": { - "version": "1.9.0" - }, "punycode": { - "version": "2.3.0" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, "q": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", "dev": true }, - "querystringify": { - "version": "2.2.0" - }, "queue-microtask": { - "version": "1.2.3" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true }, "quick-lru": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true }, "randombytes": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "requires": { "safe-buffer": "^5.1.0" } }, "read": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", "dev": true, "requires": { "mute-stream": "~0.0.4" @@ -21598,10 +26470,14 @@ }, "read-cmd-shim": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-3.0.1.tgz", + "integrity": "sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==", "dev": true }, "read-package-json": { "version": "5.0.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", + "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", "dev": true, "requires": { "glob": "^8.0.1", @@ -21612,6 +26488,8 @@ "dependencies": { "hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, "requires": { "lru-cache": "^7.5.1" @@ -21619,10 +26497,14 @@ }, "lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "normalize-package-data": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dev": true, "requires": { "hosted-git-info": "^5.0.0", @@ -21633,10 +26515,14 @@ }, "npm-normalize-package-bin": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", + "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", "dev": true }, "semver": { - "version": "7.3.8", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -21644,6 +26530,8 @@ "dependencies": { "lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "requires": { "yallist": "^4.0.0" @@ -21653,12 +26541,16 @@ }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "read-package-json-fast": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", "dev": true, "requires": { "json-parse-even-better-errors": "^2.3.0", @@ -21667,6 +26559,8 @@ }, "read-pkg": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "requires": { "load-json-file": "^4.0.0", @@ -21676,10 +26570,14 @@ "dependencies": { "hosted-git-info": { "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "load-json-file": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, "requires": { "graceful-fs": "^4.1.2", @@ -21690,6 +26588,8 @@ }, "normalize-package-data": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", @@ -21700,6 +26600,8 @@ }, "parse-json": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "requires": { "error-ex": "^1.3.1", @@ -21708,6 +26610,8 @@ }, "path-type": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { "pify": "^3.0.0" @@ -21715,67 +26619,128 @@ }, "pify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true }, "semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true } } }, "read-pkg-up": { - "version": "3.0.0", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" }, "dependencies": { "find-up": { - "version": "2.1.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" } }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "locate-path": { - "version": "2.0.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^4.1.0" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "p-limit": { - "version": "1.3.0", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { - "p-try": "^1.0.0" + "p-limit": "^2.2.0" } }, - "p-locate": { - "version": "2.0.0", + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "requires": { - "p-limit": "^1.1.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true + } } }, - "p-try": { - "version": "1.0.0", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, - "path-exists": { - "version": "3.0.0", + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true } } }, "readable-stream": { - "version": "3.6.1", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -21784,6 +26749,8 @@ }, "readdir-scoped-modules": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", "dev": true, "requires": { "debuglog": "^1.0.1", @@ -21794,18 +26761,16 @@ }, "readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "requires": { "picomatch": "^2.2.1" } }, - "rechoir": { - "version": "0.6.2", - "requires": { - "resolve": "^1.1.6" - } - }, "redent": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "requires": { "indent-string": "^4.0.0", @@ -21813,29 +26778,58 @@ } }, "regenerate": { - "version": "1.4.2" + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "requires": { "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.9" + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, "regenerator-transform": { "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "requires": { "@babel/runtime": "^7.8.4" } }, + "regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, "regexpp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "regexpu-core": { - "version": "5.3.1", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "requires": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", @@ -21847,46 +26841,58 @@ }, "regjsparser": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "requires": { "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { - "version": "0.5.0" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" } } }, "release-zalgo": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, "requires": { "es6-error": "^4.0.1" } }, "require-directory": { - "version": "2.1.1" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-from-string": { "version": "2.0.2", - "dev": true + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "require-main-filename": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "requires-port": { - "version": "1.0.0" - }, "resolve": { - "version": "1.22.1", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { "resolve-from": "^5.0.0" @@ -21894,10 +26900,14 @@ }, "resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, "resolve-global": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", "dev": true, "requires": { "global-dirs": "^0.1.1" @@ -21905,6 +26915,8 @@ }, "restore-cursor": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { "onetime": "^5.1.0", @@ -21913,17 +26925,26 @@ }, "retry": { "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", "dev": true }, "reusify": { - "version": "1.0.4" + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true }, "rfdc": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, "rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -21931,6 +26952,8 @@ "dependencies": { "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -21943,65 +26966,111 @@ } } }, + "run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, "run-async": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, "run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "requires": { "queue-microtask": "^1.2.2" } }, - "rw": { - "version": "1.3.3" - }, "rxjs": { - "version": "7.8.0", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "requires": { "tslib": "^2.1.0" } }, "safe-buffer": { - "version": "5.2.1" - }, - "safe-stable-stringify": { - "version": "2.4.2" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, - "safer-buffer": { - "version": "2.1.2" + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "dev": true, + "requires": { + "regexp-tree": "~0.1.1" + } }, - "saxes": { - "version": "6.0.0", + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, "requires": { - "xmlchars": "^2.2.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" } }, + "safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, "seedrandom": { - "version": "3.0.5" + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" }, "semver": { - "version": "6.3.0" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "serialize-javascript": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "requires": { "randombytes": "^2.1.0" } }, "set-blocking": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, "shallow-clone": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "requires": { "kind-of": "^6.0.2" } }, "shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" @@ -22009,46 +27078,46 @@ }, "shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "shelljs": { - "version": "0.8.5", + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" } }, "signal-exit": { "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "simple-swizzle": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "requires": { "is-arrayish": "^0.3.1" }, "dependencies": { "is-arrayish": { - "version": "0.3.2" + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" } } }, "sinon": { "version": "15.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.1.tgz", + "integrity": "sha512-PZXKc08f/wcA/BMRGBze2Wmw50CWPiAH3E21EOi4B49vJ616vW4DQh4fQrqsYox2aNR/N3kCqLuB0PwwOucQrg==", "dev": true, "requires": { "@sinonjs/commons": "^2.0.0", @@ -22060,10 +27129,15 @@ } }, "slash": { - "version": "3.0.0" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true }, "slice-ansi": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "requires": { "ansi-styles": "^6.0.0", @@ -22072,16 +27146,22 @@ "dependencies": { "ansi-styles": { "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true } } }, "smart-buffer": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", "dev": true }, "socks": { "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "requires": { "ip": "^2.0.0", @@ -22090,6 +27170,8 @@ }, "socks-proxy-agent": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", "dev": true, "requires": { "agent-base": "^6.0.2", @@ -22099,6 +27181,8 @@ }, "sort-keys": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-4.2.0.tgz", + "integrity": "sha512-aUYIEU/UviqPgc8mHR6IW1EGxkAXpeRETYcrzg8cLAvUPZcpAlleSXHV2mY7G12GphSH6Gzv+4MMVSSkbdteHg==", "dev": true, "requires": { "is-plain-obj": "^2.0.0" @@ -22106,27 +27190,30 @@ "dependencies": { "is-plain-obj": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true } } }, "source-map": { - "version": "0.5.7" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1" - } } }, "spawn-wrap": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, "requires": { "foreground-child": "^2.0.0", @@ -22139,6 +27226,8 @@ "dependencies": { "make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -22148,6 +27237,8 @@ }, "spdx-correct": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -22156,10 +27247,14 @@ }, "spdx-exceptions": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -22167,11 +27262,15 @@ } }, "spdx-license-ids": { - "version": "3.0.12", + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, "split": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "dev": true, "requires": { "through": "2" @@ -22179,6 +27278,8 @@ }, "split2": { "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dev": true, "requires": { "readable-stream": "^3.0.0" @@ -22186,30 +27287,42 @@ }, "sprintf-js": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "ssri": { "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", "dev": true, "requires": { "minipass": "^3.1.1" } }, "stack-trace": { - "version": "0.0.10" + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==" }, "string_decoder": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { "safe-buffer": "~5.2.0" } }, "string-argv": { - "version": "0.3.1", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true }, "string-width": { "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -22217,36 +27330,83 @@ }, "dependencies": { "is-fullwidth-code-point": { - "version": "3.0.0" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" } } }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { "ansi-regex": "^5.0.1" } }, "strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-indent": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, "requires": { "min-indent": "^1.0.0" } }, "strip-json-comments": { - "version": "3.1.1" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "strong-log-transformer": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", "dev": true, "requires": { "duplexer": "^0.1.1", @@ -22256,40 +27416,94 @@ }, "supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { "has-flag": "^4.0.0" } }, "supports-preserve-symlinks-flag": { - "version": "1.0.0" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "requires": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + } + }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } }, - "symbol-tree": { - "version": "3.2.4" + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true }, "tar": { - "version": "6.1.13", + "version": "6.1.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", + "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "dependencies": { "minipass": { - "version": "4.2.4", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true }, "yallist": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true } } }, "tar-stream": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, "requires": { "bl": "^4.0.3", @@ -22301,10 +27515,14 @@ }, "temp-dir": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", "dev": true }, "test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { "@istanbuljs/schema": "^0.1.2", @@ -22314,6 +27532,8 @@ "dependencies": { "glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -22328,75 +27548,91 @@ }, "text-extensions": { "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, "text-hex": { - "version": "1.0.0" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, "text-table": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "through2": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dev": true, "requires": { "readable-stream": "3" } }, + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true + }, "tmp": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, "requires": { "rimraf": "^3.0.0" } }, "to-fast-properties": { - "version": "2.0.0" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" }, "to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "requires": { "is-number": "^7.0.0" } }, - "tough-cookie": { - "version": "4.1.2", - "requires": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "dependencies": { - "universalify": { - "version": "0.2.0" - } - } - }, "tr46": { - "version": "3.0.0", - "requires": { - "punycode": "^2.1.1" - } + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "treeverse": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-2.0.0.tgz", + "integrity": "sha512-N5gJCkLu1aXccpOTtqV6ddSEi6ZmGkh3hjmbu1IjcavJK4qyOVQmi0myQKM7z5jVGmD68SJoliaVrMmVObhj6A==", "dev": true }, "trim-newlines": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true }, "triple-beam": { - "version": "1.3.0" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" }, "ts-node": { "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "dev": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", @@ -22416,31 +27652,51 @@ "dependencies": { "diff": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true } } }, "tsconfig-paths": { - "version": "4.1.2", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "requires": { - "json5": "^2.2.2", + "@types/json5": "^0.0.29", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true } } }, "tslib": { - "version": "2.5.0", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", + "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==", "dev": true }, "tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "requires": { "tslib": "^1.8.1" @@ -22448,30 +27704,61 @@ "dependencies": { "tslib": { "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true } } }, "type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { "prelude-ls": "^1.2.1" } }, "type-detect": { - "version": "4.0.8" + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" }, "type-fest": { - "version": "0.21.3", - "dev": true + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "typed-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz", + "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==", + "dev": true, + "requires": { + "rxjs": "*" + } }, "typedarray": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, "typedarray-to-buffer": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, "requires": { "is-typedarray": "^1.0.0" @@ -22479,31 +27766,57 @@ }, "typescript": { "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", "dev": true }, "uglify-js": { "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" }, "unicode-match-property-ecmascript": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "unicode-match-property-value-ecmascript": { - "version": "2.1.0" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" }, "unicode-property-aliases-ecmascript": { - "version": "2.1.0" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" }, "unique-filename": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", "dev": true, "requires": { "unique-slug": "^3.0.0" @@ -22511,6 +27824,8 @@ }, "unique-slug": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", "dev": true, "requires": { "imurmurhash": "^0.1.4" @@ -22518,17 +27833,31 @@ }, "universal-user-agent": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", "dev": true }, "universalify": { - "version": "2.0.0" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true }, "upath": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", "dev": true }, "update-browserslist-db": { - "version": "1.0.10", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -22536,35 +27865,39 @@ }, "uri-js": { "version": "4.4.1", - "dev": true, + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "requires": { "punycode": "^2.1.0" } }, - "url-parse": { - "version": "1.5.10", - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "util-deprecate": { - "version": "1.0.2" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "uuid": { "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, "v8-compile-cache": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, "v8-compile-cache-lib": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -22573,68 +27906,90 @@ }, "validate-npm-package-name": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", + "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", "dev": true, "requires": { "builtins": "^5.0.0" } }, - "w3c-xmlserializer": { - "version": "4.0.0", - "requires": { - "xml-name-validator": "^4.0.0" - } - }, "walk-up-path": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", + "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", "dev": true }, "wcwidth": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "requires": { "defaults": "^1.0.3" } }, "webidl-conversions": { - "version": "7.0.0" - }, - "whatwg-encoding": { - "version": "2.0.0", - "requires": { - "iconv-lite": "0.6.3" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "whatwg-mimetype": { - "version": "3.0.0" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "whatwg-url": { - "version": "11.0.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" } }, "which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { - "version": "2.0.0", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", "dev": true }, + "which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, "wide-align": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", "dev": true, "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" @@ -22642,6 +27997,8 @@ }, "winston": { "version": "3.8.2", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.8.2.tgz", + "integrity": "sha512-MsE1gRx1m5jdTTO9Ld/vND4krP2To+lgDoMEHGGa4HIlAUyXJtfc7CxQcGXVyz2IBpw5hbFkj2b/AtUdQwyRew==", "requires": { "@colors/colors": "1.5.0", "@dabh/diagnostics": "^2.0.2", @@ -22658,6 +28015,8 @@ }, "winston-transport": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", "requires": { "logform": "^2.3.2", "readable-stream": "^3.6.0", @@ -22665,17 +28024,26 @@ } }, "word-wrap": { - "version": "1.2.3" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true }, "wordwrap": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, "workerpool": { - "version": "6.2.1" + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "wrap-ansi": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -22683,10 +28051,14 @@ } }, "wrappy": { - "version": "1.0.2" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -22695,6 +28067,8 @@ }, "write-json-file": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-4.3.0.tgz", + "integrity": "sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ==", "dev": true, "requires": { "detect-indent": "^6.0.0", @@ -22707,10 +28081,14 @@ "dependencies": { "is-plain-obj": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, "make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "requires": { "semver": "^6.0.0" @@ -22718,6 +28096,8 @@ }, "write-file-atomic": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -22730,6 +28110,8 @@ }, "write-pkg": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", + "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", "dev": true, "requires": { "sort-keys": "^2.0.0", @@ -22739,14 +28121,20 @@ "dependencies": { "detect-indent": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "dev": true }, "pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "sort-keys": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", "dev": true, "requires": { "is-plain-obj": "^1.0.0" @@ -22754,10 +28142,14 @@ }, "type-fest": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", "dev": true }, "write-file-atomic": { "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "dev": true, "requires": { "graceful-fs": "^4.1.11", @@ -22767,6 +28159,8 @@ }, "write-json-file": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", + "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", "dev": true, "requires": { "detect-indent": "^5.0.0", @@ -22779,36 +28173,32 @@ } } }, - "ws": { - "version": "8.12.1", - "requires": {} - }, - "xml-name-validator": { - "version": "4.0.0" - }, - "xmlchars": { - "version": "2.2.0" - }, - "xmlhttprequest": { - "version": "1.8.0" - }, "xtend": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "dev": true }, "y18n": { - "version": "5.0.8" + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { - "version": "3.1.1" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yaml": { - "version": "2.2.1", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", "dev": true }, "yargs": { - "version": "17.7.1", - "dev": true, + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "requires": { "cliui": "^8.0.1", "escalade": "^3.1.1", @@ -22821,7 +28211,8 @@ "dependencies": { "cliui": { "version": "8.0.1", - "dev": true, + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", @@ -22830,15 +28221,20 @@ }, "yargs-parser": { "version": "21.1.1", - "dev": true + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" } } }, "yargs-parser": { - "version": "20.2.4" + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==" }, "yargs-unparser": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "requires": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -22847,22 +28243,32 @@ }, "dependencies": { "camelcase": { - "version": "6.3.0" + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" }, "decamelize": { - "version": "4.0.0" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==" }, "is-plain-obj": { - "version": "2.1.0" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" } } }, "yn": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, "yocto-queue": { - "version": "0.1.0" + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } } diff --git a/package.json b/package.json index b270b756e..7644855ab 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "@syntest/javascript", "version": "0.0.1", - "description": "SynTest JavaScript is a tool for automatically generating test cases for the JavaScript language", + "description": "Monorepo containing the various JavaScript parts of the SynTest ecosystem.", "keywords": [ "syntest", "automatic-test-generation" @@ -22,32 +22,39 @@ }, "scripts": { "lint-staged": "lint-staged", - "build": "lerna run build", - "build:watch": "lerna watch -- lerna run build --since", - "clean": "lerna run clean && rm -rf .nyc_output dist node_modules coverage", - "clean:dist": "lerna run clean:dist", - "format": "lerna run format", - "format:check": "lerna run format:check", - "lint": "lerna run lint", - "lint:fix": "lerna run lint:fix", - "test": "lerna run test", - "test:coverage": "lerna run --stream test:coverage", - "test:coverage:ci": "lerna run test:coverage:ci", - "test:watch": "lerna watch -- lerna run test --since", + "build": "nx run-many --target=build", + "build:affected": "nx affected --target=build", + "build:watch": "nx watch --all -- nx affected --target=build", + "clean": "nx run-many --target=clean && clean:root && clean:nx", + "clean:dist": "nx run-many --target=clean:dist", + "clean:nx": "nx reset", + "clean:root": "rm -rf .nyc_output dist node_modules coverage", + "graph": "nx graph", + "graph:affected": "nx affected:graph", + "format": "nx run-many --target=format", + "format:check": "nx run-many --target=format:check", + "lint": "nx run-many --target=lint", + "lint:fix": "nx run-many --target=lint:fix", + "test": "nx run-many --target=test", + "test:affected": "nx affected --target=test", + "test:coverage": "nx run-many --stream --target=test:coverage", + "test:coverage:ci": "nx run-many --target=test:coverage:ci", + "test:watch": "nx watch --all -- nx affected --target=test", "postinstall": "husky install" }, "workspaces": [ "libraries/*", "plugins/*", - "presets/*", "tools/*" ], "devDependencies": { "@commitlint/cli": "17.4.2", "@commitlint/config-conventional": "17.4.2", - "@types/babel__core": "7.1.20", + "@types/babel__core": "7.20.0", + "@types/babel__traverse": "^7.18.3", "@types/chai": "4.3.4", "@types/figlet": "1.5.4", + "@types/lodash.clonedeep": "^4.5.7", "@types/mocha": "10.0.1", "@types/node": "18.11.18", "@types/yargs": "17.0.20", @@ -55,9 +62,15 @@ "@typescript-eslint/parser": "5.45.1", "chai": "4.3.7", "commitlint": "17.4.2", - "eslint": "8.29.0", + "eslint": "^8.36.0", "eslint-config-prettier": "8.5.0", + "eslint-import-resolver-typescript": "^3.5.3", + "eslint-plugin-import": "^2.27.5", "eslint-plugin-notice": "^0.9.10", + "eslint-plugin-promise": "^6.1.1", + "eslint-plugin-sonarjs": "^0.19.0", + "eslint-plugin-unicorn": "^45.0.2", + "eslint-plugin-unused-imports": "^2.0.0", "husky": "8.0.3", "lerna": "6.4.1", "lint-staged": "13.1.0", @@ -67,15 +80,17 @@ "prettier": "2.8.1", "sinon": "15.0.1", "ts-node": "10.9.1", - "typescript": "4.9.4" + "typed-emitter": "^2.1.0", + "typescript": "4.9.4", + "winston": "3.8.2" }, "engines": { - "node": ">=10.24.0" + "node": ">=16" }, "lint-staged": { "**/*": [ - "npx prettier --config .prettierrc.json --ignore-path .prettierignore --write .", - "npx eslint --config .eslintrc.json --ignore-path .eslintignore --fix ." + "prettier --config .prettierrc.json --ignore-path .prettierignore --write .", + "eslint --config .eslintrc.json --ignore-path .eslintignore . --fix" ] } } diff --git a/tools/javascript/LICENSE.header.ts b/tools/javascript/LICENSE.header.ts new file mode 100644 index 000000000..2fe873167 --- /dev/null +++ b/tools/javascript/LICENSE.header.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020-<%= YEAR %> Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest JavaScript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/tools/javascript/NOTICE b/tools/javascript/NOTICE new file mode 100644 index 000000000..83d3e4cbf --- /dev/null +++ b/tools/javascript/NOTICE @@ -0,0 +1,5 @@ +SynTest Framework - SynTest Javascript +Copyright 2020-2023 Delft University of Technology and SynTest contributors + +This product includes software developed at +Delft University of Technology (http://www.tudelft.nl/). diff --git a/tools/javascript/README.md b/tools/javascript/README.md new file mode 100644 index 000000000..70a43dcdc --- /dev/null +++ b/tools/javascript/README.md @@ -0,0 +1 @@ +# SynTest Framework - JavaScript diff --git a/libraries/ast-javascript/lib/Scope.ts b/tools/javascript/index.ts similarity index 83% rename from libraries/ast-javascript/lib/Scope.ts rename to tools/javascript/index.ts index 3e9bbc9d5..799f9957a 100644 --- a/libraries/ast-javascript/lib/Scope.ts +++ b/tools/javascript/index.ts @@ -1,7 +1,7 @@ /* * Copyright 2020-2023 Delft University of Technology and SynTest contributors * - * This file is part of SynTest Framework - SynTest Javascript. + * This file is part of SynTest Framework - SynTest JavaScript. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export interface Scope { - uid: string; - filePath: string; -} +export * as module from "./lib/JavaScriptModule"; diff --git a/tools/javascript/lib/JavaScriptLauncher.ts b/tools/javascript/lib/JavaScriptLauncher.ts new file mode 100644 index 000000000..abe8bfddc --- /dev/null +++ b/tools/javascript/lib/JavaScriptLauncher.ts @@ -0,0 +1,755 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Javascript. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { existsSync } from "node:fs"; +import * as path from "node:path"; + +import { TestCommandOptions } from "./commands/test"; +import { + Export, + TypeModelFactory, + RandomTypeModelFactory, + InferenceTypeModelFactory, + Target, + AbstractSyntaxTreeFactory, + TargetFactory, + RootContext, + ControlFlowGraphFactory, + ExportFactory, + DependencyFactory, + TypeExtractor, + isExported, +} from "@syntest/analysis-javascript"; +import { + ArgumentsObject, + Launcher, + createDirectoryStructure, + clearDirectory, + ObjectiveManagerPlugin, + CrossoverPlugin, + SearchAlgorithmPlugin, + TargetSelector, + PluginType, + SecondaryObjectivePlugin, + ProcreationPlugin, + TerminationTriggerPlugin, + deleteDirectories, +} from "@syntest/base-language"; +import { + UserInterface, + TableObject, + ItemizationItem, +} from "@syntest/cli-graphics"; +import { ModuleManager } from "@syntest/module"; +import { + JavaScriptTestCase, + JavaScriptDecoder, + JavaScriptRunner, + JavaScriptSuiteBuilder, + JavaScriptSubject, + JavaScriptRandomSampler, + JavaScriptTestCaseSampler, + ExecutionInformationIntegrator, +} from "@syntest/search-javascript"; +import { + Archive, + BudgetManager, + BudgetType, + EncodingSampler, + EvaluationBudget, + IterationBudget, + SearchTimeBudget, + TerminationManager, + TotalTimeBudget, + getSeed, + initializePseudoRandomNumberGenerator, +} from "@syntest/search"; +import { Instrumenter } from "@syntest/instrumentation-javascript"; +import { getLogger, Logger } from "@syntest/logging"; +import { TargetType } from "@syntest/analysis"; + +export type JavaScriptArguments = ArgumentsObject & TestCommandOptions; +export class JavaScriptLauncher extends Launcher { + private static LOGGER: Logger; + + private arguments_: JavaScriptArguments; + private moduleManager: ModuleManager; + private userInterface: UserInterface; + + private targets: Target[]; + + private rootContext: RootContext; + private archive: Archive; + + private exports: Export[]; + private dependencyMap: Map; + + private coveredInPath = new Map>(); + + constructor( + arguments_: JavaScriptArguments, + moduleManager: ModuleManager, + userInterface: UserInterface + ) { + super(); + JavaScriptLauncher.LOGGER = getLogger("JavaScriptLauncher"); + this.arguments_ = arguments_; + this.moduleManager = moduleManager; + this.userInterface = userInterface; + } + + async initialize(): Promise { + JavaScriptLauncher.LOGGER.info("Initialization started"); + initializePseudoRandomNumberGenerator(this.arguments_.randomSeed); + if (existsSync(this.arguments_.tempSyntestDirectory)) { + JavaScriptLauncher.LOGGER.info("Cleaning up old directories"); + deleteDirectories([ + path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempTestDirectory + ), + path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempLogDirectory + ), + path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempInstrumentedDirectory + ), + this.arguments_.tempSyntestDirectory, + ]); + } + + JavaScriptLauncher.LOGGER.info("Creating directories"); + createDirectoryStructure([ + path.join( + this.arguments_.syntestDirectory, + this.arguments_.statisticsDirectory + ), + path.join(this.arguments_.syntestDirectory, this.arguments_.logDirectory), + path.join( + this.arguments_.syntestDirectory, + this.arguments_.testDirectory + ), + ]); + JavaScriptLauncher.LOGGER.info("Creating temp directories"); + createDirectoryStructure([ + path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempTestDirectory + ), + path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempLogDirectory + ), + path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempInstrumentedDirectory + ), + ]); + + const abstractSyntaxTreeFactory = new AbstractSyntaxTreeFactory(); + const targetFactory = new TargetFactory(); + const controlFlowGraphFactory = new ControlFlowGraphFactory(); + const dependencyFactory = new DependencyFactory(); + const exportFactory = new ExportFactory(); + const typeExtractor = new TypeExtractor(); + const typeResolver: TypeModelFactory = + this.arguments_.typeInferenceMode === "none" + ? new RandomTypeModelFactory() + : new InferenceTypeModelFactory(); + + this.rootContext = new RootContext( + this.arguments_.targetRootDirectory, + abstractSyntaxTreeFactory, + controlFlowGraphFactory, + targetFactory, + dependencyFactory, + exportFactory, + typeExtractor, + typeResolver + ); + + this.userInterface.printHeader("GENERAL INFO"); + + // TODO ui info messages + + // this.userInterface.report("property-set", [ + // "Target Settings", + // ( + // ([["Target Root Directory", this.arguments_.targetRootDirectory]]) + // ), + // ]); + JavaScriptLauncher.LOGGER.info("Initialization done"); + } + + async preprocess(): Promise { + JavaScriptLauncher.LOGGER.info("Preprocessing started"); + const targetSelector = new TargetSelector(this.rootContext); + this.targets = targetSelector.loadTargets( + this.arguments_.include, + this.arguments_.exclude + ); + + if (this.targets.length === 0) { + // Shut server down + this.userInterface.printError( + `No targets where selected! Try changing the 'include' parameter` + ); + await this.exit(); + } + + const itemization: ItemizationItem[] = []; + + for (const target of this.targets) { + itemization.push({ + text: `${target.path}: ${target.name} #${target.subTargets.length}`, + subItems: target.subTargets.map((subtarget) => { + return { + text: `${subtarget.type} ${subtarget.id}`, + }; + }), + }); + } + + this.userInterface.printItemization("TARGETS", itemization); + + const settings: TableObject = { + headers: ["Setting", "Value"], + rows: [ + ["Preset", this.arguments_.preset], + ["Search Algorithm", this.arguments_.searchAlgorithm], + ["Population Size", `${this.arguments_.populationSize}`], + ["Objective Manager", `${this.arguments_.objectiveManager}`], + ["Secondary Objectives", `${this.arguments_.secondaryObjectives}`], + ["Procreation Operator", `${this.arguments_.procreation}`], + ["Crossover Operator", `${this.arguments_.crossover}`], + ["Sampling Operator", `${this.arguments_.sampler}`], + ["Termination Triggers", `${this.arguments_.terminationTriggers}`], + ["Test Minimization Enabled", `${this.arguments_.testMinimization}`], + + ["Seed", getSeed()], + ], + footers: ["", ""], + }; + + this.userInterface.printTable("SETTINGS", settings); + + const budgetSettings: TableObject = { + headers: ["Setting", "Value"], + rows: [ + ["Iteration Budget", `${this.arguments_.iterations} iterations`], + ["Evaluation Budget", `${this.arguments_.evaluations} evaluations`], + ["Search Time Budget", `${this.arguments_.searchTime} seconds`], + ["Total Time Budget", `${this.arguments_.totalTime} seconds`], + ], + footers: ["", ""], + }; + + this.userInterface.printTable("BUDGET SETTINGS", budgetSettings); + + const mutationSettings: TableObject = { + headers: ["Setting", "Value"], + rows: [ + [ + "Resampling Probability", + `${this.arguments_.resampleGeneProbability}`, + ], + [ + "Delta Mutation Probability", + `${this.arguments_.deltaMutationProbability}`, + ], + [ + "Sample Existing Value Probability", + `${this.arguments_.sampleExistingValueProbability}`, + ], + ["Crossover Probability", `${this.arguments_.crossoverProbability}`], + [ + "Multi-point Crossover Probability", + `${this.arguments_.multiPointCrossoverProbability}`, + ], + // sampling + ["Max Depth", `${this.arguments_.maxDepth}`], + ["Max Action Statements", `${this.arguments_.maxActionStatements}`], + ["Explore Illegal Values", `${this.arguments_.exploreIllegalValues}`], + [ + "Sample Output Values", + `${this.arguments_.sampleFunctionOutputAsArgument}`, + ], + ["Use Constant Pool Values", `${this.arguments_.constantPool}`], + [ + "Use Constant Pool Probability", + `${this.arguments_.constantPoolProbability}`, + ], + ], + footers: ["", ""], + }; + this.userInterface.printTable("MUTATION SETTINGS", mutationSettings); + + const typeSettings: TableObject = { + headers: ["Setting", "Value"], + rows: [ + ["Type Inference Mode", `${this.arguments_.typeInferenceMode}`], + [ + "Incorporate Execution Information", + `${this.arguments_.incorporateExecutionInformation}`, + ], + ["Random Type Probability", `${this.arguments_.randomTypeProbability}`], + ], + footers: ["", ""], + }; + this.userInterface.printTable("Type SETTINGS", typeSettings); + + const directorySettings: TableObject = { + headers: ["Setting", "Value"], + rows: [ + ["Syntest Directory", `${this.arguments_.syntestDirectory}`], + ["Temporary Directory", `${this.arguments_.tempSyntestDirectory}`], + ["Target Root Directory", `${this.arguments_.targetRootDirectory}`], + ], + footers: ["", ""], + }; + + this.userInterface.printTable("DIRECTORY SETTINGS", directorySettings); + + JavaScriptLauncher.LOGGER.info("Instrumenting targets"); + const instrumenter = new Instrumenter(); + await instrumenter.instrumentAll( + this.rootContext, + this.targets, + path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempInstrumentedDirectory + ) + ); + + JavaScriptLauncher.LOGGER.info("Extracting types"); + this.rootContext.extractTypes(); + JavaScriptLauncher.LOGGER.info("Resolving types"); + this.rootContext.resolveTypes(); + JavaScriptLauncher.LOGGER.info("Preprocessing done"); + + // const maps = this.rootContext.getTypeModel().calculateProbabilitiesForFile(false, '/Users/dimitrist/Documents/git/syntest/syntest-javascript-benchmark/lodash/truncate.js') + + // for (const [id, map] of maps.entries()) { + // console.log(id) + // console.log(map) + // } + // eslint-disable-next-line unicorn/no-process-exit + // process.exit(0) + } + + async process(): Promise { + JavaScriptLauncher.LOGGER.info("Processing started"); + this.archive = new Archive(); + this.exports = []; + this.dependencyMap = new Map(); + + for (const target of this.targets) { + JavaScriptLauncher.LOGGER.info(`Processing ${target.name}`); + const archive = await this.testTarget(this.rootContext, target); + + const dependencies = this.rootContext.getDependencies(target.path); + this.archive.merge(archive); + + this.dependencyMap.set(target.name, dependencies); + this.exports.push(...this.rootContext.getExports(target.path)); + } + JavaScriptLauncher.LOGGER.info("Processing done"); + } + + async postprocess(): Promise { + JavaScriptLauncher.LOGGER.info("Postprocessing started"); + const temporaryTestDirectory = path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempTestDirectory + ); + const temporaryLogDirectory = path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempLogDirectory + ); + + const decoder = new JavaScriptDecoder( + this.exports, + this.arguments_.targetRootDirectory, + temporaryLogDirectory + ); + + const executionInformationIntegrator = new ExecutionInformationIntegrator( + this.rootContext.getTypeModel() + ); + + const runner = new JavaScriptRunner( + decoder, + executionInformationIntegrator, + temporaryTestDirectory + ); + + const suiteBuilder = new JavaScriptSuiteBuilder( + decoder, + runner, + temporaryLogDirectory + ); + + const reducedArchive = suiteBuilder.reduceArchive(this.archive); + + // TODO fix hardcoded paths + let paths = suiteBuilder.createSuite( + reducedArchive, + "../instrumented", + temporaryTestDirectory, + true, + false + ); + await suiteBuilder.runSuite(paths); + + // reset states + suiteBuilder.clearDirectory(temporaryTestDirectory); + + // run with assertions and report results + for (const key of reducedArchive.keys()) { + suiteBuilder.gatherAssertions(reducedArchive.get(key)); + } + + paths = suiteBuilder.createSuite( + reducedArchive, + "../instrumented", + temporaryTestDirectory, + false, + true + ); + const { stats, instrumentationData } = await suiteBuilder.runSuite(paths); + + if (stats.failures > 0) { + this.userInterface.printError("Test case has failed!"); + } + + this.userInterface.printHeader("SEARCH RESULTS"); + + const table: TableObject = { + headers: ["Target", "Statement", "Branch", "Function", "File"], + rows: [], + footers: ["Average"], + }; + + const overall = { + branch: 0, + statement: 0, + function: 0, + }; + let totalBranches = 0; + let totalStatements = 0; + let totalFunctions = 0; + for (const file of Object.keys(instrumentationData)) { + const target = this.targets.find( + (target: Target) => target.path === file + ); + if (!target) { + continue; + } + + const data = instrumentationData[file]; + + const summary = { + branch: 0, + statement: 0, + function: 0, + }; + + for (const statementKey of Object.keys(data.s)) { + summary["statement"] += data.s[statementKey] ? 1 : 0; + overall["statement"] += data.s[statementKey] ? 1 : 0; + } + + for (const branchKey of Object.keys(data.b)) { + summary["branch"] += data.b[branchKey][0] ? 1 : 0; + overall["branch"] += data.b[branchKey][0] ? 1 : 0; + summary["branch"] += data.b[branchKey][1] ? 1 : 0; + overall["branch"] += data.b[branchKey][1] ? 1 : 0; + } + + for (const functionKey of Object.keys(data.f)) { + summary["function"] += data.f[functionKey] ? 1 : 0; + overall["function"] += data.f[functionKey] ? 1 : 0; + } + + totalStatements += Object.keys(data.s).length; + totalBranches += Object.keys(data.b).length * 2; + totalFunctions += Object.keys(data.f).length; + + table.rows.push([ + `${path.basename(target.path)}: ${target.name}`, + summary["statement"] + " / " + Object.keys(data.s).length, + summary["branch"] + " / " + Object.keys(data.b).length * 2, + summary["function"] + " / " + Object.keys(data.f).length, + target.path, + ]); + } + + overall["statement"] /= totalStatements; + if (totalStatements === 0) overall["statement"] = 1; + + overall["branch"] /= totalBranches; + if (totalBranches === 0) overall["branch"] = 1; + + overall["function"] /= totalFunctions; + if (totalFunctions === 0) overall["function"] = 1; + + table.footers.push( + overall["statement"] * 100 + " %", + overall["branch"] * 100 + " %", + overall["function"] * 100 + " %", + "" + ); + + const originalSourceDirectory = path + .join( + "../../", + path.relative(process.cwd(), this.arguments_.targetRootDirectory) + ) + .replace(path.basename(this.arguments_.targetRootDirectory), ""); + + this.userInterface.printTable("Coverage", table); + + // create final suite + suiteBuilder.createSuite( + reducedArchive, + originalSourceDirectory, + path.join( + this.arguments_.syntestDirectory, + this.arguments_.testDirectory + ), + false, + true + ); + JavaScriptLauncher.LOGGER.info("Postprocessing done"); + } + + private async testTarget( + rootContext: RootContext, + target: Target + ): Promise> { + JavaScriptLauncher.LOGGER.info( + `Testing target ${target.name} in ${target.path}` + ); + const currentSubject = new JavaScriptSubject(target, this.rootContext); + + const rootTargets = currentSubject + .getActionableTargets() + .filter( + (target) => + target.type === TargetType.FUNCTION || + target.type === TargetType.CLASS || + target.type === TargetType.OBJECT + ) + .filter((target) => isExported(target)); + + if (rootTargets.length === 0) { + JavaScriptLauncher.LOGGER.info( + `No actionable exported root targets found for ${target.name} in ${target.path}` + ); + // report skipped + return new Archive(); + } + + const dependencies = rootContext.getDependencies(target.path); + const dependencyMap = new Map(); + dependencyMap.set(target.name, dependencies); + const exports = rootContext.getExports(target.path); + + const temporaryTestDirectory = path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempTestDirectory + ); + const temporaryLogDirectory = path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempLogDirectory + ); + + const decoder = new JavaScriptDecoder( + exports, + this.arguments_.targetRootDirectory, + temporaryLogDirectory + ); + const executionInformationIntegrator = new ExecutionInformationIntegrator( + this.rootContext.getTypeModel() + ); + const runner = new JavaScriptRunner( + decoder, + executionInformationIntegrator, + temporaryTestDirectory + ); + + const suiteBuilder = new JavaScriptSuiteBuilder( + decoder, + runner, + temporaryLogDirectory + ); + + // TODO constant pool + + const sampler = new JavaScriptRandomSampler( + currentSubject, + this.arguments_.typeInferenceMode, + this.arguments_.randomTypeProbability, + this.arguments_.incorporateExecutionInformation, + this.arguments_.maxActionStatements, + this.arguments_.stringAlphabet, + this.arguments_.stringMaxLength, + this.arguments_.resampleGeneProbability, + this.arguments_.deltaMutationProbability, + this.arguments_.exploreIllegalValues + ); + + sampler.rootContext = rootContext; + + const secondaryObjectives = new Set( + this.arguments_.secondaryObjectives.map((secondaryObjective) => { + return (>( + this.moduleManager.getPlugin( + PluginType.SecondaryObjective, + secondaryObjective + ) + )).createSecondaryObjective(); + }) + ); + + const objectiveManager = (>( + this.moduleManager.getPlugin( + PluginType.ObjectiveManager, + this.arguments_.objectiveManager + ) + )).createObjectiveManager({ + runner: runner, + secondaryObjectives: secondaryObjectives, + }); + + const crossover = (>( + this.moduleManager.getPlugin( + PluginType.Crossover, + this.arguments_.crossover + ) + )).createCrossoverOperator({ + crossoverEncodingProbability: this.arguments_.crossoverProbability, + crossoverStatementProbability: + this.arguments_.multiPointCrossoverProbability, + }); + + const procreation = (>( + this.moduleManager.getPlugin( + PluginType.Procreation, + this.arguments_.procreation + ) + )).createProcreationOperator({ + crossover: crossover, + mutateFunction: ( + sampler: EncodingSampler, + encoding: JavaScriptTestCase + ) => { + return encoding.mutate((sampler)); + }, + sampler: sampler, + }); + + const algorithm = (>( + this.moduleManager.getPlugin( + PluginType.SearchAlgorithm, + this.arguments_.searchAlgorithm + ) + )).createSearchAlgorithm({ + objectiveManager: objectiveManager, + encodingSampler: sampler, + procreation: procreation, + populationSize: this.arguments_.populationSize, + }); + + suiteBuilder.clearDirectory(temporaryTestDirectory); + + // allocate budget manager + const iterationBudget = new IterationBudget(this.arguments_.iterations); + const evaluationBudget = new EvaluationBudget(this.arguments_.evaluations); + const searchBudget = new SearchTimeBudget(this.arguments_.searchTime); + const totalTimeBudget = new TotalTimeBudget(this.arguments_.totalTime); + const budgetManager = new BudgetManager(); + budgetManager.addBudget(BudgetType.ITERATION, iterationBudget); + budgetManager.addBudget(BudgetType.EVALUATION, evaluationBudget); + budgetManager.addBudget(BudgetType.SEARCH_TIME, searchBudget); + budgetManager.addBudget(BudgetType.TOTAL_TIME, totalTimeBudget); + + // Termination + const terminationManager = new TerminationManager(); + + for (const trigger of this.arguments_.terminationTriggers) { + terminationManager.addTrigger( + (( + this.moduleManager.getPlugin(PluginType.TerminationTrigger, trigger) + )).createTerminationTrigger({ + objectiveManager: objectiveManager, + encodingSampler: sampler, + runner: runner, + crossover: crossover, + populationSize: this.arguments_.populationSize, + }) + ); + } + + // This searches for a covering population + const archive = await algorithm.search( + currentSubject, + budgetManager, + terminationManager + ); + + if (this.coveredInPath.has(target.path)) { + archive.merge(this.coveredInPath.get(target.path)); + this.coveredInPath.set(target.path, archive); + } else { + this.coveredInPath.set(target.path, archive); + } + + clearDirectory(temporaryLogDirectory); + clearDirectory(temporaryTestDirectory); + + JavaScriptLauncher.LOGGER.info( + `Finished testing target ${target.name} in ${target.path}` + ); + return archive; + } + + async exit(): Promise { + JavaScriptLauncher.LOGGER.info("Exiting"); + // TODO should be cleanup step in tool + // Finish + JavaScriptLauncher.LOGGER.info("Deleting temporary directories"); + deleteDirectories([ + path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempTestDirectory + ), + path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempLogDirectory + ), + path.join( + this.arguments_.tempSyntestDirectory, + this.arguments_.tempInstrumentedDirectory + ), + this.arguments_.tempSyntestDirectory, + ]); + } +} diff --git a/tools/javascript/lib/JavaScriptModule.ts b/tools/javascript/lib/JavaScriptModule.ts new file mode 100644 index 000000000..4e4f10ecc --- /dev/null +++ b/tools/javascript/lib/JavaScriptModule.ts @@ -0,0 +1,72 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Core. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Module, ModuleManager, Tool } from "@syntest/module"; +import yargs = require("yargs"); + +import { getTestCommand } from "./commands/test"; +import { Configuration, TestingToolModule } from "@syntest/base-language"; +import { UserInterface } from "@syntest/cli-graphics"; +import { MetricManager } from "@syntest/metric"; +import { RandomSamplerPlugin } from "./plugins/sampler/RandomSamplerPlugin"; +import { TreeCrossoverPlugin } from "./plugins/crossover/TreeCrossoverPlugin"; +import { SearchProgressBarListener } from "./plugins/listeners/SearchProgressBarListener"; + +export default class JavaScriptModule extends TestingToolModule { + constructor() { + // eslint-disable-next-line @typescript-eslint/no-var-requires, unicorn/prefer-module + super("javascript", require("../../package.json").version); + } + + override register( + moduleManager: ModuleManager, + metricManager: MetricManager, + userInterface: UserInterface, + modules: Module[] + ): void { + const labels = ["javascript", "testing"]; + const commands = [getTestCommand(this.name, moduleManager, userInterface)]; + + const additionalOptions: Map = new Map(); + + const configuration = new Configuration(); + + for (const [key, value] of Object.entries(configuration.getOptions())) { + additionalOptions.set(key, value); + } + + const javascriptTool = new Tool( + this.name, + labels, + "A tool for testing javascript projects.", + commands, + additionalOptions + ); + + moduleManager.registerTool(this.name, javascriptTool); + + moduleManager.registerPlugin(this.name, new TreeCrossoverPlugin()); + moduleManager.registerPlugin(this.name, new RandomSamplerPlugin()); + moduleManager.registerPlugin( + this.name, + new SearchProgressBarListener(userInterface) + ); + + super.register(moduleManager, metricManager, userInterface, modules); + } +} diff --git a/tools/javascript/lib/commands/test.ts b/tools/javascript/lib/commands/test.ts new file mode 100644 index 000000000..e87cc8dc0 --- /dev/null +++ b/tools/javascript/lib/commands/test.ts @@ -0,0 +1,81 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Core. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { UserInterface } from "@syntest/cli-graphics"; +import { Command, ModuleManager } from "@syntest/module"; +import Yargs = require("yargs"); + +import { JavaScriptArguments, JavaScriptLauncher } from "../JavaScriptLauncher"; + +export function getTestCommand( + tool: string, + moduleManager: ModuleManager, + userInterface: UserInterface +): Command { + const options = new Map(); + + const commandGroup = "Type Inference Options:"; + + options.set("incorporate-execution-information", { + alias: [], + default: true, + description: "Incorporate execution information.", + group: commandGroup, + hidden: false, + type: "boolean", + }); + + options.set("type-inference-mode", { + alias: [], + default: "proportional", + description: "The type inference mode: [proportional, ranked, none].", + group: commandGroup, + hidden: false, + type: "string", + }); + + options.set("random-type-probability", { + alias: [], + default: 0.1, + description: + "The probability we use a random type regardless of the inferred type.", + group: commandGroup, + hidden: false, + type: "number", + }); + + return new Command( + tool, + "test", + "Run the test case generation tool on a certain JavaScript project.", + options, + (arguments_: Yargs.ArgumentsCamelCase) => { + const launcher = new JavaScriptLauncher( + (arguments_), + moduleManager, + userInterface + ); + launcher.run(); + } + ); +} + +export type TestCommandOptions = { + incorporateExecutionInformation: boolean; + typeInferenceMode: string; + randomTypeProbability: number; +}; diff --git a/tools/javascript/lib/plugins/crossover/TreeCrossoverPlugin.ts b/tools/javascript/lib/plugins/crossover/TreeCrossoverPlugin.ts new file mode 100644 index 000000000..6c8d21a14 --- /dev/null +++ b/tools/javascript/lib/plugins/crossover/TreeCrossoverPlugin.ts @@ -0,0 +1,41 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Core. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { CrossoverOptions, CrossoverPlugin } from "@syntest/base-language"; +import { JavaScriptTestCase, TreeCrossover } from "@syntest/search-javascript"; + +/** + * Plugin for Tree Crossover + * + * @author Dimitri Stallenberg + */ +export class TreeCrossoverPlugin extends CrossoverPlugin { + constructor() { + super("javascript-tree", "A JavaScript tree crossover plugin"); + } + + createCrossoverOperator(options: CrossoverOptions): TreeCrossover { + return new TreeCrossover( + options.crossoverEncodingProbability, + options.crossoverStatementProbability + ); + } + + override getOptions() { + return new Map(); + } +} diff --git a/tools/javascript/lib/plugins/listeners/SearchProgressBarListener.ts b/tools/javascript/lib/plugins/listeners/SearchProgressBarListener.ts new file mode 100644 index 000000000..bfe5428e3 --- /dev/null +++ b/tools/javascript/lib/plugins/listeners/SearchProgressBarListener.ts @@ -0,0 +1,96 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Core. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { UserInterface } from "@syntest/cli-graphics"; +import { EventListenerPlugin } from "@syntest/module"; +import { + BudgetManager, + Encoding, + Events, + SearchAlgorithm, + SearchSubject, +} from "@syntest/search"; +import TypedEventEmitter from "typed-emitter"; + +export class SearchProgressBarListener extends EventListenerPlugin { + private _userInterface: UserInterface; + + /** + * Constructor. + */ + constructor(userInterface: UserInterface) { + super( + "SearchProgressBarListener", + "A listener that creates and updates a progress bar for the search process." + ); + this._userInterface = userInterface; + } + + setupEventListener(): void { + (>process).on( + "searchStart", + ( + searchAlgorithm: SearchAlgorithm, + subject: SearchSubject, + budgetManager: BudgetManager + ) => { + this._userInterface.startProgressBars([ + { + name: subject.name, + value: 0, + maxValue: subject.getObjectives().length, + meta: `${budgetManager.getBudget()}`, + }, + ]); + } + ); + + (>process).on( + "searchIterationComplete", + ( + searchAlgorithm: SearchAlgorithm, + subject: SearchSubject, + budgetManager: BudgetManager + ) => { + const originalObjectives = subject.getObjectives(); + this._userInterface.updateProgressBar({ + name: subject.name, + value: [ + ...searchAlgorithm.getObjectiveManager().getCoveredObjectives(), + ].filter((coveredObjective) => + originalObjectives.find( + (objective) => + objective.getIdentifier() === coveredObjective.getIdentifier() + ) + ).length, + maxValue: originalObjectives.length, + meta: `${budgetManager.getBudget()}`, + }); + } + ); + (>process).on("searchComplete", () => { + this._userInterface.stopProgressBars(); + }); + } + override getOptions() { + return new Map(); + } + + override getOptionChoices(): string[] { + return []; + } +} diff --git a/tools/javascript/lib/plugins/sampler/RandomSamplerPlugin.ts b/tools/javascript/lib/plugins/sampler/RandomSamplerPlugin.ts new file mode 100644 index 000000000..caef0e680 --- /dev/null +++ b/tools/javascript/lib/plugins/sampler/RandomSamplerPlugin.ts @@ -0,0 +1,59 @@ +/* + * Copyright 2020-2023 Delft University of Technology and SynTest contributors + * + * This file is part of SynTest Framework - SynTest Core. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { SamplerOptions, SamplerPlugin } from "@syntest/base-language"; +import { + JavaScriptRandomSampler, + JavaScriptSubject, + JavaScriptTestCase, +} from "@syntest/search-javascript"; +import { JavaScriptArguments } from "../../JavaScriptLauncher"; +import { EncodingSampler } from "@syntest/search"; + +/** + * Plugin for RandomSampler + * + * @author Dimitri Stallenberg + */ +export class RandomSamplerPlugin extends SamplerPlugin { + constructor() { + super("javascript-random", "A JavaScript random sampler plugin"); + } + + createSamplerOperator( + options: SamplerOptions + ): EncodingSampler { + return new JavaScriptRandomSampler( + options.subject as unknown as JavaScriptSubject, + ((this.args)).typeInferenceMode, + ((this.args)).randomTypeProbability, + (( + (this.args) + )).incorporateExecutionInformation, + ((this.args)).maxActionStatements, + ((this.args)).stringAlphabet, + ((this.args)).stringMaxLength, + ((this.args)).resampleGeneProbability, + ((this.args)).deltaMutationProbability, + ((this.args)).exploreIllegalValues + ); + } + + override getOptions() { + return new Map(); + } +} diff --git a/tools/javascript/package.json b/tools/javascript/package.json new file mode 100644 index 000000000..8aaf02527 --- /dev/null +++ b/tools/javascript/package.json @@ -0,0 +1,67 @@ +{ + "name": "@syntest/javascript", + "version": "0.0.1", + "description": "SynTest JavaScript is a tool for automatically generating test cases for the JavaScript language", + "keywords": [ + "syntest", + "automatic-test-generation" + ], + "homepage": "https://www.syntest.org", + "bugs": { + "url": "https://github.com/syntest-framework/syntest-javascript/issues" + }, + "license": "Apache-2.0", + "contributors": [ + "Annibale Panichella", + "Mitchell Olsthoorn", + "Dimitri Stallenberg" + ], + "main": "dist/index.js", + "types": "dist/index.d.ts", + "files": [ + "dist/lib", + "dist/index.d.ts", + "dist/index.d.ts.map", + "dist/index.js", + "dist/index.js.map", + "NOTICE", + "README.md" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/syntest-framework/syntest-javascript.git" + }, + "scripts": { + "build": "tsc --build", + "build:watch": "tsc --build --watch", + "clean": "rm -rf .nyc_output dist node_modules", + "clean:dist": "rm -rf dist", + "format": "prettier --config ../../.prettierrc.json --ignore-path ../../.prettierignore --write .", + "format:check": "prettier --config ../../.prettierrc.json --ignore-path ../../.prettierignore --check .", + "lint": "eslint --config ../../.eslintrc.json --ignore-path ../../.eslintignore .", + "lint:fix": "eslint --config ../../.eslintrc.json --ignore-path ../../.eslintignore . --fix", + "test": "mocha --config ../../.mocharc.json", + "test:coverage": "nyc --reporter=text --reporter=html mocha --config ../../.mocharc.json", + "test:coverage:ci": "nyc --reporter=lcovonly mocha --config ../../.mocharc.json --reporter json --reporter-option output=test-results.json", + "test:watch": "mocha --config ../../.mocharc.json --watch" + }, + "dependencies": { + "@syntest/analysis": "^0.1.0-beta.4", + "@syntest/analysis-javascript": "^0.1.0-beta.4", + "@syntest/base-language": "^0.2.0-beta.28", + "@syntest/cli-graphics": "^0.1.0-beta.3", + "@syntest/instrumentation-javascript": "^0.1.0-beta.2", + "@syntest/logging": "^0.1.0-beta.6", + "@syntest/metric": "^0.1.0-beta.5", + "@syntest/module": "^0.1.0-beta.15", + "@syntest/search": "^0.4.0-beta.25", + "@syntest/search-javascript": "*", + "yargs": "^17.7.2" + }, + "engines": { + "node": ">=10.24.0" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/libraries/cfg-javascript/test/example.test.ts b/tools/javascript/test/example.test.ts similarity index 87% rename from libraries/cfg-javascript/test/example.test.ts rename to tools/javascript/test/example.test.ts index f5ca6bfd3..d14d7f7e8 100644 --- a/libraries/cfg-javascript/test/example.test.ts +++ b/tools/javascript/test/example.test.ts @@ -16,7 +16,8 @@ * limitations under the License. */ import * as chai from "chai"; -import { CFGGenerator } from "../lib"; + +import { RandomSamplerPlugin } from "../lib/plugins/sampler/RandomSamplerPlugin"; const expect = chai.expect; @@ -24,8 +25,8 @@ const expect = chai.expect; * This test is only added such that the github action does not fail. */ describe("example test", () => { - it("test", async () => { - new CFGGenerator(); + it("test", () => { + new RandomSamplerPlugin(); expect(true); }); }); diff --git a/libraries/javascript/lib/tsconfig.json b/tools/javascript/tsconfig.json similarity index 58% rename from libraries/javascript/lib/tsconfig.json rename to tools/javascript/tsconfig.json index 4f4603271..97ea4a6a1 100644 --- a/libraries/javascript/lib/tsconfig.json +++ b/tools/javascript/tsconfig.json @@ -1,7 +1,7 @@ { - "extends": "../../../tsconfig-base.json", + "extends": "../../tsconfig-base.json", "compilerOptions": { - "outDir": "../dist", + "outDir": "./dist", "rootDir": ".", "composite": true }, diff --git a/tsconfig-base.json b/tsconfig-base.json index 6ed557c29..35251540e 100644 --- a/tsconfig-base.json +++ b/tsconfig-base.json @@ -4,9 +4,11 @@ /* Basic Options */ //"incremental": true /* Enable incremental compilation */, - "target": "es6" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, + "target": "ES2021" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */, - //"lib": [] /* Specify library files to be included in the compilation. */, + "lib": [ + "ES2021" + ] /* Specify library files to be included in the compilation. */, //"allowJs": true /* Allow javascript files to be compiled. */, //"checkJs": true /* Report errors in .js files. */, //"jsx": "preserve" /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */, @@ -26,28 +28,33 @@ /* Strict Type-Checking Options */ "strict": false /* Enable all strict type-checking options. */, - //"noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' identifierDescription. */, - //"strictNullChecks": true /* Enable strict null checks. */, - //"strictFunctionTypes": true /* Enable strict checking of function types. */, - //"strictBindCallApply": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */, - //"strictPropertyInitialization": true /* Enable strict checking of property initialization in classes. */, - //"noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' identifierDescription. */, - //"alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, + "noImplicitAny": true /* Raise error on expressions and declarations with an implied 'any' type. */, + "noImplicitThis": true /* Raise error on 'this' expressions with an implied 'any' type. */, + // "strictNullChecks": true /* Enable strict null checks. */, + "strictFunctionTypes": true /* Enable strict checking of function types. */, + "strictBindCallApply": true /* Enable strict 'bind', 'call', and 'apply' methods on functions. */, + // "strictPropertyInitialization": true /* Enable strict checking of property initialization in classes. */, + // "alwaysStrict": true /* Parse in strict mode and emit "use strict" for each source file. */, + // "useUnknownInCatchVariables": true, /* Additional Checks */ - //"noUnusedLocals": true /* Report errors on unused locals. */, - //"noUnusedParameters": true /* Report errors on unused parameters. */, - //"noImplicitReturns": true /* Report error when not all code paths in function return a value. */, + "noUnusedLocals": true /* Report errors on unused locals. */, + // "noUnusedParameters": true /* Report errors on unused parameters. */, + "allowUnusedLabels": false, + "allowUnreachableCode": false, + "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, + "noImplicitOverride": true /* Ensure overriding members in derived classes are marked with an 'override' modifier. */, //"noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, - //"noUncheckedIndexedAccess": true /* Include 'undefined' in index signature results */, - //"noPropertyAccessFromIndexSignature": true /* Require undeclared properties from index signatures to use element accesses. */, + "noUncheckedIndexedAccess": true /* Include 'undefined' in index signature results */, + "noPropertyAccessFromIndexSignature": true /* Require undeclared properties from index signatures to use element accesses. */, + // "exactOptionalPropertyTypes": true /** Only works with strictNullChecks */, /* Module Resolution Options */ //"moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, //"baseUrl": "./" /* Base directory to resolve non-absolute module names. */, //"paths": {} /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */, //"rootDirs": [] /* List of root folders whose combined content represents the structure of the project at runtime. */, - //"typeRoots": [] /* List of folders to include identifierDescription definitions from. */, + //"typeRoots": [] /* List of folders to include type definitions from. */, //"types": [] /* Type declaration files to be included in compilation. */, //"allowSyntheticDefaultImports": true /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */, //"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, @@ -62,10 +69,10 @@ /* Experimental Options */ //"experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, - //"emitDecoratorMetadata": true /* Enables experimental support for emitting identifierDescription metadata for decorators. */, + //"emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, /* Advanced Options */ - "skipLibCheck": true /* Skip identifierDescription checking of declaration files. */, + "skipLibCheck": true /* Skip type checking of declaration files. */, "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */ } } diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000..8082293a0 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig-base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": ".", + "composite": true + }, + "include": ["**/*.ts"] +}