diff --git a/regression/.eslintrc.json b/regression/.eslintrc.json deleted file mode 100644 index ac9d85d96e..0000000000 --- a/regression/.eslintrc.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "env": { - "browser": false, - "es2021": true - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "overrides": [ - ], - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint", - "prettier" - ], - "rules": { - "prettier/prettier": ["error"] - } -} diff --git a/regression/.gitignore b/regression/.gitignore deleted file mode 100644 index fa597fa6e8..0000000000 --- a/regression/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.DS_Store -.dccache -node_modules -.vscode - -/dist -/src/results \ No newline at end of file diff --git a/regression/package-lock.json b/regression/package-lock.json deleted file mode 100644 index 91b8ac6c77..0000000000 --- a/regression/package-lock.json +++ /dev/null @@ -1,2970 +0,0 @@ -{ - "name": "regression", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "regression", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "axios": "^1.6.0", - "chalk": "^5.0.1", - "uuid": "^9.0.0" - }, - "devDependencies": { - "@types/node": "^18.7.18", - "@types/uuid": "^8.3.4", - "@typescript-eslint/eslint-plugin": "^5.38.0", - "@typescript-eslint/parser": "^5.38.0", - "eslint": "^8.23.1", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", - "typescript": "^4.8.3" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", - "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "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, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@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 - }, - "node_modules/@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, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "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, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@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, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", - "dev": true - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", - "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/type-utils": "5.38.0", - "@typescript-eslint/utils": "5.38.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", - "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", - "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", - "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.38.0", - "@typescript-eslint/utils": "5.38.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", - "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", - "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", - "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/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, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", - "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.38.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "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, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "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, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "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, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "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 - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/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, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", - "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "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", - "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.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "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, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "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, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "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, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "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, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "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, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/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, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/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, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/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 - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "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.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "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, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/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 - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/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==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "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, - "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": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "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", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "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, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/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 - }, - "node_modules/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 - }, - "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, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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 - }, - "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/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "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" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/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==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "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" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "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/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "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, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true, - "peer": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/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==" - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "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, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "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, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "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" - } - }, - "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, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "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==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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 - }, - "node_modules/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==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "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, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "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, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "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==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "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, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "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/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@eslint/eslintrc": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", - "integrity": "sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.5.tgz", - "integrity": "sha512-XVVDtp+dVvRxMoxSiSfasYaG02VEe1qH5cKgMQJWhol6HwzbcqoCMJi8dAGoYAO57jhUyhI6cWuRiTcRaDaYug==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, - "@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 - }, - "@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", - "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" - } - }, - "@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/node": { - "version": "18.7.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz", - "integrity": "sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==", - "dev": true - }, - "@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.38.0.tgz", - "integrity": "sha512-GgHi/GNuUbTOeoJiEANi0oI6fF3gBQc3bGFYj40nnAPCbhrtEDf2rjBmefFadweBmO1Du1YovHeDP2h5JLhtTQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/type-utils": "5.38.0", - "@typescript-eslint/utils": "5.38.0", - "debug": "^4.3.4", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.38.0.tgz", - "integrity": "sha512-/F63giJGLDr0ms1Cr8utDAxP2SPiglaD6V+pCOcG35P2jCqdfR7uuEhz1GIC3oy4hkUF8xA1XSXmd9hOh/a5EA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.38.0.tgz", - "integrity": "sha512-ByhHIuNyKD9giwkkLqzezZ9y5bALW8VNY6xXcP+VxoH4JBDKjU5WNnsiD4HJdglHECdV+lyaxhvQjTUbRboiTA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.38.0.tgz", - "integrity": "sha512-iZq5USgybUcj/lfnbuelJ0j3K9dbs1I3RICAJY9NZZpDgBYXmuUlYQGzftpQA9wC8cKgtS6DASTvF3HrXwwozA==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.38.0", - "@typescript-eslint/utils": "5.38.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.38.0.tgz", - "integrity": "sha512-HHu4yMjJ7i3Cb+8NUuRCdOGu2VMkfmKyIJsOr9PfkBVYLYrtMCK/Ap50Rpov+iKpxDTfnqvDbuPLgBE5FwUNfA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.38.0.tgz", - "integrity": "sha512-6P0RuphkR+UuV7Avv7MU3hFoWaGcrgOdi8eTe1NwhMp2/GjUJoODBTRWzlHpZh6lFOaPmSvgxGlROa0Sg5Zbyg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/visitor-keys": "5.38.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.38.0.tgz", - "integrity": "sha512-6sdeYaBgk9Fh7N2unEXGz+D+som2QCQGPAf1SxrkEr+Z32gMreQ0rparXTNGRRfYUWk/JzbGdcM8NSSd6oqnTA==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.38.0", - "@typescript-eslint/types": "5.38.0", - "@typescript-eslint/typescript-estree": "5.38.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "dependencies": { - "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", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.38.0.tgz", - "integrity": "sha512-MxnrdIyArnTi+XyFLR+kt/uNAcdOnmT+879os7qDRI+EYySR4crXJq9BXPfRzzLGq0wgxkwidrCJ9WCAoacm1w==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.38.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "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": {} - }, - "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" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "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 - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", - "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==" - }, - "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==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "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": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "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 - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "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" - } - }, - "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==", - "dev": true - }, - "eslint": { - "version": "8.23.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.1.tgz", - "integrity": "sha512-w7C1IXCc6fNqjpuYd0yPlcTKKmHlHHktRkzmBPZ+7cvNBQuiNjx0xaMTjAJGCafJhQkrFJooREv0CtrVzmHwqg==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.2", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "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", - "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.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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" - }, - "dependencies": { - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - } - } - }, - "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-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "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" - }, - "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", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "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" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "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", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "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" - } - } - } - }, - "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", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "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" - } - }, - "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==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "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==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "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", - "rimraf": "^3.0.2" - } - }, - "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 - }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" - }, - "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==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "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", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "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" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "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", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "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", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "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==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "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==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-sdsl": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz", - "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "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 - }, - "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 - }, - "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", - "type-check": "~0.4.0" - } - }, - "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==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "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 - }, - "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" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "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", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "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==", - "requires": { - "mime-db": "1.52.0" - } - }, - "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" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "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", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "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==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "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" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "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-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "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.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true, - "peer": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "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==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "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 - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "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 - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "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" - } - }, - "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" - } - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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" - } - }, - "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 - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "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==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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 - }, - "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==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "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" - } - }, - "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-fest": { - "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==", - "dev": true - }, - "typescript": { - "version": "4.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", - "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", - "dev": true - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" - }, - "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" - } - }, - "word-wrap": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", - "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "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 - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/regression/package.json b/regression/package.json deleted file mode 100644 index 2998bb9bee..0000000000 --- a/regression/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "regression", - "version": "1.0.0", - "description": "", - "main": "dist/index.js", - "type": "module", - "scripts": { - "start": "tsc && node --es-module-specifier-resolution=node dist/index.js", - "lint": "eslint . --ext .ts" - }, - "keywords": [], - "author": "", - "license": "ISC", - "devDependencies": { - "@types/node": "^18.7.18", - "@types/uuid": "^8.3.4", - "@typescript-eslint/eslint-plugin": "^5.38.0", - "@typescript-eslint/parser": "^5.38.0", - "eslint": "^8.23.1", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", - "typescript": "^4.8.3" - }, - "dependencies": { - "axios": "^1.6.0", - "chalk": "^5.0.1", - "uuid": "^9.0.0" - } -} diff --git a/regression/src/ExcludeIfReachedTests/ExcludeIfReachedExclusionProfiles.ts b/regression/src/ExcludeIfReachedTests/ExcludeIfReachedExclusionProfiles.ts deleted file mode 100644 index ff434e81fd..0000000000 --- a/regression/src/ExcludeIfReachedTests/ExcludeIfReachedExclusionProfiles.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { ConditionAssertion } from "../constants"; - -/** - * ABE will always mark decision point target A before enrollment - * - * ABE and BORT are in group 1 for group assignments - * CHAZ and DALE are in group 2 for group assignments - */ - -export const ExcludeIfReachedAssertionProfiles = { - NO_EXCLUSIONS_ALL_GET_INDEPENDENT_CONDITION: { - ABE: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - BORT: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - CHAZ: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - DALE: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - }, - ABE_EXCLUDED_OTHERS_GET_INDEPENDENT_CONDITION: { - ABE: { - conditionShouldBe: ConditionAssertion.DEFAULT, - conditionShouldMatchUser: null, - }, - BORT: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - CHAZ: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - DALE: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - }, - ABE_EXCLUDED_BORT_INDEPENDENT_CONDITION_CHAZ_AND_DALE_CONDITIONS_MATCH: { - ABE: { - conditionShouldBe: ConditionAssertion.DEFAULT, - conditionShouldMatchUser: null, - }, - BORT: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - CHAZ: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - DALE: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: "CHAZ", - }, - }, - NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH: { - ABE: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - BORT: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: "ABE", - }, - CHAZ: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - DALE: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: "CHAZ", - }, - }, - ABE_AND_BORT_EXCLUDED_CHAZ_AND_DALE_MATCH_CONDITIONS: { - ABE: { - conditionShouldBe: ConditionAssertion.DEFAULT, - conditionShouldMatchUser: null, - }, - BORT: { - conditionShouldBe: ConditionAssertion.DEFAULT, - conditionShouldMatchUser: "ABE", - }, - CHAZ: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - DALE: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: "CHAZ", - }, - }, -}; diff --git a/regression/src/ExcludeIfReachedTests/ExcludeIfReachedTestScenarios.ts b/regression/src/ExcludeIfReachedTests/ExcludeIfReachedTestScenarios.ts deleted file mode 100644 index 778f03ecbe..0000000000 --- a/regression/src/ExcludeIfReachedTests/ExcludeIfReachedTestScenarios.ts +++ /dev/null @@ -1,999 +0,0 @@ -import { - ConditionAssertion, - AssignmentUnit, - ConditionCode, - ConsistencyRule, -} from "../constants"; -import { SpecDetails } from "../mocks/SpecsDetails"; -import { ExcludeIfReachedAssertionProfiles as AssertionProfile } from "./ExcludeIfReachedExclusionProfiles"; - -export const ExcludeIfReachedTestNames = { - SINGLE_IND_IND_TRUE: "SINGLE_IND_IND_TRUE", - SINGLE_IND_IND_FALSE: "SINGLE_IND_IND_FALSE", - SINGLE_GRP_IND_TRUE: "SINGLE_GRP_IND_TRUE", - SINGLE_GRP_IND_FALSE: "SINGLE_GRP_IND_FALSE", - SINGLE_GRP_GRP_TRUE: "SINGLE_GRP_GRP_TRUE", - SINGLE_GRP_GRP_FALSE: "SINGLE_GRP_GRP_FALSE", - SINGLE_IND_EXP_TRUE: "SINGLE_IND_EXP_TRUE", - SINGLE_IND_EXP_FALSE: "SINGLE_IND_EXP_FALSE", - SINGLE_GRP_EXP_TRUE: "SINGLE_GRP_EXP_TRUE", - SINGLE_GRP_EXP_FALSE: "SINGLE_GRP_EXP_FALSE", - IND_IND_TWO_DP_BOTH_TRUE: "IND_IND_TWO_DP_BOTH_TRUE", - IND_IND_TWO_DP_BOTH_FALSE: "IND_IND_TWO_DP_BOTH_FALSE", - IND_IND_TWO_DP_TARGETA_TRUE: "IND_IND_TWO_DP_TARGETA_TRUE", - IND_IND_TWO_DP_TARGETB_TRUE: "IND_IND_TWO_DP_TARGETB_TRUE", - GRP_IND_TWO_DP_BOTH_TRUE: "GRP_IND_TWO_DP_BOTH_TRUE", - GRP_IND_TWO_DP_BOTH_FALSE: "GRP_IND_TWO_DP_BOTH_FALSE", - GRP_IND_TWO_DP_TARGETA_TRUE: "GRP_IND_TWO_DP_TARGETA_TRUE", - GRP_IND_TWO_DP_TARGETB_TRUE: "GRP_IND_TWO_DP_TARGETB_TRUE", - GRP_GRP_TWO_DP_BOTH_TRUE: "GRP_GRP_TWO_DP_BOTH_TRUE", - GRP_GRP_TWO_DP_BOTH_FALSE: "GRP_GRP_TWO_DP_BOTH_FALSE", - GRP_GRP_TWO_DP_TARGETA_TRUE: "GRP_GRP_TWO_DP_TARGETA_TRUE", - GRP_GRP_TWO_DP_TARGETB_TRUE: "GRP_GRP_TWO_DP_TARGETB_TRUE", - GRP_EXP_TWO_DP_BOTH_TRUE: "GRP_EXP_TWO_DP_BOTH_TRUE", - GRP_EXP_TWO_DP_BOTH_FALSE: "GRP_EXP_TWO_DP_BOTH_FALSE", - GRP_EXP_TWO_DP_TARGETA_TRUE: "GRP_EXP_TWO_DP_TARGETA_TRUE", - GRP_EXP_TWO_DP_TARGETB_TRUE: "GRP_EXP_TWO_DP_TARGETB_TRUE", - IND_EXP_TWO_DP_BOTH_TRUE: "IND_EXP_TWO_DP_BOTH_TRUE", - IND_EXP_TWO_DP_BOTH_FALSE: "IND_EXP_TWO_DP_BOTH_FALSE", - IND_EXP_TWO_DP_TARGETA_TRUE: "IND_EXP_TWO_DP_TARGETA_TRUE", - IND_EXP_TWO_DP_TARGETB_TRUE: "IND_EXP_TWO_DP_TARGETB_TRUE", -}; - -export const ExcludeIfReachedSpecDetails: SpecDetails[] = [ - /******************************************************************************************************************************* - * SINGLE_IND_IND_TRUE - */ - { - id: ExcludeIfReachedTestNames.SINGLE_IND_IND_TRUE, - description: - "Individual Assignment, Individual Consistency, Single Decision Point Experiment (One DP, exclude_if_reached is true)", - assertions: AssertionProfile.ABE_EXCLUDED_OTHERS_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * SINGLE_IND_IND_FALSE - */ - { - id: ExcludeIfReachedTestNames.SINGLE_IND_IND_FALSE, - description: - "Individual Assignment, Individual Consistency, Single Decision Point Experiment (One DP, exclude_if_reached is false)", - assertions: AssertionProfile.NO_EXCLUSIONS_ALL_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * SINGLE_GRP_IND_TRUE - */ - { - id: ExcludeIfReachedTestNames.SINGLE_GRP_IND_TRUE, - description: - "Group Assignment, Individual Consistency, Single Decision Point Experiment (One DP, exclude_if_reached is true)", - assertions: AssertionProfile.ABE_EXCLUDED_OTHERS_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * SINGLE_GRP_IND_FALSE - */ - { - id: ExcludeIfReachedTestNames.SINGLE_GRP_IND_FALSE, - description: - "Group Assignment, Individual Consistency, Single Decision Point Experiment (One DP, exclude_if_reached is false)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * SINGLE_GRP_GRP_TRUE - */ - { - id: ExcludeIfReachedTestNames.SINGLE_GRP_GRP_TRUE, - description: - "Group Assignment, Group Consistency, Single Decision Point Experiment (One DP, exclude_if_reached is true)", - assertions: - AssertionProfile.ABE_AND_BORT_EXCLUDED_CHAZ_AND_DALE_MATCH_CONDITIONS, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.GROUP, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * SINGLE_GRP_GRP_FALSE - */ - { - id: ExcludeIfReachedTestNames.SINGLE_GRP_GRP_FALSE, - description: - "Group Assignment, Group Consistency, Single Decision Point Experiment (One DP, exclude_if_reached is false)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.GROUP, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * SINGLE_IND_EXP_TRUE - */ - { - id: ExcludeIfReachedTestNames.SINGLE_IND_EXP_TRUE, - description: - "Individual Assignment, Experiment Consistency, Single Decision Point Experiment (One DP, exclude_if_reached is true)", - assertions: AssertionProfile.NO_EXCLUSIONS_ALL_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * SINGLE_IND_EXP_FALSE - */ - { - id: ExcludeIfReachedTestNames.SINGLE_IND_EXP_FALSE, - description: - "Individual Assignment, Experiment Consistency, Single Decision Point Experiment (One DP, exclude_if_reached is false)", - assertions: AssertionProfile.NO_EXCLUSIONS_ALL_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * SINGLE_GRP_EXP_TRUE - */ - { - id: ExcludeIfReachedTestNames.SINGLE_GRP_EXP_TRUE, - description: - "Group Assignment, Experiment Consistency, Single Decision Point Experiment (One DP, exclude_if_reached is true)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * SINGLE_GRP_EXP_FALSE - */ - { - id: ExcludeIfReachedTestNames.SINGLE_GRP_EXP_FALSE, - description: - "Group Assignment, Experiment Consistency, Single Decision Point Experiment (One DP, exclude_if_reached is false)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * IND_IND_TWO_DP_BOTH_TRUE - */ - { - id: ExcludeIfReachedTestNames.IND_IND_TWO_DP_BOTH_TRUE, - description: - "Individual Assignment, Individual Consistency, Two Decision Point Experiment (exclude_if_reached is true for both)", - assertions: AssertionProfile.ABE_EXCLUDED_OTHERS_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - { - targetSuffix: "_B", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * IND_IND_TWO_DP_BOTH_FALSE - */ - { - id: ExcludeIfReachedTestNames.IND_IND_TWO_DP_BOTH_FALSE, - description: - "Individual Assignment, Individual Consistency, Two Decision Point Experiment (exclude_if_reached is false for both)", - assertions: AssertionProfile.NO_EXCLUSIONS_ALL_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - { - targetSuffix: "_B", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * IND_IND_TWO_DP_TARGETA_TRUE - */ - { - id: ExcludeIfReachedTestNames.IND_IND_TWO_DP_TARGETA_TRUE, - description: - "Individual Assignment, Individual Consistency, Two Decision Point Experiment (exclude_if_reached is true for target A)", - assertions: AssertionProfile.ABE_EXCLUDED_OTHERS_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - { - targetSuffix: "_B", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * IND_IND_TWO_DP_TARGETB_TRUE - */ - { - id: ExcludeIfReachedTestNames.IND_IND_TWO_DP_TARGETB_TRUE, - description: - "Individual Assignment, Individual Consistency, Two Decision Point Experiment (exclude_if_reached is true for target B)", - assertions: AssertionProfile.NO_EXCLUSIONS_ALL_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - { - targetSuffix: "_B", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_IND_TWO_DP_BOTH_TRUE - */ - { - id: ExcludeIfReachedTestNames.GRP_IND_TWO_DP_BOTH_TRUE, - description: - "Group Assignment, Individual Consistency, Two Decision Point Experiment (exclude_if_reached is true for both)", - assertions: - AssertionProfile.ABE_EXCLUDED_BORT_INDEPENDENT_CONDITION_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - { - targetSuffix: "_B", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_IND_TWO_DP_BOTH_FALSE - */ - { - id: ExcludeIfReachedTestNames.GRP_IND_TWO_DP_BOTH_FALSE, - description: - "Group Assignment, Individual Consistency, Two Decision Point Experiment (exclude_if_reached is false for both)", - assertions: { - ABE: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - BORT: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - CHAZ: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: null, - }, - DALE: { - conditionShouldBe: ConditionAssertion.CONTROL_OR_VARIANT, - conditionShouldMatchUser: "CHAZ", - }, - }, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - { - targetSuffix: "_B", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_IND_TWO_DP_TARGETA_TRUE - */ - { - id: ExcludeIfReachedTestNames.GRP_IND_TWO_DP_TARGETA_TRUE, - description: - "Group Assignment, Individual Consistency, Two Decision Point Experiment (exclude_if_reached is true for target A)", - assertions: - AssertionProfile.ABE_EXCLUDED_BORT_INDEPENDENT_CONDITION_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - { - targetSuffix: "_B", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_IND_TWO_DP_TARGETB_TRUE - */ - { - id: ExcludeIfReachedTestNames.GRP_IND_TWO_DP_TARGETB_TRUE, - description: - "Group Assignment, Individual Consistency, Two Decision Point Experiment (exclude_if_reached is true for target B)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - { - targetSuffix: "_B", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_GRP_TWO_DP_BOTH_TRUE - */ - { - id: ExcludeIfReachedTestNames.GRP_GRP_TWO_DP_BOTH_TRUE, - description: - "Group Assignment, Group Consistency, Two Decision Point Experiment (exclude_if_reached is true for both)", - assertions: - AssertionProfile.ABE_AND_BORT_EXCLUDED_CHAZ_AND_DALE_MATCH_CONDITIONS, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.GROUP, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - { - targetSuffix: "_B", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_GRP_TWO_DP_BOTH_FALSE - */ - { - id: ExcludeIfReachedTestNames.GRP_GRP_TWO_DP_BOTH_FALSE, - description: - "Group Assignment, Group Consistency, Two Decision Point Experiment (exclude_if_reached is false for both)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.GROUP, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - { - targetSuffix: "_B", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_GRP_TWO_DP_TARGETA_TRUE - */ - { - id: ExcludeIfReachedTestNames.GRP_GRP_TWO_DP_TARGETA_TRUE, - description: - "Group Assignment, Group Consistency, Two Decision Point Experiment (exclude_if_reached is true for target A)", - assertions: - AssertionProfile.ABE_AND_BORT_EXCLUDED_CHAZ_AND_DALE_MATCH_CONDITIONS, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.GROUP, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - { - targetSuffix: "_B", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_GRP_TWO_DP_TARGETB_TRUE - */ - { - id: ExcludeIfReachedTestNames.GRP_GRP_TWO_DP_TARGETB_TRUE, - description: - "Group Assignment, Group Consistency, Two Decision Point Experiment (exclude_if_reached is true for target B)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.GROUP, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - { - targetSuffix: "_B", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_IND_TWO_DP_TARGETB_TRUE - */ - { - id: ExcludeIfReachedTestNames.GRP_IND_TWO_DP_TARGETB_TRUE, - description: - "Group Assignment, GROUP Consistency, Two Decision Point Experiment (exclude_if_reached is true for target B)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - { - targetSuffix: "_B", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * IND_EXP_TWO_DP_BOTH_TRUE - */ - { - id: ExcludeIfReachedTestNames.IND_EXP_TWO_DP_BOTH_TRUE, - description: - "Individual Assignment, Experiment Consistency, Two Decision Point Experiment (exclude_if_reached is true for both)", - assertions: AssertionProfile.NO_EXCLUSIONS_ALL_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - { - targetSuffix: "_B", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * IND_EXP_TWO_DP_BOTH_FALSE - */ - { - id: ExcludeIfReachedTestNames.IND_EXP_TWO_DP_BOTH_FALSE, - description: - "Individual Assignment, Experiment Consistency, Two Decision Point Experiment (exclude_if_reached is false for both)", - assertions: AssertionProfile.NO_EXCLUSIONS_ALL_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - { - targetSuffix: "_B", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * IND_EXP_TWO_DP_TARGETA_TRUE - */ - { - id: ExcludeIfReachedTestNames.IND_EXP_TWO_DP_TARGETA_TRUE, - description: - "Individual Assignment, Experiment Consistency, Two Decision Point Experiment (exclude_if_reached is true for target A)", - assertions: AssertionProfile.NO_EXCLUSIONS_ALL_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - { - targetSuffix: "_B", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * IND_EXP_TWO_DP_TARGETB_TRUE - */ - { - id: ExcludeIfReachedTestNames.IND_EXP_TWO_DP_TARGETB_TRUE, - description: - "Individual Assignment, Experiment Consistency, Two Decision Point Experiment (exclude_if_reached is true for target B)", - assertions: AssertionProfile.NO_EXCLUSIONS_ALL_GET_INDEPENDENT_CONDITION, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - { - targetSuffix: "_B", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_EXP_TWO_DP_BOTH_TRUE - */ - { - id: ExcludeIfReachedTestNames.GRP_EXP_TWO_DP_BOTH_TRUE, - description: - "Group Assignment, Experiment Consistency, Two Decision Point Experiment (exclude_if_reached is true for both)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - { - targetSuffix: "_B", - excludeIfReached: true, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_EXP_TWO_DP_BOTH_FALSE - */ - { - id: ExcludeIfReachedTestNames.GRP_EXP_TWO_DP_BOTH_FALSE, - description: - "Group Assignment, Experiment Consistency, Two Decision Point Experiment (exclude_if_reached is false for both)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - { - targetSuffix: "_B", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_EXP_TWO_DP_TARGETA_TRUE - */ - { - id: ExcludeIfReachedTestNames.GRP_EXP_TWO_DP_TARGETA_TRUE, - description: - "Group Assignment, Experiment Consistency, Two Decision Point Experiment (exclude_if_reached is true for target A)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: true, - }, - { - targetSuffix: "_B", - excludeIfReached: false, - }, - ], - }, - }, - /******************************************************************************************************************************* - * GRP_EXP_TWO_DP_TARGETB_TRUE - */ - { - id: ExcludeIfReachedTestNames.GRP_EXP_TWO_DP_TARGETB_TRUE, - description: - "Group Assignment, Experiment Consistency, Two Decision Point Experiment (exclude_if_reached is true for target B)", - assertions: - AssertionProfile.NO_EXCLUSIONS_ABE_AND_BORT_CONDITTIONS_MATCH_CHAZ_AND_DALE_CONDITIONS_MATCH, - experiment: { - assignmentUnit: AssignmentUnit.GROUP, - consistencyRule: ConsistencyRule.EXPERIMENT, - conditions: [ - { - conditionCode: ConditionCode.CONTROL, - }, - { - conditionCode: ConditionCode.VARIANT, - }, - ], - decisionPoints: [ - { - targetSuffix: "_A", - excludeIfReached: false, - }, - { - targetSuffix: "_B", - excludeIfReached: true, - }, - ], - }, - }, -]; diff --git a/regression/src/ExcludeIfReachedTests/ExcludeIfReachedTestSuite.ts b/regression/src/ExcludeIfReachedTests/ExcludeIfReachedTestSuite.ts deleted file mode 100644 index 5dcee1132d..0000000000 --- a/regression/src/ExcludeIfReachedTests/ExcludeIfReachedTestSuite.ts +++ /dev/null @@ -1,652 +0,0 @@ -import axios from "axios"; -import { env } from "../env"; -import { v4 as uuidv4 } from "uuid"; -import fs from "fs"; -import chalk from "chalk"; -import { - ActualAssignedCondition, - AssignmentResponseSummary, - ExcludeIfReachedSuiteOptions, - MockConditionAlias, - MockDecisionPoint, - MockExperimentCondition, - SimpleSummary, - SpecDetails, - SpecResult, - SpecResultsSummary, - SpectSummaryMetadata, -} from "../mocks/SpecsDetails"; -import { BasicUser, excludeIfReachedUsers, UserNameType } from "../mocks/Users"; -import { - AssignRequestBody, - AssignResponse, - ExperimentRequestResponseBody, - InitUserRequestBody, - MarkRequestBody, - StatusRequestBody, -} from "../mocks/RequestResponse"; -import { - ConditionAssertion, - ConditionCode, - DecisionPointSite, - SpecOverallPassFail, -} from "../constants"; -import { ExcludeIfReachedSpecDetails } from "./ExcludeIfReachedTestScenarios"; - -export class ExcludeIfReachedTestSuite { - private host: string; - private authToken: string; - private context: string; - private detailedSummary: SpecResultsSummary[] = []; - private simpleSummary: SimpleSummary[] = []; - private writePath = ""; - private writeSimpleSummaryToFile: boolean; - private writeDetailedSummaryToFile: boolean; - private runThisManyTimes: number; - private BANNER = chalk.bold.green; - - constructor( - envHost: string, - envContext: string, - options: ExcludeIfReachedSuiteOptions - ) { - this.host = envHost; - this.authToken = env.authToken; - this.context = envContext; - this.writeSimpleSummaryToFile = !!options.writeSimpleSummaryToFile; - this.writeDetailedSummaryToFile = !!options.writeDetailedSummaryToFile; - this.writePath = options.writePath || ""; - this.runThisManyTimes = options.runThisManyTimes || 1; - - console.log(this.BANNER(">>> Initializing tests for this host", this.host)); - console.log(this.BANNER(">>> Using this bearer token:", this.authToken)); - console.log(this.BANNER(">>> Using this context:", this.context)); - } - - /** - * run all tests, or provide a partial list - */ - - public async run(scenarioLists: SpecDetails[][], partialList?: string[]) { - const allTestScenarios = scenarioLists.flat(); - let testList: SpecDetails[] = []; - console.log(this.BANNER(">>> Begin ExcludeIfReachedTests")); - // Perform global setup steps - - if (partialList) { - partialList.forEach((testName: string) => { - const foundTest = allTestScenarios.find((details: SpecDetails) => { - return details.id === testName; - }); - if (foundTest) testList.push(foundTest); - }); - } else { - testList = ExcludeIfReachedSpecDetails; - } - - await this.initializeUsers(excludeIfReachedUsers); - - // Execute tests (synchronously, async breaks the db, maybe there's a way...) - await this.executeAllSpecsSynchronously(testList); - - this.logTheResults(); - } - - public logTheResults(): void { - const JSONdetailedSummary = JSON.stringify(this.detailedSummary, null, 2); - const JSONsimpleSummary = JSON.stringify(this.simpleSummary, null, 2); - console.log(this.BANNER(">>> Tests finished.")); - console.log(this.BANNER(">>> Detailed summary:")); - console.log(JSON.stringify(this.detailedSummary, null, 2)); - console.log(this.BANNER(">>> Overall Spec results:")); - console.log(JSON.stringify(this.simpleSummary, null, 2)); - - this.writeToFile(JSONdetailedSummary, JSONsimpleSummary); - } - - public writeToFile( - JSONdetailedSummary: string, - JSONsimpleSummary: string - ): void { - const metaData: SpectSummaryMetadata = { - date: new Date().toISOString(), - environment: this.host, - context: this.context, - appVersion: "", - }; - - if (this.writeDetailedSummaryToFile) { - fs.writeFileSync( - `${this.writePath}DetailedSummary-${new Date().toISOString()}`, - JSON.stringify(metaData, null, 2) + ",\n" + JSONdetailedSummary - ); - } - - if (this.writeSimpleSummaryToFile) { - fs.writeFileSync( - `${this.writePath}SimpleSummary-${new Date().toISOString()}`, - JSON.stringify(metaData, null, 2) + ",\n" + JSONsimpleSummary - ); - } - } - - public async executeAllSpecsSynchronously(testList: SpecDetails[]) { - for (const details of testList) { - const results = await this.executeSpec(details); - this.publishSummaries(results, details); - } - } - - public publishSummaries(results: SpecResultsSummary, details: SpecDetails) { - this.detailedSummary.push(results); - this.simpleSummary.push({ - testName: details.id, - description: details.description, - result: results.assignResponseSummary.every( - (summary: AssignmentResponseSummary) => { - return summary.result?.overall === SpecOverallPassFail.PASS; - } - ) - ? SpecOverallPassFail.PASS - : SpecOverallPassFail.FAIL, - }); - } - - public async initializeUsers(users: BasicUser[]) { - console.log(">>> Initialize users"); - return await Promise.all( - users.map(async (user: BasicUser) => { - const newUser: InitUserRequestBody = { - id: user.id, - group: { - // schoolId: [user.workingGroupId], - "add-group1": [user.workingGroupId], - }, - workingGroup: { - // schoolId: user.workingGroupId, - "add-group1": user.workingGroupId, - }, - }; - try { - const response = await this.postUser(newUser); - console.log("Response:"); - console.log(response?.data); - } catch (error) { - console.log(error); - } - }) - ); - } - - public async executeSpec(details: SpecDetails): Promise { - console.log(`>>> Execute test for: ${details.id}`); - - // start the summary details - let summary: SpecResultsSummary = { - id: details.id, - description: details.description, - assignResponseSummary: [], - }; - - let specExperiment: ExperimentRequestResponseBody | undefined = undefined; - - // 1. create experiment - specExperiment = await this.doCreateExperiment(details); - - if (!specExperiment) { - console.log(">>> spec experiment failed to get created, bail out"); - summary.description = "something went wrong creating the experiment!"; - return summary; - } - - // 2. Mark the user to test "excludeIfReached" against - await this.doMarkUser(details); - - // 3. start enrolling - await this.doStartEnrollment(specExperiment); - - // 4. assign all users and log responses - await this.doAssignAllUsers(summary, details); - - // 5. delete the experiment - await this.doDeleteExperiment(specExperiment); - - // 6. analyze the results - summary = this.analyzeResults(summary, details); - - return summary; - } - - public getAssignedConditionForAllValue( - assignmentSummary: AssignmentResponseSummary, - details: SpecDetails - ) { - const isCorrectNumberOfAssignedDecisionPoints = - assignmentSummary.actualAssignedConditions.length === - details.experiment.decisionPoints.length; - - if (!isCorrectNumberOfAssignedDecisionPoints) { - throw new Error( - `Unexpected mismatch in actual assignments length (${assignmentSummary.actualAssignedConditions.length}) vs expected (${details.experiment.decisionPoints.length})` - ); - } - - const parentConditionAliasMap = details.options?.useParentConditionAliasMap; - - const hasSameConditionForAll = - assignmentSummary.actualAssignedConditions.every( - (actualAssignedCondition: ActualAssignedCondition) => { - if (parentConditionAliasMap) { - return ( - parentConditionAliasMap[actualAssignedCondition.condition] === - parentConditionAliasMap[ - assignmentSummary.actualAssignedConditions[0].condition - ] - ); - } else { - return ( - actualAssignedCondition.condition === - assignmentSummary.actualAssignedConditions[0].condition - ); - } - } - ); - - if (parentConditionAliasMap) { - assignmentSummary.assignedConditionForAll = hasSameConditionForAll - ? parentConditionAliasMap[ - assignmentSummary.actualAssignedConditions[0].condition - ] - : "mixed"; - } else { - assignmentSummary.assignedConditionForAll = hasSameConditionForAll - ? assignmentSummary.actualAssignedConditions[0].condition - : "mixed"; - } - } - - public getConditionAnalysisResult( - assignmentSummary: AssignmentResponseSummary, - details: SpecDetails, - summary: SpecResultsSummary - ) { - const result: SpecResult = { - conditionPasses: false, - userMatchPasses: false, - overall: SpecOverallPassFail.FAIL, - }; - - const isDefaultMatch = - assignmentSummary.assignedConditionForAll === ConditionCode.DEFAULT && - assignmentSummary.expected.conditionShouldBe === - ConditionAssertion.DEFAULT; - - const isControlOrVariantMatch = - assignmentSummary.assignedConditionForAll !== ConditionCode.DEFAULT && - assignmentSummary.expected.conditionShouldBe === - (details?.options?.useCustomAssertion || - ConditionAssertion.CONTROL_OR_VARIANT); - - const isConditionMatchWithUserInGroup = - this.findIsConditionMatchWithUserInGroup(summary, assignmentSummary); - - if (isDefaultMatch || isControlOrVariantMatch) { - result.conditionPasses = true; - } - - result.userMatchPasses = isConditionMatchWithUserInGroup; - - if (result.userMatchPasses && result.conditionPasses) { - result.overall = SpecOverallPassFail.PASS; - } - - assignmentSummary.result = result; - } - - public analyzeResults( - summary: SpecResultsSummary, - details: SpecDetails - ): SpecResultsSummary { - // first loop over each user summary to assign the "AssignedConditionForAll" value for each user - summary.assignResponseSummary.forEach( - (assignSummary: AssignmentResponseSummary) => { - this.getAssignedConditionForAllValue(assignSummary, details); - } - ); - - // then loop over again to analyze pass/fail - summary.assignResponseSummary.forEach( - (assignSummary: AssignmentResponseSummary) => { - this.getConditionAnalysisResult(assignSummary, details, summary); - } - ); - - return summary; - } - - public findIsConditionMatchWithUserInGroup( - summary: SpecResultsSummary, - thisUserSummary: AssignmentResponseSummary - ): boolean { - if (thisUserSummary.expected.conditionShouldMatchUser === null) { - return true; - } - - const userToMatch = summary.assignResponseSummary.find( - (summary: AssignmentResponseSummary) => { - return ( - summary.userId === thisUserSummary.expected.conditionShouldMatchUser - ); - } - ); - - return !!( - userToMatch?.assignedConditionForAll === - thisUserSummary.assignedConditionForAll - ); - } - - public async doCreateExperiment( - details: SpecDetails - ): Promise { - const experimentRequestBody = this.createNewExperiment(details); - - try { - const response = await this.postExperiment(experimentRequestBody); - console.log(">>> Experiment successfully created:"); - // console.log(JSON.stringify(response?.data, null, 2)); - return response?.data; - } catch (error) { - console.log(error); - } - } - - public async doMarkUser(details: SpecDetails) { - const markRequestBody: MarkRequestBody = { - userId: "ABE", - experimentPoint: "SelectSection", - partitionId: `${details.id}${details.experiment.decisionPoints[0].targetSuffix}`, - condition: "control", - }; - - try { - const response = await this.postMark(markRequestBody); - const markedResponse = response?.data; - console.log(">>> Abe successfully marked:"); - // console.log(markRequestBody); - // console.log(markedResponse); - } catch (error) { - console.log(error); - } - } - - public async doStartEnrollment(experiment: ExperimentRequestResponseBody) { - if (experiment?.id) { - const statusRequestBody: StatusRequestBody = { - experimentId: experiment.id, - state: "enrolling", - }; - - try { - const response = await this.postStatusUpdate(statusRequestBody); - const statusResponse = response?.data; - console.log(">>> Experiment successfully started enrolling:"); - // console.log(statusResponse); - } catch (error) { - console.log(error); - } - } - } - - public async doAssignAllUsers( - summary: SpecResultsSummary, - details: SpecDetails - ) { - await Promise.all( - excludeIfReachedUsers.map(async (user: BasicUser) => { - const assignRequestBody: AssignRequestBody = { - userId: user.id, - context: this.context, - }; - - try { - const response = await this.assignUser(assignRequestBody); - // log this for summary - const assignResponse = response?.data; - console.log( - `>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ${user.id} successfully assigned:` - ); - // console.log(assignResponse); - summary = this.updateSummary( - assignResponse, - summary, - `${details.id}${details.experiment.decisionPoints[0].targetSuffix}`, - user.id, - details - ); - } catch (error) { - console.log(`${user.id} failed to assign`); - // console.log(error); - } - }) - ); - } - - public updateSummary( - assignResponse: AssignResponse[], - summary: SpecResultsSummary, - target: string, - userId: UserNameType, - details: SpecDetails - ): SpecResultsSummary { - let actualAssignedConditions: ActualAssignedCondition[] = []; - - const specExperimentAssignments = assignResponse.filter( - (assignResponse: AssignResponse) => { - return assignResponse.expId.startsWith(details.id); - } - ); - - if (!specExperimentAssignments.length) { - actualAssignedConditions = details.experiment.decisionPoints.map( - (decisionPoint: MockDecisionPoint) => { - return { - decisionPointTarget: details.id + decisionPoint.targetSuffix, - condition: ConditionCode.DEFAULT, - }; - } - ); - } else { - actualAssignedConditions = specExperimentAssignments.map( - (assignResponse: AssignResponse) => { - return { - decisionPointTarget: assignResponse.expId, - condition: assignResponse.assignedCondition.conditionCode, - }; - } - ); - } - - summary.assignResponseSummary.push({ - userId, - assignedConditionForAll: "mixed", - actualAssignedConditions, - expected: details.assertions[userId], - }); - - return summary; - } - - public async doDeleteExperiment(experiment: ExperimentRequestResponseBody) { - if (experiment?.id) { - try { - const response = await this.deleteExperiment(experiment); - const deleteResponse = response?.data; - console.log(">>> Experiment successfully deleted:"); - // console.log(deleteResponse); - } catch (error) { - // console.log(error); - } - } - } - - public async assignUser(data: AssignRequestBody) { - console.log(`request: POST ${this.host}${env.endpoints.assign}`); - // console.log("Body:"); - // console.log(data); - return axios.post(`${this.host}${env.endpoints.assign}`, data, { - headers: { Authorization: `Bearer ${this.authToken}` }, - }); - } - - public async deleteExperiment(data: ExperimentRequestResponseBody) { - console.log( - `request: DELETE ${this.host}${env.endpoints.experiment}/${data.id}` - ); - // console.log("Body:"); - // console.log(data); - return axios.delete(`${this.host}${env.endpoints.experiment}/${data.id}`, { - headers: { Authorization: `Bearer ${this.authToken}` }, - }); - } - - public async postMark(data: MarkRequestBody) { - console.log(`request: POST ${this.host}${env.endpoints.mark}`); - // console.log("Body:"); - // console.log(data); - return axios.post(`${this.host}${env.endpoints.mark}`, data, { - headers: { Authorization: `Bearer ${this.authToken}` }, - }); - } - - public async postUser(data: InitUserRequestBody) { - console.log(`request: POST ${this.host}${env.endpoints.init}`); - // console.log("Body:"); - // console.log(data); - return axios.post(`${this.host}${env.endpoints.init}`, data, { - headers: { Authorization: `Bearer ${this.authToken}` }, - }); - } - - public async postExperiment(data: ExperimentRequestResponseBody) { - console.log(`request: POST ${this.host}${env.endpoints.experiment}`); - // console.log("Body:"); - // console.log(data); - return axios.post(`${this.host}${env.endpoints.experiment}`, data, { - headers: { Authorization: `Bearer ${this.authToken}` }, - }); - } - - public async postStatusUpdate(data: StatusRequestBody) { - console.log(`request: POST ${this.host}${env.endpoints.status}`); - // console.log("Body:"); - // console.log(data); - return axios.post(`${this.host}${env.endpoints.status}`, data, { - headers: { Authorization: `Bearer ${this.authToken}` }, - }); - } - - public generateDecisionPointsConditionsAndAliases(details: SpecDetails): any { - const conditions = details.experiment.conditions.map( - (condition: MockExperimentCondition, index: number) => { - return { - id: uuidv4(), - conditionCode: condition.conditionCode, - assignmentWeight: ( - 100 / details.experiment.conditions.length - ).toString(), - description: "", - order: index + 1, - name: "", - }; - } - ); - - const decisionPoints = details.experiment.decisionPoints.map( - (decisionPoint: MockDecisionPoint, index: number) => { - return { - site: DecisionPointSite.SELECT_SECTION, - target: `${details.id}${decisionPoint.targetSuffix}`, - description: "", - order: index + 1, - excludeIfReached: decisionPoint.excludeIfReached, - }; - } - ); - - const conditionAliases = details.experiment.conditionAliases - ? details.experiment.conditionAliases.map( - (conditionAlias: MockConditionAlias) => { - const parentCondition = conditions.find((condition) => { - return condition.conditionCode === conditionAlias.conditionCode; - }); - - const decisionPoint = decisionPoints.find((decisionPoint) => { - return ( - decisionPoint.target === - details.id + conditionAlias.decisionPointTargetSuffix - ); - }); - - return { - id: uuidv4(), - aliasName: conditionAlias.aliasName, - parentCondition: parentCondition?.id, - decisionPoint: `${details.id}${conditionAlias.decisionPointTargetSuffix}_${decisionPoint?.site}`, - }; - } - ) - : []; - - return { - conditionAliases, - conditions, - decisionPoints, - }; - } - - public createNewExperiment( - details: SpecDetails - ): ExperimentRequestResponseBody { - const { conditions, decisionPoints, conditionAliases } = - this.generateDecisionPointsConditionsAndAliases(details); - const newExperiment: ExperimentRequestResponseBody = { - name: details.id, - description: "", - consistencyRule: details.experiment.consistencyRule, - assignmentUnit: details.experiment.assignmentUnit, - context: [this.context], - tags: [], - logging: false, - conditions, - partitions: decisionPoints, - conditionAliases, - experimentSegmentInclusion: { - userIds: [], - groups: [], - subSegmentIds: [], - type: "private", - }, - experimentSegmentExclusion: { - userIds: [], - groups: [], - subSegmentIds: [], - type: "private", - }, - filterMode: "includeAll", - group: "add-group1", - queries: [], - endOn: null, - enrollmentCompleteCondition: null, - startOn: null, - state: "inactive", - postExperimentRule: "continue", - revertTo: null, - }; - - console.log(">>> Created New Experiment"); - // console.log(newExperiment); - - return newExperiment; - } -} diff --git a/regression/src/ExcludeIfReachedTests/excludeIfReachedTests.md b/regression/src/ExcludeIfReachedTests/excludeIfReachedTests.md deleted file mode 100644 index 167f1e11a1..0000000000 --- a/regression/src/ExcludeIfReachedTests/excludeIfReachedTests.md +++ /dev/null @@ -1,242 +0,0 @@ - ---- - -ABE and BORT are in group 1 -CHAZ and DALE are in group 2 - -Simulate Individual Assignment, Individual Consistency, Single Decision Point Experiment -(One DP, exclude_if_reached is true) - -1. /mark ABE for "SINGLE_IND_IND" -2. Start experiment "SINGLE_IND_IND" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should be excluded (keep getting default) -BORT should get assigned any condition -CHAZ should get assigned any condition -DALE should get assigned any condition - ---- - -Simulate Group Assignment, Individual Consistency, Single Decison Point Experiment -(One DP, exclude_if_reached is true) - -1. /mark ABE for "SINGLE_GRP_IND" -2. Start experiment for "SINGLE_GRP_IND" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should be excluded (keep getting default) -BORT should get assigned any condition -CHAZ should get assigned any condition -DALE should get assigned same condition as CHAZ - ---- - -Simulate Group Assignment, Group Consistency, Single Decison Point Experiment -(One DP, exclude_if_reached is true) - -1. /mark ABE for "SINGLE_GRP_GRP" -2. Start experiment for "SINGLE_GRP_GRP" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should be excluded (keep getting default) -BORT should get excluded (keep getting default) -CHAZ should get assigned any condition -DALE should get assigned same condition as CHAZ - ---- - -Simulate Individual Assignment, Experiment Consistency, Single Decision Point Experiment -(One DP, exclude_if_reached is false) - -1. /mark ABE for "SINGLE_IND_EXP" -2. Start experiment for "SINGLE_IND_EXP" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should get any condition -BORT should get any condition -CHAZ should get any condition -DALE should get any condition - ---- - -Simulate Individual Assignment, Experiment Consistency, Single Decision Point Experiment -(One DP, exclude_if_reached is false) - -1. /mark ABE for "SINGLE_GRP_EXP" -2. Start experiment for "SINGLE_GRP_EXP" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should get any condition -BORT should get same condition as ABE -CHAZ should get any condition -DALE should get same condition as CHAZ - ---- ---- - -Simulate Individual Assignment, Individual Consistency, Multi Decision Point Experiment -(Two DP, exclude_if_reached is true for both) - -1. /mark ABE for "MULTI_IND_IND_A" -2. Start experiment for "MULTI_IND_IND" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should get excluded (keep getting default) -BORT should get any condition, same for both DP -CHAZ should get any condition, same for both DP -DALE should get any condition, same for both DP - ---- - -Simulate Group Assignment, Individual Consistency, Multi Decision Point Experiment -(Two DP, exclude_if_reached is true for both) - -1. /mark ABE for "MULTI_GRP_IND_A" -2. Start experiment for "MULTI_GRP_IND" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should get excluded (keep getting default) -BORT should get any condition, same for both DP -CHAZ should get any condition, same for both DP -DALE should get same conditions as CHAZ for both DP - ---- - -Simulate Group Assignment, Group Consistency, Multi Decision Point Experiment -(Two DP, exclude_if_reached is true for both) - -1. /mark ABE for "MULTI_GRP_GRP_A" -2. Start experiment for "MULTI_GRP_GRP" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should get excluded (keep getting default) -BORT should get excluded (keep getting default) -CHAZ should get any condition, same for both DP -DALE should get same conditions as CHAZ for both DP - ---- - -Simulate Individual Assignment, Experiment Consistency, Multi Decision Point Experiment -(Two DP, exclude_if_reached is false for both) - -1. /mark ABE for "MULTI_IND_EXP_A" -2. Start experiment for "MULTI_IND_EXP" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should get any condition, same for both DP -BORT should get any condition, same for both DP -CHAZ should get any condition, same for both DP -DALE should get any condition, same for both DP - ---- - -Simulate Group Assignment, Experiment Consistency, Multi Decision Point Experiment -(Two DP, exclude_if_reached is false for both) - -1. /mark ABE for "MULTI_GRP_EXP_A" -2. Start experiment for "MULTI_GRP_EXP" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should get any condition, same for both DP -BORT should get any condition, same for both DP -CHAZ should get any condition, same for both DP -DALE should get any condition, same for both DP - ---- - -Simulate Individual Assignment, Mixed Multi Decision Point Experiment (Experiment Consistency?) -(Two DP, MULTI_IND_MIXED_A is true, MULTI_IND_MIXED_B is false) - -First test = student marks exclusionary DP - -1. /mark ABE for "MULTI_IND_MIXED_A" -2. Start experiment for "MULTI_IND_MIXED_1" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should get excluded (keep getting default) -BORT should get any condition, same for both DP -CHAZ should get any condition, same for both DP -DALE should get any condition, same for both DP - -Second test = student marks non-exclusionary DP - -1. /mark ABE for "MULTI_IND_MIXED_B" -2. Start experiment for "MULTI_IND_MIXED_2" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should get any condition, same for both DP -BORT should get any condition, same for both DP -CHAZ should get any condition, same for both DP -DALE should get any condition, same for both DP - ---- - -Simulate Group Assignment, Mixed Multi Decision Point Experiment (Experiment Consistency?) -(Two DP, MULTI_IND_MIXED_A is true, MULTI_IND_MIXED_B is false) - -First test = student marks exclusionary DP - -1. /mark ABE for "MULTI_GRP_MIXED_A" -2. Start experiment for "MULTI_GRP_MIXED_1" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should get excluded (keep getting default) -BORT should get excluded (keep getting default) -CHAZ should get any condition, same for both DP -DALE should get same conditions as CHAZ - -Second test = student marks non-exclusionary DP - -1. /mark ABE for "MULTI_GRP_MIXED_B" -2. Start experiment for "MULTI_GRP_MIXED_2" -3. /assign ABE -4. /assign BORT -5. /assign CHAZ -6. /assign DALE - -ABE should get any condition, same for both DP -BORT should get same conditions as ABE -CHAZ should get any condition, same for both DP -DALE should get same conditions as CHAZ - ---- \ No newline at end of file diff --git a/regression/src/XPRIZE/XPRIZE_TestScenarios.ts b/regression/src/XPRIZE/XPRIZE_TestScenarios.ts deleted file mode 100644 index 3443f072d0..0000000000 --- a/regression/src/XPRIZE/XPRIZE_TestScenarios.ts +++ /dev/null @@ -1,285 +0,0 @@ -import { AssignmentUnit, ConsistencyRule } from "../constants"; -import { - XPRIZE_ASSERTION, - XPRIZE_ParentCondition_Alias_Map, - XPRIZE_Condition, - XPRIZE_Decision_Point_Target, - XPRIZE_Condition_Aliases, -} from "./XPRIZE_constants"; - -export const XPRIZE_TestNames = { - XPRIZE_INDIAN_RIVER: "XPRIZE_INDIAN_RIVER", - XPRIZE_INDIAN_RIVER_NO_ALIASES: "XPRIZE_INDIAN_RIVER_NO_ALIASES", -}; - -export const XPRIZE_TestScenarios = [ - /******************************************************************************************************************************* - * XPRIZE_INDIAN_RIVER - */ - { - id: XPRIZE_TestNames.XPRIZE_INDIAN_RIVER, - description: - "Individual Assignment, Individual Consistency, 8 Decision Point Experiment, 3 Conditions (exclude_if_reached is false for all)", - assertions: { - ABE: { - conditionShouldBe: XPRIZE_ASSERTION.ANY_XPRIZE_CONDITION, - conditionShouldMatchUser: null, - }, - BORT: { - conditionShouldBe: XPRIZE_ASSERTION.ANY_XPRIZE_CONDITION, - conditionShouldMatchUser: null, - }, - CHAZ: { - conditionShouldBe: XPRIZE_ASSERTION.ANY_XPRIZE_CONDITION, - conditionShouldMatchUser: null, - }, - DALE: { - conditionShouldBe: XPRIZE_ASSERTION.ANY_XPRIZE_CONDITION, - conditionShouldMatchUser: null, - }, - }, - options: { - useParentConditionAliasMap: XPRIZE_ParentCondition_Alias_Map, - useCustomAssertion: XPRIZE_ASSERTION.ANY_XPRIZE_CONDITION, - }, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: XPRIZE_Condition.CONTROL, - }, - { - conditionCode: XPRIZE_Condition.NOTIFICATION, - }, - { - conditionCode: XPRIZE_Condition.NON_NOTIFICATION, - }, - ], - decisionPoints: [ - { - targetSuffix: - XPRIZE_Decision_Point_Target.COMPARE_FUNCTIONS_DIFF_REPS_PROPORTIONAL, - excludeIfReached: false, - }, - { - targetSuffix: XPRIZE_Decision_Point_Target.DIRECT_VARIATION_CONVERT, - excludeIfReached: false, - }, - { - targetSuffix: XPRIZE_Decision_Point_Target.DIRECT_VARIATION_EQUATION, - excludeIfReached: false, - }, - { - targetSuffix: - XPRIZE_Decision_Point_Target.EQUIVALENT_RATIOS_RATES_DNL, - excludeIfReached: false, - }, - { - targetSuffix: - XPRIZE_Decision_Point_Target.EQUIVALENT_RATIOS_RATES_TABLES, - excludeIfReached: false, - }, - { - targetSuffix: XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_1, - excludeIfReached: false, - }, - { - targetSuffix: XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_2, - excludeIfReached: false, - }, - { - targetSuffix: XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_3, - excludeIfReached: false, - }, - ], - conditionAliases: [ - { - conditionCode: XPRIZE_Condition.NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.COMPARE_FUNCTIONS_DIFF_REPS_PROPORTIONAL, - aliasName: - XPRIZE_Condition_Aliases.PROMPT_COMPARE_FUNCTIONS_DIFF_REPS_PROPORTIONAL, - }, - { - conditionCode: XPRIZE_Condition.NON_NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.COMPARE_FUNCTIONS_DIFF_REPS_PROPORTIONAL, - aliasName: - XPRIZE_Condition_Aliases.NO_PROMPT_COMPARE_FUNCTIONS_DIFF_REPS_PROPORTIONAL, - }, - { - conditionCode: XPRIZE_Condition.NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.DIRECT_VARIATION_CONVERT, - aliasName: XPRIZE_Condition_Aliases.PROMPT_DIRECT_VARIATION_CONVERT, - }, - { - conditionCode: XPRIZE_Condition.NON_NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.DIRECT_VARIATION_CONVERT, - aliasName: - XPRIZE_Condition_Aliases.NO_PROMPT_DIRECT_VARIATION_CONVERT, - }, - { - conditionCode: XPRIZE_Condition.NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.DIRECT_VARIATION_EQUATION, - aliasName: XPRIZE_Condition_Aliases.PROMPT_DIRECT_VARIATION_EQUATION, - }, - { - conditionCode: XPRIZE_Condition.NON_NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.DIRECT_VARIATION_EQUATION, - aliasName: - XPRIZE_Condition_Aliases.NO_PROMPT_DIRECT_VARIATION_EQUATION, - }, - { - conditionCode: XPRIZE_Condition.NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.EQUIVALENT_RATIOS_RATES_DNL, - aliasName: - XPRIZE_Condition_Aliases.PROMPT_EQUIVALENT_RATIOS_RATES_DNL, - }, - { - conditionCode: XPRIZE_Condition.NON_NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.EQUIVALENT_RATIOS_RATES_DNL, - aliasName: - XPRIZE_Condition_Aliases.NO_PROMPT_EQUIVALENT_RATIOS_RATES_DNL, - }, - { - conditionCode: XPRIZE_Condition.NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.EQUIVALENT_RATIOS_RATES_TABLES, - aliasName: - XPRIZE_Condition_Aliases.PROMPT_EQUIVALENT_RATIOS_RATES_TABLES, - }, - { - conditionCode: XPRIZE_Condition.NON_NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.EQUIVALENT_RATIOS_RATES_TABLES, - aliasName: - XPRIZE_Condition_Aliases.NO_PROMPT_EQUIVALENT_RATIOS_RATES_TABLES, - }, - { - conditionCode: XPRIZE_Condition.NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_1, - aliasName: XPRIZE_Condition_Aliases.PROMPT_PARTS_OF_GROUPS_1, - }, - { - conditionCode: XPRIZE_Condition.NON_NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_1, - aliasName: XPRIZE_Condition_Aliases.NO_PROMPT_PARTS_OF_GROUPS_1, - }, - { - conditionCode: XPRIZE_Condition.NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_2, - aliasName: XPRIZE_Condition_Aliases.PROMPT_PARTS_OF_GROUPS_2, - }, - { - conditionCode: XPRIZE_Condition.NON_NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_2, - aliasName: XPRIZE_Condition_Aliases.NO_PROMPT_PARTS_OF_GROUPS_2, - }, - { - conditionCode: XPRIZE_Condition.NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_3, - aliasName: XPRIZE_Condition_Aliases.PROMPT_PARTS_OF_GROUPS_3, - }, - { - conditionCode: XPRIZE_Condition.NON_NOTIFICATION, - decisionPointTargetSuffix: - XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_3, - aliasName: XPRIZE_Condition_Aliases.NO_PROMPT_PARTS_OF_GROUPS_3, - }, - ], - }, - }, - /******************************************************************************************************************************* - * XPRIZE_INDIAN_RIVER_NO_ALIASES - */ - { - id: XPRIZE_TestNames.XPRIZE_INDIAN_RIVER_NO_ALIASES, - description: - "Individual Assignment, Individual Consistency, 8 Decision Point Experiment, 3 Conditions (exclude_if_reached is false for all)", - assertions: { - ABE: { - conditionShouldBe: XPRIZE_ASSERTION.ANY_XPRIZE_CONDITION, - conditionShouldMatchUser: null, - }, - BORT: { - conditionShouldBe: XPRIZE_ASSERTION.ANY_XPRIZE_CONDITION, - conditionShouldMatchUser: null, - }, - CHAZ: { - conditionShouldBe: XPRIZE_ASSERTION.ANY_XPRIZE_CONDITION, - conditionShouldMatchUser: null, - }, - DALE: { - conditionShouldBe: XPRIZE_ASSERTION.ANY_XPRIZE_CONDITION, - conditionShouldMatchUser: null, - }, - }, - options: { - useCustomAssertion: XPRIZE_ASSERTION.ANY_XPRIZE_CONDITION, - }, - experiment: { - assignmentUnit: AssignmentUnit.INDIVIDUAL, - consistencyRule: ConsistencyRule.INDIVIDUAL, - conditions: [ - { - conditionCode: XPRIZE_Condition.CONTROL, - }, - { - conditionCode: XPRIZE_Condition.NOTIFICATION, - }, - { - conditionCode: XPRIZE_Condition.NON_NOTIFICATION, - }, - ], - decisionPoints: [ - { - targetSuffix: - XPRIZE_Decision_Point_Target.COMPARE_FUNCTIONS_DIFF_REPS_PROPORTIONAL, - excludeIfReached: false, - }, - { - targetSuffix: XPRIZE_Decision_Point_Target.DIRECT_VARIATION_CONVERT, - excludeIfReached: false, - }, - { - targetSuffix: XPRIZE_Decision_Point_Target.DIRECT_VARIATION_EQUATION, - excludeIfReached: false, - }, - { - targetSuffix: - XPRIZE_Decision_Point_Target.EQUIVALENT_RATIOS_RATES_DNL, - excludeIfReached: false, - }, - { - targetSuffix: - XPRIZE_Decision_Point_Target.EQUIVALENT_RATIOS_RATES_TABLES, - excludeIfReached: false, - }, - { - targetSuffix: XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_1, - excludeIfReached: false, - }, - { - targetSuffix: XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_2, - excludeIfReached: false, - }, - { - targetSuffix: XPRIZE_Decision_Point_Target.PARTS_OF_GROUPS_3, - excludeIfReached: false, - }, - ], - }, - }, -]; diff --git a/regression/src/XPRIZE/XPRIZE_constants.ts b/regression/src/XPRIZE/XPRIZE_constants.ts deleted file mode 100644 index a28bc5a7eb..0000000000 --- a/regression/src/XPRIZE/XPRIZE_constants.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { ConditionCode } from "../constants"; -import { ParentConditionAliasMap } from "../mocks/SpecsDetails"; - -export const XPRIZE_Condition = { - CONTROL: "control", - NOTIFICATION: "notification_variant", - NON_NOTIFICATION: "non_notification_variant", -}; - -export const XPRIZE_Decision_Point_Target = { - DIRECT_VARIATION_EQUATION: "direct_variation_equation", - DIRECT_VARIATION_CONVERT: "direct_variation_convert", - EQUIVALENT_RATIOS_RATES_DNL: "equivalent_ratios_rates_dnl", - EQUIVALENT_RATIOS_RATES_TABLES: "equivalent_ratios_rates_table", - PARTS_OF_GROUPS_1: "parts_of_groups_1", - PARTS_OF_GROUPS_2: "parts_of_groups_2", - PARTS_OF_GROUPS_3: "parts_of_groups_3", - COMPARE_FUNCTIONS_DIFF_REPS_PROPORTIONAL: - "compare_functions_diff_reps_proportional", -}; - -export const XPRIZE_Condition_Aliases = { - PROMPT_DIRECT_VARIATION_EQUATION: - "direct_variation_equation_prompt_xprize_indianriver", - NO_PROMPT_DIRECT_VARIATION_EQUATION: - "direct_variation_equation_xprize_indianriver", - PROMPT_DIRECT_VARIATION_CONVERT: - "direct_variation_convert_prompt_xprize_indianriver", - NO_PROMPT_DIRECT_VARIATION_CONVERT: - "direct_variation_convert_xprize_indianriver", - PROMPT_EQUIVALENT_RATIOS_RATES_DNL: - "equivalent_ratios_rates_dnl_prompt_xprize_indianriver", - NO_PROMPT_EQUIVALENT_RATIOS_RATES_DNL: - "equivalent_ratios_rates_dnl_xprize_indianriver", - PROMPT_EQUIVALENT_RATIOS_RATES_TABLES: - "equivalent_ratios_rates_table_prompt_xprize_indianriver", - NO_PROMPT_EQUIVALENT_RATIOS_RATES_TABLES: - "equivalent_ratios_rates_table_xprize_indianriver", - PROMPT_PARTS_OF_GROUPS_1: "parts_of_groups_1_prompt_xprize_indianriver", - NO_PROMPT_PARTS_OF_GROUPS_1: "parts_of_groups_1_xprize_indianriver", - PROMPT_PARTS_OF_GROUPS_2: "parts_of_groups_2_prompt_xprize_indianriver", - NO_PROMPT_PARTS_OF_GROUPS_2: "parts_of_groups_2_xprize_indianriver", - PROMPT_PARTS_OF_GROUPS_3: "parts_of_groups_3_prompt_xprize_indianriver", - NO_PROMPT_PARTS_OF_GROUPS_3: "parts_of_groups_3_xprize_indianriver", - PROMPT_COMPARE_FUNCTIONS_DIFF_REPS_PROPORTIONAL: - "compare_functions_diff_reps_proportional_prompt_xprize_indianriver", - NO_PROMPT_COMPARE_FUNCTIONS_DIFF_REPS_PROPORTIONAL: - "compare_functions_diff_reps_proportional_xprize_indianriver", -}; - -export const XPRIZE_ParentCondition_Alias_Map: ParentConditionAliasMap = { - [XPRIZE_Condition_Aliases.PROMPT_COMPARE_FUNCTIONS_DIFF_REPS_PROPORTIONAL]: - XPRIZE_Condition.NOTIFICATION, - [XPRIZE_Condition_Aliases.PROMPT_DIRECT_VARIATION_CONVERT]: - XPRIZE_Condition.NOTIFICATION, - [XPRIZE_Condition_Aliases.PROMPT_DIRECT_VARIATION_EQUATION]: - XPRIZE_Condition.NOTIFICATION, - [XPRIZE_Condition_Aliases.PROMPT_EQUIVALENT_RATIOS_RATES_DNL]: - XPRIZE_Condition.NOTIFICATION, - [XPRIZE_Condition_Aliases.PROMPT_EQUIVALENT_RATIOS_RATES_TABLES]: - XPRIZE_Condition.NOTIFICATION, - [XPRIZE_Condition_Aliases.PROMPT_PARTS_OF_GROUPS_1]: - XPRIZE_Condition.NOTIFICATION, - [XPRIZE_Condition_Aliases.PROMPT_PARTS_OF_GROUPS_2]: - XPRIZE_Condition.NOTIFICATION, - [XPRIZE_Condition_Aliases.PROMPT_PARTS_OF_GROUPS_3]: - XPRIZE_Condition.NOTIFICATION, - [XPRIZE_Condition_Aliases.NO_PROMPT_COMPARE_FUNCTIONS_DIFF_REPS_PROPORTIONAL]: - XPRIZE_Condition.NON_NOTIFICATION, - [XPRIZE_Condition_Aliases.NO_PROMPT_DIRECT_VARIATION_CONVERT]: - XPRIZE_Condition.NON_NOTIFICATION, - [XPRIZE_Condition_Aliases.NO_PROMPT_DIRECT_VARIATION_EQUATION]: - XPRIZE_Condition.NON_NOTIFICATION, - [XPRIZE_Condition_Aliases.NO_PROMPT_EQUIVALENT_RATIOS_RATES_DNL]: - XPRIZE_Condition.NON_NOTIFICATION, - [XPRIZE_Condition_Aliases.NO_PROMPT_EQUIVALENT_RATIOS_RATES_TABLES]: - XPRIZE_Condition.NON_NOTIFICATION, - [XPRIZE_Condition_Aliases.NO_PROMPT_PARTS_OF_GROUPS_1]: - XPRIZE_Condition.NON_NOTIFICATION, - [XPRIZE_Condition_Aliases.NO_PROMPT_PARTS_OF_GROUPS_2]: - XPRIZE_Condition.NON_NOTIFICATION, - [XPRIZE_Condition_Aliases.NO_PROMPT_PARTS_OF_GROUPS_3]: - XPRIZE_Condition.NON_NOTIFICATION, - [XPRIZE_Condition.CONTROL]: XPRIZE_Condition.CONTROL, - [ConditionCode.DEFAULT]: ConditionCode.DEFAULT, -}; - -export const XPRIZE_ASSERTION = { - ANY_XPRIZE_CONDITION: - "control or notification_variant or non_notification_variant", -}; diff --git a/regression/src/constants.ts b/regression/src/constants.ts deleted file mode 100644 index 9e725c8509..0000000000 --- a/regression/src/constants.ts +++ /dev/null @@ -1,30 +0,0 @@ -export const ConditionAssertion = { - DEFAULT: "default", - CONTROL_OR_VARIANT: "control or variant", -}; - -export const ConditionCode = { - DEFAULT: "default", - CONTROL: "control", - VARIANT: "variant", -}; - -export const DecisionPointSite = { - SELECT_SECTION: "SelectSection", -}; - -export const AssignmentUnit = { - GROUP: "group", - INDIVIDUAL: "individual", -}; - -export const ConsistencyRule = { - GROUP: "group", - INDIVIDUAL: "individual", - EXPERIMENT: "experiment", -}; - -export const SpecOverallPassFail = { - PASS: "PASS", - FAIL: "FAIL", -}; diff --git a/regression/src/env.ts b/regression/src/env.ts deleted file mode 100644 index f886938025..0000000000 --- a/regression/src/env.ts +++ /dev/null @@ -1,20 +0,0 @@ -export const env = { - local: "http://localhost:3030/api", - dev_cl: "https://upgradeapi.qa-cli.net/api", - staging_cl: "https://upgradeapi.qa-cli.com/api", - prod_cl: "https://upgradeapi.carnegielearning.com/api", - endpoints: { - init: "/init", - assign: "/assign", - mark: "/mark", - experiment: "/experiments", - status: "/experiments/state", - }, - // eslint-disable-next-line prettier/prettier - authToken: - "", - context: { - ADD: "add", - ASSIGN_PROG: "assign-prog", - }, -}; diff --git a/regression/src/index.ts b/regression/src/index.ts deleted file mode 100644 index 440c94f0d3..0000000000 --- a/regression/src/index.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* eslint-disable prettier/prettier */ -import { ExcludeIfReachedTestSuite } from "./ExcludeIfReachedTests/ExcludeIfReachedTestSuite"; -import { env } from "./env"; -import { ExcludeIfReachedSpecDetails, ExcludeIfReachedTestNames } from "./ExcludeIfReachedTests/ExcludeIfReachedTestScenarios"; -import { XPRIZE_TestNames, XPRIZE_TestScenarios } from "./XPRIZE/XPRIZE_TestScenarios"; - -const excludeIfReachedTestSuite = new ExcludeIfReachedTestSuite( - env.local, - env.context.ADD, - { - writeSimpleSummaryToFile: false, - writeDetailedSummaryToFile: false, - writePath: "./src/results/" - } -); - -/** - * Exclude If Reached Tests - * - * To run the entire suite, pass in empty array (or nothing at all) - * - * excludeIfReachedSuite.run() or excludeIfReachedSuite.run([]) - * - * Otherwise, supply a list of testnames - * - * excludeIfReachedSuite.run([ - * ExcludeIfReachedTestNames.SINGLE_GRP_IND_TRUE, - * ExcludeIfReachedTestNames.SINGLE_IND_IND_TRUE - * ]); - * - * Every test will execute as follows: - * - * 1. (Before all) Users ABE, BORT, CHAZ, and DALE /init - * 2. Scenario-specific Experiment created - * 3. User ABE will /mark target A in the experiment - * 4. Experiment will begin enrollment - * 5. All users will /assign - * 6. Experiment will be deleted - * 7. Assigned conditions will be analyzed against assertions in spec - * 8. (After all) Summaries published - */ - -excludeIfReachedTestSuite.run([ExcludeIfReachedSpecDetails, XPRIZE_TestScenarios],[ - ExcludeIfReachedTestNames.SINGLE_IND_IND_TRUE, - ExcludeIfReachedTestNames.SINGLE_IND_IND_FALSE, - ExcludeIfReachedTestNames.SINGLE_GRP_IND_TRUE, - ExcludeIfReachedTestNames.SINGLE_GRP_IND_FALSE, - ExcludeIfReachedTestNames.SINGLE_GRP_GRP_TRUE, - ExcludeIfReachedTestNames.SINGLE_GRP_GRP_FALSE, - ExcludeIfReachedTestNames.SINGLE_IND_EXP_TRUE, - ExcludeIfReachedTestNames.SINGLE_IND_EXP_FALSE, - ExcludeIfReachedTestNames.SINGLE_GRP_EXP_TRUE, - ExcludeIfReachedTestNames.SINGLE_GRP_EXP_FALSE, - - ExcludeIfReachedTestNames.IND_IND_TWO_DP_BOTH_TRUE, - ExcludeIfReachedTestNames.IND_IND_TWO_DP_BOTH_FALSE, - ExcludeIfReachedTestNames.IND_IND_TWO_DP_TARGETA_TRUE, - ExcludeIfReachedTestNames.IND_IND_TWO_DP_TARGETB_TRUE, - - ExcludeIfReachedTestNames.GRP_IND_TWO_DP_BOTH_TRUE, - ExcludeIfReachedTestNames.GRP_IND_TWO_DP_BOTH_FALSE, - ExcludeIfReachedTestNames.GRP_IND_TWO_DP_TARGETA_TRUE, - ExcludeIfReachedTestNames.GRP_IND_TWO_DP_TARGETB_TRUE, - - ExcludeIfReachedTestNames.GRP_GRP_TWO_DP_BOTH_TRUE, - ExcludeIfReachedTestNames.GRP_GRP_TWO_DP_BOTH_FALSE, - ExcludeIfReachedTestNames.GRP_GRP_TWO_DP_TARGETA_TRUE, - ExcludeIfReachedTestNames.GRP_GRP_TWO_DP_TARGETB_TRUE, - - ExcludeIfReachedTestNames.IND_EXP_TWO_DP_BOTH_TRUE, - ExcludeIfReachedTestNames.IND_EXP_TWO_DP_BOTH_FALSE, - ExcludeIfReachedTestNames.IND_EXP_TWO_DP_TARGETA_TRUE, - ExcludeIfReachedTestNames.IND_EXP_TWO_DP_TARGETB_TRUE, - - ExcludeIfReachedTestNames.GRP_EXP_TWO_DP_BOTH_TRUE, - ExcludeIfReachedTestNames.GRP_EXP_TWO_DP_BOTH_FALSE, - ExcludeIfReachedTestNames.GRP_EXP_TWO_DP_TARGETA_TRUE, - ExcludeIfReachedTestNames.GRP_EXP_TWO_DP_TARGETB_TRUE, - - XPRIZE_TestNames.XPRIZE_INDIAN_RIVER, - XPRIZE_TestNames.XPRIZE_INDIAN_RIVER_NO_ALIASES -]); diff --git a/regression/src/mocks/RequestResponse.ts b/regression/src/mocks/RequestResponse.ts deleted file mode 100644 index 843489ba6d..0000000000 --- a/regression/src/mocks/RequestResponse.ts +++ /dev/null @@ -1,92 +0,0 @@ -export type InitUserRequestBody = { - id: string; - group: { - [key: string]: string[]; - }; - workingGroup: { - [key: string]: string; - }; -}; - -export type MarkRequestBody = { - userId: string; - experimentPoint: string; - partitionId: string; - condition: string; -}; - -export type StatusRequestBody = { - experimentId: string; - state: "enrolling" | "inactive"; -}; - -export type AssignRequestBody = { - userId: string; - context: string; -}; - -export type AssignResponse = { - expPoint: string; - expId: string; - twoCharacterId: string; - assignedCondition: { - createdAt: string; - updatedAt: string; - versionNumber: number; - id: string; - twoCharacterId: string; - name: string; - description: string; - conditionCode: string; - assignmentWeight: number; - order: number; - }; -}; - -export type ExperimentRequestResponseBody = { - id?: string; - name: string; - description: string; - consistencyRule: string; - assignmentUnit: string; - context: string[]; - group?: string; - tags: string[]; - logging: boolean; - conditions: { - id: string; - conditionCode: string; - assignmentWeight: string; - description: string; - order: number; - name: string; - }[]; - partitions: { - site: string; - target: string; - description: string; - order: number; - excludeIfReached: boolean; - }[]; - conditionPayloads: []; - experimentSegmentInclusion: { - userIds: string[]; - groups: string[]; - subSegmentIds: string[]; - type: string; - }; - experimentSegmentExclusion: { - userIds: string[]; - groups: string[]; - subSegmentIds: string[]; - type: string; - }; - filterMode: 'includeAll' | 'excludeAll'; - queries: string[]; - endOn: null; - enrollmentCompleteCondition: null; - startOn: null; - state: 'inactive'; - postExperimentRule: 'continue'; - revertTo: null; -}; diff --git a/regression/src/mocks/SpecsDetails.ts b/regression/src/mocks/SpecsDetails.ts deleted file mode 100644 index 1c7c83047f..0000000000 --- a/regression/src/mocks/SpecsDetails.ts +++ /dev/null @@ -1,94 +0,0 @@ -export type ExcludeIfReachedSuiteOptions = { - writeSimpleSummaryToFile: boolean; - writeDetailedSummaryToFile: boolean; - writePath: string; - runThisManyTimes?: number; -}; - -export type SpecDetails = { - id: string; - description: string; - experiment: MockExperimentDetails; - assertions: SpecAssertionList; - options?: SpecOptions; -}; - -export type SpecOptions = { - useParentConditionAliasMap?: null | ParentConditionAliasMap; - useCustomAssertion?: null | string; -}; - -export type ParentConditionAliasMap = { [key: string]: string }; - -export type MockConditionAlias = { - aliasName: string; - decisionPointTargetSuffix: string; - conditionCode: string; -}; - -export type MockExperimentDetails = { - assignmentUnit: string; - consistencyRule: string; - conditions: MockExperimentCondition[]; - decisionPoints: MockDecisionPoint[]; - conditionAliases?: MockConditionAlias[]; -}; - -export type MockExperimentCondition = { - conditionCode: string; -}; - -export type MockDecisionPoint = { - targetSuffix: string; - excludeIfReached: boolean; -}; - -export type SpectSummaryMetadata = { - date: string; - environment: string; - context: string; - appVersion: string; -}; - -export type SpecResultsSummary = { - id: string; - description: string; - assignResponseSummary: AssignmentResponseSummary[]; -}; - -export type SimpleSummary = { - testName: string; - description: string; - result: string; -}; - -export type AssignmentResponseSummary = { - userId: string; - actualAssignedConditions: ActualAssignedCondition[]; - assignedConditionForAll: string | null; - expected: SpecAssertion; - result?: SpecResult; -}; - -export type ActualAssignedCondition = { - decisionPointTarget: string; - condition: string; -}; - -export type SpecResult = { - conditionPasses: boolean; - userMatchPasses: boolean; - overall: string; -}; - -export type SpecAssertion = { - conditionShouldBe: string; - conditionShouldMatchUser: string | null; -}; - -export type SpecAssertionList = { - ABE: SpecAssertion; - BORT: SpecAssertion; - CHAZ: SpecAssertion; - DALE: SpecAssertion; -}; diff --git a/regression/src/mocks/Users.ts b/regression/src/mocks/Users.ts deleted file mode 100644 index 1f3a65e74d..0000000000 --- a/regression/src/mocks/Users.ts +++ /dev/null @@ -1,37 +0,0 @@ -export type BasicUser = { - id: UserNameType; - workingGroupId: string; -}; - -export const UserName = { - ABE: "ABE", - BORT: "BORT", - CHAZ: "CHAZ", - DALE: "DALE", -}; - -export type UserNameType = "ABE" | "BORT" | "CHAZ" | "DALE"; - -export const Group = { - GROUP_1: "1", - GROUP_2: "2", -}; - -export const excludeIfReachedUsers: BasicUser[] = [ - { - id: UserName.ABE as UserNameType, - workingGroupId: Group.GROUP_1, - }, - { - id: UserName.BORT as UserNameType, - workingGroupId: Group.GROUP_1, - }, - { - id: UserName.CHAZ as UserNameType, - workingGroupId: Group.GROUP_2, - }, - { - id: UserName.DALE as UserNameType, - workingGroupId: Group.GROUP_2, - }, -]; diff --git a/regression/tsconfig.json b/regression/tsconfig.json deleted file mode 100644 index a97f711dc8..0000000000 --- a/regression/tsconfig.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "Node 18", - "compilerOptions": { - "lib": [ - "esnext" - ], - "module": "esnext", - "target": "esnext", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "moduleResolution": "node", - "outDir": "dist", - "resolveJsonModule": true - }, - "include": [ - "src/**/*" - ] -} \ No newline at end of file