diff --git a/.github/workflows/build-project.yml b/.github/workflows/build-project.yml index 82419523b..f39070eea 100644 --- a/.github/workflows/build-project.yml +++ b/.github/workflows/build-project.yml @@ -33,10 +33,10 @@ jobs: id: buildx if: ${{ github.event_name == 'pull_request' }} uses: docker/setup-buildx-action@v3 - - name: Use Node.js 14.x + - name: Use Node.js 18.x uses: actions/setup-node@v4 with: - node-version: '14.x' + node-version: '18.x' - name: Test application with npm timeout-minutes: 45 diff --git a/package-lock.json b/package-lock.json index b96de9df9..92a55b674 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18923,6 +18923,7 @@ "lit-html": "1.4.1", "lit-translate": "^1.2.1", "marked": "^4.0.10", + "open-scd": "*", "panzoom": "^9.4.2" }, "devDependencies": { @@ -40261,6 +40262,7 @@ "lit-html": "1.4.1", "lit-translate": "^1.2.1", "marked": "^4.0.10", + "open-scd": "*", "panzoom": "^9.4.2", "prettier": "^2.3.2", "sinon": "^11.1.2", diff --git a/.eslintrc.cjs b/packages/compas-open-scd/.eslintrc.cjs similarity index 96% rename from .eslintrc.cjs rename to packages/compas-open-scd/.eslintrc.cjs index 6cae923ce..749bf4471 100644 --- a/.eslintrc.cjs +++ b/packages/compas-open-scd/.eslintrc.cjs @@ -18,6 +18,6 @@ module.exports = { 'import/extensions': ['error', 'always', { ignorePackages: true }], 'import/no-duplicates': 'off', 'no-duplicate-imports': 'off', - 'tsdoc/syntax': 'warn' + 'tsdoc/syntax': 'warn', }, }; diff --git a/packages/compas-open-scd/package-lock.json b/packages/compas-open-scd/package-lock.json deleted file mode 100644 index 8625c82f4..000000000 --- a/packages/compas-open-scd/package-lock.json +++ /dev/null @@ -1,36849 +0,0 @@ -{ - "name": "compas-open-scd", - "version": "0.33.6", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "compas-open-scd", - "version": "0.33.6", - "license": "Apache-2.0", - "dependencies": { - "@material/mwc-dialog": "0.22.1", - "@material/mwc-drawer": "0.22.1", - "@material/mwc-fab": "0.22.1", - "@material/mwc-formfield": "0.22.1", - "@material/mwc-icon": "0.22.1", - "@material/mwc-icon-button": "0.22.1", - "@material/mwc-icon-button-toggle": "0.22.1", - "@material/mwc-linear-progress": "0.22.1", - "@material/mwc-list": "0.22.1", - "@material/mwc-menu": "0.22.1", - "@material/mwc-select": "0.22.1", - "@material/mwc-snackbar": "0.22.1", - "@material/mwc-switch": "0.22.1", - "@material/mwc-tab": "0.22.1", - "@material/mwc-tab-bar": "0.22.1", - "@material/mwc-textarea": "0.22.1", - "@material/mwc-textfield": "0.22.1", - "@material/mwc-top-app-bar-fixed": "0.22.1", - "ace-custom-element": "^1.6.5", - "csv-stringify": "^6.2.0", - "lit-element": "2.5.1", - "lit-html": "1.4.1", - "lit-translate": "^1.2.1", - "marked": "^4.0.10", - "panzoom": "^9.4.2" - }, - "devDependencies": { - "@commitlint/cli": "^13.1.0", - "@commitlint/config-conventional": "^13.1.0", - "@open-wc/eslint-config": "^4.3.0", - "@open-wc/semantic-dom-diff": "^0.19.5", - "@open-wc/testing": "^2.5.33", - "@snowpack/plugin-typescript": "^1.2.1", - "@types/marked": "^2.0.4", - "@types/node": "^16.6.1", - "@typescript-eslint/eslint-plugin": "^4.29.2", - "@typescript-eslint/parser": "^4.29.2", - "@web/dev-server-esbuild": "^0.2.16", - "@web/test-runner": "^0.13.22", - "concurrently": "^6.2.1", - "deepmerge": "^4.2.2", - "es-dev-server": "^2.1.0", - "eslint": "^7.32.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-babel": "^5.3.1", - "eslint-plugin-tsdoc": "^0.2.14", - "fast-check": "^2.19.0", - "husky": "^7.0.1", - "lint-staged": "^11.1.2", - "prettier": "^2.3.2", - "sinon": "^11.1.2", - "snowpack": "3.8.6", - "source-map": "^0.7.4", - "standard-version": "^9.3.1", - "tslib": "^2.3.1", - "typedoc": "^0.21.10", - "typedoc-plugin-markdown": "3.10.4", - "typescript": "4.3.5", - "web-component-analyzer": "^1.1.6", - "workbox-cli": "^6.2.4" - } - }, - "node_modules/@75lb/deep-merge": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", - "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", - "dev": true, - "dependencies": { - "lodash.assignwith": "^4.2.0", - "typical": "^7.1.1" - }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@75lb/deep-merge/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "dev": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", - "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==", - "dev": true, - "peer": true, - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/eslint-plugin": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.22.10.tgz", - "integrity": "sha512-SRZcvo3fnO5h79B9DZSV6LG2vHH7OWsSNp1huFLHsXKyytRG413byQk9zxW1VcPOhnzfx2VIUz+8aGbiE7fOkA==", - "dev": true, - "peer": true, - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/eslint-parser": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-dynamic-import instead.", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", - "dev": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", - "dev": true, - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", - "dev": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.2", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.2.tgz", - "integrity": "sha512-54cIh74Z1rp4oIjsHjqN+WM4fMyCBYe+LpZ9jWm51CZ1fbH3SkAzQD/3XLoNkjbJ7YEmjobLXyvQrFypRHOrXw==", - "dev": true, - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@commitlint/cli": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-13.2.1.tgz", - "integrity": "sha512-JGzYk2ay5JkRS5w+FLQzr0u/Kih52ds4HPpa3vnwVOQN8Q+S1VYr8Nk/6kRm6uNYsAcC1nejtuDxRdLcLh/9TA==", - "dev": true, - "dependencies": { - "@commitlint/format": "^13.2.0", - "@commitlint/lint": "^13.2.0", - "@commitlint/load": "^13.2.1", - "@commitlint/read": "^13.2.0", - "@commitlint/types": "^13.2.0", - "lodash": "^4.17.19", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^17.0.0" - }, - "bin": { - "commitlint": "cli.js" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/config-conventional": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-13.2.0.tgz", - "integrity": "sha512-7u7DdOiF+3qSdDlbQGfpvCH8DCQdLFvnI2+VucYmmV7E92iD6t9PBj+UjIoSQCaMAzYp27Vkall78AkcXBh6Xw==", - "dev": true, - "dependencies": { - "conventional-changelog-conventionalcommits": "^4.3.1" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/ensure": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-13.2.0.tgz", - "integrity": "sha512-rqhT62RehdLTRBu8OrPHnRCCd/7RmHEE4TiTlT4BLlr5ls5jlZhecOQWJ8np872uCNirrJ5NFjnjYYdbkNoW9Q==", - "dev": true, - "dependencies": { - "@commitlint/types": "^13.2.0", - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-13.2.0.tgz", - "integrity": "sha512-6nPwpN0hwTYmsH3WM4hCdN+NrMopgRIuQ0aqZa+jnwMoS/g6ljliQNYfL+m5WO306BaIu1W3yYpbW5aI8gEr0g==", - "dev": true, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/format": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-13.2.0.tgz", - "integrity": "sha512-yNBQJe6YFhM1pJAta4LvzQxccSKof6axJH7ALYjuhQqfT8AKlad7Y/2SuJ07ioyreNIqwOTuF2UfU8yJ7JzEIQ==", - "dev": true, - "dependencies": { - "@commitlint/types": "^13.2.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/format/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/@commitlint/format/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/@commitlint/format/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/@commitlint/format/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/@commitlint/format/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/@commitlint/format/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/@commitlint/is-ignored": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-13.2.0.tgz", - "integrity": "sha512-onnx4WctHFPPkHGFFAZBIWRSaNwuhixIIfbwPhcZ6IewwQX5n4jpjwM1GokA7vhlOnQ57W7AavbKUGjzIVtnRQ==", - "dev": true, - "dependencies": { - "@commitlint/types": "^13.2.0", - "semver": "7.3.5" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/is-ignored/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@commitlint/is-ignored/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@commitlint/is-ignored/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/@commitlint/lint": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-13.2.0.tgz", - "integrity": "sha512-5XYkh0e9ehHjA7BxAHFpjPgr1qqbFY8OFG1wpBiAhycbYBtJnQmculA2wcwqTM40YCUBqEvWFdq86jTG8fbkMw==", - "dev": true, - "dependencies": { - "@commitlint/is-ignored": "^13.2.0", - "@commitlint/parse": "^13.2.0", - "@commitlint/rules": "^13.2.0", - "@commitlint/types": "^13.2.0" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/load": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-13.2.1.tgz", - "integrity": "sha512-qlaJkj0hfa9gtWRfCfbgFBTK3GYQRmjZhba4l9mUu4wV9lEZ4ICFlrLtd/8kaLXf/8xbrPhkAPkVFOAqM0YwUQ==", - "dev": true, - "dependencies": { - "@commitlint/execute-rule": "^13.2.0", - "@commitlint/resolve-extends": "^13.2.0", - "@commitlint/types": "^13.2.0", - "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", - "chalk": "^4.0.0", - "cosmiconfig": "^7.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "typescript": "^4.4.3" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/load/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/@commitlint/load/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/@commitlint/load/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/@commitlint/load/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/@commitlint/load/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/@commitlint/load/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/@commitlint/load/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/@commitlint/message": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-13.2.0.tgz", - "integrity": "sha512-+LlErJj2F2AC86xJb33VJIvSt25xqSF1I0b0GApSgoUtQBeJhx4SxIj1BLvGcLVmbRmbgTzAFq/QylwLId7EhA==", - "dev": true, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/parse": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-13.2.0.tgz", - "integrity": "sha512-AtfKSQJQADbDhW+kuC5PxOyBANsYCuuJlZRZ2PYslOz2rvWwZ93zt+nKjM4g7C9ETbz0uq4r7/EoOsTJ2nJqfQ==", - "dev": true, - "dependencies": { - "@commitlint/types": "^13.2.0", - "conventional-changelog-angular": "^5.0.11", - "conventional-commits-parser": "^3.2.2" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/read": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-13.2.0.tgz", - "integrity": "sha512-7db5e1Bn3re6hQN0SqygTMF/QX6/MQauoJn3wJiUHE93lvwO6aFQxT3qAlYeyBPwfWsmDz/uSH454jtrSsv3Uw==", - "dev": true, - "dependencies": { - "@commitlint/top-level": "^13.2.0", - "@commitlint/types": "^13.2.0", - "fs-extra": "^10.0.0", - "git-raw-commits": "^2.0.0" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/resolve-extends": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-13.2.0.tgz", - "integrity": "sha512-HLCMkqMKtvl1yYLZ1Pm0UpFvd0kYjsm1meLOGZ7VkOd9G/XX+Fr1S2G5AT2zeiDw7WUVYK8lGVMNa319bnV+aw==", - "dev": true, - "dependencies": { - "import-fresh": "^3.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/rules": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-13.2.0.tgz", - "integrity": "sha512-O3A9S7blOzvHfzrJrUQe9JxdtGy154ol/GXHwvd8WfMJ10y5ryBB4b6+0YZ1XhItWzrEASOfOKbD++EdLV90dQ==", - "dev": true, - "dependencies": { - "@commitlint/ensure": "^13.2.0", - "@commitlint/message": "^13.2.0", - "@commitlint/to-lines": "^13.2.0", - "@commitlint/types": "^13.2.0", - "execa": "^5.0.0" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/to-lines": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-13.2.0.tgz", - "integrity": "sha512-ZfWZix2y/CzewReCrj5g0nKOEfj5HW9eBMDrqjJJMPApve00CWv0tYrFCGXuGlv244lW4uvWJt6J/0HLRWsfyg==", - "dev": true, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/top-level": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-13.2.0.tgz", - "integrity": "sha512-knBvWYbIq6VV6VPHrVeDsxDiJq4Zq6cv5NIYU3iesKAsmK2KlLfsZPa+Ig96Y4AqAPU3zNJwjHxYkz9qxdBbfA==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/types": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-13.2.0.tgz", - "integrity": "sha512-RRVHEqmk1qn/dIaSQhvuca6k/6Z54G+r/KyimZ8gnAFielGiGUpsFRhIY3qhd5rXClVxDaa3nlcyTWckSccotQ==", - "dev": true, - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/types/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/@commitlint/types/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/@commitlint/types/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/@commitlint/types/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/@commitlint/types/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/@commitlint/types/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/@endemolshinegroup/cosmiconfig-typescript-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz", - "integrity": "sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==", - "dev": true, - "dependencies": { - "lodash.get": "^4", - "make-error": "^1", - "ts-node": "^9", - "tslib": "^2" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "cosmiconfig": ">=6" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@eslint/eslintrc/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/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "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/@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@koa/cors": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-3.4.3.tgz", - "integrity": "sha512-WPXQUaAeAMVaLTEFpoq3T2O1C+FstkjJnDQqy95Ck1UdILajsRhu6mhJ8H2f4NFPRBoCNN+qywTJfq/gGki5mw==", - "dev": true, - "dependencies": { - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/@material/animation": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-R1QbY4fC6RBOoi4Dq/3yuD5OK0ts02WxGt1JXaddsdnO6szZJcfXm2aiCweU1GUpchoah+YzDBJrsmSoqFCKIg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/base": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-bCxGPqFQPh3rfBdqG+UvlrnRPSP2CzHhn0f44NqELY/SkmujIfS30rJOX965IKoD6lGdKWIfi/sAm03I81pZ7g==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/button": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-FV44k7WH8d0Z7TjKldEILWXG+bgVz0CplqAYiPiRoxIaGljOq/D7+enuC8tJOUst+zyihVSKyYT69ghWuOKjjg==", - "dependencies": { - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/touch-target": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/density": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/density/-/density-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-uCOzDL3U8EAOU6A+3lwbys6lB5P24PwEsNoe5YoB7CmkNS+8LLFPdemp4dMdVY2xGlDX+McaUOKJKmFub4cPUA==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/dialog": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-WOK+HN7HQa3mHvNEsEnleDOHCLRAbpFOhGuGyqnSDOCyxTl2DcNCUqsWupDVDpAlLv2OfLdmceyJrejMF+8q7g==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/button": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/icon-button": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/touch-target": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/dom": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/dom/-/dom-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-9XvFE2OuOZizYXF3ptyMcJuN/JHZA4vKq5lPLrIbcTXnd4DzJ7L4JrMcMb75xfjugxj8uaXjdfI62gwHfzP/aw==", - "dependencies": { - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/drawer": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-a5tGNXOXJglDpq/5blE3ZxbfTnuYU6pnkswWHliSUc71fC1A6XmK51vLz/PCGPGV3qL8JS2sakOVMdssRuLPxA==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/list": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/elevation": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-fuOG6w7Crz+9iibkBAXOQGYBWMCDZSvXA9PlZFW1JFCHUWyzzTMJeJIaHAVMHFzhbVF/rjqF6CliDZyAz4fULg==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/feature-targeting": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-e72VDSIMrwF5aX4rkQcO1AHewX/ydWOujFtMBk4QD/asyDPKBv+bKwO6f/msM+Wqen8I+DbHC0PH/2K15gQ3pQ==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/floating-label": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-MZIVki9uD6JMyfQ6v5FIgt2WEZQ3fOCpoOiE8c9cHuNiawVJc3pmoA5wT/38hJs3iMCx86D1jL1vK9UdyIdF7A==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/form-field": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-wYNyh1RMqEviuWcredWYx8ENEjR1GYdQu/NE9SKlfK7zKsFxF7szwHDd/3cZd7BSYVJUeylveDW+KgXQaW0YpQ==", - "dependencies": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/icon-button": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-2cKO9FIEYwQqd6qlvuC2IbZQ3m8xvw690sx+H/+1UFs17TY/STDfJRj1p5qf+MnIqaiz5jsoxQemuUkcej+uBw==", - "dependencies": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/touch-target": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/line-ripple": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-9LL/d3jWNesupmwvZtNbV2B1rc1i5BHatFgVt62B1xvfaViRL7EyS0K/+kv9SPWU6nqPLfdj33vOMukn2zIgAg==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/linear-progress": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-SuEJPdtMbY9hN7X8s9Y8MzVfnmQy32gi4cSIv3r3aL5wmfO29Dg5Gw8OkggEuVjy0QKTXSN9N74WdCdpQ5rUPw==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/progress-indicator": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/list": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/list/-/list-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-Vai+ggNyDBuWM0ihBs3ELGEKCdRmFoTFEhfcZ321VEI2YE8EY6eW1tvazzBfSzpLZkrqcn2QkqD6UpQBzkp4AA==", - "dependencies": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/menu": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/menu/-/menu-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-8JMFM/QdIC+CRDf79uSe5b4/kCF+3Re90OYlCVaT8LyfYGzYNtBQ8LPKaWlmS2fRN0eIBd1faoUGO0bvslulhg==", - "dependencies": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/list": "12.0.0-canary.22d29cbb4.0", - "@material/menu-surface": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/menu-surface": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-kvfewRPo4sJtGzBK/T94jjRYnnIaQbC5xqQ+AmGZHGUBsV713cVE1IWVSm0d+7MbERsqKMG9/JZik2Um3YZetQ==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/mwc-base": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-base/-/mwc-base-0.22.1.tgz", - "integrity": "sha512-KtQf4lQUoTQuetfhfRbVJhsXVcpX74LP4JI/cLmx+SGbpG+pXXWf6VI2MvZY2UoHVEkldqPHndeuqctBoY7vgg==", - "dependencies": { - "@material/base": "=12.0.0-canary.22d29cbb4.0", - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-button": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-button/-/mwc-button-0.22.1.tgz", - "integrity": "sha512-Z+NOM+d7QkmIOGbVT7BA/rzLJMXGaxC4Bp+dXcm3ESu6ohPBtG878IyZGSGiMXXDtmAKgMAIp74z4gE/Y0j1pA==", - "dependencies": { - "@material/mwc-icon": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-checkbox": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-checkbox/-/mwc-checkbox-0.22.1.tgz", - "integrity": "sha512-JfUEVWAos/sscPH1k9oUKhjtCbTuU4rl7GgKcenCF6EnxTaXbzxGJKPz28BUS5I14JM7vHNUwfqTC+M/87tNxg==", - "dependencies": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-dialog": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-dialog/-/mwc-dialog-0.22.1.tgz", - "integrity": "sha512-NHHtsled57N2EjDLelEN5YeJSpW/PYxayA+d2B2zpQPbhqhl//VKxJ9fA6CPm1uc+Cvp2G7lbZ2oUUSQivu+Aw==", - "dependencies": { - "@material/dialog": "=12.0.0-canary.22d29cbb4.0", - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/mwc-button": "^0.22.1", - "blocking-elements": "^0.1.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1", - "wicg-inert": "^3.0.0" - } - }, - "node_modules/@material/mwc-drawer": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-drawer/-/mwc-drawer-0.22.1.tgz", - "integrity": "sha512-klwo4VMIIeV4UY+0t4HJ5/2Z8hUjsPHoleEFamRf97yVgPnmCHHaXhe7fjq8srxgkXK81PzwA7PFGBofS248ag==", - "dependencies": { - "@material/drawer": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "blocking-elements": "^0.1.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1", - "wicg-inert": "^3.0.0" - } - }, - "node_modules/@material/mwc-fab": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-fab/-/mwc-fab-0.22.1.tgz", - "integrity": "sha512-KFzZFFr/Nq3bJ0JJyEy7SHsvVLhoqMCTELEjcy2s4fZYT1mLUmHK+Iip1vuKP2I96Yvnym4wkFEcwz/zAMCWbA==", - "dependencies": { - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-floating-label": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-floating-label/-/mwc-floating-label-0.22.1.tgz", - "integrity": "sha512-BkFt9WL8RE05JESv73egh7XUsmXALL78u1ev98T579SER3kwfIepQhXTvAAnFRHFa7QjT8qa/U6RmsvHe1zYbg==", - "dependencies": { - "@material/floating-label": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-formfield": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-formfield/-/mwc-formfield-0.22.1.tgz", - "integrity": "sha512-jk8YyX1STjh+HCQOjlEmtr+kVG8Nlkemh9GoVNkJoIH6k7n+WgYcVXoJtfGWJFBkO8kfHziRVeLRPGP8Nt8ErA==", - "dependencies": { - "@material/form-field": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-icon": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-icon/-/mwc-icon-0.22.1.tgz", - "integrity": "sha512-LX4MUThlYEBfpTr1O53J27KbzFhPbe2dBGouY9piztCI3FObbRVQI+LXFlXJm6KU0BzemaQfz105ZAuLlPAN4g==", - "dependencies": { - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-icon-button": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-icon-button/-/mwc-icon-button-0.22.1.tgz", - "integrity": "sha512-UHwWwzn9LrAKFmQLuKSMQZe1m+X0Xi//xAhLiIBOHaXyEH3QxmKr7pR82e8HQPc42+jUAxKUFmohMrppG6Dmcg==", - "dependencies": { - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-icon-button-toggle": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-icon-button-toggle/-/mwc-icon-button-toggle-0.22.1.tgz", - "integrity": "sha512-4r2Hvmo8qhYfEmWNUPvXxmBY0PTdN3JIFvn7d8WPukPgVSCfhh8o4MbxySoHcuo81A+2K/eMRAiLNY7Y8O5Aew==", - "dependencies": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-icon-button": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-line-ripple": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-line-ripple/-/mwc-line-ripple-0.22.1.tgz", - "integrity": "sha512-Wx2BHD+/z4Fm8TXyiv59UVeNAirunTfR3uCEjGMU/R7mXUwjpjOhY5bNYGUcP9VyMGG5CkLovc8XX96/iKs1ag==", - "dependencies": { - "@material/line-ripple": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-linear-progress": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-linear-progress/-/mwc-linear-progress-0.22.1.tgz", - "integrity": "sha512-GqqUDomF1nZh6cN0Dgz41vphfvDR17+vdtYk1O5YU9ajW/yd+9SBqwbjfqo4g/jmCpJvMeKnBDZo3Hbc8KnK7g==", - "dependencies": { - "@material/linear-progress": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/theme": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-list": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-list/-/mwc-list-0.22.1.tgz", - "integrity": "sha512-NGfacR/vSHMte7BOrFM7Cafi+tRIeBH8vNFcpP7yjqPkYCXt/9cEw0j1KVtldCRi20V38vkewUKdh2v3DiP5dg==", - "dependencies": { - "@material/base": "=12.0.0-canary.22d29cbb4.0", - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "@material/list": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/mwc-checkbox": "^0.22.1", - "@material/mwc-radio": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-menu": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-menu/-/mwc-menu-0.22.1.tgz", - "integrity": "sha512-fY7dyxv9aIccMqPp0+ihbXfB8g7Khvz7tYhtVMLqb6CgpdXf06a/lW50eN0Mk4GC+mFyN36HKHDP7LMLFfsvlA==", - "dependencies": { - "@material/menu": "=12.0.0-canary.22d29cbb4.0", - "@material/menu-surface": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/mwc-list": "^0.22.1", - "@material/shape": "=12.0.0-canary.22d29cbb4.0", - "@material/theme": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-notched-outline": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-notched-outline/-/mwc-notched-outline-0.22.1.tgz", - "integrity": "sha512-Bi+CKK24/ypgQZech+vUOWPR8hjPxXILf+mt5liVoNXddGITbdFAShFndNb4Ln4Rn3omzvC63enhpYSS4ByRNw==", - "dependencies": { - "@material/mwc-base": "^0.22.1", - "@material/notched-outline": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-radio": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-radio/-/mwc-radio-0.22.1.tgz", - "integrity": "sha512-pFVuDl/bSCK7gVXC54Lsm6lMclt8MYk0u4yVsjaEUTeFk0xMK1ZvoXifIkW0IHhAJVmWgGpWX57wSzLrRZbUNw==", - "dependencies": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "@material/radio": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-ripple": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-ripple/-/mwc-ripple-0.22.1.tgz", - "integrity": "sha512-QQyWWPBZ6veWNbBMWo8WQw0iY9QUjLLANorug8mPHv13ETdhwVUUozeKOY0ZCXWupNlqtap1Gd0IQjv6HVRMjA==", - "dependencies": { - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/ripple": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-select": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-select/-/mwc-select-0.22.1.tgz", - "integrity": "sha512-P5o2DD48AtEpr+ZqbFlQ04GgSmcbhOTdQEeDBkDAxSsuErXQZgzY1aPCXlaDI0QzQ/gNP/13b4ejLqstVp9SQg==", - "dependencies": { - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "@material/floating-label": "=12.0.0-canary.22d29cbb4.0", - "@material/line-ripple": "=12.0.0-canary.22d29cbb4.0", - "@material/list": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/mwc-floating-label": "^0.22.1", - "@material/mwc-icon": "^0.22.1", - "@material/mwc-line-ripple": "^0.22.1", - "@material/mwc-list": "^0.22.1", - "@material/mwc-menu": "^0.22.1", - "@material/mwc-notched-outline": "^0.22.1", - "@material/select": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-snackbar": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-snackbar/-/mwc-snackbar-0.22.1.tgz", - "integrity": "sha512-4ZTb4Gk/zKJWvvqqKuOFo1NO68DnCgyQlktPdNNTGhCERdxkEQnZz+mkAw+Mfr5tCBizomgaFzd6tuAZCUutyQ==", - "dependencies": { - "@material/mwc-base": "^0.22.1", - "@material/snackbar": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-switch": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-switch/-/mwc-switch-0.22.1.tgz", - "integrity": "sha512-KDY3uqT2qTEw6Z9TS91Ucs0LViUcMsP1XHu6ZNhbv9Ai1uK/i8pwVWAIGIX9Cm1iCdjiYGfKm4DZLORDb/rfEQ==", - "dependencies": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "@material/switch": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-tab": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-tab/-/mwc-tab-0.22.1.tgz", - "integrity": "sha512-sNPE8kRQEH04vEStxiidTjpyuHc+5Wm8+OVU8wrf6ChJa8KUV5bi2blWm6PW4rfQRo2Bs8AarDXv15t4wv3XWg==", - "dependencies": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "@material/mwc-tab-indicator": "^0.22.1", - "@material/tab": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-tab-bar": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-tab-bar/-/mwc-tab-bar-0.22.1.tgz", - "integrity": "sha512-USn9pIMNfz2vPh7w2U55j0EVr82x3odq9VdcDGG5d4jWwzMPjJ9CKMjqgFrlIiPmxieD5zeSW0LauGhwv6ujOg==", - "dependencies": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-tab": "^0.22.1", - "@material/mwc-tab-scroller": "^0.22.1", - "@material/tab": "=12.0.0-canary.22d29cbb4.0", - "@material/tab-bar": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-tab-indicator": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-tab-indicator/-/mwc-tab-indicator-0.22.1.tgz", - "integrity": "sha512-/Q8vju7DAysqz3Fo+IINaGSeU9BinZbdaSUyRFjfrUWlzJCE6IYYB7zMyc2W+EjaxhjftpL/N3Sw50Xw+pAL+A==", - "dependencies": { - "@material/mwc-base": "^0.22.1", - "@material/tab-indicator": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-tab-scroller": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-tab-scroller/-/mwc-tab-scroller-0.22.1.tgz", - "integrity": "sha512-dqAsXS7Nyw61vVb6d11zDg0xuvAYfOyPmz6wLwcXxzSlHOCfkuFu2fcjhssZIlW3DzzzrCw7aZ+T6mHOZcr0dg==", - "dependencies": { - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/tab-scroller": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-textarea": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-textarea/-/mwc-textarea-0.22.1.tgz", - "integrity": "sha512-ta5ARYpxaCRvseXTKkp8tFBfJ0oP8FWsE4FymrjV5b+UEAEzAzjcWWolIDyS7DdixSj1ROI5dJHsU/on5lWPjw==", - "dependencies": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-textfield": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-textfield": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-textfield/-/mwc-textfield-0.22.1.tgz", - "integrity": "sha512-7xLlW2B1wMnCi2JSlOELELPEUda0w6bWpjn4LB4UPi1hAWG8VR+Rn5rR6q4NDav9pad+qA7+PGjNlE32xVUm7g==", - "dependencies": { - "@material/floating-label": "=12.0.0-canary.22d29cbb4.0", - "@material/line-ripple": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/mwc-floating-label": "^0.22.1", - "@material/mwc-line-ripple": "^0.22.1", - "@material/mwc-notched-outline": "^0.22.1", - "@material/textfield": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-top-app-bar": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-top-app-bar/-/mwc-top-app-bar-0.22.1.tgz", - "integrity": "sha512-SHQLjMrHRYsJaT0+8rNjkYW9LDi93AsGX+USuCYhVPeMhBUcqVmr09lTCqj3xyJ3JAy43XONPhtXjxlMT1jCNg==", - "dependencies": { - "@material/mwc-base": "^0.22.1", - "@material/top-app-bar": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/mwc-top-app-bar-fixed": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-top-app-bar-fixed/-/mwc-top-app-bar-fixed-0.22.1.tgz", - "integrity": "sha512-ZpQGKmqmSHp1izqX1U0S+3E8s5xLSB81cjFlQPFKG6arU6TO8Xqyzd05JPfFHfau5aZeHQuJB0MOGN2QT31UCw==", - "dependencies": { - "@material/mwc-top-app-bar": "^0.22.1", - "@material/top-app-bar": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "node_modules/@material/notched-outline": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-LgVwQri2sI/EnAbSjyyzhifjcBKpYO48oy6HyRg6Cq/ZxOgNv3u/VG4fE3ToyNLe8pMPkfQsn2g8czuZoRYwxg==", - "dependencies": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/floating-label": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/progress-indicator": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-XnG61vDDUPQWK3obQcPHaTPxEKFfPKo8qtiKxkFnGdzIeezDGj7n9m8gdvzcqed8rGZWCNKYOzodkRfplStpMw==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/@material/radio": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/radio/-/radio-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-piGy+6YEtW3odicIImRGnc3uY0iD42IAe4+pnVo36KsfHLm5peYuEc0jrLI4zdmOPYlRxSskIbAAzfMKdwKG1A==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/touch-target": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/ripple": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-IzBtXi4EWx27Hkfd5Zkx/MrZAXJZe0AAQCo37Etl/af0/aJPIOyCOdHQiwoK2FqRH71pmNfUGrUWOeUxFyaSdw==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/rtl": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-R7u7w5U+mvRwsj15tpf/CbALs3FrGVidsTkv8C1uZDK1ae490De8HSe839lcFcXmM8c/PFSx5B3rKyQG2AyraQ==", - "dependencies": { - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/select": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/select/-/select-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-ROpNqkHkv/ZUWNf4tWxDo/L6P2QwWaNKADSqYpg/XXecAm7NdBX5aDo63VCBPCm57JkAdBWJQB5MRrbkaWLTfA==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/floating-label": "12.0.0-canary.22d29cbb4.0", - "@material/line-ripple": "12.0.0-canary.22d29cbb4.0", - "@material/list": "12.0.0-canary.22d29cbb4.0", - "@material/menu": "12.0.0-canary.22d29cbb4.0", - "@material/menu-surface": "12.0.0-canary.22d29cbb4.0", - "@material/notched-outline": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/shape": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-yKC+cqdjGYg3sseZ4baNe9OLhBENHwX2SpJGZORZ7ix4/8pxzFG3wO80eZ8LsldzYem9MmtcbRilBZ4rvvxh0A==", - "dependencies": { - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/snackbar": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-NDYR2rYyF2kbQYCec/I0NmAPtnXMBpGYEQ4/m10rAzTP2hsyySZs0cKk54/V3czT+gFz9C9W3zCm1CwgJwL5fA==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/button": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/icon-button": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/switch": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/switch/-/switch-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-kubSphtXl74TC/PAjp67lYi7Ngk0MEKTLzp1ZHiMHElew2Z9/IYHP0pPaQRTkBY0ddIx6hVdHMiMf8qB4zuz2w==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/tab": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/tab/-/tab-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-Tmb+8Dsx7wItbqOW4JHUVIq3I/inM3l/gk6EV/ctNeyz8coPIJL39yN4CcTX+VHsYykF+tK3jz4QSQX0ASfimQ==", - "dependencies": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/tab-indicator": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/tab-bar": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-cxGyfONh9tFK2tISHDSAWFfH/uxH/HfTTjuDQIiPkOLmr6oVgGPXP2AdsZ0Z60HJCAedbR9mdWCesEk8w4f8+Q==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/tab": "12.0.0-canary.22d29cbb4.0", - "@material/tab-indicator": "12.0.0-canary.22d29cbb4.0", - "@material/tab-scroller": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/tab-indicator": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-7MeJG5bN7WCyNsjT+7iGci2XuIkwUXA3QRz3La2zKPBxnPkRiz7GUwkpr1b5h6wPpYfCWKyCbixQD9Ufgq3kKA==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/tab-scroller": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-IaFQiwJ/MKhbFvKcGmlAFNHCxXf5THyjefgzav/k0Fu49vzQFA1ZiSTvPU7/d0vV/G2amaba+l5w9TP9/n4KFw==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/tab": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/textfield": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-OJMgS0iniOvnRJa5DWyFqg1VIC77KEdoXern9OQiQphUE1LJ2Kbbwwj0GgyULuxhcUlUSnnisw+J5IfWK7kMUg==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/floating-label": "12.0.0-canary.22d29cbb4.0", - "@material/line-ripple": "12.0.0-canary.22d29cbb4.0", - "@material/notched-outline": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/theme": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-r4xYCgc+CrbvDxCINVqXwAFWQ1WgV3s2+bUse/2iw53YqyemhhtzFjfp+DXLdC4zJSOuObWC45eaDKeseLMGMw==", - "dependencies": { - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/top-app-bar": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-fTS0kOHyUAKBhtz8olDvsCtZ6VxJEJ5QNUAZdHbJsTjig87poLLUP2CKJ18t5DjzW/KFMFjNYMSbah6NOREvqg==", - "dependencies": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/touch-target": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-aPEMmR+xRI5ywD9JM+njTgU14CCsgRSS7CLZwd+wsfJkMYPCi8rBM3t23bu/jILa4IT6TIe32Ew1xIBVxJNpgQ==", - "dependencies": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@material/typography": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-lIzU4IFjaSfVRbhsabTiri8CD+fEe9/DaGpoDm89sHm7b8RbN1+m+7OrePICcWgWFo2swRndph8qhzh7gTYdew==", - "dependencies": { - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "node_modules/@mdn/browser-compat-data": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz", - "integrity": "sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==", - "dev": true - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "peer": true, - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "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/@npmcli/arborist": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.10.0.tgz", - "integrity": "sha512-CLnD+zXG9oijEEzViimz8fbOoFVb7hoypiaf7p6giJhvYtrxLAyY3cZAMPIFQvsG731+02eMDp3LqVBNo7BaZA==", - "dev": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.0.1", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^1.0.2", - "@npmcli/metavuln-calculator": "^1.1.0", - "@npmcli/move-file": "^1.1.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^1.0.1", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^1.8.2", - "bin-links": "^2.2.1", - "cacache": "^15.0.3", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.1.5", - "npm-pick-manifest": "^6.1.0", - "npm-registry-fetch": "^11.0.0", - "pacote": "^11.3.5", - "parse-conflict-json": "^1.1.1", - "proc-log": "^1.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "ssri": "^8.0.1", - "treeverse": "^1.0.4", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@npmcli/arborist/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/@npmcli/arborist/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/arborist/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/@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/@npmcli/fs/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/fs/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/fs/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/@npmcli/git": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", - "dev": true, - "dependencies": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "node_modules/@npmcli/git/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/@npmcli/git/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/git/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/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@npmcli/map-workspaces": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-1.0.4.tgz", - "integrity": "sha512-wVR8QxhyXsFcD/cORtJwGQodeeaDf0OxcHie8ema4VgFeqwYkFsDPnSrIRSytX8xR6nKPAH89WnwTcaU608b/Q==", - "dev": true, - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.1.6", - "minimatch": "^3.0.4", - "read-package-json-fast": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/map-workspaces/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/@npmcli/metavuln-calculator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz", - "integrity": "sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ==", - "dev": true, - "dependencies": { - "cacache": "^15.0.5", - "pacote": "^11.1.11", - "semver": "^7.3.2" - } - }, - "node_modules/@npmcli/metavuln-calculator/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/metavuln-calculator/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/metavuln-calculator/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/@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", - "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", - "dev": true - }, - "node_modules/@npmcli/node-gyp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", - "dev": true - }, - "node_modules/@npmcli/package-json": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-1.0.1.tgz", - "integrity": "sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", - "dev": true, - "dependencies": { - "infer-owner": "^1.0.4" - } - }, - "node_modules/@npmcli/run-script": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", - "dev": true, - "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" - } - }, - "node_modules/@open-wc/building-utils": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/@open-wc/building-utils/-/building-utils-2.21.1.tgz", - "integrity": "sha512-wCyxkvkcA7vRwXJeyrIpRhDbBrVlPGAgYKsuG9n1Pyxt2aypthtZR+1q0+wPkr6h1ZYgJnM9CWQYe72AaAXxvw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@webcomponents/shadycss": "^1.10.2", - "@webcomponents/webcomponentsjs": "^2.5.0", - "arrify": "^2.0.1", - "browserslist": "^4.16.5", - "chokidar": "^3.4.3", - "clean-css": "^5.3.1", - "clone": "^2.1.2", - "core-js-bundle": "^3.8.1", - "deepmerge": "^4.2.2", - "es-module-shims": "^1.4.1", - "html-minifier-terser": "^5.1.1", - "lru-cache": "^6.0.0", - "minimatch": "^7.4.2", - "parse5": "^7.1.2", - "path-is-inside": "^1.0.2", - "regenerator-runtime": "^0.13.7", - "resolve": "^1.19.0", - "rimraf": "^3.0.2", - "shady-css-scoped-element": "^0.0.2", - "systemjs": "^6.8.3", - "terser": "^4.8.1", - "valid-url": "^1.0.9", - "whatwg-fetch": "^3.5.0", - "whatwg-url": "^7.1.0" - } - }, - "node_modules/@open-wc/building-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@open-wc/building-utils/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/@open-wc/building-utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@open-wc/building-utils/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@open-wc/building-utils/node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/@open-wc/building-utils/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/@open-wc/building-utils/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/@open-wc/building-utils/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/@open-wc/building-utils/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/@open-wc/building-utils/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/@open-wc/chai-dom-equals": { - "version": "0.12.36", - "resolved": "https://registry.npmjs.org/@open-wc/chai-dom-equals/-/chai-dom-equals-0.12.36.tgz", - "integrity": "sha512-Gt1fa37h4rtWPQGETSU4n1L678NmMi9KwHM1sH+JCGcz45rs8DBPx7MUVeGZ+HxRlbEI5t9LU2RGGv6xT2OlyA==", - "dev": true, - "dependencies": { - "@open-wc/semantic-dom-diff": "^0.13.16", - "@types/chai": "^4.1.7" - } - }, - "node_modules/@open-wc/chai-dom-equals/node_modules/@open-wc/semantic-dom-diff": { - "version": "0.13.21", - "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.13.21.tgz", - "integrity": "sha512-BONpjHcGX2zFa9mfnwBCLEmlDsOHzT+j6Qt1yfK3MzFXFtAykfzFjAgaxPetu0YbBlCfXuMlfxI4vlRGCGMvFg==", - "dev": true - }, - "node_modules/@open-wc/dedupe-mixin": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz", - "integrity": "sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==", - "dev": true - }, - "node_modules/@open-wc/eslint-config": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@open-wc/eslint-config/-/eslint-config-4.3.0.tgz", - "integrity": "sha512-kCxFWQ1AR4meTmWJGnK36LJYqDJeFGjlj6n4vLjAW3/c1VUyYQKL90vrNKy/OHS9kTjc9dcH5D64myAbNx6r1w==", - "dev": true, - "dependencies": { - "eslint": "^7.6.0", - "eslint-config-airbnb-base": "^14.0.0", - "eslint-plugin-html": "^6.0.0", - "eslint-plugin-import": "^2.18.2", - "eslint-plugin-lit": "^1.2.0", - "eslint-plugin-lit-a11y": "^1.0.1", - "eslint-plugin-no-only-tests": "^2.4.0", - "eslint-plugin-wc": "^1.2.0" - }, - "peerDependencies": { - "@babel/eslint-plugin": "^7.6.0", - "eslint-plugin-html": "^6.0.0", - "eslint-plugin-import": "^2.18.2", - "eslint-plugin-lit": "^1.3.0", - "eslint-plugin-lit-a11y": "^1.0.1", - "eslint-plugin-no-only-tests": "^2.4.0", - "eslint-plugin-wc": "^1.2.0" - } - }, - "node_modules/@open-wc/scoped-elements": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@open-wc/scoped-elements/-/scoped-elements-1.3.7.tgz", - "integrity": "sha512-q/wKf4sXl7cr1kNfl8z6TLO2TrpXsFMCrfCD51sCEljltwYIXOmI6SnRXmWlnzG37A8AwHRpDXYmjPj2F4gPxA==", - "dev": true, - "dependencies": { - "@open-wc/dedupe-mixin": "^1.3.0", - "lit-html": "^1.0.0" - } - }, - "node_modules/@open-wc/semantic-dom-diff": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.19.9.tgz", - "integrity": "sha512-iUL0OPA6PeLQVEEJ/gsgkEiwOGgK4E1KS//zTB+u+OAh0NifNTfxDxIHQa7rEGvplaq2b2zztT2yyzOzj+MlAA==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.1", - "@web/test-runner-commands": "^0.6.5" - } - }, - "node_modules/@open-wc/testing": { - "version": "2.5.33", - "resolved": "https://registry.npmjs.org/@open-wc/testing/-/testing-2.5.33.tgz", - "integrity": "sha512-+EJNs0i+VV4nE+BrG70l2DNGXOZTSrluruaaU06HUSk57ZlKa+kIxWmkLxCOLlbgnQgrPrQWxbs3lgB1tIx/YA==", - "dev": true, - "dependencies": { - "@open-wc/chai-dom-equals": "^0.12.36", - "@open-wc/semantic-dom-diff": "^0.19.3", - "@open-wc/testing-helpers": "^1.8.12", - "@types/chai": "^4.2.11", - "@types/chai-dom": "^0.0.9", - "@types/mocha": "^5.2.7", - "@types/sinon-chai": "^3.2.3", - "chai": "^4.2.0", - "chai-a11y-axe": "^1.3.1", - "chai-dom": "^1.8.1", - "mocha": "^6.2.2", - "sinon-chai": "^3.5.0" - } - }, - "node_modules/@open-wc/testing-helpers": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/@open-wc/testing-helpers/-/testing-helpers-1.8.12.tgz", - "integrity": "sha512-+4exEHYvnFqI1RGDDIKFHPZ7Ws5NK1epvEku3zLaOYN3zc+huX19SndNc5+X++v8A+quN/iXbHlh80ROyNaYDA==", - "dev": true, - "dependencies": { - "@open-wc/scoped-elements": "^1.2.4", - "lit-element": "^2.2.1", - "lit-html": "^1.0.0" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-16.0.0.tgz", - "integrity": "sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "commondir": "^1.0.1", - "estree-walker": "^2.0.1", - "glob": "^7.1.6", - "is-reference": "^1.2.1", - "magic-string": "^0.25.7", - "resolve": "^1.17.0" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^2.30.0" - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@rollup/plugin-commonjs/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/@rollup/plugin-inject": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz", - "integrity": "sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "estree-walker": "^2.0.1", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/plugin-inject/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@rollup/plugin-json": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", - "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.0.8" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^2.42.0" - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", - "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@snowpack/plugin-typescript": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@snowpack/plugin-typescript/-/plugin-typescript-1.2.1.tgz", - "integrity": "sha512-wU+JNaMVkqGsqTaUY7TnEMhGt/3URTgA9dpMCtZX6wn/ceA7Gwlmue/sOLynf0OTNLygHPvjiQECQYkEi3LTtg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0", - "npm-run-path": "^4.0.1" - }, - "peerDependencies": { - "typescript": "*" - } - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dev": true, - "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@types/accepts": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.6.tgz", - "integrity": "sha512-6+qlUg57yfE9OO63wnsJXLeq9cG3gSHBBIxNMOjNrbDRlDnm/NaR7RctfYcVCPq+j7d+MwOxqVEludH5+FKrlg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/babel__code-frame": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.5.tgz", - "integrity": "sha512-tE88HnYMl5iJAB1V9nJCrE1udmwGCoNvx2ayTa8nwkE3UMMRRljANO+sX8D321hIrqf1DlvhAPAo5G6DWaMQNg==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", - "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", - "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", - "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", - "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", - "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/browserslist": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@types/browserslist/-/browserslist-4.15.0.tgz", - "integrity": "sha512-h9LyKErRGZqMsHh9bd+FE8yCIal4S0DxKTOeui56VgVXqa66TKiuaIUxCAI7c1O0LjaUzOTcsMyOpO9GetozRA==", - "deprecated": "This is a stub types definition. browserslist provides its own type definitions, so you do not need this installed.", - "dev": true, - "dependencies": { - "browserslist": "*" - } - }, - "node_modules/@types/browserslist-useragent": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/browserslist-useragent/-/browserslist-useragent-3.0.6.tgz", - "integrity": "sha512-ftxQ7LUTadTAEdeVcyqXjXktuHUKCQ0OhFpU22PD9jGOu+c7GeRVorh7S/0bpjZOMXeC1bkV3hvAkmZ4o9s3TA==", - "dev": true - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/caniuse-api": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/caniuse-api/-/caniuse-api-3.0.4.tgz", - "integrity": "sha512-ieat3NYs1+AQPyWqeNjY9vtfc7CPg1/BOlVxStyRy72Tu2PzewOdAxrnUrY0mWM6lBfDb+ohtP8EM9qgZhmPoA==", - "dev": true - }, - "node_modules/@types/chai": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.9.tgz", - "integrity": "sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==", - "dev": true - }, - "node_modules/@types/chai-dom": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-0.0.9.tgz", - "integrity": "sha512-jj4F2NJog2/GBYsyJ8+NvhnWUBbPY4MUAKLdPJE6+568rw12GGXvj0ycUuP5nndVrnJgozmJAoMTvxvjJATXWw==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/co-body": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.2.tgz", - "integrity": "sha512-eUqBFu8mNW56oZAP0aEmGm+4qFeYjkxVThQ1F/8jFOBiSNM+gib3pYFzjnQsQRUZ501Eg8qOc7Nn76GcZo6Uvg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*" - } - }, - "node_modules/@types/command-line-args": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.2.tgz", - "integrity": "sha512-9aZ7KzLDOBYyqH5J2bvB9edvsMXusX+H/aS8idAJOpWNmscZG5RqO1CVJPFa4Q0/1xKgvxcweXunFVx2l/dYFA==", - "dev": true - }, - "node_modules/@types/command-line-usage": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.3.tgz", - "integrity": "sha512-ZESq+MDjR7QpvFfuanzfoAwfzA9e/wUUH/5uEyaZpGwqEnNddBpsyzJWltUIMgXYy97//wD0aJFgKStoZ6o1SQ==", - "dev": true - }, - "node_modules/@types/connect": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", - "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/content-disposition": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.7.tgz", - "integrity": "sha512-V9/5u21RHFR1zfdm3rQ6pJUKV+zSSVQt+yq16i1YhdivVzWgPEoKedc3GdT8aFjsqQbakdxuy3FnEdePUQOamQ==", - "dev": true - }, - "node_modules/@types/convert-source-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-2.0.2.tgz", - "integrity": "sha512-M8jHZquUkvyaHtNVCKNoCqGmbbNFgRJ2JL607SPmcNUWqhU1spBaEJD7qlW3kMiQjKPlyyT4ZUbPG6vO4SYLBg==", - "dev": true - }, - "node_modules/@types/cookies": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.9.tgz", - "integrity": "sha512-SrGYvhKohd/WSOII0WpflC73RgdJhQoqpwq9q+n/qugNGiDSGYXfHy3QvB4+X+J/gYe27j2fSRnK4B+1A3nvsw==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "node_modules/@types/debounce": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.3.tgz", - "integrity": "sha512-97mx7gWt4e+kd0wPa1pNEvE4tYGhgBVa4ExWOLcfFohAjF9wERfJ+3qrn7I1e76oHupOvRs4UyYe9xzy0i4TUw==", - "dev": true - }, - "node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "node_modules/@types/etag": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.2.tgz", - "integrity": "sha512-z8Pbo2e+EZWMpuRPYSjhSivp2OEkqrMZBUfEAWlJC31WUCKveZ8ioWXHAC5BXRZfwxCBfYRhPij1YJHK1W6oDA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.39", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", - "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-assert": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.4.tgz", - "integrity": "sha512-/6M9aaVk+avzCsrv1lt39AlFw4faCNI6aGll91Rxj38ZE5JI8AxApyQIRy+i1McjiJiuQ0sfuoMLxqq374ZIbA==", - "dev": true - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA==", - "dev": true - }, - "node_modules/@types/http-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", - "dev": true - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", - "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/keygrip": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.4.tgz", - "integrity": "sha512-/tjWYD8StMrINelsrHNmpXceo9s3/Y22AzePH1qCvXIgmz/aQp2YFFr6HqhNQVIOdcvaVyp5GS+yjHGuF7Rwsg==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/koa": { - "version": "2.13.10", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.10.tgz", - "integrity": "sha512-weKc5IBeORLDGwD1FMgPjaZIg0/mtP7KxXAXEzPRCN78k274D9U2acmccDNPL1MwyV40Jj+hQQ5N2eaV6O0z8g==", - "dev": true, - "dependencies": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "node_modules/@types/koa__cors": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/koa__cors/-/koa__cors-3.3.1.tgz", - "integrity": "sha512-aFGYhTFW7651KhmZZ05VG0QZJre7QxBxDj2LF1lf6GA/wSXEfKVAJxiQQWzRV4ZoMzQIO8vJBXKsUcRuvYK9qw==", - "dev": true, - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-compose": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.7.tgz", - "integrity": "sha512-smtvSL/oLICPuenxy73OmxKGh42VVfn2o2eutReH1yjij0LmxADBpGcAJbp4N+yJjPapPN7jAX9p7Ue0JMQ/Ag==", - "dev": true, - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-compress": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/koa-compress/-/koa-compress-2.0.9.tgz", - "integrity": "sha512-1Sa9OsbHd2N2N7gLpdIRHe8W99EZbfIR31D7Iisx16XgwZCnWUtGXzXQejhu74Y1pE/wILqBP6VL49ch/MVpZw==", - "dev": true, - "dependencies": { - "@types/koa": "*", - "@types/node": "*" - } - }, - "node_modules/@types/koa-etag": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/koa-etag/-/koa-etag-3.0.2.tgz", - "integrity": "sha512-+0AzCdTpMd0JGCYvsllwtcCxLsvZyaUkzufEx1MVAuBfun5dvKQcIk3lVAAlo7W+LJ86CC1ZHY9vHt3IoZLORA==", - "dev": true, - "dependencies": { - "@types/etag": "*", - "@types/koa": "*" - } - }, - "node_modules/@types/koa-send": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/koa-send/-/koa-send-4.1.5.tgz", - "integrity": "sha512-O2qnxAKr7MoAxHHUitJejMWw45b9QtgTra0pnVDl/XoNdYTdZOgwj8wSVDon0qXg/lrcYHye4LFbAaSfSWwnrg==", - "dev": true, - "dependencies": { - "@types/koa": "*" - } - }, - "node_modules/@types/koa-static": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/koa-static/-/koa-static-4.0.3.tgz", - "integrity": "sha512-4U9uZwXqYAudDLDVkw1prJM5avn9/lHLVEwoyyI/ITZluWkBdmirkj8EsOLG6kLr0XFZdViR0ZBtQ3oetSsr3g==", - "dev": true, - "dependencies": { - "@types/koa": "*", - "@types/koa-send": "*" - } - }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true - }, - "node_modules/@types/marked": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-2.0.5.tgz", - "integrity": "sha512-shRZ7XnYFD/8n8zSjKvFdto1QNSf4tONZIlNEZGrJe8GsOE8DL/hG1Hbl8gZlfLnjS7+f5tZGIaTgfpyW38h4w==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", - "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", - "dev": true - }, - "node_modules/@types/mime-types": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.3.tgz", - "integrity": "sha512-bvxCbHeeS7quxS7uOJShyoOQj/BfLabhF6mk9Rmr+2MRfW8W1yxyyL/0GTxLFTHen41GrIw4K3D4DrLouhb8vg==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "node_modules/@types/minimist": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.4.tgz", - "integrity": "sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", - "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "16.18.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.60.tgz", - "integrity": "sha512-ZUGPWx5vKfN+G2/yN7pcSNLkIkXEvlwNaJEd4e0ppX7W2S8XAkdc/37hM4OUNJB9sa0p12AOvGvxL4JCPiz9DA==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz", - "integrity": "sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==", - "dev": true - }, - "node_modules/@types/parse-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", - "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==", - "dev": true - }, - "node_modules/@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, - "node_modules/@types/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-gdT4ZrzPzf5vrdmCGQM+yNdLpKMrtmzdh13PuPB/aVZRwNG3rOc7yWQRhCQSSz7wicievT+uPTEzUiw+TO7ZAg==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/send": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", - "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", - "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sinon": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.0.tgz", - "integrity": "sha512-oN4AeDMFCeNZrAffCjhLcwwVymRZL2c9mljUmhPnd0eiM06d4ELDg0Q0TSvnZXrCIFlSA859qIdcfu1HapswPQ==", - "dev": true, - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinon-chai": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.11.tgz", - "integrity": "sha512-1C5SBFzwn9hjiMr1xfqbULcSI9qXVpkGZT/LYbbd3jWiTo2MSvA+iFfwODlSoAXGeCgBw6S509dxy8zSIacr3Q==", - "dev": true, - "dependencies": { - "@types/chai": "*", - "@types/sinon": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.4.tgz", - "integrity": "sha512-GDV68H0mBSN449sa5HEj51E0wfpVQb8xNSMzxf/PrypMFcLTMwJMOM/cgXiv71Mq5drkOQmUGvL1okOZcu6RrQ==", - "dev": true - }, - "node_modules/@types/trusted-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz", - "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==", - "dev": true - }, - "node_modules/@types/whatwg-url": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-6.4.0.tgz", - "integrity": "sha512-tonhlcbQ2eho09am6RHnHOgvtDfDYINd5rgxD+2YSkKENooVCFsWizJz139MQW/PV8FfClyKrNe9ZbdHrSCxGg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.2.tgz", - "integrity": "sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dev": true, - "dependencies": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/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/@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@web/browser-logs": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.2.6.tgz", - "integrity": "sha512-CNjNVhd4FplRY8PPWIAt02vAowJAVcOoTNrR/NNb/o9pka7yI9qdjpWrWhEbPr2pOXonWb52AeAgdK66B8ZH7w==", - "dev": true, - "dependencies": { - "errorstacks": "^2.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@web/config-loader": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.1.3.tgz", - "integrity": "sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==", - "dev": true, - "dependencies": { - "semver": "^7.3.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@web/config-loader/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/@web/config-loader/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@web/config-loader/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/@web/dev-server": { - "version": "0.1.38", - "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.38.tgz", - "integrity": "sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.11", - "@types/command-line-args": "^5.0.0", - "@web/config-loader": "^0.1.3", - "@web/dev-server-core": "^0.4.1", - "@web/dev-server-rollup": "^0.4.1", - "camelcase": "^6.2.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^7.0.1", - "debounce": "^1.2.0", - "deepmerge": "^4.2.2", - "ip": "^1.1.5", - "nanocolors": "^0.2.1", - "open": "^8.0.2", - "portfinder": "^1.0.32" - }, - "bin": { - "wds": "dist/bin.js", - "web-dev-server": "dist/bin.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@web/dev-server-core": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.3.19.tgz", - "integrity": "sha512-Q/Xt4RMVebLWvALofz1C0KvP8qHbzU1EmdIA2Y1WMPJwiFJFhPxdr75p9YxK32P2t0hGs6aqqS5zE0HW9wYzYA==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^1.2.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^4.0.6", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^6.0.0", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@web/dev-server-core/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/@web/dev-server-core/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/@web/dev-server-esbuild": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-0.2.16.tgz", - "integrity": "sha512-a82uKy9vQ4HvfWtjd7hJ3GtaqkL2ofxpEu3a1wIZyXB2dFWPvhRSmLNe/4IPPHe4vj6PVdRpLSFPEA3lXUW5Pw==", - "dev": true, - "dependencies": { - "@mdn/browser-compat-data": "^4.0.0", - "@web/dev-server-core": "^0.3.17", - "esbuild": "^0.12.21", - "parse5": "^6.0.1", - "ua-parser-js": "^1.0.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@web/dev-server-rollup": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.4.1.tgz", - "integrity": "sha512-Ebsv7Ovd9MufeH3exvikBJ7GmrZA5OmHnOgaiHcwMJ2eQBJA5/I+/CbRjsLX97ICj/ZwZG//p2ITRz8W3UfSqg==", - "dev": true, - "dependencies": { - "@rollup/plugin-node-resolve": "^13.0.4", - "@web/dev-server-core": "^0.4.1", - "nanocolors": "^0.2.1", - "parse5": "^6.0.1", - "rollup": "^2.67.0", - "whatwg-url": "^11.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@web/dev-server-rollup/node_modules/@web/dev-server-core": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.4.1.tgz", - "integrity": "sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^1.3.1", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^6.0.0", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@web/dev-server-rollup/node_modules/isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", - "dev": true, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@web/dev-server-rollup/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/@web/dev-server-rollup/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/@web/dev-server/node_modules/@web/dev-server-core": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.4.1.tgz", - "integrity": "sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^1.3.1", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^6.0.0", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@web/dev-server/node_modules/array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", - "dev": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@web/dev-server/node_modules/command-line-usage": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", - "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", - "dev": true, - "dependencies": { - "array-back": "^6.2.2", - "chalk-template": "^0.4.0", - "table-layout": "^3.0.0", - "typical": "^7.1.1" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/@web/dev-server/node_modules/isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", - "dev": true, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@web/dev-server/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/@web/dev-server/node_modules/table-layout": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", - "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", - "dev": true, - "dependencies": { - "@75lb/deep-merge": "^1.1.1", - "array-back": "^6.2.2", - "command-line-args": "^5.2.1", - "command-line-usage": "^7.0.0", - "stream-read-all": "^3.0.1", - "typical": "^7.1.1", - "wordwrapjs": "^5.1.0" - }, - "bin": { - "table-layout": "bin/cli.js" - }, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@web/dev-server/node_modules/typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "dev": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@web/dev-server/node_modules/wordwrapjs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", - "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", - "dev": true, - "engines": { - "node": ">=12.17" - } - }, - "node_modules/@web/dev-server/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/@web/parse5-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-1.3.1.tgz", - "integrity": "sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA==", - "dev": true, - "dependencies": { - "@types/parse5": "^6.0.1", - "parse5": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@web/test-runner": { - "version": "0.13.31", - "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.13.31.tgz", - "integrity": "sha512-QMj/25U25AkhN4ffBoMMPdpQLNojL8cAzlyIh/oyVp385Cjmd4Hz8S0u4PvWJmDRmPerbJRNtsWafB8/EcQ1rA==", - "dev": true, - "dependencies": { - "@web/browser-logs": "^0.2.2", - "@web/config-loader": "^0.1.3", - "@web/dev-server": "^0.1.32", - "@web/test-runner-chrome": "^0.10.7", - "@web/test-runner-commands": "^0.6.3", - "@web/test-runner-core": "^0.10.27", - "@web/test-runner-mocha": "^0.7.5", - "camelcase": "^6.2.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.1", - "convert-source-map": "^1.7.0", - "diff": "^5.0.0", - "globby": "^11.0.1", - "nanocolors": "^0.2.1", - "portfinder": "^1.0.28", - "source-map": "^0.7.3" - }, - "bin": { - "web-test-runner": "dist/bin.js", - "wtr": "dist/bin.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@web/test-runner-chrome": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.10.7.tgz", - "integrity": "sha512-DKJVHhHh3e/b6/erfKOy0a4kGfZ47qMoQRgROxi9T4F9lavEY3E5/MQ7hapHFM2lBF4vDrm+EWjtBdOL8o42tw==", - "dev": true, - "dependencies": { - "@web/test-runner-core": "^0.10.20", - "@web/test-runner-coverage-v8": "^0.4.8", - "chrome-launcher": "^0.15.0", - "puppeteer-core": "^13.1.3" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@web/test-runner-commands": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.6.6.tgz", - "integrity": "sha512-2DcK/+7f8QTicQpGFq/TmvKHDK/6Zald6rn1zqRlmj3pcH8fX6KHNVMU60Za9QgAKdorMBPfd8dJwWba5otzdw==", - "dev": true, - "dependencies": { - "@web/test-runner-core": "^0.10.29", - "mkdirp": "^1.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@web/test-runner-core": { - "version": "0.10.29", - "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.10.29.tgz", - "integrity": "sha512-0/ZALYaycEWswHhpyvl5yqo0uIfCmZe8q14nGPi1dMmNiqLcHjyFGnuIiLexI224AW74ljHcHllmDlXK9FUKGA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.12.11", - "@types/babel__code-frame": "^7.0.2", - "@types/co-body": "^6.1.0", - "@types/convert-source-map": "^2.0.0", - "@types/debounce": "^1.2.0", - "@types/istanbul-lib-coverage": "^2.0.3", - "@types/istanbul-reports": "^3.0.0", - "@web/browser-logs": "^0.2.6", - "@web/dev-server-core": "^0.4.1", - "chokidar": "^3.4.3", - "cli-cursor": "^3.1.0", - "co-body": "^6.1.0", - "convert-source-map": "^2.0.0", - "debounce": "^1.2.0", - "dependency-graph": "^0.11.0", - "globby": "^11.0.1", - "ip": "^1.1.5", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.0.2", - "log-update": "^4.0.0", - "nanocolors": "^0.2.1", - "nanoid": "^3.1.25", - "open": "^8.0.2", - "picomatch": "^2.2.2", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@web/test-runner-core/node_modules/@web/dev-server-core": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.4.1.tgz", - "integrity": "sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==", - "dev": true, - "dependencies": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^1.3.1", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^6.0.0", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@web/test-runner-core/node_modules/isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", - "dev": true, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "node_modules/@web/test-runner-core/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/@web/test-runner-core/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/@web/test-runner-coverage-v8": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@web/test-runner-coverage-v8/-/test-runner-coverage-v8-0.4.9.tgz", - "integrity": "sha512-y9LWL4uY25+fKQTljwr0XTYjeWIwU4h8eYidVuLoW3n1CdFkaddv+smrGzzF5j8XY+Mp6TmV9NdxjvMWqVkDdw==", - "dev": true, - "dependencies": { - "@web/test-runner-core": "^0.10.20", - "istanbul-lib-coverage": "^3.0.0", - "picomatch": "^2.2.2", - "v8-to-istanbul": "^8.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@web/test-runner-mocha": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@web/test-runner-mocha/-/test-runner-mocha-0.7.5.tgz", - "integrity": "sha512-12/OBq6efPCAvJpcz3XJs2OO5nHe7GtBibZ8Il1a0QtsGpRmuJ4/m1EF0Fj9f6KHg7JdpGo18A37oE+5hXjHwg==", - "dev": true, - "dependencies": { - "@types/mocha": "^8.2.0", - "@web/test-runner-core": "^0.10.20" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@web/test-runner-mocha/node_modules/@types/mocha": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", - "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", - "dev": true - }, - "node_modules/@web/test-runner/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/@webcomponents/shadycss": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.11.2.tgz", - "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==", - "dev": true - }, - "node_modules/@webcomponents/webcomponentsjs": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.8.0.tgz", - "integrity": "sha512-loGD63sacRzOzSJgQnB9ZAhaQGkN7wl2Zuw7tsphI5Isa0irijrRo6EnJii/GgjGefIFO8AIO7UivzRhFaEk9w==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ace-custom-element": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/ace-custom-element/-/ace-custom-element-1.6.5.tgz", - "integrity": "sha512-xU/9r94WKwjwEOjdfs6oVk2Dqc6X63eF2ECvKIMm/JCK1PDbXXdBYi5sQx110tR2sY4f96iXxyvscfT9qeI1RQ==" - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "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/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/amator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/amator/-/amator-1.1.0.tgz", - "integrity": "sha512-V5+aH8pe+Z3u/UG3L3pG3BaFQGXAyXHVQDroRwjPHdh08bcUEchAVsU1MCuJSCaU5o60wTK6KaE6te5memzgYw==", - "dependencies": { - "bezier-easing": "^2.0.3" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "node_modules/are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.reduce": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", - "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", - "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", - "dev": true, - "dependencies": { - "object.assign": "^4.1.4", - "util": "^0.10.4" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.33.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.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/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "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/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bezier-easing": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz", - "integrity": "sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==" - }, - "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bin-links": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-2.3.0.tgz", - "integrity": "sha512-JzrOLHLwX2zMqKdyYZjkDgQGT+kHDkIhv2/IK2lJ00qLxV4TmFoHi8drDBb6H5Zrz1YfgHkai4e2MGPqnoUhqA==", - "dev": true, - "dependencies": { - "cmd-shim": "^4.0.1", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^2.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^3.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/blocking-elements": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/blocking-elements/-/blocking-elements-0.1.1.tgz", - "integrity": "sha512-/SLWbEzMoVIMZACCyhD/4Ya2M1PWP1qMKuiymowPcI+PdWDARqeARBjhj73kbUBCxEmTZCUu5TAqxtwUO9C1Ig==" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "node_modules/boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/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/boxen/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/boxen/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/boxen/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/boxen/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/boxen/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/boxen/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bplist-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", - "integrity": "sha512-2AEM0FXy8ZxVLBuqX0hqt1gDwcnz2zygEkQ6zaD5Wko/sB9paUNwlpawrFtKeHUAQUOzjVy9AO4oeonqIHKA9Q==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.7" - } - }, - "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/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/browserslist-useragent": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/browserslist-useragent/-/browserslist-useragent-3.1.4.tgz", - "integrity": "sha512-o9V55790uae98Kwn+vwyO+ww07OreiH1BUc9bjjlUbIL3Fh43fyoasZxZ2EiI4ErfEIKwbycQ1pvwOBlySJ7ow==", - "dev": true, - "dependencies": { - "browserslist": "^4.19.1", - "electron-to-chromium": "^1.4.67", - "semver": "^7.3.5", - "useragent": "^2.3.0", - "yamlparser": "^0.0.2" - }, - "engines": { - "node": ">= 6.x.x" - } - }, - "node_modules/browserslist-useragent/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/browserslist-useragent/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/browserslist-useragent/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/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cacache/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/cacache/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/cacache/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/cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "dev": true, - "dependencies": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true, - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cachedir": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", - "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-a11y-axe": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/chai-a11y-axe/-/chai-a11y-axe-1.5.0.tgz", - "integrity": "sha512-V/Vg/zJDr9aIkaHJ2KQu7lGTQQm5ZOH4u1k5iTMvIXuSVlSuUo0jcSpSqf9wUn9zl6oQXa4e4E0cqH18KOgKlQ==", - "dev": true, - "dependencies": { - "axe-core": "^4.3.3" - } - }, - "node_modules/chai-dom": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/chai-dom/-/chai-dom-1.11.0.tgz", - "integrity": "sha512-ZzGlEfk1UhHH5+N0t9bDqstOxPEXmn3EyXvtsok5rfXVDOFDJbHVy12rED6ZwkJAUDs2w7/Da4Hlq2LB63kltg==", - "dev": true, - "engines": { - "node": ">= 0.12.0" - }, - "peerDependencies": { - "chai": ">= 3", - "mocha": ">= 2" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/chalk-template/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/chalk-template/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/chalk-template/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/chalk-template/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/chalk-template/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/chalk-template/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/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dev": true, - "dependencies": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", - "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", - "dev": true, - "dependencies": { - "css-select": "^4.3.0", - "css-what": "^6.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.3.1", - "domutils": "^2.8.0" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chrome-launcher/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/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/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/cliui/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/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cmd-shim": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-4.1.0.tgz", - "integrity": "sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw==", - "dev": true, - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/co-body": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", - "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", - "dev": true, - "dependencies": { - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "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==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, - "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concurrently": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.5.1.tgz", - "integrity": "sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "date-fns": "^2.16.1", - "lodash": "^4.17.21", - "rxjs": "^6.6.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^16.2.0" - }, - "bin": { - "concurrently": "bin/concurrently.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/concurrently/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/concurrently/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/concurrently/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/concurrently/node_modules/chalk/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/concurrently/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/concurrently/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/concurrently/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/concurrently/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/concurrently/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/concurrently/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/concurrently/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/configstore/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/conventional-changelog": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", - "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", - "dev": true, - "dependencies": { - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-atom": "^2.0.8", - "conventional-changelog-codemirror": "^2.0.8", - "conventional-changelog-conventionalcommits": "^4.5.0", - "conventional-changelog-core": "^4.2.1", - "conventional-changelog-ember": "^2.0.9", - "conventional-changelog-eslint": "^3.0.9", - "conventional-changelog-express": "^2.0.6", - "conventional-changelog-jquery": "^3.0.11", - "conventional-changelog-jshint": "^2.0.9", - "conventional-changelog-preset-loader": "^2.3.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-atom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", - "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-codemirror": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", - "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-config-spec": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", - "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", - "dev": true - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", - "dev": true, - "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/conventional-changelog-core/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/conventional-changelog-core/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/conventional-changelog-ember": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", - "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-eslint": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", - "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-express": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", - "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jquery": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", - "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", - "dev": true, - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jshint": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", - "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", - "dev": true, - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-recommended-bump": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", - "dev": true, - "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - }, - "bin": { - "conventional-recommended-bump": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/cookies": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", - "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", - "dev": true, - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/core-js-bundle": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.33.2.tgz", - "integrity": "sha512-kzjfHknAHPfXo+jzJQRDiWdKlij0VEgk69epwakY9KEbAejOnhN1XP6oBjv8GGuZuQop/8kAuRuhDHGG0ab0xQ==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", - "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", - "dev": true, - "dependencies": { - "browserslist": "^4.22.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.2.tgz", - "integrity": "sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "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/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csv-stringify": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.4.4.tgz", - "integrity": "sha512-NDshLupGa7gp4UG4sSNIqwYJqgSwvds0SvENntxoVoVvTzXcrHvd5gG2MWpbRpSNvk59dlmIe1IwNvSxN4IVmg==" - }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "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/debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "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/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser-id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-2.0.0.tgz", - "integrity": "sha512-+LePblg9HDIx3CIla8BxfI/zYUFs8Kp67U5feqb7iTJcAxBOvcZ7ZNXKFsBDnGE5x0ap66o848VHE0fq7cgpPg==", - "dev": true, - "dependencies": { - "bplist-parser": "^0.1.0", - "pify": "^2.3.0", - "untildify": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defaults/node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dev": true, - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", - "dev": true - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "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/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/dom5": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.1.tgz", - "integrity": "sha512-JPFiouQIr16VQ4dX6i0+Hpbg3H2bMKPmZ+WZgBOSSvOPx9QHwwY8sPzeM2baUtViESYto6wC2nuZOMC/6gulcA==", - "dev": true, - "dependencies": { - "@types/parse5": "^2.2.34", - "clone": "^2.1.0", - "parse5": "^4.0.0" - } - }, - "node_modules/dom5/node_modules/@types/parse5": { - "version": "2.2.34", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz", - "integrity": "sha512-p3qOvaRsRpFyEmaS36RtLzpdxZZnmxGuT1GMgzkTtTJVFuEw7KFjGK83MFODpJExgX1bEzy9r0NYjMC3IMfi7w==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/dom5/node_modules/parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotgitignore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", - "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotgitignore/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true - }, - "node_modules/dynamic-import-polyfill": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dynamic-import-polyfill/-/dynamic-import-polyfill-0.1.1.tgz", - "integrity": "sha512-m953zv0w5oDagTItWm6Auhmk/pY7EiejaqiVbnzSS3HIjh1FCUeK7WzuaVtWPNs58A+/xpIE+/dVk6pKsrua8g==", - "dev": true - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.576", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", - "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/enquirer/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/enquirer/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/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/errorstacks": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/errorstacks/-/errorstacks-2.4.0.tgz", - "integrity": "sha512-5ecWhU5gt0a5G05nmQcgCxP5HperSMxLDzvWlT5U+ZSKkuDK0rJ3dbCQny6/vSCIXjwrhwSecXBbw1alr295hQ==", - "dev": true - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "node_modules/es-dev-server": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-dev-server/-/es-dev-server-2.1.0.tgz", - "integrity": "sha512-Vrq/4PyMzWz33QmOdSncvoWLTJVcv2e96z8FLHQwP9zK7DyLeDZCckII8VTW+btUGtM7aErvLH/d/R2pjjjs8w==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.1", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/preset-env": "^7.9.0", - "@koa/cors": "^3.1.0", - "@open-wc/building-utils": "^2.18.3", - "@rollup/plugin-node-resolve": "^11.0.0", - "@rollup/pluginutils": "^3.0.0", - "@types/babel__core": "^7.1.3", - "@types/browserslist": "^4.8.0", - "@types/browserslist-useragent": "^3.0.0", - "@types/caniuse-api": "^3.0.0", - "@types/command-line-args": "^5.0.0", - "@types/command-line-usage": "^5.0.1", - "@types/debounce": "^1.2.0", - "@types/koa": "^2.0.48", - "@types/koa__cors": "^3.0.1", - "@types/koa-compress": "^2.0.9", - "@types/koa-etag": "^3.0.0", - "@types/koa-static": "^4.0.1", - "@types/lru-cache": "^5.1.0", - "@types/mime-types": "^2.1.0", - "@types/minimatch": "^3.0.3", - "@types/path-is-inside": "^1.0.0", - "@types/whatwg-url": "^6.4.0", - "browserslist": "^4.9.1", - "browserslist-useragent": "^3.0.2", - "builtin-modules": "^3.1.0", - "camelcase": "^5.3.1", - "caniuse-api": "^3.0.0", - "caniuse-lite": "^1.0.30001033", - "chokidar": "^3.0.0", - "command-line-args": "^5.0.2", - "command-line-usage": "^6.1.0", - "debounce": "^1.2.0", - "deepmerge": "^4.2.2", - "es-module-lexer": "^0.3.13", - "get-stream": "^5.1.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^4.0.2", - "koa": "^2.7.0", - "koa-compress": "^3.0.0", - "koa-etag": "^3.0.0", - "koa-static": "^5.0.0", - "lru-cache": "^5.1.1", - "mime-types": "^2.1.27", - "minimatch": "^3.0.4", - "open": "^7.0.3", - "parse5": "^5.1.1", - "path-is-inside": "^1.0.2", - "polyfills-loader": "^1.7.4", - "portfinder": "^1.0.21", - "rollup": "^2.7.2", - "strip-ansi": "^5.2.0", - "systemjs": "^6.3.1", - "tslib": "^1.11.1", - "useragent": "^2.3.0", - "whatwg-url": "^7.0.0" - }, - "bin": { - "es-dev-server": "dist/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/es-dev-server/node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/es-dev-server/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/es-dev-server/node_modules/es-module-lexer": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", - "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", - "dev": true - }, - "node_modules/es-dev-server/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/es-dev-server/node_modules/koa-etag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/koa-etag/-/koa-etag-3.0.0.tgz", - "integrity": "sha512-HYU1zIsH4S9xOlUZGuZIP1PIiJ0EkBXgwL8PjFECb/pUYmAee8gfcvIovregBMYxECDhLulEWT2+ZRsA/lczCQ==", - "dev": true, - "dependencies": { - "etag": "^1.3.0", - "mz": "^2.1.0" - } - }, - "node_modules/es-dev-server/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/es-dev-server/node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "node_modules/es-dev-server/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/es-dev-server/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/es-dev-server/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/es-dev-server/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", - "dev": true - }, - "node_modules/es-module-shims": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-1.8.1.tgz", - "integrity": "sha512-egouQrkryAJpKHVDZICQq5+fW4z1RomzVJpicA+8yqUHzKkTuMeoHaNIZ7PsWDnRl0ImCEVJEpW/aVb6JYKVJg==", - "dev": true - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.12.29", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz", - "integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esinstall": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/esinstall/-/esinstall-1.1.7.tgz", - "integrity": "sha512-irDsrIF7fZ5BCQEAV5gmH+4nsK6JhnkI9C9VloXdmzJLbM1EcshPw8Ap95UUGc4ZJdzGeOrjV+jgKjQ/Z7Q3pg==", - "dev": true, - "dependencies": { - "@rollup/plugin-commonjs": "^16.0.0", - "@rollup/plugin-inject": "^4.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-node-resolve": "^10.0.0", - "@rollup/plugin-replace": "^2.4.2", - "builtin-modules": "^3.2.0", - "cjs-module-lexer": "^1.2.1", - "es-module-lexer": "^0.6.0", - "execa": "^5.1.1", - "is-valid-identifier": "^2.0.2", - "kleur": "^4.1.1", - "mkdirp": "^1.0.3", - "picomatch": "^2.3.0", - "resolve": "^1.20.0", - "rimraf": "^3.0.0", - "rollup": "~2.37.1", - "rollup-plugin-polyfill-node": "^0.6.2", - "slash": "~3.0.0", - "validate-npm-package-name": "^3.0.0", - "vm2": "^3.9.2" - } - }, - "node_modules/esinstall/node_modules/@rollup/plugin-node-resolve": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-10.0.0.tgz", - "integrity": "sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.17.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/esinstall/node_modules/es-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.6.0.tgz", - "integrity": "sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA==", - "dev": true - }, - "node_modules/esinstall/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/esinstall/node_modules/rollup": { - "version": "2.37.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.37.1.tgz", - "integrity": "sha512-V3ojEeyGeSdrMSuhP3diBb06P+qV4gKQeanbDv+Qh/BZbhdZ7kHV0xAt8Yjk4GFshq/WjO7R4c7DFM20AwTFVQ==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-airbnb-base": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", - "eslint-plugin-import": "^2.22.1" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz", - "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==", - "dev": true, - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": ">=4.0.0" - } - }, - "node_modules/eslint-plugin-html": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.2.0.tgz", - "integrity": "sha512-vi3NW0E8AJombTvt8beMwkL1R/fdRWl4QSNRNMhVQKWm36/X0KF0unGNAY4mqUF06mnwVWZcIcerrCnfn9025g==", - "dev": true, - "dependencies": { - "htmlparser2": "^7.1.2" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-lit": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-1.10.1.tgz", - "integrity": "sha512-3eH++xFpe6efd+TN6B9kW1coULdPyK+3fMNws378nbYQ/HiWIz0+jVcsaGVs9BbLt6kVkDxZmUGF4Ivx3BatkA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "requireindex": "^1.2.0" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "eslint": ">= 5" - } - }, - "node_modules/eslint-plugin-lit-a11y": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit-a11y/-/eslint-plugin-lit-a11y-1.1.0.tgz", - "integrity": "sha512-reJqT0UG/Y8OC2z7pfgm0ODK1D6o5TgQpGdlgN1ja0HjdREXLqFVoYiEv013oNx3kBhTUaLlic64rRNw+386xw==", - "dev": true, - "dependencies": { - "aria-query": "^4.2.2", - "axe-core": "^4.3.3", - "axobject-query": "^2.2.0", - "dom5": "^3.0.1", - "emoji-regex": "^9.2.0", - "eslint": "^7.6.0", - "eslint-rule-extender": "0.0.1", - "intl-list-format": "^1.0.3", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "requireindex": "~1.2.0" - }, - "peerDependencies": { - "eslint": ">= 5" - } - }, - "node_modules/eslint-plugin-lit-a11y/node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "node_modules/eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-plugin-tsdoc": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz", - "integrity": "sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "0.16.2" - } - }, - "node_modules/eslint-plugin-wc": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-1.5.0.tgz", - "integrity": "sha512-KFSfiHDol/LeV7U6IX8GdgpGf/s3wG8FTG120Rml/hGNB/DkCuGYQhlf0VgdBdf7gweem8Nlsh5o64HNdj+qPA==", - "dev": true, - "dependencies": { - "is-valid-element-name": "^1.0.0", - "js-levenshtein-esm": "^1.2.0" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/eslint-rule-extender": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/eslint-rule-extender/-/eslint-rule-extender-0.0.1.tgz", - "integrity": "sha512-F0j1Twve3lamL3J0rRSVAynlp58sDPG39JFcQrM+u9Na7PmCgiPHNODh6YE9mduaGcsn3NBqbf6LZRj0cLr8Ng==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kaicataldo" - } - }, - "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/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-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/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/eslint/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/eslint/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/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/eslint/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/eslint/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/eslint/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/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/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/eslint/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/eslint/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/eslint/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/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "dev": true - }, - "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/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-check": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.25.0.tgz", - "integrity": "sha512-wRUT2KD2lAmT75WNIJIHECawoUUMHM0I5jrlLXGtGeqmPL8jl/EldUDjY1VCp6fDY8yflyfUeIOsOBrIbIiArg==", - "dev": true, - "dependencies": { - "pure-rand": "^5.0.1" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - }, - "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-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "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-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.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/fdir": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-5.3.0.tgz", - "integrity": "sha512-BtE53+jaa7nNHT+gPdfU6cFAXOJUWDs2b5GFox8dtl6zLXmfNf/N6im69b9nqNNwDyl27mpIWX8qR7AafWzSdQ==", - "dev": true, - "peerDependencies": { - "picomatch": "2.x" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "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-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-cache-dir/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "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": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "dependencies": { - "is-buffer": "~2.0.3" - }, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "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/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "dev": true, - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/gauge/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/gauge/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "dependencies": { - "loader-utils": "^3.2.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "node_modules/get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", - "dev": true, - "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-pkg-repo/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/get-pkg-repo/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/get-pkg-repo/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/get-pkg-repo/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/get-pkg-repo/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "dev": true, - "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", - "dev": true, - "dependencies": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "dependencies": { - "ini": "^1.3.2" - } - }, - "node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "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/global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "dependencies": { - "ini": "^1.3.4" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "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/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dev": true, - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/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/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/html-minifier-terser/node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/html-minifier-terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/htmlparser2": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", - "dev": true, - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" - } - }, - "node_modules/http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", - "dev": true, - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-errors/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/httpie": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/httpie/-/httpie-1.1.2.tgz", - "integrity": "sha512-VQ82oXG95oY1fQw/XecHuvcFBA+lZQ9Vwj1RfLcO8a7HpDd4cc2ukwpJt+TUlFaLUAzZErylxWu6wclJ1rUhUQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/husky": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", - "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", - "dev": true, - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "dev": true - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "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/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.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/import-fresh/node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "node_modules/inflation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", - "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "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/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/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/inquirer/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/inquirer/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/inquirer/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/inquirer/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/inquirer/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/inquirer/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/inquirer/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/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/intersection-observer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.7.0.tgz", - "integrity": "sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg==", - "dev": true - }, - "node_modules/intl-list-format": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/intl-list-format/-/intl-list-format-1.0.3.tgz", - "integrity": "sha512-VNF1Mh0K1xALXkz/5QsK1gfKRvEQO/jWaniTGAzQvbzGr5uyGDskQrRjnf6Qnbc9/JRbNE8BQtTg6iWuFrZorw==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "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" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "dependencies": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally/node_modules/global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "dependencies": { - "ini": "1.3.7" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally/node_modules/ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - }, - "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-valid-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-element-name/-/is-valid-element-name-1.0.0.tgz", - "integrity": "sha512-GZITEJY2LkSjQfaIPBha7eyZv+ge0PhBR7KITeCCWvy7VBQrCUdFkvpI+HrAPQjVtVjy1LvlEkqQTHckoszruw==", - "dev": true, - "dependencies": { - "is-potential-custom-element-name": "^1.0.0" - } - }, - "node_modules/is-valid-identifier": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-valid-identifier/-/is-valid-identifier-2.0.2.tgz", - "integrity": "sha512-mpS5EGqXOwzXtKAg6I44jIAqeBfntFLxpAth1rrKbxtKyI6LPktyDYpHBI+tHlduhhX/SF26mFXmxQu995QVqg==", - "dev": true, - "dependencies": { - "assert": "^1.4.1" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/gjtorikian/" - } - }, - "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/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/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/istanbul-lib-report/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/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dev": true, - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/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/jake/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, - "node_modules/jake/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/jake/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/jake/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/jake/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/jake/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/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/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/jest-worker/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/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "node_modules/js-levenshtein-esm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/js-levenshtein-esm/-/js-levenshtein-esm-1.2.0.tgz", - "integrity": "sha512-fzreKVq1eD7eGcQr7MtRpQH94f8gIfhdrc7yeih38xh684TNMK9v5aAu2wxfIRMk/GpAJRrzcirMAPIaSDaByQ==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "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/json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsonschema": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.11.tgz", - "integrity": "sha512-XNZHs3N1IOa3lPKm//npxMhOdaoPw+MvEV0NIgxcER83GTJcG13rehtWmpBCfEt8DrtYwIkMTs8bdXoYs4fvnQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/just-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-3.1.1.tgz", - "integrity": "sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==", - "dev": true - }, - "node_modules/just-diff-apply": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-3.1.2.tgz", - "integrity": "sha512-TCa7ZdxCeq6q3Rgms2JCRHTCfWAETPZ8SzYUbkYF6KR3I03sN29DaOIC+xyWboIcMvjAsD5iG2u/RWzHD8XpgQ==", - "dev": true - }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "node_modules/keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dev": true, - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/koa": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.2.tgz", - "integrity": "sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==", - "dev": true, - "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.8.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true - }, - "node_modules/koa-compress": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-3.1.0.tgz", - "integrity": "sha512-0m24/yS/GbhWI+g9FqtvStY+yJwTObwoxOvPok6itVjRen7PBWkjsJ8pre76m+99YybXLKhOJ62mJ268qyBFMQ==", - "dev": true, - "dependencies": { - "bytes": "^3.0.0", - "compressible": "^2.0.0", - "koa-is-json": "^1.0.0", - "statuses": "^1.0.0" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/koa-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", - "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", - "dev": true, - "dependencies": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/koa-etag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/koa-etag/-/koa-etag-4.0.0.tgz", - "integrity": "sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==", - "dev": true, - "dependencies": { - "etag": "^1.8.1" - } - }, - "node_modules/koa-is-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", - "integrity": "sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==", - "dev": true - }, - "node_modules/koa-send": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", - "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", - "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-static/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "dev": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/lint-staged": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.2.6.tgz", - "integrity": "sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg==", - "dev": true, - "dependencies": { - "cli-truncate": "2.1.0", - "colorette": "^1.4.0", - "commander": "^8.2.0", - "cosmiconfig": "^7.0.1", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "execa": "^5.1.1", - "listr2": "^3.12.2", - "micromatch": "^4.0.4", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "3.3.0", - "supports-color": "8.1.1" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, - "node_modules/lint-staged/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/lint-staged/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/listr2/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/listr2/node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/lit-element": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.5.1.tgz", - "integrity": "sha512-ogu7PiJTA33bEK0xGu1dmaX5vhcRjBXCFexPja0e7P7jqLhTpNKYRPmE+GmiCaRVAbiQKGkUgkh/i6+bh++dPQ==", - "dependencies": { - "lit-html": "^1.1.1" - } - }, - "node_modules/lit-html": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.4.1.tgz", - "integrity": "sha512-B9btcSgPYb1q4oSOb/PrOT6Z/H+r6xuNzfH4lFli/AWhYwdtrgQkQWBbIc6mdnf6E2IL3gDXdkkqNktpU0OZQA==" - }, - "node_modules/lit-translate": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/lit-translate/-/lit-translate-1.2.1.tgz", - "integrity": "sha512-jykKpkdRX0lx3JYq9jUMzVs02ISClOe2wxyPHat5wVKPyBRJQxgXxLxj1AbpuLNBCDZKEysMBpeJ1z0Y35Bk2Q==", - "dependencies": { - "lit-html": "^1.2.1" - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "dev": true, - "engines": { - "node": ">= 12.13.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": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash.assignwith": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", - "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==", - "dev": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "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/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "dependencies": { - "chalk": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/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/log-update/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/log-update/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/log-update/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/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/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/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/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/make-dir/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-dir/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/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/make-fetch-happen/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/make-fetch-happen/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/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marky": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "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/meriyah": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-3.1.6.tgz", - "integrity": "sha512-JDOSi6DIItDc33U5N52UdV6P8v+gn+fqZKfbAfHzdWApRQyQWdcvxPvAr9t01bI2rBxGvSrKRQSCg3SkZC1qeg==", - "dev": true, - "engines": { - "node": ">=10.4.0" - } - }, - "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==", - "dev": true, - "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==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minimist-options/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minipass/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/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/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/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", - "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", - "dev": true, - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/mocha/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/mocha/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/mocha/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "node_modules/mocha/node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mocha/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/mocha/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/mocha/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/mocha/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/mocha/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "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/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanocolors": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", - "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "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/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/ngraph.events": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.2.2.tgz", - "integrity": "sha512-JsUbEOzANskax+WSYiAPETemLWYXmixuPAlmZmhIbIj6FH/WDgEGCGnRwUQBK0GjOnVm8Ui+e5IJ+5VZ4e32eQ==" - }, - "node_modules/nise": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", - "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/node-environment-flags/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "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/node-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp/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/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/normalize-package-data/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/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", - "dev": true, - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-install-checks/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-install-checks/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-install-checks/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/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "node_modules/npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-package-arg/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-package-arg/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-package-arg/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/npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", - "dev": true, - "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-packlist/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/npm-pick-manifest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", - "dev": true, - "dependencies": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "node_modules/npm-pick-manifest/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/npm-pick-manifest/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-pick-manifest/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/npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", - "dev": true, - "dependencies": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "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/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", - "dev": true - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/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/ora/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/ora/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/ora/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/ora/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/ora/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/ora/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/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/ora/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/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "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/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "dependencies": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/package-json/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/package-json/node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "node_modules/package-json/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/package-json/node_modules/got/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/package-json/node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "node_modules/package-json/node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, - "node_modules/package-json/node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json/node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, - "node_modules/package-json/node_modules/responselike/node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pacote": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", - "dev": true, - "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/panzoom": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/panzoom/-/panzoom-9.4.3.tgz", - "integrity": "sha512-xaxCpElcRbQsUtIdwlrZA90P90+BHip4Vda2BC8MEb4tkI05PmR6cKECdqUCZ85ZvBHjpI9htJrZBxV5Gp/q/w==", - "dependencies": { - "amator": "^1.1.0", - "ngraph.events": "^1.2.2", - "wheel": "^1.0.0" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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/parse-conflict-json": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz", - "integrity": "sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "just-diff": "^3.0.1", - "just-diff-apply": "^3.0.0" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, - "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-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - }, - "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/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "node_modules/periscopic": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-2.0.3.tgz", - "integrity": "sha512-FuCZe61mWxQOJAQFEfmt9FjzebRlcpFz8sFPbyaCKtdusPkMEbA9ey0eARnRav5zAhmXznhaQkKGFAPn7X9NUw==", - "dev": true, - "dependencies": { - "estree-walker": "^2.0.2", - "is-reference": "^1.1.4" - } - }, - "node_modules/periscopic/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "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/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "dependencies": { - "semver-compare": "^1.0.0" - } - }, - "node_modules/polyfills-loader": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/polyfills-loader/-/polyfills-loader-1.7.6.tgz", - "integrity": "sha512-AiLIgmGFmzcvsqewyKsqWb7H8CnWNTSQBoM0u+Mauzmp0DsjObXmnZdeqvTn0HNwc1wYHHTOta82WjSjG341eQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.1", - "@open-wc/building-utils": "^2.18.3", - "@webcomponents/webcomponentsjs": "^2.4.0", - "abortcontroller-polyfill": "^1.4.0", - "core-js-bundle": "^3.6.0", - "deepmerge": "^4.2.2", - "dynamic-import-polyfill": "^0.1.1", - "es-module-shims": "^0.4.6", - "intersection-observer": "^0.7.0", - "parse5": "^5.1.1", - "regenerator-runtime": "^0.13.3", - "resize-observer-polyfill": "^1.5.1", - "systemjs": "^6.3.1", - "terser": "^4.6.7", - "whatwg-fetch": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/polyfills-loader/node_modules/es-module-shims": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-0.4.7.tgz", - "integrity": "sha512-0LTiSQoPWwdcaTVIQXhGlaDwTneD0g9/tnH1PNs3zHFFH+xoCeJclDM3rQeqF9nurXPfMKm3l9+kfPRa5VpbKg==", - "dev": true - }, - "node_modules/polyfills-loader/node_modules/parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "node_modules/polyfills-loader/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "dev": true, - "dependencies": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "engines": { - "node": ">= 0.12.0" - } - }, - "node_modules/portfinder/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/portfinder/node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-modules": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", - "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", - "dev": true, - "dependencies": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "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/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/proc-log": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-1.0.0.tgz", - "integrity": "sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==", - "dev": true - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-call-limit": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", - "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "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==", - "dev": true - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/puppeteer-core": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", - "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", - "dev": true, - "dependencies": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.981744", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.5.0" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/pure-rand": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", - "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true, - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-cmd-shim": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz", - "integrity": "sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw==", - "dev": true - }, - "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "dependencies": { - "rc": "1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", - "dev": true, - "engines": { - "node": ">=0.10.5" - } - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "dependencies": { - "global-dirs": "^0.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-path": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", - "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", - "dev": true, - "dependencies": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/resolve-path/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/resolve-path/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "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/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-polyfill-node": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.6.2.tgz", - "integrity": "sha512-gMCVuR0zsKq0jdBn8pSXN1Ejsc458k2QsFFvQdbHoM0Pot5hEnck+pBP/FDwFS6uAi77pD3rDTytsaUStsOMlA==", - "dev": true, - "dependencies": { - "@rollup/plugin-inject": "^4.0.0" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/rollup-plugin-terser/node_modules/terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "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/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/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/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/shady-css-scoped-element": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/shady-css-scoped-element/-/shady-css-scoped-element-0.0.2.tgz", - "integrity": "sha512-Dqfl70x6JiwYDujd33ZTbtCK0t52E7+H2swdWQNSTzfsolSa6LJHnTpN4T9OpJJEq4bxuzHRLFO9RBcy/UfrMQ==", - "dev": true - }, - "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/shiki": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", - "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", - "dev": true, - "dependencies": { - "jsonc-parser": "^3.0.0", - "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "5.2.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/sinon": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", - "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", - "deprecated": "16.1.1", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "peerDependencies": { - "chai": "^4.0.0", - "sinon": ">=4.0.0" - } - }, - "node_modules/sinon/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/sinon/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/skypack": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/skypack/-/skypack-0.3.2.tgz", - "integrity": "sha512-je1pix0QYER6iHuUGbgcafRJT5TI+EGUIBfzBLMqo3Wi22I2SzB9TVHQqwKCw8pzJMuHqhVTFEHc3Ey+ra25Sw==", - "dev": true, - "dependencies": { - "cacache": "^15.0.0", - "cachedir": "^2.3.0", - "esinstall": "^1.0.0", - "etag": "^1.8.1", - "find-up": "^5.0.0", - "got": "^11.1.4", - "kleur": "^4.1.0", - "mkdirp": "^1.0.3", - "p-queue": "^6.2.1", - "rimraf": "^3.0.0", - "rollup": "^2.23.0", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "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/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi/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/slice-ansi/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/slice-ansi/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/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/snowpack": { - "version": "3.8.6", - "resolved": "https://registry.npmjs.org/snowpack/-/snowpack-3.8.6.tgz", - "integrity": "sha512-EZ3Y7RtTiPvxnVFTKPfkvi2PKBrprXCvOHKWQQLBkHonf+xdtG51RiNjtrRLJeCjislAlD6OoeGHUxz76ToGHw==", - "dev": true, - "dependencies": { - "@npmcli/arborist": "^2.6.4", - "bufferutil": "^4.0.2", - "cachedir": "^2.3.0", - "cheerio": "1.0.0-rc.10", - "chokidar": "^3.4.0", - "cli-spinners": "^2.5.0", - "compressible": "^2.0.18", - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "default-browser-id": "^2.0.0", - "detect-port": "^1.3.0", - "es-module-lexer": "^0.3.24", - "esbuild": "~0.9.0", - "esinstall": "^1.1.7", - "estree-walker": "^2.0.2", - "etag": "^1.8.1", - "execa": "^5.1.1", - "fdir": "^5.0.0", - "find-cache-dir": "^3.3.1", - "find-up": "^5.0.0", - "glob": "^7.1.7", - "httpie": "^1.1.2", - "is-plain-object": "^5.0.0", - "is-reference": "^1.2.1", - "isbinaryfile": "^4.0.6", - "jsonschema": "~1.2.5", - "kleur": "^4.1.1", - "meriyah": "^3.1.6", - "mime-types": "^2.1.26", - "mkdirp": "^1.0.3", - "npm-run-path": "^4.0.1", - "open": "^8.2.1", - "pacote": "^11.3.4", - "periscopic": "^2.0.3", - "picomatch": "^2.3.0", - "postcss": "^8.3.5", - "postcss-modules": "^4.0.0", - "resolve": "^1.20.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "rollup": "~2.37.1", - "signal-exit": "^3.0.3", - "skypack": "^0.3.2", - "slash": "~3.0.0", - "source-map": "^0.7.3", - "strip-ansi": "^6.0.0", - "strip-comments": "^2.0.1", - "utf-8-validate": "^5.0.3", - "ws": "^7.3.0", - "yargs-parser": "^20.0.0" - }, - "bin": { - "snowpack": "index.bin.js", - "sp": "index.bin.js" - }, - "engines": { - "node": ">=10.19.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/snowpack/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/snowpack/node_modules/es-module-lexer": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", - "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", - "dev": true - }, - "node_modules/snowpack/node_modules/esbuild": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.9.7.tgz", - "integrity": "sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - } - }, - "node_modules/snowpack/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/snowpack/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/snowpack/node_modules/rollup": { - "version": "2.37.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.37.1.tgz", - "integrity": "sha512-V3ojEeyGeSdrMSuhP3diBb06P+qV4gKQeanbDv+Qh/BZbhdZ7kHV0xAt8Yjk4GFshq/WjO7R4c7DFM20AwTFVQ==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.2" - } - }, - "node_modules/snowpack/node_modules/rollup/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/snowpack/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/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "dev": true, - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socks/node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead", - "dev": true - }, - "node_modules/spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true - }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/split2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/standard-version": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", - "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", - "dev": true, - "dependencies": { - "chalk": "^2.4.2", - "conventional-changelog": "3.1.25", - "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.6.3", - "conventional-recommended-bump": "6.1.0", - "detect-indent": "^6.0.0", - "detect-newline": "^3.1.0", - "dotgitignore": "^2.1.0", - "figures": "^3.1.0", - "find-up": "^5.0.0", - "git-semver-tags": "^4.0.0", - "semver": "^7.1.1", - "stringify-package": "^1.0.1", - "yargs": "^16.0.0" - }, - "bin": { - "standard-version": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/standard-version/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/standard-version/node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/standard-version/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/standard-version/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/standard-version/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/standard-version/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/standard-version/node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stream-read-all": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", - "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/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/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/string-width/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/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stringify-object/node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stringify-package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", - "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", - "deprecated": "This module is not used anymore, and has been replaced by @npmcli/package-json", - "dev": true - }, - "node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.0" - }, - "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": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/systemjs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.14.2.tgz", - "integrity": "sha512-1TlOwvKWdXxAY9vba+huLu99zrQURDWA8pUTYsRIYDZYQbGyK+pyEP4h4dlySsqo7ozyJBmYD20F+iUHhAltEg==", - "dev": true - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/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/table/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/table/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/table/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/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/table/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/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar-stream/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/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/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "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/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "node_modules/treeverse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-1.0.4.tgz", - "integrity": "sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==", - "dev": true - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "dependencies": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "typescript": ">=2.7" - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/ts-simple-type": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/ts-simple-type/-/ts-simple-type-1.0.7.tgz", - "integrity": "sha512-zKmsCQs4dZaeSKjEA7pLFDv7FHHqAFLPd0Mr//OIJvu8M+4p4bgSFJwZSEBEg3ec9W7RzRz1vi8giiX0+mheBQ==", - "dev": true - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "dev": true, - "engines": { - "node": ">=0.6.x" - } - }, - "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/tsutils/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/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typedoc": { - "version": "0.21.10", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.21.10.tgz", - "integrity": "sha512-Y0wYIehkjkPfsp3pv86fp3WPHUcOf8pnQUDLwG1PqSccUSqdsv7Pz1Gd5WrTJvXQB2wO1mKlZ8qW8qMiopKyjA==", - "dev": true, - "dependencies": { - "glob": "^7.1.7", - "handlebars": "^4.7.7", - "lunr": "^2.3.9", - "marked": "^4.0.10", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shiki": "^0.9.8", - "typedoc-default-themes": "^0.12.10" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 12.10.0" - }, - "peerDependencies": { - "typescript": "4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x" - } - }, - "node_modules/typedoc-default-themes": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz", - "integrity": "sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/typedoc-plugin-markdown": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.10.4.tgz", - "integrity": "sha512-if9w7S9fXLg73AYi/EoRSEhTOZlg3I8mIP8YEmvzSE33VrNXC9/hA0nVcLEwFVJeQY7ay6z67I6kW0KIv7LjeA==", - "dev": true, - "dependencies": { - "handlebars": "^4.7.7" - }, - "peerDependencies": { - "typedoc": ">=0.21.2" - } - }, - "node_modules/typedoc/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/typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ua-parser-js": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", - "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/untildify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", - "integrity": "sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dev": true, - "dependencies": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/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/update-notifier/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier/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/update-notifier/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/update-notifier/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/update-notifier/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/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/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "dependencies": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" - } - }, - "node_modules/useragent/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/useragent/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/util/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==", - "dev": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "dependencies": { - "builtins": "^1.0.3" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/vm2": { - "version": "3.9.19", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", - "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", - "deprecated": "The library contains critical security issues and should not be used for production! The maintenance of the project has been discontinued. Consider migrating your code to isolated-vm.", - "dev": true, - "dependencies": { - "acorn": "^8.7.0", - "acorn-walk": "^8.2.0" - }, - "bin": { - "vm2": "bin/vm2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/vm2/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", - "dev": true - }, - "node_modules/walk-up-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", - "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", - "dev": true - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/web-component-analyzer": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/web-component-analyzer/-/web-component-analyzer-1.1.7.tgz", - "integrity": "sha512-SqCqN4nU9fU+j0CKXJQ8E4cslLsaezhagY6xoi+hoNPPd55GzR6MY1r5jkoJUVu+g4Wy4uB+JglTt7au4vQ1uA==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.2", - "ts-simple-type": "~1.0.5", - "typescript": "^3.8.3", - "yargs": "^15.3.1" - }, - "bin": { - "wca": "cli.js", - "web-component-analyzer": "cli.js" - } - }, - "node_modules/web-component-analyzer/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/web-component-analyzer/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/web-component-analyzer/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/web-component-analyzer/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/web-component-analyzer/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/web-component-analyzer/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/web-component-analyzer/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/web-component-analyzer/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/web-component-analyzer/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/web-component-analyzer/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/web-component-analyzer/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/web-component-analyzer/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/web-component-analyzer/node_modules/typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/web-component-analyzer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/web-component-analyzer/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/web-component-analyzer/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/web-component-analyzer/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "dependencies": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/wheel": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wheel/-/wheel-1.0.0.tgz", - "integrity": "sha512-XiCMHibOiqalCQ+BaNSwRoZ9FDTAvOsXxGHXChBugewDj7HC8VBIER71dEOiRH1fSdLbRCQzngKTSiZ06ZQzeA==" - }, - "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/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wicg-inert": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/wicg-inert/-/wicg-inert-3.1.2.tgz", - "integrity": "sha512-Ba9tGNYxXwaqKEi9sJJvPMKuo063umUPsHN0JJsjrs2j8KDSzkWLMZGZ+MH1Jf1Fq4OWZ5HsESJID6nRza2ang==" - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/workbox-background-sync": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", - "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", - "dev": true, - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", - "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", - "dev": true, - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-build": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", - "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", - "dev": true, - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.6.0", - "workbox-broadcast-update": "6.6.0", - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-google-analytics": "6.6.0", - "workbox-navigation-preload": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-range-requests": "6.6.0", - "workbox-recipes": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0", - "workbox-streams": "6.6.0", - "workbox-sw": "6.6.0", - "workbox-window": "6.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dev": true, - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/workbox-build/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/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", - "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", - "deprecated": "workbox-background-sync@6.6.0", - "dev": true, - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-cli": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-cli/-/workbox-cli-6.6.0.tgz", - "integrity": "sha512-EW+jbxWJlPqjwr0vse925tKq591APTq5d3/DWEh97KGI/JFb/Fzlckk1TRoU4d50Xr6IqlKkOZJUYRmqONf+VQ==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "chokidar": "^3.5.2", - "common-tags": "^1.8.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "inquirer": "^7.3.3", - "meow": "^7.1.0", - "ora": "^5.0.0", - "pretty-bytes": "^5.3.0", - "stringify-object": "^3.3.0", - "upath": "^1.2.0", - "update-notifier": "^4.1.0", - "workbox-build": "6.6.0" - }, - "bin": { - "workbox": "build/bin.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/workbox-cli/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/workbox-cli/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/workbox-cli/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/workbox-cli/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/workbox-cli/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/workbox-cli/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/workbox-cli/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/workbox-cli/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/workbox-cli/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/workbox-cli/node_modules/meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/workbox-cli/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/workbox-cli/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/workbox-cli/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/workbox-cli/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/workbox-cli/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/workbox-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", - "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", - "dev": true - }, - "node_modules/workbox-expiration": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", - "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", - "dev": true, - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-google-analytics": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", - "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", - "dev": true, - "dependencies": { - "workbox-background-sync": "6.6.0", - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", - "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", - "dev": true, - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-precaching": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", - "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", - "dev": true, - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-range-requests": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", - "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", - "dev": true, - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-recipes": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", - "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", - "dev": true, - "dependencies": { - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-routing": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", - "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", - "dev": true, - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-strategies": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", - "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", - "dev": true, - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-streams": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", - "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", - "dev": true, - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0" - } - }, - "node_modules/workbox-sw": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", - "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", - "dev": true - }, - "node_modules/workbox-window": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", - "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", - "dev": true, - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.6.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/wrap-ansi/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/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/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/yamlparser": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/yamlparser/-/yamlparser-0.0.2.tgz", - "integrity": "sha512-Cou9FCGblEENtn1/8La5wkDM/ISMh2bzu5Wh7dYzCzA0o9jD4YGyLkUJxe84oPBGoB92f+Oy4ZjVhA8S0C2wlQ==", - "dev": true - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/yargs-unparser/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/yargs-unparser/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs-unparser/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/yargs-unparser/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-unparser/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yargs-unparser/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/yargs-unparser/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "node_modules/ylru": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", - "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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": { - "@75lb/deep-merge": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@75lb/deep-merge/-/deep-merge-1.1.1.tgz", - "integrity": "sha512-xvgv6pkMGBA6GwdyJbNAnDmfAIR/DfWhrj9jgWh3TY7gRm3KO46x/GPjRg6wJ0nOepwqrNxFfojebh0Df4h4Tw==", - "dev": true, - "requires": { - "lodash.assignwith": "^4.2.0", - "typical": "^7.1.1" - }, - "dependencies": { - "typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "dev": true - } - } - }, - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true - }, - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dev": true, - "requires": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", - "dev": true - }, - "@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - } - }, - "@babel/eslint-parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", - "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==", - "dev": true, - "peer": true, - "requires": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - } - }, - "@babel/eslint-plugin": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.22.10.tgz", - "integrity": "sha512-SRZcvo3fnO5h79B9DZSV6LG2vHH7OWsSNp1huFLHsXKyytRG413byQk9zxW1VcPOhnzfx2VIUz+8aGbiE7fOkA==", - "dev": true, - "peer": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dev": true, - "requires": { - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - } - }, - "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - } - }, - "@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", - "dev": true, - "requires": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - } - }, - "@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "dev": true, - "requires": {} - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - } - }, - "@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - } - }, - "@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.23.2", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - } - }, - "@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/runtime-corejs3": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.2.tgz", - "integrity": "sha512-54cIh74Z1rp4oIjsHjqN+WM4fMyCBYe+LpZ9jWm51CZ1fbH3SkAzQD/3XLoNkjbJ7YEmjobLXyvQrFypRHOrXw==", - "dev": true, - "requires": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@commitlint/cli": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-13.2.1.tgz", - "integrity": "sha512-JGzYk2ay5JkRS5w+FLQzr0u/Kih52ds4HPpa3vnwVOQN8Q+S1VYr8Nk/6kRm6uNYsAcC1nejtuDxRdLcLh/9TA==", - "dev": true, - "requires": { - "@commitlint/format": "^13.2.0", - "@commitlint/lint": "^13.2.0", - "@commitlint/load": "^13.2.1", - "@commitlint/read": "^13.2.0", - "@commitlint/types": "^13.2.0", - "lodash": "^4.17.19", - "resolve-from": "5.0.0", - "resolve-global": "1.0.0", - "yargs": "^17.0.0" - } - }, - "@commitlint/config-conventional": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-13.2.0.tgz", - "integrity": "sha512-7u7DdOiF+3qSdDlbQGfpvCH8DCQdLFvnI2+VucYmmV7E92iD6t9PBj+UjIoSQCaMAzYp27Vkall78AkcXBh6Xw==", - "dev": true, - "requires": { - "conventional-changelog-conventionalcommits": "^4.3.1" - } - }, - "@commitlint/ensure": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-13.2.0.tgz", - "integrity": "sha512-rqhT62RehdLTRBu8OrPHnRCCd/7RmHEE4TiTlT4BLlr5ls5jlZhecOQWJ8np872uCNirrJ5NFjnjYYdbkNoW9Q==", - "dev": true, - "requires": { - "@commitlint/types": "^13.2.0", - "lodash": "^4.17.19" - } - }, - "@commitlint/execute-rule": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-13.2.0.tgz", - "integrity": "sha512-6nPwpN0hwTYmsH3WM4hCdN+NrMopgRIuQ0aqZa+jnwMoS/g6ljliQNYfL+m5WO306BaIu1W3yYpbW5aI8gEr0g==", - "dev": true - }, - "@commitlint/format": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-13.2.0.tgz", - "integrity": "sha512-yNBQJe6YFhM1pJAta4LvzQxccSKof6axJH7ALYjuhQqfT8AKlad7Y/2SuJ07ioyreNIqwOTuF2UfU8yJ7JzEIQ==", - "dev": true, - "requires": { - "@commitlint/types": "^13.2.0", - "chalk": "^4.0.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, - "@commitlint/is-ignored": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-13.2.0.tgz", - "integrity": "sha512-onnx4WctHFPPkHGFFAZBIWRSaNwuhixIIfbwPhcZ6IewwQX5n4jpjwM1GokA7vhlOnQ57W7AavbKUGjzIVtnRQ==", - "dev": true, - "requires": { - "@commitlint/types": "^13.2.0", - "semver": "7.3.5" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@commitlint/lint": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-13.2.0.tgz", - "integrity": "sha512-5XYkh0e9ehHjA7BxAHFpjPgr1qqbFY8OFG1wpBiAhycbYBtJnQmculA2wcwqTM40YCUBqEvWFdq86jTG8fbkMw==", - "dev": true, - "requires": { - "@commitlint/is-ignored": "^13.2.0", - "@commitlint/parse": "^13.2.0", - "@commitlint/rules": "^13.2.0", - "@commitlint/types": "^13.2.0" - } - }, - "@commitlint/load": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-13.2.1.tgz", - "integrity": "sha512-qlaJkj0hfa9gtWRfCfbgFBTK3GYQRmjZhba4l9mUu4wV9lEZ4ICFlrLtd/8kaLXf/8xbrPhkAPkVFOAqM0YwUQ==", - "dev": true, - "requires": { - "@commitlint/execute-rule": "^13.2.0", - "@commitlint/resolve-extends": "^13.2.0", - "@commitlint/types": "^13.2.0", - "@endemolshinegroup/cosmiconfig-typescript-loader": "^3.0.2", - "chalk": "^4.0.0", - "cosmiconfig": "^7.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "typescript": "^4.4.3" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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 - }, - "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 - }, - "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" - } - }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true - } - } - }, - "@commitlint/message": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-13.2.0.tgz", - "integrity": "sha512-+LlErJj2F2AC86xJb33VJIvSt25xqSF1I0b0GApSgoUtQBeJhx4SxIj1BLvGcLVmbRmbgTzAFq/QylwLId7EhA==", - "dev": true - }, - "@commitlint/parse": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-13.2.0.tgz", - "integrity": "sha512-AtfKSQJQADbDhW+kuC5PxOyBANsYCuuJlZRZ2PYslOz2rvWwZ93zt+nKjM4g7C9ETbz0uq4r7/EoOsTJ2nJqfQ==", - "dev": true, - "requires": { - "@commitlint/types": "^13.2.0", - "conventional-changelog-angular": "^5.0.11", - "conventional-commits-parser": "^3.2.2" - } - }, - "@commitlint/read": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-13.2.0.tgz", - "integrity": "sha512-7db5e1Bn3re6hQN0SqygTMF/QX6/MQauoJn3wJiUHE93lvwO6aFQxT3qAlYeyBPwfWsmDz/uSH454jtrSsv3Uw==", - "dev": true, - "requires": { - "@commitlint/top-level": "^13.2.0", - "@commitlint/types": "^13.2.0", - "fs-extra": "^10.0.0", - "git-raw-commits": "^2.0.0" - } - }, - "@commitlint/resolve-extends": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-13.2.0.tgz", - "integrity": "sha512-HLCMkqMKtvl1yYLZ1Pm0UpFvd0kYjsm1meLOGZ7VkOd9G/XX+Fr1S2G5AT2zeiDw7WUVYK8lGVMNa319bnV+aw==", - "dev": true, - "requires": { - "import-fresh": "^3.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "resolve-global": "^1.0.0" - } - }, - "@commitlint/rules": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-13.2.0.tgz", - "integrity": "sha512-O3A9S7blOzvHfzrJrUQe9JxdtGy154ol/GXHwvd8WfMJ10y5ryBB4b6+0YZ1XhItWzrEASOfOKbD++EdLV90dQ==", - "dev": true, - "requires": { - "@commitlint/ensure": "^13.2.0", - "@commitlint/message": "^13.2.0", - "@commitlint/to-lines": "^13.2.0", - "@commitlint/types": "^13.2.0", - "execa": "^5.0.0" - } - }, - "@commitlint/to-lines": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-13.2.0.tgz", - "integrity": "sha512-ZfWZix2y/CzewReCrj5g0nKOEfj5HW9eBMDrqjJJMPApve00CWv0tYrFCGXuGlv244lW4uvWJt6J/0HLRWsfyg==", - "dev": true - }, - "@commitlint/top-level": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-13.2.0.tgz", - "integrity": "sha512-knBvWYbIq6VV6VPHrVeDsxDiJq4Zq6cv5NIYU3iesKAsmK2KlLfsZPa+Ig96Y4AqAPU3zNJwjHxYkz9qxdBbfA==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - }, - "@commitlint/types": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-13.2.0.tgz", - "integrity": "sha512-RRVHEqmk1qn/dIaSQhvuca6k/6Z54G+r/KyimZ8gnAFielGiGUpsFRhIY3qhd5rXClVxDaa3nlcyTWckSccotQ==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, - "@endemolshinegroup/cosmiconfig-typescript-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz", - "integrity": "sha512-QRVtqJuS1mcT56oHpVegkKBlgtWjXw/gHNWO3eL9oyB5Sc7HBoc2OLG/nYpVfT/Jejvo3NUrD0Udk7XgoyDKkA==", - "dev": true, - "requires": { - "lodash.get": "^4", - "make-error": "^1", - "ts-node": "^9", - "tslib": "^2" - } - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "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 - } - } - }, - "@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@hutson/parse-repository-url": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", - "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", - "dev": true - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", - "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "@koa/cors": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/@koa/cors/-/cors-3.4.3.tgz", - "integrity": "sha512-WPXQUaAeAMVaLTEFpoq3T2O1C+FstkjJnDQqy95Ck1UdILajsRhu6mhJ8H2f4NFPRBoCNN+qywTJfq/gGki5mw==", - "dev": true, - "requires": { - "vary": "^1.1.2" - } - }, - "@material/animation": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-R1QbY4fC6RBOoi4Dq/3yuD5OK0ts02WxGt1JXaddsdnO6szZJcfXm2aiCweU1GUpchoah+YzDBJrsmSoqFCKIg==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@material/base": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-bCxGPqFQPh3rfBdqG+UvlrnRPSP2CzHhn0f44NqELY/SkmujIfS30rJOX965IKoD6lGdKWIfi/sAm03I81pZ7g==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@material/button": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-FV44k7WH8d0Z7TjKldEILWXG+bgVz0CplqAYiPiRoxIaGljOq/D7+enuC8tJOUst+zyihVSKyYT69ghWuOKjjg==", - "requires": { - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/touch-target": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/density": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/density/-/density-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-uCOzDL3U8EAOU6A+3lwbys6lB5P24PwEsNoe5YoB7CmkNS+8LLFPdemp4dMdVY2xGlDX+McaUOKJKmFub4cPUA==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@material/dialog": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-WOK+HN7HQa3mHvNEsEnleDOHCLRAbpFOhGuGyqnSDOCyxTl2DcNCUqsWupDVDpAlLv2OfLdmceyJrejMF+8q7g==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/button": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/icon-button": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/touch-target": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/dom": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/dom/-/dom-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-9XvFE2OuOZizYXF3ptyMcJuN/JHZA4vKq5lPLrIbcTXnd4DzJ7L4JrMcMb75xfjugxj8uaXjdfI62gwHfzP/aw==", - "requires": { - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/drawer": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-a5tGNXOXJglDpq/5blE3ZxbfTnuYU6pnkswWHliSUc71fC1A6XmK51vLz/PCGPGV3qL8JS2sakOVMdssRuLPxA==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/list": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/elevation": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-fuOG6w7Crz+9iibkBAXOQGYBWMCDZSvXA9PlZFW1JFCHUWyzzTMJeJIaHAVMHFzhbVF/rjqF6CliDZyAz4fULg==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/feature-targeting": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-e72VDSIMrwF5aX4rkQcO1AHewX/ydWOujFtMBk4QD/asyDPKBv+bKwO6f/msM+Wqen8I+DbHC0PH/2K15gQ3pQ==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@material/floating-label": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-MZIVki9uD6JMyfQ6v5FIgt2WEZQ3fOCpoOiE8c9cHuNiawVJc3pmoA5wT/38hJs3iMCx86D1jL1vK9UdyIdF7A==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/form-field": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-wYNyh1RMqEviuWcredWYx8ENEjR1GYdQu/NE9SKlfK7zKsFxF7szwHDd/3cZd7BSYVJUeylveDW+KgXQaW0YpQ==", - "requires": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/icon-button": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-2cKO9FIEYwQqd6qlvuC2IbZQ3m8xvw690sx+H/+1UFs17TY/STDfJRj1p5qf+MnIqaiz5jsoxQemuUkcej+uBw==", - "requires": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/touch-target": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/line-ripple": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-9LL/d3jWNesupmwvZtNbV2B1rc1i5BHatFgVt62B1xvfaViRL7EyS0K/+kv9SPWU6nqPLfdj33vOMukn2zIgAg==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/linear-progress": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-SuEJPdtMbY9hN7X8s9Y8MzVfnmQy32gi4cSIv3r3aL5wmfO29Dg5Gw8OkggEuVjy0QKTXSN9N74WdCdpQ5rUPw==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/progress-indicator": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/list": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/list/-/list-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-Vai+ggNyDBuWM0ihBs3ELGEKCdRmFoTFEhfcZ321VEI2YE8EY6eW1tvazzBfSzpLZkrqcn2QkqD6UpQBzkp4AA==", - "requires": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/menu": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/menu/-/menu-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-8JMFM/QdIC+CRDf79uSe5b4/kCF+3Re90OYlCVaT8LyfYGzYNtBQ8LPKaWlmS2fRN0eIBd1faoUGO0bvslulhg==", - "requires": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/list": "12.0.0-canary.22d29cbb4.0", - "@material/menu-surface": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/menu-surface": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-kvfewRPo4sJtGzBK/T94jjRYnnIaQbC5xqQ+AmGZHGUBsV713cVE1IWVSm0d+7MbERsqKMG9/JZik2Um3YZetQ==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/mwc-base": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-base/-/mwc-base-0.22.1.tgz", - "integrity": "sha512-KtQf4lQUoTQuetfhfRbVJhsXVcpX74LP4JI/cLmx+SGbpG+pXXWf6VI2MvZY2UoHVEkldqPHndeuqctBoY7vgg==", - "requires": { - "@material/base": "=12.0.0-canary.22d29cbb4.0", - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-button": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-button/-/mwc-button-0.22.1.tgz", - "integrity": "sha512-Z+NOM+d7QkmIOGbVT7BA/rzLJMXGaxC4Bp+dXcm3ESu6ohPBtG878IyZGSGiMXXDtmAKgMAIp74z4gE/Y0j1pA==", - "requires": { - "@material/mwc-icon": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-checkbox": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-checkbox/-/mwc-checkbox-0.22.1.tgz", - "integrity": "sha512-JfUEVWAos/sscPH1k9oUKhjtCbTuU4rl7GgKcenCF6EnxTaXbzxGJKPz28BUS5I14JM7vHNUwfqTC+M/87tNxg==", - "requires": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-dialog": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-dialog/-/mwc-dialog-0.22.1.tgz", - "integrity": "sha512-NHHtsled57N2EjDLelEN5YeJSpW/PYxayA+d2B2zpQPbhqhl//VKxJ9fA6CPm1uc+Cvp2G7lbZ2oUUSQivu+Aw==", - "requires": { - "@material/dialog": "=12.0.0-canary.22d29cbb4.0", - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/mwc-button": "^0.22.1", - "blocking-elements": "^0.1.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1", - "wicg-inert": "^3.0.0" - } - }, - "@material/mwc-drawer": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-drawer/-/mwc-drawer-0.22.1.tgz", - "integrity": "sha512-klwo4VMIIeV4UY+0t4HJ5/2Z8hUjsPHoleEFamRf97yVgPnmCHHaXhe7fjq8srxgkXK81PzwA7PFGBofS248ag==", - "requires": { - "@material/drawer": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "blocking-elements": "^0.1.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1", - "wicg-inert": "^3.0.0" - } - }, - "@material/mwc-fab": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-fab/-/mwc-fab-0.22.1.tgz", - "integrity": "sha512-KFzZFFr/Nq3bJ0JJyEy7SHsvVLhoqMCTELEjcy2s4fZYT1mLUmHK+Iip1vuKP2I96Yvnym4wkFEcwz/zAMCWbA==", - "requires": { - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-floating-label": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-floating-label/-/mwc-floating-label-0.22.1.tgz", - "integrity": "sha512-BkFt9WL8RE05JESv73egh7XUsmXALL78u1ev98T579SER3kwfIepQhXTvAAnFRHFa7QjT8qa/U6RmsvHe1zYbg==", - "requires": { - "@material/floating-label": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-formfield": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-formfield/-/mwc-formfield-0.22.1.tgz", - "integrity": "sha512-jk8YyX1STjh+HCQOjlEmtr+kVG8Nlkemh9GoVNkJoIH6k7n+WgYcVXoJtfGWJFBkO8kfHziRVeLRPGP8Nt8ErA==", - "requires": { - "@material/form-field": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-icon": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-icon/-/mwc-icon-0.22.1.tgz", - "integrity": "sha512-LX4MUThlYEBfpTr1O53J27KbzFhPbe2dBGouY9piztCI3FObbRVQI+LXFlXJm6KU0BzemaQfz105ZAuLlPAN4g==", - "requires": { - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-icon-button": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-icon-button/-/mwc-icon-button-0.22.1.tgz", - "integrity": "sha512-UHwWwzn9LrAKFmQLuKSMQZe1m+X0Xi//xAhLiIBOHaXyEH3QxmKr7pR82e8HQPc42+jUAxKUFmohMrppG6Dmcg==", - "requires": { - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-icon-button-toggle": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-icon-button-toggle/-/mwc-icon-button-toggle-0.22.1.tgz", - "integrity": "sha512-4r2Hvmo8qhYfEmWNUPvXxmBY0PTdN3JIFvn7d8WPukPgVSCfhh8o4MbxySoHcuo81A+2K/eMRAiLNY7Y8O5Aew==", - "requires": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-icon-button": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-line-ripple": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-line-ripple/-/mwc-line-ripple-0.22.1.tgz", - "integrity": "sha512-Wx2BHD+/z4Fm8TXyiv59UVeNAirunTfR3uCEjGMU/R7mXUwjpjOhY5bNYGUcP9VyMGG5CkLovc8XX96/iKs1ag==", - "requires": { - "@material/line-ripple": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-linear-progress": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-linear-progress/-/mwc-linear-progress-0.22.1.tgz", - "integrity": "sha512-GqqUDomF1nZh6cN0Dgz41vphfvDR17+vdtYk1O5YU9ajW/yd+9SBqwbjfqo4g/jmCpJvMeKnBDZo3Hbc8KnK7g==", - "requires": { - "@material/linear-progress": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/theme": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-list": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-list/-/mwc-list-0.22.1.tgz", - "integrity": "sha512-NGfacR/vSHMte7BOrFM7Cafi+tRIeBH8vNFcpP7yjqPkYCXt/9cEw0j1KVtldCRi20V38vkewUKdh2v3DiP5dg==", - "requires": { - "@material/base": "=12.0.0-canary.22d29cbb4.0", - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "@material/list": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/mwc-checkbox": "^0.22.1", - "@material/mwc-radio": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-menu": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-menu/-/mwc-menu-0.22.1.tgz", - "integrity": "sha512-fY7dyxv9aIccMqPp0+ihbXfB8g7Khvz7tYhtVMLqb6CgpdXf06a/lW50eN0Mk4GC+mFyN36HKHDP7LMLFfsvlA==", - "requires": { - "@material/menu": "=12.0.0-canary.22d29cbb4.0", - "@material/menu-surface": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/mwc-list": "^0.22.1", - "@material/shape": "=12.0.0-canary.22d29cbb4.0", - "@material/theme": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-notched-outline": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-notched-outline/-/mwc-notched-outline-0.22.1.tgz", - "integrity": "sha512-Bi+CKK24/ypgQZech+vUOWPR8hjPxXILf+mt5liVoNXddGITbdFAShFndNb4Ln4Rn3omzvC63enhpYSS4ByRNw==", - "requires": { - "@material/mwc-base": "^0.22.1", - "@material/notched-outline": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-radio": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-radio/-/mwc-radio-0.22.1.tgz", - "integrity": "sha512-pFVuDl/bSCK7gVXC54Lsm6lMclt8MYk0u4yVsjaEUTeFk0xMK1ZvoXifIkW0IHhAJVmWgGpWX57wSzLrRZbUNw==", - "requires": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "@material/radio": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-ripple": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-ripple/-/mwc-ripple-0.22.1.tgz", - "integrity": "sha512-QQyWWPBZ6veWNbBMWo8WQw0iY9QUjLLANorug8mPHv13ETdhwVUUozeKOY0ZCXWupNlqtap1Gd0IQjv6HVRMjA==", - "requires": { - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/ripple": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-select": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-select/-/mwc-select-0.22.1.tgz", - "integrity": "sha512-P5o2DD48AtEpr+ZqbFlQ04GgSmcbhOTdQEeDBkDAxSsuErXQZgzY1aPCXlaDI0QzQ/gNP/13b4ejLqstVp9SQg==", - "requires": { - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "@material/floating-label": "=12.0.0-canary.22d29cbb4.0", - "@material/line-ripple": "=12.0.0-canary.22d29cbb4.0", - "@material/list": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/mwc-floating-label": "^0.22.1", - "@material/mwc-icon": "^0.22.1", - "@material/mwc-line-ripple": "^0.22.1", - "@material/mwc-list": "^0.22.1", - "@material/mwc-menu": "^0.22.1", - "@material/mwc-notched-outline": "^0.22.1", - "@material/select": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-snackbar": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-snackbar/-/mwc-snackbar-0.22.1.tgz", - "integrity": "sha512-4ZTb4Gk/zKJWvvqqKuOFo1NO68DnCgyQlktPdNNTGhCERdxkEQnZz+mkAw+Mfr5tCBizomgaFzd6tuAZCUutyQ==", - "requires": { - "@material/mwc-base": "^0.22.1", - "@material/snackbar": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-switch": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-switch/-/mwc-switch-0.22.1.tgz", - "integrity": "sha512-KDY3uqT2qTEw6Z9TS91Ucs0LViUcMsP1XHu6ZNhbv9Ai1uK/i8pwVWAIGIX9Cm1iCdjiYGfKm4DZLORDb/rfEQ==", - "requires": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "@material/switch": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-tab": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-tab/-/mwc-tab-0.22.1.tgz", - "integrity": "sha512-sNPE8kRQEH04vEStxiidTjpyuHc+5Wm8+OVU8wrf6ChJa8KUV5bi2blWm6PW4rfQRo2Bs8AarDXv15t4wv3XWg==", - "requires": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-ripple": "^0.22.1", - "@material/mwc-tab-indicator": "^0.22.1", - "@material/tab": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-tab-bar": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-tab-bar/-/mwc-tab-bar-0.22.1.tgz", - "integrity": "sha512-USn9pIMNfz2vPh7w2U55j0EVr82x3odq9VdcDGG5d4jWwzMPjJ9CKMjqgFrlIiPmxieD5zeSW0LauGhwv6ujOg==", - "requires": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-tab": "^0.22.1", - "@material/mwc-tab-scroller": "^0.22.1", - "@material/tab": "=12.0.0-canary.22d29cbb4.0", - "@material/tab-bar": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-tab-indicator": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-tab-indicator/-/mwc-tab-indicator-0.22.1.tgz", - "integrity": "sha512-/Q8vju7DAysqz3Fo+IINaGSeU9BinZbdaSUyRFjfrUWlzJCE6IYYB7zMyc2W+EjaxhjftpL/N3Sw50Xw+pAL+A==", - "requires": { - "@material/mwc-base": "^0.22.1", - "@material/tab-indicator": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-tab-scroller": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-tab-scroller/-/mwc-tab-scroller-0.22.1.tgz", - "integrity": "sha512-dqAsXS7Nyw61vVb6d11zDg0xuvAYfOyPmz6wLwcXxzSlHOCfkuFu2fcjhssZIlW3DzzzrCw7aZ+T6mHOZcr0dg==", - "requires": { - "@material/dom": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/tab-scroller": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-textarea": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-textarea/-/mwc-textarea-0.22.1.tgz", - "integrity": "sha512-ta5ARYpxaCRvseXTKkp8tFBfJ0oP8FWsE4FymrjV5b+UEAEzAzjcWWolIDyS7DdixSj1ROI5dJHsU/on5lWPjw==", - "requires": { - "@material/mwc-base": "^0.22.1", - "@material/mwc-textfield": "^0.22.1", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-textfield": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-textfield/-/mwc-textfield-0.22.1.tgz", - "integrity": "sha512-7xLlW2B1wMnCi2JSlOELELPEUda0w6bWpjn4LB4UPi1hAWG8VR+Rn5rR6q4NDav9pad+qA7+PGjNlE32xVUm7g==", - "requires": { - "@material/floating-label": "=12.0.0-canary.22d29cbb4.0", - "@material/line-ripple": "=12.0.0-canary.22d29cbb4.0", - "@material/mwc-base": "^0.22.1", - "@material/mwc-floating-label": "^0.22.1", - "@material/mwc-line-ripple": "^0.22.1", - "@material/mwc-notched-outline": "^0.22.1", - "@material/textfield": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-top-app-bar": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-top-app-bar/-/mwc-top-app-bar-0.22.1.tgz", - "integrity": "sha512-SHQLjMrHRYsJaT0+8rNjkYW9LDi93AsGX+USuCYhVPeMhBUcqVmr09lTCqj3xyJ3JAy43XONPhtXjxlMT1jCNg==", - "requires": { - "@material/mwc-base": "^0.22.1", - "@material/top-app-bar": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "lit-html": "^1.4.1", - "tslib": "^2.0.1" - } - }, - "@material/mwc-top-app-bar-fixed": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/@material/mwc-top-app-bar-fixed/-/mwc-top-app-bar-fixed-0.22.1.tgz", - "integrity": "sha512-ZpQGKmqmSHp1izqX1U0S+3E8s5xLSB81cjFlQPFKG6arU6TO8Xqyzd05JPfFHfau5aZeHQuJB0MOGN2QT31UCw==", - "requires": { - "@material/mwc-top-app-bar": "^0.22.1", - "@material/top-app-bar": "=12.0.0-canary.22d29cbb4.0", - "lit-element": "^2.5.1", - "tslib": "^2.0.1" - } - }, - "@material/notched-outline": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-LgVwQri2sI/EnAbSjyyzhifjcBKpYO48oy6HyRg6Cq/ZxOgNv3u/VG4fE3ToyNLe8pMPkfQsn2g8czuZoRYwxg==", - "requires": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/floating-label": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/progress-indicator": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-XnG61vDDUPQWK3obQcPHaTPxEKFfPKo8qtiKxkFnGdzIeezDGj7n9m8gdvzcqed8rGZWCNKYOzodkRfplStpMw==", - "requires": { - "tslib": "^2.1.0" - } - }, - "@material/radio": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/radio/-/radio-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-piGy+6YEtW3odicIImRGnc3uY0iD42IAe4+pnVo36KsfHLm5peYuEc0jrLI4zdmOPYlRxSskIbAAzfMKdwKG1A==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/touch-target": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/ripple": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-IzBtXi4EWx27Hkfd5Zkx/MrZAXJZe0AAQCo37Etl/af0/aJPIOyCOdHQiwoK2FqRH71pmNfUGrUWOeUxFyaSdw==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/rtl": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-R7u7w5U+mvRwsj15tpf/CbALs3FrGVidsTkv8C1uZDK1ae490De8HSe839lcFcXmM8c/PFSx5B3rKyQG2AyraQ==", - "requires": { - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/select": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/select/-/select-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-ROpNqkHkv/ZUWNf4tWxDo/L6P2QwWaNKADSqYpg/XXecAm7NdBX5aDo63VCBPCm57JkAdBWJQB5MRrbkaWLTfA==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/floating-label": "12.0.0-canary.22d29cbb4.0", - "@material/line-ripple": "12.0.0-canary.22d29cbb4.0", - "@material/list": "12.0.0-canary.22d29cbb4.0", - "@material/menu": "12.0.0-canary.22d29cbb4.0", - "@material/menu-surface": "12.0.0-canary.22d29cbb4.0", - "@material/notched-outline": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/shape": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-yKC+cqdjGYg3sseZ4baNe9OLhBENHwX2SpJGZORZ7ix4/8pxzFG3wO80eZ8LsldzYem9MmtcbRilBZ4rvvxh0A==", - "requires": { - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/snackbar": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-NDYR2rYyF2kbQYCec/I0NmAPtnXMBpGYEQ4/m10rAzTP2hsyySZs0cKk54/V3czT+gFz9C9W3zCm1CwgJwL5fA==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/button": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/icon-button": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/switch": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/switch/-/switch-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-kubSphtXl74TC/PAjp67lYi7Ngk0MEKTLzp1ZHiMHElew2Z9/IYHP0pPaQRTkBY0ddIx6hVdHMiMf8qB4zuz2w==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/tab": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/tab/-/tab-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-Tmb+8Dsx7wItbqOW4JHUVIq3I/inM3l/gk6EV/ctNeyz8coPIJL39yN4CcTX+VHsYykF+tK3jz4QSQX0ASfimQ==", - "requires": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/tab-indicator": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/tab-bar": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-cxGyfONh9tFK2tISHDSAWFfH/uxH/HfTTjuDQIiPkOLmr6oVgGPXP2AdsZ0Z60HJCAedbR9mdWCesEk8w4f8+Q==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/tab": "12.0.0-canary.22d29cbb4.0", - "@material/tab-indicator": "12.0.0-canary.22d29cbb4.0", - "@material/tab-scroller": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/tab-indicator": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-7MeJG5bN7WCyNsjT+7iGci2XuIkwUXA3QRz3La2zKPBxnPkRiz7GUwkpr1b5h6wPpYfCWKyCbixQD9Ufgq3kKA==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/tab-scroller": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-IaFQiwJ/MKhbFvKcGmlAFNHCxXf5THyjefgzav/k0Fu49vzQFA1ZiSTvPU7/d0vV/G2amaba+l5w9TP9/n4KFw==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/tab": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/textfield": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-OJMgS0iniOvnRJa5DWyFqg1VIC77KEdoXern9OQiQphUE1LJ2Kbbwwj0GgyULuxhcUlUSnnisw+J5IfWK7kMUg==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/density": "12.0.0-canary.22d29cbb4.0", - "@material/dom": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/floating-label": "12.0.0-canary.22d29cbb4.0", - "@material/line-ripple": "12.0.0-canary.22d29cbb4.0", - "@material/notched-outline": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/theme": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-r4xYCgc+CrbvDxCINVqXwAFWQ1WgV3s2+bUse/2iw53YqyemhhtzFjfp+DXLdC4zJSOuObWC45eaDKeseLMGMw==", - "requires": { - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/top-app-bar": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-fTS0kOHyUAKBhtz8olDvsCtZ6VxJEJ5QNUAZdHbJsTjig87poLLUP2CKJ18t5DjzW/KFMFjNYMSbah6NOREvqg==", - "requires": { - "@material/animation": "12.0.0-canary.22d29cbb4.0", - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/elevation": "12.0.0-canary.22d29cbb4.0", - "@material/ripple": "12.0.0-canary.22d29cbb4.0", - "@material/rtl": "12.0.0-canary.22d29cbb4.0", - "@material/shape": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "@material/typography": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/touch-target": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-aPEMmR+xRI5ywD9JM+njTgU14CCsgRSS7CLZwd+wsfJkMYPCi8rBM3t23bu/jILa4IT6TIe32Ew1xIBVxJNpgQ==", - "requires": { - "@material/base": "12.0.0-canary.22d29cbb4.0", - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@material/typography": { - "version": "12.0.0-canary.22d29cbb4.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-12.0.0-canary.22d29cbb4.0.tgz", - "integrity": "sha512-lIzU4IFjaSfVRbhsabTiri8CD+fEe9/DaGpoDm89sHm7b8RbN1+m+7OrePICcWgWFo2swRndph8qhzh7gTYdew==", - "requires": { - "@material/feature-targeting": "12.0.0-canary.22d29cbb4.0", - "@material/theme": "12.0.0-canary.22d29cbb4.0", - "tslib": "^2.1.0" - } - }, - "@mdn/browser-compat-data": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-4.2.1.tgz", - "integrity": "sha512-EWUguj2kd7ldmrF9F+vI5hUOralPd+sdsUnYbRy33vZTuZkduC1shE9TtEMEjAQwyfyMb4ole5KtjF8MsnQOlA==", - "dev": true - }, - "@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true - }, - "@microsoft/tsdoc-config": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", - "dev": true, - "requires": { - "@microsoft/tsdoc": "0.14.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - }, - "dependencies": { - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - } - } - }, - "@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "peer": true, - "requires": { - "eslint-scope": "5.1.1" - } - }, - "@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" - } - }, - "@npmcli/arborist": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-2.10.0.tgz", - "integrity": "sha512-CLnD+zXG9oijEEzViimz8fbOoFVb7hoypiaf7p6giJhvYtrxLAyY3cZAMPIFQvsG731+02eMDp3LqVBNo7BaZA==", - "dev": true, - "requires": { - "@isaacs/string-locale-compare": "^1.0.1", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^1.0.2", - "@npmcli/metavuln-calculator": "^1.1.0", - "@npmcli/move-file": "^1.1.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^1.0.1", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^1.8.2", - "bin-links": "^2.2.1", - "cacache": "^15.0.3", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.1.5", - "npm-pick-manifest": "^6.1.0", - "npm-registry-fetch": "^11.0.0", - "pacote": "^11.3.5", - "parse-conflict-json": "^1.1.1", - "proc-log": "^1.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "ssri": "^8.0.1", - "treeverse": "^1.0.4", - "walk-up-path": "^1.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@npmcli/fs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz", - "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==", - "dev": true, - "requires": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@npmcli/git": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", - "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", - "dev": true, - "requires": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", - "dev": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "@npmcli/map-workspaces": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-1.0.4.tgz", - "integrity": "sha512-wVR8QxhyXsFcD/cORtJwGQodeeaDf0OxcHie8ema4VgFeqwYkFsDPnSrIRSytX8xR6nKPAH89WnwTcaU608b/Q==", - "dev": true, - "requires": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.1.6", - "minimatch": "^3.0.4", - "read-package-json-fast": "^2.0.1" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "@npmcli/metavuln-calculator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-1.1.1.tgz", - "integrity": "sha512-9xe+ZZ1iGVaUovBVFI9h3qW+UuECUzhvZPxK9RaEA2mjU26o5D0JloGYWwLYvQELJNmBdQB6rrpuN8jni6LwzQ==", - "dev": true, - "requires": { - "cacache": "^15.0.5", - "pacote": "^11.1.11", - "semver": "^7.3.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", - "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", - "dev": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/name-from-folder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-1.0.1.tgz", - "integrity": "sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==", - "dev": true - }, - "@npmcli/node-gyp": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", - "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", - "dev": true - }, - "@npmcli/package-json": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-1.0.1.tgz", - "integrity": "sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "@npmcli/promise-spawn": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", - "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", - "dev": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, - "@npmcli/run-script": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-1.8.6.tgz", - "integrity": "sha512-e42bVZnC6VluBZBAFEr3YrdqSspG3bgilyg4nSLBJ7TRGNCzxHa92XAHxQBLYg0BmgwO4b2mf3h/l5EkEWRn3g==", - "dev": true, - "requires": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" - } - }, - "@open-wc/building-utils": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/@open-wc/building-utils/-/building-utils-2.21.1.tgz", - "integrity": "sha512-wCyxkvkcA7vRwXJeyrIpRhDbBrVlPGAgYKsuG9n1Pyxt2aypthtZR+1q0+wPkr6h1ZYgJnM9CWQYe72AaAXxvw==", - "dev": true, - "requires": { - "@babel/core": "^7.11.1", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@webcomponents/shadycss": "^1.10.2", - "@webcomponents/webcomponentsjs": "^2.5.0", - "arrify": "^2.0.1", - "browserslist": "^4.16.5", - "chokidar": "^3.4.3", - "clean-css": "^5.3.1", - "clone": "^2.1.2", - "core-js-bundle": "^3.8.1", - "deepmerge": "^4.2.2", - "es-module-shims": "^1.4.1", - "html-minifier-terser": "^5.1.1", - "lru-cache": "^6.0.0", - "minimatch": "^7.4.2", - "parse5": "^7.1.2", - "path-is-inside": "^1.0.2", - "regenerator-runtime": "^0.13.7", - "resolve": "^1.19.0", - "rimraf": "^3.0.2", - "shady-css-scoped-element": "^0.0.2", - "systemjs": "^6.8.3", - "terser": "^4.8.1", - "valid-url": "^1.0.9", - "whatwg-fetch": "^3.5.0", - "whatwg-url": "^7.1.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "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" - } - }, - "minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dev": true, - "requires": { - "entities": "^4.4.0" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@open-wc/chai-dom-equals": { - "version": "0.12.36", - "resolved": "https://registry.npmjs.org/@open-wc/chai-dom-equals/-/chai-dom-equals-0.12.36.tgz", - "integrity": "sha512-Gt1fa37h4rtWPQGETSU4n1L678NmMi9KwHM1sH+JCGcz45rs8DBPx7MUVeGZ+HxRlbEI5t9LU2RGGv6xT2OlyA==", - "dev": true, - "requires": { - "@open-wc/semantic-dom-diff": "^0.13.16", - "@types/chai": "^4.1.7" - }, - "dependencies": { - "@open-wc/semantic-dom-diff": { - "version": "0.13.21", - "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.13.21.tgz", - "integrity": "sha512-BONpjHcGX2zFa9mfnwBCLEmlDsOHzT+j6Qt1yfK3MzFXFtAykfzFjAgaxPetu0YbBlCfXuMlfxI4vlRGCGMvFg==", - "dev": true - } - } - }, - "@open-wc/dedupe-mixin": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz", - "integrity": "sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==", - "dev": true - }, - "@open-wc/eslint-config": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@open-wc/eslint-config/-/eslint-config-4.3.0.tgz", - "integrity": "sha512-kCxFWQ1AR4meTmWJGnK36LJYqDJeFGjlj6n4vLjAW3/c1VUyYQKL90vrNKy/OHS9kTjc9dcH5D64myAbNx6r1w==", - "dev": true, - "requires": { - "eslint": "^7.6.0", - "eslint-config-airbnb-base": "^14.0.0", - "eslint-plugin-html": "^6.0.0", - "eslint-plugin-import": "^2.18.2", - "eslint-plugin-lit": "^1.2.0", - "eslint-plugin-lit-a11y": "^1.0.1", - "eslint-plugin-no-only-tests": "^2.4.0", - "eslint-plugin-wc": "^1.2.0" - } - }, - "@open-wc/scoped-elements": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@open-wc/scoped-elements/-/scoped-elements-1.3.7.tgz", - "integrity": "sha512-q/wKf4sXl7cr1kNfl8z6TLO2TrpXsFMCrfCD51sCEljltwYIXOmI6SnRXmWlnzG37A8AwHRpDXYmjPj2F4gPxA==", - "dev": true, - "requires": { - "@open-wc/dedupe-mixin": "^1.3.0", - "lit-html": "^1.0.0" - } - }, - "@open-wc/semantic-dom-diff": { - "version": "0.19.9", - "resolved": "https://registry.npmjs.org/@open-wc/semantic-dom-diff/-/semantic-dom-diff-0.19.9.tgz", - "integrity": "sha512-iUL0OPA6PeLQVEEJ/gsgkEiwOGgK4E1KS//zTB+u+OAh0NifNTfxDxIHQa7rEGvplaq2b2zztT2yyzOzj+MlAA==", - "dev": true, - "requires": { - "@types/chai": "^4.3.1", - "@web/test-runner-commands": "^0.6.5" - } - }, - "@open-wc/testing": { - "version": "2.5.33", - "resolved": "https://registry.npmjs.org/@open-wc/testing/-/testing-2.5.33.tgz", - "integrity": "sha512-+EJNs0i+VV4nE+BrG70l2DNGXOZTSrluruaaU06HUSk57ZlKa+kIxWmkLxCOLlbgnQgrPrQWxbs3lgB1tIx/YA==", - "dev": true, - "requires": { - "@open-wc/chai-dom-equals": "^0.12.36", - "@open-wc/semantic-dom-diff": "^0.19.3", - "@open-wc/testing-helpers": "^1.8.12", - "@types/chai": "^4.2.11", - "@types/chai-dom": "^0.0.9", - "@types/mocha": "^5.2.7", - "@types/sinon-chai": "^3.2.3", - "chai": "^4.2.0", - "chai-a11y-axe": "^1.3.1", - "chai-dom": "^1.8.1", - "mocha": "^6.2.2", - "sinon-chai": "^3.5.0" - } - }, - "@open-wc/testing-helpers": { - "version": "1.8.12", - "resolved": "https://registry.npmjs.org/@open-wc/testing-helpers/-/testing-helpers-1.8.12.tgz", - "integrity": "sha512-+4exEHYvnFqI1RGDDIKFHPZ7Ws5NK1epvEku3zLaOYN3zc+huX19SndNc5+X++v8A+quN/iXbHlh80ROyNaYDA==", - "dev": true, - "requires": { - "@open-wc/scoped-elements": "^1.2.4", - "lit-element": "^2.2.1", - "lit-html": "^1.0.0" - } - }, - "@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - } - }, - "@rollup/plugin-commonjs": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-16.0.0.tgz", - "integrity": "sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "commondir": "^1.0.1", - "estree-walker": "^2.0.1", - "glob": "^7.1.6", - "is-reference": "^1.2.1", - "magic-string": "^0.25.7", - "resolve": "^1.17.0" - }, - "dependencies": { - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "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" - } - } - } - }, - "@rollup/plugin-inject": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-4.0.4.tgz", - "integrity": "sha512-4pbcU4J/nS+zuHk+c+OL3WtmEQhqxlZ9uqfjQMQDOHOPld7PsCd8k5LWs8h5wjwJN7MgnAn768F2sDxEP4eNFQ==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "estree-walker": "^2.0.1", - "magic-string": "^0.25.7" - }, - "dependencies": { - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - } - } - }, - "@rollup/plugin-json": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", - "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.0.8" - } - }, - "@rollup/plugin-node-resolve": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", - "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.1.0", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, - "@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - } - }, - "@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - } - }, - "@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "dev": true - }, - "@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", - "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sinonjs/samsam": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", - "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "@snowpack/plugin-typescript": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@snowpack/plugin-typescript/-/plugin-typescript-1.2.1.tgz", - "integrity": "sha512-wU+JNaMVkqGsqTaUY7TnEMhGt/3URTgA9dpMCtZX6wn/ceA7Gwlmue/sOLynf0OTNLygHPvjiQECQYkEi3LTtg==", - "dev": true, - "requires": { - "execa": "^5.0.0", - "npm-run-path": "^4.0.1" - } - }, - "@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dev": true, - "requires": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true - }, - "@types/accepts": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.6.tgz", - "integrity": "sha512-6+qlUg57yfE9OO63wnsJXLeq9cG3gSHBBIxNMOjNrbDRlDnm/NaR7RctfYcVCPq+j7d+MwOxqVEludH5+FKrlg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/babel__code-frame": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.5.tgz", - "integrity": "sha512-tE88HnYMl5iJAB1V9nJCrE1udmwGCoNvx2ayTa8nwkE3UMMRRljANO+sX8D321hIrqf1DlvhAPAo5G6DWaMQNg==", - "dev": true - }, - "@types/babel__core": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", - "integrity": "sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==", - "dev": true, - "requires": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "@types/babel__generator": { - "version": "7.6.6", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.6.tgz", - "integrity": "sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@types/babel__template": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.3.tgz", - "integrity": "sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==", - "dev": true, - "requires": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@types/babel__traverse": { - "version": "7.20.3", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.3.tgz", - "integrity": "sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==", - "dev": true, - "requires": { - "@babel/types": "^7.20.7" - } - }, - "@types/body-parser": { - "version": "1.19.4", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", - "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "@types/browserslist": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/@types/browserslist/-/browserslist-4.15.0.tgz", - "integrity": "sha512-h9LyKErRGZqMsHh9bd+FE8yCIal4S0DxKTOeui56VgVXqa66TKiuaIUxCAI7c1O0LjaUzOTcsMyOpO9GetozRA==", - "dev": true, - "requires": { - "browserslist": "*" - } - }, - "@types/browserslist-useragent": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/browserslist-useragent/-/browserslist-useragent-3.0.6.tgz", - "integrity": "sha512-ftxQ7LUTadTAEdeVcyqXjXktuHUKCQ0OhFpU22PD9jGOu+c7GeRVorh7S/0bpjZOMXeC1bkV3hvAkmZ4o9s3TA==", - "dev": true - }, - "@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "@types/caniuse-api": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/caniuse-api/-/caniuse-api-3.0.4.tgz", - "integrity": "sha512-ieat3NYs1+AQPyWqeNjY9vtfc7CPg1/BOlVxStyRy72Tu2PzewOdAxrnUrY0mWM6lBfDb+ohtP8EM9qgZhmPoA==", - "dev": true - }, - "@types/chai": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.9.tgz", - "integrity": "sha512-69TtiDzu0bcmKQv3yg1Zx409/Kd7r0b5F1PfpYJfSHzLGtB53547V4u+9iqKYsTu/O2ai6KTb0TInNpvuQ3qmg==", - "dev": true - }, - "@types/chai-dom": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@types/chai-dom/-/chai-dom-0.0.9.tgz", - "integrity": "sha512-jj4F2NJog2/GBYsyJ8+NvhnWUBbPY4MUAKLdPJE6+568rw12GGXvj0ycUuP5nndVrnJgozmJAoMTvxvjJATXWw==", - "dev": true, - "requires": { - "@types/chai": "*" - } - }, - "@types/co-body": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.2.tgz", - "integrity": "sha512-eUqBFu8mNW56oZAP0aEmGm+4qFeYjkxVThQ1F/8jFOBiSNM+gib3pYFzjnQsQRUZ501Eg8qOc7Nn76GcZo6Uvg==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*" - } - }, - "@types/command-line-args": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.2.tgz", - "integrity": "sha512-9aZ7KzLDOBYyqH5J2bvB9edvsMXusX+H/aS8idAJOpWNmscZG5RqO1CVJPFa4Q0/1xKgvxcweXunFVx2l/dYFA==", - "dev": true - }, - "@types/command-line-usage": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/command-line-usage/-/command-line-usage-5.0.3.tgz", - "integrity": "sha512-ZESq+MDjR7QpvFfuanzfoAwfzA9e/wUUH/5uEyaZpGwqEnNddBpsyzJWltUIMgXYy97//wD0aJFgKStoZ6o1SQ==", - "dev": true - }, - "@types/connect": { - "version": "3.4.37", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", - "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/content-disposition": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.7.tgz", - "integrity": "sha512-V9/5u21RHFR1zfdm3rQ6pJUKV+zSSVQt+yq16i1YhdivVzWgPEoKedc3GdT8aFjsqQbakdxuy3FnEdePUQOamQ==", - "dev": true - }, - "@types/convert-source-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-2.0.2.tgz", - "integrity": "sha512-M8jHZquUkvyaHtNVCKNoCqGmbbNFgRJ2JL607SPmcNUWqhU1spBaEJD7qlW3kMiQjKPlyyT4ZUbPG6vO4SYLBg==", - "dev": true - }, - "@types/cookies": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.9.tgz", - "integrity": "sha512-SrGYvhKohd/WSOII0WpflC73RgdJhQoqpwq9q+n/qugNGiDSGYXfHy3QvB4+X+J/gYe27j2fSRnK4B+1A3nvsw==", - "dev": true, - "requires": { - "@types/connect": "*", - "@types/express": "*", - "@types/keygrip": "*", - "@types/node": "*" - } - }, - "@types/debounce": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.3.tgz", - "integrity": "sha512-97mx7gWt4e+kd0wPa1pNEvE4tYGhgBVa4ExWOLcfFohAjF9wERfJ+3qrn7I1e76oHupOvRs4UyYe9xzy0i4TUw==", - "dev": true - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true - }, - "@types/etag": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@types/etag/-/etag-1.8.2.tgz", - "integrity": "sha512-z8Pbo2e+EZWMpuRPYSjhSivp2OEkqrMZBUfEAWlJC31WUCKveZ8ioWXHAC5BXRZfwxCBfYRhPij1YJHK1W6oDA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/express": { - "version": "4.17.20", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", - "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", - "dev": true, - "requires": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "@types/express-serve-static-core": { - "version": "4.17.39", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", - "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "@types/http-assert": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.4.tgz", - "integrity": "sha512-/6M9aaVk+avzCsrv1lt39AlFw4faCNI6aGll91Rxj38ZE5JI8AxApyQIRy+i1McjiJiuQ0sfuoMLxqq374ZIbA==", - "dev": true - }, - "@types/http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA==", - "dev": true - }, - "@types/http-errors": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", - "dev": true - }, - "@types/istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==", - "dev": true - }, - "@types/istanbul-lib-report": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz", - "integrity": "sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "*" - } - }, - "@types/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==", - "dev": true, - "requires": { - "@types/istanbul-lib-report": "*" - } - }, - "@types/json-schema": { - "version": "7.0.14", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", - "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/keygrip": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.4.tgz", - "integrity": "sha512-/tjWYD8StMrINelsrHNmpXceo9s3/Y22AzePH1qCvXIgmz/aQp2YFFr6HqhNQVIOdcvaVyp5GS+yjHGuF7Rwsg==", - "dev": true - }, - "@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/koa": { - "version": "2.13.10", - "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.10.tgz", - "integrity": "sha512-weKc5IBeORLDGwD1FMgPjaZIg0/mtP7KxXAXEzPRCN78k274D9U2acmccDNPL1MwyV40Jj+hQQ5N2eaV6O0z8g==", - "dev": true, - "requires": { - "@types/accepts": "*", - "@types/content-disposition": "*", - "@types/cookies": "*", - "@types/http-assert": "*", - "@types/http-errors": "*", - "@types/keygrip": "*", - "@types/koa-compose": "*", - "@types/node": "*" - } - }, - "@types/koa__cors": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/koa__cors/-/koa__cors-3.3.1.tgz", - "integrity": "sha512-aFGYhTFW7651KhmZZ05VG0QZJre7QxBxDj2LF1lf6GA/wSXEfKVAJxiQQWzRV4ZoMzQIO8vJBXKsUcRuvYK9qw==", - "dev": true, - "requires": { - "@types/koa": "*" - } - }, - "@types/koa-compose": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.7.tgz", - "integrity": "sha512-smtvSL/oLICPuenxy73OmxKGh42VVfn2o2eutReH1yjij0LmxADBpGcAJbp4N+yJjPapPN7jAX9p7Ue0JMQ/Ag==", - "dev": true, - "requires": { - "@types/koa": "*" - } - }, - "@types/koa-compress": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/@types/koa-compress/-/koa-compress-2.0.9.tgz", - "integrity": "sha512-1Sa9OsbHd2N2N7gLpdIRHe8W99EZbfIR31D7Iisx16XgwZCnWUtGXzXQejhu74Y1pE/wILqBP6VL49ch/MVpZw==", - "dev": true, - "requires": { - "@types/koa": "*", - "@types/node": "*" - } - }, - "@types/koa-etag": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/koa-etag/-/koa-etag-3.0.2.tgz", - "integrity": "sha512-+0AzCdTpMd0JGCYvsllwtcCxLsvZyaUkzufEx1MVAuBfun5dvKQcIk3lVAAlo7W+LJ86CC1ZHY9vHt3IoZLORA==", - "dev": true, - "requires": { - "@types/etag": "*", - "@types/koa": "*" - } - }, - "@types/koa-send": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/koa-send/-/koa-send-4.1.5.tgz", - "integrity": "sha512-O2qnxAKr7MoAxHHUitJejMWw45b9QtgTra0pnVDl/XoNdYTdZOgwj8wSVDon0qXg/lrcYHye4LFbAaSfSWwnrg==", - "dev": true, - "requires": { - "@types/koa": "*" - } - }, - "@types/koa-static": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/koa-static/-/koa-static-4.0.3.tgz", - "integrity": "sha512-4U9uZwXqYAudDLDVkw1prJM5avn9/lHLVEwoyyI/ITZluWkBdmirkj8EsOLG6kLr0XFZdViR0ZBtQ3oetSsr3g==", - "dev": true, - "requires": { - "@types/koa": "*", - "@types/koa-send": "*" - } - }, - "@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", - "dev": true - }, - "@types/marked": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-2.0.5.tgz", - "integrity": "sha512-shRZ7XnYFD/8n8zSjKvFdto1QNSf4tONZIlNEZGrJe8GsOE8DL/hG1Hbl8gZlfLnjS7+f5tZGIaTgfpyW38h4w==", - "dev": true - }, - "@types/mime": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", - "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", - "dev": true - }, - "@types/mime-types": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.3.tgz", - "integrity": "sha512-bvxCbHeeS7quxS7uOJShyoOQj/BfLabhF6mk9Rmr+2MRfW8W1yxyyL/0GTxLFTHen41GrIw4K3D4DrLouhb8vg==", - "dev": true - }, - "@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, - "@types/minimist": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.4.tgz", - "integrity": "sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ==", - "dev": true - }, - "@types/mocha": { - "version": "5.2.7", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", - "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", - "dev": true - }, - "@types/node": { - "version": "16.18.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.60.tgz", - "integrity": "sha512-ZUGPWx5vKfN+G2/yN7pcSNLkIkXEvlwNaJEd4e0ppX7W2S8XAkdc/37hM4OUNJB9sa0p12AOvGvxL4JCPiz9DA==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz", - "integrity": "sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg==", - "dev": true - }, - "@types/parse-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.1.tgz", - "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==", - "dev": true - }, - "@types/parse5": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", - "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", - "dev": true - }, - "@types/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-gdT4ZrzPzf5vrdmCGQM+yNdLpKMrtmzdh13PuPB/aVZRwNG3rOc7yWQRhCQSSz7wicievT+uPTEzUiw+TO7ZAg==", - "dev": true - }, - "@types/qs": { - "version": "6.9.9", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", - "dev": true - }, - "@types/range-parser": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", - "dev": true - }, - "@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/send": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", - "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", - "dev": true, - "requires": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "@types/serve-static": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", - "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", - "dev": true, - "requires": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "@types/sinon": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.0.tgz", - "integrity": "sha512-oN4AeDMFCeNZrAffCjhLcwwVymRZL2c9mljUmhPnd0eiM06d4ELDg0Q0TSvnZXrCIFlSA859qIdcfu1HapswPQ==", - "dev": true, - "requires": { - "@types/sinonjs__fake-timers": "*" - } - }, - "@types/sinon-chai": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.11.tgz", - "integrity": "sha512-1C5SBFzwn9hjiMr1xfqbULcSI9qXVpkGZT/LYbbd3jWiTo2MSvA+iFfwODlSoAXGeCgBw6S509dxy8zSIacr3Q==", - "dev": true, - "requires": { - "@types/chai": "*", - "@types/sinon": "*" - } - }, - "@types/sinonjs__fake-timers": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.4.tgz", - "integrity": "sha512-GDV68H0mBSN449sa5HEj51E0wfpVQb8xNSMzxf/PrypMFcLTMwJMOM/cgXiv71Mq5drkOQmUGvL1okOZcu6RrQ==", - "dev": true - }, - "@types/trusted-types": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.5.tgz", - "integrity": "sha512-I3pkr8j/6tmQtKV/ZzHtuaqYSQvyjGRKH4go60Rr0IDLlFxuRT5V32uvB1mecM5G1EVAUyF/4r4QZ1GHgz+mxA==", - "dev": true - }, - "@types/whatwg-url": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-6.4.0.tgz", - "integrity": "sha512-tonhlcbQ2eho09am6RHnHOgvtDfDYINd5rgxD+2YSkKENooVCFsWizJz139MQW/PV8FfClyKrNe9ZbdHrSCxGg==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "@types/yauzl": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.2.tgz", - "integrity": "sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", - "integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==", - "dev": true, - "requires": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz", - "integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/parser": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz", - "integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" - } - }, - "@typescript-eslint/scope-manager": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz", - "integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" - } - }, - "@typescript-eslint/types": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz", - "integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz", - "integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "4.33.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz", - "integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==", - "dev": true, - "requires": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" - } - }, - "@web/browser-logs": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.2.6.tgz", - "integrity": "sha512-CNjNVhd4FplRY8PPWIAt02vAowJAVcOoTNrR/NNb/o9pka7yI9qdjpWrWhEbPr2pOXonWb52AeAgdK66B8ZH7w==", - "dev": true, - "requires": { - "errorstacks": "^2.2.0" - } - }, - "@web/config-loader": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.1.3.tgz", - "integrity": "sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==", - "dev": true, - "requires": { - "semver": "^7.3.4" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@web/dev-server": { - "version": "0.1.38", - "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.38.tgz", - "integrity": "sha512-WUq7Zi8KeJ5/UZmmpZ+kzUpUlFlMP/rcreJKYg9Lxiz998KYl4G5Rv24akX0piTuqXG7r6h+zszg8V/hdzjCoA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.11", - "@types/command-line-args": "^5.0.0", - "@web/config-loader": "^0.1.3", - "@web/dev-server-core": "^0.4.1", - "@web/dev-server-rollup": "^0.4.1", - "camelcase": "^6.2.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^7.0.1", - "debounce": "^1.2.0", - "deepmerge": "^4.2.2", - "ip": "^1.1.5", - "nanocolors": "^0.2.1", - "open": "^8.0.2", - "portfinder": "^1.0.32" - }, - "dependencies": { - "@web/dev-server-core": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.4.1.tgz", - "integrity": "sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==", - "dev": true, - "requires": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^1.3.1", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^6.0.0", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - } - }, - "array-back": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", - "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", - "dev": true - }, - "command-line-usage": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-7.0.1.tgz", - "integrity": "sha512-NCyznE//MuTjwi3y84QVUGEOT+P5oto1e1Pk/jFPVdPPfsG03qpTIl3yw6etR+v73d0lXsoojRpvbru2sqePxQ==", - "dev": true, - "requires": { - "array-back": "^6.2.2", - "chalk-template": "^0.4.0", - "table-layout": "^3.0.0", - "typical": "^7.1.1" - } - }, - "isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", - "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" - } - }, - "table-layout": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-3.0.2.tgz", - "integrity": "sha512-rpyNZYRw+/C+dYkcQ3Pr+rLxW4CfHpXjPDnG7lYhdRoUcZTUt+KEsX+94RGp/aVp/MQU35JCITv2T/beY4m+hw==", - "dev": true, - "requires": { - "@75lb/deep-merge": "^1.1.1", - "array-back": "^6.2.2", - "command-line-args": "^5.2.1", - "command-line-usage": "^7.0.0", - "stream-read-all": "^3.0.1", - "typical": "^7.1.1", - "wordwrapjs": "^5.1.0" - } - }, - "typical": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/typical/-/typical-7.1.1.tgz", - "integrity": "sha512-T+tKVNs6Wu7IWiAce5BgMd7OZfNYUndHwc5MknN+UHOudi7sGZzuHdCadllRuqJ3fPtgFtIH9+lt9qRv6lmpfA==", - "dev": true - }, - "wordwrapjs": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-5.1.0.tgz", - "integrity": "sha512-JNjcULU2e4KJwUNv6CHgI46UvDGitb6dGryHajXTDiLgg1/RiGoPSDw4kZfYnwGtEXf2ZMeIewDQgFGzkCB2Sg==", - "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 - } - } - }, - "@web/dev-server-core": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.3.19.tgz", - "integrity": "sha512-Q/Xt4RMVebLWvALofz1C0KvP8qHbzU1EmdIA2Y1WMPJwiFJFhPxdr75p9YxK32P2t0hGs6aqqS5zE0HW9wYzYA==", - "dev": true, - "requires": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^1.2.0", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^4.0.6", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^6.0.0", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@web/dev-server-esbuild": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/@web/dev-server-esbuild/-/dev-server-esbuild-0.2.16.tgz", - "integrity": "sha512-a82uKy9vQ4HvfWtjd7hJ3GtaqkL2ofxpEu3a1wIZyXB2dFWPvhRSmLNe/4IPPHe4vj6PVdRpLSFPEA3lXUW5Pw==", - "dev": true, - "requires": { - "@mdn/browser-compat-data": "^4.0.0", - "@web/dev-server-core": "^0.3.17", - "esbuild": "^0.12.21", - "parse5": "^6.0.1", - "ua-parser-js": "^1.0.2" - } - }, - "@web/dev-server-rollup": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.4.1.tgz", - "integrity": "sha512-Ebsv7Ovd9MufeH3exvikBJ7GmrZA5OmHnOgaiHcwMJ2eQBJA5/I+/CbRjsLX97ICj/ZwZG//p2ITRz8W3UfSqg==", - "dev": true, - "requires": { - "@rollup/plugin-node-resolve": "^13.0.4", - "@web/dev-server-core": "^0.4.1", - "nanocolors": "^0.2.1", - "parse5": "^6.0.1", - "rollup": "^2.67.0", - "whatwg-url": "^11.0.0" - }, - "dependencies": { - "@web/dev-server-core": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.4.1.tgz", - "integrity": "sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==", - "dev": true, - "requires": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^1.3.1", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^6.0.0", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - } - }, - "isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", - "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" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@web/parse5-utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-1.3.1.tgz", - "integrity": "sha512-haCgDchZrAOB9EhBJ5XqiIjBMsS/exsM5Ru7sCSyNkXVEJWskyyKuKMFk66BonnIGMPpDtqDrTUfYEis5Zi3XA==", - "dev": true, - "requires": { - "@types/parse5": "^6.0.1", - "parse5": "^6.0.1" - } - }, - "@web/test-runner": { - "version": "0.13.31", - "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.13.31.tgz", - "integrity": "sha512-QMj/25U25AkhN4ffBoMMPdpQLNojL8cAzlyIh/oyVp385Cjmd4Hz8S0u4PvWJmDRmPerbJRNtsWafB8/EcQ1rA==", - "dev": true, - "requires": { - "@web/browser-logs": "^0.2.2", - "@web/config-loader": "^0.1.3", - "@web/dev-server": "^0.1.32", - "@web/test-runner-chrome": "^0.10.7", - "@web/test-runner-commands": "^0.6.3", - "@web/test-runner-core": "^0.10.27", - "@web/test-runner-mocha": "^0.7.5", - "camelcase": "^6.2.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.1", - "convert-source-map": "^1.7.0", - "diff": "^5.0.0", - "globby": "^11.0.1", - "nanocolors": "^0.2.1", - "portfinder": "^1.0.28", - "source-map": "^0.7.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - } - } - }, - "@web/test-runner-chrome": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.10.7.tgz", - "integrity": "sha512-DKJVHhHh3e/b6/erfKOy0a4kGfZ47qMoQRgROxi9T4F9lavEY3E5/MQ7hapHFM2lBF4vDrm+EWjtBdOL8o42tw==", - "dev": true, - "requires": { - "@web/test-runner-core": "^0.10.20", - "@web/test-runner-coverage-v8": "^0.4.8", - "chrome-launcher": "^0.15.0", - "puppeteer-core": "^13.1.3" - } - }, - "@web/test-runner-commands": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.6.6.tgz", - "integrity": "sha512-2DcK/+7f8QTicQpGFq/TmvKHDK/6Zald6rn1zqRlmj3pcH8fX6KHNVMU60Za9QgAKdorMBPfd8dJwWba5otzdw==", - "dev": true, - "requires": { - "@web/test-runner-core": "^0.10.29", - "mkdirp": "^1.0.4" - } - }, - "@web/test-runner-core": { - "version": "0.10.29", - "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.10.29.tgz", - "integrity": "sha512-0/ZALYaycEWswHhpyvl5yqo0uIfCmZe8q14nGPi1dMmNiqLcHjyFGnuIiLexI224AW74ljHcHllmDlXK9FUKGA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.12.11", - "@types/babel__code-frame": "^7.0.2", - "@types/co-body": "^6.1.0", - "@types/convert-source-map": "^2.0.0", - "@types/debounce": "^1.2.0", - "@types/istanbul-lib-coverage": "^2.0.3", - "@types/istanbul-reports": "^3.0.0", - "@web/browser-logs": "^0.2.6", - "@web/dev-server-core": "^0.4.1", - "chokidar": "^3.4.3", - "cli-cursor": "^3.1.0", - "co-body": "^6.1.0", - "convert-source-map": "^2.0.0", - "debounce": "^1.2.0", - "dependency-graph": "^0.11.0", - "globby": "^11.0.1", - "ip": "^1.1.5", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.0.2", - "log-update": "^4.0.0", - "nanocolors": "^0.2.1", - "nanoid": "^3.1.25", - "open": "^8.0.2", - "picomatch": "^2.2.2", - "source-map": "^0.7.3" - }, - "dependencies": { - "@web/dev-server-core": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.4.1.tgz", - "integrity": "sha512-KdYwejXZwIZvb6tYMCqU7yBiEOPfKLQ3V9ezqqEz8DA9V9R3oQWaowckvCpFB9IxxPfS/P8/59OkdzGKQjcIUw==", - "dev": true, - "requires": { - "@types/koa": "^2.11.6", - "@types/ws": "^7.4.0", - "@web/parse5-utils": "^1.3.1", - "chokidar": "^3.4.3", - "clone": "^2.1.2", - "es-module-lexer": "^1.0.0", - "get-stream": "^6.0.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^5.0.0", - "koa": "^2.13.0", - "koa-etag": "^4.0.0", - "koa-send": "^5.0.1", - "koa-static": "^5.0.0", - "lru-cache": "^6.0.0", - "mime-types": "^2.1.27", - "parse5": "^6.0.1", - "picomatch": "^2.2.2", - "ws": "^7.4.2" - } - }, - "isbinaryfile": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz", - "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==", - "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" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@web/test-runner-coverage-v8": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/@web/test-runner-coverage-v8/-/test-runner-coverage-v8-0.4.9.tgz", - "integrity": "sha512-y9LWL4uY25+fKQTljwr0XTYjeWIwU4h8eYidVuLoW3n1CdFkaddv+smrGzzF5j8XY+Mp6TmV9NdxjvMWqVkDdw==", - "dev": true, - "requires": { - "@web/test-runner-core": "^0.10.20", - "istanbul-lib-coverage": "^3.0.0", - "picomatch": "^2.2.2", - "v8-to-istanbul": "^8.0.0" - } - }, - "@web/test-runner-mocha": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@web/test-runner-mocha/-/test-runner-mocha-0.7.5.tgz", - "integrity": "sha512-12/OBq6efPCAvJpcz3XJs2OO5nHe7GtBibZ8Il1a0QtsGpRmuJ4/m1EF0Fj9f6KHg7JdpGo18A37oE+5hXjHwg==", - "dev": true, - "requires": { - "@types/mocha": "^8.2.0", - "@web/test-runner-core": "^0.10.20" - }, - "dependencies": { - "@types/mocha": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", - "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", - "dev": true - } - } - }, - "@webcomponents/shadycss": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.11.2.tgz", - "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==", - "dev": true - }, - "@webcomponents/webcomponentsjs": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.8.0.tgz", - "integrity": "sha512-loGD63sacRzOzSJgQnB9ZAhaQGkN7wl2Zuw7tsphI5Isa0irijrRo6EnJii/GgjGefIFO8AIO7UivzRhFaEk9w==", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==", - "dev": true - }, - "accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "ace-custom-element": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/ace-custom-element/-/ace-custom-element-1.6.5.tgz", - "integrity": "sha512-xU/9r94WKwjwEOjdfs6oVk2Dqc6X63eF2ECvKIMm/JCK1PDbXXdBYi5sQx110tR2sY4f96iXxyvscfT9qeI1RQ==" - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", - "dev": true - }, - "add-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", - "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", - "dev": true - }, - "address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true - }, - "agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", - "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", - "dev": true, - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "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" - } - }, - "amator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/amator/-/amator-1.1.0.tgz", - "integrity": "sha512-V5+aH8pe+Z3u/UG3L3pG3BaFQGXAyXHVQDroRwjPHdh08bcUEchAVsU1MCuJSCaU5o60wTK6KaE6te5memzgYw==", - "requires": { - "bezier-easing": "^2.0.3" - } - }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "are-we-there-yet": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", - "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", - "dev": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - } - }, - "array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "array-ify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", - "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", - "dev": true - }, - "array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - } - }, - "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 - }, - "array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.reduce": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", - "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - } - }, - "arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - } - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true - }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", - "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", - "dev": true, - "requires": { - "object.assign": "^4.1.4", - "util": "^0.10.4" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "requires": { - "lodash": "^4.17.14" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true - }, - "aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", - "dev": true - }, - "axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", - "dev": true - }, - "axobject-query": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", - "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==", - "dev": true - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz", - "integrity": "sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.33.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - } - }, - "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 - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bezier-easing": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz", - "integrity": "sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==" - }, - "big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true - }, - "bin-links": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-2.3.0.tgz", - "integrity": "sha512-JzrOLHLwX2zMqKdyYZjkDgQGT+kHDkIhv2/IK2lJ00qLxV4TmFoHi8drDBb6H5Zrz1YfgHkai4e2MGPqnoUhqA==", - "dev": true, - "requires": { - "cmd-shim": "^4.0.1", - "mkdirp-infer-owner": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^2.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^3.0.3" - } - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "blocking-elements": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/blocking-elements/-/blocking-elements-0.1.1.tgz", - "integrity": "sha512-/SLWbEzMoVIMZACCyhD/4Ya2M1PWP1qMKuiymowPcI+PdWDARqeARBjhj73kbUBCxEmTZCUu5TAqxtwUO9C1Ig==" - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true - }, - "boxen": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", - "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^5.3.1", - "chalk": "^3.0.0", - "cli-boxes": "^2.2.0", - "string-width": "^4.1.0", - "term-size": "^2.1.0", - "type-fest": "^0.8.1", - "widest-line": "^3.1.0" - }, - "dependencies": { - "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" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "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 - }, - "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" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "bplist-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz", - "integrity": "sha512-2AEM0FXy8ZxVLBuqX0hqt1gDwcnz2zygEkQ6zaD5Wko/sB9paUNwlpawrFtKeHUAQUOzjVy9AO4oeonqIHKA9Q==", - "dev": true, - "requires": { - "big-integer": "^1.6.7" - } - }, - "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" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - } - }, - "browserslist-useragent": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/browserslist-useragent/-/browserslist-useragent-3.1.4.tgz", - "integrity": "sha512-o9V55790uae98Kwn+vwyO+ww07OreiH1BUc9bjjlUbIL3Fh43fyoasZxZ2EiI4ErfEIKwbycQ1pvwOBlySJ7ow==", - "dev": true, - "requires": { - "browserslist": "^4.19.1", - "electron-to-chromium": "^1.4.67", - "semver": "^7.3.5", - "useragent": "^2.3.0", - "yamlparser": "^0.0.2" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "dev": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==", - "dev": true - }, - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, - "cacache": { - "version": "15.3.0", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", - "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", - "dev": true, - "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "cache-content-type": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", - "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", - "dev": true, - "requires": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - } - }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "dev": true - }, - "cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "cachedir": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", - "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", - "dev": true - }, - "call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "requires": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - } - } - }, - "caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dev": true, - "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001561", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz", - "integrity": "sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw==", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - } - }, - "chai-a11y-axe": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/chai-a11y-axe/-/chai-a11y-axe-1.5.0.tgz", - "integrity": "sha512-V/Vg/zJDr9aIkaHJ2KQu7lGTQQm5ZOH4u1k5iTMvIXuSVlSuUo0jcSpSqf9wUn9zl6oQXa4e4E0cqH18KOgKlQ==", - "dev": true, - "requires": { - "axe-core": "^4.3.3" - } - }, - "chai-dom": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/chai-dom/-/chai-dom-1.11.0.tgz", - "integrity": "sha512-ZzGlEfk1UhHH5+N0t9bDqstOxPEXmn3EyXvtsok5rfXVDOFDJbHVy12rED6ZwkJAUDs2w7/Da4Hlq2LB63kltg==", - "dev": true, - "requires": {} - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "dev": true, - "requires": { - "chalk": "^4.1.2" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, - "requires": { - "get-func-name": "^2.0.2" - } - }, - "cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dev": true, - "requires": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - }, - "dependencies": { - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - }, - "htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - } - } - }, - "cheerio-select": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", - "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", - "dev": true, - "requires": { - "css-select": "^4.3.0", - "css-what": "^6.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.3.1", - "domutils": "^2.8.0" - } - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true - }, - "chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "dev": true, - "requires": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "dependencies": { - "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 - } - } - }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, - "cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", - "dev": true - }, - "clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-spinners": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", - "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", - "dev": true - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "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 - }, - "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" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true - }, - "clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "cmd-shim": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-4.1.0.tgz", - "integrity": "sha512-lb9L7EM4I/ZRVuljLPEtUJOP+xiQVknZ4ZMpMgEp4JzNldPb27HU03hi6K1/6CoIuit/Zm/LQXySErFeXxDprw==", - "dev": true, - "requires": { - "mkdirp-infer-owner": "^2.0.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true - }, - "co-body": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", - "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", - "dev": true, - "requires": { - "inflation": "^2.0.0", - "qs": "^6.5.2", - "raw-body": "^2.3.3", - "type-is": "^1.6.16" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==", - "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==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "requires": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - } - }, - "command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, - "requires": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true - }, - "common-ancestor-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", - "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", - "dev": true - }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "compare-func": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", - "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", - "dev": true, - "requires": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "requires": { - "mime-db": ">= 1.43.0 < 2" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "concurrently": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.5.1.tgz", - "integrity": "sha512-FlSwNpGjWQfRwPLXvJ/OgysbBxPkWpiVjy1042b0U7on7S7qwwMIILRj7WTN1mTgqa582bG6NFuScOoh6Zgdag==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "date-fns": "^2.16.1", - "lodash": "^4.17.21", - "rxjs": "^6.6.3", - "spawn-command": "^0.0.2-1", - "supports-color": "^8.1.0", - "tree-kill": "^1.2.2", - "yargs": "^16.2.0" - }, - "dependencies": { - "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" - } - }, - "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" - }, - "dependencies": { - "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" - } - } - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "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 - }, - "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 - }, - "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" - } - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - } - } - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", - "dev": true - }, - "content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true - }, - "conventional-changelog": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", - "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", - "dev": true, - "requires": { - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-atom": "^2.0.8", - "conventional-changelog-codemirror": "^2.0.8", - "conventional-changelog-conventionalcommits": "^4.5.0", - "conventional-changelog-core": "^4.2.1", - "conventional-changelog-ember": "^2.0.9", - "conventional-changelog-eslint": "^3.0.9", - "conventional-changelog-express": "^2.0.6", - "conventional-changelog-jquery": "^3.0.11", - "conventional-changelog-jshint": "^2.0.9", - "conventional-changelog-preset-loader": "^2.3.4" - } - }, - "conventional-changelog-angular": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", - "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-atom": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz", - "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-codemirror": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz", - "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-config-spec": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-2.1.0.tgz", - "integrity": "sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==", - "dev": true - }, - "conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz", - "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - } - }, - "conventional-changelog-core": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", - "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", - "dev": true, - "requires": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "dependencies": { - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - } - } - }, - "read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "conventional-changelog-ember": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz", - "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-eslint": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", - "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-express": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz", - "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-jquery": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz", - "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==", - "dev": true, - "requires": { - "q": "^1.5.1" - } - }, - "conventional-changelog-jshint": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz", - "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==", - "dev": true, - "requires": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - } - }, - "conventional-changelog-preset-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz", - "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==", - "dev": true - }, - "conventional-changelog-writer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", - "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", - "dev": true, - "requires": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - } - }, - "conventional-commits-filter": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", - "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", - "dev": true, - "requires": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - } - }, - "conventional-commits-parser": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", - "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", - "dev": true, - "requires": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "conventional-recommended-bump": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", - "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", - "dev": true, - "requires": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - } - }, - "convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "cookies": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", - "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", - "dev": true, - "requires": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - } - }, - "core-js-bundle": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-bundle/-/core-js-bundle-3.33.2.tgz", - "integrity": "sha512-kzjfHknAHPfXo+jzJQRDiWdKlij0VEgk69epwakY9KEbAejOnhN1XP6oBjv8GGuZuQop/8kAuRuhDHGG0ab0xQ==", - "dev": true - }, - "core-js-compat": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.2.tgz", - "integrity": "sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw==", - "dev": true, - "requires": { - "browserslist": "^4.22.1" - } - }, - "core-js-pure": { - "version": "3.33.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.2.tgz", - "integrity": "sha512-a8zeCdyVk7uF2elKIGz67AjcXOxjRbwOLz8SbklEso1V+2DoW4OkAMZN9S9GBgvZIaqQi/OemFX4OiSoQEmg1Q==", - "dev": true - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dev": true, - "requires": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - } - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "requires": { - "node-fetch": "2.6.7" - } - }, - "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" - } - }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, - "css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true - }, - "csv-stringify": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-6.4.4.tgz", - "integrity": "sha512-NDshLupGa7gp4UG4sSNIqwYJqgSwvds0SvENntxoVoVvTzXcrHvd5gG2MWpbRpSNvk59dlmIe1IwNvSxN4IVmg==" - }, - "dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.21.0" - } - }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", - "dev": true - }, - "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" - } - }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha512-syBZ+rnAK3EgMsH2aYEOLUW7mZSY9Gb+0wUMCFsZvcmiz+HigA0LOcq/HoQqVuGG+EKykunc7QG2bzrponfaSw==", - "dev": true - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true - } - } - }, - "decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - }, - "dependencies": { - "mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "dev": true - } - } - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==", - "dev": true - }, - "deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true - }, - "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 - }, - "deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true - }, - "default-browser-id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-2.0.0.tgz", - "integrity": "sha512-+LePblg9HDIx3CIla8BxfI/zYUFs8Kp67U5feqb7iTJcAxBOvcZ7ZNXKFsBDnGE5x0ap66o848VHE0fq7cgpPg==", - "dev": true, - "requires": { - "bplist-parser": "^0.1.0", - "pify": "^2.3.0", - "untildify": "^2.0.0" - } - }, - "defaults": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", - "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", - "dev": true, - "requires": { - "clone": "^1.0.2" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - } - } - }, - "defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "dev": true - }, - "define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, - "define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true - }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", - "dev": true - }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true - }, - "destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true - }, - "detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true - }, - "detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true - }, - "detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dev": true, - "requires": { - "address": "^1.0.1", - "debug": "4" - } - }, - "devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", - "dev": true - }, - "dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true - }, - "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" - } - }, - "dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "dependencies": { - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true - } - } - }, - "dom5": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dom5/-/dom5-3.0.1.tgz", - "integrity": "sha512-JPFiouQIr16VQ4dX6i0+Hpbg3H2bMKPmZ+WZgBOSSvOPx9QHwwY8sPzeM2baUtViESYto6wC2nuZOMC/6gulcA==", - "dev": true, - "requires": { - "@types/parse5": "^2.2.34", - "clone": "^2.1.0", - "parse5": "^4.0.0" - }, - "dependencies": { - "@types/parse5": { - "version": "2.2.34", - "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz", - "integrity": "sha512-p3qOvaRsRpFyEmaS36RtLzpdxZZnmxGuT1GMgzkTtTJVFuEw7KFjGK83MFODpJExgX1bEzy9r0NYjMC3IMfi7w==", - "dev": true, - "requires": { - "@types/node": "*" - } - }, - "parse5": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", - "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", - "dev": true - } - } - }, - "domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true - }, - "domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, - "requires": { - "domelementtype": "^2.2.0" - } - }, - "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, - "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - } - }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "dotgitignore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", - "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "minimatch": "^3.0.4" - }, - "dependencies": { - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - } - } - }, - "duplexer3": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", - "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==", - "dev": true - }, - "dynamic-import-polyfill": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dynamic-import-polyfill/-/dynamic-import-polyfill-0.1.1.tgz", - "integrity": "sha512-m953zv0w5oDagTItWm6Auhmk/pY7EiejaqiVbnzSS3HIjh1FCUeK7WzuaVtWPNs58A+/xpIE+/dVk6pKsrua8g==", - "dev": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", - "dev": true, - "requires": { - "jake": "^10.8.5" - } - }, - "electron-to-chromium": { - "version": "1.4.576", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.576.tgz", - "integrity": "sha512-yXsZyXJfAqzWk1WKryr0Wl0MN2D47xodPvEEwlVePBnhU5E7raevLQR+E6b9JAD3GfL/7MbAL9ZtWQQPcLx7wA==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "optional": true, - "requires": { - "iconv-lite": "^0.6.2" - }, - "dependencies": { - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "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 - }, - "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" - } - } - } - }, - "entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true - }, - "env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true - }, - "err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "errorstacks": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/errorstacks/-/errorstacks-2.4.0.tgz", - "integrity": "sha512-5ecWhU5gt0a5G05nmQcgCxP5HperSMxLDzvWlT5U+ZSKkuDK0rJ3dbCQny6/vSCIXjwrhwSecXBbw1alr295hQ==", - "dev": true - }, - "es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - } - }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, - "es-dev-server": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-dev-server/-/es-dev-server-2.1.0.tgz", - "integrity": "sha512-Vrq/4PyMzWz33QmOdSncvoWLTJVcv2e96z8FLHQwP9zK7DyLeDZCckII8VTW+btUGtM7aErvLH/d/R2pjjjs8w==", - "dev": true, - "requires": { - "@babel/core": "^7.11.1", - "@babel/plugin-proposal-dynamic-import": "^7.10.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", - "@babel/plugin-proposal-optional-chaining": "^7.11.0", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-template-literals": "^7.8.3", - "@babel/preset-env": "^7.9.0", - "@koa/cors": "^3.1.0", - "@open-wc/building-utils": "^2.18.3", - "@rollup/plugin-node-resolve": "^11.0.0", - "@rollup/pluginutils": "^3.0.0", - "@types/babel__core": "^7.1.3", - "@types/browserslist": "^4.8.0", - "@types/browserslist-useragent": "^3.0.0", - "@types/caniuse-api": "^3.0.0", - "@types/command-line-args": "^5.0.0", - "@types/command-line-usage": "^5.0.1", - "@types/debounce": "^1.2.0", - "@types/koa": "^2.0.48", - "@types/koa__cors": "^3.0.1", - "@types/koa-compress": "^2.0.9", - "@types/koa-etag": "^3.0.0", - "@types/koa-static": "^4.0.1", - "@types/lru-cache": "^5.1.0", - "@types/mime-types": "^2.1.0", - "@types/minimatch": "^3.0.3", - "@types/path-is-inside": "^1.0.0", - "@types/whatwg-url": "^6.4.0", - "browserslist": "^4.9.1", - "browserslist-useragent": "^3.0.2", - "builtin-modules": "^3.1.0", - "camelcase": "^5.3.1", - "caniuse-api": "^3.0.0", - "caniuse-lite": "^1.0.30001033", - "chokidar": "^3.0.0", - "command-line-args": "^5.0.2", - "command-line-usage": "^6.1.0", - "debounce": "^1.2.0", - "deepmerge": "^4.2.2", - "es-module-lexer": "^0.3.13", - "get-stream": "^5.1.0", - "is-stream": "^2.0.0", - "isbinaryfile": "^4.0.2", - "koa": "^2.7.0", - "koa-compress": "^3.0.0", - "koa-etag": "^3.0.0", - "koa-static": "^5.0.0", - "lru-cache": "^5.1.1", - "mime-types": "^2.1.27", - "minimatch": "^3.0.4", - "open": "^7.0.3", - "parse5": "^5.1.1", - "path-is-inside": "^1.0.2", - "polyfills-loader": "^1.7.4", - "portfinder": "^1.0.21", - "rollup": "^2.7.2", - "strip-ansi": "^5.2.0", - "systemjs": "^6.3.1", - "tslib": "^1.11.1", - "useragent": "^2.3.0", - "whatwg-url": "^7.0.0" - }, - "dependencies": { - "@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "es-module-lexer": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", - "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", - "dev": true - }, - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "koa-etag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/koa-etag/-/koa-etag-3.0.0.tgz", - "integrity": "sha512-HYU1zIsH4S9xOlUZGuZIP1PIiJ0EkBXgwL8PjFECb/pUYmAee8gfcvIovregBMYxECDhLulEWT2+ZRsA/lczCQ==", - "dev": true, - "requires": { - "etag": "^1.3.0", - "mz": "^2.1.0" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", - "dev": true - }, - "es-module-shims": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-1.8.1.tgz", - "integrity": "sha512-egouQrkryAJpKHVDZICQq5+fW4z1RomzVJpicA+8yqUHzKkTuMeoHaNIZ7PsWDnRl0ImCEVJEpW/aVb6JYKVJg==", - "dev": true - }, - "es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "esbuild": { - "version": "0.12.29", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.12.29.tgz", - "integrity": "sha512-w/XuoBCSwepyiZtIRsKsetiLDUVGPVw1E/R3VTFSecIy8UR7Cq3SOtwKHJMFoVqqVG36aGkzh4e8BvpO1Fdc7g==", - "dev": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "esinstall": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/esinstall/-/esinstall-1.1.7.tgz", - "integrity": "sha512-irDsrIF7fZ5BCQEAV5gmH+4nsK6JhnkI9C9VloXdmzJLbM1EcshPw8Ap95UUGc4ZJdzGeOrjV+jgKjQ/Z7Q3pg==", - "dev": true, - "requires": { - "@rollup/plugin-commonjs": "^16.0.0", - "@rollup/plugin-inject": "^4.0.2", - "@rollup/plugin-json": "^4.0.0", - "@rollup/plugin-node-resolve": "^10.0.0", - "@rollup/plugin-replace": "^2.4.2", - "builtin-modules": "^3.2.0", - "cjs-module-lexer": "^1.2.1", - "es-module-lexer": "^0.6.0", - "execa": "^5.1.1", - "is-valid-identifier": "^2.0.2", - "kleur": "^4.1.1", - "mkdirp": "^1.0.3", - "picomatch": "^2.3.0", - "resolve": "^1.20.0", - "rimraf": "^3.0.0", - "rollup": "~2.37.1", - "rollup-plugin-polyfill-node": "^0.6.2", - "slash": "~3.0.0", - "validate-npm-package-name": "^3.0.0", - "vm2": "^3.9.2" - }, - "dependencies": { - "@rollup/plugin-node-resolve": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-10.0.0.tgz", - "integrity": "sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.17.0" - } - }, - "es-module-lexer": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.6.0.tgz", - "integrity": "sha512-f8kcHX1ArhllUtb/wVSyvygoKCznIjnxhLxy7TCvIiMdT7fL4ZDTIKaadMe6eLvOXg6Wk02UeoFgUoZ2EKZZUA==", - "dev": true - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": true - }, - "rollup": { - "version": "2.37.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.37.1.tgz", - "integrity": "sha512-V3ojEeyGeSdrMSuhP3diBb06P+qV4gKQeanbDv+Qh/BZbhdZ7kHV0xAt8Yjk4GFshq/WjO7R4c7DFM20AwTFVQ==", - "dev": true, - "requires": { - "fsevents": "~2.1.2" - } - } - } - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "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" - } - }, - "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" - } - }, - "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 - }, - "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-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "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": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "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" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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" - } - }, - "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" - } - }, - "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 - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "eslint-config-airbnb-base": { - "version": "14.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", - "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.2" - } - }, - "eslint-config-prettier": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", - "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", - "dev": true, - "requires": {} - }, - "eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz", - "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==", - "dev": true, - "requires": { - "eslint-rule-composer": "^0.3.0" - } - }, - "eslint-plugin-html": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-html/-/eslint-plugin-html-6.2.0.tgz", - "integrity": "sha512-vi3NW0E8AJombTvt8beMwkL1R/fdRWl4QSNRNMhVQKWm36/X0KF0unGNAY4mqUF06mnwVWZcIcerrCnfn9025g==", - "dev": true, - "requires": { - "htmlparser2": "^7.1.2" - } - }, - "eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", - "dev": true, - "requires": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "eslint-plugin-lit": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit/-/eslint-plugin-lit-1.10.1.tgz", - "integrity": "sha512-3eH++xFpe6efd+TN6B9kW1coULdPyK+3fMNws378nbYQ/HiWIz0+jVcsaGVs9BbLt6kVkDxZmUGF4Ivx3BatkA==", - "dev": true, - "requires": { - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "requireindex": "^1.2.0" - } - }, - "eslint-plugin-lit-a11y": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-lit-a11y/-/eslint-plugin-lit-a11y-1.1.0.tgz", - "integrity": "sha512-reJqT0UG/Y8OC2z7pfgm0ODK1D6o5TgQpGdlgN1ja0HjdREXLqFVoYiEv013oNx3kBhTUaLlic64rRNw+386xw==", - "dev": true, - "requires": { - "aria-query": "^4.2.2", - "axe-core": "^4.3.3", - "axobject-query": "^2.2.0", - "dom5": "^3.0.1", - "emoji-regex": "^9.2.0", - "eslint": "^7.6.0", - "eslint-rule-extender": "0.0.1", - "intl-list-format": "^1.0.3", - "parse5": "^5.1.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "requireindex": "~1.2.0" - }, - "dependencies": { - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - } - } - }, - "eslint-plugin-no-only-tests": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-2.6.0.tgz", - "integrity": "sha512-T9SmE/g6UV1uZo1oHAqOvL86XWl7Pl2EpRpnLI8g/bkJu+h7XBCB+1LnubRZ2CUQXj805vh4/CYZdnqtVaEo2Q==", - "dev": true - }, - "eslint-plugin-tsdoc": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/eslint-plugin-tsdoc/-/eslint-plugin-tsdoc-0.2.17.tgz", - "integrity": "sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==", - "dev": true, - "requires": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "0.16.2" - } - }, - "eslint-plugin-wc": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-wc/-/eslint-plugin-wc-1.5.0.tgz", - "integrity": "sha512-KFSfiHDol/LeV7U6IX8GdgpGf/s3wG8FTG120Rml/hGNB/DkCuGYQhlf0VgdBdf7gweem8Nlsh5o64HNdj+qPA==", - "dev": true, - "requires": { - "is-valid-element-name": "^1.0.0", - "js-levenshtein-esm": "^1.2.0" - } - }, - "eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "dev": true - }, - "eslint-rule-extender": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/eslint-rule-extender/-/eslint-rule-extender-0.0.1.tgz", - "integrity": "sha512-F0j1Twve3lamL3J0rRSVAynlp58sDPG39JFcQrM+u9Na7PmCgiPHNODh6YE9mduaGcsn3NBqbf6LZRj0cLr8Ng==", - "dev": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "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" - } - }, - "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 - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "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 - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true - }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true - }, - "fast-check": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-2.25.0.tgz", - "integrity": "sha512-wRUT2KD2lAmT75WNIJIHECawoUUMHM0I5jrlLXGtGeqmPL8jl/EldUDjY1VCp6fDY8yflyfUeIOsOBrIbIiArg==", - "dev": true, - "requires": { - "pure-rand": "^5.0.1" - } - }, - "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-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "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" - } - }, - "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.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "fdir": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-5.3.0.tgz", - "integrity": "sha512-BtE53+jaa7nNHT+gPdfU6cFAXOJUWDs2b5GFox8dtl6zLXmfNf/N6im69b9nqNNwDyl27mpIWX8qR7AafWzSdQ==", - "dev": true, - "requires": {} - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "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" - } - }, - "filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dev": true, - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "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-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "requires": { - "semver": "^6.0.0" - } - } - } - }, - "find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "requires": { - "array-back": "^3.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": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, - "flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", - "dev": true, - "requires": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true - }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, - "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", - "dev": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "requires": { - "loader-utils": "^3.2.0" - } - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "requires": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - } - }, - "get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", - "dev": true - }, - "get-pkg-repo": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", - "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", - "dev": true, - "requires": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "dependencies": { - "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 - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "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" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "git-raw-commits": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", - "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", - "dev": true, - "requires": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - } - }, - "git-remote-origin-url": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", - "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", - "dev": true, - "requires": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - } - }, - "git-semver-tags": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", - "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", - "dev": true, - "requires": { - "meow": "^8.0.0", - "semver": "^6.0.0" - } - }, - "gitconfiglocal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", - "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", - "dev": true, - "requires": { - "ini": "^1.3.2" - } - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "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" - } - }, - "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", - "dev": true, - "requires": { - "ini": "^1.3.4" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "dev": true - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "dev": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.2" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", - "dev": true - }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, - "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "requires": { - "function-bind": "^1.1.2" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", - "dev": true, - "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", - "he": "^1.2.0", - "param-case": "^3.0.3", - "relateurl": "^0.2.7", - "terser": "^4.6.3" - }, - "dependencies": { - "clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "requires": { - "source-map": "~0.6.0" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "htmlparser2": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz", - "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==", - "dev": true, - "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.2", - "domutils": "^2.8.0", - "entities": "^3.0.1" - } - }, - "http-assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", - "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", - "dev": true, - "requires": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - } - }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, - "http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - } - } - }, - "http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dev": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "dependencies": { - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - } - } - }, - "httpie": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/httpie/-/httpie-1.1.2.tgz", - "integrity": "sha512-VQ82oXG95oY1fQw/XecHuvcFBA+lZQ9Vwj1RfLcO8a7HpDd4cc2ukwpJt+TUlFaLUAzZErylxWu6wclJ1rUhUQ==", - "dev": true - }, - "https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", - "dev": true, - "requires": { - "ms": "^2.0.0" - } - }, - "husky": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", - "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==", - "dev": true - }, - "icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "requires": {} - }, - "idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "dev": true - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "ignore-walk": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", - "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "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" - }, - "dependencies": { - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - } - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, - "inflation": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.1.0.tgz", - "integrity": "sha512-t54PPJHG1Pp7VQvxyVCJ9mBbjG3Hqryges9bXoOO6GExCPa+//i/d5GSuFtpx3ALLd7lgIAur6zrIlBQyJuMlQ==", - "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 - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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 - }, - "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 - }, - "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" - } - }, - "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" - } - } - } - }, - "internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "intersection-observer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/intersection-observer/-/intersection-observer-0.7.0.tgz", - "integrity": "sha512-Id0Fij0HsB/vKWGeBe9PxeY45ttRiBmhFyyt/geBdDHBYNctMRTE3dC1U3ujzz3lap+hVXlEcVaB56kZP/eEUg==", - "dev": true - }, - "intl-list-format": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/intl-list-format/-/intl-list-format-1.0.3.tgz", - "integrity": "sha512-VNF1Mh0K1xALXkz/5QsK1gfKRvEQO/jWaniTGAzQvbzGr5uyGDskQrRjnf6Qnbc9/JRbNE8BQtTg6iWuFrZorw==", - "dev": true - }, - "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", - "dev": true - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true - }, - "is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "requires": { - "hasown": "^2.0.0" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", - "dev": true, - "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" - }, - "dependencies": { - "global-dirs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.1.0.tgz", - "integrity": "sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==", - "dev": true, - "requires": { - "ini": "1.3.7" - } - }, - "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - } - } - }, - "is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "dev": true - }, - "is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true - }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-npm": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", - "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", - "dev": true - }, - "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 - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true - }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-text-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", - "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", - "dev": true, - "requires": { - "text-extensions": "^1.0.0" - } - }, - "is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "requires": { - "which-typed-array": "^1.1.11" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-valid-element-name": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-element-name/-/is-valid-element-name-1.0.0.tgz", - "integrity": "sha512-GZITEJY2LkSjQfaIPBha7eyZv+ge0PhBR7KITeCCWvy7VBQrCUdFkvpI+HrAPQjVtVjy1LvlEkqQTHckoszruw==", - "dev": true, - "requires": { - "is-potential-custom-element-name": "^1.0.0" - } - }, - "is-valid-identifier": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-valid-identifier/-/is-valid-identifier-2.0.2.tgz", - "integrity": "sha512-mpS5EGqXOwzXtKAg6I44jIAqeBfntFLxpAth1rrKbxtKyI6LPktyDYpHBI+tHlduhhX/SF26mFXmxQu995QVqg==", - "dev": true, - "requires": { - "assert": "^1.4.1" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "requires": { - "is-docker": "^2.0.0" - } - }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "isbinaryfile": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", - "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "dev": true - }, - "istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "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 - }, - "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" - } - } - } - }, - "istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - } - }, - "jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dev": true, - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "dependencies": { - "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" - } - }, - "async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", - "dev": true - }, - "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" - } - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, - "jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "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 - }, - "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" - } - } - } - }, - "jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "js-levenshtein-esm": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/js-levenshtein-esm/-/js-levenshtein-esm-1.2.0.tgz", - "integrity": "sha512-fzreKVq1eD7eGcQr7MtRpQH94f8gIfhdrc7yeih38xh684TNMK9v5aAu2wxfIRMk/GpAJRrzcirMAPIaSDaByQ==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", - "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true - }, - "jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "dev": true - }, - "jsonschema": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.11.tgz", - "integrity": "sha512-XNZHs3N1IOa3lPKm//npxMhOdaoPw+MvEV0NIgxcER83GTJcG13rehtWmpBCfEt8DrtYwIkMTs8bdXoYs4fvnQ==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "just-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-3.1.1.tgz", - "integrity": "sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==", - "dev": true - }, - "just-diff-apply": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-3.1.2.tgz", - "integrity": "sha512-TCa7ZdxCeq6q3Rgms2JCRHTCfWAETPZ8SzYUbkYF6KR3I03sN29DaOIC+xyWboIcMvjAsD5iG2u/RWzHD8XpgQ==", - "dev": true - }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, - "keygrip": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", - "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", - "dev": true, - "requires": { - "tsscmp": "1.0.6" - } - }, - "keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true - }, - "koa": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.2.tgz", - "integrity": "sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==", - "dev": true, - "requires": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.8.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - } - }, - "koa-compose": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", - "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==", - "dev": true - }, - "koa-compress": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/koa-compress/-/koa-compress-3.1.0.tgz", - "integrity": "sha512-0m24/yS/GbhWI+g9FqtvStY+yJwTObwoxOvPok6itVjRen7PBWkjsJ8pre76m+99YybXLKhOJ62mJ268qyBFMQ==", - "dev": true, - "requires": { - "bytes": "^3.0.0", - "compressible": "^2.0.0", - "koa-is-json": "^1.0.0", - "statuses": "^1.0.0" - } - }, - "koa-convert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", - "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", - "dev": true, - "requires": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - } - }, - "koa-etag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/koa-etag/-/koa-etag-4.0.0.tgz", - "integrity": "sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==", - "dev": true, - "requires": { - "etag": "^1.8.1" - } - }, - "koa-is-json": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", - "integrity": "sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==", - "dev": true - }, - "koa-send": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", - "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - } - }, - "koa-static": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", - "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "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" - } - }, - "lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "marky": "^1.2.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "lint-staged": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-11.2.6.tgz", - "integrity": "sha512-Vti55pUnpvPE0J9936lKl0ngVeTdSZpEdTNhASbkaWX7J5R9OEifo1INBGQuGW4zmy6OG+TcWPJ3m5yuy5Q8Tg==", - "dev": true, - "requires": { - "cli-truncate": "2.1.0", - "colorette": "^1.4.0", - "commander": "^8.2.0", - "cosmiconfig": "^7.0.1", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "execa": "^5.1.1", - "listr2": "^3.12.2", - "micromatch": "^4.0.4", - "normalize-path": "^3.0.0", - "please-upgrade-node": "^3.2.0", - "string-argv": "0.3.1", - "stringify-object": "3.3.0", - "supports-color": "8.1.1" - }, - "dependencies": { - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "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 - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "requires": { - "tslib": "^2.1.0" - } - } - } - }, - "lit-element": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-2.5.1.tgz", - "integrity": "sha512-ogu7PiJTA33bEK0xGu1dmaX5vhcRjBXCFexPja0e7P7jqLhTpNKYRPmE+GmiCaRVAbiQKGkUgkh/i6+bh++dPQ==", - "requires": { - "lit-html": "^1.1.1" - } - }, - "lit-html": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-1.4.1.tgz", - "integrity": "sha512-B9btcSgPYb1q4oSOb/PrOT6Z/H+r6xuNzfH4lFli/AWhYwdtrgQkQWBbIc6mdnf6E2IL3gDXdkkqNktpU0OZQA==" - }, - "lit-translate": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/lit-translate/-/lit-translate-1.2.1.tgz", - "integrity": "sha512-jykKpkdRX0lx3JYq9jUMzVs02ISClOe2wxyPHat5wVKPyBRJQxgXxLxj1AbpuLNBCDZKEysMBpeJ1z0Y35Bk2Q==", - "requires": { - "lit-html": "^1.2.1" - } - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", - "dev": true - } - } - }, - "loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "dev": true - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "lodash.assignwith": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assignwith/-/lodash.assignwith-4.2.0.tgz", - "integrity": "sha512-ZznplvbvtjK2gMvnQ1BR/zqPFZmS6jbK4p+6Up4xcRYA7yMIwxHCfbTcrYxXKzzqLsQ05eJPVznEW3tuwV7k1g==", - "dev": true - }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "lodash.ismatch": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", - "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", - "dev": true - }, - "lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==", - "dev": true - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", - "dev": true - }, - "log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", - "dev": true, - "requires": { - "chalk": "^2.0.1" - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "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" - } - }, - "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 - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "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" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.1" - } - }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.8" - } - }, - "make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "requires": { - "semver": "^7.5.3" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "make-fetch-happen": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", - "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", - "dev": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true - }, - "marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==" - }, - "marky": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "dev": true - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true - }, - "meow": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", - "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "dependencies": { - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - } - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "meriyah": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-3.1.6.tgz", - "integrity": "sha512-JDOSi6DIItDc33U5N52UdV6P8v+gn+fqZKfbAfHzdWApRQyQWdcvxPvAr9t01bI2rBxGvSrKRQSCg3SkZC1qeg==", - "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==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true - } - } - }, - "minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "minipass-collect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", - "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", - "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", - "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", - "dev": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", - "dev": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "mkdirp-infer-owner": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz", - "integrity": "sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - } - }, - "mocha": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", - "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", - "dev": true, - "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "2.2.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.4", - "ms": "2.1.1", - "node-environment-flags": "1.0.5", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "dependencies": { - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "modify-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nanocolors": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", - "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==", - "dev": true - }, - "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "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 - }, - "negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "ngraph.events": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.2.2.tgz", - "integrity": "sha512-JsUbEOzANskax+WSYiAPETemLWYXmixuPAlmZmhIbIj6FH/WDgEGCGnRwUQBK0GjOnVm8Ui+e5IJ+5VZ4e32eQ==" - }, - "nise": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", - "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^3.0.0" - }, - "dependencies": { - "@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - } - } - } - } - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-environment-flags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", - "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - } - } - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, - "node-gyp": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", - "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", - "dev": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", - "dev": true - }, - "node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "nopt": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", - "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "dev": true - }, - "npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-install-checks": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", - "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", - "dev": true, - "requires": { - "semver": "^7.1.1" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", - "dev": true - }, - "npm-package-arg": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", - "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", - "dev": true, - "requires": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "npm-packlist": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-2.2.2.tgz", - "integrity": "sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==", - "dev": true, - "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "npm-pick-manifest": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", - "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", - "dev": true, - "requires": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "npm-registry-fetch": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", - "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", - "dev": true, - "requires": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - } - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dev": true, - "requires": { - "boolbase": "^1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", - "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", - "dev": true, - "requires": { - "array.prototype.reduce": "^1.0.6", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "safe-array-concat": "^1.0.0" - } - }, - "object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "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" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "only": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", - "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==", - "dev": true - }, - "open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "requires": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dev": true, - "requires": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "dependencies": { - "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" - } - }, - "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" - } - }, - "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 - }, - "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 - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "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" - } - }, - "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" - } - } - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true - }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "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" - } - }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "p-queue": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", - "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.4", - "p-timeout": "^3.2.0" - } - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "dev": true - }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - } - } - }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - } - } - }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==", - "dev": true - }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - }, - "dependencies": { - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - } - } - } - } - }, - "pacote": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.3.5.tgz", - "integrity": "sha512-fT375Yczn4zi+6Hkk2TBe1x1sP8FgFsEIZ2/iWaXY2r/NkhDJfxbcn5paz1+RTFCyNf+dPnaoBDJoAxXSU8Bkg==", - "dev": true, - "requires": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - } - }, - "panzoom": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/panzoom/-/panzoom-9.4.3.tgz", - "integrity": "sha512-xaxCpElcRbQsUtIdwlrZA90P90+BHip4Vda2BC8MEb4tkI05PmR6cKECdqUCZ85ZvBHjpI9htJrZBxV5Gp/q/w==", - "requires": { - "amator": "^1.1.0", - "ngraph.events": "^1.2.2", - "wheel": "^1.0.0" - } - }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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" - } - }, - "parse-conflict-json": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz", - "integrity": "sha512-4gySviBiW5TRl7XHvp1agcS7SOe0KZOjC//71dzZVWJrY9hCrgtvl5v3SyIxCZ4fZF47TxD9nfzmxcx76xmbUw==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "just-diff": "^3.0.1", - "just-diff-apply": "^3.0.0" - } - }, - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true - }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "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-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true - } - } - }, - "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 - }, - "pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true - }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "periscopic": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-2.0.3.tgz", - "integrity": "sha512-FuCZe61mWxQOJAQFEfmt9FjzebRlcpFz8sFPbyaCKtdusPkMEbA9ey0eARnRav5zAhmXznhaQkKGFAPn7X9NUw==", - "dev": true, - "requires": { - "estree-walker": "^2.0.2", - "is-reference": "^1.1.4" - }, - "dependencies": { - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - } - } - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - } - } - }, - "please-upgrade-node": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", - "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", - "dev": true, - "requires": { - "semver-compare": "^1.0.0" - } - }, - "polyfills-loader": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/polyfills-loader/-/polyfills-loader-1.7.6.tgz", - "integrity": "sha512-AiLIgmGFmzcvsqewyKsqWb7H8CnWNTSQBoM0u+Mauzmp0DsjObXmnZdeqvTn0HNwc1wYHHTOta82WjSjG341eQ==", - "dev": true, - "requires": { - "@babel/core": "^7.11.1", - "@open-wc/building-utils": "^2.18.3", - "@webcomponents/webcomponentsjs": "^2.4.0", - "abortcontroller-polyfill": "^1.4.0", - "core-js-bundle": "^3.6.0", - "deepmerge": "^4.2.2", - "dynamic-import-polyfill": "^0.1.1", - "es-module-shims": "^0.4.6", - "intersection-observer": "^0.7.0", - "parse5": "^5.1.1", - "regenerator-runtime": "^0.13.3", - "resize-observer-polyfill": "^1.5.1", - "systemjs": "^6.3.1", - "terser": "^4.6.7", - "whatwg-fetch": "^3.0.0" - }, - "dependencies": { - "es-module-shims": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/es-module-shims/-/es-module-shims-0.4.7.tgz", - "integrity": "sha512-0LTiSQoPWwdcaTVIQXhGlaDwTneD0g9/tnH1PNs3zHFFH+xoCeJclDM3rQeqF9nurXPfMKm3l9+kfPRa5VpbKg==", - "dev": true - }, - "parse5": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", - "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - } - } - }, - "portfinder": { - "version": "1.0.32", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", - "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", - "dev": true, - "requires": { - "async": "^2.6.4", - "debug": "^3.2.7", - "mkdirp": "^0.5.6" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "requires": { - "minimist": "^1.2.6" - } - } - } - }, - "postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "dev": true, - "requires": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - } - }, - "postcss-modules": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.3.1.tgz", - "integrity": "sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==", - "dev": true, - "requires": { - "generic-names": "^4.0.0", - "icss-replace-symbols": "^1.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - } - }, - "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, - "requires": {} - }, - "postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - } - }, - "postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "requires": { - "icss-utils": "^5.0.0" - } - }, - "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - } - }, - "postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "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 - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true - }, - "proc-log": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-1.0.0.tgz", - "integrity": "sha512-aCk8AO51s+4JyuYGg3Q/a6gnrlDO09NpVWePtjp7xwphcoQ04x5WAfCyugcsbLooWcMJ87CLkD4+604IckEdhg==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "promise-all-reject-late": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", - "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", - "dev": true - }, - "promise-call-limit": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz", - "integrity": "sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", - "dev": true - }, - "promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true - }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, - "puppeteer-core": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", - "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", - "dev": true, - "requires": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.981744", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.5.0" - }, - "dependencies": { - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "requires": {} - } - } - }, - "pure-rand": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", - "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", - "dev": true - }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", - "dev": true - }, - "qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dev": true, - "requires": { - "side-channel": "^1.0.4" - } - }, - "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 - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "requires": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "dependencies": { - "http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true - } - } - }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true - } - } - }, - "read-cmd-shim": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-2.0.0.tgz", - "integrity": "sha512-HJpV9bQpkl6KwjxlJcBoqu9Ba0PQg8TqSNIOrulGt54a0uup0HtevreFHzYzkm0lpnleRdNBzXznKrgxglEHQw==", - "dev": true - }, - "read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", - "dev": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - } - } - }, - "readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "dev": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true - }, - "regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dev": true, - "requires": { - "regenerate": "^1.4.2" - } - }, - "regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.8.4" - } - }, - "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "requires": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - } - }, - "registry-auth-token": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz", - "integrity": "sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==", - "dev": true, - "requires": { - "rc": "1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "dev": true - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", - "dev": true - }, - "resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "dev": true - }, - "resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", - "dev": true - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-global": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", - "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", - "dev": true, - "requires": { - "global-dirs": "^0.1.1" - } - }, - "resolve-path": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", - "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", - "dev": true, - "requires": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true - }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - } - } - }, - "responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "requires": { - "fsevents": "~2.3.2" - } - }, - "rollup-plugin-polyfill-node": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-polyfill-node/-/rollup-plugin-polyfill-node-0.6.2.tgz", - "integrity": "sha512-gMCVuR0zsKq0jdBn8pSXN1Ejsc458k2QsFFvQdbHoM0Pot5hEnck+pBP/FDwFS6uAi77pD3rDTytsaUStsOMlA==", - "dev": true, - "requires": { - "@rollup/plugin-inject": "^4.0.0" - } - }, - "rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "dependencies": { - "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "terser": { - "version": "5.24.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.24.0.tgz", - "integrity": "sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - } - } - }, - "run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", - "dev": true - }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - } - }, - "serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "requires": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, - "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - } - }, - "setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "shady-css-scoped-element": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/shady-css-scoped-element/-/shady-css-scoped-element-0.0.2.tgz", - "integrity": "sha512-Dqfl70x6JiwYDujd33ZTbtCK0t52E7+H2swdWQNSTzfsolSa6LJHnTpN4T9OpJJEq4bxuzHRLFO9RBcy/UfrMQ==", - "dev": true - }, - "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 - }, - "shiki": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.9.15.tgz", - "integrity": "sha512-/Y0z9IzhJ8nD9nbceORCqu6NgT9X6I8Fk8c3SICHI5NbZRLdZYFaB233gwct9sU0vvSypyaL/qaKvzyQGJBZSw==", - "dev": true, - "requires": { - "jsonc-parser": "^3.0.0", - "vscode-oniguruma": "^1.6.1", - "vscode-textmate": "5.2.0" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "sinon": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", - "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^7.1.2", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" - }, - "dependencies": { - "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 - }, - "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" - } - } - } - }, - "sinon-chai": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-3.7.0.tgz", - "integrity": "sha512-mf5NURdUaSdnatJx3uhoBOrY9dtL19fiOtAdT1Azxg3+lNJFiuN0uzaU3xX1LeAfL17kHQhTAJgpsfhbMJMY2g==", - "dev": true, - "requires": {} - }, - "skypack": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/skypack/-/skypack-0.3.2.tgz", - "integrity": "sha512-je1pix0QYER6iHuUGbgcafRJT5TI+EGUIBfzBLMqo3Wi22I2SzB9TVHQqwKCw8pzJMuHqhVTFEHc3Ey+ra25Sw==", - "dev": true, - "requires": { - "cacache": "^15.0.0", - "cachedir": "^2.3.0", - "esinstall": "^1.0.0", - "etag": "^1.8.1", - "find-up": "^5.0.0", - "got": "^11.1.4", - "kleur": "^4.1.0", - "mkdirp": "^1.0.3", - "p-queue": "^6.2.1", - "rimraf": "^3.0.0", - "rollup": "^2.23.0", - "validate-npm-package-name": "^3.0.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "dependencies": { - "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" - } - }, - "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 - } - } - }, - "smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true - }, - "snowpack": { - "version": "3.8.6", - "resolved": "https://registry.npmjs.org/snowpack/-/snowpack-3.8.6.tgz", - "integrity": "sha512-EZ3Y7RtTiPvxnVFTKPfkvi2PKBrprXCvOHKWQQLBkHonf+xdtG51RiNjtrRLJeCjislAlD6OoeGHUxz76ToGHw==", - "dev": true, - "requires": { - "@npmcli/arborist": "^2.6.4", - "bufferutil": "^4.0.2", - "cachedir": "^2.3.0", - "cheerio": "1.0.0-rc.10", - "chokidar": "^3.4.0", - "cli-spinners": "^2.5.0", - "compressible": "^2.0.18", - "cosmiconfig": "^7.0.0", - "deepmerge": "^4.2.2", - "default-browser-id": "^2.0.0", - "detect-port": "^1.3.0", - "es-module-lexer": "^0.3.24", - "esbuild": "~0.9.0", - "esinstall": "^1.1.7", - "estree-walker": "^2.0.2", - "etag": "^1.8.1", - "execa": "^5.1.1", - "fdir": "^5.0.0", - "find-cache-dir": "^3.3.1", - "find-up": "^5.0.0", - "fsevents": "^2.3.2", - "glob": "^7.1.7", - "httpie": "^1.1.2", - "is-plain-object": "^5.0.0", - "is-reference": "^1.2.1", - "isbinaryfile": "^4.0.6", - "jsonschema": "~1.2.5", - "kleur": "^4.1.1", - "meriyah": "^3.1.6", - "mime-types": "^2.1.26", - "mkdirp": "^1.0.3", - "npm-run-path": "^4.0.1", - "open": "^8.2.1", - "pacote": "^11.3.4", - "periscopic": "^2.0.3", - "picomatch": "^2.3.0", - "postcss": "^8.3.5", - "postcss-modules": "^4.0.0", - "resolve": "^1.20.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "rollup": "~2.37.1", - "signal-exit": "^3.0.3", - "skypack": "^0.3.2", - "slash": "~3.0.0", - "source-map": "^0.7.3", - "strip-ansi": "^6.0.0", - "strip-comments": "^2.0.1", - "utf-8-validate": "^5.0.3", - "ws": "^7.3.0", - "yargs-parser": "^20.0.0" - }, - "dependencies": { - "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 - }, - "es-module-lexer": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", - "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", - "dev": true - }, - "esbuild": { - "version": "0.9.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.9.7.tgz", - "integrity": "sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg==", - "dev": true - }, - "estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "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" - } - }, - "rollup": { - "version": "2.37.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.37.1.tgz", - "integrity": "sha512-V3ojEeyGeSdrMSuhP3diBb06P+qV4gKQeanbDv+Qh/BZbhdZ7kHV0xAt8Yjk4GFshq/WjO7R4c7DFM20AwTFVQ==", - "dev": true, - "requires": { - "fsevents": "~2.1.2" - }, - "dependencies": { - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": 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" - } - } - } - }, - "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", - "dev": true, - "requires": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "dependencies": { - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - } - } - }, - "socks-proxy-agent": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.1.tgz", - "integrity": "sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==", - "dev": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.3", - "socks": "^2.6.2" - } - }, - "source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "dev": true - }, - "source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true - }, - "spawn-command": { - "version": "0.0.2-1", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", - "integrity": "sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==", - "dev": true - }, - "spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", - "dev": true - }, - "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "requires": { - "through": "2" - } - }, - "split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dev": true, - "requires": { - "readable-stream": "^3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "dev": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "standard-version": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-9.5.0.tgz", - "integrity": "sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "conventional-changelog": "3.1.25", - "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.6.3", - "conventional-recommended-bump": "6.1.0", - "detect-indent": "^6.0.0", - "detect-newline": "^3.1.0", - "dotgitignore": "^2.1.0", - "figures": "^3.1.0", - "find-up": "^5.0.0", - "git-semver-tags": "^4.0.0", - "semver": "^7.1.1", - "stringify-package": "^1.0.1", - "yargs": "^16.0.0" - }, - "dependencies": { - "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 - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "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" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - } - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - }, - "stream-read-all": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/stream-read-all/-/stream-read-all-3.0.1.tgz", - "integrity": "sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - } - } - }, - "string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true - }, - "string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "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 - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "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" - } - } - } - }, - "string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - } - }, - "string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - } - }, - "stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dev": true, - "requires": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "dependencies": { - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "dev": true - } - } - }, - "stringify-package": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.1.tgz", - "integrity": "sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "dev": true - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "requires": { - "min-indent": "^1.0.0" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "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": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "systemjs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.14.2.tgz", - "integrity": "sha512-1TlOwvKWdXxAY9vba+huLu99zrQURDWA8pUTYsRIYDZYQbGyK+pyEP4h4dlySsqo7ozyJBmYD20F+iUHhAltEg==", - "dev": true - }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "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" - } - }, - "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 - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "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" - } - } - } - }, - "table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true - }, - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dev": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "dependencies": { - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - }, - "dependencies": { - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - } - } - }, - "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true - }, - "tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dev": true, - "requires": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "dependencies": { - "type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "dev": true - } - } - }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, - "terser": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", - "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "text-extensions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", - "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", - "dev": true - }, - "text-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 - }, - "thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "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" - } - }, - "toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "tr46": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", - "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", - "dev": true, - "requires": { - "punycode": "^2.1.1" - } - }, - "tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true - }, - "treeverse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-1.0.4.tgz", - "integrity": "sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==", - "dev": true - }, - "trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", - "dev": true - }, - "ts-node": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz", - "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==", - "dev": true, - "requires": { - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "source-map-support": "^0.5.17", - "yn": "3.1.1" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - } - } - }, - "ts-simple-type": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/ts-simple-type/-/ts-simple-type-1.0.7.tgz", - "integrity": "sha512-zKmsCQs4dZaeSKjEA7pLFDv7FHHqAFLPd0Mr//OIJvu8M+4p4bgSFJwZSEBEg3ec9W7RzRz1vi8giiX0+mheBQ==", - "dev": true - }, - "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "tsscmp": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", - "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", - "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" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - } - }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "typedoc": { - "version": "0.21.10", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.21.10.tgz", - "integrity": "sha512-Y0wYIehkjkPfsp3pv86fp3WPHUcOf8pnQUDLwG1PqSccUSqdsv7Pz1Gd5WrTJvXQB2wO1mKlZ8qW8qMiopKyjA==", - "dev": true, - "requires": { - "glob": "^7.1.7", - "handlebars": "^4.7.7", - "lunr": "^2.3.9", - "marked": "^4.0.10", - "minimatch": "^3.0.0", - "progress": "^2.0.3", - "shiki": "^0.9.8", - "typedoc-default-themes": "^0.12.10" - }, - "dependencies": { - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, - "typedoc-default-themes": { - "version": "0.12.10", - "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.12.10.tgz", - "integrity": "sha512-fIS001cAYHkyQPidWXmHuhs8usjP5XVJjWB8oZGqkTowZaz3v7g3KDZeeqE82FBrmkAnIBOY3jgy7lnPnqATbA==", - "dev": true - }, - "typedoc-plugin-markdown": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.10.4.tgz", - "integrity": "sha512-if9w7S9fXLg73AYi/EoRSEhTOZlg3I8mIP8YEmvzSE33VrNXC9/hA0nVcLEwFVJeQY7ay6z67I6kW0KIv7LjeA==", - "dev": true, - "requires": { - "handlebars": "^4.7.7" - } - }, - "typescript": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.3.5.tgz", - "integrity": "sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==", - "dev": true - }, - "typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true - }, - "ua-parser-js": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", - "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", - "dev": true - }, - "uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "requires": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true - }, - "unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "requires": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - } - }, - "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true - }, - "unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true - }, - "untildify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", - "integrity": "sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "update-notifier": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", - "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", - "dev": true, - "requires": { - "boxen": "^4.2.0", - "chalk": "^3.0.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.1", - "is-npm": "^4.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.0.0", - "pupa": "^2.0.1", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "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" - } - }, - "chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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 - }, - "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 - }, - "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" - } - } - } - }, - "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" - } - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "dev": true, - "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - } - } - }, - "utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "dev": true, - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true - }, - "v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true - }, - "v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dev": true, - "requires": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - } - } - }, - "valid-url": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", - "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==", - "dev": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "dependencies": { - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - } - } - }, - "vm2": { - "version": "3.9.19", - "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", - "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", - "dev": true, - "requires": { - "acorn": "^8.7.0", - "acorn-walk": "^8.2.0" - }, - "dependencies": { - "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true - } - } - }, - "vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "vscode-textmate": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-5.2.0.tgz", - "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", - "dev": true - }, - "walk-up-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz", - "integrity": "sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==", - "dev": true - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "web-component-analyzer": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/web-component-analyzer/-/web-component-analyzer-1.1.7.tgz", - "integrity": "sha512-SqCqN4nU9fU+j0CKXJQ8E4cslLsaezhagY6xoi+hoNPPd55GzR6MY1r5jkoJUVu+g4Wy4uB+JglTt7au4vQ1uA==", - "dev": true, - "requires": { - "fast-glob": "^3.2.2", - "ts-simple-type": "~1.0.5", - "typescript": "^3.8.3", - "yargs": "^15.3.1" - }, - "dependencies": { - "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" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "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 - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "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" - } - }, - "typescript": { - "version": "3.9.10", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", - "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==", - "dev": true - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "dev": true - }, - "whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==", - "dev": true - }, - "whatwg-url": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", - "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", - "dev": true, - "requires": { - "tr46": "^3.0.0", - "webidl-conversions": "^7.0.0" - } - }, - "wheel": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wheel/-/wheel-1.0.0.tgz", - "integrity": "sha512-XiCMHibOiqalCQ+BaNSwRoZ9FDTAvOsXxGHXChBugewDj7HC8VBIER71dEOiRH1fSdLbRCQzngKTSiZ06ZQzeA==" - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "wicg-inert": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/wicg-inert/-/wicg-inert-3.1.2.tgz", - "integrity": "sha512-Ba9tGNYxXwaqKEi9sJJvPMKuo063umUPsHN0JJsjrs2j8KDSzkWLMZGZ+MH1Jf1Fq4OWZ5HsESJID6nRza2ang==" - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "dependencies": { - "typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true - } - } - }, - "workbox-background-sync": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", - "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", - "dev": true, - "requires": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "workbox-broadcast-update": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", - "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", - "dev": true, - "requires": { - "workbox-core": "6.6.0" - } - }, - "workbox-build": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", - "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", - "dev": true, - "requires": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.6.0", - "workbox-broadcast-update": "6.6.0", - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-google-analytics": "6.6.0", - "workbox-navigation-preload": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-range-requests": "6.6.0", - "workbox-recipes": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0", - "workbox-streams": "6.6.0", - "workbox-sw": "6.6.0", - "workbox-window": "6.6.0" - }, - "dependencies": { - "@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dev": true, - "requires": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - } - }, - "@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dev": true, - "requires": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - } - }, - "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "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" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dev": true, - "requires": { - "whatwg-url": "^7.0.0" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dev": true, - "requires": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - } - } - }, - "workbox-cacheable-response": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", - "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", - "dev": true, - "requires": { - "workbox-core": "6.6.0" - } - }, - "workbox-cli": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-cli/-/workbox-cli-6.6.0.tgz", - "integrity": "sha512-EW+jbxWJlPqjwr0vse925tKq591APTq5d3/DWEh97KGI/JFb/Fzlckk1TRoU4d50Xr6IqlKkOZJUYRmqONf+VQ==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "chokidar": "^3.5.2", - "common-tags": "^1.8.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "inquirer": "^7.3.3", - "meow": "^7.1.0", - "ora": "^5.0.0", - "pretty-bytes": "^5.3.0", - "stringify-object": "^3.3.0", - "upath": "^1.2.0", - "update-notifier": "^4.1.0", - "workbox-build": "6.6.0" - }, - "dependencies": { - "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" - } - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "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" - } - }, - "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 - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "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" - } - }, - "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 - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "meow": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz", - "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^2.5.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "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" - } - }, - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "workbox-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", - "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==", - "dev": true - }, - "workbox-expiration": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", - "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", - "dev": true, - "requires": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "workbox-google-analytics": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", - "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", - "dev": true, - "requires": { - "workbox-background-sync": "6.6.0", - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "workbox-navigation-preload": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", - "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", - "dev": true, - "requires": { - "workbox-core": "6.6.0" - } - }, - "workbox-precaching": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", - "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", - "dev": true, - "requires": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "workbox-range-requests": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", - "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", - "dev": true, - "requires": { - "workbox-core": "6.6.0" - } - }, - "workbox-recipes": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", - "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", - "dev": true, - "requires": { - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "workbox-routing": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", - "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", - "dev": true, - "requires": { - "workbox-core": "6.6.0" - } - }, - "workbox-strategies": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", - "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", - "dev": true, - "requires": { - "workbox-core": "6.6.0" - } - }, - "workbox-streams": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", - "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", - "dev": true, - "requires": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0" - } - }, - "workbox-sw": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", - "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==", - "dev": true - }, - "workbox-window": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", - "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", - "dev": true, - "requires": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.6.0" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "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" - } - }, - "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 - }, - "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" - } - } - } - }, - "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 - }, - "write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "requires": {} - }, - "xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true - }, - "yamlparser": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/yamlparser/-/yamlparser-0.0.2.tgz", - "integrity": "sha512-Cou9FCGblEENtn1/8La5wkDM/ISMh2bzu5Wh7dYzCzA0o9jD4YGyLkUJxe84oPBGoB92f+Oy4ZjVhA8S0C2wlQ==", - "dev": true - }, - "yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "dependencies": { - "yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "dependencies": { - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "ylru": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", - "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true - } - } -} diff --git a/packages/compas-open-scd/package.json b/packages/compas-open-scd/package.json index a76556d70..1414e21bf 100644 --- a/packages/compas-open-scd/package.json +++ b/packages/compas-open-scd/package.json @@ -42,7 +42,8 @@ "lit-html": "1.4.1", "lit-translate": "^1.2.1", "marked": "^4.0.10", - "panzoom": "^9.4.2" + "panzoom": "^9.4.2", + "open-scd": "*" }, "scripts": { "lint:eslint": "eslint --ext .ts,.html . --ignore-path .gitignore", diff --git a/packages/compas-open-scd/public/js/plugins.js b/packages/compas-open-scd/public/js/plugins.js index 1c2dd0043..e1b33f150 100644 --- a/packages/compas-open-scd/public/js/plugins.js +++ b/packages/compas-open-scd/public/js/plugins.js @@ -1,84 +1,84 @@ export const officialPlugins = [ { name: 'IED', - src: '/src/editors/IED.js', + src: '/open-scd/src/editors/IED.js', icon: 'developer_board', default: true, kind: 'editor', }, { name: 'Substation', - src: '/src/editors/Substation.js', + src: '/open-scd/src/editors/Substation.js', icon: 'margin', default: true, kind: 'editor', }, { name: 'Single Line Diagram', - src: '/src/editors/SingleLineDiagram.js', + src: '/open-scd/src/editors/SingleLineDiagram.js', icon: 'edit', default: true, kind: 'editor', }, { name: 'Subscriber Message Binding (GOOSE)', - src: '/src/editors/GooseSubscriberMessageBinding.js', + src: '/open-scd/src/editors/GooseSubscriberMessageBinding.js', icon: 'link', default: false, kind: 'editor', }, { name: 'Subscriber Data Binding (GOOSE)', - src: '/src/editors/GooseSubscriberDataBinding.js', + src: '/open-scd/src/editors/GooseSubscriberDataBinding.js', icon: 'link', default: false, kind: 'editor', }, { name: 'Subscriber Later Binding (GOOSE)', - src: '/src/editors/GooseSubscriberLaterBinding.js', + src: '/open-scd/src/editors/GooseSubscriberLaterBinding.js', icon: 'link', default: true, kind: 'editor', }, { name: 'Subscriber Message Binding (SMV)', - src: '/src/editors/SMVSubscriberMessageBinding.js', + src: '/open-scd/src/editors/SMVSubscriberMessageBinding.js', icon: 'link', default: false, kind: 'editor', }, { name: 'Subscriber Data Binding (SMV)', - src: '/src/editors/SMVSubscriberDataBinding.js', + src: '/open-scd/src/editors/SMVSubscriberDataBinding.js', icon: 'link', default: false, kind: 'editor', }, { name: 'Subscriber Later Binding (SMV)', - src: '/src/editors/SMVSubscriberLaterBinding.js', + src: '/open-scd/src/editors/SMVSubscriberLaterBinding.js', icon: 'link', default: true, kind: 'editor', }, { name: 'Communication', - src: '/src/editors/Communication.js', + src: '/open-scd/src/editors/Communication.js', icon: 'settings_ethernet', default: true, kind: 'editor', }, { name: '104', - src: '/src/editors/Protocol104.js', + src: '/open-scd/src/editors/Protocol104.js', icon: 'settings_ethernet', default: false, kind: 'editor', }, { name: 'Templates', - src: '/src/editors/Templates.js', + src: '/open-scd/src/editors/Templates.js', icon: 'copy_all', default: true, kind: 'editor', @@ -92,14 +92,14 @@ export const officialPlugins = [ }, { name: 'Publisher', - src: '/src/editors/Publisher.js', + src: '/open-scd/src/editors/Publisher.js', icon: 'publish', default: false, kind: 'editor', }, { name: 'Cleanup', - src: '/src/editors/Cleanup.js', + src: '/open-scd/src/editors/Cleanup.js', icon: 'cleaning_services', default: false, kind: 'editor', @@ -115,7 +115,7 @@ export const officialPlugins = [ }, { name: 'New project', - src: '/src/menu/NewProject.js', + src: '/open-scd/src/menu/NewProject.js', icon: 'create_new_folder', default: true, kind: 'menu', @@ -176,14 +176,14 @@ export const officialPlugins = [ }, { name: 'Validate Schema', - src: '/src/validators/ValidateSchema.js', + src: '/open-scd/src/validators/ValidateSchema.js', icon: 'rule_folder', default: true, kind: 'validator', }, { name: 'Validate Templates', - src: '/src/validators/ValidateTemplates.js', + src: '/open-scd/src/validators/ValidateTemplates.js', icon: 'rule_folder', default: true, kind: 'validator', @@ -199,7 +199,7 @@ export const officialPlugins = [ }, { name: 'Create Virtual IED', - src: '/src/menu/VirtualTemplateIED.js', + src: '/open-scd/src/menu/VirtualTemplateIED.js', icon: 'developer_board', default: false, kind: 'menu', @@ -208,7 +208,7 @@ export const officialPlugins = [ }, { name: 'Subscriber Update', - src: '/src/menu/SubscriberInfo.js', + src: '/open-scd/src/menu/SubscriberInfo.js', default: true, kind: 'menu', requireDoc: true, @@ -216,7 +216,7 @@ export const officialPlugins = [ }, { name: 'Update desc (ABB)', - src: '/src/menu/UpdateDescriptionABB.js', + src: '/open-scd/src/menu/UpdateDescriptionABB.js', default: false, kind: 'menu', requireDoc: true, @@ -224,7 +224,7 @@ export const officialPlugins = [ }, { name: 'Update desc (SEL)', - src: '/src/menu/UpdateDescriptionSEL.js', + src: '/open-scd/src/menu/UpdateDescriptionSEL.js', default: false, kind: 'menu', requireDoc: true, @@ -286,7 +286,7 @@ export const officialPlugins = [ }, { name: 'Show SCL History', - src: '/src/menu/SclHistory.js', + src: '/open-scd/src/menu/SclHistory.js', icon: 'history_toggle_off', default: true, kind: 'menu', @@ -304,7 +304,7 @@ export const officialPlugins = [ }, { name: 'Help', - src: '/src/menu/Help.js', + src: '/open-scd/src/menu/Help.js', icon: 'help', default: true, kind: 'menu', @@ -313,7 +313,7 @@ export const officialPlugins = [ }, { name: 'Export Communication Section', - src: '/src/menu/ExportCommunication.js', + src: '/open-scd/src/menu/ExportCommunication.js', icon: 'sim_card_download', default: false, kind: 'menu', diff --git a/packages/compas-open-scd/snowpack.config.mjs b/packages/compas-open-scd/snowpack.config.mjs index 72cd15a9d..e7b157576 100644 --- a/packages/compas-open-scd/snowpack.config.mjs +++ b/packages/compas-open-scd/snowpack.config.mjs @@ -1,5 +1,5 @@ export default ({ - plugins: ["@snowpack/plugin-typescript"], + plugins: ['@snowpack/plugin-typescript'], packageOptions : { external: ['@web/dev-server-core','@web/dev-server-esbuild','esbuild','crypto'], }, @@ -24,4 +24,13 @@ export default ({ "**/.idea/**", "**/web-test-runner.config.mjs", ], + workspaceRoot: "../../", + mount: { + "../open-scd/": "/open-scd/", + "./": "/", + }, + alias: { + "open-scd": "../open-scd/", + }, }); + diff --git a/packages/compas-open-scd/src/Editing.ts b/packages/compas-open-scd/src/Editing.ts index 736773378..27b105e77 100644 --- a/packages/compas-open-scd/src/Editing.ts +++ b/packages/compas-open-scd/src/Editing.ts @@ -23,7 +23,7 @@ import { Replace, Update, isUpdate, -} from './foundation.js'; +} from 'open-scd/src/foundation.js'; /** Mixin that edits an `XML` `doc`, listening to [[`EditorActionEvent`]]s */ export type EditingElement = Mixin; diff --git a/packages/compas-open-scd/src/Historing.ts b/packages/compas-open-scd/src/Historing.ts index 142389609..097470e16 100644 --- a/packages/compas-open-scd/src/Historing.ts +++ b/packages/compas-open-scd/src/Historing.ts @@ -19,7 +19,7 @@ import '@material/mwc-snackbar'; import { Dialog } from '@material/mwc-dialog'; import { Snackbar } from '@material/mwc-snackbar'; -import './filtered-list.js'; +import 'open-scd/src/filtered-list.js'; import { CommitDetail, CommitEntry, @@ -37,10 +37,10 @@ import { newActionEvent, newWizardEvent, SCLTag, -} from './foundation.js'; -import { getFilterIcon, iconColors } from './icons/icons.js'; +} from 'open-scd/src/foundation.js'; +import { getFilterIcon, iconColors } from 'open-scd/src/icons/icons.js'; import { Plugin } from './Plugging.js'; -import { wizards } from './wizards/wizard-library.js'; +import { wizards } from 'open-scd/src/wizards/wizard-library.js'; import { nothing } from 'lit-html'; const icons = { diff --git a/packages/compas-open-scd/src/Hosting.ts b/packages/compas-open-scd/src/Hosting.ts index 0734a5fdb..8ac11f3ff 100644 --- a/packages/compas-open-scd/src/Hosting.ts +++ b/packages/compas-open-scd/src/Hosting.ts @@ -15,7 +15,7 @@ import { Drawer } from '@material/mwc-drawer'; import { ActionDetail, List } from '@material/mwc-list'; import { ListItem } from '@material/mwc-list/mwc-list-item'; -import { Mixin, newPendingStateEvent } from './foundation.js'; +import { Mixin, newPendingStateEvent } from 'open-scd/src/foundation.js'; import { UserInfoEvent } from './compas/foundation.js'; import { HistoringElement } from './Historing.js'; import { PluggingElement, Plugin, pluginIcons } from './Plugging.js'; diff --git a/packages/compas-open-scd/src/Plugging.ts b/packages/compas-open-scd/src/Plugging.ts index 08c2d4676..51432b20c 100644 --- a/packages/compas-open-scd/src/Plugging.ts +++ b/packages/compas-open-scd/src/Plugging.ts @@ -21,10 +21,10 @@ import { Select } from '@material/mwc-select'; import { Switch } from '@material/mwc-switch'; import { TextField } from '@material/mwc-textfield'; -import { ifImplemented, Mixin } from './foundation.js'; +import { ifImplemented, Mixin } from 'open-scd/src/foundation.js'; import { EditingElement } from './Editing.js'; import { officialPlugins } from '../public/js/plugins.js'; -import { Nsdoc } from './foundation/nsdoc.js'; +import { Nsdoc } from 'open-scd/src/foundation/nsdoc.js'; import { HistoringElement } from './Historing.js'; const pluginTags = new Map(); /** diff --git a/packages/compas-open-scd/src/Setting.ts b/packages/compas-open-scd/src/Setting.ts index 1504bad2b..2d24b8b9a 100644 --- a/packages/compas-open-scd/src/Setting.ts +++ b/packages/compas-open-scd/src/Setting.ts @@ -17,10 +17,10 @@ import { LitElementConstructor, Mixin, newLogEvent, -} from './foundation.js'; +} from 'open-scd/src/foundation.js'; import { Language, languages, loader } from './translations/loader.js'; -import './WizardDivider.js'; +import 'open-scd/src/WizardDivider.js'; import { WizardDialog } from './wizard-dialog.js'; import { @@ -28,8 +28,8 @@ import { iec6185073, iec6185074, iec6185081, -} from './validators/templates/foundation.js'; -import { initializeNsdoc, Nsdoc } from './foundation/nsdoc.js'; +} from 'open-scd/src/validators/templates/foundation.js'; +import { initializeNsdoc, Nsdoc } from 'open-scd/src/foundation/nsdoc.js'; export type Settings = { language: Language; diff --git a/packages/compas-open-scd/src/Waiting.ts b/packages/compas-open-scd/src/Waiting.ts deleted file mode 100644 index 912dd0c39..000000000 --- a/packages/compas-open-scd/src/Waiting.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { html, property, TemplateResult } from 'lit-element'; - -import '@material/mwc-linear-progress'; - -import { - LitElementConstructor, - Mixin, - PendingStateDetail, - ifImplemented, -} from './foundation.js'; - -/** Mixin implementing - * [Pending State](https://github.com/justinfagnani/pending-state-protocol) */ -export type WaitingElement = Mixin; - -export function Waiting(Base: TBase) { - class WaitingElement extends Base { - /** Whether the element is currently waiting for some async work. */ - @property({ type: Boolean }) - waiting = false; - - private work: Set> = new Set(); - /** A promise which resolves once all currently pending work is done. */ - workDone = Promise.allSettled(this.work); - - private async onPendingState(e: CustomEvent) { - this.waiting = true; - this.work.add(e.detail.promise); - this.workDone = Promise.allSettled(this.work); - await e.detail.promise.catch(reason => console.warn(reason)); - this.work.delete(e.detail.promise); - this.waiting = this.work.size > 0; - } - - constructor(...args: any[]) { - super(...args); - - this.onPendingState = this.onPendingState.bind(this); - this.addEventListener('pending-state', this.onPendingState); - } - - render(): TemplateResult { - return html`${ifImplemented(super.render())} - `; - } - } - - return WaitingElement; -} diff --git a/packages/compas-open-scd/src/WizardDivider.ts b/packages/compas-open-scd/src/WizardDivider.ts deleted file mode 100644 index bef16841a..000000000 --- a/packages/compas-open-scd/src/WizardDivider.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - TemplateResult, -} from 'lit-element'; - -@customElement('wizard-divider') -export class WizardDividerElement extends LitElement { - @property({ - type: String, - }) - header?: string; - - render(): TemplateResult { - return html` ${this.renderHeader()} ${this.renderSeparator()}`; - } - - private renderHeader(): TemplateResult { - if (!this.header) { - return html``; - } - - return html`

${this.header}

`; - } - - private renderSeparator(): TemplateResult { - return html`
`; - } - - static styles = css` - div { - height: 0px; - margin: 10px 0px 10px 0px; - border-top: none; - border-right: none; - border-left: none; - border-image: initial; - border-bottom: 1px solid rgba(0, 0, 0, 0.12); - } - `; -} diff --git a/packages/compas-open-scd/src/Wizarding.ts b/packages/compas-open-scd/src/Wizarding.ts deleted file mode 100644 index 85f107a7c..000000000 --- a/packages/compas-open-scd/src/Wizarding.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { html, internalProperty, TemplateResult, query } from 'lit-element'; -import { - ifImplemented, - LitElementConstructor, - Mixin, - WizardEvent, - WizardFactory, -} from './foundation.js'; - -import './wizard-dialog.js'; -import { WizardDialog } from './wizard-dialog.js'; - -/** `LitElement` mixin that adds a `workflow` property which [[`Wizard`]]s are - * queued onto on incoming [[`WizardEvent`]]s, first come first displayed. */ -export type WizardingElement = Mixin; - -export function Wizarding(Base: TBase) { - class WizardingElement extends Base { - /** FIFO queue of [[`Wizard`]]s to display. */ - @internalProperty() - workflow: WizardFactory[] = []; - - @query('wizard-dialog') wizardUI!: WizardDialog; - - private onWizard(we: WizardEvent) { - const wizard = we.detail.wizard; - if (wizard === null) this.workflow.shift(); - else if (we.detail.subwizard) this.workflow.unshift(wizard); - else this.workflow.push(wizard); - this.requestUpdate('workflow'); - this.updateComplete.then(() => - this.wizardUI.updateComplete.then(() => - this.wizardUI.dialog?.updateComplete.then(() => - this.wizardUI.dialog?.focus() - ) - ) - ); - } - - constructor(...args: any[]) { - super(...args); - - this.addEventListener('wizard', this.onWizard); - this.addEventListener('editor-action', () => - this.wizardUI.requestUpdate() - ); - } - - render(): TemplateResult { - return html`${ifImplemented(super.render())} - `; - } - } - - return WizardingElement; -} diff --git a/packages/compas-open-scd/src/action-icon.ts b/packages/compas-open-scd/src/action-icon.ts deleted file mode 100644 index 6b09d2ea1..000000000 --- a/packages/compas-open-scd/src/action-icon.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - TemplateResult, -} from 'lit-element'; -import { nothing } from 'lit-html'; - -import '@material/mwc-icon'; - -/** - * A responsive container rendering actions in a header. - * - * The "action" slot may contain up to eight icon buttons. - * The "icon" slot, if filled overrides the icon property. - * The default slot will be rendered into the pane body in a single column. - */ -@customElement('action-icon') -export class ActionIcon extends LitElement { - /** caption text, displayed in the header */ - @property({ type: String }) - label?: string; - /** icon name, displayed unless the "icon" slot is filled */ - @property({ type: String }) - icon?: string; - /** color header with secondary theme color while focus is within */ - @property({ type: Boolean }) - secondary = false; - /** highlight pane with dotted outline */ - @property({ type: Boolean }) - highlighted = false; - /** disables CSS adoption to action buttons */ - @property({ type: Boolean }) - hideActions = false; - - async firstUpdated(): Promise { - this.tabIndex = 0; - } - - private renderIcon(): TemplateResult { - return html` - ${this.icon ? html`${this.icon}` : nothing} `; - } - - render(): TemplateResult { - return html`
${this.label ?? nothing}
-
${this.renderIcon()}
-
${this.label ?? nothing}
`; - } - - static styles = css` - :host { - display: flex; - flex-direction: column; - outline: none; - } - - section { - align-self: center; - } - - ::slotted([slot='icon']), - mwc-icon { - display: block; - color: var(--mdc-theme-on-surface); - transition: transform 150ms linear, box-shadow 200ms linear; - outline-color: var(--mdc-theme-primary); - outline-style: solid; - margin: 0px; - outline-width: 0px; - width: 64px; - height: 64px; - --mdc-icon-size: 64px; - } - - :host([secondary]) ::slotted([slot='icon']), - :host([secondary]) mwc-icon { - outline-color: var(--mdc-theme-secondary); - } - - :host([highlighted]) ::slotted([slot='icon']), - :host([highlighted]) mwc-icon { - outline-style: dotted; - outline-width: 2px; - } - - :host(:focus-within) ::slotted([slot='icon']), - :host(:focus-within) mwc-icon { - outline-style: solid; - outline-width: 4px; - } - - :host(:focus-within:not([hideActions])) ::slotted([slot='icon']), - :host(:focus-within:not([hideActions])) mwc-icon { - transform: scale(0.8); - transition: all 250ms linear; - box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), - 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); - } - - ::slotted([slot='icon']:hover), - mwc-icon:hover { - outline-style: dashed; - outline-width: 2px; - transition: transform 200ms linear, box-shadow 250ms linear; - } - - ::slotted([slot='action']) { - color: var(--mdc-theme-on-surface); - transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1), - opacity 200ms linear; - position: absolute; - pointer-events: none; - z-index: 1; - opacity: 0; - margin-top: -56px; - margin-left: 8px; - } - - :host(:focus-within) ::slotted([slot='action']) { - transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1), - opacity 250ms linear; - pointer-events: auto; - opacity: 1; - } - - :host(:focus-within) ::slotted([slot='action']:nth-of-type(1)) { - transform: translate(0px, -52px); - } - :host(:focus-within) ::slotted([slot='action']:nth-of-type(2)) { - transform: translate(0px, 52px); - } - :host(:focus-within) ::slotted([slot='action']:nth-of-type(3)) { - transform: translate(52px, 0px); - } - :host(:focus-within) ::slotted([slot='action']:nth-of-type(4)) { - transform: translate(-52px, 0px); - } - :host(:focus-within) ::slotted([slot='action']:nth-of-type(5)) { - transform: translate(52px, -52px); - } - :host(:focus-within) ::slotted([slot='action']:nth-of-type(6)) { - transform: translate(-52px, 52px); - } - :host(:focus-within) ::slotted([slot='action']:nth-of-type(7)) { - transform: translate(-52px, -52px); - } - :host(:focus-within) ::slotted([slot='action']:nth-of-type(8)) { - transform: translate(52px, 52px); - } - - footer { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - margin: 0px; - text-align: center; - align-self: center; - max-width: 100%; - direction: rtl; - } - - header { - color: var(--mdc-theme-on-primary); - background-color: var(--mdc-theme-primary); - font-family: 'Roboto', sans-serif; - font-weight: 500; - font-size: 1.2em; - position: absolute; - text-align: center; - align-self: center; - max-width: 100vw; - padding: 4px 8px; - border-radius: 4px; - opacity: 0; - transition: transform 200ms cubic-bezier(0.4, 0, 0.2, 1), - opacity 200ms linear; - } - - :host([secondary]) header { - background-color: var(--mdc-theme-secondary); - } - - :host(:hover) header { - position: absolute; - opacity: 1; - transform: translate(0, -40px); - box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), - 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); - transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1), - opacity 250ms linear; - } - - :host(:focus-within) header { - position: absolute; - opacity: 1; - box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), - 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); - transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1), - opacity 250ms linear; - } - - :host(:focus-within:not([hideActions])) header { - transform: translate(0, -80px); - } - - :host(:focus-within[hideActions]) header { - transform: translate(0, -40px); - } - `; -} diff --git a/packages/compas-open-scd/src/action-pane.ts b/packages/compas-open-scd/src/action-pane.ts deleted file mode 100644 index 2102b899a..000000000 --- a/packages/compas-open-scd/src/action-pane.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - TemplateResult, -} from 'lit-element'; -import { classMap } from 'lit-html/directives/class-map'; - -import '@material/mwc-icon'; -import { nothing } from 'lit-html'; - -function closestTo(node: Node, selector: string): E | null { - const closest = - node.nodeType === Node.ELEMENT_NODE - ? (node).closest(selector) - : null; - - if (closest) return closest; - - const root = node.getRootNode(); - - if (root instanceof ShadowRoot) return closestTo(root.host, selector); - - return null; -} - -/** - * A responsive container rendering actions in a header. - * - * The "action" slot may contain up to eight icon buttons. - * The "icon" slot, if filled overrides the icon property. - * The default slot will be rendered into the pane body in a single column. - */ -@customElement('action-pane') -export class ActionPane extends LitElement { - /** caption text, displayed in the header */ - @property({ type: String }) - label?: string; - /** icon name, displayed unless the "icon" slot is filled */ - @property({ type: String }) - icon?: string; - /** color header with secondary theme color while focus is within */ - @property({ type: Boolean }) - secondary = false; - /** highlight pane with dotted outline */ - @property({ type: Boolean }) - highlighted = false; - /** nesting level, default (closest pane ancestor's level) + 1 */ - @property({ type: Number }) - level = 1; - - async firstUpdated(): Promise { - this.tabIndex = 0; - - const parentPane = closestTo(this.parentNode!, 'action-pane'); - if (parentPane) this.level = parentPane.level + 1; - - this.level = Math.floor(this.level); - } - - private renderHeader(): TemplateResult { - const content = html`${this.icon - ? html`${this.icon}` - : nothing} - ${this.label ?? nothing} - `; - - const headingLevel = Math.floor(Math.max(this.level, 1)); - // Sometimes a TemplateResult is passed in as Label, not a string. So only when it's a string show a title. - const title = typeof this.label === 'string' ? this.label : ''; - switch (headingLevel) { - case 1: - return html`

${content}

`; - case 2: - return html`

${content}

`; - case 3: - return html`

${content}

`; - default: - return html`

${content}

`; - } - } - - render(): TemplateResult { - return html`
- ${this.renderHeader()} -
-
`; - } - - static styles = css` - :host { - outline: none; - } - - :host(:focus-within) section { - box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), - 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); - outline-width: 4px; - transition: all 250ms linear; - } - - section { - background-color: var(--mdc-theme-surface); - transition: all 200ms linear; - outline-style: solid; - margin: 0px; - outline-width: 0px; - outline-color: var(--mdc-theme-primary); - } - - section.secondary { - outline-color: var(--mdc-theme-secondary); - } - - section > div { - display: flex; - flex-direction: column; - gap: 12px; - padding: 8px 12px 16px; - clear: right; - } - - .highlighted { - outline-style: dotted; - outline-width: 2px; - } - - :host(:focus-within) .highlighted { - outline-style: solid; - } - - .contrasted { - background-color: var(--mdc-theme-on-primary); - } - - h1, - h2, - h3, - h4 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - overflow: clip visible; - white-space: nowrap; - text-overflow: ellipsis; - margin: 0px; - line-height: 52px; - padding-left: 0.3em; - } - - nav { - float: right; - } - - mwc-icon { - vertical-align: middle; - position: relative; - top: -0.1em; - --mdc-icon-size: 1em; - } - - ::slotted([slot='icon']) { - vertical-align: middle; - position: relative; - top: -0.1em; - --mdc-icon-size: 1em; - } - `; -} diff --git a/packages/compas-open-scd/src/compas-editors/CompasVersions.ts b/packages/compas-open-scd/src/compas-editors/CompasVersions.ts index 2fe1fcb54..394144460 100644 --- a/packages/compas-open-scd/src/compas-editors/CompasVersions.ts +++ b/packages/compas-open-scd/src/compas-editors/CompasVersions.ts @@ -21,14 +21,14 @@ import '@material/mwc-list/mwc-check-list-item'; import { Dialog } from '@material/mwc-dialog'; import { MultiSelectedEvent } from '@material/mwc-list/mwc-list-foundation'; -import '../plain-compare-list.js'; +import 'open-scd/src/plain-compare-list.js'; import { newLogEvent, newOpenDocEvent, newWizardEvent, Wizard, -} from '../foundation.js'; +} from 'open-scd/src/foundation.js'; import { CompasSclDataService, @@ -42,7 +42,7 @@ import { } from '../compas/foundation.js'; import { addVersionToCompasWizard } from '../compas/CompasUploadVersion.js'; import { getElementByName, styles } from './foundation.js'; -import { wizards } from '../wizards/wizard-library.js'; +import { wizards } from 'open-scd/src/wizards/wizard-library.js'; /** An editor [[`plugin`]] for selecting the `Substation` section. */ export default class CompasVersionsPlugin extends LitElement { diff --git a/packages/compas-open-scd/src/compas-editors/Sitipe.ts b/packages/compas-open-scd/src/compas-editors/Sitipe.ts index f7fa485ed..7a7823616 100644 --- a/packages/compas-open-scd/src/compas-editors/Sitipe.ts +++ b/packages/compas-open-scd/src/compas-editors/Sitipe.ts @@ -2,7 +2,7 @@ import { css, html, LitElement, property, TemplateResult } from 'lit-element'; import { translate } from 'lit-translate'; import './sitipe/sitipe-substation.js'; -import { isPublic } from '../foundation.js'; +import { isPublic } from 'open-scd/src/foundation.js'; /** An editor [[`plugin`]] for Sitipe based configuration */ export default class SitipePlugin extends LitElement { diff --git a/packages/compas-open-scd/src/compas-editors/autogen-substation.ts b/packages/compas-open-scd/src/compas-editors/autogen-substation.ts index 4eaeaf116..3bc145649 100644 --- a/packages/compas-open-scd/src/compas-editors/autogen-substation.ts +++ b/packages/compas-open-scd/src/compas-editors/autogen-substation.ts @@ -1,5 +1,5 @@ import { LitElement, property } from 'lit-element'; -import { createElement, newActionEvent, newLogEvent } from '../foundation.js'; +import { createElement, newActionEvent, newLogEvent } from 'open-scd/src/foundation.js'; import { get } from 'lit-translate'; let cbNum = 1; diff --git a/packages/compas-open-scd/src/compas-editors/sitipe/sitipe-bay.ts b/packages/compas-open-scd/src/compas-editors/sitipe/sitipe-bay.ts index 8dee95067..e7457dec0 100644 --- a/packages/compas-open-scd/src/compas-editors/sitipe/sitipe-bay.ts +++ b/packages/compas-open-scd/src/compas-editors/sitipe/sitipe-bay.ts @@ -24,10 +24,10 @@ import { newActionEvent, newLogEvent, SimpleAction, -} from '../../foundation.js'; +} from 'open-scd/src/foundation.js'; -import '../../action-pane.js'; -import '../../action-icon.js'; +import 'open-scd/src/action-pane.js'; +import 'open-scd/src/action-icon.js'; import { SIEMENS_SITIPE_IED_REF, diff --git a/packages/compas-open-scd/src/compas-editors/sitipe/sitipe-substation.ts b/packages/compas-open-scd/src/compas-editors/sitipe/sitipe-substation.ts index ab14b4934..498562ef7 100644 --- a/packages/compas-open-scd/src/compas-editors/sitipe/sitipe-substation.ts +++ b/packages/compas-open-scd/src/compas-editors/sitipe/sitipe-substation.ts @@ -13,8 +13,8 @@ import '@material/mwc-list'; import '@material/mwc-icon'; import '@material/mwc-icon-button'; -import '../../action-pane.js'; -import '../../action-icon.js'; +import 'open-scd/src/action-pane.js'; +import 'open-scd/src/action-icon.js'; import './sitipe-bay.js'; diff --git a/packages/compas-open-scd/src/compas-services/Websocket.ts b/packages/compas-open-scd/src/compas-services/Websocket.ts index 5b169929b..760ea2d4b 100644 --- a/packages/compas-open-scd/src/compas-services/Websocket.ts +++ b/packages/compas-open-scd/src/compas-services/Websocket.ts @@ -1,4 +1,4 @@ -import { newPendingStateEvent } from '../foundation.js'; +import { newPendingStateEvent } from 'open-scd/src/foundation.js'; import { APPLICATION_ERROR, extractErrorMessage, diff --git a/packages/compas-open-scd/src/compas-services/foundation.ts b/packages/compas-open-scd/src/compas-services/foundation.ts index fea95f44a..b0321bf3a 100644 --- a/packages/compas-open-scd/src/compas-services/foundation.ts +++ b/packages/compas-open-scd/src/compas-services/foundation.ts @@ -1,5 +1,5 @@ import { get } from 'lit-translate'; -import { newLogEvent } from '../foundation.js'; +import { newLogEvent } from 'open-scd/src/foundation.js'; export const NOT_FOUND_ERROR = 'NotFoundError'; export const APPLICATION_ERROR = 'ApplicationError'; diff --git a/packages/compas-open-scd/src/compas-wizards/scl.ts b/packages/compas-open-scd/src/compas-wizards/scl.ts index bc648f922..7939e21b2 100644 --- a/packages/compas-open-scd/src/compas-wizards/scl.ts +++ b/packages/compas-open-scd/src/compas-wizards/scl.ts @@ -9,7 +9,7 @@ import { Wizard, WizardActor, WizardInputElement, -} from '../foundation.js'; +} from 'open-scd/src/foundation.js'; import '../compas/CompasLabelsField.js'; diff --git a/packages/compas-open-scd/src/compas/CompasAutoAlignment.ts b/packages/compas-open-scd/src/compas/CompasAutoAlignment.ts index 18b069556..e60c6af20 100644 --- a/packages/compas-open-scd/src/compas/CompasAutoAlignment.ts +++ b/packages/compas-open-scd/src/compas/CompasAutoAlignment.ts @@ -11,7 +11,7 @@ import { get, translate } from 'lit-translate'; import '@material/mwc-list'; import '@material/mwc-list/mwc-check-list-item'; -import { newLogEvent, newOpenDocEvent, newWizardEvent } from '../foundation.js'; +import { newLogEvent, newOpenDocEvent, newWizardEvent } from 'open-scd/src/foundation.js'; import { CompasSclAutoAlignmentService } from '../compas-services/CompasSclAutoAlignmentService.js'; import { createLogEvent } from '../compas-services/foundation.js'; diff --git a/packages/compas-open-scd/src/compas/CompasComment.ts b/packages/compas-open-scd/src/compas/CompasComment.ts index 85a9efffe..56fc9d142 100644 --- a/packages/compas-open-scd/src/compas/CompasComment.ts +++ b/packages/compas-open-scd/src/compas/CompasComment.ts @@ -5,10 +5,10 @@ import { LitElement, TemplateResult, } from 'lit-element'; -import { WizardTextField } from '../wizard-textfield.js'; +import { WizardTextField } from 'open-scd/src/wizard-textfield.js'; import { translate } from 'lit-translate'; -import '../wizard-textfield.js'; +import 'open-scd/src/wizard-textfield.js'; @customElement('compas-comment') export class CompasCommentElement extends LitElement { diff --git a/packages/compas-open-scd/src/compas/CompasExistsIn.ts b/packages/compas-open-scd/src/compas/CompasExistsIn.ts index 64b282885..ae6e78b5d 100644 --- a/packages/compas-open-scd/src/compas/CompasExistsIn.ts +++ b/packages/compas-open-scd/src/compas/CompasExistsIn.ts @@ -1,6 +1,6 @@ import { property, PropertyValues, state } from 'lit-element'; -import { LitElementConstructor, Mixin } from '../foundation.js'; +import { LitElementConstructor, Mixin } from 'open-scd/src/foundation.js'; import { getTypeFromDocName } from './foundation.js'; import { CompasSclDataService } from '../compas-services/CompasSclDataService.js'; diff --git a/packages/compas-open-scd/src/compas/CompasImportFromApi.ts b/packages/compas-open-scd/src/compas/CompasImportFromApi.ts index bebc016ae..446f8a0ce 100644 --- a/packages/compas-open-scd/src/compas/CompasImportFromApi.ts +++ b/packages/compas-open-scd/src/compas/CompasImportFromApi.ts @@ -6,9 +6,9 @@ import { newOpenDocEvent, newPendingStateEvent, newWizardEvent, -} from '../foundation.js'; +} from 'open-scd/src/foundation.js'; -import '../filtered-list.js'; +import 'open-scd/src/filtered-list.js'; import { createLogEvent, diff --git a/packages/compas-open-scd/src/compas/CompasLabelsField.ts b/packages/compas-open-scd/src/compas/CompasLabelsField.ts index f787a4a2a..1814bb08e 100644 --- a/packages/compas-open-scd/src/compas/CompasLabelsField.ts +++ b/packages/compas-open-scd/src/compas/CompasLabelsField.ts @@ -15,9 +15,9 @@ import '@material/mwc-list/mwc-list-item'; import '@material/mwc-icon'; import '@material/mwc-icon-button'; -import { WizardTextField } from '../wizard-textfield.js'; +import { WizardTextField } from 'open-scd/src/wizard-textfield.js'; -import '../wizard-textfield.js'; +import 'open-scd/src/wizard-textfield.js'; import { COMPAS_LABELS_MAXIMUM, diff --git a/packages/compas-open-scd/src/compas/CompasOpen.ts b/packages/compas-open-scd/src/compas/CompasOpen.ts index 8de8e3a89..2b643097b 100644 --- a/packages/compas-open-scd/src/compas/CompasOpen.ts +++ b/packages/compas-open-scd/src/compas/CompasOpen.ts @@ -10,14 +10,14 @@ import { translate } from 'lit-translate'; import '@material/mwc-button'; -import { newPendingStateEvent } from '../foundation.js'; +import { newPendingStateEvent } from 'open-scd/src/foundation.js'; import { CompasSclDataService } from '../compas-services/CompasSclDataService.js'; import { createLogEvent } from '../compas-services/foundation.js'; import { SclSelectedEvent } from './CompasSclList.js'; import { TypeSelectedEvent } from './CompasSclTypeList.js'; -import '../WizardDivider.js'; +import 'open-scd/src/WizardDivider.js'; import './CompasSclTypeList.js'; import './CompasSclList.js'; diff --git a/packages/compas-open-scd/src/compas/CompasSave.ts b/packages/compas-open-scd/src/compas/CompasSave.ts index c1fad0340..3c0e3ec36 100644 --- a/packages/compas-open-scd/src/compas/CompasSave.ts +++ b/packages/compas-open-scd/src/compas/CompasSave.ts @@ -14,10 +14,10 @@ import { TextFieldBase } from '@material/mwc-textfield/mwc-textfield-base'; import '@material/mwc-textfield'; import '@material/mwc-button'; -import { newLogEvent } from '../foundation.js'; +import { newLogEvent } from 'open-scd/src/foundation.js'; import { saveDocumentToFile } from '../file.js'; -import '../WizardDivider.js'; +import 'open-scd/src/WizardDivider.js'; import { CompasExistsIn } from './CompasExistsIn.js'; import { CompasChangeSetRadiogroup } from './CompasChangeSetRadiogroup.js'; diff --git a/packages/compas-open-scd/src/compas/CompasSclList.ts b/packages/compas-open-scd/src/compas/CompasSclList.ts index e5bae67a4..294ffcb4d 100644 --- a/packages/compas-open-scd/src/compas/CompasSclList.ts +++ b/packages/compas-open-scd/src/compas/CompasSclList.ts @@ -14,10 +14,10 @@ import '@material/mwc-icon'; import '@material/mwc-list'; import '@material/mwc-list/mwc-list-item'; -import { SelectedItemsChangedEvent } from '../oscd-filter-button.js'; +import { SelectedItemsChangedEvent } from 'open-scd/src/oscd-filter-button.js'; -import '../filtered-list.js'; -import '../oscd-filter-button.js'; +import 'open-scd/src/filtered-list.js'; +import 'open-scd/src/oscd-filter-button.js'; import { CompasSclDataService, diff --git a/packages/compas-open-scd/src/compas/CompasSettings.ts b/packages/compas-open-scd/src/compas/CompasSettings.ts index a98cc6fea..f997fa28e 100644 --- a/packages/compas-open-scd/src/compas/CompasSettings.ts +++ b/packages/compas-open-scd/src/compas/CompasSettings.ts @@ -11,7 +11,7 @@ import { translate } from 'lit-translate'; import '@material/mwc-textfield'; import '@material/mwc-button'; -import { newWizardEvent } from '../foundation.js'; +import { newWizardEvent } from 'open-scd/src/foundation.js'; import { TextFieldBase } from '@material/mwc-textfield/mwc-textfield-base'; import { Switch } from '@material/mwc-switch'; diff --git a/packages/compas-open-scd/src/compas/CompasUploadVersion.ts b/packages/compas-open-scd/src/compas/CompasUploadVersion.ts index 388058185..8fbfbe9f4 100644 --- a/packages/compas-open-scd/src/compas/CompasUploadVersion.ts +++ b/packages/compas-open-scd/src/compas/CompasUploadVersion.ts @@ -11,9 +11,9 @@ import { newWizardEvent, Wizard, WizardInputElement, -} from '../foundation.js'; +} from 'open-scd/src/foundation.js'; -import '../wizard-textfield.js'; +import 'open-scd/src/wizard-textfield.js'; import { CompasExistsIn } from './CompasExistsIn.js'; import { CompasSclDataService } from '../compas-services/CompasSclDataService.js'; diff --git a/packages/compas-open-scd/src/compas/Compasing.ts b/packages/compas-open-scd/src/compas/Compasing.ts index b4a83c1f7..cbc1b338d 100644 --- a/packages/compas-open-scd/src/compas/Compasing.ts +++ b/packages/compas-open-scd/src/compas/Compasing.ts @@ -1,6 +1,6 @@ import { html, query, state, property, TemplateResult } from 'lit-element'; -import { Mixin } from '../foundation.js'; +import { Mixin } from 'open-scd/src/foundation.js'; import { EditingElement } from '../Editing.js'; import { CompasUserInfoService } from '../compas-services/CompasUserInfoService.js'; diff --git a/packages/compas-open-scd/src/compas/foundation.ts b/packages/compas-open-scd/src/compas/foundation.ts index 0b55620ae..beb764531 100644 --- a/packages/compas-open-scd/src/compas/foundation.ts +++ b/packages/compas-open-scd/src/compas/foundation.ts @@ -1,6 +1,6 @@ import { get } from 'lit-translate'; -import { newLogEvent, newOpenDocEvent } from '../foundation.js'; +import { newLogEvent, newOpenDocEvent } from 'open-scd/src/foundation.js'; import { COMPAS_SCL_PRIVATE_TYPE, getCompasSclFileType, diff --git a/packages/compas-open-scd/src/compas/private.ts b/packages/compas-open-scd/src/compas/private.ts index 5ea4ac412..8f0e0676f 100644 --- a/packages/compas-open-scd/src/compas/private.ts +++ b/packages/compas-open-scd/src/compas/private.ts @@ -1,4 +1,4 @@ -import { SCL_NAMESPACE } from '../schemas.js'; +import { SCL_NAMESPACE } from 'open-scd/src/schemas.js'; export const COMPAS_NAMESPACE = 'https://www.lfenergy.org/compas/extension/v1'; export const COMPAS_PREFIX = 'compas'; diff --git a/packages/compas-open-scd/src/editors/Cleanup.ts b/packages/compas-open-scd/src/editors/Cleanup.ts deleted file mode 100644 index 629651184..000000000 --- a/packages/compas-open-scd/src/editors/Cleanup.ts +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -import { css, html, LitElement, property, TemplateResult } from 'lit-element'; - -import { styles } from './templates/foundation.js'; - -import './cleanup/datasets-container.js'; -import './cleanup/control-blocks-container.js'; -import './cleanup/datatypes-container.js'; - -/** An editor [[`plugin`]] for cleaning SCL references and definitions. */ -export default class Cleanup extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property() - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - render(): TemplateResult { - return html` -
- - - -
- `; - } - - static styles = css` - ${styles} - - :host { - width: 100vw; - } - - @media (max-width: 799px) { - .cleanup { - flex-direction: column; - } - } - - @media (min-width: 800px) { - .cleanup { - max-height: 60vh; - } - } - - cleanup-datasets, cleanup-control-blocks, cleanup-data-types { - display: flex; - flex: 1; - flex-direction: column; - justify-content: space-between; - } - - .cleanup { - display: flex; - flex-wrap: wrap; - gap: 20px; - padding: 20px; - } - } - `; -} diff --git a/packages/compas-open-scd/src/editors/Communication.ts b/packages/compas-open-scd/src/editors/Communication.ts deleted file mode 100644 index 876f2f654..000000000 --- a/packages/compas-open-scd/src/editors/Communication.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { LitElement, html, TemplateResult, property, css } from 'lit-element'; -import { translate, get } from 'lit-translate'; - -import '@material/mwc-fab'; - -import './communication/subnetwork-editor.js'; -import { - newWizardEvent, - newActionEvent, - createElement, - isPublic, -} from '../foundation.js'; -import { createSubNetworkWizard } from '../wizards/subnetwork.js'; - -/** An editor [[`plugin`]] for editing the `Communication` section. */ -export default class CommunicationPlugin extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property() - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - /** - * Creates the Communication Element and returns the created Element - * @returns {Element} Communication `Element` - */ - private createCommunication(): Element { - const element: Element = createElement(this.doc, 'Communication', {}); - this.dispatchEvent( - newActionEvent({ - new: { - parent: this.doc.documentElement, - element: element, - }, - }) - ); - return element; - } - - /** Opens a [[`WizardDialog`]] for creating a new `SubNetwork` element. */ - private openCreateSubNetworkWizard(): void { - const parent = - this.doc.querySelector(':root > Communication') || - this.createCommunication(); - - this.dispatchEvent(newWizardEvent(createSubNetworkWizard(parent!))); - } - - render(): TemplateResult { - if (!this.doc?.querySelector(':root > Communication >SubNetwork')) - return html`

- ${translate('communication.missing')} this.openCreateSubNetworkWizard()} - > -

`; - - return html` this.openCreateSubNetworkWizard()} - > -
- ${Array.from(this.doc.querySelectorAll('SubNetwork') ?? []) - .filter(isPublic) - .map( - subnetwork => - html`` - )} -
`; - } - - static styles = css` - :host { - width: 100vw; - } - - h1 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - margin: 0px; - line-height: 48px; - padding-left: 0.3em; - transition: background-color 150ms linear; - } - - section { - outline: none; - padding: 8px 12px 16px; - } - - subnetwork-editor { - margin: 8px 12px 16px; - } - - mwc-fab { - position: fixed; - bottom: 32px; - right: 32px; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/GooseSubscriberDataBinding.ts b/packages/compas-open-scd/src/editors/GooseSubscriberDataBinding.ts deleted file mode 100644 index 10b29be7d..000000000 --- a/packages/compas-open-scd/src/editors/GooseSubscriberDataBinding.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { css, html, LitElement, property, TemplateResult } from 'lit-element'; - -import { Nsdoc } from '../foundation/nsdoc.js'; - -import './subscription/fcda-binding-list.js'; -import './subscription/later-binding/ext-ref-ln-binding-list.js'; - -/** An editor [[`plugin`]] for Subscribe Data Binding (GOOSE). */ -export default class GooseSubscribeDataBindingPlugin extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - @property() - nsdoc!: Nsdoc; - - render(): TemplateResult { - return html`
-
- - - - -
-
`; - } - - static styles = css` - :host { - width: 100vw; - } - - .container { - display: flex; - padding: 8px 6px 16px; - height: calc(100vh - 136px); - } - - .column { - flex: 50%; - margin: 0px 6px 0px; - min-width: 300px; - height: 100%; - overflow-y: auto; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/GooseSubscriberLaterBinding.ts b/packages/compas-open-scd/src/editors/GooseSubscriberLaterBinding.ts deleted file mode 100644 index c77bc1f75..000000000 --- a/packages/compas-open-scd/src/editors/GooseSubscriberLaterBinding.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { css, html, LitElement, property, TemplateResult } from 'lit-element'; - -import './subscription/fcda-binding-list.js'; -import './subscription/later-binding/ext-ref-later-binding-list.js'; - -/** An editor [[`plugin`]] for Subscribe Later Binding (GOOSE). */ -export default class GooseSubscribeLaterBindingPlugin extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - render(): TemplateResult { - return html`
-
- - - - -
-
`; - } - - static styles = css` - :host { - width: 100vw; - } - - .container { - display: flex; - padding: 8px 6px 16px; - height: calc(100vh - 136px); - } - - .column { - flex: 50%; - margin: 0px 6px 0px; - min-width: 300px; - height: 100%; - overflow-y: auto; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/GooseSubscriberMessageBinding.ts b/packages/compas-open-scd/src/editors/GooseSubscriberMessageBinding.ts deleted file mode 100644 index 31128d220..000000000 --- a/packages/compas-open-scd/src/editors/GooseSubscriberMessageBinding.ts +++ /dev/null @@ -1,119 +0,0 @@ -import { - css, - html, - LitElement, - property, - query, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-radio'; -import '@material/mwc-formfield'; -import { RadioListItem } from '@material/mwc-list/mwc-radio-list-item'; - -import './subscription/goose/subscriber-list.js'; -import './subscription/goose/goose-list.js'; -import './subscription/ied-list.js'; -import { newViewEvent, View, ViewEvent } from './subscription/foundation.js'; - -/** Defining view outside the class, which makes it persistent. */ -let view: View = View.PUBLISHER; - -/** An editor [[`plugin`]] for subscribing IEDs to GOOSE messages. */ -export default class GooseSubscriberMessageBindingPlugin extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property() - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - @query('#goosePublisherView') - goosePublisherView!: RadioListItem; - - @query('#gooseSubscriberView') - gooseSubscriberView!: RadioListItem; - - @query('div[class="container"]') - listDiv!: Element; - - constructor() { - super(); - this.addEventListener('view', (evt: ViewEvent) => { - view = evt.detail.view; - this.requestUpdate(); - }); - } - - firstUpdated(): void { - view == View.PUBLISHER - ? this.goosePublisherView.setAttribute('checked', '') - : this.gooseSubscriberView.setAttribute('checked', ''); - } - - render(): TemplateResult { - return html`
- - - this.listDiv.dispatchEvent(newViewEvent(View.PUBLISHER))} - > - - - - this.listDiv.dispatchEvent(newViewEvent(View.SUBSCRIBER))} - > - -
- ${view == View.PUBLISHER - ? html`` - : html``} - -
-
`; - } - - static styles = css` - :host { - width: 100vw; - } - - .container { - display: flex; - padding: 8px 6px 16px; - height: 86vh; - } - - .row { - flex: 50%; - margin: 0px 6px 0px; - min-width: 300px; - height: 100%; - overflow-y: scroll; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/IED.ts b/packages/compas-open-scd/src/editors/IED.ts deleted file mode 100644 index 296411a0d..000000000 --- a/packages/compas-open-scd/src/editors/IED.ts +++ /dev/null @@ -1,271 +0,0 @@ -import { - css, - html, - LitElement, - property, - PropertyValues, - state, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; -import { nothing } from 'lit-html'; - -import '@material/mwc-list/mwc-check-list-item'; -import '@material/mwc-list/mwc-radio-list-item'; - -import '../oscd-filter-button.js'; -import { SelectedItemsChangedEvent } from '../oscd-filter-button.js'; - -import './ied/ied-container.js'; -import './ied/element-path.js'; - -import { - compareNames, - getDescriptionAttribute, - getNameAttribute, -} from '../foundation.js'; -import { Nsdoc } from '../foundation/nsdoc.js'; -import { getIcon } from '../icons/icons.js'; - -/** An editor [[`plugin`]] for editing the `IED` section. */ -export default class IedPlugin extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property() - doc!: XMLDocument; - - @property({ type: Number }) - editCount = -1; - - /** All the nsdoc files that are being uploaded via the settings. */ - @property() - nsdoc!: Nsdoc; - - @state() - selectedIEDs: string[] = []; - - @state() - selectedLNClasses: string[] = []; - - @state() - private get iedList(): Element[] { - return this.doc - ? Array.from(this.doc.querySelectorAll(':root > IED')).sort((a, b) => - compareNames(a, b) - ) - : []; - } - - @state() - private get lnClassList(): string[][] { - const currentIed = this.selectedIed; - const uniqueLNClassList: string[] = []; - if (currentIed) { - return Array.from(currentIed.querySelectorAll('LN0, LN')) - .filter(element => element.hasAttribute('lnClass')) - .filter(element => { - const lnClass = element.getAttribute('lnClass') ?? ''; - if (uniqueLNClassList.includes(lnClass)) { - return false; - } - uniqueLNClassList.push(lnClass); - return true; - }) - .sort((a, b) => { - const aLnClass = a.getAttribute('lnClass') ?? ''; - const bLnClass = b.getAttribute('lnClass') ?? ''; - - return aLnClass.localeCompare(bLnClass); - }) - .map(element => { - const lnClass = element.getAttribute('lnClass'); - const label = this.nsdoc.getDataDescription(element).label; - return [lnClass, label]; - }) as string[][]; - } - return []; - } - - @state() - private get selectedIed(): Element | undefined { - // When there is no IED selected, or the selected IED has no parent (IED has been removed) - // select the first IED from the List. - if (this.selectedIEDs.length >= 1) { - const iedList = this.iedList; - return iedList.find(element => { - const iedName = getNameAttribute(element); - return this.selectedIEDs[0] === iedName; - }); - } - return undefined; - } - - lNClassListOpenedOnce = false; - - protected updated(_changedProperties: PropertyValues): void { - super.updated(_changedProperties); - - // When the document is updated, we reset the selected IED if it no longer exists - const isDocumentUpdated = - _changedProperties.has('doc') || - _changedProperties.has('editCount') || - _changedProperties.has('nsdoc'); - - if (isDocumentUpdated) { - // if the IED exists, retain selection - const iedExists = this.doc?.querySelector( - `IED[name="${this.selectedIEDs[0]}"]` - ); - - if (iedExists) return; - - this.selectedIEDs = []; - this.selectedLNClasses = []; - this.lNClassListOpenedOnce = false; - - const iedList = this.iedList; - if (iedList.length > 0) { - const iedName = getNameAttribute(iedList[0]); - if (iedName) { - this.selectedIEDs = [iedName]; - } - } - } - } - - private calcSelectedLNClasses(): string[] { - const somethingSelected = this.selectedLNClasses.length > 0; - const lnClasses = this.lnClassList.map( lnClassInfo => lnClassInfo[0] ); - - let selectedLNClasses = lnClasses; - - if(somethingSelected){ - selectedLNClasses = lnClasses.filter( lnClass => this.selectedLNClasses.includes(lnClass)); - } - - return selectedLNClasses; - } - - render(): TemplateResult { - const iedList = this.iedList; - if (iedList.length > 0) { - return html`
-
-

${translate('filters')}:

- - - ${iedList.map(ied => { - const name = getNameAttribute(ied); - const descr = getDescriptionAttribute(ied); - const type = ied.getAttribute('type'); - const manufacturer = ied.getAttribute('manufacturer'); - return html` - ${name} ${descr ? html` (${descr})` : html``} - - ${type} ${type && manufacturer ? html`—` : nothing} - ${manufacturer} - - `; - })} - - - - ${getIcon('lNIcon')} - ${this.lnClassList.map(lnClassInfo => { - const value = lnClassInfo[0]; - const label = lnClassInfo[1]; - return html` - ${label} - `; - })} - - - -
- - -
`; - } - return html`

- ${translate('iededitor.missing')} -

`; - } - - static styles = css` - :host { - width: 100vw; - } - - section { - padding: 8px 12px 16px; - } - - .header { - display: flex; - } - - h1 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - margin: 0px; - line-height: 48px; - padding-left: 0.3em; - } - - .elementPath { - margin-left: auto; - padding-right: 12px; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/Protocol104.ts b/packages/compas-open-scd/src/editors/Protocol104.ts deleted file mode 100644 index 94b0219fe..000000000 --- a/packages/compas-open-scd/src/editors/Protocol104.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { - css, - html, - LitElement, - property, - query, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-fab'; -import '@material/mwc-radio'; -import '@material/mwc-formfield'; - -import { RadioListItem } from '@material/mwc-list/mwc-radio-list-item'; - -import './protocol104/network-container.js'; -import './protocol104/values-container.js'; - -import { - newViewEvent, - View, - VIEW_EVENT_NAME, - ViewEvent, -} from './protocol104/foundation/foundation.js'; - -/** Defining view outside the class, which makes it persistent. */ -let selectedViewProtocol104Plugin: View = View.VALUES; - -export default class Communication104Plugin extends LitElement { - @property() - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - @query('#byValuesRadio') - byValuesRadio!: RadioListItem; - - @query('#byNetworkRadio') - byNetworkRadio!: RadioListItem; - - @query('div#containers') - listDiv!: Element; - - constructor() { - super(); - - this.addEventListener(VIEW_EVENT_NAME, (evt: ViewEvent) => { - selectedViewProtocol104Plugin = evt.detail.view; - this.requestUpdate(); - }); - } - - firstUpdated(): void { - selectedViewProtocol104Plugin == View.VALUES - ? this.byValuesRadio.setAttribute('checked', '') - : this.byNetworkRadio.setAttribute('checked', ''); - } - - render(): TemplateResult { - return html`
-
- - - this.listDiv.dispatchEvent(newViewEvent(View.VALUES))} - > - - - - this.listDiv.dispatchEvent(newViewEvent(View.NETWORK))} - > - -
- ${selectedViewProtocol104Plugin == View.VALUES - ? html`` - : html``} -
-
-
`; - } - - static styles = css` - :host { - width: 100vw; - } - - section { - padding: 8px 12px 16px; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/Publisher.ts b/packages/compas-open-scd/src/editors/Publisher.ts deleted file mode 100644 index 656dbc25a..000000000 --- a/packages/compas-open-scd/src/editors/Publisher.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { - css, - html, - LitElement, - property, - state, - TemplateResult, -} from 'lit-element'; -import { classMap } from 'lit-html/directives/class-map'; - -import '@material/mwc-formfield'; -import '@material/mwc-radio'; - -import './publisher/report-control-editor.js'; -import './publisher/gse-control-editor.js'; -import './publisher/sampled-value-control-editor.js'; -import './publisher/data-set-editor.js'; - -/** An editor [[`plugin`]] to configure `Report`, `GOOSE`, `SampledValue` control blocks and its `DataSet` */ -export default class PublisherPlugin extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - @state() - private publisherType: 'Report' | 'GOOSE' | 'SampledValue' | 'DataSet' = - 'GOOSE'; - - render(): TemplateResult { - return html`
- (this.publisherType = 'Report')} - > (this.publisherType = 'GOOSE')} - > (this.publisherType = 'SampledValue')} - > (this.publisherType = 'DataSet')} - > -
- `; - } - - static styles = css` - .hidden { - display: none; - } - - .publishertypeselector { - margin: 4px 8px 8px; - background-color: var(--mdc-theme-surface); - width: calc(100% - 16px); - justify-content: space-around; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/SMVSubscriberDataBinding.ts b/packages/compas-open-scd/src/editors/SMVSubscriberDataBinding.ts deleted file mode 100644 index d00efda3e..000000000 --- a/packages/compas-open-scd/src/editors/SMVSubscriberDataBinding.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { css, html, LitElement, property, TemplateResult } from 'lit-element'; - -import { Nsdoc } from '../foundation/nsdoc.js'; - -import './subscription/fcda-binding-list.js'; -import './subscription/later-binding/ext-ref-ln-binding-list.js'; - -/** An editor [[`plugin`]] for Subscribe Data Binding (SMV). */ -export default class SMVSubscribeDataBindingPlugin extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - @property() - nsdoc!: Nsdoc; - - render(): TemplateResult { - return html`
-
- - - - -
-
`; - } - - static styles = css` - :host { - width: 100vw; - } - - .container { - display: flex; - padding: 8px 6px 16px; - height: calc(100vh - 136px); - } - - .column { - flex: 50%; - margin: 0px 6px 0px; - min-width: 300px; - height: 100%; - overflow-y: auto; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/SMVSubscriberLaterBinding.ts b/packages/compas-open-scd/src/editors/SMVSubscriberLaterBinding.ts deleted file mode 100644 index f8d5be3c0..000000000 --- a/packages/compas-open-scd/src/editors/SMVSubscriberLaterBinding.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { css, html, LitElement, property, TemplateResult } from 'lit-element'; - -import './subscription/fcda-binding-list.js'; -import './subscription/later-binding/ext-ref-later-binding-list.js'; - -/** An editor [[`plugin`]] for Subscribe Later Binding (SMV). */ -export default class SMVSubscribeLaterBindingPlugin extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - render(): TemplateResult { - return html`
-
- - - - -
-
`; - } - - static styles = css` - :host { - width: 100vw; - } - - .container { - display: flex; - padding: 8px 6px 16px; - height: calc(100vh - 136px); - } - - .column { - flex: 50%; - margin: 0px 6px 0px; - min-width: 300px; - height: 100%; - overflow-y: auto; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/SMVSubscriberMessageBinding.ts b/packages/compas-open-scd/src/editors/SMVSubscriberMessageBinding.ts deleted file mode 100644 index f5ec0856c..000000000 --- a/packages/compas-open-scd/src/editors/SMVSubscriberMessageBinding.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { - css, - html, - LitElement, - property, - query, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import { RadioListItem } from '@material/mwc-list/mwc-radio-list-item.js'; - -import './subscription/sampledvalues/subscriber-list.js'; -import './subscription/sampledvalues/smv-list.js'; -import './subscription/ied-list.js'; -import { newViewEvent, View, ViewEvent } from './subscription/foundation.js'; - -/** Defining view outside the class, which makes it persistent. */ -let view: View = View.PUBLISHER; - -/** An editor [[`plugin`]] for subscribing IEDs to Sampled Values. */ -export default class SMVSubscriberMessageBindingPlugin extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property() - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - @query('#smvPublisherView') - smvPublisherView!: RadioListItem; - - @query('#smvSubscriberView') - smvSubscriberView!: RadioListItem; - - @query('div[class="container"]') - listDiv!: Element; - - constructor() { - super(); - this.addEventListener('view', (evt: ViewEvent) => { - view = evt.detail.view; - this.requestUpdate(); - }); - } - - firstUpdated(): void { - view == View.PUBLISHER - ? this.smvPublisherView.setAttribute('checked', '') - : this.smvSubscriberView.setAttribute('checked', ''); - } - - render(): TemplateResult { - return html`
- - - this.listDiv.dispatchEvent(newViewEvent(View.PUBLISHER))} - > - - - - this.listDiv.dispatchEvent(newViewEvent(View.SUBSCRIBER))} - > - -
- ${view == View.PUBLISHER - ? html`` - : html``} - -
-
`; - } - - static styles = css` - :host { - width: 100vw; - } - - .container { - display: flex; - padding: 8px 6px 16px; - height: 86vh; - } - - .row { - flex: 50%; - margin: 0px 6px 0px; - min-width: 300px; - height: 100%; - overflow-y: scroll; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/SingleLineDiagram.ts b/packages/compas-open-scd/src/editors/SingleLineDiagram.ts deleted file mode 100644 index 84562410a..000000000 --- a/packages/compas-open-scd/src/editors/SingleLineDiagram.ts +++ /dev/null @@ -1,664 +0,0 @@ -import { - css, - html, - LitElement, - property, - PropertyValues, - query, - state, - TemplateResult, -} from 'lit-element'; -import panzoom from 'panzoom'; - -import { - compareNames, - getDescriptionAttribute, - getNameAttribute, - getPathNameAttribute, - identity, - newWizardEvent, - SCLTag, -} from '../foundation.js'; -import { - addLabelToBay, - addLabelToBusBar, - createBayElement, - createBusBarElement, - createConductingEquipmentElement, - createConnectivityNodeElement, - createPowerTransformerElement, - createSubstationElement, - createTerminalElement, - createVoltageLevelElement, - drawBusBarRoute, - drawCNodeConnections, - getAbsolutePosition, - getAbsolutePositionBusBar, - getAbsolutePositionTerminal, - getBusBarLength, - getConnectivityNodesDrawingPosition, - getDirections, -} from './singlelinediagram/sld-drawing.js'; -import { - getCommonParentElement, - getConnectedTerminals, - isBusBar, -} from './singlelinediagram/foundation.js'; -import { isSCLNamespace } from '../schemas.js'; -import { wizards } from './singlelinediagram/wizards/wizard-library.js'; -import { SingleSelectedEvent } from '@material/mwc-list/mwc-list-foundation'; -import { translate } from 'lit-translate'; - -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-select'; -import '@material/mwc-textfield'; - -/* - * We need a variable outside the plugin to save the selected substation, because the Plugin is created - * more than once during working with the SLD, for instance when opening a Wizard to edit equipment. - */ -let sldEditorSelectedSubstation: Element | undefined; -/* - * We will also add an Event Listener when a new document is opened. We then want to reset the selection - * so setting it to undefined will set the selected Substation again on the first in the list. - */ -function onOpenDocResetSelectedSubstation() { - sldEditorSelectedSubstation = undefined; -} -addEventListener('open-doc', onOpenDocResetSelectedSubstation); - -/** - * Main class plugin for Single Line Diagram editor. - */ -export default class SingleLineDiagramPlugin extends LitElement { - // The full given XML document. - @property({ attribute: false }) - doc!: XMLDocument; - - // Container for giving the panzoom to. - @query('#panzoom') panzoomContainer!: HTMLElement; - // The main canvas to draw everything on. - @query('#svg') svg!: SVGGraphicsElement; - - private get substations(): Element[] { - return this.doc - ? Array.from(this.doc.querySelectorAll(':root > Substation')).sort( - (a, b) => compareNames(a, b) - ) - : []; - } - - @state() - private set selectedSubstation(element: Element | undefined) { - sldEditorSelectedSubstation = element; - } - - private get selectedSubstation(): Element | undefined { - if (sldEditorSelectedSubstation === undefined) { - const substationList = this.substations; - if (substationList.length > 0) { - sldEditorSelectedSubstation = substationList[0]; - } - } - return sldEditorSelectedSubstation; - } - - /** - * Get all the Power Transformers from an element. - */ - private getPowerTransformers(parentElement: Element): Element[] { - return Array.from( - parentElement.querySelectorAll('PowerTransformer') - ).filter(isSCLNamespace); - } - - /** - * Get all the Voltage Levels from the substation. - */ - private getVoltageLevels(substationElement: Element): Element[] { - return Array.from( - substationElement.querySelectorAll('VoltageLevel') - ).filter(isSCLNamespace); - } - - /** - * Get all the BusBars from the voltage level. - */ - private getBusBars(voltageLevelElement: Element): Element[] { - return Array.from(voltageLevelElement.querySelectorAll('Bay')) - .filter(isSCLNamespace) - .filter(bay => isBusBar(bay)); - } - - /** - * Get all the bays from the voltage level. - */ - private getBays(voltageLevelElement: Element): Element[] { - return Array.from(voltageLevelElement.querySelectorAll('Bay')) - .filter(isSCLNamespace) - .filter(bay => !isBusBar(bay)); - } - - /** - * Get all the Conducting Equipment from a Bay. - * @param bayElement - The Bay to search in. - */ - private getConductingEquipments(bayElement: Element): Element[] { - return Array.from( - bayElement.querySelectorAll('ConductingEquipment') - ).filter(isSCLNamespace); - } - - /** - * Get all the Connectivity Nodes from a Bay/Busbar. - * @param bayElement - The Bay/Busbar to search in. - */ - private getConnectivityNode(bayElement: Element): Element[] { - return Array.from(bayElement.querySelectorAll('ConnectivityNode')) - .filter(isSCLNamespace) - .filter(cNode => cNode.getAttribute('name') !== 'grounded'); - } - - /** - * Search for Equipment (ConductionEquipment or PowerTransformer) which has a terminal wth a connectivityNode - * tha is the same as the passed pathName. - * @param parentElement - The Element to search in for Equipment. - * @param pathName - The PathName to search for in the Terminal. - */ - private findEquipment( - parentElement: Element, - pathName: string | undefined - ): Element[] { - return Array.from( - parentElement.querySelectorAll('ConductingEquipment, PowerTransformer') - ) - .filter(isSCLNamespace) - .filter(element => - element.querySelector(`Terminal[connectivityNode="${pathName}"]`) - ); - } - - /** - * Draw all equipment and connections of the selected Substation. - */ - private drawSubstation(substation: Element): void { - const substationGroup = createSubstationElement(substation); - this.svg.appendChild(substationGroup); - - this.drawPowerTransformers(substation, substationGroup); - this.drawVoltageLevels(substation, substationGroup); - } - - /** - * Draw all available `PowerTransformer`s of passed parent element. - * Should only be a element. - * @param parentElement - The parent element to search for PowerTransformers. - * @param parentGroup - The SVG Group to which to add the PowerTransformer. - */ - private drawPowerTransformers( - parentElement: Element, - parentGroup: SVGElement - ): void { - this.getPowerTransformers(parentElement).forEach(powerTransformerElement => - this.drawPowerTransformer(parentGroup, powerTransformerElement) - ); - } - - /** - * Draw an SVG from the passed PowerTransformer Element. - * Should only be a element. - * @param parentGroup - The SVG Group to which to add the PowerTransformer. - * @param powerTransformerElement - The PowerTransformer to draw. - */ - private drawPowerTransformer( - parentGroup: SVGElement, - powerTransformerElement: Element - ): void { - const powerTransformerGroup = createPowerTransformerElement( - powerTransformerElement, - (event: Event) => this.openEditWizard(event, powerTransformerElement) - ); - parentGroup.appendChild(powerTransformerGroup); - } - - /** - * Draw all available Voltage Levels of the passed Substation Element. - * Should only be a element. - * @param substationElement - The substation containing the voltage levels. - * @param substationGroup - The group to which to add the SVGs. - */ - private drawVoltageLevels( - substationElement: Element, - substationGroup: SVGElement - ): void { - // First draw all the devices on the SVG for all voltage levels. - this.getVoltageLevels(substationElement).forEach(voltageLevelElement => { - const voltageLevelGroup = createVoltageLevelElement(voltageLevelElement); - substationGroup.appendChild(voltageLevelGroup); - - this.drawPowerTransformers(voltageLevelElement, voltageLevelGroup); - this.drawBays(voltageLevelElement, voltageLevelGroup); - this.drawBusBars(voltageLevelElement, voltageLevelGroup); - }); - - // After all devices are drawn we can draw the connections between the devices. - // And also add the label on the correct place, we now know where the boundaries are. - this.getVoltageLevels(substationElement).forEach(voltageLevelElement => { - this.getBusBars(voltageLevelElement).forEach(busbarElement => { - this.drawBusBarConnections(substationElement, this.svg, busbarElement); - - addLabelToBusBar(this.svg, busbarElement, (event: Event) => - this.openEditWizard(event, busbarElement) - ); - }); - - this.getBays(voltageLevelElement).forEach(bayElement => { - this.drawBayConnections(substationElement, this.svg, bayElement); - - addLabelToBay(this.svg, bayElement, (event: Event) => - this.openEditWizard(event, bayElement) - ); - }); - }); - } - - /** - * Draw all available Bays of the passed Voltage Level Element. - * Should only be a element. - * @param voltageLevelElement - The Voltage Level containing the bays. - * @param voltageLevelGroup - The group to which to add the SVGs. - * */ - private drawBays( - voltageLevelElement: Element, - voltageLevelGroup: SVGElement - ): void { - this.getBays(voltageLevelElement).forEach(bayElement => { - const bayGroup = createBayElement(bayElement); - voltageLevelGroup.appendChild(bayGroup); - - this.drawPowerTransformers(bayElement, bayGroup); - this.drawConductingEquipments(bayElement, bayGroup); - this.drawConnectivityNodes(bayElement, bayGroup); - }); - } - - /** - * Draw all available Conducting Equipments of the passed Bay Element. - * Should only be a element. - * @param bayElement - The Bay containing the Conducting Equipment. - * @param bayGroup - The group to which to add the SVGs. - */ - private drawConductingEquipments( - bayElement: Element, - bayGroup: SVGElement - ): void { - this.getConductingEquipments(bayElement) - .filter( - conductingEquipmentElement => - Array.from( - conductingEquipmentElement.querySelectorAll('Terminal') - ).filter( - terminal => terminal.getAttribute('cNodeName') !== 'grounded' - ).length !== 0 - ) - .forEach(conductingEquipmentElement => { - const conductingEquipmentGroup = createConductingEquipmentElement( - conductingEquipmentElement, - (event: Event) => - this.openEditWizard(event, conductingEquipmentElement!) - ); - bayGroup.appendChild(conductingEquipmentGroup); - }); - } - - /** - * Draw all available Connectivity Nodes of the passed Bay Element. - * @param bayElement - The Bay containing the Connectivity Nodes. - * @param bayGroup - The group to which to add the SVGs. - * */ - private drawConnectivityNodes( - bayElement: Element, - bayGroup: SVGElement - ): void { - this.getConnectivityNode(bayElement) - .filter(cNode => getConnectedTerminals(cNode).length > 0) - .forEach(cNode => { - const cNodegroup = createConnectivityNodeElement( - cNode, - (event: Event) => this.openEditWizard(event, cNode) - ); - - bayGroup.appendChild(cNodegroup); - }); - } - - /** - * Draw all connections between the different Equipment in the Bay and the Bay has with other Equipment outside - * the bay. - * @param rootElement - The Element containing all the other elements to which the Bay is connected. - * @param rootGroup - The SVG Element that contains all groups from the elements to add path to. - * @param bayElement - The Bay that holds the Connectivity Node to connect with. - */ - private drawBayConnections( - rootElement: Element, - rootGroup: SVGElement, - bayElement: Element - ): void { - this.getConnectivityNode(bayElement).forEach(cNode => { - this.findEquipment(rootElement, getPathNameAttribute(cNode)).forEach( - equipmentElement => { - const commonParentElement = getCommonParentElement( - cNode, - equipmentElement, - bayElement - ); - const sides = getDirections(equipmentElement, cNode); - - const elementsTerminalPosition = getAbsolutePositionTerminal( - equipmentElement, - sides.startDirection - ); - - const cNodePosition = getConnectivityNodesDrawingPosition( - cNode, - sides.endDirection - ); - - rootGroup - .querySelectorAll(`g[id="${identity(commonParentElement)}"]`) - .forEach(eq => - drawCNodeConnections( - cNodePosition, - elementsTerminalPosition, - eq - ) - ); - - const terminalElement = equipmentElement.querySelector( - `Terminal[connectivityNode="${cNode.getAttribute('pathName')}"]` - ); - - const terminal = createTerminalElement( - terminalElement!, - sides.startDirection, - (event: Event) => this.openEditWizard(event, terminalElement!) - ); - - rootGroup - .querySelectorAll(`g[id="${identity(equipmentElement)}"]`) - .forEach(eq => eq.appendChild(terminal)); - } - ); - }); - } - - /** - * Draw all available Busbars of the passed Voltage Level Element. - * @param voltageLevelElement - The Voltage Level containing the Busbars. - * @param voltageLevelGroup - The group to which to add the SVGs. - */ - private drawBusBars( - voltageLevelElement: Element, - voltageLevelGroup: SVGElement - ): void { - this.getBusBars(voltageLevelElement).forEach(busbarElement => { - const busbarGroup = createBusBarElement( - busbarElement, - getBusBarLength(voltageLevelElement) - ); - voltageLevelGroup.appendChild(busbarGroup); - }); - } - - /** - * Draw all the connections a Busbar has with other Equipment. - * @param rootElement - The Element containing all the other elements to which the Busbar is connected. - * @param rootGroup - The SVG Element that contains all groups from the elements to add path to. - * @param busbarElement - The Busbar that holds the Connectivity Node to connect with. - */ - private drawBusBarConnections( - rootElement: Element, - rootGroup: SVGElement, - busbarElement: Element - ): void { - const pathName = getPathNameAttribute(busbarElement.children[0]); - const busbarPosition = getAbsolutePositionBusBar(busbarElement); - - this.findEquipment(rootElement, pathName).forEach(element => { - const parentElement = element.parentElement; - const elementPosition = getAbsolutePosition(element); - - const elementsTerminalSide = - busbarPosition.y < elementPosition.y ? 'top' : 'bottom'; - - const elementsTerminalPosition = getAbsolutePositionTerminal( - element, - elementsTerminalSide - ); - - const busbarTerminalPosition = { - x: elementsTerminalPosition.x, - y: busbarPosition.y, - }; - - const terminalElement = element.querySelector( - `Terminal[connectivityNode="${pathName}"]` - ); - - rootGroup - .querySelectorAll(`g[id="${identity(parentElement)}"]`) - .forEach(eq => - drawBusBarRoute( - busbarTerminalPosition, - elementsTerminalPosition, - eq - ) - ); - - const terminal = createTerminalElement( - terminalElement!, - elementsTerminalSide, - (event: Event) => this.openEditWizard(event, terminalElement!) - ); - - rootGroup - .querySelectorAll(`g[id="${identity(element)}"]`) - .forEach(eq => eq.appendChild(terminal)); - }); - } - - /** - * Remove all the child elements (and descendants) from the SVG Element, to have a clean start. - */ - private clearSVG(): void { - while (this.svg.firstChild) { - this.svg.removeChild(this.svg.lastChild!); - } - } - - /** - * Draw all the elements of the selected Substation. - */ - drawSVGElements(): void { - // First clean the existing drawing, because the selected substation may have changed. - this.clearSVG(); - - // Only draw the diagram if there is a substation selected. - const selectedSubstationElement = this.selectedSubstation; - if (selectedSubstationElement) { - this.drawSubstation(selectedSubstationElement); - - // Set the new size of the SVG. - const bbox = this.svg.getBBox(); - this.svg.setAttribute( - 'viewBox', - bbox.x - - 10 + - ' ' + - (bbox.y - 10) + - ' ' + - (bbox.width + 20) + - ' ' + - (bbox.height + 20) - ); - this.svg.setAttribute('width', bbox.width + 20 + 'px'); - this.svg.setAttribute('height', bbox.height + 20 + 'px'); - - panzoom(this.panzoomContainer, { - zoomSpeed: 0.2, - maxZoom: 1.5, - minZoom: 0.2, - initialZoom: 0.5, - }); - } - } - - /** - * Open an Edit wizard for an element. - * @param element - The element to show the wizard for. - */ - openEditWizard(event: Event, element: Element): void { - const wizard = wizards[element.tagName].edit(element); - if (wizard) { - this.dispatchEvent(newWizardEvent(wizard)); - event.stopPropagation(); - } - } - - protected updated(_changedProperties: PropertyValues): void { - super.updated(_changedProperties); - - // When the document is updated, we also will retrieve the history again, because probably it has changed. - if ( - _changedProperties.has('doc') || - _changedProperties.has('selectedSubstation') - ) { - this.drawSVGElements(); - } - } - - onSelect(event: SingleSelectedEvent): void { - // Set the selected Substation. - this.selectedSubstation = this.substations[event.detail.index]; - this.requestUpdate('selectedSubstation'); - } - - private renderSubstationSelector(): TemplateResult { - const substationList = this.substations; - if (substationList.length > 0) { - if (substationList.length > 1) { - return html` - - ${substationList.map(substation => { - const name = getNameAttribute(substation); - const description = getDescriptionAttribute(substation); - return html` - ${name}${description !== undefined - ? ' (' + description + ')' - : ''} - `; - })} - - `; - } - - const selectedSubstationElement = this.selectedSubstation!; - const name = getNameAttribute(selectedSubstationElement); - const description = getDescriptionAttribute(selectedSubstationElement); - return html` - - - `; - } - return html` -

- ${translate('substation.missing')} -

- `; - } - - render(): TemplateResult { - // TODO: Width and Height should be a percentage, not fixed height/width. - return html` ${this.renderSubstationSelector()} - -
-
- -
-
`; - } - - static styles = css` - h1 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - margin: 0px; - line-height: 48px; - padding-left: 0.3em; - } - - #substationSelector, - #selectedSubstation { - width: 35vw; - margin: 0.67em 0 0 0.67em; - } - - #noSubstationSelector { - color: var(--base1); - } - - .sldContainer { - overflow: hidden; - } - - g { - pointer-events: bounding-box; - } - - g[type='Bay'] > g[type='BayLabel'] { - visibility: hidden; - } - g[type='Bay']:hover > g[type='BayLabel'] { - visibility: visible; - } - - g[type='Busbar'] > g[type='BusbarLabel'] { - visibility: hidden; - } - g[type='Busbar'] > g[type='BusbarLabel'] > text, - g[type='Busbar']:hover > g[type='BusbarLabel'] { - visibility: visible; - } - - g[type='Bay']:hover, - g[type='Busbar']:hover, - g[type='ConductingEquipment']:hover, - g[type='ConnectivityNode']:hover, - g[type='PowerTransformer']:hover, - g[type='Terminal']:hover { - outline: 2px dashed var(--mdc-theme-primary); - transition: transform 200ms linear, box-shadow 250ms linear; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/Substation.ts b/packages/compas-open-scd/src/editors/Substation.ts deleted file mode 100644 index 297fd562a..000000000 --- a/packages/compas-open-scd/src/editors/Substation.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { LitElement, html, TemplateResult, property, css } from 'lit-element'; -import { get } from 'lit-translate'; - -import '@material/mwc-fab'; - -import './substation/zeroline-pane.js'; -import { newWizardEvent } from '../foundation.js'; -import { wizards } from '../wizards/wizard-library.js'; - -/** An editor [[`plugin`]] for editing the `Substation` section. */ -export default class SubstationPlugin extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property() - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - /** Opens a [[`WizardDialog`]] for creating a new `Substation` element. */ - openCreateSubstationWizard(): void { - const wizard = wizards['Substation'].create(this.doc.documentElement); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - render(): TemplateResult { - return html` - ${!this.doc?.querySelector( - ':root > Substation, :root > Line, :root > Process' - ) - ? html`

- this.openCreateSubstationWizard()} - > -

` - : html``}`; - } - - static styles = css` - mwc-fab { - position: fixed; - bottom: 32px; - right: 32px; - } - - :host { - width: 100vw; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/Templates.ts b/packages/compas-open-scd/src/editors/Templates.ts deleted file mode 100644 index d0a2ea7f2..000000000 --- a/packages/compas-open-scd/src/editors/Templates.ts +++ /dev/null @@ -1,355 +0,0 @@ -import { LitElement, html, TemplateResult, property, css } from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-fab'; -import '@material/mwc-icon-button'; -import '@material/mwc-list'; -import '@material/mwc-list/mwc-list-item'; - -import '../filtered-list.js'; -import { - createElement, - identity, - newActionEvent, - newWizardEvent, -} from '../foundation.js'; -import { styles } from './templates/foundation.js'; - -import { - createEnumTypeWizard, - eNumTypeEditWizard, -} from './templates/enumtype-wizard.js'; -import { - createDATypeWizard, - editDaTypeWizard, -} from './templates/datype-wizards.js'; -import { - createDOTypeWizard, - dOTypeWizard, -} from './templates/dotype-wizards.js'; -import { - createLNodeTypeWizard, - lNodeTypeWizard, -} from './templates/lnodetype-wizard.js'; - -import { List } from '@material/mwc-list'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; -import { SingleSelectedEvent } from '@material/mwc-list/mwc-list-foundation'; - -const templates = fetch('public/xml/templates.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - -const nsd74 = fetch('public/xml/IEC_61850-7-4_2007B3.nsd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - -const nsd7420 = fetch('public/xml/IEC_61850-7-420_2019A4.nsd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - -/** An editor [[`plugin`]] for editing the `DataTypeTemplates` section. */ -export default class TemplatesPlugin extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - async openCreateLNodeTypeWizard(): Promise { - this.createDataTypeTemplates(); - - this.dispatchEvent( - newWizardEvent( - createLNodeTypeWizard( - this.doc.querySelector(':root > DataTypeTemplates')!, - await templates, - await nsd74, - await nsd7420 - ) - ) - ); - } - - openLNodeTypeWizard(identity: string): void { - const wizard = lNodeTypeWizard(identity, this.doc); - if (wizard) - this.dispatchEvent( - newWizardEvent(() => lNodeTypeWizard(identity, this.doc)!) - ); - } - - async openCreateDOTypeWizard(): Promise { - this.createDataTypeTemplates(); - - this.dispatchEvent( - newWizardEvent( - createDOTypeWizard( - this.doc.querySelector(':root > DataTypeTemplates')!, - await templates - ) - ) - ); - } - - openDOTypeWizard(identity: string): void { - const wizard = dOTypeWizard(identity, this.doc); - if (wizard) - this.dispatchEvent( - newWizardEvent(() => dOTypeWizard(identity, this.doc)!) - ); - } - - openDATypeWizard(identity: string): void { - const wizard = editDaTypeWizard(identity, this.doc); - if (wizard) - this.dispatchEvent( - newWizardEvent(() => editDaTypeWizard(identity, this.doc)!) - ); - } - - async openCreateDATypeWizard(): Promise { - this.createDataTypeTemplates(); - - this.dispatchEvent( - newWizardEvent( - createDATypeWizard( - this.doc.querySelector(':root > DataTypeTemplates')!, - await templates - ) - ) - ); - } - - openEnumTypeWizard(identity: string): void { - const wizard = eNumTypeEditWizard(identity, this.doc); - if (wizard) - this.dispatchEvent( - newWizardEvent(() => eNumTypeEditWizard(identity, this.doc)!) - ); - } - - async openCreateEnumWizard(): Promise { - this.createDataTypeTemplates(); - - this.dispatchEvent( - newWizardEvent( - createEnumTypeWizard( - this.doc.querySelector(':root > DataTypeTemplates')!, - await templates - ) - ) - ); - } - - createDataTypeTemplates(): void { - if (!this.doc.querySelector(':root > DataTypeTemplates')) - this.dispatchEvent( - newActionEvent({ - new: { - parent: this.doc.documentElement, - element: createElement(this.doc, 'DataTypeTemplates', {}), - }, - }) - ); - } - - render(): TemplateResult { - if (!this.doc?.querySelector(':root > DataTypeTemplates')) - return html`

- ${translate('templates.missing')} - this.createDataTypeTemplates()} - > -

`; - return html` -
-
-

- ${translate('scl.LNodeType')} - -

- - this.openLNodeTypeWizard( - ((e.target).selected).value - )} - > - ${Array.from( - this.doc.querySelectorAll( - ':root > DataTypeTemplates > LNodeType' - ) ?? [] - ).map( - lnodetype => - html`${lnodetype.getAttribute('id')}${lnodetype.getAttribute( - 'lnClass' - )}${lnodetype.querySelectorAll('DO').length}` - )} - -
-
-

- ${translate('scl.DOType')} - -

- - this.openDOTypeWizard( - ((e.target).selected).value - )} - > - ${Array.from( - this.doc.querySelectorAll(':root > DataTypeTemplates > DOType') ?? - [] - ).map( - dotype => - html`${dotype.getAttribute('id')}${dotype.getAttribute( - 'cdc' - )}${dotype.querySelectorAll('SDO, DA').length}` - )} - -
-
-

- ${translate('scl.DAType')} - -

- - this.openDATypeWizard( - ((e.target).selected).value - )} - > - ${Array.from( - this.doc.querySelectorAll(':root > DataTypeTemplates > DAType') ?? - [] - ).map( - datype => - html`${datype.getAttribute('id')}${datype.querySelectorAll('BDA').length}` - )} - -
-
-

- ${translate('scl.EnumType')} - -

- - this.openEnumTypeWizard( - ((e.target).selected).value - )} - > - ${Array.from( - this.doc.querySelectorAll( - ':root > DataTypeTemplates > EnumType' - ) ?? [] - ).map( - enumtype => - html`${enumtype.getAttribute('id')}${enumtype.querySelectorAll('EnumVal').length}` - )} - -
-
- `; - } - - static styles = css` - ${styles} - - mwc-fab { - position: fixed; - bottom: 32px; - right: 32px; - } - - :host { - width: 100vw; - } - - #containerTemplates { - display: grid; - grid-gap: 12px; - padding: 8px 12px 16px; - box-sizing: border-box; - grid-template-columns: repeat(auto-fit, minmax(316px, auto)); - } - - @media (max-width: 387px) { - #containerTemplates { - grid-template-columns: repeat(auto-fit, minmax(196px, auto)); - } - } - `; -} diff --git a/packages/compas-open-scd/src/editors/cleanup/control-blocks-container.ts b/packages/compas-open-scd/src/editors/cleanup/control-blocks-container.ts deleted file mode 100644 index 82114a5c6..000000000 --- a/packages/compas-open-scd/src/editors/cleanup/control-blocks-container.ts +++ /dev/null @@ -1,431 +0,0 @@ -'use strict'; - -import { - customElement, - css, - html, - LitElement, - property, - TemplateResult, - query, - queryAll, -} from 'lit-element'; -import { classMap } from 'lit-html/directives/class-map'; -import { translate } from 'lit-translate'; - -import '@material/mwc-button'; -import '@material/mwc-icon'; -import '@material/mwc-icon-button-toggle'; -import '@material/mwc-list/mwc-check-list-item.js'; -import '@material/mwc-checkbox'; - -import { Button } from '@material/mwc-button'; -import { Checkbox } from '@material/mwc-checkbox'; -import { List, MWCListIndex } from '@material/mwc-list'; -import { ListItem } from '@material/mwc-list/mwc-list-item.js'; - -import '../../filtered-list.js'; - -import { - Delete, - identity, - isPublic, - newSubWizardEvent, - newActionEvent, -} from '../../foundation.js'; -import { styles } from '../templates/foundation.js'; -import { - controlBlockIcons, - getFilterIcon, - iconType, -} from '../../icons/icons.js'; -import { editGseControlWizard, getGSE } from '../../wizards/gsecontrol.js'; -import { editReportControlWizard } from '../../wizards/reportcontrol.js'; -import { - editSampledValueControlWizard, - getSMV, -} from '../../wizards/sampledvaluecontrol.js'; -import { cleanSCLItems, identitySort } from './foundation.js'; - -type controlType = - | 'GSEControl' - | 'LogControl' - | 'SampledValueControl' - | 'ReportControl'; - -const iconMapping = { - GSEControl: 'gooseIcon', - LogControl: 'logIcon', - SampledValueControl: 'smvIcon', - ReportControl: 'reportIcon', -}; - -/** - * Check whether a control block is instantiated in the Communication section of the SCL file. - * @param controlBlock - SCL control block element. - * @returns true or false if a GSE or SMV element exists under the Communication section. - */ -function getCommAddress(controlBlock: Element): Element | null | undefined { - if (controlBlock.tagName === 'GSEControl') { - return getGSE(controlBlock); - } else if (controlBlock.tagName === 'SampledValueControl') { - return getSMV(controlBlock); - } - return null; -} - -/** An editor component for cleaning SCL Control Blocks. */ -@customElement('cleanup-control-blocks') -export class CleanupControlBlocks extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - - @property({ type: Boolean }) - disableControlClean = false; - - @property({ type: Array }) - unreferencedControls: Element[] = []; - - @property({ attribute: false }) - selectedControlItems: MWCListIndex | [] = []; - - @query('.deleteButton') - cleanButton!: Button; - - @query('.cleanupList') - cleanupList: List | undefined; - - @queryAll('mwc-check-list-item.cleanupListItem') - cleanupListItems: ListItem[] | undefined; - - @query('.cleanupAddressCheckbox') - cleanupAddressCheckbox: Checkbox | undefined; - - @query('.tGSEControlFilter') - cleanupGSEControlFilter!: Button; - - @query('.tSampledValueControlFilter') - cleanupSampledValueControlFilter!: Button; - - @query('.tLogControlFilter') - cleanupLogControlFilter!: Button; - - @query('.tReportControlFilter') - cleanupReportControlFilter!: Button; - - /** - * Toggle the class hidden in the unused controls list for use by filter buttons. - * @param selectorType - class for selection to toggle the hidden class used by the list. - */ - private toggleHiddenClass(selectorType: string) { - this.cleanupList!.querySelectorAll(`.${selectorType}`).forEach(element => { - element.classList.toggle('hiddenontypefilter'); - if (element.hasAttribute('disabled')) element.removeAttribute('disabled'); - else element.setAttribute('disabled', 'true'); - }); - } - - /** - * Initial update after container is loaded. - */ - async firstUpdated(): Promise { - this.cleanupList?.addEventListener('selected', () => { - this.selectedControlItems = this.cleanupList!.index; - }); - this.toggleHiddenClass('tReportControl'); - } - - /** - * Create a button for filtering in the control block cleanup container. - * @param controlType - SCL Control Type e.g. GSEControl. - * @param initialState - boolean representing whether button is on or off. - * @returns html for the icon button. - */ - private renderFilterIconButton( - controlType: controlType, - initialState = true - ): TemplateResult { - return html`${getFilterIcon(iconMapping[controlType], true)} - ${getFilterIcon(iconMapping[controlType], false)} - `; - } - - /** - * Provide list item in the control block cleanup container. - * @param controlBlock - an unused SCL ControlBlock element. - * @returns html for checklist item. - */ - private renderListItem(controlBlock: Element): TemplateResult { - return html`${controlBlock.getAttribute('name')!} - - - - - - - { - e.stopPropagation(); - if (controlBlock.tagName === 'GSEControl') { - e.target?.dispatchEvent( - newSubWizardEvent(editGseControlWizard(controlBlock)) - ); - } else if (controlBlock.tagName === 'ReportControl') { - e.target?.dispatchEvent( - newSubWizardEvent(editReportControlWizard(controlBlock)) - ); - } else if (controlBlock.tagName === 'SampledValueControl') { - e.target?.dispatchEvent( - newSubWizardEvent(editSampledValueControlWizard(controlBlock)) - ); - } else if (controlBlock.tagName === 'LogControl') { - // not implemented yet, disabled above - } - }} - > - - ${controlBlock.tagName} - - ${controlBlock.closest('IED')?.getAttribute('name')} - (${controlBlock.closest('IED')?.getAttribute('manufacturer') ?? - 'No manufacturer defined'}) - - - ${controlBlock.closest('IED')?.getAttribute('type') ?? - 'No Type Defined'} - ${controlBlockIcons[controlBlock.tagName]} - `; - } - - /** - * Provide delete button the control block cleanup container. - * @returns html for the Delete Button of this container. - */ - private renderDeleteButton(): TemplateResult { - const sizeSelectedItems = (>this.selectedControlItems).size; - - return html`>this.selectedControlItems).size === 0 || - (Array.isArray(this.selectedControlItems) && - !this.selectedControlItems.length)} - @click=${(e: MouseEvent) => { - const cleanItems = Array.from( - (>this.selectedControlItems).values() - ).map(index => this.unreferencedControls[index]); - let gseSmvAddressItems: Delete[] = []; - if (this.cleanupAddressCheckbox!.checked === true) { - // TODO: To be truly complete other elements should also be checked, possibly - // including: tServiceSettings, tReportSettings, tGSESettings, tSMVSettings - gseSmvAddressItems = cleanSCLItems( - cleanItems.map(cb => getCommAddress(cb)!).filter(Boolean) - ); - } - const gseSmvLogReportDeleteActions = - cleanSCLItems(cleanItems).concat(gseSmvAddressItems); - gseSmvLogReportDeleteActions.forEach(deleteAction => - e.target?.dispatchEvent(newActionEvent(deleteAction)) - ); - this.cleanupListItems!.forEach((item) => { - item.selected = false; - }); - }} - >`; - } - - /** - * Render a user selectable table of unreferenced datasets if any exist, otherwise indicate this is not an issue. - * @returns html for table and action button. - */ - private renderUnreferencedControls() { - const unreferencedCBs: Element[] = []; - // Control Blocks which can have a DataSet reference - Array.from( - this.doc?.querySelectorAll( - 'GSEControl, ReportControl, SampledValueControl, LogControl' - ) ?? [] - ) - .filter(isPublic) - .forEach(cb => { - const parent = cb.parentElement; - const name = cb.getAttribute('datSet'); - const isReferenced = parent?.querySelector(`DataSet[name="${name}"]`); - if (parent && (!name || !isReferenced)) unreferencedCBs.push(cb); - }); - this.unreferencedControls = identitySort(unreferencedCBs); - return html` -
-

- ${translate('cleanup.unreferencedControls.title')} - (${unreferencedCBs.length}) - - - - -

- ${this.renderFilterIconButton('LogControl')} - ${this.renderFilterIconButton('ReportControl', false)} - ${this.renderFilterIconButton('GSEControl')} - ${this.renderFilterIconButton('SampledValueControl')} - ${Array.from(unreferencedCBs.map(cb => this.renderListItem(cb)))} - -
-
- ${this.renderDeleteButton()} - - >this.selectedControlItems).size === 0 || - (Array.isArray(this.selectedControlItems) && - !this.selectedControlItems.length)} - > -
- `; - } - - render(): TemplateResult { - return html` -
${this.renderUnreferencedControls()}
- `; - } - - static styles = css` - ${styles} - - section { - display: flex; - flex: 1; - flex-direction: column; - justify-content: space-between; - } - - @media (max-width: 1200px) { - footer { - flex-direction: row; - } - - mwc-check-list-item { - overflow: hidden; - text-overflow: ellipsis; - } - } - - .editItem, - .cautionItem { - --mdc-icon-size: 16px; - } - - .editItem { - visibility: hidden; - opacity: 0; - } - - .cleanupListItem:hover .editItem { - visibility: visible; - opacity: 1; - transition: visibility 0s, opacity 0.5s linear; - } - - .cautionItem { - color: var(--yellow); - } - - .cautionItem[disabled], - .editItem[disabled] { - display: none; - } - - .deleteButton { - float: right; - } - - footer { - align-items: center; - align-content: center; - display: flex; - flex-flow: row wrap; - flex-direction: row-reverse; - justify-content: space-between; - margin: 16px; - } - - filtered-list { - min-height: 20vh; - overflow-y: scroll; - } - - .tGSEControlFilter[on], - .tSampledValueControlFilter[on], - .tLogControlFilter[on], - .tReportControlFilter[on] { - color: var(--secondary); - opacity: 1; - } - - /* Make sure to type filter here - .hidden is set on string filter in filtered-list and must always filter*/ - .cleanupListItem.hiddenontypefilter:not(.hidden) { - display: none; - } - - /* filter disabled, Material Design guidelines for opacity */ - .tGSEControlFilter, - .tSampledValueControlFilter, - .tLogControlFilter, - .tReportControlFilter { - opacity: 0.38; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/cleanup/datasets-container.ts b/packages/compas-open-scd/src/editors/cleanup/datasets-container.ts deleted file mode 100644 index 92acdb0ff..000000000 --- a/packages/compas-open-scd/src/editors/cleanup/datasets-container.ts +++ /dev/null @@ -1,245 +0,0 @@ -'use strict'; - -import { - customElement, - css, - html, - LitElement, - property, - TemplateResult, - query, - queryAll, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-button'; -import '@material/mwc-icon'; -import '@material/mwc-icon-button-toggle'; -import '@material/mwc-list/mwc-check-list-item.js'; -import '@material/mwc-checkbox'; - -import { Button } from '@material/mwc-button'; -import { List, MWCListIndex } from '@material/mwc-list'; -import { ListItem } from '@material/mwc-list/mwc-list-item.js'; - -import '../../filtered-list.js'; - -import { editDataSetWizard } from '../../wizards/dataset.js'; -import { styles } from '../templates/foundation.js'; -import { - identity, - isPublic, - newSubWizardEvent, - newActionEvent, -} from '../../foundation.js'; -import { cleanSCLItems, identitySort } from './foundation.js'; - -/** An editor component for cleaning SCL datasets. */ -@customElement('cleanup-datasets') -export class CleanupDatasets extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - - @property({ type: Boolean }) - disableDataSetClean = false; - - @property({ type: Array }) - unreferencedDataSets: Element[] = []; - - @property({ attribute: false }) - selectedDatasetItems: MWCListIndex | [] = []; - - @query('.deleteButton') - cleanupButton!: Button; - - @query('.dataSetList') - dataSetList: List | undefined; - - @queryAll('mwc-check-list-item.checkListItem') - dataSetItems: ListItem[] | undefined; - - async firstUpdated(): Promise { - this.dataSetList?.addEventListener('selected', () => { - this.selectedDatasetItems = this.dataSetList!.index; - }); - } - - /** - * Provide list item in the DataSet cleanup container. - * @param dataSet - an unused SCL DataSet element. - * @returns html for checklist item. - */ - private renderListItem(dataSet: Element): TemplateResult { - return html` ${dataSet.getAttribute('name')!} - - - { - e.stopPropagation(); - e.target?.dispatchEvent( - newSubWizardEvent(() => editDataSetWizard(dataSet)) - ); - }} - > - - ${dataSet.closest('IED')?.getAttribute('name')} - (${dataSet.closest('IED')?.getAttribute('manufacturer') ?? - 'No manufacturer defined'}) - - - ${dataSet.closest('IED')?.getAttribute('type') ?? - 'No Type Defined'} - `; - } - - /** - * Provide delete button the dataset cleanup container. - * @returns html for the Delete Button of this container. - */ - private renderDeleteButton(): TemplateResult { - const sizeSelectedItems = (>this.selectedDatasetItems).size; - - return html` >this.selectedDatasetItems).size === 0 || - (Array.isArray(this.selectedDatasetItems) && - !this.selectedDatasetItems.length)} - @click=${(e: MouseEvent) => { - const cleanItems = Array.from( - (>this.selectedDatasetItems).values() - ).map(index => this.unreferencedDataSets[index]); - const deleteActions = cleanSCLItems(cleanItems); - deleteActions.forEach(deleteAction => - e.target?.dispatchEvent(newActionEvent(deleteAction)) - ); - this.dataSetItems!.forEach((item) => { - item.selected = false; - }); - }} - >`; - } - - /** - * Render a user selectable table of unreferenced datasets if any exist, otherwise indicate this is not an issue. - * @returns html for table and action button. - */ - private renderUnreferencedDataSets(): TemplateResult { - const unreferencedDataSets: Element[] = []; - Array.from(this.doc?.querySelectorAll('DataSet') ?? []) - .filter(isPublic) - .forEach(dataSet => { - const parent = dataSet.parentElement; - const name = dataSet.getAttribute('name'); - const isReferenced = Array.from( - parent?.querySelectorAll( - 'GSEControl, ReportControl, SampledValueControl, LogControl' - ) ?? [] - ).some(cb => cb.getAttribute('datSet') === name); - - if (parent && (!name || !isReferenced)) - unreferencedDataSets.push(dataSet); - }); - this.unreferencedDataSets = identitySort(unreferencedDataSets); - return html` -
-

- ${translate('cleanup.unreferencedDataSets.title')} - (${unreferencedDataSets.length}) - - - - -

- ${Array.from( - this.unreferencedDataSets.map( - item => html`${this.renderListItem(item)}` - ) - )} - -
-
${this.renderDeleteButton()}
- `; - } - - render(): TemplateResult { - return html` -
${this.renderUnreferencedDataSets()}
- `; - } - - static styles = css` - ${styles} - - section { - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; - } - - @media (max-width: 1200px) { - footer { - flex-direction: row; - } - - mwc-check-list-item { - overflow: hidden; - text-overflow: ellipsis; - } - } - - .editItem { - --mdc-icon-size: 16px; - } - - .editItem { - visibility: hidden; - opacity: 0; - } - - .checkListItem:hover .editItem { - visibility: visible; - opacity: 1; - transition: visibility 0s, opacity 0.5s linear; - } - - .cleanupDeleteButton { - float: right; - } - - footer { - margin: 16px; - display: flex; - flex-flow: row wrap; - flex-direction: row-reverse; - justify-content: space-between; - align-items: center; - align-content: center; - } - - filtered-list { - max-height: 70vh; - min-height: 20vh; - overflow-y: scroll; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/cleanup/datatypes-container.ts b/packages/compas-open-scd/src/editors/cleanup/datatypes-container.ts deleted file mode 100644 index f44162094..000000000 --- a/packages/compas-open-scd/src/editors/cleanup/datatypes-container.ts +++ /dev/null @@ -1,592 +0,0 @@ -'use strict'; - -import { - customElement, - css, - html, - LitElement, - property, - TemplateResult, - query, - queryAll, -} from 'lit-element'; -import { classMap } from 'lit-html/directives/class-map'; -import { get, translate } from 'lit-translate'; - -import '@material/mwc-button'; -import '@material/mwc-icon'; -import '@material/mwc-icon-button-toggle'; -import '@material/mwc-list/mwc-check-list-item.js'; -import '@material/mwc-checkbox'; - -import { Button } from '@material/mwc-button'; -import { Checkbox } from '@material/mwc-checkbox'; -import { List, MWCListIndex } from '@material/mwc-list'; -import { ListItem } from '@material/mwc-list/mwc-list-item.js'; - -import '../../filtered-list.js'; - -import { - identity, - isPublic, - newLogEvent, - newSubWizardEvent, - newActionEvent, -} from '../../foundation.js'; -import { styles } from '../templates/foundation.js'; -import { - dataTypeTemplateIcons, - getFilterIcon, - iconType, -} from '../../icons/icons.js'; - -import { lNodeTypeWizard } from '../templates/lnodetype-wizard.js'; -import { editDaTypeWizard } from '../templates/datype-wizards.js'; -import { dOTypeWizard } from '../templates/dotype-wizards.js'; -import { eNumTypeEditWizard } from '../templates/enumtype-wizard.js'; - -import { cleanSCLItems, identitySort, uniq } from './foundation.js'; - -type templateType = 'EnumType' | 'DAType' | 'DOType' | 'LNodeType'; - -const iconMapping = { - EnumType: 'enumIcon', - DAType: 'dAIcon', - DOType: 'dOIcon', - LNodeType: 'lNIcon', -}; - -const filterClassMapping: Record = { - EnumType: 'enum-type', - DAType: 'da-type', - DOType: 'do-type', - LNodeType: 'lnode-type', -}; - -/** An editor component for cleaning SCL DataType templates. */ -@customElement('cleanup-data-types') -export class CleanupDataTypes extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - - @property({ type: Boolean }) - disableControlClean = false; - - @property({ type: Array }) - unreferencedDataTypes: Element[] = []; - - @property({ attribute: false }) - selectedDataTypeItems: MWCListIndex | [] = []; - - @query('.delete-button') - cleanButton!: Button; - - @query('.cleanup-list') - cleanupList: List | undefined; - - @queryAll('mwc-check-list-item.cleanup-list-item') - cleanupListItems: ListItem[] | undefined; - - @query('.clean-sub-types-checkbox') - cleanSubTypesCheckbox: Checkbox | undefined; - - @query('.t-da-type-filter') - cleanupDATypeFilter!: Button; - - @query('.t-enum-type-filter') - cleanupEnumTypeFilter!: Button; - - @query('.t-lnode-type-filter') - cleanupLNodeTypeFilter!: Button; - - @query('.t-do-type-filter') - cleanupDOTypeFilter!: Button; - - /** - * Initial update after container is loaded. - */ - async firstUpdated(): Promise { - this.cleanupList?.addEventListener('selected', () => { - this.selectedDataTypeItems = this.cleanupList!.index; - }); - } - - /** - * Toggle the class hidden in the unused data type list for use by filter buttons to ensure selection works correctly. - * @param selectorType - class for selection to toggle the hidden class used by the list. - */ - private toggleHiddenClass(selectorType: string) { - this.cleanupList!.querySelectorAll(`.${selectorType}`).forEach(element => { - element.classList.toggle('hiddenontypefilter'); - if (element.hasAttribute('disabled')) element.removeAttribute('disabled'); - else element.setAttribute('disabled', 'true'); - }); - } - - /** - * Create a button for filtering in the data type cleanup container. - * @param dataType - SCL Data Type e.g. DOType. - * @param initialState - boolean representing whether button is on or off. - * @returns html for the icon button. - */ - private renderFilterIconButton( - dataType: templateType, - initialState = true - ): TemplateResult { - return html` { - this.toggleHiddenClass(`t-${filterClassMapping[dataType]}`); - }} - >${getFilterIcon(iconMapping[dataType], true)} - ${getFilterIcon(iconMapping[dataType], false)} - `; - } - - /** - * Opens an editor for a given data type. - * @param dType - SCL datatype element. - */ - private openDataTypeEditor(dType: Element) { - if (dType.tagName === 'LNodeType') { - this.dispatchEvent( - newSubWizardEvent(lNodeTypeWizard(identity(dType), this.doc)) - ); - } else if (dType.tagName === 'DAType') { - this.dispatchEvent( - newSubWizardEvent(editDaTypeWizard(identity(dType), this.doc)) - ); - } else if (dType.tagName === 'DOType') { - this.dispatchEvent( - newSubWizardEvent(dOTypeWizard(identity(dType), this.doc)) - ); - } else if (dType.tagName === 'EnumType') { - this.dispatchEvent( - newSubWizardEvent(eNumTypeEditWizard(identity(dType), this.doc)) - ); - } - } - - /** - * Return secondary descriptive parameter for a data type. - * @param dType - SCL datatype element. - * @returns string with secondary descriptive parameter for a data type - */ - private getDataTypeSecondaryText(dType: Element): string | null | undefined { - if (dType.tagName === 'LNodeType') { - return dType.getAttribute('lnClass'); - } else if (dType.tagName === 'DAType') { - return dType.getAttribute('desc'); - } else if (dType.tagName === 'DOType') { - return dType.getAttribute('cdc'); - } else if (dType.tagName === 'EnumType') { - return dType.getAttribute('desc'); - } - return 'Unknown'; - } - - /** - * Provide list item in the data type cleanup container. - * @param dType - an unused SCL DataType element (LNodeType, DOType, DAType EnumType). - * @returns html for checklist item. - */ - private renderListItem(dType: Element): TemplateResult { - return html`${dType.getAttribute('id')!} - - - - ${this.getDataTypeSecondaryText(dType)} - ${dataTypeTemplateIcons[dType.tagName]} - `; - } - - /** - * Recurses through all datatype templates and indexes their usage. - * @returns a map of data type templates usage by id. - */ - private indexDataTypeTemplates(dttStart: Element[]) { - const dataTypeFrequencyUsage = new Map(); - - // recursively fetch all usages - const allUsages = this.fetchTree(dttStart); - - // make frequency count of datatype ids - allUsages.forEach(item => { - dataTypeFrequencyUsage.set( - item, - (dataTypeFrequencyUsage.get(item) || 0) + 1 - ); - }); - return dataTypeFrequencyUsage; - } - - /** - * Given a datatype reference return the appropriate datatype object or null. - * @param element - the SCL Element for which a datatype is required. - * @returns either the datatype or null. - */ - private getSubType(element: Element): Element | null { - const dataTypeTemplates = this.doc.querySelector( - ':root > DataTypeTemplates' - ); - const type = element.getAttribute('type'); - if (element.tagName === 'DO' || element.tagName === 'SDO') { - return dataTypeTemplates!.querySelector(`DOType[id="${type}"]`); - } else if ( - (element.tagName === 'DA' || element.tagName === 'BDA') && - element.getAttribute('bType') === 'Struct' - ) { - return dataTypeTemplates!.querySelector(`DAType[id="${type}"]`); - } else if ( - (element.tagName === 'DA' || element.tagName === 'BDA') && - element.getAttribute('bType') === 'Enum' - ) { - return dataTypeTemplates!.querySelector(`EnumType[id="${type}"]`); - } - return null; - } - - /** - * Recurses from an initial element to find all child references (with duplicates). - * @param rootElement - root SCL Element for which all child datatype references are required. - * @returns the id value for all SCL element datatypes traversed. - */ - private fetchTree(rootElements: Element[]): string[] { - const elementStack = [...rootElements]; - const traversedElements: string[] = []; - - // A max stack depth is defined to avoid recursive references. - const MAX_STACK_DEPTH = 300000; - - while (elementStack.length > 0 && elementStack.length <= MAX_STACK_DEPTH) { - const currentElement = elementStack.pop(); - traversedElements.push(currentElement!.getAttribute('id')!); - - const selector = 'DO, SDO, DA, BDA'; - - Array.from(currentElement!.querySelectorAll(selector)) - .filter(isPublic) - .forEach(element => { - const newElement = this.getSubType(element); - if (newElement !== null) { - elementStack.unshift(newElement); - } - }); - - if (elementStack.length >= MAX_STACK_DEPTH) { - this.dispatchEvent( - newLogEvent({ - kind: 'error', - title: get('cleanup.unreferencedDataTypes.title'), - message: get('cleanup.unreferencedDataTypes.stackExceeded', { - maxStackDepth: MAX_STACK_DEPTH.toString(), - }), - }) - ); - } - } - - return traversedElements; - } - - /** - * Get items from selection list and and any subtypes. - * @returns An array of SCL elements representing selected items and subtypes as required. - */ - public getCleanItems(): Element[] { - const cleanItems = Array.from( - (>this.selectedDataTypeItems).values() - ).map(index => this.unreferencedDataTypes[index]); - - if (this.cleanSubTypesCheckbox!.checked === true) { - const dataTypeTemplates = this.doc.querySelector( - ':root > DataTypeTemplates' - )!; - - const startingLNodeTypes = Array.from( - dataTypeTemplates.querySelectorAll('LNodeType') - ); - const dataTypeUsageCounter = - this.indexDataTypeTemplates(startingLNodeTypes); - - /* Create usage counter for children of LNodeTypes that are used. - We remember that _all_ valid template usages within a project - stem from LNodeTypes. */ - cleanItems.forEach(item => { - if (item.tagName === 'LNodeType') { - const childDataTypeTemplateIds = this.fetchTree([item]); - childDataTypeTemplateIds.forEach(id => { - dataTypeUsageCounter?.set(id, dataTypeUsageCounter.get(id)! - 1); - }); - } - }); - - /* Check to see if children of unused DOType, DAType are present - If so then unless they are from a data type which is part of - the main usage counter they can be safely removed. - If they are part of the main usage counter, then this does not - need to be considered as these DOType and DAType elements are - dangling, they're usage is not relevant. */ - cleanItems.forEach(item => { - if (['DOType', 'DAType'].includes(item.tagName)) { - const unusedDataTypeTemplateChildrenIds = uniq( - this.fetchTree([item]) - ); - unusedDataTypeTemplateChildrenIds.forEach(id => { - if (dataTypeUsageCounter.get(id) === undefined) - cleanItems.push(dataTypeTemplates.querySelector(`[id="${id}"]`)!); - }); - } - }); - - /* Now go through our usage index. If usage is zero then we can - remove the data type template safely. */ - dataTypeUsageCounter?.forEach((count, dataTypeId) => { - if (count <= 0) { - cleanItems.push( - dataTypeTemplates.querySelector(`[id="${dataTypeId}"]`)! - ); - } - }); - } - return cleanItems; - } - - /** - * Provide delete button the data type cleanup container. - * @returns html for the Delete Button of this container. - */ - private renderDeleteButton(): TemplateResult { - return html`>this.selectedDataTypeItems).size === 0 || - (Array.isArray(this.selectedDataTypeItems) && - !this.selectedDataTypeItems.length)} - @click=${() => { - const dataTypeItemsDeleteActions = cleanSCLItems(this.getCleanItems()); - dataTypeItemsDeleteActions.forEach(deleteAction => - this.dispatchEvent(newActionEvent(deleteAction)) - ); - this.cleanupListItems!.forEach((item) => { - item.selected = false; - }); - }} - >`; - } - - /** - * Find unused types by scanning the SCL and comparing with the DataTypeTemplates. - * @param usedSelector - CSS selector for SCL type's instantiated name, e.g. LN, LN0. - * @param keyAttributeName - attribute name for SCL types uniqueness guarantee, e.g. lnType. - * @param templateSelector - CSS selector for SCL template element in DataTypeTemplate section. - * @returns an array of unreferenced elements sorted by their identity string. - */ - private getUnusedType( - usedSelector: string, - keyAttributeName: string, - templateSelector: string - ) { - const usedTypes = uniq( - Array.from(this.doc?.querySelectorAll(usedSelector) ?? []) - .filter(isPublic) - .map(uType => uType.getAttribute(keyAttributeName)) - ); - - const unreferencedTypes: Element[] = []; - Array.from( - this.doc?.querySelectorAll(`DataTypeTemplates > ${templateSelector}`) ?? - [] - ) - .filter(isPublic) - .forEach(dType => { - if (!usedTypes.includes(dType.getAttribute('id') ?? 'Unknown')) - unreferencedTypes.push(dType); - }); - return identitySort(unreferencedTypes); - } - - /** - * Find unused types by scanning the SCL and comparing with the DataTypeTemplates. - * @returns an array of unreferenced elements - */ - private getUnusedTypes() { - const unreferencedLNTypes = this.getUnusedType( - 'LN, LN0', - 'lnType', - 'LNodeType' - ); - const unreferencedDOTypes = this.getUnusedType('DO, SDO', 'type', 'DOType'); - const unreferencedDATypes = this.getUnusedType( - 'DA[bType="Struct"], BDA[bType="Struct"]', - 'type', - 'DAType' - ); - const unreferencedEnumTypes = this.getUnusedType( - 'DA[bType="Enum"], BDA[bType="Enum"]', - 'type', - 'EnumType' - ); - return unreferencedLNTypes.concat( - unreferencedDOTypes, - unreferencedDATypes, - unreferencedEnumTypes - ); - } - - /** - * Render a user selectable table of unreferenced DataTypes if any exist. - * @returns html for table and action button. - */ - private renderUnreferencedDataTypes() { - this.unreferencedDataTypes = this.getUnusedTypes(); - - return html` -
-

- ${translate('cleanup.unreferencedDataTypes.title')} - (${this.unreferencedDataTypes.length}) - - - - -

- ${this.renderFilterIconButton('LNodeType')} - ${this.renderFilterIconButton('DOType')} - ${this.renderFilterIconButton('DAType')} - ${this.renderFilterIconButton('EnumType')} - ${Array.from( - this.unreferencedDataTypes.map(type => this.renderListItem(type)) - )} - -
-
- ${this.renderDeleteButton()} - - -
- `; - } - - render(): TemplateResult { - return html` -
${this.renderUnreferencedDataTypes()}
- `; - } - - static styles = css` - ${styles} - - section { - display: flex; - flex: 1; - flex-direction: column; - justify-content: space-between; - } - - @media (max-width: 1200px) { - footer { - flex-direction: row; - } - - mwc-check-list-item { - overflow: hidden; - text-overflow: ellipsis; - } - } - - .edit-item { - --mdc-icon-size: 16px; - visibility: hidden; - opacity: 0; - } - - .cleanup-list-item:hover .edit-item { - visibility: visible; - opacity: 1; - transition: visibility 0s, opacity 0.5s linear; - } - - .edit-item[disabled] { - display: none; - } - - .delete-button { - float: right; - } - - footer { - align-items: center; - align-content: center; - display: flex; - flex-flow: row wrap; - flex-direction: row-reverse; - justify-content: space-between; - margin: 16px; - } - - filtered-list { - min-height: 20vh; - overflow-y: scroll; - } - - /* filter itself changes colour after click */ - .t-da-type-filter[on], - .t-enum-type-filter[on], - .t-lnode-type-filter[on], - .t-do-type-filter[on] { - color: var(--secondary); - opacity: 1; - } - - /* Make sure to type filter here - .hidden is set on string filter in filtered-list and must always filter*/ - .cleanup-list-item.hiddenontypefilter:not(.hidden) { - display: none; - } - - /* filter disabled, Material Design guidelines for opacity */ - .t-da-type-filter, - .t-enum-type-filter, - .t-lnode-type-filter, - .t-do-type-filter { - opacity: 0.38; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/cleanup/foundation.ts b/packages/compas-open-scd/src/editors/cleanup/foundation.ts deleted file mode 100644 index f870dbd66..000000000 --- a/packages/compas-open-scd/src/editors/cleanup/foundation.ts +++ /dev/null @@ -1,63 +0,0 @@ -'use strict'; - -import { identity, Delete } from '../../foundation.js'; - -/** - * Clean SCL items as requested by removing SCL elements specified from the SCL file - * @param cleanItems - SCL elements to be removed from the SCL file - * @returns an actions array to support undo/redo - */ -export function cleanSCLItems(cleanItems: Element[]): Delete[] { - const actions: Delete[] = []; - if (cleanItems) { - cleanItems.forEach(item => { - actions.push({ - old: { - parent: item.parentElement!, - element: item, - reference: item!.nextSibling, - }, - }); - }); - } - return actions; -} - -/** - * Provide frequency count of elements. - * @param arr - An array of elements - * @returns a Map of element strings and frequencies - */ -export function countBy(arr: string[]): Map { - return arr.reduce((acc, e) => acc.set(e, (acc.get(e) || 0) + 1), new Map()); -} - -/** - * Sort a list of Elements by their identity string. - * @param elements - an array of Elements. - * @returns a sorted list of elements. - */ -export function identitySort(elements: Element[]): Element[] { - return elements.sort((a: Element, b: Element) => { - // sorting using the identity ensures sort order includes IED and other useful properties - const aId = identity(a); - const bId = identity(b); - if (aId < bId) { - return -1; - } - if (aId > bId) { - return 1; - } - // names must be equal - return 0; - }); -} - -/** - * Return a de-duplicate set of array elements. - * @param arr - an array of items with duplicates. - * @returns an array of items without duplicates. - */ -export function uniq(arr: unknown[]): unknown[] { - return Array.from(new Set(arr)); -} diff --git a/packages/compas-open-scd/src/editors/communication/connectedap-editor.ts b/packages/compas-open-scd/src/editors/communication/connectedap-editor.ts deleted file mode 100644 index 10cc184ee..000000000 --- a/packages/compas-open-scd/src/editors/communication/connectedap-editor.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { - LitElement, - TemplateResult, - customElement, - html, - property, -} from 'lit-element'; - -import '@material/mwc-fab'; - -import '../../action-icon.js'; -import { newWizardEvent, newActionEvent } from '../../foundation.js'; -import { editConnectedApWizard } from '../../wizards/connectedap.js'; - -/** [[`Communication`]] subeditor for a `ConnectedAP` element. */ -@customElement('connectedap-editor') -export class ConnectedAPEditor extends LitElement { - /** SCL element ConnectedAP */ - @property({ attribute: false }) - element!: Element; - /** ConnectedAP attribute apName */ - @property({ type: String }) - get apName(): string { - return this.element.getAttribute('apName') ?? 'UNDEFINED'; - } - - private openEditWizard(): void { - this.dispatchEvent(newWizardEvent(editConnectedApWizard(this.element))); - } - - remove(): void { - if (this.element) - this.dispatchEvent( - newActionEvent({ - old: { - parent: this.element.parentElement!, - element: this.element, - reference: this.element.nextSibling, - }, - }) - ); - } - - render(): TemplateResult { - return html` - - - `; - } -} diff --git a/packages/compas-open-scd/src/editors/communication/gse-editor.ts b/packages/compas-open-scd/src/editors/communication/gse-editor.ts deleted file mode 100644 index a7f03f622..000000000 --- a/packages/compas-open-scd/src/editors/communication/gse-editor.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - LitElement, - TemplateResult, - html, - customElement, - property, - state, -} from 'lit-element'; - -import '@material/mwc-icon'; - -import '../../action-icon.js'; -import { newWizardEvent, newActionEvent } from '../../foundation.js'; -import { sizableGooseIcon } from '../../icons/icons.js'; -import { editGseWizard } from '../../wizards/gse.js'; - -@customElement('gse-editor') -export class GseEditor extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - - @property({ attribute: false }) - element!: Element; - - @state() - get label(): string { - return ( - this.element.getAttribute('ldInst') + - '/' + - this.element.getAttribute('cbName') - ); - } - - private openEditWizard(): void { - this.dispatchEvent(newWizardEvent(editGseWizard(this.element))); - } - - remove(): void { - if (this.element) - this.dispatchEvent( - newActionEvent({ - old: { - parent: this.element.parentElement!, - element: this.element, - reference: this.element.nextSibling, - }, - }) - ); - } - - render(): TemplateResult { - return html` - `; - } -} diff --git a/packages/compas-open-scd/src/editors/communication/smv-editor.ts b/packages/compas-open-scd/src/editors/communication/smv-editor.ts deleted file mode 100644 index 6938cfc84..000000000 --- a/packages/compas-open-scd/src/editors/communication/smv-editor.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { - LitElement, - TemplateResult, - html, - customElement, - property, - state, -} from 'lit-element'; - -import '@material/mwc-icon'; - -import '../../action-icon.js'; -import { sizableSmvIcon } from '../../icons/icons.js'; -import { newWizardEvent, newActionEvent } from '../../foundation.js'; -import { editSMvWizard } from '../../wizards/smv.js'; - -@customElement('smv-editor') -export class SmvEditor extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - - @property({ attribute: false }) - element!: Element; - - @state() - get label(): string { - return ( - this.element.getAttribute('ldInst') + - '/' + - this.element.getAttribute('cbName') - ); - } - - private openEditWizard(): void { - this.dispatchEvent(newWizardEvent(editSMvWizard(this.element))); - } - - remove(): void { - if (this.element) - this.dispatchEvent( - newActionEvent({ - old: { - parent: this.element.parentElement!, - element: this.element, - reference: this.element.nextSibling, - }, - }) - ); - } - - render(): TemplateResult { - return html` - `; - } -} diff --git a/packages/compas-open-scd/src/editors/communication/subnetwork-editor.ts b/packages/compas-open-scd/src/editors/communication/subnetwork-editor.ts deleted file mode 100644 index 398557ec8..000000000 --- a/packages/compas-open-scd/src/editors/communication/subnetwork-editor.ts +++ /dev/null @@ -1,208 +0,0 @@ -import { - LitElement, - TemplateResult, - customElement, - html, - property, - css, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-icon-button'; - -import './connectedap-editor.js'; -import './gse-editor.js'; -import './smv-editor.js'; -import { - newWizardEvent, - newActionEvent, - compareNames, -} from '../../foundation.js'; -import { createConnectedApWizard } from '../../wizards/connectedap.js'; -import { wizards } from '../../wizards/wizard-library.js'; - -/** [[`Communication`]] subeditor for a `SubNetwork` element. */ -@customElement('subnetwork-editor') -export class SubNetworkEditor extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - /** SCL element SubNetwork */ - @property({ attribute: false }) - element!: Element; - /** SubNetwork attribute name */ - @property({ type: String }) - get name(): string { - return this.element.getAttribute('name') ?? 'UNDEFINED'; - } - /** SubNetwork attribute desc */ - @property({ type: String }) - get desc(): string | null { - return this.element.getAttribute('desc') ?? null; - } - /** SubNetwork attribute type */ - @property({ type: String }) - get type(): string | null { - return this.element.getAttribute('type') ?? null; - } - /** SubNetwork child elements BitRate label */ - @property({ type: String }) - get bitrate(): string | null { - const bitRate = this.element.querySelector('BitRate'); - if (bitRate === null) return null; - const bitRateValue = bitRate.textContent ?? ''; - const m = bitRate.getAttribute('multiplier'); - const unit = ` ${m ?? ''}b/s`; - return bitRateValue ? bitRateValue + unit : null; - } - - private openConnectedAPwizard(): void { - this.dispatchEvent(newWizardEvent(createConnectedApWizard(this.element))); - } - - private openEditWizard(): void { - const wizard = wizards['SubNetwork'].edit(this.element); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - remove(): void { - if (this.element) - this.dispatchEvent( - newActionEvent({ - old: { - parent: this.element.parentElement!, - element: this.element, - reference: this.element.nextSibling, - }, - }) - ); - } - - private renderSmvEditors(iedName: string): TemplateResult[] { - return Array.from( - this.element - .closest('Communication') - ?.querySelectorAll(`ConnectedAP[iedName="${iedName}"] > SMV`) ?? [] - ).map( - smv => html`` - ); - } - - private renderGseEditors(iedName: string): TemplateResult[] { - return Array.from( - this.element - .closest('Communication') - ?.querySelectorAll(`ConnectedAP[iedName="${iedName}"] > GSE`) ?? [] - ).map( - gse => html`` - ); - } - - private renderConnectedApEditors(iedName: string): TemplateResult[] { - return Array.from( - this.element.parentElement?.querySelectorAll( - `:scope > SubNetwork > ConnectedAP[iedName="${iedName}"]` - ) ?? [] - ).map( - connectedAP => - html`` - ); - } - - private renderIEDs(): TemplateResult[] { - return Array.from(this.element.querySelectorAll(':scope > ConnectedAP')) - .map(connAP => connAP.getAttribute('iedName')!) - .filter((v, i, a) => a.indexOf(v) === i) - .sort(compareNames) - .map( - iedName => html` - ${this.renderConnectedApEditors(iedName)}${this.renderGseEditors( - iedName - )}${this.renderSmvEditors(iedName)} - ` - ); - } - - private subNetworkSpecs(): string { - if (!this.type && !this.bitrate) return ''; - - return `(${[this.type, this.bitrate].filter(text => !!text).join(' — ')})`; - } - - private header(): string { - return `${this.name} ${this.desc === null ? '' : `— ${this.desc}`} - ${this.subNetworkSpecs()}`; - } - - render(): TemplateResult { - return html` - - this.openEditWizard()} - > - - - this.remove()} - > - - - - -
${this.renderIEDs()}
-
`; - } - - static styles = css` - #iedContainer { - display: grid; - box-sizing: border-box; - gap: 12px; - padding: 8px 12px 16px; - grid-template-columns: repeat(auto-fit, minmax(150px, auto)); - } - - #iedSection:not(:focus):not(:focus-within) .disabled { - display: none; - } - - #iedSection:not(:focus):not(:focus-within) gse-editor { - display: none; - } - - #iedSection:not(:focus):not(:focus-within) smv-editor { - display: none; - } - - #iedSection .disabled { - pointer-events: none; - opacity: 0.5; - } - - abbr { - text-decoration: none; - border-bottom: none; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/ied/access-point-container.ts b/packages/compas-open-scd/src/editors/ied/access-point-container.ts deleted file mode 100644 index f306fba96..000000000 --- a/packages/compas-open-scd/src/editors/ied/access-point-container.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { - css, - customElement, - html, - property, - PropertyValues, - state, - TemplateResult, -} from 'lit-element'; -import { nothing } from 'lit-html'; -import { translate } from 'lit-translate'; - -import { - getDescriptionAttribute, - getNameAttribute, - newWizardEvent, -} from '../../foundation.js'; -import { accessPointIcon } from '../../icons/ied-icons.js'; -import { editServicesWizard } from '../../wizards/services.js'; - -import '../../action-pane.js'; -import './server-container.js'; - -import { Container } from './foundation.js'; - -/** [[`IED`]] plugin subeditor for editing `AccessPoint` element. */ -@customElement('access-point-container') -export class AccessPointContainer extends Container { - @property() - selectedLNClasses: string[] = []; - - protected updated(_changedProperties: PropertyValues): void { - super.updated(_changedProperties); - - // When the LN Classes filter is updated, we also want to trigger rendering for the LN Elements. - if (_changedProperties.has('selectedLNClasses')) { - this.requestUpdate('lnElements'); - } - } - - private renderServicesIcon(): TemplateResult { - const services: Element | null = this.element.querySelector('Services'); - - if (!services) { - return html``; - } - - return html` - this.openSettingsWizard(services)} - > - `; - } - - private openSettingsWizard(services: Element): void { - const wizard = editServicesWizard(services); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - @state() - private get lnElements(): Element[] { - return Array.from(this.element.querySelectorAll(':scope > LN')).filter( - element => { - const lnClass = element.getAttribute('lnClass') ?? ''; - return this.selectedLNClasses.includes(lnClass); - } - ); - } - - private header(): TemplateResult { - const name = getNameAttribute(this.element); - const desc = getDescriptionAttribute(this.element); - - return html`${name}${desc ? html` — ${desc}` : nothing}`; - } - - render(): TemplateResult { - const lnElements = this.lnElements; - - return html` - ${accessPointIcon} - ${this.renderServicesIcon()} - ${Array.from(this.element.querySelectorAll(':scope > Server')).map( - server => - html`` - )} -
- ${lnElements.map( - ln => html`` - )} -
-
`; - } - - static styles = css` - #lnContainer { - display: grid; - grid-gap: 12px; - box-sizing: border-box; - grid-template-columns: repeat(auto-fit, minmax(316px, auto)); - } - - @media (max-width: 387px) { - #lnContainer { - grid-template-columns: repeat(auto-fit, minmax(196px, auto)); - } - } - `; -} diff --git a/packages/compas-open-scd/src/editors/ied/da-container.ts b/packages/compas-open-scd/src/editors/ied/da-container.ts deleted file mode 100644 index ee3d7f4cb..000000000 --- a/packages/compas-open-scd/src/editors/ied/da-container.ts +++ /dev/null @@ -1,238 +0,0 @@ -import { - css, - customElement, - html, - property, - query, - TemplateResult, -} from 'lit-element'; -import { nothing } from 'lit-html'; -import { translate } from 'lit-translate'; - -import '@material/mwc-icon-button-toggle'; -import { IconButtonToggle } from '@material/mwc-icon-button-toggle'; - -import '../../action-pane.js'; -import { getNameAttribute, newWizardEvent } from '../../foundation.js'; -import { wizards } from '../../wizards/wizard-library.js'; -import { - DaiFieldTypes, - getCustomField, -} from '../../wizards/foundation/dai-field-type.js'; -import { createDaInfoWizard } from './da-wizard.js'; -import { - Container, - getInstanceDAElement, - getValueElements, -} from './foundation.js'; -import { createDAIWizard } from '../../wizards/dai.js'; -import { - determineUninitializedStructure, - initializeElements, -} from '../../foundation/dai.js'; - -/** [[`IED`]] plugin subeditor for editing `(B)DA` element. */ -@customElement('da-container') -export class DAContainer extends Container { - /** - * The optional DAI of this (B)DA. - */ - @property({ attribute: false }) - instanceElement!: Element; - - @query('#toggleButton') - toggleButton: IconButtonToggle | undefined; - - private header(): TemplateResult { - const name = getNameAttribute(this.element); - const bType = this.element.getAttribute('bType') ?? nothing; - const fc = this.element.getAttribute('fc'); - - if (this.instanceElement) { - return html`${name} — ${bType}${fc ? html` [${fc}]` : ``}`; - } else { - return html`${name} — ${bType}${fc ? html` [${fc}]` : ``}`; - } - } - - /** - * Get the nested (B)DA element(s) if available. - * @returns The nested (B)DA element(s) of this (B)DA container. - */ - private getBDAElements(): Element[] { - const type = this.element!.getAttribute('type') ?? undefined; - const doType = this.element!.closest('SCL')!.querySelector( - `:root > DataTypeTemplates > DAType[id="${type}"]` - ); - if (doType != null) { - return Array.from(doType!.querySelectorAll(':scope > BDA')); - } - return []; - } - - /** - * Use the list of ancestor to retrieve the list from DO to the current (B)DA Element. - * This structure is used to create the initialized structure from (DOI/SDI/DAI). - * - * @returns The list from the DO Element to the current (B)DA Element. - */ - private getTemplateStructure(): Element[] { - // Search for the DO Element, this will be the starting point. - const doElement = this.ancestors.filter( - element => element.tagName == 'DO' - )[0]; - // From the DO Element and below we need all the elements (BDA, SDO, DA) - const dataStructure = this.ancestors.slice( - this.ancestors.indexOf(doElement) - ); - // Add the current DA Element also to the list. - dataStructure.push(this.element); - return dataStructure; - } - - private openCreateWizard(): void { - // Search the LN(0) Element to start creating the initialized structure. - const lnElement = this.ancestors.filter(element => - ['LN0', 'LN'].includes(element.tagName) - )[0]; - const templateStructure = this.getTemplateStructure(); - // First determine where to start creating new elements (DOI/SDI/DAI) - const [parentElement, uninitializedTemplateStructure] = - determineUninitializedStructure(lnElement, templateStructure); - // Next create all missing elements (DOI/SDI/DAI) - const newElement = initializeElements(uninitializedTemplateStructure); - - if (newElement) { - const wizard = createDAIWizard(parentElement, newElement, this.element); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - } - - private openEditWizard(val: Element): void { - const wizard = wizards['DAI'].edit(this.element, val); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - private getValueDisplayString(val: Element): string { - const sGroup = val.getAttribute('sGroup'); - const prefix = sGroup ? `SG${sGroup}: ` : ''; - const value = val.textContent?.trim(); - - return `${prefix}${value}`; - } - - private renderVal(): TemplateResult[] { - const bType = this.element!.getAttribute('bType'); - const element = this.instanceElement ?? this.element; - const hasInstantiatedVal = !!this.instanceElement?.querySelector('Val'); - - return hasInstantiatedVal - ? getValueElements(element).map( - val => html`
-
-

${this.getValueDisplayString(val)}

-
-
- this.openEditWizard(val)} - > - -
-
` - ) - : [ - html`
-
-

-
-
- this.openCreateWizard()} - > - -
-
`, - ]; - } - - render(): TemplateResult { - const bType = this.element!.getAttribute('bType'); - - return html` - - - - this.dispatchEvent( - newWizardEvent( - createDaInfoWizard( - this.element, - this.instanceElement, - this.ancestors, - this.nsdoc - ) - ) - )} - > - - ${bType === 'Struct' - ? html` - this.requestUpdate()} - > - - ` - : html`${this.renderVal()}`} - ${this.toggleButton?.on && bType === 'Struct' - ? this.getBDAElements().map( - bdaElement => - html` - ` - ) - : nothing} - - `; - } - - static styles = css` - h4 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - margin: 0px; - padding-left: 0.3em; - word-break: break-word; - white-space: pre-wrap; - } - - mwc-icon-button { - color: var(--mdc-theme-on-surface); - } - `; -} diff --git a/packages/compas-open-scd/src/editors/ied/da-wizard.ts b/packages/compas-open-scd/src/editors/ied/da-wizard.ts deleted file mode 100644 index fb630be59..000000000 --- a/packages/compas-open-scd/src/editors/ied/da-wizard.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { html } from 'lit-element'; -import { TemplateResult } from 'lit-html'; -import { get, translate } from 'lit-translate'; - -import '@material/mwc-textarea'; -import '@material/mwc-textfield'; - -import { - getDescriptionAttribute, - getInstanceAttribute, - getNameAttribute, - Wizard, -} from '../../foundation.js'; -import { Nsdoc } from '../../foundation/nsdoc.js'; -import { - findDOTypeElement, - findElement, - findLogicaNodeElement, - getValueElements, -} from './foundation.js'; - -function getValues(element: Element): string { - const hasValue = getValueElements(element).length !== 0; - - return hasValue - ? `${getValueElements(element) - .map(val => val.textContent ?? '') - .join(', ')}` - : '-'; -} - -function renderFields( - element: Element, - instanceElement: Element | undefined, - ancestors: Element[], - nsdoc: Nsdoc -): TemplateResult[] { - const iedElement = findElement(ancestors, 'IED'); - const accessPointElement = findElement(ancestors, 'AccessPoint'); - const lDeviceElement = findElement(ancestors, 'LDevice'); - const logicalNodeElement = findLogicaNodeElement(ancestors); - const doElement = findElement(ancestors, 'DO'); - const doTypeElement = findDOTypeElement(doElement); - - return [ - html` - - - `, - html` - - - `, - html` - - - `, - html` - - - `, - html` - - - `, - html` - - - `, - html`
`, - html` - - - `, - html` - - - `, - html`
`, - html` - - - `, - html` - - - `, - html` - - - `, - html`
`, - html` - - - `, - html` - - - `, - html` - - - `, - ]; -} - -export function createDaInfoWizard( - element: Element, - instanceElement: Element | undefined, - ancestors: Element[], - nsdoc: Nsdoc -): Wizard { - return [ - { - title: get('iededitor.wizard.daTitle'), - content: [...renderFields(element, instanceElement, ancestors, nsdoc)], - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/ied/do-container.ts b/packages/compas-open-scd/src/editors/ied/do-container.ts deleted file mode 100644 index 511504cc0..000000000 --- a/packages/compas-open-scd/src/editors/ied/do-container.ts +++ /dev/null @@ -1,162 +0,0 @@ -import { - customElement, - html, - property, - query, - TemplateResult, -} from 'lit-element'; -import { nothing } from 'lit-html'; -import { translate } from 'lit-translate'; - -import '@material/mwc-icon-button-toggle'; -import { IconButtonToggle } from '@material/mwc-icon-button-toggle'; - -import '../../action-pane.js'; -import './da-container.js'; - -import { - getDescriptionAttribute, - getNameAttribute, - newWizardEvent, -} from '../../foundation.js'; -import { createDoInfoWizard } from './do-wizard.js'; -import { - Container, - findDOTypeElement, - getInstanceDAElement, -} from './foundation.js'; - -/** [[`IED`]] plugin subeditor for editing `DO` element. */ -@customElement('do-container') -export class DOContainer extends Container { - /** - * The optional DOI of this DO. - */ - @property({ attribute: false }) - instanceElement!: Element; - - @query('#toggleButton') toggleButton: IconButtonToggle | undefined; - - private header(): TemplateResult { - const name = getNameAttribute(this.element); - const desc = getDescriptionAttribute(this.element); - - if (this.instanceElement != null) { - return html`${name}${desc ? html` — ${desc}` : nothing}`; - } else { - return html`${name}${desc ? html` — ${desc}` : nothing}`; - } - } - - /** - * Get the nested SDO element(s). - * @returns The nested SDO element(s) of this DO container. - */ - private getDOElements(): Element[] { - const doType = findDOTypeElement(this.element); - if (doType != null) { - return Array.from(doType.querySelectorAll(':scope > SDO')); - } - return []; - } - - /** - * Get the nested (B)DA element(s). - * @returns The nested (B)DA element(s) of this DO container. - */ - private getDAElements(): Element[] { - const type = this.element.getAttribute('type') ?? undefined; - const doType = this.element - .closest('SCL')! - .querySelector(`:root > DataTypeTemplates > DOType[id="${type}"]`); - if (doType != null) { - return Array.from(doType!.querySelectorAll(':scope > DA')); - } - return []; - } - - /** - * Get the instance element (SDI) of a (S)DO element (if available) - * @param dO - The (S)DO object to search with. - * @returns The optional SDI element. - */ - private getInstanceDOElement(dO: Element): Element | null { - const sdoName = getNameAttribute(dO); - if (this.instanceElement) { - return this.instanceElement.querySelector( - `:scope > SDI[name="${sdoName}"]` - ); - } - return null; - } - - render(): TemplateResult { - const daElements = this.getDAElements(); - const doElements = this.getDOElements(); - - return html` - - - this.dispatchEvent( - newWizardEvent( - createDoInfoWizard( - this.element, - this.instanceElement, - this.ancestors, - this.nsdoc - ) - ) - )} - > - - ${daElements.length > 0 || doElements.length > 0 - ? html` - this.requestUpdate()} - > - ` - : nothing} - ${this.toggleButton?.on - ? daElements.map( - daElement => - html`` - ) - : nothing} - ${this.toggleButton?.on - ? doElements.map( - doElement => - html`` - ) - : nothing} - `; - } -} diff --git a/packages/compas-open-scd/src/editors/ied/do-wizard.ts b/packages/compas-open-scd/src/editors/ied/do-wizard.ts deleted file mode 100644 index 60292a92f..000000000 --- a/packages/compas-open-scd/src/editors/ied/do-wizard.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { html } from 'lit-element'; -import { TemplateResult } from 'lit-html'; -import { get, translate } from 'lit-translate'; - -import '@material/mwc-textarea'; -import '@material/mwc-textfield'; - -import { - getDescriptionAttribute, - getInstanceAttribute, - getNameAttribute, - newWizardEvent, - Wizard, -} from '../../foundation.js'; -import { Nsdoc } from '../../foundation/nsdoc.js'; -import { - findDOTypeElement, - findElement, - findLogicaNodeElement, -} from './foundation.js'; - -function renderFields( - element: Element, - instanceElement: Element | undefined, - ancestors: Element[], - nsdoc: Nsdoc -): TemplateResult[] { - const iedElement = findElement(ancestors, 'IED'); - const accessPointElement = findElement(ancestors, 'AccessPoint'); - const lDeviceElement = findElement(ancestors, 'LDevice'); - const logicalNodeElement = findLogicaNodeElement(ancestors); - const doTypeElement = findDOTypeElement(element); - - return [ - html` - - - `, - html` - - - `, - html` - - - `, - html` - - - `, - html`
`, - html` - - - `, - html` - - - `, - html` - - - `, - html`
`, - html` - - - `, - html` - - - `, - html` - - - `, - ]; -} - -export function createDoInfoWizard( - element: Element, - instanceElement: Element | undefined, - ancestors: Element[], - nsdoc: Nsdoc -): Wizard { - return [ - { - title: get('iededitor.wizard.doTitle'), - content: [...renderFields(element, instanceElement, ancestors, nsdoc)], - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/ied/element-path.ts b/packages/compas-open-scd/src/editors/ied/element-path.ts deleted file mode 100644 index 09c0bec96..000000000 --- a/packages/compas-open-scd/src/editors/ied/element-path.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - state, - TemplateResult, -} from 'lit-element'; -import { FullElementPathEvent } from './foundation.js'; - -@customElement('element-path') -export class ElementPath extends LitElement { - - @state() - elementNames: string[] = []; - - constructor() { - super(); - - const parentSection = this.closest('section'); - if (parentSection) { - parentSection.addEventListener('full-element-path', (event: FullElementPathEvent) => { - this.elementNames = event.detail.elementNames; - }); - } - } - - render(): TemplateResult { - return html` -

${this.elementNames.join(' / ')}

- `; - } - - static styles = css` - h3 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - margin: 0px; - line-height: 48px; - padding-left: 0.3em; - transition: background-color 150ms linear; - }`; -} diff --git a/packages/compas-open-scd/src/editors/ied/foundation.ts b/packages/compas-open-scd/src/editors/ied/foundation.ts deleted file mode 100644 index b88bff771..000000000 --- a/packages/compas-open-scd/src/editors/ied/foundation.ts +++ /dev/null @@ -1,150 +0,0 @@ -import { LitElement, property } from 'lit-element'; - -import { getInstanceAttribute, getNameAttribute } from '../../foundation.js'; -import { Nsdoc } from '../../foundation/nsdoc.js'; - -/** Base class for all containers inside the IED Editor. */ -export class Container extends LitElement { - @property() - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - @property({ attribute: false }) - element!: Element; - - @property() - nsdoc!: Nsdoc; - - @property() - ancestors: Element[] = []; - - constructor() { - super(); - - this.addEventListener('focus', event => { - event.stopPropagation(); - const pathOfAncestorNames = this.ancestors.map( - ancestor => getTitleForElementPath(ancestor)! - ); - pathOfAncestorNames.push(getTitleForElementPath(this.element)!); - - this.dispatchEvent(newFullElementPathEvent(pathOfAncestorNames)); - }); - - this.addEventListener('blur', () => { - this.dispatchEvent( - newFullElementPathEvent( - this.ancestors.map(ancestor => getTitleForElementPath(ancestor)!) - ) - ); - }); - } -} - -/** - * Search for an element with a passed tag-name in the list of ancestors passed. - * @param ancestors - The list of elements to search in for an LN or LN0 element. - * @param tagName - The Tag-name of the element to search for. - * @returns The found element with the tag-name or null if not found. - */ -export function findElement( - ancestors: Element[], - tagName: string -): Element | null { - return ancestors.find(element => element.tagName === tagName) ?? null; -} - -/** - * Search for the LN0 or LN element in the list of ancestors passed. - * @param ancestors - The list of elements to search in for an LN or LN0 element. - * @returns The LN0/LN Element found or null if not found. - */ -export function findLogicaNodeElement(ancestors: Element[]): Element | null { - let element = findElement(ancestors, 'LN0'); - if (!element) { - element = findElement(ancestors, 'LN'); - } - return element; -} - -/** - * With the passed DO Element retrieve the type attribute and search for the DOType in the DataType Templates section. - * @param element - The DO Element. - * @returns The DOType element found in the DataType Templates section or null if it not exists. - */ -export function findDOTypeElement(element: Element | null): Element | null { - if (element && element.hasAttribute('type')) { - const type = element.getAttribute('type'); - return element - .closest('SCL')! - .querySelector(`:root > DataTypeTemplates > DOType[id="${type}"]`); - } - return null; -} - -/** - * Get the instance element (SDI / DAI) of a DA element (if available) - * @param parentInstance - The parent instance if available to search in for other instance elements. - * @param da - The (B)DA object to search with. - * @returns The optional SDI / DAI element. - */ -export function getInstanceDAElement( - parentInstance: Element | null, - da: Element -): Element | null { - if (parentInstance) { - const daName = getNameAttribute(da); - const bType = da.getAttribute('bType'); - if (bType == 'Struct') { - return parentInstance.querySelector(`:scope > SDI[name="${daName}"]`); - } - return parentInstance.querySelector(`:scope > DAI[name="${daName}"]`); - } - return null; -} - -export function getTitleForElementPath(element: Element): string { - switch (element.tagName) { - case 'LN': - case 'LN0': { - return element.getAttribute('lnClass')!; - } - case 'LDevice': { - return (getNameAttribute(element) ?? getInstanceAttribute(element))!; - } - case 'Server': { - return 'Server'; - } - default: { - return element.getAttribute('name')!; - } - } -} - -/** @returns Array of 'Val' elements for a given parent data attribute */ -export function getValueElements(parent: Element): Element[] { - return Array.from(parent.querySelectorAll('Val')); -} - -export interface FullElementPathDetail { - elementNames: string[]; -} -export type FullElementPathEvent = CustomEvent; -export function newFullElementPathEvent( - elementNames: string[], - eventInitDict?: CustomEventInit -): FullElementPathEvent { - return new CustomEvent('full-element-path', { - bubbles: true, - composed: true, - ...eventInitDict, - detail: { elementNames, ...eventInitDict?.detail }, - }); -} - -declare global { - interface ElementEventMap { - ['full-element-path']: FullElementPathEvent; - } -} diff --git a/packages/compas-open-scd/src/editors/ied/ied-container.ts b/packages/compas-open-scd/src/editors/ied/ied-container.ts deleted file mode 100644 index 1131416fa..000000000 --- a/packages/compas-open-scd/src/editors/ied/ied-container.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { - css, - customElement, - html, - property, - TemplateResult, -} from 'lit-element'; -import { nothing } from 'lit-html'; -import { translate } from 'lit-translate'; - -import '../../action-pane.js'; -import './access-point-container.js'; - -import { wizards } from '../../wizards/wizard-library.js'; -import { Container } from './foundation.js'; -import { - getDescriptionAttribute, - getNameAttribute, - newActionEvent, - newWizardEvent, -} from '../../foundation.js'; -import { removeIEDWizard } from '../../wizards/ied.js'; -import { editServicesWizard } from '../../wizards/services.js'; - -/** [[`IED`]] plugin subeditor for editing `IED` element. */ -@customElement('ied-container') -export class IedContainer extends Container { - @property() - selectedLNClasses: string[] = []; - - private openEditWizard(): void { - const wizard = wizards['IED'].edit(this.element); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - private renderServicesIcon(): TemplateResult { - const services: Element | null = this.element.querySelector('Services'); - - if (!services) { - return html``; - } - - return html` - this.openSettingsWizard(services)} - > - `; - } - - private openSettingsWizard(services: Element): void { - const wizard = editServicesWizard(services); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - private removeIED(): void { - const wizard = removeIEDWizard(this.element); - if (wizard) { - this.dispatchEvent(newWizardEvent(() => wizard)); - } else { - // If no Wizard is needed, just remove the element. - this.dispatchEvent( - newActionEvent({ - old: { parent: this.element.parentElement!, element: this.element }, - }) - ); - } - } - - private header(): TemplateResult { - const name = getNameAttribute(this.element); - const desc = getDescriptionAttribute(this.element); - - return html`${name}${desc ? html` — ${desc}` : nothing}`; - } - - render(): TemplateResult { - return html` - developer_board - - this.removeIED()} - > - - - this.openEditWizard()} - > - - ${this.renderServicesIcon()} - ${Array.from(this.element.querySelectorAll(':scope > AccessPoint')).map( - ap => html`` - )} - `; - } - - static styles = css` - abbr { - text-decoration: none; - border-bottom: none; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/ied/ldevice-container.ts b/packages/compas-open-scd/src/editors/ied/ldevice-container.ts deleted file mode 100644 index e00756405..000000000 --- a/packages/compas-open-scd/src/editors/ied/ldevice-container.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { - css, - customElement, - html, - property, - PropertyValues, - query, - state, - TemplateResult, -} from 'lit-element'; -import { nothing } from 'lit-html'; -import { translate } from 'lit-translate'; - -import { IconButtonToggle } from '@material/mwc-icon-button-toggle'; - -import { - getDescriptionAttribute, - getInstanceAttribute, - getNameAttribute, -} from '../../foundation.js'; -import { logicalDeviceIcon } from '../../icons/ied-icons.js'; - -import '../../action-pane.js'; -import './ln-container.js'; - -import { Container } from './foundation.js'; - -/** [[`IED`]] plugin subeditor for editing `LDevice` element. */ -@customElement('ldevice-container') -export class LDeviceContainer extends Container { - @property() - selectedLNClasses: string[] = []; - - @query('#toggleButton') - toggleButton!: IconButtonToggle | undefined; - - private header(): TemplateResult { - const nameOrInst = - getNameAttribute(this.element) ?? getInstanceAttribute(this.element); - const desc = getDescriptionAttribute(this.element); - - return html`${nameOrInst}${desc ? html` — ${desc}` : nothing}`; - } - - protected firstUpdated(): void { - this.requestUpdate(); - } - - protected updated(_changedProperties: PropertyValues): void { - super.updated(_changedProperties); - - // When the LN Classes filter is updated, we also want to trigger rendering for the LN Elements. - if (_changedProperties.has('selectedLNClasses')) { - this.requestUpdate('lnElements'); - } - } - - @state() - private get lnElements(): Element[] { - return Array.from(this.element.querySelectorAll(':scope > LN,LN0')).filter( - element => { - const lnClass = element.getAttribute('lnClass') ?? ''; - return this.selectedLNClasses.includes(lnClass); - } - ); - } - - render(): TemplateResult { - const lnElements = this.lnElements; - - return html` - ${logicalDeviceIcon} - ${lnElements.length > 0 - ? html` - this.requestUpdate()} - > - ` - : nothing} -
- ${this.toggleButton?.on - ? lnElements.map( - ln => html` ` - ) - : nothing} -
-
`; - } - - static styles = css` - #lnContainer { - display: grid; - grid-gap: 12px; - box-sizing: border-box; - grid-template-columns: repeat(auto-fit, minmax(316px, auto)); - } - - @media (max-width: 387px) { - #lnContainer { - grid-template-columns: repeat(auto-fit, minmax(196px, auto)); - } - } - `; -} diff --git a/packages/compas-open-scd/src/editors/ied/ln-container.ts b/packages/compas-open-scd/src/editors/ied/ln-container.ts deleted file mode 100644 index 6a6b5feb4..000000000 --- a/packages/compas-open-scd/src/editors/ied/ln-container.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { customElement, html, query, TemplateResult } from 'lit-element'; -import { nothing } from 'lit-html'; -import { until } from 'lit-html/directives/until'; -import { translate } from 'lit-translate'; - -import { getInstanceAttribute, getNameAttribute } from '../../foundation.js'; -import { IconButtonToggle } from '@material/mwc-icon-button-toggle'; - -import '../../action-pane.js'; -import './do-container.js'; - -import { Container } from './foundation.js'; - -/** [[`IED`]] plugin subeditor for editing `LN` and `LN0` element. */ -@customElement('ln-container') -export class LNContainer extends Container { - @query('#toggleButton') - toggleButton!: IconButtonToggle | undefined; - - private header(): TemplateResult { - const prefix = this.element.getAttribute('prefix'); - const inst = getInstanceAttribute(this.element); - - const data = this.nsdoc.getDataDescription(this.element); - - return html`${prefix != null ? html`${prefix} — ` : nothing} - ${data.label} ${inst ? html` — ${inst}` : nothing}`; - } - - /** - * Get the DO child elements of this LN(0) section. - * @returns The DO child elements, or an empty array if none are found. - */ - private getDOElements(): Element[] { - const lnType = this.element.getAttribute('lnType') ?? undefined; - const lNodeType = this.element - .closest('SCL')! - .querySelector(`:root > DataTypeTemplates > LNodeType[id="${lnType}"]`); - if (lNodeType != null) { - return Array.from(lNodeType.querySelectorAll(':scope > DO')); - } - return []; - } - - /** - * Get the instance element (DOI) of a DO element (if available) - * @param dO - The DO object to use. - * @returns The optional DOI object. - */ - private getInstanceElement(dO: Element): Element | null { - const doName = getNameAttribute(dO); - return this.element.querySelector(`:scope > DOI[name="${doName}"]`); - } - - render(): TemplateResult { - const doElements = this.getDOElements(); - - return html` - ${doElements.length > 0 - ? html` - this.requestUpdate()} - > - ` - : nothing} - ${this.toggleButton?.on - ? doElements.map( - dO => html` ` - ) - : nothing} - `; - } -} diff --git a/packages/compas-open-scd/src/editors/ied/server-container.ts b/packages/compas-open-scd/src/editors/ied/server-container.ts deleted file mode 100644 index 5a53f4dd0..000000000 --- a/packages/compas-open-scd/src/editors/ied/server-container.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { - customElement, - html, - property, - PropertyValues, - state, - TemplateResult, -} from 'lit-element'; -import { nothing } from 'lit-html'; - -import '../../action-pane.js'; -import './ldevice-container.js'; -import { serverIcon } from '../../icons/ied-icons.js'; -import { getDescriptionAttribute } from '../../foundation.js'; -import { Container } from './foundation.js'; - -/** [[`IED`]] plugin subeditor for editing `Server` element. */ -@customElement('server-container') -export class ServerContainer extends Container { - @property() - selectedLNClasses: string[] = []; - - private header(): TemplateResult { - const desc = getDescriptionAttribute(this.element); - - return html`Server${desc ? html` — ${desc}` : nothing}`; - } - - protected updated(_changedProperties: PropertyValues): void { - super.updated(_changedProperties); - - // When the LN Classes filter is updated, we also want to trigger rendering for the LN Elements. - if (_changedProperties.has('selectedLNClasses')) { - this.requestUpdate('lDeviceElements'); - } - } - - @state() - private get lDeviceElements(): Element[] { - return Array.from(this.element.querySelectorAll(':scope > LDevice')).filter( - element => { - return ( - Array.from(element.querySelectorAll(':scope > LN,LN0')).filter( - element => { - const lnClass = element.getAttribute('lnClass') ?? ''; - return this.selectedLNClasses.includes(lnClass); - } - ).length > 0 - ); - } - ); - } - - render(): TemplateResult { - return html` - ${serverIcon} - ${this.lDeviceElements.map( - server => - html`` - )} - `; - } -} diff --git a/packages/compas-open-scd/src/editors/protocol104/base-container.ts b/packages/compas-open-scd/src/editors/protocol104/base-container.ts deleted file mode 100644 index 8570e60dc..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/base-container.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { LitElement, property } from 'lit-element'; - -export class Base104Container extends LitElement { - @property() - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/connectedap-editor.ts b/packages/compas-open-scd/src/editors/protocol104/connectedap-editor.ts deleted file mode 100644 index 9e1e03582..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/connectedap-editor.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { customElement, html, property, TemplateResult } from 'lit-element'; - -import '@material/mwc-fab'; - -import '../../action-icon.js'; -import { newActionEvent, newWizardEvent } from '../../foundation.js'; -import { editConnectedApWizard } from './wizards/connectedap.js'; -import { Base104Container } from './base-container.js'; - -/** [[`104`]] subeditor for a `ConnectedAP` element. */ -@customElement('connectedap-104-editor') -export class ConnectedAP104Editor extends Base104Container { - /** SCL element ConnectedAP */ - @property({ attribute: false }) - element!: Element; - - private openEditWizard(): void { - this.dispatchEvent( - newWizardEvent(() => - editConnectedApWizard( - this.element, - this.element.querySelectorAll('Address > P[type^="RG"]').length > 0 - ) - ) - ); - } - - remove(): void { - if (this.element) - this.dispatchEvent( - newActionEvent({ - old: { - parent: this.element.parentElement!, - element: this.element, - reference: this.element.nextSibling, - }, - }) - ); - } - - render(): TemplateResult { - return html` - - - `; - } -} diff --git a/packages/compas-open-scd/src/editors/protocol104/doi-container.ts b/packages/compas-open-scd/src/editors/protocol104/doi-container.ts deleted file mode 100644 index 730a348d6..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/doi-container.ts +++ /dev/null @@ -1,176 +0,0 @@ -import { - css, - customElement, - html, - property, - query, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; -import { nothing } from 'lit-html'; - -import { IconButtonToggle } from '@material/mwc-icon-button-toggle'; - -import '@material/mwc-icon'; -import '@material/mwc-icon-button'; -import '@material/mwc-icon-button-toggle'; -import '@material/mwc-list'; -import '@material/mwc-list/mwc-list-item'; - -import { newWizardEvent } from '../../foundation.js'; - -import '../../action-pane.js'; - -import { - get104DetailsLine, - getCdcValueFromDOIElement, - getFullPath, -} from './foundation/foundation.js'; -import { editAddressWizard } from './wizards/address.js'; -import { showDOIInfoWizard } from './wizards/doi.js'; -import { PROTOCOL_104_PRIVATE } from './foundation/private.js'; -import { Base104Container } from './base-container.js'; - -/** - * Container showing all the DAI Elements, related to the 104 Protocol, of the passed DOI Element in a list. - * The DAI Element can be edited by pressing the Edit button at the end of the line. - */ -@customElement('doi-104-container') -export class Doi104Container extends Base104Container { - @property() - element!: Element; - - @query('#toggleButton') - toggleButton!: IconButtonToggle | undefined; - - @property() - get daiElements(): Element[] { - return Array.from(this.element.querySelectorAll(`DAI`)) - .filter( - daiElement => - daiElement.querySelector( - `Private[type="${PROTOCOL_104_PRIVATE}"] > Address` - ) !== null - ) - .sort((dai1, dai2) => - getFullPath(dai1, 'DOI').localeCompare(getFullPath(dai2, 'DOI')) - ); - } - - private getAddressElements(daiElement: Element): Element[] { - return Array.from( - daiElement.querySelectorAll( - `Private[type="${PROTOCOL_104_PRIVATE}"] > Address` - ) - ).sort( - (addr1, addr2) => - (addr1.getAttribute('casdu') ?? '').localeCompare( - addr2.getAttribute('casdu') ?? '' - ) && - (addr1.getAttribute('ioa') ?? '').localeCompare( - addr2.getAttribute('ioa') ?? '' - ) - ); - } - - protected firstUpdated(): void { - this.requestUpdate(); - } - - private openEditAddressWizard( - daiElement: Element, - addressElement: Element - ): void { - const doiElement = daiElement.closest('DOI')!; - const iedElement = doiElement.closest('IED')!; - this.dispatchEvent( - newWizardEvent( - editAddressWizard(iedElement, doiElement, daiElement, addressElement) - ) - ); - } - - private openEditTiWizard(): void { - this.dispatchEvent(newWizardEvent(showDOIInfoWizard(this.element))); - } - - @property() - get header(): TemplateResult { - const fullPath = getFullPath(this.element, 'IED'); - const cdc = getCdcValueFromDOIElement(this.element); - - return html`${fullPath}${cdc ? html` (${cdc})` : nothing}`; - } - - private renderAddressList(daiElement: Element): TemplateResult { - const addresses = this.getAddressElements(daiElement); - return html`${addresses.map(addressElement => { - return html` - -   - ${get104DetailsLine(daiElement, addressElement)} - - - this.openEditAddressWizard(daiElement, addressElement)} - > - - - - `; - })}`; - } - - private renderDaiList(): TemplateResult { - const daiElements = this.daiElements; - return html`${daiElements.map(daiElement => { - return html` - - ${getFullPath(daiElement, 'DOI')} - - ${this.renderAddressList(daiElement)} - `; - })}`; - } - - render(): TemplateResult { - return html` - - - this.openEditTiWizard()} - > - - - this.requestUpdate()} - > - - - ${this.toggleButton?.on - ? html` ${this.renderDaiList()} ` - : nothing} - - `; - } - - static styles = css` - abbr { - text-decoration: none; - border-bottom: none; - } - - mwc-list-item { - --mdc-list-item-meta-size: 48px; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/foundation/actions.ts b/packages/compas-open-scd/src/editors/protocol104/foundation/actions.ts deleted file mode 100644 index 6fe77ed24..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/foundation/actions.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Create } from '../../../foundation.js'; -import { TiInformation } from './cdc.js'; - -/** - * Create a list of Create Actions using the parameters passed. First search for the DAI Elements - * that can be effected. Next create the action and add it to this list, also start the Edit - * Address Element wizard for all Address Elements created. - * - * @param lnElement - The LN Element. - * @param lnClonedElement - The Cloned LN Element, used to create new structure and determine which Create actions are needed. - * @param doElement - The DO Element. - * @param wizard - The Wizard to dispatch the Open Wizard event on. - * @param ti - The TI Value set on the new Address Elements. - * @param inverted - Indicates if the Engineer want to create inverted Address Elements, if applicable. - * @param tiInformation - Information about how to create the Address Elements for the passed TI. - * @returns A list of Create Action that will be added to the complex action. - */ -export function createActions( - lnElement: Element, - lnClonedElement: Element, - doElement: Element, - wizard: Element, - ti: string, - inverted: boolean, - tiInformation: TiInformation -): Create[] { - return tiInformation.create( - lnElement, - lnClonedElement, - doElement, - wizard, - ti, - tiInformation.daPaths, - // If the TI Allows inverted and the Engineer selected it, true will be passed. - tiInformation.inverted ? inverted : false - ); -} - -/** - * Create a list of Create Actions using the parameters passed. First search for the DAI Elements [name="Check"]. - * Next create the action and add it to this list, also start the Edit Address Element wizard for all Address Elements - * created. - * - * @param lnElement - The LN Element. - * @param lnClonedElement - The Cloned LN Element, used to create new structure and determine which Create actions are needed. - * @param doElement - The DO Element. - * @param wizard - The Wizard to dispatch the Open Wizard event on. - * @param ti - The TI Value set on the new Address Elements. - * @param tiInformation - Information about how to create the Address Elements for the passed TI. - * @returns A list of Create Action that will be added to the complex action. - */ -export function createCheckActions( - lnElement: Element, - lnClonedElement: Element, - doElement: Element, - wizard: Element, - ti: string, - tiInformation: TiInformation -): Create[] { - if (tiInformation.checkDaPaths && tiInformation.checkCreate) { - return tiInformation.checkCreate( - lnElement, - lnClonedElement, - doElement, - wizard, - ti, - tiInformation.checkDaPaths - ); - } - return []; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/foundation/cdc.ts b/packages/compas-open-scd/src/editors/protocol104/foundation/cdc.ts deleted file mode 100644 index bd39fa572..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/foundation/cdc.ts +++ /dev/null @@ -1,821 +0,0 @@ -import { - Create, - getNameAttribute, - newLogEvent, - newWizardEvent, -} from '../../../foundation.js'; - -import { - addPrefixAndNamespaceToDocument, - createPrivateAddress, - createPrivateElement, - getPrivateElement, -} from './private.js'; -import { - findElementInOriginalLNStructure, - getCdcValueFromDOElement, - getEnumOrds, - getTypeAttribute, - isEnumDataAttribute, -} from './foundation.js'; -import { editAddressWizard } from '../wizards/address.js'; -import { - determineUninitializedStructure, - initializeElements, -} from '../../../foundation/dai.js'; -import { get } from 'lit-translate'; - -/** - * List of supported Common Data Classes in the 104 protocol. - */ -export const supportedCdcTypes = [ - 'ACT', - 'APC', - 'ASG', - 'BAC', - 'BCR', - 'BSC', - 'CMV', - 'DPC', - 'DPS', - 'ENG', - 'INC', - 'ING', - 'INS', - 'ISC', - 'MV', - 'SEC', - 'SPC', - 'SPG', - 'SPS', -] as const; -export type SupportedCdcType = typeof supportedCdcTypes[number]; - -export type CreateFunction = ( - lnElement: Element, - lnClonedElement: Element, - doElement: Element, - wizard: Element, - ti: string, - daPaths: DaSelector[], - inverted: boolean -) => Create[]; -export type CreateCheckFunction = ( - lnElement: Element, - lnClonedElement: Element, - doElement: Element, - wizard: Element, - ti: string, - daPaths: DaSelector[] -) => Create[]; - -export interface DaSelector { - path: string[]; -} -export interface TiInformation { - daPaths: DaSelector[]; - create: CreateFunction; - checkDaPaths?: DaSelector[]; - checkCreate?: CreateCheckFunction; - inverted?: boolean; -} - -/** - * Record with configuration information on how to create Address elements for the 104 protocol. - * Per supported Common Data Class (CDC) two record sets can be configured, one for the monitoring part - * and one for the control part. - * Per set the key of the record will be the ti value, meaning the list of keys will be the supported - * ti values allowed for the CDC. - * For each supported ti value there is information on how to find the DAI Element to which to create - * the Address element(s). - */ -export const cdcProcessings: Record< - SupportedCdcType, - { - monitor: Record; - control: Record; - } -> = { - ACT: { - monitor: { - '30': { - daPaths: [ - { path: ['general'] }, - { path: ['phsA'] }, - { path: ['phsB'] }, - { path: ['phsC'] }, - { path: ['neut'] }, - ], - create: createAddressAction, - inverted: true, - }, - '39': { - daPaths: [{ path: ['general'] }], - create: createAddressAction, - }, - }, - control: {}, - }, - APC: { - monitor: { - '36': { - daPaths: [{ path: ['mxVal', 'f'] }], - create: createAddressAction, - }, - }, - control: { - '63': { - daPaths: [{ path: ['Oper', 'ctlVal', 'f'] }], - create: createAddressAction, - checkDaPaths: [{ path: ['Oper', 'Check'] }], - checkCreate: createCheckAddressAction, - }, - }, - }, - ASG: { - monitor: { - '63': { - daPaths: [{ path: ['setMag', 'f'] }], - create: createAddressAction, - }, - }, - control: {}, - }, - BAC: { - monitor: { - '36': { - daPaths: [{ path: ['mxVal', 'f'] }], - create: createAddressAction, - }, - }, - control: { - '60': { - daPaths: [{ path: ['Oper', 'ctlVal'] }], - create: createAddressAction, - checkDaPaths: [{ path: ['Oper', 'Check'] }], - checkCreate: createCheckAddressAction, - }, - }, - }, - BCR: { - monitor: { - '37': { - daPaths: [{ path: ['actVal'] }, { path: ['frVal'] }], - create: createAddressAction, - }, - }, - control: {}, - }, - BSC: { - monitor: { - '32': { - daPaths: [{ path: ['valWTr', 'posVal'] }], - create: createAddressAction, - }, - }, - control: { - '60': { - daPaths: [{ path: ['Oper', 'ctlVal'] }], - create: createAddressAction, - checkDaPaths: [{ path: ['Oper', 'Check'] }], - checkCreate: createCheckAddressAction, - }, - }, - }, - CMV: { - monitor: { - '35': { - daPaths: [{ path: ['mag', 'i'] }, { path: ['ang', 'i'] }], - create: createAddressAction, - }, - '36': { - daPaths: [{ path: ['mag', 'f'] }, { path: ['ang', 'f'] }], - create: createAddressAction, - }, - }, - control: {}, - }, - DPC: { - monitor: { - '31': { - daPaths: [{ path: ['stVal'] }], - create: createAddressAction, - }, - }, - control: { - '59': { - daPaths: [{ path: ['Oper', 'ctlVal'] }], - create: createAddressAction, - checkDaPaths: [{ path: ['Oper', 'Check'] }], - checkCreate: createCheckAddressAction, - }, - }, - }, - DPS: { - monitor: { - '31': { - daPaths: [{ path: ['stVal'] }], - create: createAddressAction, - }, - }, - control: {}, - }, - ENG: { - monitor: { - '58': { - daPaths: [{ path: ['setVal'] }], - create: createAddressWithExpectValueAction, - }, - '62': { - daPaths: [{ path: ['setVal'] }], - create: createAddressAction, - }, - }, - control: {}, - }, - INC: { - monitor: { - '35': { - daPaths: [{ path: ['stVal'] }], - create: createAddressAction, - }, - }, - control: { - '62': { - daPaths: [{ path: ['Oper', 'ctlVal'] }], - create: createAddressAction, - checkDaPaths: [{ path: ['Oper', 'Check'] }], - checkCreate: createCheckAddressAction, - }, - }, - }, - ING: { - monitor: { - '62': { - daPaths: [{ path: ['setVal'] }], - create: createAddressAction, - }, - }, - control: {}, - }, - INS: { - monitor: { - '30': { - daPaths: [{ path: ['stVal'] }], - create: createAddressAction, - inverted: true, - }, - '33': { - daPaths: [{ path: ['stVal'] }], - create: createAddressAction, - }, - '35': { - daPaths: [{ path: ['stVal'] }], - create: createAddressAction, - }, - }, - control: {}, - }, - ISC: { - monitor: { - '32': { - daPaths: [{ path: ['valWTr', 'posVal'] }], - create: createAddressAction, - }, - }, - control: { - '62': { - daPaths: [{ path: ['Oper', 'ctlVal'] }], - create: createAddressAction, - checkDaPaths: [{ path: ['Oper', 'Check'] }], - checkCreate: createCheckAddressAction, - }, - }, - }, - MV: { - monitor: { - '35': { - daPaths: [{ path: ['mag', 'i'] }], - create: createAddressAction, - }, - '36': { - daPaths: [{ path: ['mag', 'f'] }], - create: createAddressAction, - }, - }, - control: {}, - }, - SEC: { - monitor: { - '37': { - daPaths: [{ path: ['cnt'] }], - create: createAddressAction, - }, - }, - control: {}, - }, - SPC: { - monitor: { - '30': { - daPaths: [{ path: ['stVal'] }], - create: createAddressAction, - inverted: true, - }, - }, - control: { - '58': { - daPaths: [{ path: ['Oper', 'ctlVal'] }], - create: createAddressAction, - checkDaPaths: [{ path: ['Oper', 'Check'] }], - checkCreate: createCheckAddressAction, - }, - }, - }, - SPG: { - monitor: { - '58': { - daPaths: [{ path: ['setVal'] }], - create: createAddressAction, - }, - }, - control: {}, - }, - SPS: { - monitor: { - '30': { - daPaths: [{ path: ['stVal'] }], - create: createAddressAction, - inverted: true, - }, - }, - control: {}, - }, -}; - -/** - * Creates a new SCL Private element and add 104 Address element(s) below this. - * Set the attribute value of 'ti' to the passed ti value. - * - * @param lnElement - The LN(0) Element. - * @param lnClonedElement - The Cloned LN Element, used to create new structure and determine which Create actions are needed. - * @param doElement - The DO Element. - * @param wizard - Wizard Element to dispatch events on. - * @param ti - The value to be set on the attribute 'ti'. - * @param daPaths - The Array of DAI Elements to search or create and add the Private Element on. - * @param inverted - Indicates if extra Address Elements should be created with 'inverted=true'. - * @returns An array of Create Action that the wizard action will return. - */ -function createAddressAction( - lnElement: Element, - lnClonedElement: Element, - doElement: Element, - wizard: Element, - ti: string, - daPaths: DaSelector[], - inverted: boolean -): Create[] { - const actions: Create[] = []; - - const [initializeActions, daiElements] = findOrCreateDaiElements( - lnElement, - lnClonedElement, - doElement, - wizard, - daPaths - ); - if (initializeActions.length > 0) { - actions.push(...initializeActions); - } - - if (daiElements.length > 0) { - addPrefixAndNamespaceToDocument(lnElement.ownerDocument); - - daiElements.forEach(daiElement => { - const addressElements = createAddressElements( - daiElement.ownerDocument, - ti, - inverted - ); - actions.push(...createActionsForPrivate(daiElement, addressElements)); - }); - } - - startEditWizards(wizard, lnElement, lnClonedElement, doElement, actions); - return actions; -} - -/** - * Creates a new SCL Private element and add 104 Address element(s) below this. - * Set the attribute value of 'ti' to the passed ti value. - * - * @param lnElement - The LN(0) Element. - * @param lnClonedElement - The Cloned LN Element, used to create new structure and determine which Create actions are needed. - * @param doElement - The DO Element. - * @param wizard - Wizard Element to dispatch events on. - * @param ti - The value to be set on the attribute 'ti'. - * @param daPaths - The Array of DAI Elements to search or create and add the Private Element on. - * @param inverted - Indicates if extra Address Elements should be created with 'inverted=true'. - * @returns An array of Create Action that the wizard action will return. - */ -function createAddressWithExpectValueAction( - lnElement: Element, - lnClonedElement: Element, - doElement: Element, - wizard: Element, - ti: string, - daPaths: DaSelector[], - inverted: boolean -): Create[] { - const actions: Create[] = []; - - const [initializeActions, daiElements] = findOrCreateDaiElements( - lnElement, - lnClonedElement, - doElement, - wizard, - daPaths - ); - if (initializeActions.length > 0) { - actions.push(...initializeActions); - } - if (daiElements.length > 0) { - addPrefixAndNamespaceToDocument(lnElement.ownerDocument); - - const addressElements: Element[] = []; - daiElements.forEach(daiElement => { - if (isEnumDataAttribute(daiElement)) { - getEnumOrds(daiElement).forEach(ord => - addressElements.push( - ...createAddressElements( - daiElement.ownerDocument, - ti, - inverted, - ord - ) - ) - ); - } else { - addressElements.push( - ...createAddressElements(daiElement.ownerDocument, ti, inverted) - ); - } - - actions.push(...createActionsForPrivate(daiElement, addressElements)); - }); - } - - startEditWizards(wizard, lnElement, lnClonedElement, doElement, actions); - return actions; -} - -/** - * Create a new SCL Private element and add 104 Address element(s) below this. - * Set the attribute value of 'ti' to the passed ti value. - * - * @param lnElement - The LN(0) Element. - * @param lnClonedElement - The Cloned LN Element, used to create new structure and determine which Create actions are needed. - * @param doElement - The DO Element. - * @param wizard - Wizard Element to dispatch events on. - * @param ti - The value to be set on the attribute 'ti'. - * @param daPaths - The Array of DAI Elements to search or create and add the Private Element on. - * @returns An array of Create Action that the wizard action will return. - */ -function createCheckAddressAction( - lnElement: Element, - lnClonedElement: Element, - doElement: Element, - wizard: Element, - ti: string, - daPaths: DaSelector[] -): Create[] { - const actions: Create[] = []; - - const [initializeActions, daiElements] = findOrCreateDaiElements( - lnElement, - lnClonedElement, - doElement, - wizard, - daPaths - ); - if (initializeActions.length > 0) { - actions.push(...initializeActions); - } - if (daiElements.length > 0) { - addPrefixAndNamespaceToDocument(lnElement.ownerDocument); - - daiElements.forEach(daiElement => { - const address1Element = createPrivateAddress( - daiElement.ownerDocument, - ti - ); - address1Element.setAttribute('check', 'interlocking'); - - const address2Element = createPrivateAddress( - daiElement.ownerDocument, - ti - ); - address2Element.setAttribute('check', 'synchrocheck'); - - actions.push( - ...createActionsForPrivate(daiElement, [ - address1Element, - address2Element, - ]) - ); - }); - } - - startEditWizards(wizard, lnElement, lnClonedElement, doElement, actions); - return actions; -} - -/** - * Create or update the 104 Private Element, if the Private already exists, the new Address Elements are - * added, otherwise a new Private Element is created to which the Address Elements are added. - * The correct Create Action is returned. - * - * @param daiElement - The DAI Element which will hold the new or existing Private Element - * @param addressElements - The Address Elements to be created with Create Actions. - */ -export function createActionsForPrivate( - daiElement: Element, - addressElements: Element[] -): Create[] { - const actions: Create[] = []; - let privateElement = getPrivateElement(daiElement); - if (privateElement) { - addressElements.forEach(addressElement => { - actions.push({ - new: { parent: privateElement!, element: addressElement }, - }); - }); - } else { - privateElement = createPrivateElement(daiElement.ownerDocument); - privateElement.append(...addressElements); - - actions.push({ new: { parent: daiElement, element: privateElement } }); - } - return actions; -} - -/** - * Creates one or two Address Elements, depending on the value of inverted. - * - * @param document - The Owner Document used to create the new Address Element with. - * @param ti - The value to be set on the attribute 'ti'. - * @param inverted - Indicates if extra Address Elements should be created with 'inverted=true'. - * @param expectedValue - The optional value of the attribute 'expectedValue' if needed. - * @returns Array of one or two Address Elements created. - */ -export function createAddressElements( - document: Document, - ti: string, - inverted: boolean, - expectedValue?: string -): Element[] { - const addressElements: Element[] = []; - const addressElement = createPrivateAddress(document, ti); - if (expectedValue) { - addressElement.setAttribute('expectedValue', expectedValue); - } - addressElements.push(addressElement); - - if (inverted) { - const addressElement = createPrivateAddress(document, ti); - addressElement.setAttribute('inverted', 'true'); - if (expectedValue) { - addressElement.setAttribute('expectedValue', expectedValue); - } - addressElements.push(addressElement); - } - return addressElements; -} - -/** - * Use all Create Action to determine which Address Elements are created and start an Edit Address Wizard - * for every Address Element found. - * - * @param wizard - The current Wizard used to dispatch the new Wizards on. - * @param lnElement - The LN Element used to search for specific parent elements. - * @param lnClonedElement - The cloned LN Element to search for child elements. - * @param doElement - The DO Element for which the Address Elements where created. - * @param actions - The list of all the Create Actions. - */ -function startEditWizards( - wizard: Element, - lnElement: Element, - lnClonedElement: Element, - doElement: Element, - actions: Create[] -): void { - actions.forEach(createAction => { - // Loop over all Actions and collect all Address Elements in an Array. - const newElement = createAction.new.element; - let addressElements: Element[]; - if (newElement.tagName === 'Address') { - addressElements = [newElement]; - } else { - addressElements = Array.from(newElement.querySelectorAll('Address')); - } - const parentElement = createAction.new.parent; - const daiElement = parentElement.closest('DAI'); - if (daiElement) { - const iedElement = lnElement.closest('IED')!; - const doiElement = lnClonedElement.querySelector( - `:scope > DOI[name="${getNameAttribute(doElement)}"]` - )!; - - addressElements.forEach(addressElement => { - wizard.dispatchEvent( - newWizardEvent(() => - editAddressWizard( - iedElement, - doiElement, - daiElement, - addressElement - ) - ) - ); - }); - } - }); -} - -/** - * Use the DA Path configuration of a Common Data Class to search for all DO/BDA/DA Elements to create - * a structure for which DOI/SDI/DAI Elements should be created later. Null will be returned when an invalid - * Template Structure is described by the DA Path. - * - * @param doElement - The DO Element to start searching for DA/BDA Elements. - * @param daPath - The (B)DA Elements to find in the template structure. - * @returns List of Elements starting with the DO Element followed by one or more (B)DA Elements describing the structure. - */ -function createTemplateStructure( - doElement: Element, - daPath: DaSelector -): Element[] | null { - let templateStructure: Element[] | null = [doElement]; - - const doc = doElement.ownerDocument; - const doType = getTypeAttribute(doElement) ?? ''; - let typeElement = doc.querySelector(`DOType[id="${doType}"]`); - - daPath.path.forEach(name => { - // There should be a DOType or DAType set for the current element in the list. - if (!typeElement) { - templateStructure = null; - return; - } - const daElement = typeElement.querySelector( - `:scope > DA[name="${name}"], :scope > BDA[name="${name}"]` - ); - // If there is no DA/BDA Element found the structure is incorrect, so just stop. - if (daElement === null) { - templateStructure = null; - return; - } - templateStructure!.push(daElement); - - const bType = daElement.getAttribute('bType') ?? ''; - if (bType === 'Struct') { - const type = getTypeAttribute(daElement) ?? ''; - typeElement = doc.querySelector(`DAType[id="${type}"]`); - } else { - typeElement = null; - } - }); - return templateStructure; -} - -/** - * Search for existing DAI Elements below the DO Element matching the DA Paths passed or create the DAI Element - * if the DA Path doesn't exist yet. - * - * @param lnElement - The LN(0) Element. - * @param lnClonedElement - The Cloned LN Element, used to create new structure and determine which Create actions are needed. - * @param doElement - The DO Element. - * @param wizard - The current Wizard to dispatch Log Events, if needed. - * @param daPaths - The DA Structures for which the DAI Structure needs to be created below the DO Element. - */ -function findOrCreateDaiElements( - lnElement: Element, - lnClonedElement: Element, - doElement: Element, - wizard: Element, - daPaths: DaSelector[] -): [Create[], Element[]] { - const daiElements: Element[] = []; - const actions: Create[] = []; - - // Start searching and creating for each DA Path passed. - daPaths.forEach(daPath => { - const filter = createDaiFilter(doElement, daPath); - const foundDaiElements = lnClonedElement.querySelectorAll(filter); - if (foundDaiElements.length > 0) { - // Existing DAI Element found, so use that Element. - foundDaiElements.forEach(clonedDaiElement => { - const daiElement = findElementInOriginalLNStructure( - lnElement, - clonedDaiElement - ); - if (daiElement) { - daiElements.push(daiElement); - } else { - daiElements.push(clonedDaiElement); - } - }); - } else { - // DAI Element doesn't exist yet, so create the structure using the DA Path. - const templateStructure = createTemplateStructure(doElement, daPath); - if (templateStructure) { - const [parentClonedElement, uninitializedTemplateStructure] = - determineUninitializedStructure(lnClonedElement, templateStructure); - // Next create all missing elements (DOI/SDI/DOI) - const newElement = initializeElements(uninitializedTemplateStructure); - - // Always add it to the cloned LN Structure. - parentClonedElement.append(newElement); - - // Search if the parent already exists in the current LN Element Structure. - // If so we will add a new Create Action for it. - // If it is already there because one of the parents of the parent is used in a Create Action. - const parentElement = findElementInOriginalLNStructure( - lnElement, - parentClonedElement - ); - if (parentElement) { - actions.push({ new: { parent: parentElement, element: newElement } }); - } - - // Add new DAI Elements to the list to return. - if (newElement.tagName === 'DAI') { - daiElements.push(newElement); - } else { - const daiElement = newElement.querySelector('DAI')!; - daiElements.push(daiElement); - } - } else { - // The DA Path can't be mapped on the Template structure of the current document. - const cdc = getCdcValueFromDOElement(doElement) ?? ''; - const doType = getTypeAttribute(doElement) ?? ''; - wizard.dispatchEvent( - newLogEvent({ - kind: 'error', - title: get('protocol104.wizard.error.addAddressError', { - structure: daPath.path.join(' > '), - cdc, - doType, - }), - }) - ); - } - } - }); - return [actions, daiElements]; -} - -/** - * Use the DO Element and a DA Selector to create a CSS Query to search for a DAI Element - * below the LN Element. - * - * @param doElement - The DO Element for which to search a DOI Element. - * @param daPath - The DA Selector to create the query to find the SDI/DAI Elements. - */ -function createDaiFilter(doElement: Element, daPath: DaSelector): string { - const doName = getNameAttribute(doElement); - let filter = `:scope > DOI[name="${doName}"] > `; - daPath.path.forEach((value, index) => { - if (index < daPath.path.length - 1) { - filter = `${filter} SDI[name="${value}"] > `; - } else { - filter = `${filter} DAI[name="${value}"]`; - } - }); - return filter; -} - -/** - * Indicates if the combination cdc/ti should handle/process the attribute "unitMultiplier" of the Address Element. - * - * @param cdc - The Common Data Class. - * @param ti - The TI Value. - * @returns true, if the combination should handle/process the attribute "unitMultiplier". - */ -export function hasUnitMultiplierField(cdc: string, ti: string): boolean { - return ( - (cdc === 'MV' && ['35', '36'].includes(ti)) || - (cdc === 'INS' && ti === '35') - ); -} - -/** - * Indicates if the combination cdc/ti should handle/process the attributes "scaleMultiplier" and "scaleOffset" of - * the Address Element. - * - * @param cdc - The Common Data Class. - * @param ti - The TI Value. - * @returns true, if the combination should handle/process the attributes "scaleMultiplier" and "scaleOffset". - */ -export function hasScaleFields(cdc: string, ti: string): boolean { - return cdc === 'MV' && ['35', '36'].includes(ti); -} diff --git a/packages/compas-open-scd/src/editors/protocol104/foundation/foundation.ts b/packages/compas-open-scd/src/editors/protocol104/foundation/foundation.ts deleted file mode 100644 index b64c7a4da..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/foundation/foundation.ts +++ /dev/null @@ -1,515 +0,0 @@ -import { html, TemplateResult } from 'lit-element'; -import { ifDefined } from 'lit-html/directives/if-defined.js'; -import { translate } from 'lit-translate'; -import { getInstanceAttribute, getNameAttribute } from '../../../foundation.js'; -import { typeMaxLength } from '../../../wizards/foundation/p-types.js'; -import { typeDescriptiveNameKeys, typePattern } from './p-types.js'; - -/** - * Retrieve the full path as wanted for the IED Container in the 104 Plugin, meaning we go higher in the - * hierarchy until the parent found is the IED, this element is excluded, because the containers are group per - * IED. - * From all parent between the DAI and IED the name or likely attributes are used to define a unique name. - * - * @param element - The DAI Element for which the full path needs to be defined. - * @param topLevelTagName - Name of the Tag to stop at when travelling through the parents (excluding). - * @returns The full path shown to the user for a DAI Element. - */ -export function getFullPath(element: Element, topLevelTagName: string): string { - let currentElement: Element | null = element; - const paths: string[] = []; - - do { - let value: string | undefined; - switch (currentElement.tagName) { - case 'LN': - case 'LN0': { - const prefix = currentElement.getAttribute('prefix'); - const inst = getInstanceAttribute(currentElement); - value = `${prefix ? prefix + '-' : ''}${currentElement.getAttribute( - 'lnClass' - )}${inst ? '-' + inst : ''}`; - break; - } - case 'LDevice': { - value = - getNameAttribute(currentElement) ?? - getInstanceAttribute(currentElement); - break; - } - default: { - // Just add the name to the list - value = getNameAttribute(currentElement); - } - } - if (value) { - paths.unshift(value); - } - currentElement = currentElement.parentElement; - } while (currentElement && currentElement.tagName != topLevelTagName); - - return paths.join(' / '); -} - -/** - * Retrieve the CDC Value that belongs to a DAI Element, meaning, using the DOI/LN Elements to - * search for a DO Element, which is again used to find the DO/DOType Element. The DOType Element - * finally holds the attribute 'cdc'. - * - * @param doiElement - The DOI Element to start the search for the CDC Value. - * @returns The CDC Value from the DOType Element. - */ -export function getCdcValueFromDOIElement(doiElement: Element): string | null { - const lnElement = doiElement.closest('LN0, LN'); - if (lnElement) { - const lnType = lnElement.getAttribute('lnType'); - const doName = doiElement.getAttribute('name'); - - const doElement = doiElement.ownerDocument.querySelector( - `:root > DataTypeTemplates > LNodeType[id="${lnType}"] > DO[name="${doName}"]` - ); - if (doElement) { - return getCdcValueFromDOElement(doElement); - } - } - return null; -} - -export function getCdcValueFromDOElement(doElement: Element): string | null { - const doType = getTypeAttribute(doElement); - const doTypeElement = doElement.ownerDocument.querySelector( - `:root > DataTypeTemplates > DOType[id="${doType}"]` - ); - return doTypeElement ? doTypeElement.getAttribute('cdc') : null; -} - -/** - * All available Address attributes that can be displayed. - */ -const addressAttributes = [ - 'casdu', - 'ioa', - 'ti', - 'expectedValue', - 'unitMultiplier', - 'scaleMultiplier', - 'scaleOffset', - 'inverted', - 'check', -]; - -/** - * Create a string to display all information about a 104 Address element. - * A list of attributes is used to determine what can be displayed if available. - * - * @param daiElement - The DAI Element used if the attribute 'expectedValue' exists to retrieve the Enum Value. - * @param address - The Address element from which to retrieve all attribute values. - * @returns A string to display with all attribute values. - */ -export function get104DetailsLine( - daiElement: Element, - address: Element -): string { - return addressAttributes - .filter(attrName => address.hasAttribute(attrName)) - .map(attrName => { - const value = address.getAttribute(attrName)!; - if (attrName === 'expectedValue') { - const enumValue = getEnumVal(daiElement, value); - return `${attrName}: ${value}${enumValue ? ` (${enumValue})` : ``}`; - } else { - return `${attrName}: ${value}`; - } - }) - .join(', '); -} - -/** - * Extract the 'type' attribute from the given XML element. - * @param element - The element to extract instance from. - * @returns the value, or undefined if there is no instance. - */ -export function getTypeAttribute(element: Element): string | undefined { - const type = element.getAttribute('type'); - return type ? type : undefined; -} - -/** - * Search for a DAI Element below the passed DOI Element. - * - * @param doElement - The DO Element to search on. - * @param name - The name of the DA Element to search for. - * @returns The found DA Element or null, if not found. - */ -export function getDaElement(doElement: Element, name: string): Element | null { - const doType = getTypeAttribute(doElement); - if (doType) { - return doElement.ownerDocument.querySelector( - `:root > DataTypeTemplates > DOType[id="${doType}"] > DA[name="${name}"]` - ); - } - return null; -} - -/** - * Search for the Value of a DAI Element below the passed DOI Element. - * - * @param doElement - The DO Element to search on. - * @param name - The name of the DA Element to search for. - * @returns The value (Val) of the found DA Element or null, if not found. - */ -export function getDaValue(doElement: Element, name: string): string | null { - const daElement = getDaElement(doElement, name); - if (daElement) { - return daElement.querySelector(':scope > Val')?.textContent ?? null; - } - return null; -} - -/** - * Search for a DAI Element below the passed DOI Element. - * - * @param doiElement - The DOI Element to search on. - * @param name - The name of the DAI Element to search for. - * @returns The found DAI Element or null, if not found. - */ -export function getDaiElement( - doiElement: Element, - name: string -): Element | null { - return doiElement.querySelector(`:scope > DAI[name="${name}"]`); -} - -/** - * Search for the Value of a DAI Element below the passed DOI Element. - * - * @param doiElement - The DOI Element to search on. - * @param name - The name of the DAI Element to search for. - * @returns The value (Val) of the found DAI Element or null, if not found. - */ -export function getDaiValue(doiElement: Element, name: string): string | null { - const daiElement = getDaiElement(doiElement, name); - if (daiElement) { - return daiElement.querySelector(':scope > Val')?.textContent ?? null; - } - return null; -} - -export function getDoiElement( - lnElement: Element, - doName: string -): Element | null { - return lnElement.querySelector(`:scope > DOI[name="${doName}"]`); -} - -export function getDoElement( - lnElement: Element, - doName: string -): Element | null { - const lnType = lnElement.getAttribute('lnType'); - if (lnType) { - return lnElement.ownerDocument.querySelector( - `:root > DataTypeTemplates > LNodeType[id="${lnType}"] > DO[name="${doName}"]` - ); - } - return null; -} - -export function getDoElements(lnElement: Element): Element[] { - const lnType = lnElement.getAttribute('lnType'); - if (lnType) { - return Array.from( - lnElement.ownerDocument.querySelectorAll( - `:root > DataTypeTemplates > LNodeType[id="${lnType}"] > DO` - ) - ); - } - return []; -} - -/** - * Search for the DAI Element 'ctlModel', this one indicates if control Addresses need to be created. - * - * @param lnElement - The LN Element. - * @param doElement - The DO Element. - * @returns The value of the CtlModel. - */ -export function getCtlModel( - lnElement: Element, - doElement: Element -): string | null { - const doName = getNameAttribute(doElement); - if (doName) { - const doiElement = getDoiElement(lnElement, doName); - if (doiElement) { - return getDaiValue(doiElement, 'ctlModel'); - } else { - return getDaValue(doElement, 'ctlModel'); - } - } - return null; -} - -/** - * Create a Array of Elements from the DOI Element to the passed daiElement. - * This will contain of course the DOI Element, followed by zero or more SDI Elements - * and finally the DAI Element with which we started. - * - * @param daiElement - The DAI Element to start walking to the LN(0) Element through parents. - */ -function buildInstanceChain(daiElement: Element): Element[] { - const instanceElementChain: Element[] = [daiElement]; - let child = daiElement; - if (child.parentElement) { - // While the parent element exists and the parent that was processed isn't the LN(0) Element continue. - do { - child = child.parentElement; - instanceElementChain.unshift(child); - } while (child.tagName !== 'DOI' && child.parentElement); - } - return instanceElementChain; -} - -/** - * Use the initialed elements (DOI/SDI/DAI) to make the same chain containing the template elements like - * DO/SDO/DA/BDA. This way all needed configuration values can be retrieved from the templates. - * - * @param doc - The document which will be used to search different template elements. - * @param instanceChain - The chain created from the LN(0) to the DAI in the IED. - */ -function buildTemplateChainFromInstanceElements( - doc: Document, - instanceChain: Element[] -): Element[] { - const templateChain: Element[] = []; - let typeElement: Element | null; - instanceChain.forEach(element => { - if (element.tagName === 'DOI') { - // The LN Element will only be used as starting point to find the LNodeType. - const lnElement = element.closest('LN, LN0')!; - const typeId = lnElement.getAttribute('lnType') ?? ''; - typeElement = doc.querySelector( - `:root > DataTypeTemplates > LNodeType[id="${typeId}"]` - ); - - if (typeElement) { - // Next search for the DO Element below the LNodeType Element. - const name = element.getAttribute('name'); - const doElement = typeElement.querySelector( - `:scope > DO[name="${name}"]` - ); - if (doElement) { - templateChain.push(doElement); - - // For the next element search the DOType that is linked to the DO Element. - const typeId = getTypeAttribute(doElement) ?? ''; - typeElement = doc.querySelector( - `:root > DataTypeTemplates > DOType[id="${typeId}"]` - ); - } else { - typeElement = null; - } - } - } else if (['SDI', 'DAI'].includes(element.tagName)) { - if (typeElement) { - // Search for the DA Element below the DOType or DAType from the previous Element - const name = element.getAttribute('name'); - const daElement = typeElement?.querySelector( - `:scope > DA[name="${name}"], :scope > BDA[name="${name}"]` - ); - if (daElement) { - templateChain.push(daElement); - - if (daElement.getAttribute('bType') === 'Struct') { - // Only if the bType is a struct we need to search for the DAType for the next element. - const typeId = getTypeAttribute(element) ?? ''; - typeElement = doc.querySelector( - `:root > DataTypeTemplates > DAType[id="${typeId}"]` - ); - } else { - typeElement = null; - } - } else { - typeElement = null; - } - } - } - }); - return templateChain; -} - -/** - * Retrieve the DA or BDA Element that's linked to the DAI Element passed. - * - * @param daiElement - The DAI Element for which to search the linked DA Element. - */ -export function getDaElementByDaiElement( - daiElement: Element -): Element | undefined { - // First step is to create the list of instance elements - const instanceChain = buildInstanceChain(daiElement); - // Next step is to build the Template Chain from the instance elements - const templateChain = buildTemplateChainFromInstanceElements( - daiElement.ownerDocument, - instanceChain - ); - if (templateChain.length > 0) { - // The needed DA Element is the last Element from the Chain. - const daElement = templateChain.pop(); - if (['DA', 'BDA'].includes(daElement!.tagName)) { - return daElement; - } - } - return undefined; -} - -/** - * Check if the DA Element is of the bType 'Enum'. - * - * @param daElement - The DA Element for which to check. - */ -function isEnumType(daElement: Element | undefined) { - return daElement?.getAttribute('bType') === 'Enum' ?? false; -} - -/** - * Check if the DA Element that's linked to the DAI Element is of the bType 'Enum'. - * - * @param daiElement - The DAI Element for which to check. - */ -export function isEnumDataAttribute(daiElement: Element): boolean { - const daElement = getDaElementByDaiElement(daiElement); - return isEnumType(daElement); -} - -/** - * Retrieve the value of the Enum with passed 'ord' configured with the passed DAI Element. - * - * @param daiElement - The DAI Element that is configured as Enum Type. - * @param ord - The value of the attribute 'ord' to search the value of. - */ -export function getEnumVal(daiElement: Element, ord: string): string | null { - const daElement = getDaElementByDaiElement(daiElement); - if (isEnumType(daElement)) { - const enumType = getTypeAttribute(daElement!); - const enumVal = daiElement.ownerDocument.querySelector( - `:root > DataTypeTemplates > EnumType[id="${enumType}"] > EnumVal[ord="${ord}"]` - ); - if (enumVal) { - return enumVal.textContent; - } - } - return null; -} - -/** - * Retrieve all the 'ord' value the EnumType has configured with his values. - * - * @param daiElement - The DAI Element that is configured as Enum Type. - */ -export function getEnumOrds(daiElement: Element): string[] { - const ords: string[] = []; - const daElement = getDaElementByDaiElement(daiElement); - if (isEnumType(daElement)) { - const enumType = getTypeAttribute(daElement!); - const enumVals = daiElement.ownerDocument.querySelectorAll( - `:root > DataTypeTemplates > EnumType[id="${enumType}"] > EnumVal` - ); - Array.from(enumVals) - .filter(valElement => valElement.getAttribute('ord')) - .map(valElement => ords.push(valElement.getAttribute('ord')!)); - } - return ords; -} - -/** - * Search for the Element passed from the Cloned LN Structure in the original LN Structure. - * If that element exists in the original LN Structure it will be returned. - * If the cloned Element is a new Element 'null' will be returned. - * - * @param lnElement - The original LN Element with the existing Elements. - * @param clonedElement - The Element to search for in the existing structure using its key. - * @returns The original element found or null if it didn't exist before. - */ -export function findElementInOriginalLNStructure( - lnElement: Element, - clonedElement: Element -): Element | null { - if (['LN0', 'LN'].includes(clonedElement.tagName)) { - return lnElement; - } - - // First create a list of elements from the Cloned Element to the Cloned LN Element. - const clonedElements: Element[] = []; - let currentElement: Element | null | undefined = clonedElement; - while (currentElement && !['LN0', 'LN'].includes(currentElement.tagName)) { - clonedElements.unshift(currentElement!); - currentElement = currentElement?.parentElement; - } - - // Walk through the list of Cloned Elements and walk the original LN Structure. - let parentElement: Element | null = lnElement; - while (parentElement != null && clonedElements.length > 0) { - // Get the first Cloned Element from the list and search the element on the original structure - const childElement = clonedElements.shift(); - if (childElement) { - // Below the LN there are only DOI/SDI/DAI Elements we need to search for. - // The parent can be an LN, DOI or SDI Element. - const name = getNameAttribute(childElement); - parentElement = parentElement.querySelector( - `:scope > DOI[name="${name}"], :scope > SDI[name="${name}"], :scope > DAI[name="${name}"]` - ); - } else { - parentElement = null; - } - } - return parentElement; -} - -/** - * Create a wizard-textfield element for the wizards within the Network part of the 104 plugin. - * @param pType - The type of P a Text Field has to be created for. - * @returns - A Text Field created for a specific type for the Create wizard. - */ -export function createNetworkTextField( - pType: string, - maybeValue?: string -): TemplateResult { - return html``; -} - -/** - * Enumeration stating the active view of the 104 plugin. - */ -export enum View { - VALUES, - NETWORK, -} - -export const VIEW_EVENT_NAME = 'view-change-104-plugin'; - -// Objects needed to register and fire the change of a view within the Communication 104 Plugin -export interface ViewDetail { - view: View; -} -export type ViewEvent = CustomEvent; -export function newViewEvent(view: View): ViewEvent { - return new CustomEvent(VIEW_EVENT_NAME, { - bubbles: true, - composed: true, - detail: { view }, - }); -} - -declare global { - interface ElementEventMap { - [VIEW_EVENT_NAME]: ViewEvent; - } -} diff --git a/packages/compas-open-scd/src/editors/protocol104/foundation/p-types.ts b/packages/compas-open-scd/src/editors/protocol104/foundation/p-types.ts deleted file mode 100644 index 6537afd84..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/foundation/p-types.ts +++ /dev/null @@ -1,57 +0,0 @@ -export const pTypes104: string[] = [ - 'IP', - 'IP-SUBNET', - 'W-FACTOR', - 'K-FACTOR', - 'TIMEOUT-0', - 'TIMEOUT-1', - 'TIMEOUT-2', - 'TIMEOUT-3', -]; - -export const pTypesRedundancyGroup104: string[] = [ - 'W-FACTOR', - 'K-FACTOR', - 'TIMEOUT-0', - 'TIMEOUT-1', - 'TIMEOUT-2', - 'TIMEOUT-3', -]; - -export const pTypesLogicLink104: string[] = ['IP', 'IP-SUBNET']; - -const typeBase = { - IP: '([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])[.]([0-9]{1,2}|1[0-9]{2}|2[0-4][0-9]|25[0-5])', - factor: - '[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-3][0-2][0-7][0-6][0-7]', - timeout: '[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]', -}; - -/** Patterns from IEC 61850-80-1 for all `P` elements */ -export const typePattern: Partial> = { - IP: typeBase.IP, - 'IP-SUBNET': typeBase.IP, - 'W-FACTOR': typeBase.factor, - 'K-FACTOR': typeBase.factor, - 'TIMEOUT-0': typeBase.timeout, - 'TIMEOUT-1': typeBase.timeout, - 'TIMEOUT-2': typeBase.timeout, - 'TIMEOUT-3': typeBase.timeout, -}; - -export const stationTypeOptions: string[] = [ - 'controlling-station', - 'controlled-station', -]; - -export const typeDescriptiveNameKeys: Record = { - StationType: 'protocol104.network.connectedAp.wizard.stationTypeHelper', - IP: 'protocol104.network.connectedAp.wizard.ipHelper', - 'IP-SUBNET': 'protocol104.network.connectedAp.wizard.ipSubnetHelper', - 'W-FACTOR': 'protocol104.network.connectedAp.wizard.wFactorHelper', - 'K-FACTOR': 'protocol104.network.connectedAp.wizard.kFactorHelper', - 'TIMEOUT-0': 'protocol104.network.connectedAp.wizard.timeout0Helper', - 'TIMEOUT-1': 'protocol104.network.connectedAp.wizard.timeout1Helper', - 'TIMEOUT-2': 'protocol104.network.connectedAp.wizard.timeout2Helper', - 'TIMEOUT-3': 'protocol104.network.connectedAp.wizard.timeout3Helper', -}; diff --git a/packages/compas-open-scd/src/editors/protocol104/foundation/private.ts b/packages/compas-open-scd/src/editors/protocol104/foundation/private.ts deleted file mode 100644 index f0d8922f3..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/foundation/private.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { SCL_NAMESPACE } from '../../../schemas.js'; - -export const PROTOCOL_104_PRIVATE = 'IEC_60870_5_104'; -export const PROTOCOL_104_NS = - 'http://www.iec.ch/61850-80-1/2007/IEC_60870-5-104'; -export const PROTOCOL_104_PREFIX = 'IEC_60870_5_104'; - -/** - * Will add the namespace of the 104 Protocol to the Root Element of the Document (SCL) as prefix to - * be used with all 104 elements (Address). - * - * @param document - The Owner Document used to registered the namespace. - */ -export function addPrefixAndNamespaceToDocument(document: Document): void { - const rootElement = document.firstElementChild!; - if (!rootElement.hasAttribute('xmlns:' + PROTOCOL_104_PREFIX)) { - rootElement.setAttributeNS( - 'http://www.w3.org/2000/xmlns/', - 'xmlns:' + PROTOCOL_104_PREFIX, - PROTOCOL_104_NS - ); - } -} - -/** - * Get the SCL Private Element with the type set to the 104 Protocol. - * - * @param daiElement - The DAI Element to search for the 104 Private Element. - * @returns The found Private Element or null if not there. - */ -export function getPrivateElement(daiElement: Element): Element | null { - return daiElement.querySelector(`Private[type="${PROTOCOL_104_PRIVATE}"]`); -} - -/** - * Create an SCL Private Element with the type set to the 104 Protocol. - * - * @param document - The Owner Document used to create the new Private Element with. - * @returns The created Private Element, not yet added to the DAI Element. - */ -export function createPrivateElement(document: Document): Element { - const privateElement = document.createElementNS(SCL_NAMESPACE, 'Private'); - privateElement.setAttribute('type', PROTOCOL_104_PRIVATE); - return privateElement; -} - -/** - * Create a 104 Address element which can be added to the Private element. - * The attribute 'ti' will also be set to value passed. - * - * @param document - The Owner Document used to create the new Address Element with. - * @param ti - The value for the attribute 'ti'. - */ -export function createPrivateAddress(document: Document, ti: string): Element { - const addressElement = document.createElementNS(PROTOCOL_104_NS, 'Address'); - addressElement.setAttribute('ti', ti); - return addressElement; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/ied-container.ts b/packages/compas-open-scd/src/editors/protocol104/ied-container.ts deleted file mode 100644 index b3cc46307..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/ied-container.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { - css, - customElement, - html, - property, - query, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; -import { nothing } from 'lit-html'; - -import { IconButtonToggle } from '@material/mwc-icon-button-toggle'; - -import '@material/mwc-icon'; -import '@material/mwc-icon-button-toggle'; - -import { getDescriptionAttribute, getNameAttribute } from '../../foundation.js'; - -import '../../action-pane.js'; - -import { getFullPath } from './foundation/foundation.js'; - -import './doi-container.js'; -import { PROTOCOL_104_PRIVATE } from './foundation/private.js'; -import { Base104Container } from './base-container.js'; - -/** - * Container showing all the DOI Elements, related to the 104 Protocol, of the passed IED Element in a container. - */ -@customElement('ied-104-container') -export class Ied104Container extends Base104Container { - @property() - element!: Element; - - @query('#toggleButton') - toggleButton!: IconButtonToggle | undefined; - - @property() - get doiElements(): Element[] { - return Array.from(this.element.querySelectorAll(`DOI`)) - .filter( - doiElement => - doiElement.querySelector( - `DAI > Private[type="${PROTOCOL_104_PRIVATE}"] > Address` - ) !== null - ) - .sort((doi1, doi2) => - getFullPath(doi1, 'IED').localeCompare(getFullPath(doi2, 'IED')) - ); - } - - protected firstUpdated(): void { - this.requestUpdate(); - } - - @property() - get header(): TemplateResult { - const name = getNameAttribute(this.element); - const desc = getDescriptionAttribute(this.element); - - return html`${name}${desc ? html` — ${desc}` : nothing}`; - } - - private renderDoiList(): TemplateResult { - const dois = this.doiElements; - return html`${dois.map(doiElement => { - return html` - - - `; - })}`; - } - - render(): TemplateResult { - return html` - - developer_board - - this.requestUpdate()} - > - - - ${this.toggleButton?.on ? html`${this.renderDoiList()}` : nothing} - - `; - } - - static styles = css` - abbr { - text-decoration: none; - border-bottom: none; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/network-container.ts b/packages/compas-open-scd/src/editors/protocol104/network-container.ts deleted file mode 100644 index 5affdf537..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/network-container.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { get } from 'lit-translate'; -import { css, customElement, html, TemplateResult } from 'lit-element'; - -import './subnetwork-container.js'; -import { - compareNames, - createElement, - newActionEvent, - newWizardEvent, -} from '../../foundation.js'; -import { createSubNetworkWizard } from './wizards/subnetwork.js'; -import { Base104Container } from './base-container.js'; -import { getTypeAttribute } from './foundation/foundation.js'; - -@customElement('network-104-container') -export class Network104Container extends Base104Container { - private getSubNetworkElements(): Element[] { - return Array.from( - this.doc.querySelectorAll('Communication > SubNetwork') ?? [] - ) - .filter(network => getTypeAttribute(network) === '104') - .sort((a, b) => compareNames(a, b)); - } - - /** Opens a [[`WizardDialog`]] for creating a new `SubNetwork` element. */ - private openCreateSubNetworkWizard(): void { - const parent = this.doc.querySelector(':root > Communication'); - if (!parent) { - this.dispatchEvent( - newActionEvent({ - new: { - parent: this.doc.documentElement, - element: createElement(this.doc, 'Communication', {}), - }, - }) - ); - } - this.dispatchEvent(newWizardEvent(createSubNetworkWizard(parent!))); - } - - render(): TemplateResult { - return html` this.openCreateSubNetworkWizard()} - > -
- ${this.getSubNetworkElements().map( - subnetwork => - html`` - )} -
`; - } - - static styles = css` - :host { - width: 100vw; - } - - mwc-fab { - position: fixed; - bottom: 32px; - right: 32px; - } - - subnetwork-104-container { - margin: 8px 12px 16px; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/subnetwork-container.ts b/packages/compas-open-scd/src/editors/protocol104/subnetwork-container.ts deleted file mode 100644 index 32d422d9b..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/subnetwork-container.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { - css, - customElement, - html, - property, - TemplateResult, -} from 'lit-element'; - -import '@material/mwc-icon-button'; - -import './connectedap-editor.js'; -import { compareNames, newWizardEvent } from '../../foundation.js'; -import { translate } from 'lit-translate'; -import { createConnectedApWizard } from './wizards/connectedap.js'; -import { Base104Container } from './base-container.js'; -import { getTypeAttribute } from './foundation/foundation.js'; - -/** [[`104`]] subeditor for a `SubNetwork` element. */ -@customElement('subnetwork-104-container') -export class SubNetwork104Container extends Base104Container { - /** SCL element SubNetwork */ - @property({ attribute: false }) - element!: Element; - - get bitrate(): string | null { - const bitRate = this.element.querySelector('BitRate'); - if (bitRate === null) return null; - const bitRateValue = bitRate.textContent ?? ''; - const m = bitRate.getAttribute('multiplier'); - const unit = m === null ? 'b/s' : ' ' + m + 'b/s'; - return bitRateValue ? bitRateValue + unit : null; - } - - private openConnectedAPwizard(): void { - this.dispatchEvent(newWizardEvent(createConnectedApWizard(this.element))); - } - - private renderIedContainer(): TemplateResult[] { - return Array.from(this.element.querySelectorAll(':scope > ConnectedAP')) - .map(connAP => connAP.getAttribute('iedName')!) - .filter((v, i, a) => a.indexOf(v) === i) - .sort(compareNames) - .map( - iedName => html` - ${Array.from( - this.element.parentElement?.querySelectorAll( - `:scope > SubNetwork > ConnectedAP[iedName="${iedName}"]` - ) ?? [] - ).map( - connectedAP => - html`` - )} - ` - ); - } - - private subNetworkSpecs(): string { - const type = getTypeAttribute(this.element) ?? null; - - if (!type && !this.bitrate) return ''; - - return `(${type}${type && this.bitrate ? ` — ${this.bitrate}` : ``})`; - } - - private header(): string { - const desc = this.element.getAttribute('desc') ?? null; - const name = this.element.getAttribute('name') ?? undefined; - - return ` ${name} ${desc === null ? '' : `— ${desc}`} - ${this.subNetworkSpecs()}`; - } - - render(): TemplateResult { - return html` - - - -
${this.renderIedContainer()}
-
`; - } - - static styles = css` - #iedContainer { - display: grid; - box-sizing: border-box; - gap: 12px; - padding: 8px 12px 16px; - grid-template-columns: repeat(auto-fit, minmax(150px, auto)); - } - - #iedSection:not(:focus):not(:focus-within) .disabled { - display: none; - } - - #iedSection .disabled { - pointer-events: none; - opacity: 0.5; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/values-container.ts b/packages/compas-open-scd/src/editors/protocol104/values-container.ts deleted file mode 100644 index 346deaee1..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/values-container.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { - css, - customElement, - html, - property, - TemplateResult, -} from 'lit-element'; -import { get, translate } from 'lit-translate'; - -import { compareNames, newWizardEvent } from '../../foundation.js'; - -import './ied-container.js'; - -import { selectDoWizard } from './wizards/selectDo.js'; -import { PROTOCOL_104_PRIVATE } from './foundation/private.js'; -import { Base104Container } from './base-container.js'; - -/** - * Container that will render an 'ied-104-container' for every IED which contains DAI Elements related to the - * 104 Protocol. - */ -@customElement('values-104-container') -export class Values104Container extends Base104Container { - @property() - get iedElements(): Element[] { - return Array.from(this.doc.querySelectorAll('IED')) - .filter( - ied => - ied.querySelectorAll( - `DAI > Private[type="${PROTOCOL_104_PRIVATE}"] > Address` - ).length > 0 - ) - .sort((a, b) => compareNames(a, b)); - } - - /** Opens a [[`WizardDialog`]] for creating a new `Substation` element. */ - private openCreateAddressWizard(): void { - this.dispatchEvent(newWizardEvent(selectDoWizard(this.doc))); - } - - private renderAddButton(): TemplateResult { - return html`

- this.openCreateAddressWizard()} - > - -

`; - } - - render(): TemplateResult { - const ieds = this.iedElements; - if (ieds.length > 0) { - return html` - ${ieds.map(iedElement => { - return html``; - })} - ${this.renderAddButton()} - `; - } - return html`

- ${translate('protocol104.values.missing')} -

- ${this.renderAddButton()}`; - } - - static styles = css` - mwc-fab { - position: fixed; - bottom: 32px; - right: 32px; - } - - h1 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - margin: 0px; - line-height: 48px; - padding-left: 0.3em; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/wizards/address.ts b/packages/compas-open-scd/src/editors/protocol104/wizards/address.ts deleted file mode 100644 index 2b058e5ed..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/wizards/address.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { html, TemplateResult } from 'lit-element'; -import { get, translate } from 'lit-translate'; -import { live } from 'lit-html/directives/live'; - -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-select'; -import '@material/mwc-textarea'; - -import { - cloneElement, - EditorAction, - getNameAttribute, - getValue, - patterns, - Wizard, - WizardActor, - WizardInputElement, -} from '../../../foundation.js'; - -import '../../../wizard-textfield.js'; -import '../../../wizard-select.js'; - -import { - getCdcValueFromDOIElement, - getEnumVal, - getFullPath, -} from '../foundation/foundation.js'; -import { hasScaleFields, hasUnitMultiplierField } from '../foundation/cdc.js'; - -const allowedMultipliers = [ - 'm', - 'k', - 'M', - 'mu', - 'y', - 'z', - 'a', - 'f', - 'p', - 'n', - 'c', - 'd', - 'da', - 'h', - 'G', - 'T', - 'P', - 'E', - 'Z', - 'Y', -]; - -export function updateAddressValue( - doiElement: Element, - daiElement: Element, - addressElement: Element -): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const cdc = getCdcValueFromDOIElement(doiElement) ?? ''; - const ti = addressElement.getAttribute('ti') ?? ''; - - const casdu = getValue(inputs.find(i => i.label === 'casdu')!)!; - const ioa = getValue(inputs.find(i => i.label === 'ioa')!); - const unitMultiplier = hasUnitMultiplierField(cdc, ti) - ? getValue(inputs.find(i => i.label === 'unitMultiplier')!) - : null; - const scaleMultiplier = hasScaleFields(cdc, ti) - ? getValue(inputs.find(i => i.label === 'scaleMultiplier')!) - : null; - const scaleOffset = hasScaleFields(cdc, ti) - ? getValue(inputs.find(i => i.label === 'scaleOffset')!) - : null; - - if ( - casdu === addressElement.getAttribute('casdu') && - ioa === addressElement.getAttribute('ioa') && - unitMultiplier === addressElement.getAttribute('unitMultiplier') && - scaleMultiplier === addressElement.getAttribute('scaleMultiplier') && - scaleOffset === addressElement.getAttribute('scaleOffset') - ) { - return []; - } - - const newElement = cloneElement(addressElement, { - casdu, - ioa, - unitMultiplier, - scaleMultiplier, - scaleOffset, - }); - - return [ - { old: { element: addressElement! }, new: { element: newElement } }, - ]; - }; -} - -export function editAddressWizard( - iedElement: Element, - doiElement: Element, - daiElement: Element, - addressElement: Element -): Wizard { - function renderAddressWizard(): TemplateResult[] { - const cdc = getCdcValueFromDOIElement(doiElement) ?? ''; - const ti = addressElement.getAttribute('ti') ?? ''; - - // Add the basic fields to the list. - const fields: TemplateResult[] = [ - html` - `, - html` - `, - html` - `, - html` - `, - html` - `, - html` - `, - html` - `, - ]; - - if (hasUnitMultiplierField(cdc, ti)) { - fields.push(html` - ${allowedMultipliers.map( - multiplier => - html` - ${multiplier} - ` - )} - `); - } - - if (hasScaleFields(cdc, ti)) { - fields.push(html` - `); - - fields.push(html` - `); - } - - const expectedValue = addressElement.getAttribute('expectedValue'); - if (expectedValue) { - fields.push(html` - `); - fields.push(html` - `); - } - - if (addressElement.hasAttribute('inverted')) { - fields.push(html` - `); - } - - if (addressElement.hasAttribute('check')) { - fields.push(html` - `); - } - - return fields; - } - - return [ - { - title: get('protocol104.wizard.title.addressEdit'), - element: addressElement, - primary: { - icon: 'edit', - label: get('save'), - action: updateAddressValue(doiElement, daiElement, addressElement), - }, - content: renderAddressWizard(), - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/wizards/connectedap.ts b/packages/compas-open-scd/src/editors/protocol104/wizards/connectedap.ts deleted file mode 100644 index 15ad9c2fe..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/wizards/connectedap.ts +++ /dev/null @@ -1,403 +0,0 @@ -import { html, TemplateResult } from 'lit-element'; -import { get, translate } from 'lit-translate'; -import { ifDefined } from 'lit-html/directives/if-defined'; - -import '@material/mwc-checkbox'; -import '@material/mwc-switch'; -import '@material/mwc-formfield'; -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-list/mwc-check-list-item'; -import '@material/mwc-icon'; - -import { Checkbox } from '@material/mwc-checkbox'; -import { List } from '@material/mwc-list'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; -import { SingleSelectedEvent } from '@material/mwc-list/mwc-list-foundation'; - -import '../../../wizard-textfield.js'; -import '../../../filtered-list.js'; - -import { - pTypes104, - stationTypeOptions, - typeDescriptiveNameKeys, - typePattern, -} from '../foundation/p-types.js'; -import { - cloneElement, - compareNames, - ComplexAction, - createElement, - EditorAction, - getValue, - identity, - isPublic, - newSubWizardEvent, - newWizardEvent, - Wizard, - WizardActor, - WizardInputElement, - WizardMenuActor, -} from '../../../foundation.js'; -import { getTypeAttribute } from '../foundation/foundation.js'; -import { - createRedundancyGroupWizard, - editRedundancyGroupWizard, -} from './redundancygroup.js'; - -interface AccessPointDescription { - element: Element; - connected?: boolean; -} - -/** Sorts connected `AccessPoint`s to the bottom. */ -function compareAccessPointConnection( - a: AccessPointDescription, - b: AccessPointDescription -): number { - if (a.connected !== b.connected) return b.connected ? -1 : 1; - return 0; -} - -function createConnectedApAction(parent: Element): WizardActor { - return ( - _: WizardInputElement[], - __: Element, - list?: List | null - ): EditorAction[] => { - if (!list) return []; - - const identities = (list.selected).map(item => item.value); - - const actions = identities.map(identity => { - const [iedName, apName] = identity.split('>'); - - return { - new: { - parent, - element: createElement(parent.ownerDocument, 'ConnectedAP', { - iedName, - apName, - }), - }, - }; - }); - - return actions; - }; -} - -function existConnectedAp(accesspoint: Element): boolean { - const iedName = accesspoint.closest('IED')?.getAttribute('name'); - const apName = accesspoint.getAttribute('name'); - - const connAp = accesspoint.ownerDocument.querySelector( - `ConnectedAP[iedName="${iedName}"][apName="${apName}"]` - ); - - return (connAp && isPublic(connAp)) ?? false; -} - -/** @returns single page [[`Wizard`]] for creating SCL element ConnectedAP. */ -export function createConnectedApWizard(element: Element): Wizard { - const doc = element.ownerDocument; - - const accessPoints = Array.from(doc.querySelectorAll(':root > IED')) - .sort(compareNames) - .flatMap(ied => - Array.from(ied.querySelectorAll(':root > IED > AccessPoint')) - ) - .map(accesspoint => { - return { - element: accesspoint, - connected: existConnectedAp(accesspoint), - }; - }) - .sort(compareAccessPointConnection); - - return [ - { - title: get('wizard.title.add', { tagName: 'ConnectedAP' }), - primary: { - icon: 'save', - label: get('save'), - action: createConnectedApAction(element), - }, - content: [ - html` ${accessPoints.map(accesspoint => { - const id = identity(accesspoint.element); - - return html`${id}`; - })} - `, - ], - }, - ]; -} - -function isEqualAddress(oldAddress: Element, newAddress: Element): boolean { - return Array.from(oldAddress.querySelectorAll('Address > P')).every(pType => - newAddress - .querySelector(`Address > P[type="${getTypeAttribute(pType)}"]`) - ?.isEqualNode(pType) - ); -} - -function createAddressElement( - inputs: WizardInputElement[], - parent: Element, - typeRestriction: boolean -): Element { - const element = createElement(parent.ownerDocument, 'Address', {}); - - inputs - .filter(input => getValue(input) !== null) - .forEach(validInput => { - const type = validInput.label; - const child = createElement(parent.ownerDocument, 'P', { type }); - - if (typeRestriction) - child.setAttributeNS( - 'http://www.w3.org/2001/XMLSchema-instance', - 'xsi:type', - 'tP_' + type - ); - - child.textContent = getValue(validInput); - element.appendChild(child); - }); - - return element; -} - -/** @returns single page [[`Wizard`]] to edit SCL element ConnectedAP for the 104 plugin. */ -export function editConnectedApWizard( - parent: Element, - redundancy?: boolean -): Wizard { - const redundancyGroupNumbers = getRedundancyGroupNumbers(parent); - return [ - { - title: get('protocol104.network.connectedAp.wizard.title.edit'), - element: parent, - menuActions: redundancy - ? [ - { - icon: 'playlist_add', - label: get( - 'protocol104.network.connectedAp.wizard.addRedundancyGroup' - ), - action: openRedundancyGroupWizard(parent, redundancyGroupNumbers), - }, - ] - : undefined, - primary: { - icon: 'save', - label: get('save'), - action: editConnectedApAction(parent, redundancy), - }, - content: [ - html` - { - event.target!.dispatchEvent(newWizardEvent()); - event.target!.dispatchEvent( - newSubWizardEvent(() => - editConnectedApWizard(parent, !redundancy) - ) - ); - }} - > - - - ${createTypeRestrictionCheckbox(parent)} - P[type="StationType"]` - )?.innerHTML ?? null} - required - fixedMenuPosition - helper="${translate(typeDescriptiveNameKeys['StationType'])}" - > - ${stationTypeOptions.map( - option => - html`${option}` - )} - - ${redundancy - ? html`

- ${get( - 'protocol104.network.connectedAp.wizard.redundancyGroupTitle' - )} -

- { - e.target!.dispatchEvent( - newSubWizardEvent(() => - editRedundancyGroupWizard( - parent, - redundancyGroupNumbers[e.detail.index] - ) - ) - ); - }} - > - ${redundancyGroupNumbers.length != 0 - ? redundancyGroupNumbers.map( - number => - html`Redundancy Group ${number}` - ) - : html`

- ${get( - 'protocol104.network.connectedAp.wizard.noRedundancyGroupsAvailable' - )} -

`} -
` - : html`${pTypes104.map( - pType => html`${createEditTextField(parent, pType)}` - )}`} `, - ], - }, - ]; -} - -function editConnectedApAction( - parent: Element, - redundancy?: boolean -): WizardActor { - return (inputs: WizardInputElement[], wizard: Element): EditorAction[] => { - const typeRestriction: boolean = - (wizard.shadowRoot?.querySelector('#typeRestriction')) - ?.checked ?? false; - - const newAddress = createAddressElement(inputs, parent, typeRestriction); - const oldAddress = parent.querySelector('Address'); - - const complexAction: ComplexAction = { - actions: [], - title: get('connectedap.action.addaddress', { - iedName: parent.getAttribute('iedName') ?? '', - apName: parent.getAttribute('apName') ?? '', - }), - }; - // When we have a redundanct ConnectedAP, we are only interested in the StationType value. - // All redundancy group actions are done in those wizards itself. - if (redundancy) { - const stationTypeValue = getValue( - inputs.find(i => i.label === 'StationType')! - )!; - const originalElement = oldAddress?.querySelector( - 'P[type="StationType"]' - ); - - const elementClone = cloneElement(originalElement!, {}); - elementClone!.textContent = stationTypeValue; - - complexAction.actions.push({ - old: { - element: originalElement!, - }, - new: { - element: elementClone, - }, - }); - } else if (oldAddress !== null && !isEqualAddress(oldAddress, newAddress)) { - //address & child elements P are changed: cannot use replace editor action - complexAction.actions.push({ - old: { - parent, - element: oldAddress, - }, - }); - complexAction.actions.push({ - new: { - parent, - element: newAddress, - }, - }); - } else if (oldAddress === null) - complexAction.actions.push({ - new: { - parent: parent, - element: newAddress, - }, - }); - - return complexAction.actions.length ? [complexAction] : []; - }; -} - -function openRedundancyGroupWizard( - element: Element, - rGNumbers: number[] -): WizardMenuActor { - return (wizard: Element): void => { - wizard.dispatchEvent( - newSubWizardEvent(createRedundancyGroupWizard(element, rGNumbers)) - ); - }; -} - -/** - * Get all the current used Redundancy Group numbers. - * @param parent - The parent element of all the P elements. - * @returns An array with all the Redundancy Group numbers. - */ -function getRedundancyGroupNumbers(parent: Element): number[] { - const groupNumbers: number[] = []; - - parent.querySelectorAll(`Address > P[type^="RG"]`).forEach(p => { - const redundancyGroupPart = getTypeAttribute(p)?.split('-')[0]; - const number = Number(redundancyGroupPart?.substring(2)); - - if (!groupNumbers.includes(number)) groupNumbers.push(number); - }); - - return groupNumbers.sort(); -} - -/** - * Create a wizard-textfield element for the Edit wizard. - * @param parent - The parent element of the P to create. - * @param pType - The type of P a Text Field has to be created for. - * @returns - A Text Field created for a specific type for the Edit wizard. - */ -function createEditTextField(parent: Element, pType: string): TemplateResult { - return html` P[type="${pType}"]`) - ?.innerHTML ?? null} - >`; -} - -function createTypeRestrictionCheckbox(element: Element): TemplateResult { - return html` - `; -} - -function hasTypeRestriction(element: Element): boolean { - return Array.from(element.querySelectorAll('Address > P')) - .filter(p => isPublic(p)) - .some(pType => pType.getAttribute('xsi:type')); -} diff --git a/packages/compas-open-scd/src/editors/protocol104/wizards/createAddresses.ts b/packages/compas-open-scd/src/editors/protocol104/wizards/createAddresses.ts deleted file mode 100644 index 86aa81309..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/wizards/createAddresses.ts +++ /dev/null @@ -1,354 +0,0 @@ -import { get, translate } from 'lit-translate'; -import { html, TemplateResult } from 'lit-element'; - -import { Switch } from '@material/mwc-switch'; - -import '@material/mwc-formfield'; -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-switch'; - -import '../../../wizard-textfield.js'; -import '../../../WizardDivider.js'; - -import { - ComplexAction, - EditorAction, - getNameAttribute, - getValue, - newWizardEvent, - Wizard, - WizardActor, - WizardInputElement, -} from '../../../foundation.js'; - -import { - getCdcValueFromDOElement, - getCtlModel, - getFullPath, -} from '../foundation/foundation.js'; -import { - cdcProcessings, - SupportedCdcType, - TiInformation, -} from '../foundation/cdc.js'; -import { createActions, createCheckActions } from '../foundation/actions.js'; - -function getSwitchValue(wizard: Element, name: string): boolean { - const switchElement = wizard.shadowRoot?.querySelector( - `mwc-switch[id="${name}"` - ); - return switchElement?.checked ?? false; -} - -export function createAddressesAction( - lnElement: Element, - doElement: Element, - hasControlTis: boolean -): WizardActor { - return (inputs: WizardInputElement[], wizard: Element): EditorAction[] => { - // Close previous wizard (SelectDO) to prevent it from showing after saving. - wizard.dispatchEvent(newWizardEvent()); - - const cdc = getCdcValueFromDOElement(doElement) ?? ''; - const cdcProcessing = cdcProcessings[cdc]; - const complexAction: ComplexAction = { - actions: [], - title: get('protocol104.values.addedAddress', { - name: getNameAttribute(doElement) ?? 'Unknown', - lnName: getFullPath(lnElement, 'IED'), - }), - }; - - // Create a Deep Clone of the LN Element, to keep track on which structure is initialized. - const lnClonedElement = lnElement.cloneNode(true); - - // Create all Monitor Addresses - const selectedMonitorTi = - getValue(inputs.find(i => i.label === 'monitorTi')!) ?? ''; - const monitorInverted = getSwitchValue(wizard, 'monitorInverted'); - const tiInformation = cdcProcessing.monitor[selectedMonitorTi]; - if (tiInformation) { - complexAction.actions.push( - ...createActions( - lnElement, - lnClonedElement, - doElement, - wizard, - selectedMonitorTi, - monitorInverted, - tiInformation - ) - ); - } - - const monitorCheck = getSwitchValue(wizard, 'monitorCheck'); - if (monitorCheck) { - complexAction.actions.push( - ...createCheckActions( - lnElement, - lnClonedElement, - doElement, - wizard, - selectedMonitorTi, - tiInformation - ) - ); - } - - // Create all Control Addresses - if (hasControlTis) { - const ctlModel = getCtlModel(lnElement, doElement); - if (ctlModel !== null && ctlModel !== 'status-only') { - const selectedControlTi = - getValue(inputs.find(i => i.label === 'controlTi')!) ?? ''; - const controlInverted = getSwitchValue(wizard, 'controlInverted'); - - const tiInformation = cdcProcessing.control[selectedControlTi]; - if (tiInformation) { - complexAction.actions.push( - ...createActions( - lnElement, - lnClonedElement, - doElement, - wizard, - selectedControlTi, - controlInverted, - tiInformation - ) - ); - } - - const controlCheck = getSwitchValue(wizard, 'controlCheck'); - if (controlCheck) { - complexAction.actions.push( - ...createCheckActions( - lnElement, - lnClonedElement, - doElement, - wizard, - selectedControlTi, - tiInformation - ) - ); - } - } - } - - if (complexAction.actions.length > 0) { - return [complexAction]; - } - // There are no Address elements created for any DAI, close window. - wizard.dispatchEvent(newWizardEvent()); - return []; - }; -} - -export function disableCheckSwitch( - tiInfo: Record -): boolean { - let disableSwitch = true; - Object.values(tiInfo).forEach(tiInformation => { - if (tiInformation.checkDaPaths && tiInformation.checkCreate) { - disableSwitch = false; - } - }); - return disableSwitch; -} - -export function disableInvertedSwitch( - tiInfo: Record -): boolean { - let disableSwitch = true; - Object.values(tiInfo).forEach(tiInformation => { - if (tiInformation.inverted === true) { - disableSwitch = false; - } - }); - return disableSwitch; -} - -export function createAddressesWizard( - lnElement: Element, - doElement: Element -): Wizard { - const cdc = getCdcValueFromDOElement(doElement) ?? ''; - const cdcProcessing = cdcProcessings[cdc]; - - const monitorTis = Object.keys(cdcProcessing.monitor); - const controlTis = Object.keys(cdcProcessing.control); - - function renderCreateAddressesWizard(): TemplateResult[] { - const doName = getNameAttribute(doElement) ?? ''; - const iedElement = lnElement.closest('IED'); - const fullPath = getFullPath(lnElement, 'IED'); - - // Add the basic fields to the list. - const fields = [ - html` - `, - html` - `, - html` - `, - html` - `, - ]; - - if (monitorTis.length > 0) { - fields.push(html``); - if (monitorTis.length > 1) { - fields.push( - html` - ${monitorTis.map( - monitorTi => - html` - ${monitorTi} - ` - )} - ` - ); - } else { - fields.push( - html` - ` - ); - } - fields.push( - html` - - - ` - ); - fields.push( - html` - - - ` - ); - } - - if (controlTis.length > 0) { - fields.push(html` `); - - const ctlModel = getCtlModel(lnElement, doElement); - if (ctlModel !== null) { - fields.push(html` - `); - } - - if (ctlModel !== null && ctlModel !== 'status-only') { - if (controlTis.length > 1) { - fields.push( - html` - ${controlTis.map( - controlTi => - html` - ${controlTi} - ` - )} - ` - ); - } else { - fields.push( - html` - ` - ); - } - fields.push( - html` - - - ` - ); - fields.push( - html` - - - ` - ); - } - } - return fields; - } - - return [ - { - title: get('wizard.title.add', { tagName: 'Address' }), - primary: { - icon: 'add', - label: get('add'), - action: createAddressesAction( - lnElement, - doElement, - controlTis.length > 0 - ), - }, - content: renderCreateAddressesWizard(), - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/wizards/doi.ts b/packages/compas-open-scd/src/editors/protocol104/wizards/doi.ts deleted file mode 100644 index fafca3d11..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/wizards/doi.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { html, TemplateResult } from 'lit-element'; -import { get } from 'lit-translate'; - -import '@material/mwc-textarea'; - -import { - ComplexAction, - getNameAttribute, - newActionEvent, - newWizardEvent, - Wizard, - WizardMenuActor, -} from '../../../foundation.js'; - -import '../../../wizard-textfield.js'; - -import { - getCdcValueFromDOIElement, - getCtlModel, - getDoElement, - getFullPath, -} from '../foundation/foundation.js'; -import { cdcProcessings, SupportedCdcType } from '../foundation/cdc.js'; -import { PROTOCOL_104_PRIVATE } from '../foundation/private.js'; - -function renderTiOverview(foundTis: string[], label: string): TemplateResult { - if (foundTis.length > 0) { - return html` - `; - } - return html``; -} - -export function renderDOIWizard(doiElement: Element): TemplateResult[] { - const iedElement = doiElement.closest('IED'); - const fullpath = getFullPath(doiElement, 'IED'); - const cdc = getCdcValueFromDOIElement(doiElement); - - // Add the basic fields to the list. - const fields: TemplateResult[] = [ - html` - `, - html` - `, - html` - `, - ]; - - const lnElement = doiElement.closest('LN0, LN'); - const doName = getNameAttribute(doiElement); - if (lnElement && doName) { - const doElement = getDoElement(lnElement, doName); - if (doElement) { - const ctlModel = getCtlModel(lnElement, doElement); - if (ctlModel !== null) { - fields.push(html` - `); - } - } - } - - let monitorTis: string[] = []; - let controlTis: string[] = []; - const cdcProcessing = cdcProcessings[cdc]; - fields.push(html` - `); - if (cdcProcessing) { - monitorTis = Object.keys(cdcProcessing.monitor); - controlTis = Object.keys(cdcProcessing.control); - } - - let foundTis = Array.from( - doiElement.querySelectorAll( - `DAI > Private[type="${PROTOCOL_104_PRIVATE}"] > Address` - ) - ) - .filter(element => element.getAttribute('ti') !== '') - .map(element => element.getAttribute('ti')!); - // Remove duplicates from the array. - foundTis = [...new Set(foundTis)]; - - const foundMonitorTis = foundTis.filter(ti => monitorTis.includes(ti)); - const foundControlTis = foundTis.filter(ti => controlTis.includes(ti)); - const otherTis = foundTis - .filter(ti => !foundMonitorTis.includes(ti)) - .filter(ti => !foundControlTis.includes(ti)); - - fields.push(renderTiOverview(monitorTis, 'Available Monitor TIs')); - fields.push(renderTiOverview(foundMonitorTis, 'Found Monitor TIs')); - fields.push(renderTiOverview(controlTis, 'Available Control TIs')); - fields.push(renderTiOverview(foundControlTis, 'Found Control TIs')); - fields.push(renderTiOverview(otherTis, 'Other TIs')); - return fields; -} - -export function remove104Private(doiElement: Element): WizardMenuActor { - return (wizard: Element): void => { - // The 104 Private Element only contains Address Elements, so we can remove all the 104 Private Elements - // to remove all the Address Elements also. - const privateElements = doiElement.querySelectorAll( - `DAI > Private[type="${PROTOCOL_104_PRIVATE}"] > Address` - ); - if (privateElements.length > 0) { - const complexAction: ComplexAction = { - actions: [], - title: get('protocol104.values.removedAddresses', { - name: getFullPath(doiElement, 'SCL'), - nrOfAddresses: privateElements.length, - }), - }; - privateElements.forEach(privateElement => { - complexAction.actions.push({ - old: { - parent: privateElement.parentElement!, - element: privateElement, - }, - }); - }); - - wizard.dispatchEvent(newActionEvent(complexAction)); - wizard.dispatchEvent(newWizardEvent()); - } - }; -} - -export function showDOIInfoWizard(doiElement: Element): Wizard { - return [ - { - title: get('protocol104.wizard.title.doiInfo'), - menuActions: [ - { - label: get('protocol104.values.removeAddresses'), - icon: 'delete', - action: remove104Private(doiElement), - }, - ], - content: renderDOIWizard(doiElement), - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/wizards/logiclink.ts b/packages/compas-open-scd/src/editors/protocol104/wizards/logiclink.ts deleted file mode 100644 index b563e8357..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/wizards/logiclink.ts +++ /dev/null @@ -1,194 +0,0 @@ -import { html } from 'lit-element'; -import { get } from 'lit-translate'; - -import '../../../wizard-textfield.js'; -import { - pTypesLogicLink104 -} from '../foundation/p-types.js'; -import { - cloneElement, - ComplexAction, - createElement, - EditorAction, - getValue, - newActionEvent, - newWizardEvent, - SimpleAction, - Wizard, - WizardActor, - WizardInputElement, - WizardMenuActor -} from '../../../foundation.js'; -import { createNetworkTextField } from '../foundation/foundation.js'; - -export function editLogicLinkWizard(parent: Element, rGNumber: number, lLNumber: number): Wizard { - return [ - { - title: get('protocol104.network.logicLink.wizard.title.edit'), - menuActions: [ - { - icon: 'delete', - label: get('remove'), - action: remove(parent, rGNumber, lLNumber), - }, - ], - primary: { - icon: 'save', - label: get('save'), - action: editLogicLinkAction(parent, rGNumber, lLNumber), - }, - content: [ - html` - ${pTypesLogicLink104.map( - pType => html`${createNetworkTextField(pType, parent.querySelector( - `Address > P[type$="RG${rGNumber}-LL${lLNumber}-${pType}"]` - )?.innerHTML)}` - )}` - ], - }, - ]; -} - -export function createLogicLinkWizard(parent: Element, rGNumber: number, occupiedLLNumbers: number[]): Wizard { - // Calculate the first available number for the Logic Link group. - let lLNumber = 1; - while (occupiedLLNumbers.find(n => n == lLNumber)) { - lLNumber++; - } - - return [ - { - title: get('protocol104.network.logicLink.wizard.title.add'), - primary: { - icon: '', - label: get('save'), - action: addLogicLinkAction(parent, rGNumber, lLNumber), - }, - content: [ - html` - ${pTypesLogicLink104.map( - pType => html`${createNetworkTextField(pType)}` - )}` - ], - }, - ]; -} - -/** - * Remove all P elements belonging to a single Logic Link group. - * @param parent - The parent element of the P elements to remove. - * @param rGNumber - The Redundancy Group number of all the P elements to remove. - * @param lLNumber - The Logic Link Group number of all the P elements to remove. - * @returns - Removing all P elements belonging to a Logic Link group. - */ -function remove(parent: Element, rGNumber: number, lLNumber: number): WizardMenuActor { - return (wizard: Element): void => { - const addressElement = parent.querySelector('Address'); - - const complexAction: ComplexAction = { - actions: [], - title: get('protocol104.network.logicLink.wizard.removedLogicLink', { - subNetworkName: parent.parentElement!.getAttribute('name')!, - apName: parent.getAttribute('apName')!, - iedName: parent.getAttribute('iedName')! - }), - }; - - addressElement!.querySelectorAll(`P[type^="RG${rGNumber}-LL${lLNumber}-"]`).forEach(p => { - complexAction.actions.push({ - old: { - parent: addressElement!, - element: p! - } - }); - }); - - wizard.dispatchEvent(newActionEvent(complexAction)); - wizard.dispatchEvent(newWizardEvent()); - }; -} - -function editLogicLinkAction(parent: Element, rGNumber: number, lLNumber: number): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const actions: SimpleAction[] = []; - - pTypesLogicLink104.forEach(type => { - const inputValue = getValue(inputs.find(i => i.label === type)!)!; - const elementOriginal = parent.querySelector(`Address > P[type="RG${rGNumber}-LL${lLNumber}-${type}"]`); - - if (elementOriginal == null) { - const element = createElement(parent.ownerDocument, 'P', { - type: `RG${rGNumber}-LL${lLNumber}-${type}` - }); - element.textContent = getValue(inputs.find(i => i.label === type)!)!; - - actions.push({ - new: { - parent: parent.querySelector('Address')!, - element: element, - } - }); - } else if (inputValue !== elementOriginal?.textContent) { - const elementClone = cloneElement(elementOriginal!, {}); - elementClone.textContent = inputValue; - - actions.push({ - old: { - element: elementOriginal! - }, - new: { - element: elementClone - } - }); - } - }); - - return actions.length != 0 - ? [{ - actions, - title: get('protocol104.network.logicLink.wizard.editedLogicLink', { - subNetworkName: parent.parentElement!.getAttribute('name')!, - apName: parent.getAttribute('apName')!, - iedName: parent.getAttribute('iedName')! - }), - }] - : []; - }; -} - -function addLogicLinkAction(parent: Element, rGNumber: number, lLNumber: number): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const complexAction: ComplexAction = { - actions: [], - title: get('protocol104.network.logicLink.wizard.addedLogicLink', { - subNetworkName: parent.parentElement!.getAttribute('name')!, - apName: parent.getAttribute('apName')!, - iedName: parent.getAttribute('iedName')! - }), - }; - - pTypesLogicLink104.forEach(type => { - const element = createElement(parent.ownerDocument, 'P', { - type: `RG${rGNumber}-LL${lLNumber}-${type}` - }); - element.textContent = getValue(inputs.find(i => i.label === type)!)!; - - complexAction.actions.push({ - new: { - parent: parent.querySelector('Address')!, - element: element, - } - }); - }); - - return [complexAction]; - }; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/wizards/redundancygroup.ts b/packages/compas-open-scd/src/editors/protocol104/wizards/redundancygroup.ts deleted file mode 100644 index a6ab563b6..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/wizards/redundancygroup.ts +++ /dev/null @@ -1,295 +0,0 @@ -import { html } from 'lit-element'; -import { get } from 'lit-translate'; - -import '../../../wizard-textfield.js'; -import { pTypesRedundancyGroup104 } from '../foundation/p-types.js'; -import { - cloneElement, - ComplexAction, - createElement, - EditorAction, - getValue, - newActionEvent, - newSubWizardEvent, - newWizardEvent, - SimpleAction, - Wizard, - WizardActor, - WizardInputElement, - WizardMenuActor, -} from '../../../foundation.js'; -import { SingleSelectedEvent } from '@material/mwc-list/mwc-list-foundation'; -import { createLogicLinkWizard, editLogicLinkWizard } from './logiclink.js'; -import { - createNetworkTextField, - getTypeAttribute, -} from '../foundation/foundation.js'; - -export function editRedundancyGroupWizard( - parent: Element, - rGNumber: number -): Wizard { - const usedLLNumbers = getLogicLinkNumbers(parent, rGNumber); - return [ - { - title: get('protocol104.network.redundancyGroup.wizard.title.edit'), - menuActions: [ - { - icon: 'playlist_add', - label: get('protocol104.network.redundancyGroup.wizard.addLogicLink'), - action: (wizard: Element): void => { - wizard.dispatchEvent( - newSubWizardEvent( - createLogicLinkWizard(parent, rGNumber, usedLLNumbers) - ) - ); - }, - }, - { - icon: 'delete', - label: get('remove'), - action: remove(parent, rGNumber), - }, - ], - primary: { - icon: 'save', - label: get('save'), - action: editRedundancyGroupAction(parent, rGNumber), - }, - content: [ - html` - ${pTypesRedundancyGroup104.map( - pType => - html`${createNetworkTextField( - pType, - parent.querySelector( - `Address > P[type$="RG${rGNumber}-${pType}"]` - )?.innerHTML - )}` - )} -

- ${get( - 'protocol104.network.redundancyGroup.wizard.logicLinkGroupTitle' - )} -

- { - e.target!.dispatchEvent( - newSubWizardEvent(() => - editLogicLinkWizard( - parent, - rGNumber, - usedLLNumbers[e.detail.index] - ) - ) - ); - }} - > - ${usedLLNumbers.length != 0 - ? usedLLNumbers.map( - number => - html`Logic Link ${number}` - ) - : html`

- ${get( - 'protocol104.network.redundancyGroup.wizard.noLogicLinksAvailable' - )} -

`} -
`, - ], - }, - ]; -} - -export function createRedundancyGroupWizard( - parent: Element, - occupiedRGNumbers: number[] -): Wizard { - // Calculate the first available number for the Logic Link group. - let rGNumber = 1; - while (occupiedRGNumbers.find(n => n == rGNumber)) { - rGNumber++; - } - - return [ - { - title: get('protocol104.network.redundancyGroup.wizard.title.add'), - primary: { - icon: '', - label: get('save'), - action: addRedundancyGroupAction(parent, rGNumber), - }, - content: [ - html` - ${pTypesRedundancyGroup104.map( - pType => html`${createNetworkTextField(pType)}` - )}`, - ], - }, - ]; -} - -/** - * Remove all P elements belonging to a single Redundancy Group. - * @param parent - The parent element of the P elements to remove. - * @param rGNumber - The Redundancy Group number of all the P elements to remove. - * @returns - Removing all P elements belonging to a Redundancy Group. - */ -function remove(parent: Element, rGNumber: number): WizardMenuActor { - return (wizard: Element): void => { - const addressElement = parent.querySelector('Address'); - - const complexAction: ComplexAction = { - actions: [], - title: get( - 'protocol104.network.redundancyGroup.wizard.removedRedundancyGroup', - { - rGNumber, - subNetworkName: parent.parentElement!.getAttribute('name')!, - apName: parent.getAttribute('apName')!, - iedName: parent.getAttribute('iedName')!, - } - ), - }; - - addressElement!.querySelectorAll(`P[type^="RG${rGNumber}-"]`).forEach(p => { - complexAction.actions.push({ - old: { - parent: addressElement!, - element: p!, - }, - }); - }); - - wizard.dispatchEvent(newActionEvent(complexAction)); - wizard.dispatchEvent(newWizardEvent()); - }; -} - -function editRedundancyGroupAction( - parent: Element, - rGNumber: number -): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const actions: SimpleAction[] = []; - - pTypesRedundancyGroup104.forEach(type => { - const inputValue = getValue(inputs.find(i => i.label === type)!)!; - const elementOriginal = parent.querySelector( - `Address > P[type="RG${rGNumber}-${type}"]` - ); - - if (elementOriginal == null) { - const pElement = createElement(parent.ownerDocument, 'P', { - type: `RG${rGNumber}-${type}`, - }); - pElement.textContent = inputValue; - - actions.push({ - new: { - parent: parent.querySelector('Address')!, - element: pElement, - }, - }); - } else if (inputValue !== elementOriginal?.textContent) { - const elementClone = cloneElement(elementOriginal!, {}); - elementClone.textContent = inputValue; - - actions.push({ - old: { - element: elementOriginal!, - }, - new: { - element: elementClone, - }, - }); - } - }); - - return actions.length != 0 - ? [ - { - actions, - title: get( - 'protocol104.network.redundancyGroup.wizard.editedRedundancyGroup', - { - rGNumber, - subNetworkName: parent.parentElement!.getAttribute('name')!, - apName: parent.getAttribute('apName')!, - iedName: parent.getAttribute('iedName')!, - } - ), - }, - ] - : []; - }; -} - -function addRedundancyGroupAction( - parent: Element, - rGNumber: number -): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const complexAction: ComplexAction = { - actions: [], - title: get( - 'protocol104.network.redundancyGroup.wizard.addedLRedundancyGroup', - { - rGNumber, - subNetworkName: parent.parentElement!.getAttribute('name')!, - apName: parent.getAttribute('apName')!, - iedName: parent.getAttribute('iedName')!, - } - ), - }; - - pTypesRedundancyGroup104.forEach(type => { - const pElement = createElement(parent.ownerDocument, 'P', { - type: `RG${rGNumber}-${type}`, - }); - pElement.textContent = getValue(inputs.find(i => i.label === type)!)!; - - complexAction.actions.push({ - new: { - parent: parent.querySelector('Address')!, - element: pElement, - }, - }); - }); - - return [complexAction]; - }; -} - -/** - * Get all the current used Logic Link numbers. - * @param parent - The parent element of all the P elements. - * @param rGNumber - The Redundancy Group number to use for searching Logic Link groups. - * @returns An array with all the Logic Link group numbers. - */ -function getLogicLinkNumbers(parent: Element, rGNumber: number): number[] { - const usedNumbers: number[] = []; - - parent - .querySelectorAll(`Address > P[type^="RG${rGNumber}-LL"]`) - .forEach(p => { - const logicLinkPart = getTypeAttribute(p)?.split('-')[1]; - const number = Number(logicLinkPart?.substring(2)); - - if (!usedNumbers.includes(number)) usedNumbers.push(number); - }); - - return usedNumbers.sort(); -} diff --git a/packages/compas-open-scd/src/editors/protocol104/wizards/selectDo.ts b/packages/compas-open-scd/src/editors/protocol104/wizards/selectDo.ts deleted file mode 100644 index 37d861dca..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/wizards/selectDo.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { html, TemplateResult } from 'lit-element'; -import { get } from 'lit-translate'; - -import '../../../finder-list.js'; - -import { - getDisplayString, - getReader, -} from '../../../wizards/foundation/finder.js'; -import { FinderList, Path } from '../../../finder-list.js'; -import { - compareNames, - getNameAttribute, - identity, - newSubWizardEvent, - find, - Wizard, - WizardActor, - WizardInputElement, -} from '../../../foundation.js'; -import { createAddressesWizard } from './createAddresses.js'; -import { SupportedCdcType, supportedCdcTypes } from '../foundation/cdc.js'; -import { PROTOCOL_104_PRIVATE } from '../foundation/private.js'; -import { - getCdcValueFromDOElement, - getDoElements, -} from '../foundation/foundation.js'; - -/** - * Check if the passed DO Element is supported by the 104 protocol and isn't initiated. - * - * @param lnElement - The LN Element used to search for Address Element below DOI, if available. - * @param doElement - The DO Element to check. - */ -function filterAvailableDOElements( - lnElement: Element, - doElement: Element -): boolean { - // First check if this DO Element is supported by the 104 Protocol. - const cdc = getCdcValueFromDOElement(doElement) ?? ''; - if (!supportedCdcTypes.includes(cdc)) { - return false; - } - - // Use the parent (LN) to find the DOI that's linked to the DO Element - // And check if there is DOI if it doesn't already contain Address Elements for the 104 Protocol. - const doName = getNameAttribute(doElement); - return ( - lnElement.querySelectorAll( - `:scope > DOI[name="${doName}"] DAI > Private[type="${PROTOCOL_104_PRIVATE}"] > Address` - ).length <= 0 - ); -} - -/** - * Check if there are DO Elements that aren't initiated and are supported by the 104 protocol. If this is the - * case the Element can be shown in the Finder. - * - * @param child - The child to check if it should still be displayed in the finder list. - */ -function filterAvailableElements(child: Element): boolean { - // For other elements create a list of LN Elements for processing the DO Element from the LN Elements. - let lnElements: Element[]; - if (['LN0', 'LN'].includes(child.tagName)) { - lnElements = [child]; - } else { - // For the other Elements we will just retrieve all the DOI Elements. - lnElements = Array.from(child.querySelectorAll('LN0, LN')); - } - - // If after filtering there are still LN/DO Element(s) to be displayed, this element will be included. - return ( - lnElements.filter( - lnElement => - // Check if there are available DO Elements that aren't initiated and supported by 104 protocol - getDoElements(lnElement).filter(doElement => - filterAvailableDOElements(lnElement, doElement) - ).length > 0 - ).length > 0 - ); -} - -/** - * Retrieve the Data Children needed for the filter-list to display, the elements shown are - * 'IED' -> 'AccessPoint' -> 'LDevice' -> 'LN(0)' -> 'DO'. - * - * @param parent - The previous element selected, starting with SCL Element. - */ -export function getDataChildren(parent: Element): Element[] { - let children; - if (['LN0', 'LN'].includes(parent.tagName)) { - // For LN Element we will not search for the children, but the DO Element linked to LN from the Template Section. - const lnType = parent.getAttribute('lnType') ?? ''; - children = Array.from( - parent.ownerDocument.querySelectorAll( - `:root > DataTypeTemplates > LNodeType[id="${lnType}"] > DO` - ) - ) - .filter(child => filterAvailableDOElements(parent, child)) - .sort((a, b) => compareNames(`${identity(a)}`, `${identity(b)}`)); - } else if (parent.tagName === 'AccessPoint') { - // From the Access Point we will skip directly to the LDevice Element and skip the Server element. - // Or retrieve the LN Elements directly below the AccessPoint. - children = Array.from(parent.querySelectorAll('LDevice, :scope > LN')) - .filter(child => filterAvailableElements(child)) - .sort((a, b) => compareNames(`${identity(a)}`, `${identity(b)}`)); - } else { - // The other element, just retrieve the children and if the tagName is one we need return that child. - children = Array.from(parent.children) - .filter(child => - ['IED', 'AccessPoint', 'LN0', 'LN'].includes(child.tagName) - ) - .filter(child => filterAvailableElements(child)) - .sort((a, b) => compareNames(`${identity(a)}`, `${identity(b)}`)); - } - - return children; -} - -/** - * Action executed when 'next' is pressed. It will start the 'create address'-wizard when a DO Element - * is selected, otherwise nothing happens. - * - * @param doc - The XML Document loaded to search element in. - */ -function openPrepareAddressWizard(doc: XMLDocument): WizardActor { - return (_: WizardInputElement[], wizard: Element) => { - const finder = wizard.shadowRoot?.querySelector('finder-list'); - const path = finder?.path ?? []; - - if (path.length === 0) return []; - - const doElement = checkAndGetLastElementFromPath(doc, path, ['DO']); - const lnElement = checkAndGetLastElementFromPath(doc, path, ['LN0', 'LN']); - - if (lnElement && doElement) { - wizard.dispatchEvent( - newSubWizardEvent(createAddressesWizard(lnElement, doElement)) - ); - } - return []; - }; -} - -/** - * Simple function to retrieve the next element from the path selected. - * Also check if that element is the expected element. - * - * @param doc - The XML Document to be used for querying. - * @param path - The array of selected element to pop the last element name from. - * @param expectedTag - The tagname expected to be found when popping the lats element. - */ -function checkAndGetLastElementFromPath( - doc: XMLDocument, - path: Path, - expectedTag: string[] -): Element | null { - const [tagName, id] = path.pop()!.split(': '); - if (!expectedTag.includes(tagName)) return null; - - return find(doc, tagName, id); -} - -/** - * Start a Finder List to select a DO that can be initiated to be used for the 104 protocol. - * - * @param doc - The XML Document loaded. - * @returns The Wizard to be displayed in a dialog. - */ -export function selectDoWizard(doc: Document): Wizard { - function renderTemplate(doc: XMLDocument): TemplateResult { - return html` path[path.length - 1]} - > - `; - } - - return [ - { - title: get('wizard.title.select', { tagName: 'DO(I)' }), - primary: { - icon: '', - label: get('next'), - action: openPrepareAddressWizard(doc), - }, - content: [renderTemplate(doc)], - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/protocol104/wizards/subnetwork.ts b/packages/compas-open-scd/src/editors/protocol104/wizards/subnetwork.ts deleted file mode 100644 index f0a0a38a6..000000000 --- a/packages/compas-open-scd/src/editors/protocol104/wizards/subnetwork.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { html, TemplateResult } from 'lit-element'; -import { get, translate } from 'lit-translate'; -import { createElement, EditorAction, getMultiplier, getValue, patterns, Wizard, WizardActor, WizardInputElement } from '../../../foundation.js'; - -import '../../../wizard-textfield.js'; - -/** Initial attribute values suggested for `SubNetwork` creation for the 104 plugin */ -const initial = { - type: '104', - bitrate: '100', - multiplier: 'M', -}; - -interface ContentOptions { - name: string | null; - desc: string | null; - type: string | null; - BitRate: string | null; - multiplier: string | null; -} - -function contentSubNetwork(options: ContentOptions): TemplateResult[] { - return [ - html``, - html``, - html``, - html``, - ]; -} - -export function createSubNetworkAction(parent: Element): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const name = getValue(inputs.find(i => i.label === 'name')!); - const desc = getValue(inputs.find(i => i.label === 'desc')!); - const type = getValue(inputs.find(i => i.label === 'type')!); - const BitRate = getValue(inputs.find(i => i.label === 'BitRate')!); - const multiplier = getMultiplier(inputs.find(i => i.label === 'BitRate')!); - - const element = createElement(parent.ownerDocument, 'SubNetwork', { - name, - desc, - type, - }); - - if (BitRate !== null) { - const bitRateElement = createElement(parent.ownerDocument, 'BitRate', { - unit: 'b/s', - multiplier, - }); - bitRateElement.textContent = BitRate; - element.appendChild(bitRateElement); - } - - const action = { - new: { - parent, - element, - }, - }; - - return [action]; - }; -} - -export function createSubNetworkWizard(parent: Element): Wizard { - return [ - { - title: get('wizard.title.add', { tagName: 'SubNetwork' }), - primary: { - icon: 'add', - label: get('add'), - action: createSubNetworkAction(parent), - }, - content: contentSubNetwork({ - name: '', - desc: '', - type: initial.type, - BitRate: initial.bitrate, - multiplier: initial.multiplier, - }), - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/publisher/data-set-editor.ts b/packages/compas-open-scd/src/editors/publisher/data-set-editor.ts deleted file mode 100644 index 27ffa2c70..000000000 --- a/packages/compas-open-scd/src/editors/publisher/data-set-editor.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - query, - state, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-button'; -import '@material/mwc-list/mwc-list-item'; -import { Button } from '@material/mwc-button'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; - -import './data-set-element-editor.js'; -import '../../filtered-list.js'; -import { FilteredList } from '../../filtered-list.js'; - -import { compareNames, identity, find } from '../../foundation.js'; -import { styles, updateElementReference } from './foundation.js'; - -@customElement('data-set-editor') -export class DataSetEditor extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - - @state() - selectedDataSet?: Element; - - @query('.selectionlist') selectionList!: FilteredList; - @query('mwc-button') selectDataSetButton!: Button; - - /** Resets selected GOOSE, if not existing in new doc */ - update(props: Map): void { - if (props.has('doc') && this.selectedDataSet) { - const newDataSet = updateElementReference(this.doc, this.selectedDataSet); - - this.selectedDataSet = newDataSet ?? undefined; - - if (!newDataSet && this.selectionList && this.selectionList.selected) - (this.selectionList.selected as ListItem).selected = false; - } - - super.update(props); - } - - private selectDataSet(evt: Event): void { - const id = ((evt.target as FilteredList).selected as ListItem).value; - const dataSet = find(this.doc, 'DataSet', id); - - if (dataSet) { - this.selectedDataSet = dataSet; - (evt.target as FilteredList).classList.add('hidden'); - this.selectDataSetButton.classList.remove('hidden'); - } - } - - private renderElementEditorContainer(): TemplateResult { - if (this.selectedDataSet) - return html`
- -
`; - - return html``; - } - - private renderSelectionList(): TemplateResult { - return html`${Array.from(this.doc.querySelectorAll('IED')) - .sort(compareNames) - .flatMap(ied => { - const ieditem = html` - ${ied.getAttribute('name')} - developer_board - -
  • `; - - const dataSets = Array.from(ied.querySelectorAll('DataSet')).map( - dataSet => - html`${dataSet.getAttribute('name')}${identity(dataSet)} - ` - ); - - return [ieditem, ...dataSets]; - })}
    `; - } - - private renderToggleButton(): TemplateResult { - return html` { - this.selectionList.classList.remove('hidden'); - this.selectDataSetButton.classList.add('hidden'); - }} - >`; - } - - render(): TemplateResult { - return html`${this.renderToggleButton()} -
    - ${this.renderSelectionList()}${this.renderElementEditorContainer()} -
    `; - } - - static styles = css` - ${styles} - - data-set-element-editor { - flex: auto; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/publisher/data-set-element-editor.ts b/packages/compas-open-scd/src/editors/publisher/data-set-element-editor.ts deleted file mode 100644 index 4a42da3e6..000000000 --- a/packages/compas-open-scd/src/editors/publisher/data-set-element-editor.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - state, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-list/mwc-list-item'; - -import '../../wizard-textfield.js'; -import '../../filtered-list.js'; - -import { identity } from '../../foundation.js'; - -@customElement('data-set-element-editor') -export class DataSetElementEditor extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - /** The element being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - element!: Element | null; - - @state() - private get name(): string | null { - return this.element ? this.element.getAttribute('name') : 'UNDEFINED'; - } - @state() - private get desc(): string | null { - return this.element ? this.element.getAttribute('desc') : 'UNDEFINED'; - } - - private renderContent(): TemplateResult { - return html` - - - - ${Array.from(this.element!.querySelectorAll('FCDA')).map(fcda => { - const [ldInst, prefix, lnClass, lnInst, doName, daName, fc] = [ - 'ldInst', - 'prefix', - 'lnClass', - 'lnInst', - 'doName', - 'daName', - 'fc', - ].map(attributeName => fcda.getAttribute(attributeName) ?? ''); - - return html`${doName}${daName - ? '.' + daName + ' ' + '[' + fc + ']' - : ' ' + '[' + fc + ']'}${ldInst + '/' + prefix + lnClass + lnInst} - `; - })}`; - } - - render(): TemplateResult { - if (this.element) - return html`
    -

    -
    DataSet
    -
    ${identity(this.element)}
    -

    - ${this.renderContent()} -
    `; - - return html`
    -

    -
    DataSet
    -
    ${translate('publisher.nodataset')}
    -

    -
    `; - } - - static styles = css` - .content { - display: flex; - flex-direction: column; - background-color: var(--mdc-theme-surface); - } - - .content > * { - display: block; - margin: 4px 8px 16px; - } - - h2 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - - margin: 0px; - padding-left: 0.3em; - transition: background-color 150ms linear; - } - - .headersubtitle { - font-size: 16px; - font-weight: 200; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - - *[iconTrailing='search'] { - --mdc-shape-small: 28px; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/publisher/foundation.ts b/packages/compas-open-scd/src/editors/publisher/foundation.ts deleted file mode 100644 index be524f0be..000000000 --- a/packages/compas-open-scd/src/editors/publisher/foundation.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { css } from 'lit-element'; - -import { identity, find } from '../../foundation.js'; - -export function updateElementReference( - newDoc: XMLDocument, - oldElement: Element -): Element | null { - if (!oldElement || !oldElement.closest('SCL')) return null; - - const id = identity(oldElement); - const newElement = find(newDoc, oldElement.tagName, id); - - return newElement; -} - -export const styles = css` - .content { - display: flex; - height: calc(100vh - 184px); - } - - .selectionlist { - flex: 35%; - margin: 4px 4px 4px 8px; - background-color: var(--mdc-theme-surface); - overflow-y: scroll; - } - - .elementeditorcontainer { - flex: 65%; - margin: 4px 8px 4px 4px; - background-color: var(--mdc-theme-surface); - overflow-y: scroll; - display: flex; - } - - .listitem.header { - font-weight: 500; - } - - mwc-list-item.hidden[noninteractive] + li[divider] { - display: none; - } - - mwc-button { - display: none; - } - - @media (max-width: 950px) { - .elementeditorcontainer { - display: block; - } - } - - @media (max-width: 599px) { - .content { - height: 100%; - } - - .selectionlist { - position: absolute; - width: calc(100% - 32px); - height: auto; - top: 110px; - left: 8px; - background-color: var(--mdc-theme-surface); - z-index: 1; - box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), - 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); - } - - .elementeditorcontainer { - display: block; - } - - data-set-element-editor { - width: calc(100% - 16px); - } - - .selectionlist.hidden { - display: none; - } - - mwc-button { - display: flex; - margin: 4px 8px 8px; - } - } -`; diff --git a/packages/compas-open-scd/src/editors/publisher/gse-control-editor.ts b/packages/compas-open-scd/src/editors/publisher/gse-control-editor.ts deleted file mode 100644 index 39cdd388a..000000000 --- a/packages/compas-open-scd/src/editors/publisher/gse-control-editor.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - state, - query, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-button'; -import '@material/mwc-list/mwc-list-item'; -import { Button } from '@material/mwc-button'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; - -import './data-set-element-editor.js'; -import './gse-control-element-editor.js'; -import '../../filtered-list.js'; -import { FilteredList } from '../../filtered-list.js'; - -import { gooseIcon } from '../../icons/icons.js'; -import { compareNames, identity, find } from '../../foundation.js'; -import { styles, updateElementReference } from './foundation.js'; - -@customElement('gse-control-editor') -export class GseControlEditor extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - @state() - selectedGseControl?: Element; - @state() - selectedDataSet?: Element | null; - - @query('.selectionlist') selectionList!: FilteredList; - @query('mwc-button') selectGSEControlButton!: Button; - - /** Resets selected GOOSE and its DataSet, if not existing in new doc */ - update(props: Map): void { - if (props.has('doc') && this.selectedGseControl) { - const newGseControl = updateElementReference( - this.doc, - this.selectedGseControl - ); - - this.selectedGseControl = newGseControl ?? undefined; - this.selectedDataSet = this.selectedGseControl - ? updateElementReference(this.doc, this.selectedDataSet!) - : undefined; - - if (!newGseControl && this.selectionList && this.selectionList.selected) - (this.selectionList.selected as ListItem).selected = false; - } - - super.update(props); - } - - private selectGSEControl(evt: Event): void { - const id = ((evt.target as FilteredList).selected as ListItem).value; - const gseControl = find(this.doc, 'GSEControl', id); - if (!gseControl) return; - - this.selectedGseControl = gseControl; - - if (gseControl) { - this.selectedDataSet = gseControl.parentElement?.querySelector( - `DataSet[name="${gseControl.getAttribute('datSet')}"]` - ); - (evt.target as FilteredList).classList.add('hidden'); - this.selectGSEControlButton.classList.remove('hidden'); - } - } - - private renderElementEditorContainer(): TemplateResult { - if (this.selectedGseControl !== undefined) - return html`
    - - -
    `; - - return html``; - } - - renderSelectionList(): TemplateResult { - return html`${Array.from(this.doc.querySelectorAll('IED')) - .sort(compareNames) - .flatMap(ied => { - const ieditem = html` - ${ied.getAttribute('name')} - developer_board - -
  • `; - - const gseControls = Array.from( - ied.querySelectorAll('GSEControl') - ).map( - reportCb => - html`${reportCb.getAttribute('name')}${identity(reportCb)} - ${gooseIcon} - ` - ); - - return [ieditem, ...gseControls]; - })}
    `; - } - - private renderToggleButton(): TemplateResult { - return html` { - this.selectionList.classList.remove('hidden'); - this.selectGSEControlButton.classList.add('hidden'); - }} - >`; - } - - render(): TemplateResult { - return html`${this.renderToggleButton()} -
    - ${this.renderSelectionList()}${this.renderElementEditorContainer()} -
    `; - } - - static styles = css` - ${styles} - - .elementeditorcontainer { - flex: 65%; - margin: 4px 8px 4px 4px; - background-color: var(--mdc-theme-surface); - overflow-y: scroll; - display: grid; - grid-gap: 12px; - padding: 8px 12px 16px; - grid-template-columns: repeat(3, 1fr); - } - - data-set-element-editor { - grid-column: 1 / 2; - } - - gse-control-element-editor { - grid-column: 2 / 4; - } - - @media (max-width: 950px) { - .elementeditorcontainer { - display: block; - } - } - `; -} diff --git a/packages/compas-open-scd/src/editors/publisher/gse-control-element-editor.ts b/packages/compas-open-scd/src/editors/publisher/gse-control-element-editor.ts deleted file mode 100644 index ef9a4b4ca..000000000 --- a/packages/compas-open-scd/src/editors/publisher/gse-control-element-editor.ts +++ /dev/null @@ -1,234 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-formfield'; -import '@material/mwc-checkbox'; - -import '../../wizard-checkbox.js'; -import '../../wizard-select.js'; -import '../../wizard-textfield.js'; - -import { identity } from '../../foundation.js'; -import { maxLength, patterns } from '../../wizards/foundation/limits.js'; -import { typeNullable, typePattern } from '../../wizards/foundation/p-types.js'; -import { ifDefined } from 'lit-html/directives/if-defined.js'; - -@customElement('gse-control-element-editor') -export class GseControlElementEditor extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - /** The element being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - element!: Element; - @property({ attribute: false }) - get gSE(): Element | null | undefined { - const cbName = this.element.getAttribute('name'); - const iedName = this.element.closest('IED')?.getAttribute('name'); - const apName = this.element.closest('AccessPoint')?.getAttribute('name'); - const ldInst = this.element.closest('LDevice')?.getAttribute('inst'); - - return this.element.ownerDocument.querySelector( - `:root > Communication > SubNetwork > ` + - `ConnectedAP[iedName="${iedName}"][apName="${apName}"] > ` + - `GSE[ldInst="${ldInst}"][cbName="${cbName}"]` - ); - } - - private renderGseContent(): TemplateResult { - const gSE = this.gSE; - if (!gSE) - return html`
    -

    -
    Communication Settings (GSE)
    -
    No connection to SubNetwork
    -

    -
    `; - - const minTime = gSE.querySelector('MinTime')?.innerHTML.trim() ?? null; - const maxTime = gSE.querySelector('MaxTime')?.innerHTML.trim() ?? null; - - const hasInstType = Array.from(gSE.querySelectorAll('Address > P')).some( - pType => pType.getAttribute('xsi:type') - ); - - const attributes: Record = {}; - - ['MAC-Address', 'APPID', 'VLAN-ID', 'VLAN-PRIORITY'].forEach(key => { - if (!attributes[key]) - attributes[key] = - gSE.querySelector(`Address > P[type="${key}"]`)?.innerHTML.trim() ?? - null; - }); - - return html`
    -

    Communication Settings (GSE)

    - ${Object.entries(attributes).map( - ([key, value]) => - html`` - )} -
    `; - } - - private renderGseControlContent(): TemplateResult { - const [name, desc, type, appID, fixedOffs, securityEnabled] = [ - 'name', - 'desc', - 'type', - 'appID', - 'fixedOffs', - 'securityEnabled', - ].map(attr => this.element?.getAttribute(attr)); - - return html`
    - - - ${['GOOSE', 'GSSE'].map( - type => html`${type}` - )} - - - ${['None', 'Signature', 'SignatureAndEncryption'].map( - type => html`${type}` - )} -
    `; - } - - render(): TemplateResult { - return html`

    -
    -
    GSEControl
    -
    ${identity(this.element)}
    -
    -

    -
    - ${this.renderGseControlContent()}${this.renderGseContent()} -
    `; - } - - static styles = css` - .parentcontent { - display: grid; - grid-gap: 12px; - box-sizing: border-box; - grid-template-columns: repeat(auto-fit, minmax(316px, auto)); - } - - .content { - border-left: thick solid var(--mdc-theme-on-primary); - } - - .content > * { - display: block; - margin: 4px 8px 16px; - } - - h2, - h3 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - margin: 4px 8px 16px; - padding-left: 0.3em; - } - - .headersubtitle { - font-size: 16px; - font-weight: 200; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - - *[iconTrailing='search'] { - --mdc-shape-small: 28px; - } - - @media (max-width: 950px) { - .content { - border-left: 0px solid var(--mdc-theme-on-primary); - } - } - `; -} diff --git a/packages/compas-open-scd/src/editors/publisher/report-control-editor.ts b/packages/compas-open-scd/src/editors/publisher/report-control-editor.ts deleted file mode 100644 index 2768c83e0..000000000 --- a/packages/compas-open-scd/src/editors/publisher/report-control-editor.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - query, - state, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-button'; -import '@material/mwc-list/mwc-list-item'; -import { Button } from '@material/mwc-button'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; - -import './data-set-element-editor.js'; -import './report-control-element-editor.js'; -import '../../filtered-list.js'; -import { FilteredList } from '../../filtered-list.js'; - -import { compareNames, identity, find } from '../../foundation.js'; -import { reportIcon } from '../../icons/icons.js'; -import { styles, updateElementReference } from './foundation.js'; - -@customElement('report-control-editor') -export class ReportControlEditor extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - @state() - selectedReportControl?: Element; - @state() - selectedDataSet?: Element | null; - - @query('.selectionlist') selectionList!: FilteredList; - @query('mwc-button') selectReportControlButton!: Button; - - /** Resets selected Report and its DataSet, if not existing in new doc */ - update(props: Map): void { - if (props.has('doc') && this.selectedReportControl) { - const newReportControl = updateElementReference( - this.doc, - this.selectedReportControl - ); - - this.selectedReportControl = newReportControl ?? undefined; - this.selectedDataSet = this.selectedReportControl - ? updateElementReference(this.doc, this.selectedDataSet!) - : undefined; - - if ( - !newReportControl && - this.selectionList && - this.selectionList.selected - ) - (this.selectionList.selected as ListItem).selected = false; - } - - super.update(props); - } - - private selectReportControl(evt: Event): void { - const id = ((evt.target as FilteredList).selected as ListItem).value; - const reportControl = find(this.doc, 'ReportControl', id); - if (!reportControl) return; - - this.selectedReportControl = reportControl; - - if (this.selectedReportControl) { - this.selectedDataSet = - this.selectedReportControl.parentElement?.querySelector( - `DataSet[name="${this.selectedReportControl.getAttribute('datSet')}"]` - ); - (evt.target as FilteredList).classList.add('hidden'); - this.selectReportControlButton.classList.remove('hidden'); - } - } - - private renderElementEditorContainer(): TemplateResult { - if (this.selectedReportControl !== undefined) - return html`
    - - -
    `; - - return html``; - } - - private renderSelectionList(): TemplateResult { - return html`${Array.from(this.doc.querySelectorAll('IED')) - .sort(compareNames) - .flatMap(ied => { - const ieditem = html` - ${ied.getAttribute('name')} - developer_board - -
  • `; - - const reports = Array.from(ied.querySelectorAll('ReportControl')).map( - reportCb => - html`${reportCb.getAttribute('name')}${identity(reportCb)} - ${reportIcon} - ` - ); - - return [ieditem, ...reports]; - })}
    `; - } - - private renderToggleButton(): TemplateResult { - return html` { - this.selectionList.classList.remove('hidden'); - this.selectReportControlButton.classList.add('hidden'); - }} - >`; - } - - render(): TemplateResult { - return html`${this.renderToggleButton()} -
    - ${this.renderSelectionList()}${this.renderElementEditorContainer()} -
    `; - } - - static styles = css` - ${styles} - - .elementeditorcontainer { - flex: 65%; - margin: 4px 8px 4px 4px; - background-color: var(--mdc-theme-surface); - overflow-y: scroll; - display: grid; - grid-gap: 12px; - padding: 8px 12px 16px; - grid-template-columns: repeat(3, 1fr); - } - - data-set-element-editor { - grid-column: 1 / 2; - } - - report-control-element-editor { - grid-column: 2 / 4; - } - - @media (max-width: 950px) { - .elementeditorcontainer { - display: block; - } - } - `; -} diff --git a/packages/compas-open-scd/src/editors/publisher/report-control-element-editor.ts b/packages/compas-open-scd/src/editors/publisher/report-control-element-editor.ts deleted file mode 100644 index 777bb7a85..000000000 --- a/packages/compas-open-scd/src/editors/publisher/report-control-element-editor.ts +++ /dev/null @@ -1,250 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '../../wizard-textfield.js'; -import '../../wizard-checkbox.js'; - -import { identity } from '../../foundation.js'; -import { maxLength, patterns } from '../../wizards/foundation/limits.js'; - -@customElement('report-control-element-editor') -export class ReportControlElementEditor extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - /** The element being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - element!: Element; - - private renderOptFieldsContent(): TemplateResult { - const [ - seqNum, - timeStamp, - dataSet, - reasonCode, - dataRef, - entryID, - configRef, - bufOvfl, - ] = [ - 'seqNum', - 'timeStamp', - 'dataSet', - 'reasonCode', - 'dataRef', - 'entryID', - 'configRef', - 'bufOvfl', - ].map( - attr => - this.element.querySelector('OptFields')?.getAttribute(attr) ?? null - ); - - return html`

    Optional Fields

    - ${Object.entries({ - seqNum, - timeStamp, - dataSet, - reasonCode, - dataRef, - entryID, - configRef, - bufOvfl, - }).map( - ([key, value]) => - html`` - )}`; - } - - private renderTrgOpsContent(): TemplateResult { - const [dchg, qchg, dupd, period, gi] = [ - 'dchg', - 'qchg', - 'dupd', - 'period', - 'gi', - ].map( - attr => this.element.querySelector('TrgOps')?.getAttribute(attr) ?? null - ); - - return html`

    Trigger Options

    - ${Object.entries({ dchg, qchg, dupd, period, gi }).map( - ([key, value]) => - html`` - )}`; - } - - private renderChildElements(): TemplateResult { - return html`
    - ${this.renderTrgOpsContent()}${this.renderOptFieldsContent()} -
    `; - } - - private renderReportControlContent(): TemplateResult { - const [name, desc, buffered, rptID, indexed, bufTime, intgPd] = [ - 'name', - 'desc', - 'buffered', - 'rptID', - 'indexed', - 'bufTime', - 'intgPd', - ].map(attr => this.element?.getAttribute(attr)); - const max = - this.element.querySelector('RptEnabled')?.getAttribute('max') ?? null; - - return html`
    - -
    `; - } - - render(): TemplateResult { - if (this.element) - return html`

    -
    -
    ReportControl
    -
    ${identity(this.element)}
    -
    -

    -
    - ${this.renderReportControlContent()}${this.renderChildElements()} -
    `; - - return html`
    -

    ${translate('publisher.nodataset')}

    -
    `; - } - - static styles = css` - .parentcontent { - display: grid; - grid-gap: 12px; - box-sizing: border-box; - grid-template-columns: repeat(auto-fit, minmax(316px, auto)); - } - - .content { - border-left: thick solid var(--mdc-theme-on-primary); - } - - .content > * { - display: block; - margin: 4px 8px 16px; - } - - h2, - h3 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - margin: 4px 8px 16px; - padding-left: 0.3em; - } - - .headersubtitle { - font-size: 16px; - font-weight: 200; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - - *[iconTrailing='search'] { - --mdc-shape-small: 28px; - } - - @media (max-width: 950px) { - .content { - border-left: 0px solid var(--mdc-theme-on-primary); - } - } - `; -} diff --git a/packages/compas-open-scd/src/editors/publisher/sampled-value-control-editor.ts b/packages/compas-open-scd/src/editors/publisher/sampled-value-control-editor.ts deleted file mode 100644 index c0f5f0f84..000000000 --- a/packages/compas-open-scd/src/editors/publisher/sampled-value-control-editor.ts +++ /dev/null @@ -1,189 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - query, - state, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-button'; -import '@material/mwc-list/mwc-list-item'; -import { Button } from '@material/mwc-button'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; - -import './data-set-element-editor.js'; -import '../../filtered-list.js'; -import './sampled-value-control-element-editor.js'; -import { FilteredList } from '../../filtered-list.js'; - -import { compareNames, identity, find } from '../../foundation.js'; -import { smvIcon } from '../../icons/icons.js'; -import { styles, updateElementReference } from './foundation.js'; - -@customElement('sampled-value-control-editor') -export class SampledValueControlEditor extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - @state() - selectedSampledValueControl?: Element; - @state() - selectedDataSet?: Element | null; - - @query('.selectionlist') selectionList!: FilteredList; - @query('mwc-button') selectSampledValueControlButton!: Button; - - /** Resets selected SMV and its DataSet, if not existing in new doc */ - update(props: Map): void { - if (props.has('doc') && this.selectedSampledValueControl) { - const newSampledValueControl = updateElementReference( - this.doc, - this.selectedSampledValueControl - ); - - this.selectedSampledValueControl = newSampledValueControl ?? undefined; - this.selectedDataSet = this.selectedSampledValueControl - ? updateElementReference(this.doc, this.selectedDataSet!) - : undefined; - - if ( - !newSampledValueControl && - this.selectionList && - this.selectionList.selected - ) - (this.selectionList.selected as ListItem).selected = false; - } - - super.update(props); - } - - private selectSMVControl(evt: Event): void { - const id = ((evt.target as FilteredList).selected as ListItem).value; - const smvControl = find(this.doc, 'SampledValueControl', id); - if (!smvControl) return; - - this.selectedSampledValueControl = smvControl; - - if (smvControl) { - this.selectedDataSet = - smvControl.parentElement?.querySelector( - `DataSet[name="${smvControl.getAttribute('datSet')}"]` - ) ?? null; - (evt.target as FilteredList).classList.add('hidden'); - this.selectSampledValueControlButton.classList.remove('hidden'); - } - } - - private renderElementEditorContainer(): TemplateResult { - if (this.selectedSampledValueControl !== undefined) - return html`
    - - -
    `; - - return html``; - } - - private renderSelectionList(): TemplateResult { - return html`${Array.from(this.doc.querySelectorAll('IED')) - .sort(compareNames) - .flatMap(ied => { - const ieditem = html` - ${ied.getAttribute('name')} - developer_board - -
  • `; - - const sampledValueControls = Array.from( - ied.querySelectorAll('SampledValueControl') - ).map( - reportCb => - html`${reportCb.getAttribute('name')}${identity(reportCb)} - ${smvIcon} - ` - ); - - return [ieditem, ...sampledValueControls]; - })}
    `; - } - - private renderToggleButton(): TemplateResult { - return html` { - this.selectionList.classList.remove('hidden'); - this.selectSampledValueControlButton.classList.add('hidden'); - }} - >`; - } - - render(): TemplateResult { - return html`${this.renderToggleButton()} -
    - ${this.renderSelectionList()}${this.renderElementEditorContainer()} -
    `; - } - - static styles = css` - ${styles} - - .elementeditorcontainer { - flex: 65%; - margin: 4px 8px 4px 4px; - background-color: var(--mdc-theme-surface); - overflow-y: scroll; - display: grid; - grid-gap: 12px; - padding: 8px 12px 16px; - grid-template-columns: repeat(3, 1fr); - } - - data-set-element-editor { - grid-column: 1 / 2; - } - - sampled-value-control-element-editor { - grid-column: 2 / 4; - } - - @media (max-width: 950px) { - .elementeditorcontainer { - display: block; - } - } - `; -} diff --git a/packages/compas-open-scd/src/editors/publisher/sampled-value-control-element-editor.ts b/packages/compas-open-scd/src/editors/publisher/sampled-value-control-element-editor.ts deleted file mode 100644 index 78dda1ea9..000000000 --- a/packages/compas-open-scd/src/editors/publisher/sampled-value-control-element-editor.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-formfield'; -import '@material/mwc-checkbox'; - -import '../../wizard-checkbox.js'; -import '../../wizard-select.js'; -import '../../wizard-textfield.js'; - -import { identity } from '../../foundation.js'; -import { maxLength, patterns } from '../../wizards/foundation/limits.js'; -import { typeNullable, typePattern } from '../../wizards/foundation/p-types.js'; -import { ifDefined } from 'lit-html/directives/if-defined.js'; - -@customElement('sampled-value-control-element-editor') -export class SampledValueControlElementEditor extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - /** The element being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) - element!: Element; - @property({ attribute: false }) - get sMV(): Element | null { - const cbName = this.element.getAttribute('name'); - const iedName = this.element.closest('IED')?.getAttribute('name'); - const apName = this.element.closest('AccessPoint')?.getAttribute('name'); - const ldInst = this.element.closest('LDevice')?.getAttribute('inst'); - - return this.element.ownerDocument.querySelector( - `:root > Communication > SubNetwork > ` + - `ConnectedAP[iedName="${iedName}"][apName="${apName}"] > ` + - `SMV[ldInst="${ldInst}"][cbName="${cbName}"]` - ); - } - - private renderSmvContent(): TemplateResult { - const sMV = this.sMV; - if (!sMV) - return html`

    -
    ${translate('publisher.smv.commsetting')}
    -
    - ${translate('publisher.smv.noconnectionap')} -
    -

    `; - - const hasInstType = Array.from(sMV.querySelectorAll('Address > P')).some( - pType => pType.getAttribute('xsi:type') - ); - - const attributes: Record = {}; - - ['MAC-Address', 'APPID', 'VLAN-ID', 'VLAN-PRIORITY'].forEach(key => { - if (!attributes[key]) - attributes[key] = - sMV - .querySelector(`Address > P[type="${key}"]`) - ?.textContent?.trim() ?? null; - }); - - return html`

    ${translate('publisher.smv.commsetting')}

    - ${Object.entries(attributes).map( - ([key, value]) => - html`` - )}`; - } - - private renderSmvOptsContent(): TemplateResult { - const [refreshTime, sampleRate, dataSet, security, synchSourceId] = [ - 'refreshTime', - 'sampleRate', - 'dataSet', - 'security', - 'synchSourceId', - ].map( - attr => this.element.querySelector('SmvOpts')?.getAttribute(attr) ?? null - ); - - return html`

    ${translate('publisher.smv.smvopts')}

    - ${Object.entries({ - refreshTime, - sampleRate, - dataSet, - security, - synchSourceId, - }).map( - ([key, value]) => - html`` - )}`; - } - - private renderOtherElements(): TemplateResult { - return html`
    - ${this.renderSmvOptsContent()}${this.renderSmvContent()} -
    `; - } - - private renderSmvControlContent(): TemplateResult { - const [ - name, - desc, - multicast, - smvID, - smpMod, - smpRate, - nofASDU, - securityEnabled, - ] = [ - 'name', - 'desc', - 'multicast', - 'smvID', - 'smpMod', - 'smpRate', - 'nofASDU', - 'securityEnabled', - ].map(attr => this.element?.getAttribute(attr)); - - return html`
    - - - ${multicast === 'true' - ? html`` - : html``} - - ${['SmpPerPeriod', 'SmpPerSec', 'SecPerSmp'].map( - option => - html`${option}` - )} - - - ${['None', 'Signature', 'SignatureAndEncryption'].map( - type => html`${type}` - )} -
    `; - } - - render(): TemplateResult { - return html`

    -
    -
    SampledValueControl
    -
    ${identity(this.element)}
    -
    -

    -
    - ${this.renderSmvControlContent()}${this.renderOtherElements()} -
    `; - } - - static styles = css` - .parentcontent { - display: grid; - grid-gap: 12px; - box-sizing: border-box; - grid-template-columns: repeat(auto-fit, minmax(316px, auto)); - } - - .content { - border-left: thick solid var(--mdc-theme-on-primary); - } - - .content > * { - display: block; - margin: 4px 8px 16px; - } - - h2, - h3 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - margin: 4px 8px 16px; - padding-left: 0.3em; - } - - .headersubtitle { - font-size: 16px; - font-weight: 200; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - } - - *[iconTrailing='search'] { - --mdc-shape-small: 28px; - } - - @media (max-width: 950px) { - .content { - border-left: 0px solid var(--mdc-theme-on-primary); - } - } - `; -} diff --git a/packages/compas-open-scd/src/editors/singlelinediagram/foundation.ts b/packages/compas-open-scd/src/editors/singlelinediagram/foundation.ts deleted file mode 100644 index 4a1cd543b..000000000 --- a/packages/compas-open-scd/src/editors/singlelinediagram/foundation.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { getNameAttribute, getPathNameAttribute } from "../../foundation.js"; - -/** - * A point is a position containing a x and a y within a SCL file. - */ -export interface Point { - x: number; - y: number; -} - -export const SCL_COORDINATES_NAMESPACE = 'http://www.iec.ch/61850/2003/SCLcoordinates'; - -/** Scope factor: the ConnectivityNode allocation algorithm works better with a scale factor which is bigger than 1. */ -const COORDINATES_SCALE_FACTOR = 2; - -/** - * Get the coordinates of a XML element (x and y coordinates). - * @param element - The element to extract coordinates from. - * @returns A point containing the coordinates. - */ -export function getRelativeCoordinates(element: Element): Point { - const x = element.getAttributeNS( - SCL_COORDINATES_NAMESPACE, - 'x' - ); - const y = element.getAttributeNS( - SCL_COORDINATES_NAMESPACE, - 'y' - ); - - return { - x: x ? parseInt(x) * COORDINATES_SCALE_FACTOR : 0, - y: y ? parseInt(y) * COORDINATES_SCALE_FACTOR : 0, - }; -} - -/** - * Get the absolute (its own and all parents') coordinates of a SCL element (x and y coordinates) - * @param element - The element to extract coordinates from. - * @returns A point containing the coordinates. - */ -export function getAbsoluteCoordinates(element: Element): Point { - if (!element.parentElement || element.parentElement?.tagName === 'SCL') - return getRelativeCoordinates(element); - - const absParent = getAbsoluteCoordinates(element.parentElement); - const relElement = getRelativeCoordinates(element); - return { - x: absParent.x! + relElement.x!, - y: absParent.y! + relElement.y!, - }; -} - -/** - * Checking of an element is a BusBar or not. - * @param element - The element to check. - * @returns Is the element a BusBar or not. - */ -export function isBusBar(element: Element): boolean { - return ( - element.children.length === 1 && - element.children[0].tagName === 'ConnectivityNode' - ); -} - -/** - * Get all the connected terminals to a given element. - * @param element - The element to check. - * @returns All connected terminals. - */ -export function getConnectedTerminals(element: Element): Element[] { - const substationElement = element?.closest('Substation'); - if (!substationElement) return []; - - const path = getPathNameAttribute(element) ?? ''; - const [substationName, voltageLevelName, bayName] = path.split('/'); - - return Array.from(substationElement.getElementsByTagName('Terminal')).filter( - terminal => - terminal.getAttribute('connectivityNode') === path && - terminal.getAttribute('cNodeName') === getNameAttribute(element) && - (!terminal.hasAttribute('substationName') || terminal.getAttribute('substationName') === substationName) && - (!terminal.hasAttribute('voltageLevelName') || terminal.getAttribute('voltageLevelName') === voltageLevelName) && - (!terminal.hasAttribute('bayName') || terminal.getAttribute('bayName') === bayName) - ); -} - -/** - * Calculate the SCL x and y coordinate of a Connectivity Node. - * The algorithm is as follow: - * - Get all elements that are connected to this Connectivity Node. - * - Extract the SCL x and y coordinates of these Connectivity Nodes and add them up. - * - Divide the final x and y numbers by the number of connected elements. This way, you get an so-called average. - * @param cNodeElement - The Connectivity Node to calculate the X and Y Coordinates for. - * @returns The calculated SCL x and y coordinates for this Connectivity Node. - */ -export function calculateConnectivityNodeCoordinates( - cNodeElement: Element -): Point { - // If element is not a Connectivity Node, return default {x: 0, y: 0} - if (cNodeElement.tagName != 'ConnectivityNode') return { x: 0, y: 0 }; - - const substationElement = cNodeElement.closest('Substation'); - const pathName = getPathNameAttribute(cNodeElement); - - let nrOfConnections = 0; - let nrOfXConnections = 0; - let totalX = 0; - let totalY = 0; - - Array.from( - substationElement!.querySelectorAll('ConductingEquipment, PowerTransformer') - ) - .filter( - equipment => - equipment.querySelector(`Terminal[connectivityNode="${pathName}"]`) != - null - ) - .forEach(equipment => { - nrOfConnections++; - - const { x, y } = getAbsoluteCoordinates(equipment); - - // Only if the Element is in the same bay, we will use that X-value to calculate the location - // of the Connectivity Node. This will cause the Connectivity Node to stay with the boundaries - // of the Bay and not causing al kind of overlays between bays. - if (equipment.parentElement === cNodeElement.parentElement) { - nrOfXConnections++; - totalX += x!; - } - totalY += y!; - }); - - if (nrOfConnections === 0) return { x: 0, y: 0 }; - if (nrOfConnections === 1) return { x: totalX + 1, y: totalY + 1 }; - - return { - x: Math.round(totalX / nrOfXConnections), - y: Math.round(totalY / nrOfConnections), - }; -} - -export function getCommonParentElement(leftElement: Element, rightElement: Element, defaultParent: Element | null): Element | null { - let leftParentElement = leftElement.parentElement - while (leftParentElement) { - if (leftParentElement.contains(rightElement)) { - return leftParentElement; - } - leftParentElement = leftParentElement.parentElement; - } - return defaultParent; -} diff --git a/packages/compas-open-scd/src/editors/singlelinediagram/ortho-connector.ts b/packages/compas-open-scd/src/editors/singlelinediagram/ortho-connector.ts deleted file mode 100644 index 9c3f19707..000000000 --- a/packages/compas-open-scd/src/editors/singlelinediagram/ortho-connector.ts +++ /dev/null @@ -1,311 +0,0 @@ -interface Point { - x: number; - y: number; -} - -interface Adjacent { - point: Point; - edgeWeight: number; -} - -interface GraphNode { - point: Point; - adjacent: Adjacent[]; - dist: number; - path: Point[]; -} - -function distance(a: Point, b: Point): number { - return Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2)); -} - -function isChangedDirection(a: GraphNode, b: GraphNode): boolean { - if (a.path.length === 0) return false; - - const commingX2 = a.point.x; - const commingX1 = a.path[a.path.length - 1].x; - const commingHorizontal = commingX2 - commingX1 ? false : true; - - const goingHorizontal = a.point.x - b.point.x ? false : true; - - return commingHorizontal !== goingHorizontal; -} - -function filterUnchangedDirection(path: Point[]): Point[] { - return path.filter((p, i, v) => { - if (i === 0 || i === v.length - 1) return true; - - const commingDirection = - v[i].x - v[i - 1].x !== 0 ? 'horizontal' : 'vertical'; - const goingDirection = - v[i + 1].x - v[i].x !== 0 ? 'horizontal' : 'vertical'; - - return commingDirection === goingDirection ? false : true; - }); -} - -function calculateMinimumDistance( - adjacent: GraphNode, - edgeWeigh: number, - parentNode: GraphNode -) { - const sourceDistance = parentNode.dist; - - const changingDirection = isChangedDirection(parentNode, adjacent); - const extraWeigh = changingDirection ? Math.pow(edgeWeigh + 1, 2) : 0; - - if (sourceDistance + edgeWeigh + extraWeigh < adjacent.dist) { - adjacent.dist = sourceDistance + edgeWeigh + extraWeigh; - const shortestPath: Point[] = [...parentNode.path]; - shortestPath.push(parentNode.point); - adjacent.path = shortestPath; - } -} - -function getLowestDistanceGraphNode( - unsettledNodes: Set -): GraphNode | null { - let lowestDistance = Number.MAX_SAFE_INTEGER; - let lowestDistanceNode: GraphNode | null = null; - - for (const node of unsettledNodes) - if (node.dist < lowestDistance) { - lowestDistance = node.dist; - lowestDistanceNode = node; - } - - return lowestDistanceNode; -} - -function dijkstra(graph: GraphNode[], start: GraphNode): Point[] { - start.dist = 0; - - const settledNodes: Set = new Set(); - const unsettledNodes: Set = new Set(); - - unsettledNodes.add(start); - - while (unsettledNodes.size != 0) { - const currentNode = getLowestDistanceGraphNode(unsettledNodes)!; - unsettledNodes.delete(currentNode); - - for (const adjacent of currentNode.adjacent) { - const adjacentNode = graph.find( - node => - node.point.x === adjacent.point.x && node.point.y === adjacent.point.y - ); - const edgeWeight = adjacent.edgeWeight; - if (adjacentNode && !settledNodes.has(adjacentNode)) { - calculateMinimumDistance(adjacentNode, edgeWeight, currentNode); - unsettledNodes.add(adjacentNode); - } - } - settledNodes.add(currentNode); - } - - return []; -} - -function findClosestGraphNode( - graph: GraphNode[], - point: Point -): GraphNode | undefined { - const distFromGraphNodes = graph.map( - node => Math.abs(point.x - node.point.x) + Math.abs(point.y - node.point.y) - ); - - const minDistance = Math.min(...distFromGraphNodes); - const index = distFromGraphNodes.indexOf(minDistance); - - return graph[index]; -} - -function addStartNode(graph: GraphNode[], start: Point): GraphNode | undefined { - const closestToStart = findClosestGraphNode(graph, start)?.point; - if (!closestToStart) return undefined; - - const startNode = { - point: start, - adjacent: [ - { point: closestToStart, edgeWeight: distance(start, closestToStart) }, - ], - dist: Number.MAX_SAFE_INTEGER, - path: [], - }; - graph.push(startNode); - - return startNode; -} - -function getPath(graph: GraphNode[], start: Point, end: Point): Point[] { - const startNode = addStartNode(graph, start); - const closestToEnd = findClosestGraphNode(graph, end); - - if (!startNode || !closestToEnd) return []; - - dijkstra(graph, startNode); - const shortestPath = closestToEnd.path.concat(closestToEnd.point); - - return filterUnchangedDirection(shortestPath).concat([end]); -} - -function findGraphNode( - graph: GraphNode[], - x: number, - y: number -): GraphNode | undefined { - return graph.find(node => node.point.x === x && node.point.y === y); -} - -function findAdjacent( - graph: GraphNode[], - currentNode: GraphNode, - gridSize: number, - type: string -): Adjacent | null { - let dX1: number; - let dY1: number; - - if (type === 'prevX') { - dX1 = currentNode.point.x - gridSize; - dY1 = currentNode.point.y; - } else if (type === 'prevY') { - dX1 = currentNode.point.x; - dY1 = currentNode.point.y - gridSize; - } else if (type === 'nextX') { - dX1 = currentNode.point.x + gridSize; - dY1 = currentNode.point.y; - } else { - dX1 = currentNode.point.x; - dY1 = currentNode.point.y + gridSize; - } - - if (findGraphNode(graph, dX1!, dY1!)) { - return { - point: findGraphNode(graph, dX1!, dY1!)!.point, - edgeWeight: gridSize, - }; - } - - return null; -} - -function createGraph(allocation: number[][], gridSize: number): GraphNode[] { - const graph: GraphNode[] = []; - for (let row = 0; row < allocation.length; row++) - for (let col = 0; col < allocation[row].length; col++) - if (allocation[row][col] === 0) - graph.push({ - point: { - x: col * gridSize + gridSize / 2, - y: row * gridSize + gridSize / 2, - }, - adjacent: [], - dist: Number.MAX_SAFE_INTEGER, - path: [], - }); - - for (const node of graph) { - const adjacents = ( - ['prevX', 'prevY', 'nextX', 'nextY'] - .map(type => findAdjacent(graph, node, gridSize, type)) - .filter(adjacent => adjacent) - ); - node.adjacent = adjacents; - } - - return graph; -} - -function emptyAllocation( - start: Point, - end: Point, - gridSize: number -): (0 | 1)[][] { - const maxX = start.x > end.x ? start.x : end.x; - const maxY = start.y > end.y ? start.y : end.y; - - const emptyGrid: (0 | 1)[][] = []; - for (let i = 0; i <= Math.ceil(maxY / gridSize) + 1; i++) { - emptyGrid[i] = []; - for (let j = 0; j <= Math.ceil(maxX / gridSize) + 1; j++) { - emptyGrid[i][j] = 0; - } - } - - emptyGrid[Math.floor(start.y / gridSize)][Math.floor(start.x / gridSize)] = 1; - emptyGrid[Math.floor(end.y / gridSize)][Math.floor(end.x / gridSize)] = 1; - - return emptyGrid; -} - -//FIXME: This is a dirty trick to improve performance of the algorithm -function trimStartEnd(start: Point, end: Point, gridSize: number): Point[] { - //FIXME: Dirty hack to speed up the algorithm - const minCoordX = Math.min( - Math.floor(start.x / gridSize), - Math.floor(end.x / gridSize) - ); - const minCoordY = Math.min( - Math.floor(start.y / gridSize), - Math.floor(end.y / gridSize) - ); - - const dCoordX = minCoordX > 1 ? minCoordX - 1 : 0; - const dCoordY = minCoordY > 1 ? minCoordY - 1 : 0; - - const deltaX = dCoordX * gridSize; - const deltaY = dCoordY * gridSize; - - return [ - { x: start.x - deltaX, y: start.y - deltaY }, - { x: end.x - deltaX, y: end.y - deltaY }, - ]; -} - -function fullPath( - path: Point[], - start: Point, - end: Point, - trimmedStart: Point, - trimmedEnd: Point -): Point[] { - if (start === trimmedStart && end === trimmedEnd) return path; - - const deltaX = start.x - trimmedStart.x; - const deltaY = start.y - trimmedStart.y; - - return path.map(point => { - return { x: point.x + deltaX, y: point.y + deltaY }; - }); -} - -/** Finds the shortest orthogonal path between start and end based on grid and dijkstra path finding algorithm - * @param start - the position in px of the start point - * @param end - the position in px of the end point - * @param gridSize - grid size of the grid to rout in the orthogonal path - * @param gridAllocation - optional [][] matrix to define allocated grid cells - * @returns - Array of positions in px building the orthogonal path - */ -export function getOrthogonalPath( - start: Point, - end: Point, - gridSize: number, - gridAllocation?: (0 | 1)[][] -): Point[] { - if (start.x === end.x && start.y === end.y) return []; - - let trimmedStart = start; - let trimmedEnd = end; - - if (!gridAllocation) { - [trimmedStart, trimmedEnd] = trimStartEnd(start, end, gridSize); - gridAllocation = emptyAllocation(trimmedStart, trimmedEnd, gridSize); - } - - const graph: GraphNode[] = createGraph(gridAllocation!, gridSize); - - const shortesPath = getPath(graph, trimmedStart, trimmedEnd); - - return fullPath(shortesPath, start, end, trimmedStart, trimmedEnd); -} diff --git a/packages/compas-open-scd/src/editors/singlelinediagram/sld-drawing.ts b/packages/compas-open-scd/src/editors/singlelinediagram/sld-drawing.ts deleted file mode 100644 index ea97eb654..000000000 --- a/packages/compas-open-scd/src/editors/singlelinediagram/sld-drawing.ts +++ /dev/null @@ -1,655 +0,0 @@ -import { getDescriptionAttribute, getNameAttribute, identity } from '../../foundation.js'; -import { getIcon } from '../substation/foundation.js'; -import { - connectivityNodeIcon, - editIcon, - powerTransformerTwoWindingIcon, -} from '../../icons/icons.js'; - -import { - getRelativeCoordinates, - Point, - getAbsoluteCoordinates, - calculateConnectivityNodeCoordinates, -} from './foundation.js'; -import { getOrthogonalPath } from './ortho-connector.js'; - -/** Default 'grid size' of our SVG */ -export const SVG_GRID_SIZE = 64; - -/** Size of SLC element ConductingEquipment or PowerTransformer */ -export const EQUIPMENT_SIZE = 50; - -/** The size of SLC element ConnectivityNode */ -export const CNODE_SIZE = 25; - -/** Offset of a terminal next to its parent element */ -const TERMINAL_OFFSET = 6; - -type Direction = 'top' | 'right' | 'bottom' | 'left'; -/** Start and end direction of the route */ - -export interface PointDirections { - startDirection: Direction; - endDirection: Direction; -} - -/** - * Get the full position of an element (multiplied with an offset for the SVG). - * It's just a matter of adding all the position up of the element including it's parent(s). - * @param element - The SCL element to get the position for. - * @returns A point containing the full x/y position. - */ -export function getAbsolutePosition(element: Element): Point { - const absoluteCoordinates = getAbsoluteCoordinates(element); - return { - x: - absoluteCoordinates.x! * SVG_GRID_SIZE + - (SVG_GRID_SIZE - EQUIPMENT_SIZE) / 2, - y: - absoluteCoordinates.y! * SVG_GRID_SIZE + - (SVG_GRID_SIZE - EQUIPMENT_SIZE) / 2, - }; -} - -/** - * Get the full position of an bus bar (multiplied with an offset for the SVG). - * @param busbar - The SCL element Bay to get the position for. - * @returns A point containing the full x/y position in px. - */ -export function getAbsolutePositionBusBar(busbar: Element): Point { - const absoluteCoordinates = getAbsoluteCoordinates(busbar); - return { - x: absoluteCoordinates.x! * SVG_GRID_SIZE, - y: absoluteCoordinates.y! * SVG_GRID_SIZE, - }; -} - -/** - * Get the full position of an ConnectivityNode SCL element (multiplied with an offset for the SVG). - * @param connectivityNode - The SCL element ConnectivityNode to get the position for. - * @returns A point containing the full x/y position in px. - */ -export function getAbsolutePositionConnectivityNode(connectivityNode: Element): Point { - const absoluteCoordinates = calculateConnectivityNodeCoordinates(connectivityNode); - return { - x: - absoluteCoordinates.x! * SVG_GRID_SIZE + (SVG_GRID_SIZE - CNODE_SIZE) / 2, - y: - absoluteCoordinates.y! * SVG_GRID_SIZE + (SVG_GRID_SIZE - CNODE_SIZE) / 2, - }; -} - -/** - * Calculate the absolute offset of a terminal next to an element. - * @param parentElementPosition - The position of the parent element of the terminal. - * @param elementOffset - The offset of the parent element. - * @param terminalSide - The side of the parent element where the terminal should be placed. - * @param customTerminalOffset - An optional parameter containing the offset of the terminal next to the parent element. - * This may vary, for example for Connectivity Nodes. - * - * @returns The absolute position of the terminal. - */ -function absoluteOffsetTerminal( - parentElementPosition: Point, - elementOffset: number, - terminalSide: Direction, - customTerminalOffset?: number -): Point { - - const terminalOffset = customTerminalOffset ?? TERMINAL_OFFSET; - - switch (terminalSide) { - case 'top': { - const x = parentElementPosition.x; - const y = parentElementPosition.y; - return { - x: x! + elementOffset / 2, - y: y! - terminalOffset, - }; - } - case 'bottom': { - const x = parentElementPosition.x; - const y = parentElementPosition.y; - return { - x: x! + elementOffset / 2, - y: y! + (elementOffset + terminalOffset), - }; - } - case 'left': { - const x = parentElementPosition.x; - const y = parentElementPosition.y; - return { - x: x! - terminalOffset, - y: y! + elementOffset / 2, - }; - } - case 'right': { - const x = parentElementPosition.x; - const y = parentElementPosition.y; - return { - x: x! + (elementOffset + terminalOffset), - y: y! + elementOffset / 2, - }; - } - default: { - return parentElementPosition; - } - } -} - -/** - * Get the absolute position in py for a equipments Terminal (based on the TERMINAL_OFFSET). - * @param equipment - The SCL elements ConductingEquipment or PowerTransformer. - * @param direction - On which side does the terminal needs to be placed relative to the given point. - */ -export function getAbsolutePositionTerminal( - equipment: Element, - direction: Direction -): Point { - const parentElementPosition = getAbsolutePosition(equipment); - - return absoluteOffsetTerminal(parentElementPosition, EQUIPMENT_SIZE, direction); -} - -/** - * Get the absolute position in px for a SLC element ConnectivityNode drawing start/end (based on the TERMINAL_OFFSET). - * @param cNode - The SCL element ConnectivityNode - * @param direction - The direction of the connector from/to the ConnectivityNode - */ -export function getConnectivityNodesDrawingPosition( - cNode: Element, - direction: Direction -): Point { - const parentElementPosition = getAbsolutePositionConnectivityNode(cNode); - - // Using a custom terminal offset for Connectivity Nodes, so the routes are nicely connected to the Connectivity Nodes. - const customTerminalOffset = -(CNODE_SIZE/3) - return absoluteOffsetTerminal(parentElementPosition, CNODE_SIZE, direction, customTerminalOffset); -} - -/** - * Create a element based on a single XML element. - * @param element - The element. - * @returns The element. - */ -function createGroupElement(element: Element): SVGGraphicsElement { - const finalElement = document.createElementNS( - 'http://www.w3.org/2000/svg', - 'g' - ); - finalElement.setAttribute( - 'id', - typeof identity(element) === 'string' - ? identity(element) - : 'unidentifiable' - ); - finalElement.setAttribute('type', element.tagName); - - const description = getDescriptionAttribute(element); - if (description) finalElement.setAttribute('desc', description); - - // Setting the X and Y coordinates of this element. - // It's not actually used, it's more informative. - const coordinates = getRelativeCoordinates(element); - finalElement.setAttribute('sxy:x', `${coordinates.x}`); - finalElement.setAttribute('sxy:y', `${coordinates.y}`); - - return finalElement; -} - -/** - * Create a Substation element. - * @param substation - The Substation from the SCL document to use. - * @returns A Substation element. - */ -export function createSubstationElement(substation: Element): SVGElement { - return createGroupElement(substation); -} - -/** - * Create a Voltage Level element. - * @param voltageLevel - The Voltage Level from the SCL document to use. - * @returns A Voltage Level element. - */ -export function createVoltageLevelElement(voltageLevel: Element): SVGElement { - return createGroupElement(voltageLevel); -} - -/** - * Create a Bay element. - * @param bayElement - The Bay from the SCL document to use. - * @returns A Bay element. - */ -export function createBayElement(bayElement: Element): SVGGraphicsElement { - return createGroupElement(bayElement); -} - -/** - * Add a Text Element to the top of the Bay - * - * @param rootGroup - The Root group containing all groups. - * @param bayElement - The Bay from the SCL document to use. - * @param clickAction - The action to execute when the Name of the Bay is being clicked. - */ -export function addLabelToBay(rootGroup: SVGElement, - bayElement: Element, - clickAction?: (event: Event) => void -): void { - rootGroup - .querySelectorAll(`g[id="${identity(bayElement)}"]`) - .forEach(bayGroup => { - const labelGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g'); - labelGroup.setAttribute('type', 'BayLabel'); - if (clickAction) labelGroup.addEventListener('click', clickAction); - bayGroup.prepend(labelGroup); - - const bayBox = (bayGroup).getBBox(); - const text = createTextElement( - bayElement.getAttribute('name') || '', - {x: bayBox.x, y: bayBox.y - 20}, - 'medium' - ); - labelGroup.append(text); - - const textBox = text.getBBox(); - const parsedIcon = new DOMParser().parseFromString( - editIcon.strings[0], - 'application/xml' - ); - parsedIcon.querySelectorAll('circle,path,line').forEach(icon => { - icon.setAttribute( - 'transform', - `translate(${textBox.x + textBox.width + 5},${textBox.y}) scale(0.75)` - ); - labelGroup.append(icon); - }); - }); -} - -/** - * Create a basic caption. - * @param textContent - The content of the caption. - * @param coordinates - The x and y position in px to locate in drawing pane. - * @param textSize - The size of the caption - * @returns The text SVG element. - */ -export function createTextElement( - textContent: string, - coordinates: Point, - textSize: string -): SVGGraphicsElement { - const finalElement = document.createElementNS( - 'http://www.w3.org/2000/svg', - 'text' - ); - - finalElement.textContent = textContent; - finalElement.setAttribute( - 'style', - `font-family: Roboto, sans-serif; font-weight: 300; font-size: ${textSize}` - ); - - finalElement.setAttribute('x', `${coordinates.x}`); - finalElement.setAttribute('y', `${coordinates.y}`); - - return finalElement; -} - -/** - * Create a Terminal element. - * @param terminal - The SCL element Terminal to draw - * @param sideToDraw - The side of the element the terminal must be drawn on. - * @param clickAction - The action to execute when the terminal is being clicked. - * @returns The terminal SVG element. - */ -export function createTerminalElement( - terminal: Element, - sideToDraw: Direction, - clickAction?: (event: Event) => void -): SVGElement { - const groupElement = createGroupElement(terminal); - - const terminalIdentity = - typeof identity(terminal) === 'string' - ? identity(terminal) - : 'unidentifiable'; - - const parentEquipment = terminal.closest( - 'ConductingEquipment, PowerTransformer' - ); - const terminalPosition = getAbsolutePositionTerminal( - parentEquipment!, - sideToDraw - ); - - const icon = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); - icon.setAttribute('id', `${terminalIdentity}`); - icon.setAttribute('cx', `${terminalPosition.x}`); - icon.setAttribute('cy', `${terminalPosition.y}`); - icon.setAttribute('r', '2'); - groupElement.appendChild(icon); - - if (clickAction) groupElement.addEventListener('click', clickAction); - - return groupElement; -} - -/** - * Create a bus bar element. - * @param busbarElement - The Bus Bar SCL Element. - * @param busbarLength - The length of the bus bar depending on the x coordinate of the most far out right equipment () - * @returns The Bus Bar SVG element. - */ -export function createBusBarElement( - busbarElement: Element, - busbarLength: number -): SVGGraphicsElement { - const groupElement = createGroupElement(busbarElement); - // Overwrite the type to make a distinction between Bays and Busbars. - groupElement.setAttribute('type', 'Busbar'); - - const absolutePosition = getAbsolutePositionBusBar(busbarElement); - - // TODO: Add this to the icons.ts file. - const icon = document.createElementNS('http://www.w3.org/2000/svg', 'line'); - icon.setAttribute('name', getNameAttribute(busbarElement)!); - icon.setAttribute('stroke-width', '4'); - icon.setAttribute('stroke', 'currentColor'); - - icon.setAttribute('x1', `${absolutePosition.x}`); - icon.setAttribute('y1', `${absolutePosition.y}`); - icon.setAttribute('x2', `${busbarLength}`); - icon.setAttribute('y2', `${absolutePosition.y}`); - - groupElement.appendChild(icon); - - return groupElement; -} - -/** - * Add a Text Element to the top of the Bay - * - * @param rootGroup - The Root group containing all groups. - * @param busbarElement - The BusBar from the SCL document to use. - * @param clickAction - The action to execute when the Name of the BusBar is being clicked. - */ -export function addLabelToBusBar(rootGroup: SVGElement, - busbarElement: Element, - clickAction?: (event: Event) => void -): void { - rootGroup - .querySelectorAll(`g[id="${identity(busbarElement)}"]`) - .forEach(busbarGroup => { - const labelGroup = document.createElementNS('http://www.w3.org/2000/svg','g'); - labelGroup.setAttribute('type', 'BusbarLabel'); - if (clickAction) labelGroup.addEventListener('click', clickAction); - busbarGroup.prepend(labelGroup); - - const busbarBox = (busbarGroup).getBBox(); - const text = createTextElement( - busbarElement.getAttribute('name') || '', - { x: busbarBox.x, y: busbarBox.y - 20 }, - 'medium' - ); - labelGroup.append(text); - - const textBox = text.getBBox(); - const parsedIcon = new DOMParser().parseFromString( - editIcon.strings[0], - 'application/xml' - ); - parsedIcon.querySelectorAll('circle,path,line').forEach(icon => { - icon.setAttribute( - 'transform', - `translate(${textBox.x + textBox.width + 5},${textBox.y}) scale(0.75)` - ); - labelGroup.append(icon); - }); - }); -} - -/** - * Create a Conducting Equipment element. - * @param equipmentElement - The SCL element ConductingEquipment - * @param clickAction - The action to execute when the Conducting Equipment is being clicked. - * @returns The Conducting Equipment SVG element. - */ -export function createConductingEquipmentElement( - equipmentElement: Element, - clickAction?: (event: Event) => void -): SVGElement { - const groupElement = createGroupElement(equipmentElement); - - const absolutePosition = getAbsolutePosition(equipmentElement); - const parsedIcon = new DOMParser().parseFromString( - getIcon(equipmentElement).strings[0], - 'application/xml' - ); - parsedIcon.querySelectorAll('circle,path,line').forEach(icon => { - icon.setAttribute( - 'transform', - `translate(${absolutePosition.x},${absolutePosition.y}) scale(${ - EQUIPMENT_SIZE / 25 - })` - ); - groupElement.appendChild(icon); - }); - - const text = createTextElement( - getNameAttribute(equipmentElement)!, - { x: absolutePosition.x! - 15, y: absolutePosition.y! + 30 }, - 'x-small' - ); - groupElement.appendChild(text); - - if (clickAction) groupElement.addEventListener('click', clickAction); - - return groupElement; -} - -/** - * Create a PowerTransformer element. - * @param powerTransformerElement - The SCL element PowerTransformer - * @param clickAction - The action to execute when the Power Transformer is being clicked. - * @returns The Power Transformer SVG element. - */ -export function createPowerTransformerElement( - powerTransformerElement: Element, - clickAction?: (event: Event) => void -): SVGElement { - const groupElement = createGroupElement(powerTransformerElement); - - const absolutePosition = getAbsolutePosition(powerTransformerElement); - const parsedIcon = new DOMParser().parseFromString( - powerTransformerTwoWindingIcon.strings[0], - 'application/xml' - ); - parsedIcon.querySelectorAll('circle,path,line').forEach(icon => { - icon.setAttribute( - 'transform', - `translate(${absolutePosition.x},${absolutePosition.y}) scale(${ - EQUIPMENT_SIZE / 25 - })` - ); - groupElement.appendChild(icon); - }); - - const text = createTextElement( - getNameAttribute(powerTransformerElement)!, - { x: absolutePosition.x! - 15, y: absolutePosition.y! + 30 }, - 'x-small' - ); - groupElement.appendChild(text); - - if (clickAction) groupElement.addEventListener('click', clickAction); - - return groupElement; -} - -/** - * Create a Connectivity Node element. - * @param cNodeElement - The SCL element ConnectivityNode - * @param clickAction - The action to execute when the Terminal is being clicked. - * @returns The Connectivity Node SVG element. - */ -export function createConnectivityNodeElement( - cNodeElement: Element, - clickAction?: (event: Event) => void -): SVGElement { - const groupElement = createGroupElement(cNodeElement); - - const parsedIcon = new DOMParser().parseFromString( - connectivityNodeIcon.strings[0], - 'application/xml' - ); - - const absolutePosition = getAbsolutePositionConnectivityNode(cNodeElement); - parsedIcon.querySelectorAll('circle').forEach(icon => { - icon.setAttribute( - 'transform', - `translate(${absolutePosition.x},${absolutePosition.y})` - ); - groupElement.appendChild(icon); - }); - - if (clickAction) groupElement.addEventListener('click', clickAction); - - return groupElement; -} - -/** - * Draw a route from ConnectivityNode to equipments Terminal (ConductingEquipment or PowerTransformer) - * @param cNodesTerminalPosition - The start position in px of the SCL element ConnectivityNode. - * @param equipmentsTerminalPosition - The end position in px of the SCL element ConductingEquipment or PowerTransformer. - * @param svgElementToDrawOn - The SVG Element to draw the route on. - */ -export function drawCNodeConnections( - cNodesTerminalPosition: Point, - equipmentsTerminalPosition: Point, - svgElementToDrawOn: SVGElement -): void { - const path = getOrthogonalPath( - equipmentsTerminalPosition, - cNodesTerminalPosition, - SVG_GRID_SIZE - ); - - const line = document.createElementNS('http://www.w3.org/2000/svg', 'path'); - let d = ''; - path.forEach(({ x, y }, index) => { - if (index === 0) { - d = d + ` M ${x} ${y}`; - } else { - d = d + ` L ${x} ${y}`; - } - }); - - line.setAttribute('d', d); - line.setAttribute('fill', 'transparent'); - line.setAttribute('stroke', 'currentColor'); - line.setAttribute('stroke-width', '1'); - - // Inserting elements like this works kind of like z-index (not supported in SVG yet), - // these elements are placed behind all other elements. - // By doing it like this, all other elements are hoverable for example. - svgElementToDrawOn.insertAdjacentElement('afterbegin', line); -} - -/** - * Draw a route from the bus bar to elements terminal position. - * @param busbarsTerminalPosition - The start position in px the bus bar. - * @param equipmentsTerminalPosition - The end position in px of the SCL element ConductingEquipment or PowerTransformer. - * @param svgElementToDrawOn - The SVG Element to draw the route on. - */ -export function drawBusBarRoute( - busbarsTerminalPosition: Point, - equipmentsTerminalPosition: Point, - svgElementToDrawOn: SVGElement -): void { - const path = [busbarsTerminalPosition].concat([equipmentsTerminalPosition]); - - const line = document.createElementNS('http://www.w3.org/2000/svg', 'path'); - let d = ''; - path.forEach(({ x, y }, index) => { - if (index === 0) { - d = d + ` M ${x} ${y}`; - } else { - d = d + ` L ${x} ${y}`; - } - }); - - line.setAttribute('d', d); - line.setAttribute('fill', 'transparent'); - line.setAttribute('stroke', 'currentColor'); - line.setAttribute('stroke-width', '1.5'); - - svgElementToDrawOn.appendChild(line); -} - -/** - * Small simple algorithm deciding on which direction the route should be drawn - * for a connection between elements Terminal and ConnectivityNode - * @param equipment - The SCL element ConductingEquipment or PowerTransformer the route starts from. - * @param cNode - The SLC element ConnectivityNode the route ends with. - * @returns The sides of both points . - */ -export function getDirections( - equipment: Element, - cNode: Element -): PointDirections { - const pointA = getAbsoluteCoordinates(equipment); - const pointB = calculateConnectivityNodeCoordinates(cNode); - - if (pointA.y < pointB.y && pointA.x < pointB.x) - return { startDirection: 'bottom', endDirection: 'left' }; - - if (pointA.y < pointB.y && pointA.x > pointB.x) - return { startDirection: 'bottom', endDirection: 'right' }; - - if (pointA.y < pointB.y && pointA.x === pointB.x) - return { startDirection: 'bottom', endDirection: 'top' }; - - if (pointA.y > pointB.y && pointA.x < pointB.x) - return { startDirection: 'top', endDirection: 'left' }; - - if (pointA.y > pointB.y && pointA.x > pointB.x) - return { startDirection: 'top', endDirection: 'right' }; - - if (pointA.y > pointB.y && pointA.x === pointB.x) - return { startDirection: 'top', endDirection: 'bottom' }; - - if (pointA.y === pointB.y && pointA.x > pointB.x) - return { startDirection: 'left', endDirection: 'right' }; - - if (pointA.y === pointB.y && pointA.x < pointB.x) - return { startDirection: 'right', endDirection: 'left' }; - - return { startDirection: 'bottom', endDirection: 'top' }; -} - -/** - * Get the name of the parent of given child element. - * @param childElement - The child element. - * @returns The name. - */ -export function getParentElementName( - childElement: Element -): string | undefined { - const parentElement = childElement.parentElement; - return getNameAttribute(parentElement); -} - -/* Calculate length of the busbar that is depending on the most far right equipment - * @param root - Either the whole SCL file or the voltage level where the bus bar resides - * @returns - the length of the bus bar - */ -export function getBusBarLength(root: Element): number { - return ( - Math.max( - ...Array.from( - root.querySelectorAll('ConductingEquipment, PowerTransformer') - ).map(equipment => getAbsolutePosition(equipment).x!) - ) + SVG_GRID_SIZE - ); -} diff --git a/packages/compas-open-scd/src/editors/singlelinediagram/wizards/bay.ts b/packages/compas-open-scd/src/editors/singlelinediagram/wizards/bay.ts deleted file mode 100644 index 4a8c687c0..000000000 --- a/packages/compas-open-scd/src/editors/singlelinediagram/wizards/bay.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { TemplateResult } from 'lit-element'; -import { get } from 'lit-translate'; - -import { Wizard} from '../../../foundation.js'; - -import '../../../wizard-textfield.js'; -import { renderBayWizard } from "../../../wizards/bay.js"; -import { - getDescAttribute, - getNameAttribute, - getXCoordinateAttribute, - getYCoordinateAttribute, - updateNamingAndCoordinatesAction, - renderXYCoordinateFields -} from "./foundation.js"; - -function render( - name: string | null, - desc: string | null, - xCoordinate: string | null, - yCoordinate: string | null, -): TemplateResult[] { - return renderBayWizard(name, desc) - .concat(renderXYCoordinateFields(xCoordinate, yCoordinate)); -} - -export function editBayWizard(element: Element): Wizard { - return [ - { - title: get('bay.wizard.title.edit'), - element, - primary: { - icon: 'edit', - label: get('save'), - action: updateNamingAndCoordinatesAction(element), - }, - content: render( - getNameAttribute(element), - getDescAttribute(element), - getXCoordinateAttribute(element), - getYCoordinateAttribute(element), - ), - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/singlelinediagram/wizards/conductingequipment.ts b/packages/compas-open-scd/src/editors/singlelinediagram/wizards/conductingequipment.ts deleted file mode 100644 index 627a59734..000000000 --- a/packages/compas-open-scd/src/editors/singlelinediagram/wizards/conductingequipment.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { TemplateResult } from 'lit-element'; -import { get } from 'lit-translate'; - -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-select'; - -import '../../../wizard-textfield.js'; -import { Wizard } from '../../../foundation.js'; -import { - getDescAttribute, - getNameAttribute, - getXCoordinateAttribute, - getYCoordinateAttribute, - updateNamingAndCoordinatesAction, - renderXYCoordinateFields -} from './foundation.js'; -import { - renderConductingEquipmentWizard, - reservedNamesConductingEquipment, - typeName -} from "../../../wizards/conductingequipment.js"; - -export function render( - name: string | null, - desc: string | null, - xCoordinate: string | null, - yCoordinate: string | null, - option: 'edit' | 'create', - type: string, - reservedNames: string[] -): TemplateResult[] { - return renderConductingEquipmentWizard(name, desc, option, type, reservedNames) - .concat(renderXYCoordinateFields(xCoordinate, yCoordinate)); -} - -export function editConductingEquipmentWizard(element: Element): Wizard { - const reservedNames = reservedNamesConductingEquipment( - element.parentNode!, - element.getAttribute('name')); - - return [ - { - title: get('conductingequipment.wizard.title.edit'), - element, - primary: { - icon: 'edit', - label: get('save'), - action: updateNamingAndCoordinatesAction(element), - }, - content: render( - getNameAttribute(element), - getDescAttribute(element), - getXCoordinateAttribute(element), - getYCoordinateAttribute(element), - 'edit', - typeName(element), - reservedNames - ), - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/singlelinediagram/wizards/foundation.ts b/packages/compas-open-scd/src/editors/singlelinediagram/wizards/foundation.ts deleted file mode 100644 index 349d4865e..000000000 --- a/packages/compas-open-scd/src/editors/singlelinediagram/wizards/foundation.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { html, TemplateResult } from "lit-element"; -import { translate } from "lit-translate"; - -import { - cloneElement, - EditorAction, - getValue, - WizardActor, - WizardInputElement, -} from '../../../foundation.js'; -import { SCL_COORDINATES_NAMESPACE } from "../foundation.js"; - -export function getNameAttribute(element: Element): string | null { - return element.getAttribute('name'); -} - -export function getDescAttribute(element: Element): string | null { - return element.getAttribute('desc'); -} - -export function getXCoordinateAttribute(element: Element): string | null { - return element.getAttributeNS(SCL_COORDINATES_NAMESPACE, 'x'); -} - -export function getYCoordinateAttribute(element: Element): string | null { - return element.getAttributeNS(SCL_COORDINATES_NAMESPACE, 'y'); -} - -export function getFixedCoordinateValue(value: string | null): string | null { - if (value === null) { - return value; - } - - let convertedValue = Number(value); - if (isNaN(convertedValue) || convertedValue < 0) { - convertedValue = 0; - } - - return convertedValue.toString(); -} - -function updateXYAttribute(element: Element, attributeName: string, value: string | null): void { - if (value === null) { - element.removeAttributeNS(SCL_COORDINATES_NAMESPACE, attributeName) - } else { - element.setAttributeNS(SCL_COORDINATES_NAMESPACE, attributeName, value); - } -} - -export function updateNamingAndCoordinatesAction(element: Element): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const name = getValue(inputs.find(i => i.label === 'name')!)!; - const desc = getValue(inputs.find(i => i.label === 'desc')!); - const xCoordinate = getValue(inputs.find(i => i.label === 'xCoordinate')!); - const yCoordinate = getValue(inputs.find(i => i.label === 'yCoordinate')!); - - if ( - name === getNameAttribute(element) && - desc === getDescAttribute(element) && - xCoordinate === getXCoordinateAttribute(element) && - yCoordinate === getYCoordinateAttribute(element) - ) { - return []; - } - - const newElement = cloneElement(element, { name, desc }); - updateXYAttribute(newElement, 'x', getFixedCoordinateValue(xCoordinate)); - updateXYAttribute(newElement, 'y', getFixedCoordinateValue(yCoordinate)); - - return [{ old: { element }, new: { element: newElement } }]; - }; -} - -export function renderXYCoordinateFields( - xCoordinate: string | null, - yCoordinate: string | null, -) : TemplateResult[] { - return [ - html``, - html``, - ]; -} diff --git a/packages/compas-open-scd/src/editors/singlelinediagram/wizards/powertransformer.ts b/packages/compas-open-scd/src/editors/singlelinediagram/wizards/powertransformer.ts deleted file mode 100644 index 3383803f9..000000000 --- a/packages/compas-open-scd/src/editors/singlelinediagram/wizards/powertransformer.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { TemplateResult } from 'lit-element'; -import { get } from 'lit-translate'; - -import { Wizard} from '../../../foundation.js'; - -import '../../../wizard-textfield.js'; -import { - reservedNamesPowerTransformer, - renderPowerTransformerWizard -} from "../../../wizards/powertransformer.js"; -import { - getDescAttribute, - getNameAttribute, - getXCoordinateAttribute, - getYCoordinateAttribute, - updateNamingAndCoordinatesAction, - renderXYCoordinateFields -} from "./foundation.js"; - -function render( - name: string | null, - desc: string | null, - type: string | null, - xCoordinate: string | null, - yCoordinate: string | null, - reservedNames: string[] -): TemplateResult[] { - return renderPowerTransformerWizard(name, desc, type, reservedNames) - .concat(renderXYCoordinateFields(xCoordinate, yCoordinate)); -} - -export function editPowerTransformerWizard(element: Element): Wizard { - return [ - { - title: get('powertransformer.wizard.title.edit'), - element, - primary: { - icon: 'edit', - label: get('save'), - action: updateNamingAndCoordinatesAction(element), - }, - content: render( - getNameAttribute(element), - getDescAttribute(element), - element.getAttribute('type'), - getXCoordinateAttribute(element), - getYCoordinateAttribute(element), - reservedNamesPowerTransformer(element) - ), - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/singlelinediagram/wizards/wizard-library.ts b/packages/compas-open-scd/src/editors/singlelinediagram/wizards/wizard-library.ts deleted file mode 100644 index 69411d7c4..000000000 --- a/packages/compas-open-scd/src/editors/singlelinediagram/wizards/wizard-library.ts +++ /dev/null @@ -1,516 +0,0 @@ -import { SCLTag, Wizard } from '../../../foundation.js'; -import { emptyWizard } from '../../../wizards/wizard-library.js'; - -import { editConnectivityNodeWizard } from "../../../wizards/connectivitynode.js"; -import { editTerminalWizard } from "../../../wizards/terminal.js"; - -import { editBayWizard } from "./bay.js"; -import { editConductingEquipmentWizard } from './conductingequipment.js'; -import { editPowerTransformerWizard } from './powertransformer.js'; - -type SclElementWizard = (element: Element) => Wizard | undefined; - -export const wizards: Record< - SCLTag, - { - edit: SclElementWizard; - create: SclElementWizard; - } -> = { - AccessControl: { - edit: emptyWizard, - create: emptyWizard, - }, - AccessPoint: { - edit: emptyWizard, - create: emptyWizard, - }, - Address: { - edit: emptyWizard, - create: emptyWizard, - }, - Association: { - edit: emptyWizard, - create: emptyWizard, - }, - Authentication: { - edit: emptyWizard, - create: emptyWizard, - }, - BDA: { - edit: emptyWizard, - create: emptyWizard, - }, - BitRate: { - edit: emptyWizard, - create: emptyWizard, - }, - Bay: { - edit: editBayWizard, - create: emptyWizard, - }, - ClientLN: { - edit: emptyWizard, - create: emptyWizard, - }, - ClientServices: { - edit: emptyWizard, - create: emptyWizard, - }, - CommProt: { - edit: emptyWizard, - create: emptyWizard, - }, - Communication: { - edit: emptyWizard, - create: emptyWizard, - }, - ConductingEquipment: { - edit: editConductingEquipmentWizard, - create: emptyWizard, - }, - ConfDataSet: { - edit: emptyWizard, - create: emptyWizard, - }, - ConfLdName: { - edit: emptyWizard, - create: emptyWizard, - }, - ConfLNs: { - edit: emptyWizard, - create: emptyWizard, - }, - ConfLogControl: { - edit: emptyWizard, - create: emptyWizard, - }, - ConfReportControl: { - edit: emptyWizard, - create: emptyWizard, - }, - ConfSG: { - edit: emptyWizard, - create: emptyWizard, - }, - ConfSigRef: { - edit: emptyWizard, - create: emptyWizard, - }, - ConnectedAP: { - edit: emptyWizard, - create: emptyWizard, - }, - ConnectivityNode: { - edit: editConnectivityNodeWizard, - create: emptyWizard, - }, - DA: { - edit: emptyWizard, - create: emptyWizard, - }, - DAI: { - edit: emptyWizard, - create: emptyWizard, - }, - DAType: { - edit: emptyWizard, - create: emptyWizard, - }, - DO: { - edit: emptyWizard, - create: emptyWizard, - }, - DOI: { - edit: emptyWizard, - create: emptyWizard, - }, - DOType: { - edit: emptyWizard, - create: emptyWizard, - }, - DataObjectDirectory: { - edit: emptyWizard, - create: emptyWizard, - }, - DataSet: { - edit: emptyWizard, - create: emptyWizard, - }, - DataSetDirectory: { - edit: emptyWizard, - create: emptyWizard, - }, - DataTypeTemplates: { - edit: emptyWizard, - create: emptyWizard, - }, - DynAssociation: { - edit: emptyWizard, - create: emptyWizard, - }, - DynDataSet: { - edit: emptyWizard, - create: emptyWizard, - }, - EnumType: { - edit: emptyWizard, - create: emptyWizard, - }, - EnumVal: { - edit: emptyWizard, - create: emptyWizard, - }, - EqFunction: { - edit: emptyWizard, - create: emptyWizard, - }, - EqSubFunction: { - edit: emptyWizard, - create: emptyWizard, - }, - ExtRef: { - edit: emptyWizard, - create: emptyWizard, - }, - FCDA: { - edit: emptyWizard, - create: emptyWizard, - }, - FileHandling: { - edit: emptyWizard, - create: emptyWizard, - }, - Function: { - edit: emptyWizard, - create: emptyWizard, - }, - GeneralEquipment: { - edit: emptyWizard, - create: emptyWizard, - }, - GetCBValues: { - edit: emptyWizard, - create: emptyWizard, - }, - GetDataObjectDefinition: { - edit: emptyWizard, - create: emptyWizard, - }, - GetDataSetValue: { - edit: emptyWizard, - create: emptyWizard, - }, - GetDirectory: { - edit: emptyWizard, - create: emptyWizard, - }, - GOOSE: { - edit: emptyWizard, - create: emptyWizard, - }, - GOOSESecurity: { - edit: emptyWizard, - create: emptyWizard, - }, - GSE: { - edit: emptyWizard, - create: emptyWizard, - }, - GSEDir: { - edit: emptyWizard, - create: emptyWizard, - }, - GSEControl: { - edit: emptyWizard, - create: emptyWizard, - }, - GSESettings: { - edit: emptyWizard, - create: emptyWizard, - }, - GSSE: { - edit: emptyWizard, - create: emptyWizard, - }, - Header: { - edit: emptyWizard, - create: emptyWizard, - }, - History: { - edit: emptyWizard, - create: emptyWizard, - }, - Hitem: { - edit: emptyWizard, - create: emptyWizard, - }, - IED: { - edit: emptyWizard, - create: emptyWizard, - }, - IEDName: { - edit: emptyWizard, - create: emptyWizard, - }, - Inputs: { - edit: emptyWizard, - create: emptyWizard, - }, - IssuerName: { - edit: emptyWizard, - create: emptyWizard, - }, - KDC: { - edit: emptyWizard, - create: emptyWizard, - }, - LDevice: { - edit: emptyWizard, - create: emptyWizard, - }, - LN: { - edit: emptyWizard, - create: emptyWizard, - }, - LN0: { - edit: emptyWizard, - create: emptyWizard, - }, - LNode: { - edit: emptyWizard, - create: emptyWizard, - }, - LNodeType: { - edit: emptyWizard, - create: emptyWizard, - }, - Line: { - edit: emptyWizard, - create: emptyWizard, - }, - Log: { - edit: emptyWizard, - create: emptyWizard, - }, - LogControl: { - edit: emptyWizard, - create: emptyWizard, - }, - LogSettings: { - edit: emptyWizard, - create: emptyWizard, - }, - MaxTime: { - edit: emptyWizard, - create: emptyWizard, - }, - McSecurity: { - edit: emptyWizard, - create: emptyWizard, - }, - MinTime: { - edit: emptyWizard, - create: emptyWizard, - }, - NeutralPoint: { - edit: emptyWizard, - create: emptyWizard, - }, - OptFields: { - edit: emptyWizard, - create: emptyWizard, - }, - P: { - edit: emptyWizard, - create: emptyWizard, - }, - PhysConn: { - edit: emptyWizard, - create: emptyWizard, - }, - PowerTransformer: { - edit: editPowerTransformerWizard, - create: emptyWizard, - }, - Private: { - edit: emptyWizard, - create: emptyWizard, - }, - Process: { - edit: emptyWizard, - create: emptyWizard, - }, - ProtNs: { - edit: emptyWizard, - create: emptyWizard, - }, - Protocol: { - edit: emptyWizard, - create: emptyWizard, - }, - ReadWrite: { - edit: emptyWizard, - create: emptyWizard, - }, - RedProt: { - edit: emptyWizard, - create: emptyWizard, - }, - ReportControl: { - edit: emptyWizard, - create: emptyWizard, - }, - ReportSettings: { - edit: emptyWizard, - create: emptyWizard, - }, - RptEnabled: { - edit: emptyWizard, - create: emptyWizard, - }, - SamplesPerSec: { - edit: emptyWizard, - create: emptyWizard, - }, - SampledValueControl: { - edit: emptyWizard, - create: emptyWizard, - }, - SecPerSamples: { - edit: emptyWizard, - create: emptyWizard, - }, - SCL: { - edit: emptyWizard, - create: emptyWizard, - }, - SDI: { - edit: emptyWizard, - create: emptyWizard, - }, - SDO: { - edit: emptyWizard, - create: emptyWizard, - }, - Server: { - edit: emptyWizard, - create: emptyWizard, - }, - ServerAt: { - edit: emptyWizard, - create: emptyWizard, - }, - Services: { - edit: emptyWizard, - create: emptyWizard, - }, - SetDataSetValue: { - edit: emptyWizard, - create: emptyWizard, - }, - SettingControl: { - edit: emptyWizard, - create: emptyWizard, - }, - SettingGroups: { - edit: emptyWizard, - create: emptyWizard, - }, - SGEdit: { - edit: emptyWizard, - create: emptyWizard, - }, - SmpRate: { - edit: emptyWizard, - create: emptyWizard, - }, - SMV: { - edit: emptyWizard, - create: emptyWizard, - }, - SmvOpts: { - edit: emptyWizard, - create: emptyWizard, - }, - SMVsc: { - edit: emptyWizard, - create: emptyWizard, - }, - SMVSecurity: { - edit: emptyWizard, - create: emptyWizard, - }, - SMVSettings: { - edit: emptyWizard, - create: emptyWizard, - }, - SubEquipment: { - edit: emptyWizard, - create: emptyWizard, - }, - SubFunction: { - edit: emptyWizard, - create: emptyWizard, - }, - SubNetwork: { - edit: emptyWizard, - create: emptyWizard, - }, - Subject: { - edit: emptyWizard, - create: emptyWizard, - }, - Substation: { - edit: emptyWizard, - create: emptyWizard, - }, - SupSubscription: { - edit: emptyWizard, - create: emptyWizard, - }, - TapChanger: { - edit: emptyWizard, - create: emptyWizard, - }, - Terminal: { - edit: editTerminalWizard, - create: emptyWizard, - }, - Text: { - edit: emptyWizard, - create: emptyWizard, - }, - TimerActivatedControl: { - edit: emptyWizard, - create: emptyWizard, - }, - TimeSyncProt: { - edit: emptyWizard, - create: emptyWizard, - }, - TransformerWinding: { - edit: emptyWizard, - create: emptyWizard, - }, - TrgOps: { - edit: emptyWizard, - create: emptyWizard, - }, - Val: { - edit: emptyWizard, - create: emptyWizard, - }, - ValueHandling: { - edit: emptyWizard, - create: emptyWizard, - }, - Voltage: { - edit: emptyWizard, - create: emptyWizard, - }, - VoltageLevel: { - edit: emptyWizard, - create: emptyWizard, - }, -}; diff --git a/packages/compas-open-scd/src/editors/subscription/fcda-binding-list.ts b/packages/compas-open-scd/src/editors/subscription/fcda-binding-list.ts deleted file mode 100644 index 3ec10122c..000000000 --- a/packages/compas-open-scd/src/editors/subscription/fcda-binding-list.ts +++ /dev/null @@ -1,459 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - PropertyValues, - query, - state, - TemplateResult, -} from 'lit-element'; -import { nothing, SVGTemplateResult } from 'lit-html'; -import { classMap } from 'lit-html/directives/class-map.js'; -import { translate } from 'lit-translate'; - -import '@material/mwc-icon'; -import '@material/mwc-list'; -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-list/mwc-check-list-item'; -import '@material/mwc-menu'; - -import { Icon } from '@material/mwc-icon'; -import { List } from '@material/mwc-list'; -import { Menu } from '@material/mwc-menu'; - -import { - getDescriptionAttribute, - getNameAttribute, - identity, - newWizardEvent, -} from '../../foundation.js'; -import { gooseIcon, smvIcon } from '../../icons/icons.js'; -import { wizards } from '../../wizards/wizard-library.js'; - -import { - getFcdaSubtitleValue, - getFcdaTitleValue, - newFcdaSelectEvent, - styles, - SubscriptionChangedEvent, -} from './foundation.js'; -import { getSubscribedExtRefElements } from './later-binding/foundation.js'; - -type controlTag = 'SampledValueControl' | 'GSEControl'; - -type iconLookup = Record; - -/** - * A sub element for showing all Goose/Sampled Value Controls. - * A control can be edited using the standard wizard. - * And when selecting a FCDA Element a custom event is fired, so other list can be updated. - */ -@customElement('fcda-binding-list') -export class FcdaBindingList extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - @property() - controlTag!: controlTag; - @property() - includeLaterBinding!: boolean; - - // The selected Elements when a FCDA Line is clicked. - @state() - private selectedControlElement: Element | undefined; - @state() - private selectedFcdaElement: Element | undefined; - @state() - private extRefCounters = new Map(); - - @property({ - type: Boolean, - hasChanged() { - return false; - }, - }) - get hideSubscribed(): boolean { - return ( - localStorage.getItem( - `fcda-binding-list-${ - this.includeLaterBinding ? 'later-binding' : 'data-binding' - }-${this.controlTag}$hideSubscribed` - ) === 'true' ?? false - ); - } - - set hideSubscribed(value: boolean) { - const oldValue = this.hideSubscribed; - localStorage.setItem( - `fcda-binding-list-${ - this.includeLaterBinding ? 'later-binding' : 'data-binding' - }-${this.controlTag}$hideSubscribed`, - `${value}` - ); - this.requestUpdate('hideSubscribed', oldValue); - } - - @property({ - type: Boolean, - hasChanged() { - return false; - }, - }) - get hideNotSubscribed(): boolean { - return ( - localStorage.getItem( - `fcda-binding-list-${ - this.includeLaterBinding ? 'later-binding' : 'data-binding' - }-${this.controlTag}$hideNotSubscribed` - ) === 'true' ?? false - ); - } - - set hideNotSubscribed(value: boolean) { - const oldValue = this.hideNotSubscribed; - localStorage.setItem( - `fcda-binding-list-${ - this.includeLaterBinding ? 'later-binding' : 'data-binding' - }-${this.controlTag}$hideNotSubscribed`, - `${value}` - ); - this.requestUpdate('hideNotSubscribed', oldValue); - } - - @query('.actions-menu') actionsMenu!: Menu; - @query('.actions-menu-icon') actionsMenuIcon!: Icon; - @query('.control-block-list') controlBlockList!: List; - - private iconControlLookup: iconLookup = { - SampledValueControl: smvIcon, - GSEControl: gooseIcon, - }; - - constructor() { - super(); - - this.resetSelection = this.resetSelection.bind(this); - parent.addEventListener('open-doc', this.resetSelection); - - const parentDiv = this.closest('.container'); - if (parentDiv) { - this.resetExtRefCount = this.resetExtRefCount.bind(this); - parentDiv.addEventListener('subscription-changed', this.resetExtRefCount); - } - } - - private getControlElements(): Element[] { - if (this.doc) { - return Array.from(this.doc.querySelectorAll(`LN0 > ${this.controlTag}`)); - } - return []; - } - - private getFcdaElements(controlElement: Element): Element[] { - const lnElement = controlElement.parentElement; - if (lnElement) { - return Array.from( - lnElement.querySelectorAll( - `:scope > DataSet[name=${controlElement.getAttribute( - 'datSet' - )}] > FCDA` - ) - ); - } - return []; - } - - private resetExtRefCount(event: SubscriptionChangedEvent): void { - if (event.detail.control && event.detail.fcda) { - const controlBlockFcdaId = `${identity(event.detail.control)} ${identity( - event.detail.fcda - )}`; - this.extRefCounters.delete(controlBlockFcdaId); - } - } - - private getExtRefCount( - fcdaElement: Element, - controlElement: Element - ): number { - const controlBlockFcdaId = `${identity(controlElement)} ${identity( - fcdaElement - )}`; - if (!this.extRefCounters.has(controlBlockFcdaId)) { - const extRefCount = getSubscribedExtRefElements( - this.doc.getRootNode(), - this.controlTag, - fcdaElement, - controlElement!, - this.includeLaterBinding - ).length; - this.extRefCounters.set(controlBlockFcdaId, extRefCount); - } - return this.extRefCounters.get(controlBlockFcdaId); - } - - private openEditWizard(controlElement: Element): void { - const wizard = wizards[this.controlTag].edit(controlElement); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - private resetSelection(): void { - this.selectedControlElement = undefined; - this.selectedFcdaElement = undefined; - } - - private onFcdaSelect(controlElement: Element, fcdaElement: Element) { - this.resetSelection(); - - this.selectedControlElement = controlElement; - this.selectedFcdaElement = fcdaElement; - } - - protected updated(_changedProperties: PropertyValues): void { - super.updated(_changedProperties); - - // When a new document is loaded or the selection is changed - // we will fire the FCDA Select Event. - if ( - _changedProperties.has('doc') || - _changedProperties.has('selectedControlElement') || - _changedProperties.has('selectedFcdaElement') - ) { - this.dispatchEvent( - newFcdaSelectEvent( - this.selectedControlElement, - this.selectedFcdaElement - ) - ); - } - - // When a new document is loaded we will reset the Map to clear old entries. - if (_changedProperties.has('doc')) { - this.extRefCounters = new Map(); - } - } - - renderFCDA(controlElement: Element, fcdaElement: Element): TemplateResult { - const fcdaCount = this.getExtRefCount(fcdaElement, controlElement); - - const filterClasses = { - subitem: true, - 'show-subscribed': fcdaCount !== 0, - 'show-not-subscribed': fcdaCount === 0, - }; - - return html` this.onFcdaSelect(controlElement, fcdaElement)} - value="${identity(controlElement)} - ${identity(fcdaElement)}" - > - ${getFcdaTitleValue(fcdaElement)} - ${getFcdaSubtitleValue(fcdaElement)} - subdirectory_arrow_right - ${fcdaCount !== 0 ? html`${fcdaCount}` : nothing} - `; - } - - updateBaseFilterState(): void { - !this.hideSubscribed - ? this.controlBlockList!.classList.add('show-subscribed') - : this.controlBlockList!.classList.remove('show-subscribed'); - !this.hideNotSubscribed - ? this.controlBlockList!.classList.add('show-not-subscribed') - : this.controlBlockList!.classList.remove('show-not-subscribed'); - } - - protected firstUpdated(): void { - this.actionsMenu.anchor = this.actionsMenuIcon; - - this.actionsMenu.addEventListener('closed', () => { - this.hideSubscribed = !(>this.actionsMenu.index).has(0); - this.hideNotSubscribed = !(>this.actionsMenu.index).has(1); - this.updateBaseFilterState(); - }); - - this.updateBaseFilterState(); - } - - renderTitle(): TemplateResult { - const menuClasses = { - 'filter-off': this.hideSubscribed || this.hideNotSubscribed, - }; - return html`

    - ${translate(`subscription.${this.controlTag}.controlBlockList.title`)} - { - if (!this.actionsMenu.open) this.actionsMenu.show(); - else this.actionsMenu.close(); - }} - > - - - ${translate('subscription.subscriber.subscribed')} - - - ${translate('subscription.subscriber.notSubscribed')} - - -

    `; - } - - renderControls(controlElements: Element[]): TemplateResult { - return html` - ${controlElements - .filter(controlElement => this.getFcdaElements(controlElement).length) - .map(controlElement => { - const fcdaElements = this.getFcdaElements(controlElement); - const showSubscribed = fcdaElements.some( - fcda => this.getExtRefCount(fcda, controlElement) !== 0 - ); - const showNotSubscribed = fcdaElements.some( - fcda => this.getExtRefCount(fcda, controlElement) === 0 - ); - - const filterClasses = { - control: true, - 'show-subscribed': showSubscribed, - 'show-not-subscribed': showNotSubscribed, - }; - - return html` - - this.openEditWizard(controlElement)} - > - ${getNameAttribute(controlElement)} - ${getDescriptionAttribute(controlElement) - ? html`${getDescriptionAttribute(controlElement)}` - : nothing} - ${identity(controlElement)} - ${this.iconControlLookup[this.controlTag]} - -
  • - ${fcdaElements.map(fcdaElement => - this.renderFCDA(controlElement, fcdaElement) - )} - `; - })} -
    `; - } - - render(): TemplateResult { - const controlElements = this.getControlElements(); - return html`
    - ${this.renderTitle()} - ${controlElements - ? this.renderControls(controlElements) - : html`

    ${translate('subscription.subscriber.notSubscribed')}

    `} -
    `; - } - - static styles = css` - ${styles} - - mwc-list-item.hidden[noninteractive] + li[divider] { - display: none; - } - - mwc-list-item { - --mdc-list-item-meta-size: 48px; - } - - section { - position: relative; - } - - .actions-menu-icon { - float: right; - } - - .actions-menu-icon.filter-off { - color: var(--secondary); - background-color: var(--mdc-theme-background); - } - - /* Filtering rules for control blocks end up implementing logic to allow - very fast CSS response. The following rules appear to be minimal but can be - hard to understand intuitively for the multiple conditions. If modifying, - it is suggested to create a truth-table to check for side-effects */ - - /* remove all control blocks if no filters */ - filtered-list.control-block-list:not(.show-subscribed, .show-not-subscribed) - mwc-list-item { - display: none; - } - - /* remove control blocks taking care to respect multiple conditions */ - filtered-list.control-block-list.show-not-subscribed:not(.show-subscribed) - mwc-list-item.control.show-subscribed:not(.show-not-subscribed) { - display: none; - } - - filtered-list.control-block-list.show-subscribed:not(.show-not-subscribed) - mwc-list-item.control.show-not-subscribed:not(.show-subscribed) { - display: none; - } - - /* remove fcdas if not part of filter */ - filtered-list.control-block-list:not(.show-not-subscribed) - mwc-list-item.subitem.show-not-subscribed { - display: none; - } - - filtered-list.control-block-list:not(.show-subscribed) - mwc-list-item.subitem.show-subscribed { - display: none; - } - - .interactive { - pointer-events: all; - } - - .subitem { - padding-left: var(--mdc-list-side-padding, 16px); - } - `; -} diff --git a/packages/compas-open-scd/src/editors/subscription/foundation.ts b/packages/compas-open-scd/src/editors/subscription/foundation.ts deleted file mode 100644 index 8df872cf2..000000000 --- a/packages/compas-open-scd/src/editors/subscription/foundation.ts +++ /dev/null @@ -1,999 +0,0 @@ -import { css, LitElement, query } from 'lit-element'; - -import { - cloneElement, - compareNames, - Create, - createElement, - Delete, - getSclSchemaVersion, - isPublic, - minAvailableLogicalNodeInstance, -} from '../../foundation.js'; -import { getFcdaReferences } from '../../foundation/ied.js'; -import { SCL_NAMESPACE } from '../../schemas.js'; - -export enum View { - PUBLISHER, - SUBSCRIBER, -} - -/** - * Enumeration stating the Subscribe status of a IED to a GOOSE or Sampled Value. - */ -export enum SubscribeStatus { - Full, - Partial, - None, -} - -export interface ViewDetail { - view: View; -} -export type ViewEvent = CustomEvent; -export function newViewEvent( - view: View, - eventInitDict?: CustomEventInit -): ViewEvent { - return new CustomEvent('view', { - bubbles: true, - composed: true, - ...eventInitDict, - detail: { view, ...eventInitDict?.detail }, - }); -} - -export interface IEDSelectDetail { - ied: Element | undefined; -} -export type IEDSelectEvent = CustomEvent; -export function newIEDSelectEvent( - ied: Element | undefined, - eventInitDict?: CustomEventInit -): IEDSelectEvent { - return new CustomEvent('ied-select', { - bubbles: true, - composed: true, - ...eventInitDict, - detail: { ied, ...eventInitDict?.detail }, - }); -} - -export interface FcdaSelectDetail { - control: Element | undefined; - fcda: Element | undefined; -} -export type FcdaSelectEvent = CustomEvent; -export function newFcdaSelectEvent( - control: Element | undefined, - fcda: Element | undefined, - eventInitDict?: CustomEventInit -): FcdaSelectEvent { - return new CustomEvent('fcda-select', { - bubbles: true, - composed: true, - ...eventInitDict, - detail: { control, fcda, ...eventInitDict?.detail }, - }); -} - -export interface SubscriptionChangedDetail { - control: Element | undefined; - fcda: Element | undefined; -} -export type SubscriptionChangedEvent = CustomEvent; -export function newSubscriptionChangedEvent( - control: Element | undefined, - fcda: Element | undefined, - eventInitDict?: CustomEventInit -): SubscriptionChangedEvent { - return new CustomEvent('subscription-changed', { - bubbles: true, - composed: true, - ...eventInitDict, - detail: { control, fcda, ...eventInitDict?.detail }, - }); -} - -export function getFcdaTitleValue(fcdaElement: Element): string { - return `${fcdaElement.getAttribute('doName')}${ - fcdaElement.hasAttribute('doName') && fcdaElement.hasAttribute('daName') - ? `.` - : `` - }${fcdaElement.getAttribute('daName')}`; -} - -export function getFcdaSubtitleValue(fcdaElement: Element): string { - return `${fcdaElement.getAttribute('ldInst')} ${ - fcdaElement.hasAttribute('ldInst') ? `/` : '' - }${ - fcdaElement.getAttribute('prefix') - ? ` ${fcdaElement.getAttribute('prefix')}` - : '' - } ${fcdaElement.getAttribute('lnClass')} ${fcdaElement.getAttribute( - 'lnInst' - )}`; -} - -export function existExtRef( - parentInputs: Element, - fcda: Element, - control: Element | undefined -): boolean { - return !!getExtRef(parentInputs, fcda, control); -} - -export function getExtRef( - parentInputs: Element, - fcda: Element, - control: Element | undefined -): Element | undefined { - function createCriteria(attributeName: string, value: string | null): string { - if (value) { - return `[${attributeName}="${value}"]`; - } - return ''; - } - - const iedName = fcda.closest('IED')?.getAttribute('name'); - if (!iedName) { - return undefined; - } - - let controlCriteria = ''; - if (control && getSclSchemaVersion(fcda.ownerDocument) !== '2003') { - controlCriteria = `[serviceType="${serviceTypes[control.tagName]!}"]`; - controlCriteria += createCriteria( - 'srcLDInst', - control.closest('LDevice')?.getAttribute('inst') ?? null - ); - controlCriteria += createCriteria( - 'srcLNClass', - control.closest('LN0,LN')?.getAttribute('lnClass') ?? null - ); - controlCriteria += createCriteria( - 'srcLNInst', - control.closest('LN0,LN')?.getAttribute('inst') ?? null - ); - controlCriteria += createCriteria( - 'srcCBName', - control.getAttribute('name') ?? null - ); - } - - return Array.from( - parentInputs.querySelectorAll( - `ExtRef[iedName="${iedName}"]${getFcdaReferences(fcda)}${controlCriteria}` - ) - ).find(extRefElement => !extRefElement.hasAttribute('intAddr')); -} - -export function canRemoveSubscriptionSupervision( - subscribedExtRef: Element -): boolean { - const [srcCBName, srcLDInst, srcLNClass, iedName, srcPrefix, srcLNInst] = [ - 'srcCBName', - 'srcLDInst', - 'srcLNClass', - 'iedName', - 'srcPrefix', - 'srcLNInst', - ].map(attr => subscribedExtRef.getAttribute(attr)); - return !Array.from( - subscribedExtRef.closest('IED')?.getElementsByTagName('ExtRef') ?? [] - ) - .filter(isPublic) - .some( - extRef => - (extRef.getAttribute('srcCBName') ?? '') === (srcCBName ?? '') && - (extRef.getAttribute('srcLDInst') ?? '') === (srcLDInst ?? '') && - (extRef.getAttribute('srcLNClass') ?? '') === (srcLNClass ?? '') && - (extRef.getAttribute('iedName') ?? '') === (iedName ?? '') && - (extRef.getAttribute('srcPrefix') ?? '') === (srcPrefix ?? '') && - (extRef.getAttribute('srcLNInst') ?? '') === (srcLNInst ?? '') && - extRef !== subscribedExtRef - ); -} - -/** - * Searches for first instantiated LGOS/LSVS LN for presence of DOI>DAI[valKind=Conf/RO][valImport=true] - * given a supervision type and if necessary then searches DataTypeTemplates for - * DOType>DA[valKind=Conf/RO][valImport=true] to determine if modifications to supervision are allowed. - * @param ied - SCL IED element. - * @param supervisionType - either 'LGOS' or 'LSVS' supervision LN classes. - * @returns boolean indicating if subscriptions are allowed. - */ -function isSupervisionModificationAllowed( - ied: Element, - supervisionType: string -): boolean { - const firstSupervisionLN = ied.querySelector( - `LN[lnClass="${supervisionType}"]` - ); - - // no supervision logical nodes => no new supervision possible - if (firstSupervisionLN === null) return false; - - // check if allowed to modify based on first instance properties - const supervisionName = supervisionType === 'LGOS' ? 'GoCBRef' : 'SvCBRef'; - const instValKind = firstSupervisionLN! - .querySelector(`DOI[name="${supervisionName}"]>DAI[name="setSrcRef"]`) - ?.getAttribute('valKind'); - const instValImport = firstSupervisionLN! - .querySelector(`DOI[name="${supervisionName}"]>DAI[name="setSrcRef"]`) - ?.getAttribute('valImport'); - - if ( - (instValKind === 'RO' || instValKind === 'Conf') && - instValImport === 'true' - ) - return true; - - // check if allowed to modify based on DataTypeTemplates for first instance - const rootNode = firstSupervisionLN?.ownerDocument; - const lNodeType = firstSupervisionLN.getAttribute('lnType'); - const lnClass = firstSupervisionLN.getAttribute('lnClass'); - const dObj = rootNode.querySelector( - `DataTypeTemplates > LNodeType[id="${lNodeType}"][lnClass="${lnClass}"] > DO[name="${ - lnClass === 'LGOS' ? 'GoCBRef' : 'SvCBRef' - }"]` - ); - if (dObj) { - const dORef = dObj.getAttribute('type'); - const daObj = rootNode.querySelector( - `DataTypeTemplates > DOType[id="${dORef}"] > DA[name="setSrcRef"]` - ); - if (daObj) { - return ( - (daObj.getAttribute('valKind') === 'Conf' || - daObj.getAttribute('valKind') === 'RO') && - daObj.getAttribute('valImport') === 'true' - ); - } - } - // definition missing - return false; -} - -/** - * Returns an array with a single Create action to create a new - * supervision element for the given GOOSE/SMV message and subscriber IED. - * - * @param controlBlock The GOOSE or SMV message element - * @param subscriberIED The subscriber IED - * @returns an empty array if instantiation is not possible or an array with a single Create action - */ -export function instantiateSubscriptionSupervision( - controlBlock: Element | undefined, - subscriberIED: Element | undefined -): Create[] { - const supervisionType = - controlBlock?.tagName === 'GSEControl' ? 'LGOS' : 'LSVS'; - if ( - !controlBlock || - !subscriberIED || - !isSupervisionAllowed(controlBlock, subscriberIED, supervisionType) - ) - return []; - const availableLN = findOrCreateAvailableLNInst( - controlBlock, - subscriberIED, - supervisionType - ); - if ( - !availableLN || - !isSupervisionModificationAllowed(subscriberIED, supervisionType) - ) - return []; - - const actions: Create[] = []; - // If creating new LN element - if (!availableLN.parentElement) { - const parent = subscriberIED.querySelector( - `LN[lnClass="${supervisionType}"]` - )?.parentElement; - if (parent) { - // use Create Action for supervision LN - actions.push({ - new: { - parent: parent, - element: availableLN, - reference: parent!.querySelector( - `LN[lnClass="${supervisionType}"]:last-child` - )?.nextElementSibling, - }, - }); - } - } - - // Create child elements - const supervisionName = supervisionType === 'LGOS' ? 'GoCBRef' : 'SvCBRef'; - - let doiElement = availableLN.querySelector(`DOI[name="${supervisionName}"]`); - if (!doiElement) { - doiElement = subscriberIED.ownerDocument.createElementNS( - SCL_NAMESPACE, - 'DOI' - ); - doiElement.setAttribute('name', supervisionName); - actions.push({ - new: { - parent: availableLN!, - element: doiElement, - }, - }); - } - - let daiElement = availableLN.querySelector( - `DOI[name="${supervisionName}"]>DAI[name="setSrcRef"]` - ); - if (!daiElement) { - daiElement = subscriberIED.ownerDocument.createElementNS( - SCL_NAMESPACE, - 'DAI' - ); - const srcValRef = subscriberIED.querySelector( - `LN[lnClass="${supervisionType}"]>DOI[name="${supervisionName}"]>DAI[name="setSrcRef"]` - ); - daiElement.setAttribute('name', 'setSrcRef'); - - // transfer valKind and valImport from first supervision instance if present - if (srcValRef?.hasAttribute('valKind')) - daiElement.setAttribute('valKind', srcValRef.getAttribute('valKind')!); - if (srcValRef?.hasAttribute('valImport')) - daiElement.setAttribute( - 'valImport', - srcValRef.getAttribute('valImport')! - ); - actions.push({ - new: { - parent: doiElement!, - element: daiElement, - }, - }); - } - - let valElement = availableLN.querySelector(`Val`); - if (!valElement) { - valElement = subscriberIED.ownerDocument.createElementNS( - SCL_NAMESPACE, - 'Val' - ); - } - valElement.textContent = controlBlockReference(controlBlock); - actions.push({ - new: { - parent: daiElement!, - element: valElement, - }, - }); - - return actions; -} - -/** - * Return Val elements within an LGOS/LSVS instance for a particular IED and control block type. - * @param ied - IED SCL element. - * @param cbTagName - Either GSEControl or (defaults to) SampledValueControl. - * @param firstOnly - If true, return the first element found - * @returns an Element array of Val SCL elements within an LGOS/LSVS node. - */ -export function getSupervisionCbRefs( - ied: Element, - cbTagName: string -): Element[]; -export function getSupervisionCbRefs( - ied: Element, - cbTagName: string, - firstOnly: boolean -): Element | null; -export function getSupervisionCbRefs( - ied: Element, - cbTagName: string, - firstOnly?: boolean -): Element[] | Element | null { - const supervisionType = cbTagName === 'GSEControl' ? 'LGOS' : 'LSVS'; - const supervisionName = supervisionType === 'LGOS' ? 'GoCBRef' : 'SvCBRef'; - const selectorString = `LN[lnClass="${supervisionType}"]>DOI[name="${supervisionName}"]>DAI[name="setSrcRef"]>Val,LN0[lnClass="${supervisionType}"]>DOI[name="${supervisionName}"]>DAI[name="setSrcRef"]>Val`; - return firstOnly - ? ied.querySelector(selectorString) - : Array.from(ied.querySelectorAll(selectorString)); -} - -/** - * Return an array with a single Delete action to delete the supervision element - * for the given GOOSE/SMV message and subscriber IED. - * - * @param controlBlock The GOOSE or SMV message element - * @param subscriberIED The subscriber IED - * @returns an empty array if removing the supervision is not possible or an array - * with a single Delete action that removes the LN if it was created in OpenSCD - * or only the supervision structure DOI/DAI/Val if it was created by the user. - */ -export function removeSubscriptionSupervision( - controlBlock: Element | undefined, - subscriberIED: Element | undefined -): Delete[] { - if (!controlBlock || !subscriberIED) return []; - const valElement = getSupervisionCbRefs( - subscriberIED, - controlBlock.tagName - ).find(val => val.textContent == controlBlockReference(controlBlock)); - if (!valElement) return []; - const lnElement = valElement.closest('LN0, LN'); - if (!lnElement || !lnElement.parentElement) return []; - // Check if that one has been created by OpenSCD (private section exists) - const isOpenScdCreated = lnElement.querySelector( - 'Private[type="OpenSCD.create"]' - ); - return isOpenScdCreated - ? [ - { - old: { - parent: lnElement.parentElement, - element: lnElement, - }, - }, - ] - : [ - { - old: { - parent: lnElement, - element: valElement.closest('DOI')!, - }, - }, - ]; -} - -/** - * Checks if the given combination of GOOSE/SMV message and subscriber IED - * allows for subscription supervision. - * @param controlBlock The GOOSE or SMV message element - * @param subscriberIED The subscriber IED - * @param supervisionType LSVS or LGOS - * @returns true if both controlBlock and subscriberIED meet the requirements for - * setting up a supervision for the specified supervision type or false if they don't - */ -function isSupervisionAllowed( - controlBlock: Element, - subscriberIED: Element, - supervisionType: string -): boolean { - if (getSclSchemaVersion(subscriberIED.ownerDocument) === '2003') return false; - if (subscriberIED.querySelector(`LN[lnClass="${supervisionType}"]`) === null) - return false; - if ( - getSupervisionCbRefs(subscriberIED, controlBlock.tagName).find( - val => val.textContent == controlBlockReference(controlBlock) - ) - ) - return false; - if ( - maxSupervisions(subscriberIED, controlBlock) <= - instantiatedSupervisionsCount(subscriberIED, controlBlock) - ) - return false; - - return true; -} - -/** Returns an new or existing LN instance available for supervision instantiation - * - * @param controlBlock The GOOSE or SMV message element - * @param subscriberIED The subscriber IED - * @returns The LN instance or null if no LN instance could be found or created - */ -export function findOrCreateAvailableLNInst( - controlBlock: Element, - subscriberIED: Element, - supervisionType: string -): Element | null { - let availableLN = Array.from( - subscriberIED.querySelectorAll(`LN[lnClass="${supervisionType}"]`) - ).find(ln => { - const supervisionName = supervisionType === 'LGOS' ? 'GoCBRef' : 'SvCBRef'; - return ( - ln.querySelector( - `DOI[name="${supervisionName}"]>DAI[name="setSrcRef"]>Val` - ) === null || - ln.querySelector( - `DOI[name="${supervisionName}"]>DAI[name="setSrcRef"]>Val` - )?.textContent === '' - ); - }); - if (!availableLN) { - availableLN = subscriberIED.ownerDocument.createElementNS( - SCL_NAMESPACE, - 'LN' - ); - const openScdTag = subscriberIED.ownerDocument.createElementNS( - SCL_NAMESPACE, - 'Private' - ); - openScdTag.setAttribute('type', 'OpenSCD.create'); - availableLN.appendChild(openScdTag); - availableLN.setAttribute('lnClass', supervisionType); - const instantiatedSiblings = getSupervisionCbRefs( - subscriberIED, - controlBlock.tagName, - true - )?.closest('LN'); - - if (!instantiatedSiblings) return null; - availableLN.setAttribute( - 'lnType', - instantiatedSiblings?.getAttribute('lnType') ?? '' - ); - } - - /* Before we return, we make sure that LN's inst is unique, non-empty - and also the minimum inst as the minimum of all available in the IED */ - const inst = availableLN.getAttribute('inst') ?? ''; - if (inst === '') { - const instNumber = minAvailableLogicalNodeInstance( - Array.from( - subscriberIED.querySelectorAll(`LN[lnClass="${supervisionType}"]`) - ) - ); - if (!instNumber) return null; - availableLN.setAttribute('inst', instNumber); - } - return availableLN; -} - -/** - * Find the first ExtRef SCL element given a control and a subscribing IED - * - * @param publishedControlBlock - the control block SCL element in the publishing IED. - * @param subscribingIed - the subscribing IED SCL element. - * @returns The first ExtRef element associated with the subscribing IED and published control block. - */ -export function getFirstSubscribedExtRef( - publishedControlBlock: Element, - subscribingIed: Element -): Element | null { - const publishingIed = publishedControlBlock.closest('LN,LN0')!; - const dataSet = publishingIed.querySelector( - `DataSet[name="${publishedControlBlock.getAttribute('datSet')}"]` - ); - let extRef: Element | undefined = undefined; - Array.from( - subscribingIed?.querySelectorAll('LN0 > Inputs, LN > Inputs') - ).some(inputs => { - Array.from(dataSet!.querySelectorAll('FCDA')).some(fcda => { - const anExtRef = getExtRef(inputs, fcda, publishedControlBlock); - if (anExtRef) { - extRef = anExtRef; - return true; - } - return false; - }); - return extRef !== undefined; - }); - return extRef !== undefined ? extRef : null; -} - -/** Returns the subscriber's supervision LN for a given control block and extRef element - * - * @param extRef - The extRef SCL element in the subscribing IED. - * @returns The supervision LN instance or null if not found - */ -export function getExistingSupervision(extRef: Element | null): Element | null { - if (extRef === null) return null; - - const extRefValues = ['iedName', 'serviceType', 'srcPrefix', 'srcCBName']; - const [srcIedName, serviceType, srcPrefix, srcCBName] = extRefValues.map( - attr => extRef.getAttribute(attr) ?? '' - ); - - const supervisionType = serviceType === 'GOOSE' ? 'LGOS' : 'LSVS'; - const refSelector = - supervisionType === 'LGOS' ? 'DOI[name="GoCBRef"]' : 'DOI[name="SvCBRef"]'; - - const srcLDInst = - extRef.getAttribute('srcLDInst') ?? extRef.getAttribute('ldInst'); - const srcLNClass = extRef.getAttribute('srcLNClass') ?? 'LLN0'; - - const cbReference = `${srcIedName}${srcPrefix}${srcLDInst}/${srcLNClass}.${srcCBName}`; - const iedName = extRef.closest('IED')?.getAttribute('name'); - - const candidates = Array.from( - extRef.ownerDocument - .querySelector(`IED[name="${iedName}"]`)! - .querySelectorAll( - `LN[lnClass="${supervisionType}"]>${refSelector}>DAI[name="setSrcRef"]>Val` - ) - ).find(val => val.textContent === cbReference); - - return candidates !== undefined ? candidates.closest('LN')! : null; -} - -/** - * Counts the number of LN instances with proper supervision for the given control block set up. - * - * @param subscriberIED The subscriber IED - * @param controlBlock The GOOSE or SMV message element - * @returns The number of LN instances with a supervision set up - */ -export function instantiatedSupervisionsCount( - subscriberIED: Element, - controlBlock: Element -): number { - const instantiatedValues = getSupervisionCbRefs( - subscriberIED, - controlBlock.tagName - ).filter(val => val.textContent !== ''); - return instantiatedValues.length; -} - -/** - * Counts the max number of LN instances with supervision allowed for - * the given control block's type of message. - * - * @param subscriberIED The subscriber IED - * @param controlBlock The GOOSE or SMV message element - * @returns The max number of LN instances with supervision allowed - */ -export function maxSupervisions( - subscriberIED: Element, - controlBlock: Element -): number { - const maxAttr = controlBlock.tagName === 'GSEControl' ? 'maxGo' : 'maxSv'; - const maxValues = parseInt( - subscriberIED - .querySelector('Services>SupSubscription') - ?.getAttribute(maxAttr) ?? '0', - 10 - ); - return isNaN(maxValues) ? 0 : maxValues; -} - -/** - * Creates a string pointer to the control block element. - * - * @param controlBlock The GOOSE or SMV message element - * @returns null if the control block is undefined or a string pointer to the control block element - */ -export function controlBlockReference( - controlBlock: Element | undefined -): string | null { - if (!controlBlock) return null; - const anyLn = controlBlock.closest('LN,LN0'); - const prefix = anyLn?.getAttribute('prefix') ?? ''; - const lnClass = anyLn?.getAttribute('lnClass'); - const lnInst = anyLn?.getAttribute('inst') ?? ''; - const ldInst = controlBlock.closest('LDevice')?.getAttribute('inst'); - const iedName = controlBlock.closest('IED')?.getAttribute('name'); - const cbName = controlBlock.getAttribute('name'); - if (!cbName && !iedName && !ldInst && !lnClass) return null; - return `${iedName}${ldInst}/${prefix}${lnClass}${lnInst}.${cbName}`; -} - -export function canCreateValidExtRef( - fcda: Element, - controlBlock: Element | undefined -): boolean { - const iedName = fcda.closest('IED')?.getAttribute('name'); - const [ldInst, lnClass, lnInst, doName] = [ - 'ldInst', - 'lnClass', - 'lnInst', - 'doName', - ].map(attr => fcda.getAttribute(attr)); - if (!iedName || !ldInst || !lnClass || !lnInst || !doName) { - return false; - } - - // For 2003 schema or serviceType `Poll`, the extra fields aren't needed. - if ( - getSclSchemaVersion(fcda.ownerDocument) === '2003' || - controlBlock === undefined - ) { - return true; - } - - const srcLDInst = controlBlock.closest('LDevice')?.getAttribute('inst'); - const srcLNClass = controlBlock.closest('LN0,LN')?.getAttribute('lnClass'); - const srcLNInst = controlBlock.closest('LN0,LN')?.getAttribute('inst'); - const srcCBName = controlBlock.getAttribute('name'); - - // For srcLNInst an empty string is allowed in `LN0` - return !( - !srcLDInst || - !srcLNClass || - !srcCBName || - typeof srcLNInst !== 'string' - ); -} - -export const serviceTypes: Partial> = { - ReportControl: 'Report', - GSEControl: 'GOOSE', - SampledValueControl: 'SMV', -}; - -/** - * Create a new ExtRef Element depending on the SCL Edition copy attributes from the Control Element, - * FCDA Element and related Elements. - * - * @param controlElement - `ReportControl`, `GSEControl` or `SampledValueControl` source element - * @param fcdaElement - The source data attribute element. - * @returns The new created ExtRef element, which can be added to the document. - */ -export function createExtRefElement( - controlElement: Element | undefined, - fcdaElement: Element -): Element { - const iedName = fcdaElement.closest('IED')?.getAttribute('name') ?? null; - const [ldInst, prefix, lnClass, lnInst, doName, daName] = [ - 'ldInst', - 'prefix', - 'lnClass', - 'lnInst', - 'doName', - 'daName', - ].map(attr => fcdaElement.getAttribute(attr)); - - if (getSclSchemaVersion(fcdaElement.ownerDocument) === '2003') { - // Edition 2003(1) does not define serviceType and its MCD attribute starting with src... - return createElement(fcdaElement.ownerDocument, 'ExtRef', { - iedName, - ldInst, - lnClass, - lnInst, - prefix, - doName, - daName, - }); - } - - if (!controlElement || !serviceTypes[controlElement.tagName]) { - //for invalid control block tag name assume polling - return createElement(fcdaElement.ownerDocument, 'ExtRef', { - iedName, - serviceType: 'Poll', - ldInst, - lnClass, - lnInst, - prefix, - doName, - daName, - }); - } - - // default is empty string as attributes are mandatory acc to IEC 61850-6 >Ed2 - const srcLDInst = - controlElement.closest('LDevice')?.getAttribute('inst') ?? ''; - const srcPrefix = - controlElement.closest('LN0,LN')?.getAttribute('prefix') ?? ''; - const srcLNClass = - controlElement.closest('LN0,LN')?.getAttribute('lnClass') ?? ''; - const srcLNInst = controlElement.closest('LN0,LN')?.getAttribute('inst'); - const srcCBName = controlElement.getAttribute('name') ?? ''; - - return createElement(fcdaElement.ownerDocument, 'ExtRef', { - iedName, - serviceType: serviceTypes[controlElement.tagName]!, - ldInst, - lnClass, - lnInst, - prefix, - doName, - daName, - srcLDInst, - srcPrefix, - srcLNClass, - srcLNInst: srcLNInst ? srcLNInst : null, - srcCBName, - }); -} - -/** - * Create a clone of the passed ExtRefElement and updated or set the required attributes on the cloned element - * depending on the Edition and type of Control Element. - * - * @param extRefElement - The ExtRef Element to clone and update. - * @param controlElement - `ReportControl`, `GSEControl` or `SampledValueControl` source element - * @param fcdaElement - The source data attribute element. - * @returns A cloned ExtRef Element with updated information to be used for example in a Replace Action. - */ -export function updateExtRefElement( - extRefElement: Element, - controlElement: Element | undefined, - fcdaElement: Element -): Element { - const iedName = fcdaElement.closest('IED')?.getAttribute('name') ?? null; - const [ldInst, prefix, lnClass, lnInst, doName, daName] = [ - 'ldInst', - 'prefix', - 'lnClass', - 'lnInst', - 'doName', - 'daName', - ].map(attr => fcdaElement.getAttribute(attr)); - - if (getSclSchemaVersion(fcdaElement.ownerDocument) === '2003') { - // Edition 2003(1) does not define serviceType and its MCD attribute starting with src... - return cloneElement(extRefElement, { - iedName, - serviceType: null, - ldInst, - lnClass, - lnInst, - prefix, - doName, - daName, - srcLDInst: null, - srcPrefix: null, - srcLNClass: null, - srcLNInst: null, - srcCBName: null, - }); - } - - if (!controlElement || !serviceTypes[controlElement.tagName]) { - //for invalid control block tag name assume polling - return cloneElement(extRefElement, { - iedName, - serviceType: 'Poll', - ldInst, - lnClass, - lnInst, - prefix, - doName, - daName, - srcLDInst: null, - srcPrefix: null, - srcLNClass: null, - srcLNInst: null, - srcCBName: null, - }); - } - - const srcLDInst = - controlElement.closest('LDevice')?.getAttribute('inst') ?? ''; - const srcPrefix = - controlElement.closest('LN0,LN')?.getAttribute('prefix') ?? ''; - const srcLNClass = - controlElement.closest('LN0,LN')?.getAttribute('lnClass') ?? ''; - const srcLNInst = controlElement.closest('LN0,LN')?.getAttribute('inst'); - const srcCBName = controlElement.getAttribute('name') ?? ''; - - return cloneElement(extRefElement, { - iedName, - serviceType: serviceTypes[controlElement.tagName]!, - ldInst, - lnClass, - lnInst, - prefix, - doName, - daName, - srcLDInst, - srcPrefix, - srcLNClass, - srcLNInst: srcLNInst ? srcLNInst : null, - srcCBName, - }); -} - -export function getOrderedIeds(doc: XMLDocument): Element[] { - return doc - ? Array.from(doc.querySelectorAll(':root > IED')).sort((a, b) => - compareNames(a, b) - ) - : []; -} - -/** - * An element within this list has 2 properties: - * - The element itself, either a GSEControl or an IED at this point. - * - A 'partial' property indicating if the GOOSE is fully initialized or partially. - */ -export interface ListElement { - element: Element; - partial?: boolean; -} - -export class SubscriberListContainer extends LitElement { - /** List holding all current subscribed Elements. */ - subscribedElements: ListElement[] = []; - - /** List holding all current available Elements which are not subscribed. */ - availableElements: ListElement[] = []; - - /** Current selected IED (when in Subscriber view) */ - currentSelectedIed: Element | undefined; - - /** The current used dataset for subscribing / unsubscribing */ - currentUsedDataset: Element | undefined | null; - - @query('div') subscriberWrapper!: Element; - - protected updated(): void { - if (this.subscriberWrapper) { - this.subscriberWrapper.scrollTo(0, 0); - } - } - - protected resetElements(): void { - this.subscribedElements = []; - this.availableElements = []; - } -} - -/** Common `CSS` styles used by DataTypeTemplate subeditors */ -export const styles = css` - :host(.moving) section { - opacity: 0.3; - } - - section { - background-color: var(--mdc-theme-surface); - transition: all 200ms linear; - outline-color: var(--mdc-theme-primary); - outline-style: solid; - outline-width: 0px; - opacity: 1; - } - - section:focus { - box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), - 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.2); - } - - section:focus-within { - outline-width: 2px; - transition: all 250ms linear; - } - - h1, - h2, - h3 { - color: var(--mdc-theme-on-surface); - font-family: 'Roboto', sans-serif; - font-weight: 300; - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - margin: 0px; - line-height: 48px; - padding-left: 0.3em; - transition: background-color 150ms linear; - } - - section:focus-within > h1, - section:focus-within > h2, - section:focus-within > h3 { - color: var(--mdc-theme-surface); - background-color: var(--mdc-theme-primary); - transition: background-color 200ms linear; - } - - h1 > nav, - h2 > nav, - h3 > nav, - h1 > abbr > mwc-icon-button, - h2 > abbr > mwc-icon-button, - h3 > abbr > mwc-icon-button { - float: right; - } - - abbr[title] { - border-bottom: none !important; - cursor: inherit !important; - text-decoration: none !important; - } - - mwc-list-item[noninteractive] { - font-weight: 500; - } -`; - -declare global { - interface ElementEventMap { - ['view']: ViewEvent; - ['ied-select']: IEDSelectEvent; - ['fcda-select']: FcdaSelectEvent; - ['subscription-changed']: SubscriptionChangedEvent; - } -} diff --git a/packages/compas-open-scd/src/editors/subscription/goose/foundation.ts b/packages/compas-open-scd/src/editors/subscription/goose/foundation.ts deleted file mode 100644 index c833d11b9..000000000 --- a/packages/compas-open-scd/src/editors/subscription/goose/foundation.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { SubscribeStatus } from '../foundation.js'; - -export interface GOOSESelectDetail { - gseControl: Element | undefined; - dataset: Element | undefined; -} -export type GOOSESelectEvent = CustomEvent; -export function newGOOSESelectEvent( - gseControl: Element | undefined, - dataset: Element | undefined, - eventInitDict?: CustomEventInit -): GOOSESelectEvent { - return new CustomEvent('goose-select', { - bubbles: true, - composed: true, - ...eventInitDict, - detail: { gseControl, dataset, ...eventInitDict?.detail }, - }); -} - -export interface GooseSubscriptionDetail { - element: Element; - subscribeStatus: SubscribeStatus; -} -export type GooseSubscriptionEvent = CustomEvent; -export function newGooseSubscriptionEvent( - element: Element, - subscribeStatus: SubscribeStatus -): GooseSubscriptionEvent { - return new CustomEvent('goose-subscription', { - bubbles: true, - composed: true, - detail: { element, subscribeStatus }, - }); -} - -declare global { - interface ElementEventMap { - ['goose-select']: GOOSESelectEvent; - ['goose-subscription']: GooseSubscriptionEvent; - } -} diff --git a/packages/compas-open-scd/src/editors/subscription/goose/goose-list.ts b/packages/compas-open-scd/src/editors/subscription/goose/goose-list.ts deleted file mode 100644 index 422274216..000000000 --- a/packages/compas-open-scd/src/editors/subscription/goose/goose-list.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; -import { classMap } from 'lit-html/directives/class-map'; - -import '@material/mwc-icon'; -import '@material/mwc-list/mwc-list-item'; - -import '../../../filtered-list.js'; -import { - getNameAttribute, - identity, - newWizardEvent, -} from '../../../foundation.js'; -import { newGOOSESelectEvent } from './foundation.js'; -import { gooseIcon } from '../../../icons/icons.js'; -import { wizards } from '../../../wizards/wizard-library.js'; -import { getOrderedIeds, styles } from '../foundation.js'; - -let selectedGseControl: Element | undefined; -let selectedDataSet: Element | undefined | null; - -function onOpenDocResetSelectedGooseMsg() { - selectedGseControl = undefined; - selectedDataSet = undefined; -} -addEventListener('open-doc', onOpenDocResetSelectedGooseMsg); - -/** An sub element for showing all published GOOSE messages per IED. */ -@customElement('goose-list') -export class GooseList extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - private onSelect(gseControl: Element): void { - if (gseControl == selectedGseControl) return; - - const ln = gseControl.parentElement; - const dataset = ln?.querySelector( - `DataSet[name=${gseControl.getAttribute('datSet')}]` - ); - - selectedGseControl = gseControl; - selectedDataSet = dataset; - - this.dispatchEvent( - newGOOSESelectEvent(selectedGseControl, selectedDataSet!) - ); - - this.requestUpdate(); - } - - renderGoose(gseControl: Element): TemplateResult { - return html` this.onSelect(gseControl)} - graphic="large" - hasMeta - value="${identity(gseControl)}" - > - ${gooseIcon} - ${gseControl.getAttribute('name')} - this.openEditWizard(gseControl)} - > - `; - } - - private openEditWizard(gseControl: Element): void { - const wizard = wizards['GSEControl'].edit(gseControl); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - protected updated(): void { - this.dispatchEvent( - newGOOSESelectEvent(selectedGseControl, selectedDataSet ?? undefined) - ); - } - - protected firstUpdated(): void { - selectedGseControl = undefined; - selectedDataSet = undefined; - } - - render(): TemplateResult { - return html`
    -

    ${translate('subscription.goose.publisher.title')}

    - - ${getOrderedIeds(this.doc).map( - ied => - html` - - ${getNameAttribute(ied)} - developer_board - -
  • - ${Array.from( - ied.querySelectorAll( - ':scope > AccessPoint > Server > LDevice > LN0 > GSEControl' - ) - ) - .filter(cb => cb.hasAttribute('datSet')) - .map(control => this.renderGoose(control))} - ` - )} -
    -
    `; - } - - static styles = css` - ${styles} - - mwc-list-item { - --mdc-list-item-meta-size: 48px; - } - - mwc-icon-button.hidden { - display: none; - } - - mwc-list-item.hidden[noninteractive] + li[divider] { - display: none; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/subscription/goose/subscriber-list.ts b/packages/compas-open-scd/src/editors/subscription/goose/subscriber-list.ts deleted file mode 100644 index 7600fb1d1..000000000 --- a/packages/compas-open-scd/src/editors/subscription/goose/subscriber-list.ts +++ /dev/null @@ -1,495 +0,0 @@ -import { - css, - customElement, - html, - property, - TemplateResult, -} from 'lit-element'; -import { nothing } from 'lit-html'; -import { get, translate } from 'lit-translate'; - -import '@material/mwc-icon'; -import '@material/mwc-list'; -import '@material/mwc-list/mwc-list-item'; - -import '../../../filtered-list.js'; -import { - ComplexAction, - Create, - createElement, - Delete, - identity, - Move, - newActionEvent, -} from '../../../foundation.js'; -import { - GOOSESelectEvent, - GooseSubscriptionEvent, - newGooseSubscriptionEvent, -} from './foundation.js'; -import { emptyInputsDeleteActions } from '../../../foundation/ied.js'; -import { - canCreateValidExtRef, - createExtRefElement, - existExtRef, - getExistingSupervision, - getExtRef, - getFirstSubscribedExtRef, - IEDSelectEvent, - instantiateSubscriptionSupervision, - ListElement, - removeSubscriptionSupervision, - styles, - SubscriberListContainer, - SubscribeStatus, - View, - ViewEvent, -} from '../foundation.js'; - -/** Defining view outside the class, which makes it persistent. */ -let view: View = View.PUBLISHER; - -/** An sub element for subscribing and unsubscribing IEDs to GOOSE messages. */ -@customElement('subscriber-list-goose') -export class SubscriberList extends SubscriberListContainer { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - /** Current selected GOOSE message (when in GOOSE Publisher view) */ - currentSelectedGseControl: Element | undefined; - - /** The name of the IED belonging to the current selected GOOSE */ - currentGooseIedName: string | undefined | null; - - constructor() { - super(); - this.onIEDSelectEvent = this.onIEDSelectEvent.bind(this); - this.onGOOSESelectEvent = this.onGOOSESelectEvent.bind(this); - this.onGooseSubscriptionEvent = this.onGooseSubscriptionEvent.bind(this); - this.onViewChange = this.onViewChange.bind(this); - - const parentDiv = this.closest('.container'); - if (parentDiv) { - parentDiv.addEventListener('ied-select', this.onIEDSelectEvent); - parentDiv.addEventListener('goose-select', this.onGOOSESelectEvent); - parentDiv.addEventListener( - 'goose-subscription', - this.onGooseSubscriptionEvent - ); - parentDiv.addEventListener('view', this.onViewChange); - } - } - - private async onIEDSelectEvent(event: IEDSelectEvent) { - if (!event.detail.ied) return; - this.currentSelectedIed = event.detail.ied!; - - this.resetElements(); - - const subscribedInputs = this.currentSelectedIed.querySelectorAll( - `LN0 > Inputs, LN > Inputs` - ); - - Array.from(this.doc.querySelectorAll('GSEControl')) - .filter(cb => cb.hasAttribute('datSet')) - .forEach(control => { - const ied = control.closest('IED')!; - - if ( - ied.getAttribute('name') == - this.currentSelectedIed?.getAttribute('name') - ) - return; - - /** If no Inputs is available, it's automatically available. */ - if (subscribedInputs.length == 0) { - this.availableElements.push({ element: control }); - return; - } - - let numberOfLinkedExtRefs = 0; - const dataSet = ied.querySelector( - `DataSet[name="${control.getAttribute('datSet')}"]` - ); - - if (!dataSet) return; - - dataSet!.querySelectorAll('FCDA').forEach(fcda => { - subscribedInputs.forEach(inputs => { - if (getExtRef(inputs, fcda, control)) { - numberOfLinkedExtRefs++; - } - }); - }); - - if (numberOfLinkedExtRefs == 0) { - this.availableElements.push({ element: control }); - return; - } - - if (numberOfLinkedExtRefs >= dataSet!.querySelectorAll('FCDA').length) { - this.subscribedElements.push({ element: control }); - } else { - this.availableElements.push({ element: control, partial: true }); - } - }); - - this.requestUpdate(); - } - - private async onGOOSESelectEvent(event: GOOSESelectEvent) { - if (!event.detail.dataset || !event.detail.gseControl) return; - - this.currentSelectedGseControl = event.detail.gseControl; - this.currentUsedDataset = event.detail.dataset; - this.currentGooseIedName = this.currentSelectedGseControl - ?.closest('IED') - ?.getAttribute('name'); - - this.resetElements(); - - Array.from(this.doc.querySelectorAll(':root > IED')) - .filter(ied => ied.getAttribute('name') != this.currentGooseIedName) - .forEach(ied => { - const inputElements = ied.querySelectorAll(`LN0 > Inputs, LN > Inputs`); - - let numberOfLinkedExtRefs = 0; - - /** - * If no Inputs element is found, we can safely say it's not subscribed. - */ - if (!inputElements) { - this.availableElements.push({ element: ied }); - return; - } - - /** - * Count all the linked ExtRefs. - */ - this.currentUsedDataset!.querySelectorAll('FCDA').forEach(fcda => { - inputElements.forEach(inputs => { - if (getExtRef(inputs, fcda, this.currentSelectedGseControl)) { - numberOfLinkedExtRefs++; - } - }); - }); - - /** - * Make a distinction between not subscribed at all, - * partially subscribed and fully subscribed. - */ - if (numberOfLinkedExtRefs == 0) { - this.availableElements.push({ element: ied }); - return; - } - - if ( - numberOfLinkedExtRefs >= - this.currentUsedDataset!.querySelectorAll('FCDA').length - ) { - this.subscribedElements.push({ element: ied }); - } else { - this.availableElements.push({ element: ied, partial: true }); - } - }); - - this.requestUpdate(); - } - - private async onGooseSubscriptionEvent(event: GooseSubscriptionEvent) { - let iedToSubscribe = event.detail.element; - - if (view == View.SUBSCRIBER) { - const dataSetName = event.detail.element.getAttribute('datSet'); - this.currentUsedDataset = - event.detail.element.parentElement?.querySelector( - `DataSet[name="${dataSetName}"]` - ); - this.currentSelectedGseControl = event.detail.element; - this.currentGooseIedName = event.detail.element - .closest('IED') - ?.getAttribute('name'); - iedToSubscribe = this.currentSelectedIed!; - } - - switch (event.detail.subscribeStatus) { - case SubscribeStatus.Full: { - this.unsubscribe(iedToSubscribe); - break; - } - case SubscribeStatus.Partial: { - this.subscribe(iedToSubscribe); - break; - } - case SubscribeStatus.None: { - this.subscribe(iedToSubscribe); - break; - } - } - } - - private async onViewChange(event: ViewEvent) { - view = event.detail.view; - - this.currentSelectedIed = undefined; - this.currentSelectedGseControl = undefined; - - this.resetElements(); - this.requestUpdate(); - } - - private async subscribe(ied: Element): Promise { - if (!ied.querySelector('LN0')) return; - - let inputsElement = ied.querySelector('LN0 > Inputs'); - if (!inputsElement) - inputsElement = createElement(ied.ownerDocument, 'Inputs', {}); - - const complexAction: ComplexAction = { - actions: [], - title: get(`subscription.connect`), - }; - - this.currentUsedDataset!.querySelectorAll('FCDA').forEach(fcda => { - if ( - !existExtRef(inputsElement!, fcda, this.currentSelectedGseControl) && - canCreateValidExtRef(fcda, this.currentSelectedGseControl) - ) { - const extRef = createExtRefElement( - this.currentSelectedGseControl, - fcda - ); - - if (inputsElement?.parentElement) - complexAction.actions.push({ - new: { parent: inputsElement!, element: extRef }, - }); - else inputsElement?.appendChild(extRef); - } - }); - - // we need to extend the actions array with the actions for the instantiation of the LGOS - const supervisionActions = instantiateSubscriptionSupervision( - this.currentSelectedGseControl, - ied - ); - if (inputsElement.parentElement) { - complexAction.actions.concat(supervisionActions); - } else { - /** If the IED doesn't have a Inputs element, just append it to the first LN0 element. */ - const inputAction: (Create | Move)[] = [ - { - new: { parent: ied.querySelector('LN0')!, element: inputsElement }, - }, - ]; - complexAction.actions = inputAction.concat(supervisionActions); - } - this.dispatchEvent(newActionEvent(complexAction)); - } - - private async unsubscribe(ied: Element): Promise { - const actions: Delete[] = []; - ied.querySelectorAll('LN0 > Inputs, LN > Inputs').forEach(inputs => { - this.currentUsedDataset!.querySelectorAll('FCDA').forEach(fcda => { - const extRef = getExtRef(inputs, fcda, this.currentSelectedGseControl); - if (extRef) actions.push({ old: { parent: inputs, element: extRef } }); - }); - }); - - // Check if empty Input Element should also be removed. - actions.push(...emptyInputsDeleteActions(actions)); - - // we need to extend the actions array with the actions for removing the supervision - actions.push( - ...removeSubscriptionSupervision(this.currentSelectedGseControl, ied) - ); - - this.dispatchEvent( - newActionEvent({ - title: get('subscription.disconnect'), - actions: actions, - }) - ); - } - - renderSubscriber(status: SubscribeStatus, element: Element): TemplateResult { - let firstSubscribedExtRef: Element | null = null; - let supervisionNode: Element | null = null; - if (status !== SubscribeStatus.None) { - if (view === View.PUBLISHER) { - firstSubscribedExtRef = getFirstSubscribedExtRef( - this.currentSelectedGseControl!, - element - ); - supervisionNode = getExistingSupervision(firstSubscribedExtRef!); - } else { - firstSubscribedExtRef = getFirstSubscribedExtRef( - element, - this.currentSelectedIed! - ); - supervisionNode = getExistingSupervision(firstSubscribedExtRef!); - } - } - return html` { - this.dispatchEvent( - newGooseSubscriptionEvent(element, status ?? SubscribeStatus.None) - ); - }} - graphic="avatar" - ?hasMeta=${supervisionNode !== null} - > - ${view == View.PUBLISHER - ? element.getAttribute('name') - : element.getAttribute('name') + - ` (${element.closest('IED')?.getAttribute('name')})`} - ${status == SubscribeStatus.Full ? html`clear` : html`add`} - ${supervisionNode !== null - ? html`monitor_heart` - : nothing} - `; - } - - renderUnSubscribers(elements: ListElement[]): TemplateResult { - return html` - ${translate('subscription.subscriber.availableToSubscribe')} - -
  • - ${elements.length > 0 - ? elements.map(element => - this.renderSubscriber(SubscribeStatus.None, element.element) - ) - : html` - ${translate('subscription.none')} - `}`; - } - - renderPartiallySubscribers(elements: ListElement[]): TemplateResult { - return html` - ${translate('subscription.subscriber.partiallySubscribed')} - -
  • - ${elements.length > 0 - ? elements.map(element => - this.renderSubscriber(SubscribeStatus.Partial, element.element) - ) - : html` - ${translate('subscription.none')} - `}`; - } - - renderFullSubscribers(): TemplateResult { - return html` - ${translate('subscription.subscriber.subscribed')} - -
  • - ${this.subscribedElements.length > 0 - ? this.subscribedElements.map(element => - this.renderSubscriber(SubscribeStatus.Full, element.element) - ) - : html` - ${translate('subscription.none')} - `}`; - } - - renderTitle(): TemplateResult { - const gseControlName = - this.currentSelectedGseControl?.getAttribute('name') ?? undefined; - - return view == View.PUBLISHER - ? html`

    - ${translate('subscription.goose.publisher.subscriberTitle', { - selected: gseControlName - ? this.currentGooseIedName + ' > ' + gseControlName - : 'GOOSE', - })} -

    ` - : html`

    - ${translate('subscription.goose.subscriber.publisherTitle', { - selected: this.currentSelectedIed - ? this.currentSelectedIed.getAttribute('name')! - : 'IED', - })} -

    `; - } - - protected firstUpdated(): void { - this.currentSelectedIed = undefined; - } - - render(): TemplateResult { - return html` -
    - ${this.renderTitle()} - ${this.availableElements.length != 0 || - this.subscribedElements.length != 0 - ? html`
    - - ${this.renderFullSubscribers()} - ${this.renderPartiallySubscribers( - this.availableElements.filter(element => element.partial) - )} - ${this.renderUnSubscribers( - this.availableElements.filter(element => !element.partial) - )} - -
    ` - : html` - - ${ - view == View.PUBLISHER - ? translate( - 'subscription.subscriber.noControlBlockSelected' - ) - : translate('subscription.subscriber.noIedSelected') - } - - - `} -
    - `; - } - - static styles = css` - ${styles} - - .wrapper { - height: 100vh; - overflow-y: scroll; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/subscription/ied-list.ts b/packages/compas-open-scd/src/editors/subscription/ied-list.ts deleted file mode 100644 index b5fbb6ce5..000000000 --- a/packages/compas-open-scd/src/editors/subscription/ied-list.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-icon'; -import '@material/mwc-list/mwc-list-item'; - -import '../../filtered-list.js'; -import { getNameAttribute } from '../../foundation.js'; -import { getOrderedIeds, newIEDSelectEvent, styles } from './foundation.js'; - -let selectedIed: Element | undefined; - -function onOpenDocResetSelectedGooseMsg() { - selectedIed = undefined; -} -addEventListener('open-doc', onOpenDocResetSelectedGooseMsg); - -@customElement('ied-list') -export class IedList extends LitElement { - @property() - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - @property({ type: String }) - serviceType?: 'goose' | 'smv'; - - private onIedSelect(element: Element): void { - selectedIed = element; - - this.dispatchEvent(newIEDSelectEvent(selectedIed)); - } - - protected updated(): void { - this.dispatchEvent(newIEDSelectEvent(selectedIed)); - } - - protected firstUpdated(): void { - selectedIed = undefined; - } - - render(): TemplateResult { - return html`
    -

    - ${translate(`subscription.${this.serviceType}.subscriber.iedListTitle`)} -

    - - ${getOrderedIeds(this.doc).map( - ied => - html` - this.onIedSelect(ied)} - graphic="icon" - > - ${getNameAttribute(ied)} - developer_board - - ` - )} - -
    `; - } - - static styles = css` - ${styles} - `; -} diff --git a/packages/compas-open-scd/src/editors/subscription/later-binding/ext-ref-later-binding-list.ts b/packages/compas-open-scd/src/editors/subscription/later-binding/ext-ref-later-binding-list.ts deleted file mode 100644 index 3b3c0a2ba..000000000 --- a/packages/compas-open-scd/src/editors/subscription/later-binding/ext-ref-later-binding-list.ts +++ /dev/null @@ -1,392 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - state, - TemplateResult, -} from 'lit-element'; -import { nothing } from 'lit-html'; -import { get, translate } from 'lit-translate'; - -import { - cloneElement, - ComplexAction, - Delete, - getDescriptionAttribute, - identity, - newActionEvent, -} from '../../../foundation.js'; - -import { - getExistingSupervision, - styles, - updateExtRefElement, - serviceTypes, - instantiateSubscriptionSupervision, - removeSubscriptionSupervision, - FcdaSelectEvent, - newSubscriptionChangedEvent, - canRemoveSubscriptionSupervision, -} from '../foundation.js'; - -import { - getExtRefElements, - getSubscribedExtRefElements, - fcdaSpecification, - inputRestriction, - isSubscribed, -} from './foundation.js'; - -/** - * A sub element for showing all Ext Refs from a FCDA Element. - * The List reacts on a custom event to know which FCDA Element was selected and updated the view. - */ -@customElement('extref-later-binding-list') -export class ExtRefLaterBindingList extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - @property() - controlTag!: 'SampledValueControl' | 'GSEControl'; - - @state() - currentSelectedControlElement: Element | undefined; - @state() - currentSelectedFcdaElement: Element | undefined; - @state() - currentIedElement: Element | undefined; - - serviceTypeLookup = { - GSEControl: 'GOOSE', - SampledValueControl: 'SMV', - }; - - constructor() { - super(); - - const parentDiv = this.closest('.container'); - if (parentDiv) { - this.onFcdaSelectEvent = this.onFcdaSelectEvent.bind(this); - parentDiv.addEventListener('fcda-select', this.onFcdaSelectEvent); - } - } - - private async onFcdaSelectEvent(event: FcdaSelectEvent) { - this.currentSelectedControlElement = event.detail.control; - this.currentSelectedFcdaElement = event.detail.fcda; - - // Retrieve the IED Element to which the FCDA belongs. - // These ExtRef Elements will be excluded. - this.currentIedElement = this.currentSelectedFcdaElement - ? this.currentSelectedFcdaElement.closest('IED') ?? undefined - : undefined; - } - - /** - * Check data consistency of source `FCDA` and sink `ExtRef` based on - * `ExtRef`'s `pLN`, `pDO`, `pDA` and `pServT` attributes. - * Consistent means `CDC` and `bType` of both ExtRef and FCDA is equal. - * In case - * - `pLN`, `pDO`, `pDA` or `pServT` attributes are not present, allow subscribing - * - no CDC or bType can be extracted, do not allow subscribing - * - * @param extRef - The `ExtRef` Element to check against - */ - private unsupportedExtRefElement(extRef: Element): boolean { - // Vendor does not provide data for the check - if ( - !extRef.hasAttribute('pLN') || - !extRef.hasAttribute('pDO') || - !extRef.hasAttribute('pDA') || - !extRef.hasAttribute('pServT') - ) - return false; - - // Not ready for any kind of subscription - if (!this.currentSelectedFcdaElement) return true; - - const fcda = fcdaSpecification(this.currentSelectedFcdaElement); - const input = inputRestriction(extRef); - - if (fcda.cdc === null && input.cdc === null) return true; - if (fcda.bType === null && input.bType === null) return true; - if ( - serviceTypes[this.currentSelectedControlElement?.tagName ?? ''] !== - extRef.getAttribute('pServT') - ) - return true; - - return fcda.cdc !== input.cdc || fcda.bType !== input.bType; - } - - /** - * Unsubscribing means removing a list of attributes from the ExtRef Element. - * - * @param extRefElement - The Ext Ref Element to clean from attributes. - */ - private unsubscribe(extRefElement: Element): void { - if ( - !this.currentIedElement || - !this.currentSelectedFcdaElement || - !this.currentSelectedControlElement! - ) { - return; - } - const clonedExtRefElement = cloneElement(extRefElement, { - iedName: null, - ldInst: null, - prefix: null, - lnClass: null, - lnInst: null, - doName: null, - daName: null, - serviceType: null, - srcLDInst: null, - srcPrefix: null, - srcLNClass: null, - srcLNInst: null, - srcCBName: null, - }); - - const replaceAction = { - old: { element: extRefElement }, - new: { element: clonedExtRefElement }, - }; - - const subscriberIed = extRefElement.closest('IED') || undefined; - const removeSubscriptionActions: Delete[] = []; - if (canRemoveSubscriptionSupervision(extRefElement)) - removeSubscriptionActions.push( - ...removeSubscriptionSupervision( - this.currentSelectedControlElement, - subscriberIed - ) - ); - - this.dispatchEvent( - newActionEvent({ - title: get(`subscription.disconnect`), - actions: [replaceAction, ...removeSubscriptionActions], - }) - ); - this.dispatchEvent( - newSubscriptionChangedEvent( - this.currentSelectedControlElement, - this.currentSelectedFcdaElement - ) - ); - } - - /** - * Subscribing means copying a list of attributes from the FCDA Element (and others) to the ExtRef Element. - * - * @param extRefElement - The Ext Ref Element to add the attributes to. - */ - private subscribe(extRefElement: Element): void { - if ( - !this.currentIedElement || - !this.currentSelectedFcdaElement || - !this.currentSelectedControlElement! - ) { - return; - } - - const complexAction: ComplexAction = { - actions: [], - title: get(`subscription.connect`), - }; - - const replaceAction = { - old: { element: extRefElement }, - new: { - element: updateExtRefElement( - extRefElement, - this.currentSelectedControlElement, - this.currentSelectedFcdaElement - ), - }, - }; - complexAction.actions.push(replaceAction); - - const subscriberIed = extRefElement.closest('IED') || undefined; - - complexAction.actions.push( - ...instantiateSubscriptionSupervision( - this.currentSelectedControlElement, - subscriberIed - ) - ); - - this.dispatchEvent(newActionEvent(complexAction)); - this.dispatchEvent( - newSubscriptionChangedEvent( - this.currentSelectedControlElement, - this.currentSelectedFcdaElement - ) - ); - } - - private getSubscribedExtRefElements(): Element[] { - return getSubscribedExtRefElements( - this.doc.getRootNode(), - this.controlTag, - this.currentSelectedFcdaElement, - this.currentSelectedControlElement, - true - ); - } - - private getAvailableExtRefElements(): Element[] { - return getExtRefElements( - this.doc.getRootNode(), - this.currentSelectedFcdaElement, - true - ).filter( - extRefElement => - !isSubscribed(extRefElement) && - (!extRefElement.hasAttribute('serviceType') || - extRefElement.getAttribute('serviceType') === - this.serviceTypeLookup[this.controlTag]) - ); - } - - private renderTitle(): TemplateResult { - return html`

    - ${translate(`subscription.laterBinding.extRefList.title`)} -

    `; - } - - private renderExtRefElement(extRefElement: Element): TemplateResult { - const supervisionNode = getExistingSupervision(extRefElement); - return html` this.unsubscribe(extRefElement)} - value="${identity(extRefElement)}" - > - - ${extRefElement.getAttribute('intAddr')} - ${getDescriptionAttribute(extRefElement) - ? html` (${getDescriptionAttribute(extRefElement)})` - : nothing} - - ${identity(extRefElement.parentElement)}${supervisionNode !== null - ? ` (${identity(supervisionNode)})` - : ''} - swap_horiz - ${supervisionNode !== null - ? html`monitor_heart` - : nothing} - `; - } - - private renderSubscribedExtRefs(): TemplateResult { - const subscribedExtRefs = this.getSubscribedExtRefElements(); - return html` - - ${translate('subscription.subscriber.subscribed')} - -
  • - ${subscribedExtRefs.length > 0 - ? html`${subscribedExtRefs.map(extRefElement => - this.renderExtRefElement(extRefElement) - )}` - : html` - ${translate( - 'subscription.laterBinding.extRefList.noSubscribedExtRefs' - )} - `} - `; - } - - private renderAvailableExtRefs(): TemplateResult { - const availableExtRefs = this.getAvailableExtRefElements(); - return html` - - - ${translate('subscription.subscriber.availableToSubscribe')} - - -
  • - ${availableExtRefs.length > 0 - ? html`${availableExtRefs.map( - extRefElement => html` this.subscribe(extRefElement)} - value="${identity(extRefElement)}" - > - - ${extRefElement.getAttribute('intAddr')} - ${getDescriptionAttribute(extRefElement) - ? html` (${getDescriptionAttribute(extRefElement)})` - : nothing} - - ${identity(extRefElement.parentElement)} - arrow_back - ` - )}` - : html` - ${translate( - 'subscription.laterBinding.extRefList.noAvailableExtRefs' - )} - `} - `; - } - - render(): TemplateResult { - return html`
    - ${this.currentSelectedControlElement && this.currentSelectedFcdaElement - ? html` - ${this.renderTitle()} - - ${this.renderSubscribedExtRefs()} ${this.renderAvailableExtRefs()} - - ` - : html` -

    - ${translate('subscription.laterBinding.extRefList.noSelection')} -

    - `} -
    `; - } - - static styles = css` - ${styles} - - mwc-list-item.hidden[noninteractive] + li[divider] { - display: none; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/subscription/later-binding/ext-ref-ln-binding-list.ts b/packages/compas-open-scd/src/editors/subscription/later-binding/ext-ref-ln-binding-list.ts deleted file mode 100644 index c7b1ca825..000000000 --- a/packages/compas-open-scd/src/editors/subscription/later-binding/ext-ref-ln-binding-list.ts +++ /dev/null @@ -1,373 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - state, - TemplateResult, -} from 'lit-element'; -import { nothing } from 'lit-html'; -import { get, translate } from 'lit-translate'; - -import { - ComplexAction, - createElement, - Delete, - identity, - newActionEvent, -} from '../../../foundation.js'; -import { Nsdoc } from '../../../foundation/nsdoc.js'; - -import { - canCreateValidExtRef, - createExtRefElement, - existExtRef, - FcdaSelectEvent, - getExtRef, - getExistingSupervision, - newSubscriptionChangedEvent, - removeSubscriptionSupervision, - instantiateSubscriptionSupervision, - styles, - canRemoveSubscriptionSupervision, -} from '../foundation.js'; -import { getSubscribedExtRefElements } from './foundation.js'; -import { emptyInputsDeleteActions } from '../../../foundation/ied.js'; - -/** - * A sub element for showing all Ext Refs from a FCDA Element. - * The List reacts on a custom event to know which FCDA Element was selected and updated the view. - */ -@customElement('extref-ln-binding-list') -export class ExtRefLnBindingList extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - @property() - nsdoc!: Nsdoc; - @property() - controlTag!: 'SampledValueControl' | 'GSEControl'; - - @state() - currentSelectedControlElement: Element | undefined; - @state() - currentSelectedFcdaElement: Element | undefined; - @state() - currentIedElement: Element | undefined; - - constructor() { - super(); - - const parentDiv = this.closest('.container'); - if (parentDiv) { - this.onFcdaSelectEvent = this.onFcdaSelectEvent.bind(this); - parentDiv.addEventListener('fcda-select', this.onFcdaSelectEvent); - } - } - - private getLNElements(): Element[] { - if (this.doc) { - return Array.from( - this.doc.querySelectorAll('LDevice > LN0, LDevice > LN') - ).filter(element => element.closest('IED') !== this.currentIedElement); - } - return []; - } - - private getSubscribedLNElements(): Element[] { - return this.getLNElements().filter( - element => - getSubscribedExtRefElements( - element, - this.controlTag, - this.currentSelectedFcdaElement, - this.currentSelectedControlElement, - false - ).length > 0 - ); - } - - private getAvailableLNElements(): Element[] { - return this.getLNElements().filter( - element => - getSubscribedExtRefElements( - element, - this.controlTag, - this.currentSelectedFcdaElement, - this.currentSelectedControlElement, - false - ).length == 0 - ); - } - - private async onFcdaSelectEvent(event: FcdaSelectEvent) { - this.currentSelectedControlElement = event.detail.control; - this.currentSelectedFcdaElement = event.detail.fcda; - - // Retrieve the IED Element to which the FCDA belongs. - // These LN Elements will be excluded. - this.currentIedElement = this.currentSelectedFcdaElement - ? this.currentSelectedFcdaElement.closest('IED') ?? undefined - : undefined; - } - - private subscribe(lnElement: Element): ComplexAction | null { - if ( - !this.currentIedElement || - !this.currentSelectedFcdaElement || - !this.currentSelectedControlElement! - ) { - return null; - } - - const complexAction: ComplexAction = { - actions: [], - title: get(`subscription.connect`), - }; - - let inputsElement = lnElement.querySelector(':scope > Inputs'); - if (!inputsElement) { - inputsElement = createElement(lnElement.ownerDocument, 'Inputs', {}); - complexAction.actions.push({ - new: { parent: lnElement, element: inputsElement }, - }); - } - - if ( - !existExtRef( - inputsElement!, - this.currentSelectedFcdaElement, - this.currentSelectedControlElement - ) && - canCreateValidExtRef( - this.currentSelectedFcdaElement, - this.currentSelectedControlElement - ) - ) { - const extRef = createExtRefElement( - this.currentSelectedControlElement, - this.currentSelectedFcdaElement - ); - complexAction.actions.push({ - new: { parent: inputsElement, element: extRef }, - }); - } - - // we need to extend the actions array with the actions for the instation of the LGOS - const subscriberIed = lnElement.closest('IED') || undefined; - complexAction.actions.push( - ...instantiateSubscriptionSupervision( - this.currentSelectedControlElement, - subscriberIed - ) - ); - - return complexAction; - } - - private unsubscribe(lnElement: Element): ComplexAction | null { - if ( - !this.currentIedElement || - !this.currentSelectedFcdaElement || - !this.currentSelectedControlElement! - ) { - return null; - } - - const actions: Delete[] = []; - const inputElement = lnElement.querySelector(':scope > Inputs')!; - const extRefElement = getExtRef( - inputElement, - this.currentSelectedFcdaElement, - this.currentSelectedControlElement - ); - if (extRefElement) { - actions.push({ old: { parent: inputElement, element: extRefElement } }); - } - - // Check if empty Input Element should also be removed. - actions.push(...emptyInputsDeleteActions(actions)); - - // we need to extend the actions array with the actions for removing the supervision - const subscriberIed = lnElement.closest('IED') || undefined; - if (extRefElement && canRemoveSubscriptionSupervision(extRefElement)) - actions.push( - ...removeSubscriptionSupervision( - this.currentSelectedControlElement, - subscriberIed - ) - ); - - return { - title: get('subscription.disconnect'), - actions: actions, - }; - } - - private bindingNotSupported(lnElement: Element): boolean { - const iedElement = lnElement.closest('IED')!; - return ( - (iedElement - .querySelector( - ':scope > AccessPoint > Services > ClientServices, :scope > Services > ClientServices' - ) - ?.getAttribute('noIctBinding') ?? 'false') === 'true' - ); - } - - private buildLNTitle(lnElement: Element): string { - const prefix = lnElement.getAttribute('prefix'); - const inst = lnElement.getAttribute('inst'); - - const data = this.nsdoc.getDataDescription(lnElement); - - return `${prefix ? `${prefix} - ` : ''}${data.label} ${ - inst ? ` - ${inst}` : '' - }`; - } - - private renderTitle(): TemplateResult { - return html`

    ${translate(`subscription.binding.extRefList.title`)}

    `; - } - - private renderSubscribedLN(lnElement: Element): TemplateResult { - const extRefs = getSubscribedExtRefElements( - lnElement, - this.controlTag, - this.currentSelectedFcdaElement, - this.currentSelectedControlElement, - false - ); - const supervisionNode = getExistingSupervision(extRefs[0]); - return html` { - const replaceAction = this.unsubscribe(lnElement); - if (replaceAction) { - this.dispatchEvent(newActionEvent(replaceAction)); - this.dispatchEvent( - newSubscriptionChangedEvent( - this.currentSelectedControlElement, - this.currentSelectedFcdaElement - ) - ); - } - }} - > - ${this.buildLNTitle(lnElement)} - ${identity(lnElement.closest('LDevice'))} - close - ${supervisionNode !== null - ? html`monitor_heart` - : nothing}`; - } - - private renderSubscribedLNs(): TemplateResult { - const subscribedLNs = this.getSubscribedLNElements(); - return html` - - ${translate('subscription.subscriber.subscribed')} - -
  • - ${subscribedLNs.length > 0 - ? html`${subscribedLNs.map(lN => this.renderSubscribedLN(lN))}` - : html` - ${translate('subscription.binding.extRefList.noSubscribedLNs')} - `} - `; - } - - private renderAvailableLNs(): TemplateResult { - const availableLNs = this.getAvailableLNElements(); - return html` - - - ${translate('subscription.subscriber.availableToSubscribe')} - - -
  • - ${availableLNs.length > 0 - ? html`${availableLNs.map( - lnElement => html` { - const replaceAction = this.subscribe(lnElement); - if (replaceAction) { - this.dispatchEvent(newActionEvent(replaceAction)); - this.dispatchEvent( - newSubscriptionChangedEvent( - this.currentSelectedControlElement, - this.currentSelectedFcdaElement - ) - ); - } - }} - > - ${this.buildLNTitle(lnElement)} - - ${identity(lnElement.closest('LDevice'))} - - add - ` - )}` - : html` - ${translate('subscription.binding.extRefList.noAvailableLNs')} - `} - `; - } - - render(): TemplateResult { - return html`
    - ${this.currentSelectedControlElement && this.currentSelectedFcdaElement - ? html` - ${this.renderTitle()} - - ${this.renderSubscribedLNs()} ${this.renderAvailableLNs()} - - ` - : html` -

    ${translate('subscription.binding.extRefList.noSelection')}

    - `} -
    `; - } - - static styles = css` - ${styles} - - mwc-list-item.hidden[noninteractive] + li[divider] { - display: none; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/subscription/later-binding/foundation.ts b/packages/compas-open-scd/src/editors/subscription/later-binding/foundation.ts deleted file mode 100644 index 0b0a40897..000000000 --- a/packages/compas-open-scd/src/editors/subscription/later-binding/foundation.ts +++ /dev/null @@ -1,272 +0,0 @@ -import { getSclSchemaVersion } from '../../../foundation.js'; -import { serviceTypes } from '../foundation.js'; - -function dataAttributeSpecification( - anyLn: Element, - doName: string, - daName: string -): { cdc: string | null; bType: string | null } { - const doc = anyLn.ownerDocument; - const lNodeType = doc.querySelector( - `LNodeType[id="${anyLn.getAttribute('lnType')}"]` - ); - - const doNames = doName.split('.'); - let leaf: Element | null | undefined = lNodeType; - for (const doName of doNames) { - const dO: Element | null | undefined = leaf?.querySelector( - `DO[name="${doName}"], SDO[name="${doName}"]` - ); - leaf = doc.querySelector(`DOType[id="${dO?.getAttribute('type')}"]`); - } - if (!leaf || !leaf.getAttribute('cdc')) return { cdc: null, bType: null }; - - const cdc = leaf.getAttribute('cdc')!; - - const daNames = daName.split('.'); - for (const daName of daNames) { - const dA: Element | null | undefined = leaf?.querySelector( - `DA[name="${daName}"], BDA[name="${daName}"]` - ); - leaf = - daNames.indexOf(daName) < daNames.length - 1 - ? doc.querySelector(`DAType[id="${dA?.getAttribute('type')}"]`) - : dA; - } - if (!leaf || !leaf.getAttribute('bType')) return { cdc, bType: null }; - - const bType = leaf.getAttribute('bType')!; - - return { bType, cdc }; -} - -/** - * @param fcda - Data attribute reference in a data set - * @returns Data objects `CDC` and data attributes `bType` - */ -export function fcdaSpecification(fcda: Element): { - cdc: string | null; - bType: string | null; -} { - const [doName, daName] = ['doName', 'daName'].map(attr => - fcda.getAttribute(attr) - ); - if (!doName || !daName) return { cdc: null, bType: null }; - - const ied = fcda.closest('IED'); - - const anyLn = Array.from( - ied?.querySelectorAll( - `LDevice[inst="${fcda.getAttribute( - 'ldInst' - )}"] > LN, LDevice[inst="${fcda.getAttribute('inst')}"] LN0` - ) ?? [] - ).find(anyLn => { - return ( - (anyLn.getAttribute('prefix') ?? '') === - (fcda.getAttribute('prefix') ?? '') && - (anyLn.getAttribute('lnClass') ?? '') === - (fcda.getAttribute('lnClass') ?? '') && - (anyLn.getAttribute('inst') ?? '') === (fcda.getAttribute('lnInst') ?? '') - ); - }); - if (!anyLn) return { cdc: null, bType: null }; - - return dataAttributeSpecification(anyLn, doName, daName); -} - -/** - * Edition 2 and later SCL files allow to restrict subscription on - * later binding type inputs (`ExtRef` elements) based on a `CDC` and - * basic type `bType`. - * @param extRef - A later binding type input in the sink IED - * @returns data objects `CDC` and data attribute basic type `bType` or `null` - */ -export function inputRestriction(extRef: Element): { - cdc: string | null; - bType: string | null; -} { - const [pLN, pDO, pDA] = ['pLN', 'pDO', 'pDA'].map(attr => - extRef.getAttribute(attr) - ); - if (!pLN || !pDO || !pDA) return { cdc: null, bType: null }; - - const anyLns = Array.from( - extRef - .closest('IED') - ?.querySelectorAll(`LN[lnClass="${pLN}"],LN0[lnClass="${pLN}"]`) ?? [] - ); - - for (const anyLn of anyLns) { - const dataSpec = dataAttributeSpecification(anyLn, pDO, pDA); - if (dataSpec.cdc !== null && dataSpec.bType !== null) return dataSpec; - } - - return { cdc: null, bType: null }; -} - -/** - * Simple function to check if the attribute of the Left Side has the same value as the attribute of the Right Element. - * - * @param leftElement - The Left Element to check against. - * @param rightElement - The Right Element to check. - * @param attributeName - The name of the attribute to check. - */ -export function sameAttributeValue( - leftElement: Element | undefined, - rightElement: Element | undefined, - attributeName: string -): boolean { - return ( - (leftElement?.getAttribute(attributeName) ?? '') === - (rightElement?.getAttribute(attributeName) ?? '') - ); -} - -/** - * Simple function to check if the attribute of the Left Side has the same value as the attribute of the Right Element. - * - * @param leftElement - The Left Element to check against. - * @param leftAttributeName - The name of the attribute (left) to check against. - * @param rightElement - The Right Element to check. - * @param rightAttributeName - The name of the attribute (right) to check. - */ -export function sameAttributeValueDiffName( - leftElement: Element | undefined, - leftAttributeName: string, - rightElement: Element | undefined, - rightAttributeName: string -): boolean { - return ( - (leftElement?.getAttribute(leftAttributeName) ?? '') === - (rightElement?.getAttribute(rightAttributeName) ?? '') - ); -} - -/** - * If needed check version specific attributes against FCDA Element. - * - * @param controlTag - Indicates which type of control element. - * @param controlElement - The Control Element to check against. - * @param extRefElement - The Ext Ref Element to check. - */ -function checkEditionSpecificRequirements( - controlTag: 'SampledValueControl' | 'GSEControl', - controlElement: Element | undefined, - extRefElement: Element -): boolean { - // For 2003 Edition no extra check needed. - if (getSclSchemaVersion(extRefElement.ownerDocument) === '2003') { - return true; - } - - const lDeviceElement = controlElement?.closest('LDevice') ?? undefined; - const lnElement = controlElement?.closest('LN0') ?? undefined; - - // For the 2007B and 2007B4 Edition we need to check some extra attributes. - return ( - (extRefElement.getAttribute('serviceType') ?? '') === - serviceTypes[controlTag] && - sameAttributeValueDiffName( - extRefElement, - 'srcLDInst', - lDeviceElement, - 'inst' - ) && - sameAttributeValueDiffName( - extRefElement, - 'scrPrefix', - lnElement, - 'prefix' - ) && - sameAttributeValueDiffName( - extRefElement, - 'srcLNClass', - lnElement, - 'lnClass' - ) && - sameAttributeValueDiffName(extRefElement, 'srcLNInst', lnElement, 'inst') && - sameAttributeValueDiffName( - extRefElement, - 'srcCBName', - controlElement, - 'name' - ) - ); -} - -/** - * Check if specific attributes from the ExtRef Element are the same as the ones from the FCDA Element - * and also if the IED Name is the same. If that is the case this ExtRef subscribes to the selected FCDA - * Element. - * - * @param controlTag - Indicates which type of control element. - * @param controlElement - The Control Element to check against. - * @param fcdaElement - The FCDA Element to check against. - * @param extRefElement - The Ext Ref Element to check. - */ -export function isSubscribedTo( - controlTag: 'SampledValueControl' | 'GSEControl', - controlElement: Element | undefined, - fcdaElement: Element | undefined, - extRefElement: Element -): boolean { - return ( - extRefElement.getAttribute('iedName') === - fcdaElement?.closest('IED')?.getAttribute('name') && - sameAttributeValue(fcdaElement, extRefElement, 'ldInst') && - sameAttributeValue(fcdaElement, extRefElement, 'prefix') && - sameAttributeValue(fcdaElement, extRefElement, 'lnClass') && - sameAttributeValue(fcdaElement, extRefElement, 'lnInst') && - sameAttributeValue(fcdaElement, extRefElement, 'doName') && - sameAttributeValue(fcdaElement, extRefElement, 'daName') && - checkEditionSpecificRequirements(controlTag, controlElement, extRefElement) - ); -} - -/** - * Check if the ExtRef is already subscribed to a FCDA Element. - * - * @param extRefElement - The Ext Ref Element to check. - */ -export function isSubscribed(extRefElement: Element): boolean { - return ( - extRefElement.hasAttribute('iedName') && - extRefElement.hasAttribute('ldInst') && - extRefElement.hasAttribute('prefix') && - extRefElement.hasAttribute('lnClass') && - extRefElement.hasAttribute('lnInst') && - extRefElement.hasAttribute('doName') && - extRefElement.hasAttribute('daName') - ); -} - -export function getExtRefElements( - rootElement: Element, - fcdaElement: Element | undefined, - includeLaterBinding: boolean -): Element[] { - return Array.from(rootElement.querySelectorAll('ExtRef')) - .filter( - element => - (includeLaterBinding && element.hasAttribute('intAddr')) || - (!includeLaterBinding && !element.hasAttribute('intAddr')) - ) - .filter(element => element.closest('IED') !== fcdaElement?.closest('IED')); -} - -export function getSubscribedExtRefElements( - rootElement: Element, - controlTag: 'SampledValueControl' | 'GSEControl', - fcdaElement: Element | undefined, - controlElement: Element | undefined, - includeLaterBinding: boolean -): Element[] { - return getExtRefElements( - rootElement, - fcdaElement, - includeLaterBinding - ).filter(extRefElement => - isSubscribedTo(controlTag, controlElement, fcdaElement, extRefElement) - ); -} diff --git a/packages/compas-open-scd/src/editors/subscription/sampledvalues/foundation.ts b/packages/compas-open-scd/src/editors/subscription/sampledvalues/foundation.ts deleted file mode 100644 index 8566b80c6..000000000 --- a/packages/compas-open-scd/src/editors/subscription/sampledvalues/foundation.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { SubscribeStatus } from '../foundation.js'; - -export interface SmvSelectDetail { - smvControl: Element | undefined; - dataset: Element | undefined; -} -export type SmvSelectEvent = CustomEvent; -export function newSmvSelectEvent( - smvControl: Element | undefined, - dataset: Element | undefined, - eventInitDict?: CustomEventInit -): SmvSelectEvent { - return new CustomEvent('smv-select', { - bubbles: true, - composed: true, - ...eventInitDict, - detail: { smvControl: smvControl, dataset, ...eventInitDict?.detail }, - }); -} - -export interface SmvSubscriptionDetail { - element: Element; - subscribeStatus: SubscribeStatus; -} -export type SmvSubscriptionEvent = CustomEvent; -export function newSmvSubscriptionEvent( - element: Element, - subscribeStatus: SubscribeStatus -): SmvSubscriptionEvent { - return new CustomEvent('smv-subscription', { - bubbles: true, - composed: true, - detail: { element, subscribeStatus }, - }); -} - -declare global { - interface ElementEventMap { - ['smv-select']: SmvSelectEvent; - ['smv-subscription']: SmvSubscriptionEvent; - } -} diff --git a/packages/compas-open-scd/src/editors/subscription/sampledvalues/smv-list.ts b/packages/compas-open-scd/src/editors/subscription/sampledvalues/smv-list.ts deleted file mode 100644 index 8da41fc03..000000000 --- a/packages/compas-open-scd/src/editors/subscription/sampledvalues/smv-list.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-icon'; -import '@material/mwc-list'; -import '@material/mwc-list/mwc-list-item'; - -import { - getNameAttribute, - identity, - newWizardEvent, -} from '../../../foundation.js'; -import { newSmvSelectEvent } from './foundation.js'; -import { smvIcon } from '../../../icons/icons.js'; -import { getOrderedIeds, styles } from '../foundation.js'; -import { classMap } from 'lit-html/directives/class-map.js'; -import { wizards } from '../../../wizards/wizard-library.js'; - -let selectedSmvMsg: Element | undefined; -let selectedDataSet: Element | undefined | null; - -function onOpenDocResetSelectedSmvMsg() { - selectedSmvMsg = undefined; - selectedDataSet = undefined; -} -addEventListener('open-doc', onOpenDocResetSelectedSmvMsg); - -/** An sub element for showing all Sampled Values per IED. */ -@customElement('smv-list') -export class SmvPublisherList extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - private onSelect(smvControl: Element) { - const ln = smvControl.parentElement; - const dataset = ln?.querySelector( - `DataSet[name=${smvControl.getAttribute('datSet')}]` - ); - - selectedSmvMsg = smvControl; - selectedDataSet = dataset; - - this.dispatchEvent(newSmvSelectEvent(selectedSmvMsg, selectedDataSet!)); - - this.requestUpdate(); - } - - private openEditWizard(smvControl: Element): void { - const wizard = wizards['SampledValueControl'].edit(smvControl); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - protected updated(): void { - this.dispatchEvent( - newSmvSelectEvent(selectedSmvMsg, selectedDataSet ?? undefined) - ); - } - - protected firstUpdated(): void { - selectedSmvMsg = undefined; - selectedDataSet = undefined; - } - - renderSmv(smvControl: Element): TemplateResult { - return html` this.onSelect(smvControl)} - graphic="large" - hasMeta - value="${identity(smvControl)}" - > - ${smvIcon} - ${smvControl.getAttribute('name')} - this.openEditWizard(smvControl)} - > - `; - } - - render(): TemplateResult { - return html`
    -

    ${translate('subscription.smv.publisher.title')}

    - - ${getOrderedIeds(this.doc).map( - ied => - html` - - ${getNameAttribute(ied)} - developer_board - -
  • - ${Array.from( - ied.querySelectorAll( - ':scope > AccessPoint > Server > LDevice > LN0 > SampledValueControl' - ) - ) - .filter(cb => cb.hasAttribute('datSet')) - .map(control => this.renderSmv(control))} - ` - )} -
    -
    `; - } - - static styles = css` - ${styles} - - mwc-list-item { - --mdc-list-item-meta-size: 48px; - } - - mwc-icon-button.hidden { - display: none; - } - - mwc-list-item.hidden[noninteractive] + li[divider] { - display: none; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/subscription/sampledvalues/subscriber-list.ts b/packages/compas-open-scd/src/editors/subscription/sampledvalues/subscriber-list.ts deleted file mode 100644 index 2ebe04875..000000000 --- a/packages/compas-open-scd/src/editors/subscription/sampledvalues/subscriber-list.ts +++ /dev/null @@ -1,498 +0,0 @@ -import { - css, - customElement, - html, - property, - TemplateResult, -} from 'lit-element'; -import { nothing } from 'lit-html'; -import { get, translate } from 'lit-translate'; - -import '@material/mwc-icon'; -import '@material/mwc-list'; -import '@material/mwc-list/mwc-list-item'; - -import '../../../filtered-list.js'; -import { - ComplexAction, - Create, - createElement, - Delete, - identity, - Move, - newActionEvent, -} from '../../../foundation.js'; -import { - newSmvSubscriptionEvent, - SmvSelectEvent, - SmvSubscriptionEvent, -} from './foundation.js'; -import { emptyInputsDeleteActions } from '../../../foundation/ied.js'; -import { - canCreateValidExtRef, - createExtRefElement, - existExtRef, - getExistingSupervision, - getExtRef, - getFirstSubscribedExtRef, - IEDSelectEvent, - instantiateSubscriptionSupervision, - ListElement, - removeSubscriptionSupervision, - styles, - SubscriberListContainer, - SubscribeStatus, - View, - ViewEvent, -} from '../foundation.js'; - -/** Defining view outside the class, which makes it persistent. */ -let view: View = View.PUBLISHER; - -/** An sub element for subscribing and unsubscribing IEDs to Sampled Values messages. */ -@customElement('subscriber-list-smv') -export class SubscriberList extends SubscriberListContainer { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - /** Current selected Sampled Values element (when in GOOSE Publisher view) */ - currentSelectedSmvControl: Element | undefined; - - /** The name of the IED belonging to the current selected Sampled Values */ - currentSmvIedName: string | undefined | null; - - constructor() { - super(); - this.onIEDSelectEvent = this.onIEDSelectEvent.bind(this); - this.onSmvSelectEvent = this.onSmvSelectEvent.bind(this); - this.onIEDSubscriptionEvent = this.onIEDSubscriptionEvent.bind(this); - this.onViewChange = this.onViewChange.bind(this); - - const parentDiv = this.closest('.container'); - if (parentDiv) { - parentDiv.addEventListener('ied-select', this.onIEDSelectEvent); - parentDiv.addEventListener('smv-select', this.onSmvSelectEvent); - parentDiv.addEventListener( - 'smv-subscription', - this.onIEDSubscriptionEvent - ); - parentDiv.addEventListener('view', this.onViewChange); - } - } - - private async onIEDSelectEvent(event: IEDSelectEvent) { - if (!event.detail.ied) return; - this.currentSelectedIed = event.detail.ied!; - - this.resetElements(); - - const subscribedInputs = this.currentSelectedIed.querySelectorAll( - `LN0 > Inputs, LN > Inputs` - ); - - Array.from(this.doc.querySelectorAll('SampledValueControl')) - .filter(cb => cb.hasAttribute('datSet')) - .forEach(control => { - const ied = control.closest('IED')!; - - if ( - ied.getAttribute('name') == - this.currentSelectedIed?.getAttribute('name') - ) - return; - - /** If no Inputs is available, it's automatically available. */ - if (subscribedInputs.length == 0) { - this.availableElements.push({ element: control }); - return; - } - - let numberOfLinkedExtRefs = 0; - const dataSet = ied.querySelector( - `DataSet[name="${control.getAttribute('datSet')}"]` - ); - - if (!dataSet) return; - - dataSet!.querySelectorAll('FCDA').forEach(fcda => { - subscribedInputs.forEach(inputs => { - if (getExtRef(inputs, fcda, this.currentSelectedSmvControl)) { - numberOfLinkedExtRefs++; - } - }); - }); - - if (numberOfLinkedExtRefs == 0) { - this.availableElements.push({ element: control }); - return; - } - - if (numberOfLinkedExtRefs >= dataSet!.querySelectorAll('FCDA').length) { - this.subscribedElements.push({ element: control }); - } else { - this.availableElements.push({ element: control, partial: true }); - } - }); - - this.requestUpdate(); - } - - private async onSmvSelectEvent(event: SmvSelectEvent) { - if (!event.detail.dataset || !event.detail.smvControl) return; - - this.currentSelectedSmvControl = event.detail.smvControl; - this.currentUsedDataset = event.detail.dataset; - - this.currentSmvIedName = this.currentSelectedSmvControl - ?.closest('IED') - ?.getAttribute('name'); - - this.subscribedElements = []; - this.availableElements = []; - - Array.from(this.doc.querySelectorAll(':root > IED')) - .filter(ied => ied.getAttribute('name') != this.currentSmvIedName) - .forEach(ied => { - const inputElements = ied.querySelectorAll(`LN0 > Inputs, LN > Inputs`); - - let numberOfLinkedExtRefs = 0; - - /** - * If no Inputs element is found, we can safely say it's not subscribed. - */ - if (!inputElements) { - this.availableElements.push({ element: ied }); - return; - } - - /** - * Count all the linked ExtRefs. - */ - this.currentUsedDataset!.querySelectorAll('FCDA').forEach(fcda => { - inputElements.forEach(inputs => { - if (getExtRef(inputs, fcda, this.currentSelectedSmvControl)) { - numberOfLinkedExtRefs++; - } - }); - }); - - /** - * Make a distinction between not subscribed at all, - * partially subscribed and fully subscribed. - */ - if (numberOfLinkedExtRefs == 0) { - this.availableElements.push({ element: ied }); - return; - } - - if ( - numberOfLinkedExtRefs >= - this.currentUsedDataset!.querySelectorAll('FCDA').length - ) { - this.subscribedElements.push({ element: ied }); - } else { - this.availableElements.push({ element: ied, partial: true }); - } - }); - - this.requestUpdate(); - } - - private async onIEDSubscriptionEvent(event: SmvSubscriptionEvent) { - let iedToSubscribe = event.detail.element; - - if (view == View.SUBSCRIBER) { - const dataSetName = event.detail.element.getAttribute('datSet'); - this.currentUsedDataset = - event.detail.element.parentElement?.querySelector( - `DataSet[name="${dataSetName}"]` - ); - this.currentSelectedSmvControl = event.detail.element; - this.currentSmvIedName = event.detail.element - .closest('IED') - ?.getAttribute('name'); - iedToSubscribe = this.currentSelectedIed!; - } - - switch (event.detail.subscribeStatus) { - case SubscribeStatus.Full: { - this.unsubscribe(iedToSubscribe); - break; - } - case SubscribeStatus.Partial: { - this.subscribe(iedToSubscribe); - break; - } - case SubscribeStatus.None: { - this.subscribe(iedToSubscribe); - break; - } - } - } - - private async onViewChange(event: ViewEvent) { - view = event.detail.view; - - this.currentSelectedIed = undefined; - this.currentSelectedSmvControl = undefined; - - this.resetElements(); - this.requestUpdate(); - } - - private async subscribe(ied: Element): Promise { - if (!ied.querySelector('LN0')) return; - - let inputsElement = ied.querySelector('LN0 > Inputs'); - if (!inputsElement) - inputsElement = createElement(ied.ownerDocument, 'Inputs', {}); - - const complexAction: ComplexAction = { - actions: [], - title: get(`subscription.connect`), - }; - - this.currentUsedDataset!.querySelectorAll('FCDA').forEach(fcda => { - if ( - !existExtRef(inputsElement!, fcda, this.currentSelectedSmvControl) && - canCreateValidExtRef(fcda, this.currentSelectedSmvControl) - ) { - const extRef = createExtRefElement( - this.currentSelectedSmvControl, - fcda - ); - - if (inputsElement?.parentElement) - complexAction.actions.push({ - new: { parent: inputsElement!, element: extRef }, - }); - else inputsElement?.appendChild(extRef); - } - }); - - // we need to extend the actions array with the actions for the instantiation of the LSVS - const supervisionActions = instantiateSubscriptionSupervision( - this.currentSelectedSmvControl, - ied - ); - - if (inputsElement.parentElement) { - complexAction.actions.concat(supervisionActions); - } else { - /** If the IED doesn't have a Inputs element, just append it to the first LN0 element. */ - const inputAction: (Create | Move)[] = [ - { - new: { parent: ied.querySelector('LN0')!, element: inputsElement }, - }, - ]; - complexAction.actions = inputAction.concat(supervisionActions); - } - this.dispatchEvent(newActionEvent(complexAction)); - } - - private async unsubscribe(ied: Element): Promise { - const actions: Delete[] = []; - ied.querySelectorAll('LN0 > Inputs, LN > Inputs').forEach(inputs => { - this.currentUsedDataset!.querySelectorAll('FCDA').forEach(fcda => { - const extRef = getExtRef(inputs, fcda, this.currentSelectedSmvControl); - if (extRef) actions.push({ old: { parent: inputs, element: extRef } }); - }); - }); - - // Check if empty Input Element should also be removed. - actions.push(...emptyInputsDeleteActions(actions)); - - // we need to extend the actions array with the actions for removing the supervision - actions.push( - ...removeSubscriptionSupervision(this.currentSelectedSmvControl, ied) - ); - - this.dispatchEvent( - newActionEvent({ - title: get('subscription.disconnect'), - actions: actions, - }) - ); - } - - renderSubscriber(status: SubscribeStatus, element: Element): TemplateResult { - let firstSubscribedExtRef: Element | null = null; - let supervisionNode: Element | null = null; - if (status !== SubscribeStatus.None) { - if (view === View.PUBLISHER) { - firstSubscribedExtRef = getFirstSubscribedExtRef( - this.currentSelectedSmvControl!, - element - ); - supervisionNode = getExistingSupervision(firstSubscribedExtRef!); - } else { - firstSubscribedExtRef = getFirstSubscribedExtRef( - element, - this.currentSelectedIed! - ); - supervisionNode = getExistingSupervision(firstSubscribedExtRef!); - } - } - return html` { - this.dispatchEvent( - newSmvSubscriptionEvent(element, status ?? SubscribeStatus.None) - ); - }} - graphic="avatar" - ?hasMeta=${supervisionNode !== null} - > - ${view == View.PUBLISHER - ? element.getAttribute('name') - : element.getAttribute('name') + - ` (${element.closest('IED')?.getAttribute('name')})`} - ${status == SubscribeStatus.Full ? html`clear` : html`add`} - ${supervisionNode !== null - ? html`monitor_heart` - : nothing} - `; - } - - renderUnSubscribers(elements: ListElement[]): TemplateResult { - return html` - ${translate('subscription.subscriber.availableToSubscribe')} - -
  • - ${elements.length > 0 - ? elements.map(element => - this.renderSubscriber(SubscribeStatus.None, element.element) - ) - : html` - ${translate('subscription.none')} - `}`; - } - - renderPartiallySubscribers(elements: ListElement[]): TemplateResult { - return html` - ${translate('subscription.subscriber.partiallySubscribed')} - -
  • - ${elements.length > 0 - ? elements.map(element => - this.renderSubscriber(SubscribeStatus.Partial, element.element) - ) - : html` - ${translate('subscription.none')} - `}`; - } - - renderFullSubscribers(): TemplateResult { - return html` - ${translate('subscription.subscriber.subscribed')} - -
  • - ${this.subscribedElements.length > 0 - ? this.subscribedElements.map(element => - this.renderSubscriber(SubscribeStatus.Full, element.element) - ) - : html` - ${translate('subscription.none')} - `}`; - } - - renderTitle(): TemplateResult { - const gseControlName = - this.currentSelectedSmvControl?.getAttribute('name') ?? undefined; - - return view == View.PUBLISHER - ? html`

    - ${translate('subscription.smv.publisher.subscriberTitle', { - selected: gseControlName - ? this.currentSmvIedName + ' > ' + gseControlName - : 'Sampled Value', - })} -

    ` - : html`

    - ${translate('subscription.smv.subscriber.publisherTitle', { - selected: this.currentSelectedIed - ? this.currentSelectedIed.getAttribute('name')! - : 'IED', - })} -

    `; - } - - protected firstUpdated(): void { - this.currentSelectedIed = undefined; - } - - render(): TemplateResult { - return html` -
    - ${this.renderTitle()} - ${this.availableElements.length != 0 || - this.subscribedElements.length != 0 - ? html`
    - - ${this.renderFullSubscribers()} - ${this.renderPartiallySubscribers( - this.availableElements.filter(element => element.partial) - )} - ${this.renderUnSubscribers( - this.availableElements.filter(element => !element.partial) - )} - -
    ` - : html` - - ${ - view == View.PUBLISHER - ? translate( - 'subscription.subscriber.noControlBlockSelected' - ) - : translate('subscription.subscriber.noIedSelected') - } - - - `} -
    - `; - } - - static styles = css` - ${styles} - - .wrapper { - height: 100vh; - overflow-y: scroll; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/substation/bay-editor.ts b/packages/compas-open-scd/src/editors/substation/bay-editor.ts deleted file mode 100644 index e44f2b217..000000000 --- a/packages/compas-open-scd/src/editors/substation/bay-editor.ts +++ /dev/null @@ -1,287 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - query, - state, - TemplateResult, -} from 'lit-element'; -import { classMap } from 'lit-html/directives/class-map'; -import { translate } from 'lit-translate'; - -import '@material/mwc-icon-button'; -import '@material/mwc-textfield'; -import { Dialog } from '@material/mwc-dialog'; -import { Menu } from '@material/mwc-menu'; -import { IconButton } from '@material/mwc-icon-button'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; - -import '../../action-pane.js'; -import './ied-editor.js'; -import './conducting-equipment-editor.js'; -import './general-equipment-editor.js'; -import './powertransformer-editor.js'; -import { VoltageLevelEditor } from './voltage-level-editor.js'; -import { - getChildElementsByTagName, - newActionEvent, - newWizardEvent, - SCLTag, - tags, -} from '../../foundation.js'; -import { emptyWizard, wizards } from '../../wizards/wizard-library.js'; -import { - cloneSubstationElement, - renderGeneralEquipment, - redirectDialog, - startMove, - styles, -} from './foundation.js'; - -function childTags(element: Element | null | undefined): SCLTag[] { - if (!element) return []; - - return tags[element.tagName].children.filter( - child => wizards[child].create !== emptyWizard - ); -} - -/** [[`SubstationEditor`]] subeditor for a `Bay` element. */ -@customElement('bay-editor') -export class BayEditor extends LitElement { - /** The document being edited as provided to editor by [[`Zeroline`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - @property({type: Number}) - editCount = -1; - @property({ attribute: false }) - element!: Element; - @property({ type: Boolean }) - readonly = false; - /** Whether `Function` and `SubFunction` are rendered */ - @property({ type: Boolean }) - showfunctions = false; - - @property({ type: String }) - get header(): string { - const name = this.element.getAttribute('name') ?? ''; - const desc = this.element.getAttribute('desc'); - - return `${name} ${desc ? `- ${desc}` : ''}`; - } - - @property({ attribute: false }) - getAttachedIeds?: (element: Element) => Element[] = () => { - return []; - }; - - @state() - cloneUI = false; - - @query('mwc-dialog') dialog!: Dialog; - @query('mwc-menu') addMenu!: Menu; - @query('mwc-icon-button[icon="playlist_add"]') addButton!: IconButton; - - openEditWizard(): void { - const wizard = wizards['Bay'].edit(this.element); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - /** Opens a [[`WizardDialog`]] for editing `LNode` connections. */ - openLNodeWizard(): void { - const wizard = wizards['LNode'].create(this.element); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - remove(): void { - if (this.element) - this.dispatchEvent( - newActionEvent({ - old: { - parent: this.element.parentElement!, - element: this.element, - reference: this.element.nextSibling, - }, - }) - ); - } - - private openCreateWizard(tagName: string): void { - const wizard = wizards[tagName].create(this.element!); - - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - updated(): void { - this.addMenu.anchor = this.addButton; - } - - private renderRedirectUI(): TemplateResult { - if (!this.cloneUI) return html``; - - return redirectDialog(this.element); - } - - private renderLNodes(): TemplateResult { - if (!this.showfunctions) return html``; - - const lNodes = getChildElementsByTagName(this.element, 'LNode'); - - return lNodes.length - ? html`
    - ${lNodes.map( - lNode => - html`` - )} -
    ` - : html``; - } - - renderFunctions(): TemplateResult { - if (!this.showfunctions) return html``; - - const functions = getChildElementsByTagName(this.element, 'Function'); - return html` ${functions.map( - fUnction => - html`` - )}`; - } - - renderIedContainer(): TemplateResult { - const ieds = this.getAttachedIeds?.(this.element) ?? []; - return ieds?.length - ? html`
    - ${ieds.map( - ied => - html`` - )} -
    ` - : html``; - } - - private renderAddButtons(): TemplateResult[] { - return childTags(this.element).map( - child => - html`${child}` - ); - } - - render(): TemplateResult { - return html`${this.renderRedirectUI()} - - - - - cloneSubstationElement(this)} - > - - - this.openEditWizard()} - > - - - startMove(this, BayEditor, [VoltageLevelEditor])} - > - - - this.remove()} - > - - - (this.addMenu.open = true)} - > { - const tagName = ((e.target).selected).value; - this.openCreateWizard(tagName); - }} - >${this.renderAddButtons()} - - ${renderGeneralEquipment(this.doc, this.element, this.showfunctions)} - ${this.renderIedContainer()}${this.renderLNodes()}${this.renderFunctions()} -
    - ${Array.from( - getChildElementsByTagName(this.element, 'PowerTransformer') - ).map( - pwt => - html`` - )} - ${Array.from( - getChildElementsByTagName(this.element, 'ConductingEquipment') - ).map( - voltageLevel => - html`` - )} -
    - `; - } - - static styles = css` - ${styles} - - .content.actionicon { - display: grid; - grid-gap: 12px; - padding: 12px; - box-sizing: border-box; - grid-template-columns: repeat(auto-fit, minmax(64px, auto)); - } - - conducting-equipment-editor[showfunctions] { - margin: 4px 8px 16px; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/substation/conducting-equipment-editor.ts b/packages/compas-open-scd/src/editors/substation/conducting-equipment-editor.ts deleted file mode 100644 index 32c0876a9..000000000 --- a/packages/compas-open-scd/src/editors/substation/conducting-equipment-editor.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { - css, - customElement, - html, - LitElement, - property, - query, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-fab'; -import '@material/mwc-icon'; -import '@material/mwc-icon-button'; -import '@material/mwc-menu'; -import { Menu } from '@material/mwc-menu'; -import { IconButton } from '@material/mwc-icon-button'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; - -import '../../action-icon.js'; -import '../../action-pane.js'; -import './eq-function-editor.js'; -import './l-node-editor.js'; -import './sub-equipment-editor.js'; -import { startMove, getIcon, styles } from './foundation.js'; -import { - getChildElementsByTagName, - newActionEvent, - newWizardEvent, - SCLTag, - tags, -} from '../../foundation.js'; -import { BayEditor } from './bay-editor.js'; -import { emptyWizard, wizards } from '../../wizards/wizard-library.js'; - -function childTags(element: Element | null | undefined): SCLTag[] { - if (!element) return []; - - return tags[element.tagName].children.filter( - child => wizards[child].create !== emptyWizard - ); -} - -/** [[`SubstationEditor`]] subeditor for a `ConductingEquipment` element. */ -@customElement('conducting-equipment-editor') -export class ConductingEquipmentEditor extends LitElement { - /** The document being edited as provided to editor by [[`Zeroline`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - /** SCL element ConductingEquipment */ - @property({ attribute: false }) - element!: Element; - /** ConductingEquipment name attribute */ - @property({ type: String }) - get name(): string { - return this.element.getAttribute('name') ?? ''; - } - /** Whether `EqFunction`, `SubEqFunction` and `SubEquipment` are rendered */ - @property({ type: Boolean }) - showfunctions = false; - - @query('mwc-menu') addMenu!: Menu; - @query('mwc-icon-button[icon="playlist_add"]') addButton!: IconButton; - - private openEditWizard(): void { - const wizard = wizards['ConductingEquipment'].edit(this.element); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - private openLNodeWizard(): void { - const wizard = wizards['LNode'].create(this.element); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - private openCreateWizard(tagName: string): void { - const wizard = wizards[tagName].create(this.element!); - - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - remove(): void { - if (this.element) - this.dispatchEvent( - newActionEvent({ - old: { - parent: this.element.parentElement!, - element: this.element, - reference: this.element.nextSibling, - }, - }) - ); - } - - updated(): void { - if (this.addMenu && this.addButton) - this.addMenu.anchor = this.addButton; - } - - private renderLNodes(): TemplateResult { - const lNodes = getChildElementsByTagName(this.element, 'LNode'); - - return lNodes.length - ? html`
    - ${lNodes.map( - lNode => - html`` - )} -
    ` - : html``; - } - - renderEqFunctions(): TemplateResult { - if (!this.showfunctions) return html``; - - const eqFunctions = getChildElementsByTagName(this.element, 'EqFunction'); - return html` ${eqFunctions.map( - eqFunction => - html`` - )}`; - } - - private renderSubEquipments(): TemplateResult { - if (!this.showfunctions) return html``; - - const subEquipments = getChildElementsByTagName( - this.element, - 'SubEquipment' - ); - - return html` ${subEquipments.map( - subEquipment => - html`` - )}`; - } - - private renderAddButtons(): TemplateResult[] { - return childTags(this.element).map( - child => - html`${child}` - ); - } - - renderContentPane(): TemplateResult { - return html`${getIcon(this.element)} - - - - - - - - - - - - (this.addMenu.open = true)} - > { - const tagName = ((e.target).selected).value; - this.openCreateWizard(tagName); - }} - >${this.renderAddButtons()} - `; - } - - renderContentIcon(): TemplateResult { - return html`${getIcon(this.element)} - - - - `; - } - - render(): TemplateResult { - if (this.showfunctions) - return html`${this.renderContentPane()}${this.renderLNodes()}${this.renderEqFunctions()}${this.renderSubEquipments()}`; - - return html`${this.renderContentIcon()}`; - } - - static styles = css` - ${styles} - - :host(.moving) { - opacity: 0.3; - } - - abbr { - text-decoration: none; - border-bottom: none; - } - `; -} diff --git a/packages/compas-open-scd/src/editors/substation/eq-function-editor.ts b/packages/compas-open-scd/src/editors/substation/eq-function-editor.ts deleted file mode 100644 index 57ed5d1fe..000000000 --- a/packages/compas-open-scd/src/editors/substation/eq-function-editor.ts +++ /dev/null @@ -1,192 +0,0 @@ -import { - html, - LitElement, - TemplateResult, - property, - customElement, - state, - css, - query, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-icon-button'; -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-menu'; -import { IconButton } from '@material/mwc-icon-button'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; -import { Menu } from '@material/mwc-menu'; - -import '../../action-pane.js'; -import './eq-sub-function-editor.js'; -import './general-equipment-editor.js'; -import { - getChildElementsByTagName, - newActionEvent, - newWizardEvent, - SCLTag, - tags, -} from '../../foundation.js'; -import { emptyWizard, wizards } from '../../wizards/wizard-library.js'; -import { classMap } from 'lit-html/directives/class-map.js'; -import { renderGeneralEquipment } from './foundation.js'; - -function childTags(element: Element | null | undefined): SCLTag[] { - if (!element) return []; - - return tags[element.tagName].children.filter( - child => wizards[child].create !== emptyWizard - ); -} - -/** Pane rendering `EqFunction` element with its children */ -@customElement('eq-function-editor') -export class EqFunctionEditor extends LitElement { - /** The document being edited as provided to editor by [[`Zeroline`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - /** The edited `EqFunction` element */ - @property({ attribute: false }) - element!: Element; - - @property({ type: Boolean }) - showfunctions = false; - - @state() - private get header(): string { - const name = this.element.getAttribute('name'); - const desc = this.element.getAttribute('desc'); - const type = this.element.getAttribute('type'); - - return `${name}${desc ? ` - ${desc}` : ''}${type ? ` (${type})` : ''}`; - } - - @query('mwc-menu') addMenu!: Menu; - @query('mwc-icon-button[icon="playlist_add"]') addButton!: IconButton; - - private openEditWizard(): void { - const wizard = wizards['EqFunction'].edit(this.element); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - remove(): void { - if (this.element.parentElement) - this.dispatchEvent( - newActionEvent({ - old: { - parent: this.element.parentElement, - element: this.element, - }, - }) - ); - } - - private openCreateWizard(tagName: string): void { - const wizard = wizards[tagName].create(this.element!); - - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - updated(): void { - this.addMenu.anchor = this.addButton; - } - - private renderLNodes(): TemplateResult { - const lNodes = getChildElementsByTagName(this.element, 'LNode'); - - return lNodes.length - ? html`
    - ${lNodes.map( - lNode => - html`` - )} -
    ` - : html``; - } - - private renderEqSubFunctions(): TemplateResult { - const eqSubFunctions = getChildElementsByTagName( - this.element, - 'EqSubFunction' - ); - return html` ${eqSubFunctions.map( - eqSubFunction => - html`` - )}`; - } - - private renderAddButtons(): TemplateResult[] { - return childTags(this.element).map( - child => - html`${child}` - ); - } - - render(): TemplateResult { - return html` - this.openEditWizard()} - > - this.remove()} - > - (this.addMenu.open = true)} - > { - const tagName = ((e.target).selected).value; - this.openCreateWizard(tagName); - }} - >${this.renderAddButtons()} - ${renderGeneralEquipment(this.doc, this.element, this.showfunctions)} - ${this.renderLNodes()}${this.renderEqSubFunctions()}`; - } - - static styles = css` - abbr { - text-decoration: none; - border-bottom: none; - } - - .container.lnode { - display: grid; - grid-gap: 12px; - padding: 8px 12px 16px; - box-sizing: border-box; - grid-template-columns: repeat(auto-fit, minmax(64px, auto)); - } - `; -} diff --git a/packages/compas-open-scd/src/editors/substation/eq-sub-function-editor.ts b/packages/compas-open-scd/src/editors/substation/eq-sub-function-editor.ts deleted file mode 100644 index c4e41e623..000000000 --- a/packages/compas-open-scd/src/editors/substation/eq-sub-function-editor.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { - html, - LitElement, - TemplateResult, - property, - customElement, - state, - css, - query, -} from 'lit-element'; - -import { translate } from 'lit-translate'; - -import '@material/mwc-icon-button'; -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-menu'; -import { IconButton } from '@material/mwc-icon-button'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; -import { Menu } from '@material/mwc-menu'; - -import '../../action-pane.js'; -import './general-equipment-editor.js'; -import { - getChildElementsByTagName, - newActionEvent, - newWizardEvent, - SCLTag, - tags, -} from '../../foundation.js'; -import { emptyWizard, wizards } from '../../wizards/wizard-library.js'; -import { classMap } from 'lit-html/directives/class-map.js'; -import { renderGeneralEquipment } from './foundation.js'; - -function childTags(element: Element | null | undefined): SCLTag[] { - if (!element) return []; - - return tags[element.tagName].children.filter( - child => wizards[child].create !== emptyWizard - ); -} -/** Pane rendering `EqSubFunction` element with its children */ -@customElement('eq-sub-function-editor') -export class EqSubFunctionEditor extends LitElement { - /** The document being edited as provided to editor by [[`Zeroline`]]. */ - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - /** The edited `EqSubFunction` element */ - @property({ attribute: false }) - element!: Element; - @property({ type: Boolean }) - showfunctions = false; - @state() - private get header(): string { - const name = this.element.getAttribute('name'); - const desc = this.element.getAttribute('desc'); - const type = this.element.getAttribute('type'); - - return `${name}${desc ? ` - ${desc}` : ''}${type ? ` (${type})` : ''}`; - } - - @query('mwc-menu') addMenu!: Menu; - @query('mwc-icon-button[icon="playlist_add"]') addButton!: IconButton; - - private openEditWizard(): void { - const wizard = wizards['EqSubFunction'].edit(this.element); - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - remove(): void { - if (this.element.parentElement) - this.dispatchEvent( - newActionEvent({ - old: { - parent: this.element.parentElement, - element: this.element, - }, - }) - ); - } - - private openCreateWizard(tagName: string): void { - const wizard = wizards[tagName].create(this.element!); - - if (wizard) this.dispatchEvent(newWizardEvent(wizard)); - } - - updated(): void { - this.addMenu.anchor = this.addButton; - } - - private renderLNodes(): TemplateResult { - const lNodes = getChildElementsByTagName(this.element, 'LNode'); - - return lNodes.length - ? html`
    - ${lNodes.map( - lNode => - html`` - )} -
    ` - : html``; - } - - private renderEqSubFunctions(): TemplateResult { - const eqSubFunctions = getChildElementsByTagName( - this.element, - 'EqSubFunction' - ); - return html` ${eqSubFunctions.map( - eqSubFunction => - html`` - )}`; - } - - private renderAddButtons(): TemplateResult[] { - return childTags(this.element).map( - child => - html`${child}` - ); - } - - render(): TemplateResult { - return html` - this.openEditWizard()} - > - this.remove()} - > - (this.addMenu.open = true)} - > { - const tagName = ((e.target).selected).value; - this.openCreateWizard(tagName); - }} - >${this.renderAddButtons()} - ${renderGeneralEquipment(this.doc, this.element, this.showfunctions)} - ${this.renderLNodes()}${this.renderEqSubFunctions()}`; - } - - static styles = css` - abbr { - text-decoration: none; - border-bottom: none; - } - - .container.lnode { - display: grid; - grid-gap: 12px; - padding: 8px 12px 16px; - box-sizing: border-box; - grid-template-columns: repeat(auto-fit, minmax(64px, auto)); - } - `; -} diff --git a/packages/compas-open-scd/src/editors/substation/foundation.ts b/packages/compas-open-scd/src/editors/substation/foundation.ts deleted file mode 100644 index 116c6ad56..000000000 --- a/packages/compas-open-scd/src/editors/substation/foundation.ts +++ /dev/null @@ -1,680 +0,0 @@ -import { css, html, LitElement, TemplateResult } from 'lit-element'; -import { classMap } from 'lit-html/directives/class-map.js'; - -import './function-editor.js'; - -import { - identity, - newActionEvent, - isPublic, - getChildElementsByTagName, -} from '../../foundation.js'; -import { - circuitBreakerIcon, - disconnectorIcon, - currentTransformerIcon, - voltageTransformerIcon, - earthSwitchIcon, - generalConductingEquipmentIcon, -} from '../../icons/icons.js'; -import { typeStr } from '../../wizards/conductingequipment.js'; -import { Select } from '@material/mwc-select'; -import { WizardTextField } from '../../wizard-textfield.js'; -import { translate } from 'lit-translate'; -import { BayEditor } from './bay-editor.js'; -import { VoltageLevelEditor } from './voltage-level-editor.js'; -import { SubstationEditor } from './substation-editor.js'; - -function containsReference(element: Element, iedName: string): boolean { - return Array.from(element.getElementsByTagName('LNode')) - .filter(isPublic) - .some(lnode => lnode.getAttribute('iedName') === iedName); -} - -function isReferencedItself(element: Element, iedName: string): boolean { - return (Array.from(element.children)).some( - child => - child.tagName === 'LNode' && child.getAttribute('iedName') === iedName - ); -} - -function hasReferencedChildren(element: Element, iedName: string): boolean { - const threshold = element.tagName === 'Bay' ? 0 : 1; - return ( - (Array.from(element.children)).filter(child => - containsReference(child, iedName) - ).length > threshold - ); -} - -function hasOurs(element: Element, iedName: string): boolean { - return Array.from(element.getElementsByTagName('LNode')) - .filter(isPublic) - .some(lnode => lnode.getAttribute('iedName') === iedName); -} - -function getOurs(element: Element, iedName: string): Element[] { - return Array.from(element.getElementsByTagName('LNode')) - .filter(isPublic) - .filter(lnode => lnode.getAttribute('iedName') === iedName); -} - -function hasTheirs(element: Element, iedName: string): boolean { - const ours = getOurs(element, iedName); - const scl = element.closest('SCL')!; - - return Array.from(scl.getElementsByTagName('LNode')) - .filter(isPublic) - .filter(lnode => lnode.getAttribute('iedName') === iedName) - .some(lnode => !ours.includes(lnode)); -} - -export function attachedIeds( - element: Element, - remainingIeds: Set -): Element[] { - const attachedIeds: Element[] = []; - for (const ied of remainingIeds) { - const iedName = ied.getAttribute('name')!; - - if (element.tagName === 'SCL') { - if (!hasOurs(element, iedName) || hasReferencedChildren(element, iedName)) - attachedIeds.push(ied); - - continue; - } - - if (hasTheirs(element, iedName)) continue; - if ( - hasReferencedChildren(element, iedName) || - isReferencedItself(element, iedName) - ) - attachedIeds.push(ied); - } - - for (const ied of attachedIeds) { - remainingIeds.delete(ied); - } - - return attachedIeds; -} - -export function getAttachedIeds( - doc: XMLDocument -): (element: Element) => Element[] { - return (element: Element) => { - const ieds = new Set( - Array.from(doc.querySelectorAll('IED')).filter(isPublic) - ); - - return attachedIeds(element, ieds); - }; -} - -/** Whether the LNode reference valid relatively (IED agnostic) */ -function validRelativeReference( - ied: Element, - lNode: Element -): Element | undefined { - const [ldInst, prefix, lnClass, lnInst] = [ - 'ldInst', - 'prefix', - 'lnClass', - 'lnInst', - ].map(name => lNode.getAttribute(name)); - - return Array.from(ied.querySelectorAll('LN, LN0')) - .filter(isPublic) - .find( - anyLn => - anyLn?.closest('LDevice')?.getAttribute('inst') === ldInst && - (anyLn.getAttribute('prefix') ?? '') === (prefix ?? '') && - (anyLn.getAttribute('lnClass') ?? '') === (lnClass ?? '') && - (anyLn.getAttribute('inst') ?? '') === (lnInst ?? '') - ); -} - -/** Identity of LNode with iedName !== None is global and independent of parent*/ -function lNodeRegistry(doc: XMLDocument): (newLNode: Element) => boolean { - const lNodes = new Set( - Array.from(doc.querySelectorAll('LNode')) - .filter(isPublic) - .map(lNode => identity(lNode)) - ); - - return (newLNode: Element) => { - if (lNodes.has(identity(newLNode))) return true; - - lNodes.add(identity(newLNode)); - return false; - }; -} - -/** - * Clones - deep copy - substation element cloneEntity with removed single line diagram - * @param cloneEntity - substation element to be cloned - * @param newName - name of the clone - * @param iedRedirect - redirection information for LNode elements (all LNodes's are removed for undefined) - * @returns a deep cloned node without single line diagram information - */ -export function substationElementClone( - cloneEntity: Element, - newName: string, - iedRedirect?: Partial> -): Element { - const usedLNodes = lNodeRegistry(cloneEntity.ownerDocument); - - const clone: Element = cloneEntity.cloneNode(true); - clone.querySelectorAll('LNode').forEach(lNode => { - const oldIedName = lNode.getAttribute('iedName'); - - if (oldIedName === 'None') return; // non referenced LNode - if (!oldIedName) { - //iedName required - lNode.parentElement?.removeChild(lNode); - return; - } - - // no or invalid user choice - if (!iedRedirect || !iedRedirect[oldIedName]) { - lNode.parentElement?.removeChild(lNode); - return; - } - - // user decide to remove LNode - if (iedRedirect[oldIedName] === 'No') { - lNode.parentElement?.removeChild(lNode); - return; - } - - lNode.setAttribute('iedName', iedRedirect[oldIedName]!); - - // new LNode already in use - if (usedLNodes(lNode)) { - lNode.parentElement?.removeChild(lNode); - return; - } - - const ied = cloneEntity.ownerDocument.querySelector( - `IED[name="${iedRedirect[oldIedName]}"]` - ); - if (!ied || !validRelativeReference(ied, lNode)) { - lNode.parentElement?.removeChild(lNode); - return; - } - }); - - clone - .querySelectorAll('Terminal:not([cNodeName="grounded"])') - .forEach(terminal => terminal.parentElement?.removeChild(terminal)); - // FIXME(JakobVogelsang): for the moment removes terminal as well. - // For later terminal keep might be the better choice - - clone - .querySelectorAll('ConnectivityNode') - .forEach(condNode => condNode.parentElement?.removeChild(condNode)); - // FIXME(JakobVogelsang): for the moment beeing connectivity node remove as well. - // For later connectivity keep might be the better choice to preserve substation structure - - clone.setAttribute('name', newName); - - return clone; -} - -function cloneWithRedirect(evt: Event, cloneEntity: Element): void { - const dialog = (evt.target)?.parentElement; - if (!dialog) return; - - const children = <(Select | WizardTextField)[]>( - Array.from(dialog.querySelectorAll('mwc-select, wizard-textfield')) - ); - if (!children.every(child => child.checkValidity())) return; - - const nameField = dialog.querySelector('wizard-textfield')!; - - const iedRedirects = Array.from( - dialog.querySelectorAllinputs.find(i => i.label === 'values'); - const selectedElement = values.selected - ? templates.querySelector(`DAType[id="${values.selected.value}"]`) - : null; - const element = values.selected - ? selectedElement!.cloneNode(true) - : createElement(parent.ownerDocument, 'DAType', {}); - - element.setAttribute('id', id); - if (desc) element.setAttribute('desc', desc); - - const actions: Create[] = []; - - if (selectedElement) - addReferencedDataTypes(selectedElement, parent).forEach(action => - actions.push(action) - ); - - actions.push({ - new: { - parent, - element, - }, - }); - - return unifyCreateActionArray(actions); - }; -} - -export function createDATypeWizard( - parent: Element, - templates: Document -): Wizard { - return [ - { - title: get('datype.wizard.title.add'), - primary: { - icon: 'add', - label: get('add'), - action: addPredefinedDAType(parent, templates), - }, - content: [ - html` - ${Array.from(templates.querySelectorAll('DAType')).map( - datype => - html`${datype.getAttribute('id')?.replace('OpenSCD_', '')} - ${datype.querySelectorAll('BDA').length} - ` - )} - `, - html``, - html``, - ], - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/templates/dotype-wizards.ts b/packages/compas-open-scd/src/editors/templates/dotype-wizards.ts deleted file mode 100644 index ab8af6977..000000000 --- a/packages/compas-open-scd/src/editors/templates/dotype-wizards.ts +++ /dev/null @@ -1,445 +0,0 @@ -import { html } from 'lit-html'; -import { get, translate } from 'lit-translate'; - -import '@material/mwc-button'; -import '@material/mwc-list'; -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-select'; -import { Select } from '@material/mwc-select'; -import { SingleSelectedEvent } from '@material/mwc-list/mwc-list-foundation'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; -import { List } from '@material/mwc-list'; - -import '../../wizard-textfield.js'; -import { - cloneElement, - Create, - createElement, - EditorAction, - find, - getValue, - identity, - isPublic, - newActionEvent, - newSubWizardEvent, - newWizardEvent, - Replace, - Wizard, - WizardActor, - WizardInputElement, - WizardMenuActor, -} from '../../foundation.js'; -import { createDaWizard, editDAWizard } from '../../wizards/da.js'; -import { patterns } from '../../wizards/foundation/limits.js'; -import { - addReferencedDataTypes, - allDataTypeSelector, - CreateOptions, - unifyCreateActionArray, - UpdateOptions, - WizardOptions, -} from './foundation.js'; - -function remove(element: Element): WizardMenuActor { - return (wizard: Element): void => { - wizard.dispatchEvent( - newActionEvent({ old: { parent: element.parentElement!, element } }) - ); - wizard.dispatchEvent(newWizardEvent()); - }; -} - -function updateSDoAction(element: Element): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const name = getValue(inputs.find(i => i.label === 'name')!)!; - const desc = getValue(inputs.find(i => i.label === 'desc')!); - const type = getValue(inputs.find(i => i.label === 'type')!)!; - - const actions: EditorAction[] = []; - if ( - name === element.getAttribute('name') && - desc === element.getAttribute('desc') && - type === element.getAttribute('type') - ) { - return []; - } - - const newElement = cloneElement(element, { name, desc, type }); - actions.push({ old: { element }, new: { element: newElement } }); - - return actions; - }; -} - -function createSDoAction(parent: Element): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const name = getValue(inputs.find(i => i.label === 'name')!)!; - const desc = getValue(inputs.find(i => i.label === 'desc')!); - const type = getValue(inputs.find(i => i.label === 'type')!); - - const actions: EditorAction[] = []; - - const element = createElement(parent.ownerDocument, 'SDO', { - name, - desc, - type, - }); - actions.push({ - new: { - parent, - element, - }, - }); - - return actions; - }; -} - -function sDOWizard(options: WizardOptions): Wizard | undefined { - const doc = (options).doc - ? (options).doc - : (options).parent.ownerDocument; - const sdo = find(doc, 'SDO', (options).identity ?? NaN); - - const [title, action, type, menuActions, name, desc] = sdo - ? [ - get('sdo.wizard.title.edit'), - updateSDoAction(sdo), - sdo.getAttribute('type'), - [{ icon: 'delete', label: get('remove'), action: remove(sdo) }], - sdo.getAttribute('name'), - sdo.getAttribute('desc'), - ] - : [ - get('sdo.wizard.title.add'), - createSDoAction((options).parent), - null, - undefined, - '', - null, - ]; - - const types = Array.from(doc.querySelectorAll('DOType')) - .filter(isPublic) - .filter(type => type.getAttribute('id')); - - return [ - { - title, - element: sdo ?? undefined, - primary: { icon: '', label: get('save'), action }, - menuActions, - content: [ - html` - >`, - html``, - html`${types.map( - dataType => - html`${dataType.id}` - )}`, - ], - }, - ]; -} - -function addPredefinedDOType( - parent: Element, - templates: XMLDocument -): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const id = getValue(inputs.find(i => i.label === 'id')!); - - if (!id) return []; - - const existId = Array.from( - templates.querySelectorAll(allDataTypeSelector) - ).some(type => type.getAttribute('id') === id); - - if (existId) return []; - - const desc = getValue(inputs.find(i => i.label === 'desc')!); - const cdc = getValue(inputs.find(i => i.label === 'cdc')!)!; - - const values = ( - (e.target).value; - const cdc = - templates.querySelector(`DOType[id="${doTypeId}"]`)?.getAttribute('cdc') ?? - null; - - if (cdc) cdcUI.value = cdc; - cdcUI.disabled = true; -} - -export function createDOTypeWizard( - parent: Element, - templates: Document -): Wizard { - return [ - { - title: get('dotype.wizard.title.add'), - primary: { - icon: 'add', - label: get('add'), - action: addPredefinedDOType(parent, templates), - }, - content: [ - html` onSelectTemplateDOType(e, templates)} - > - ${Array.from(templates.querySelectorAll('DOType')).map( - datype => - html`${datype.getAttribute('id')?.replace('OpenSCD_', '')} - ${datype.querySelectorAll('SDO,DA').length} - ` - )} - `, - html``, - html``, - html``, - ], - }, - ]; -} - -function openAddSdo(parent: Element): WizardMenuActor { - return (wizard: Element): void => { - wizard.dispatchEvent(newSubWizardEvent(() => sDOWizard({ parent })!)); - }; -} - -function openAddDa(parent: Element): WizardMenuActor { - return (wizard: Element): void => { - wizard.dispatchEvent(newSubWizardEvent(() => createDaWizard(parent)!)); - }; -} - -function updateDOTypeAction(element: Element): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const id = getValue(inputs.find(i => i.label === 'id')!)!; - const desc = getValue(inputs.find(i => i.label === 'desc')!); - const cdc = getValue(inputs.find(i => i.label === 'CDC')!)!; - - if ( - id === element.getAttribute('id') && - desc === element.getAttribute('desc') && - cdc == element.getAttribute('cdc') - ) - return []; - - const newElement = cloneElement(element, { id, desc, cdc }); - - const actions: Replace[] = []; - actions.push({ old: { element }, new: { element: newElement } }); - - const oldId = element.getAttribute('id')!; - Array.from( - element.ownerDocument.querySelectorAll( - `LNodeType > DO[type="${oldId}"], DOType > SDO[type="${oldId}"]` - ) - ).forEach(oldDo => { - const newDo = oldDo.cloneNode(false); - newDo.setAttribute('type', id); - - actions.push({ old: { element: oldDo }, new: { element: newDo } }); - }); - - return [ - { title: get('dotype.action.edit', { oldId, newId: id }), actions }, - ]; - }; -} - -export function dOTypeWizard( - dOTypeIdentity: string, - doc: XMLDocument -): Wizard | undefined { - const dotype = find(doc, 'DOType', dOTypeIdentity); - if (!dotype) return undefined; - - return [ - { - title: get('dotype.wizard.title.edit'), - element: dotype, - primary: { - icon: '', - label: get('save'), - action: updateDOTypeAction(dotype), - }, - menuActions: [ - { - label: get('remove'), - icon: 'delete', - action: remove(dotype), - }, - { - label: get('scl.DO'), - icon: 'playlist_add', - action: openAddSdo(dotype), - }, - { - label: get('scl.DA'), - icon: 'playlist_add', - action: openAddDa(dotype), - }, - ], - content: [ - html``, - html``, - html``, - html` - { - const item = (e.target).selected; - - const daIdentity = ((e.target).selected).value; - const da = find(doc, 'DA', daIdentity); - - const wizard = item.classList.contains('DA') - ? da - ? editDAWizard(da) - : undefined - : sDOWizard({ - identity: item.value, - doc, - }); - - if (wizard) e.target!.dispatchEvent(newSubWizardEvent(wizard)); - }} - > - ${Array.from(dotype.querySelectorAll('SDO, DA')).map( - daorsdo => - html`${daorsdo.getAttribute('name')}${daorsdo.tagName === 'SDO' || - daorsdo.getAttribute('bType') === 'Enum' || - daorsdo.getAttribute('bType') === 'Struct' - ? '#' + daorsdo.getAttribute('type') - : daorsdo.getAttribute('bType')}` - )} - - `, - ], - }, - ]; -} diff --git a/packages/compas-open-scd/src/editors/templates/enumtype-wizard.ts b/packages/compas-open-scd/src/editors/templates/enumtype-wizard.ts deleted file mode 100644 index c33d39b48..000000000 --- a/packages/compas-open-scd/src/editors/templates/enumtype-wizard.ts +++ /dev/null @@ -1,366 +0,0 @@ -import { html } from 'lit-element'; -import { get, translate } from 'lit-translate'; - -import '@material/mwc-button'; -import '@material/mwc-list'; -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-select'; -import { List } from '@material/mwc-list'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; -import { SingleSelectedEvent } from '@material/mwc-list/mwc-list-foundation'; -import { Select } from '@material/mwc-select'; - -import '../../wizard-textfield.js'; -import { - cloneElement, - createElement, - EditorAction, - find, - getValue, - identity, - isPublic, - newActionEvent, - newSubWizardEvent, - newWizardEvent, - patterns, - Replace, - Wizard, - WizardActor, - WizardInputElement, - WizardMenuActor, -} from '../../foundation.js'; -import { CreateOptions, UpdateOptions, WizardOptions } from './foundation.js'; - -function remove(element: Element): WizardMenuActor { - return (wizard: Element): void => { - wizard.dispatchEvent( - newActionEvent({ old: { parent: element.parentElement!, element } }) - ); - wizard.dispatchEvent(newWizardEvent()); - }; -} - -function nextOrd(parent: Element): string { - const maxOrd = Math.max( - ...Array.from(parent.children).map(child => - parseInt(child.getAttribute('ord') ?? '-2', 10) - ) - ); - return isFinite(maxOrd) ? (maxOrd + 1).toString(10) : '0'; -} - -function createEnumValAction(parent: Element): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const value = getValue(inputs.find(i => i.label === 'value')!); - const desc = getValue(inputs.find(i => i.label === 'desc')!); - const ord = - getValue(inputs.find(i => i.label === 'ord')!) || nextOrd(parent); - - const element = createElement(parent.ownerDocument, 'EnumVal', { - ord, - desc, - }); - - element.textContent = value; - - const action = { - new: { - parent, - element, - }, - }; - - return [action]; - }; -} - -function updateEnumValAction(element: Element): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const value = getValue(inputs.find(i => i.label === 'value')!) ?? ''; - const desc = getValue(inputs.find(i => i.label === 'desc')!); - const ord = - getValue(inputs.find(i => i.label === 'ord')!) || - element.getAttribute('ord') || - nextOrd(element.parentElement!); - - if ( - value === element.textContent && - desc === element.getAttribute('desc') && - ord === element.getAttribute('ord') - ) - return []; - - const newElement = cloneElement(element, { desc, ord }); - newElement.textContent = value; - - return [{ old: { element }, new: { element: newElement } }]; - }; -} - -function eNumValWizard(options: WizardOptions): Wizard { - const doc = (options).doc - ? (options).doc - : (options).parent.ownerDocument; - const enumval = find( - doc, - 'EnumVal', - (options).identity ?? NaN - ); - - const [title, action, ord, desc, value, menuActions] = enumval - ? [ - get('enum-val.wizard.title.edit'), - updateEnumValAction(enumval), - enumval.getAttribute('ord'), - enumval.getAttribute('desc'), - enumval.textContent, - [ - { - icon: 'delete', - label: get('remove'), - action: remove(enumval), - }, - ], - ] - : [ - get('enum-val.wizard.title.add'), - createEnumValAction((options).parent), - nextOrd((options).parent), - null, // desc is uncommon on EnumVal - '', - undefined, - ]; - - return [ - { - title, - element: enumval ?? undefined, - primary: { - icon: '', - label: 'Save', - action: action, - }, - menuActions, - content: [ - html``, - html``, - html``, - ], - }, - ]; -} - -function createAction(parent: Element, templates: XMLDocument): WizardActor { - return (inputs: WizardInputElement[]): EditorAction[] => { - const id = getValue(inputs.find(i => i.label === 'id')!); - - if (!id) return []; - - const desc = getValue(inputs.find(i => i.label === 'desc')!); - const values = inputs.find(i => i.label === 'lnClass'))?.selected - ?.value; - const templateLNodeType = value - ? find(templates, 'LNodeType', value) - : null; - - const newLNodeType = templateLNodeType - ? templateLNodeType!.cloneNode(true) - : createElement(parent.ownerDocument, 'LNodeType', { - lnClass: value ?? '', - }); - - newLNodeType.setAttribute('id', id); - if (desc) newLNodeType.setAttribute('desc', desc); - - if (templateLNodeType) - return addPredefinedLNodeType(parent, newLNodeType, templateLNodeType); - - const allDo = getAllDataObjects(nsd74, value!, nsd7420); - wizard.dispatchEvent( - newWizardEvent(createLNodeTypeHelperWizard(parent, newLNodeType, allDo)) - ); - - wizard.dispatchEvent(newWizardEvent()); - return []; - }; -} - -function onLnClassChange(e: Event, templates: XMLDocument): void { - const identity = ( - this.dispatchEvent(newPendingStateEvent(this.getTemplateFile(evt)))} - /> - - { - const input = ( - this.shadowRoot!.querySelector('#template-file') - ); - input?.click(); - }} - > - - ${this.renderCloseButton()}`; - } - - private renderDialog( - content: TemplateResult, - heading: string - ): TemplateResult { - return html` - ${content} - `; - } - - render(): TemplateResult { - if (!this.doc) return html``; - - if (this.selectedProjectIed && this.selectedTemplateIed) { - return this.renderDialog( - this.renderCompare(), - get('compare-ied.resultTitle') - ); - } else if (this.templateDoc) { - return this.renderDialog( - this.renderIEDLists(), - get('compare-ied.selectIedTitle') - ); - } else { - return this.renderDialog( - this.renderSelectTemplateFile(), - get('compare-ied.selectProjectTitle') - ); - } - } - - static styles = css` - mwc-dialog { - --mdc-dialog-min-width: 64vw; - } - - .splitContainer { - display: flex; - padding: 8px 6px 16px; - height: 64vh; - } - - .iedList { - flex: 50%; - margin: 0px 6px 0px; - min-width: 300px; - height: 100%; - overflow-y: auto; - } - - .resultTitle { - font-weight: bold; - } - `; -} diff --git a/packages/compas-open-scd/src/menu/CompasAutoAlignment.ts b/packages/compas-open-scd/src/menu/CompasAutoAlignment.ts index b4e94d1c3..fb174b7e0 100644 --- a/packages/compas-open-scd/src/menu/CompasAutoAlignment.ts +++ b/packages/compas-open-scd/src/menu/CompasAutoAlignment.ts @@ -6,7 +6,7 @@ import { newWizardEvent, Wizard, WizardInputElement, -} from '../foundation.js'; +} from 'open-scd/src/foundation.js'; import CompasAutoAlignmentElement from '../compas/CompasAutoAlignment.js'; diff --git a/packages/compas-open-scd/src/menu/CompasCimMapping.ts b/packages/compas-open-scd/src/menu/CompasCimMapping.ts index 7ed9f6910..10d8adc4c 100644 --- a/packages/compas-open-scd/src/menu/CompasCimMapping.ts +++ b/packages/compas-open-scd/src/menu/CompasCimMapping.ts @@ -4,7 +4,7 @@ import { newLogEvent, newOpenDocEvent, newPendingStateEvent, -} from '../foundation.js'; +} from 'open-scd/src/foundation.js'; import { stripExtensionFromName } from '../compas/foundation.js'; import { diff --git a/packages/compas-open-scd/src/menu/CompasCompareIED.ts b/packages/compas-open-scd/src/menu/CompasCompareIED.ts index 8ada7662f..4aab64894 100644 --- a/packages/compas-open-scd/src/menu/CompasCompareIED.ts +++ b/packages/compas-open-scd/src/menu/CompasCompareIED.ts @@ -4,7 +4,7 @@ import '../compas/CompasOpen.js'; import { DocRetrievedEvent } from '../compas/CompasOpen.js'; -import CompareIEDPlugin from './CompareIED.js'; +import CompareIEDPlugin from 'open-scd/src/menu/CompareIED.js'; export default class CompasCompareIEDPlugin extends CompareIEDPlugin { /** diff --git a/packages/compas-open-scd/src/menu/CompasImportFromApi.ts b/packages/compas-open-scd/src/menu/CompasImportFromApi.ts index 8ae67ebb2..740bf971e 100644 --- a/packages/compas-open-scd/src/menu/CompasImportFromApi.ts +++ b/packages/compas-open-scd/src/menu/CompasImportFromApi.ts @@ -1,9 +1,9 @@ import { html, LitElement } from 'lit-element'; import { get } from 'lit-translate'; -import '../filtered-list.js'; -import '../wizard-textfield.js'; -import { newWizardEvent, Wizard } from '../foundation.js'; +import 'open-scd/src/filtered-list.js'; +import 'open-scd/src/wizard-textfield.js'; +import { newWizardEvent, Wizard } from 'open-scd/src/foundation.js'; import '../compas/CompasImportFromApi.js'; diff --git a/packages/compas-open-scd/src/menu/CompasImportIEDs.ts b/packages/compas-open-scd/src/menu/CompasImportIEDs.ts index 305e7ab9c..8a14c4adb 100644 --- a/packages/compas-open-scd/src/menu/CompasImportIEDs.ts +++ b/packages/compas-open-scd/src/menu/CompasImportIEDs.ts @@ -2,7 +2,7 @@ import { html, query, TemplateResult } from 'lit-element'; import { translate } from 'lit-translate'; import { DocRetrievedEvent } from '../compas/CompasOpen.js'; -import ImportingIedPlugin from './ImportIEDs.js'; +import ImportingIedPlugin from 'open-scd/src/menu/ImportIEDs.js'; import '../compas/CompasOpen.js'; import { Dialog } from '@material/mwc-dialog'; diff --git a/packages/compas-open-scd/src/menu/CompasMerge.ts b/packages/compas-open-scd/src/menu/CompasMerge.ts index e4297089c..96dd64b63 100644 --- a/packages/compas-open-scd/src/menu/CompasMerge.ts +++ b/packages/compas-open-scd/src/menu/CompasMerge.ts @@ -1,8 +1,8 @@ import { html, LitElement } from 'lit-element'; import { get } from 'lit-translate'; -import { newWizardEvent, Wizard } from '../foundation.js'; -import { mergeWizard } from '../wizards.js'; +import { newWizardEvent, Wizard } from 'open-scd/src/foundation.js'; +import { mergeWizard } from 'open-scd/src/wizards.js'; import { DocRetrievedEvent } from '../compas/CompasOpen.js'; diff --git a/packages/compas-open-scd/src/menu/CompasOpen.ts b/packages/compas-open-scd/src/menu/CompasOpen.ts index b84567049..a544f07b7 100644 --- a/packages/compas-open-scd/src/menu/CompasOpen.ts +++ b/packages/compas-open-scd/src/menu/CompasOpen.ts @@ -9,7 +9,7 @@ import { newLogEvent, newOpenDocEvent, newPendingStateEvent, -} from '../foundation.js'; +} from 'open-scd/src/foundation.js'; import CompasOpenElement, { DocRetrievedEvent } from '../compas/CompasOpen.js'; import { updateDocumentInOpenSCD } from '../compas/foundation.js'; diff --git a/packages/compas-open-scd/src/menu/CompasSave.ts b/packages/compas-open-scd/src/menu/CompasSave.ts index 779dc4d33..6489eab4a 100644 --- a/packages/compas-open-scd/src/menu/CompasSave.ts +++ b/packages/compas-open-scd/src/menu/CompasSave.ts @@ -12,7 +12,7 @@ import '@material/mwc-button'; import '@material/mwc-dialog'; import { Dialog } from '@material/mwc-dialog'; -import { newPendingStateEvent } from '../foundation.js'; +import { newPendingStateEvent } from 'open-scd/src/foundation.js'; import CompasSaveElement from '../compas/CompasSave.js'; diff --git a/packages/compas-open-scd/src/menu/CompasSaveAs.ts b/packages/compas-open-scd/src/menu/CompasSaveAs.ts index d02b23b27..49549c5d2 100644 --- a/packages/compas-open-scd/src/menu/CompasSaveAs.ts +++ b/packages/compas-open-scd/src/menu/CompasSaveAs.ts @@ -12,7 +12,7 @@ import '@material/mwc-button'; import '@material/mwc-dialog'; import { Dialog } from '@material/mwc-dialog'; -import { newPendingStateEvent } from '../foundation.js'; +import { newPendingStateEvent } from 'open-scd/src/foundation.js'; import CompasSaveElement from '../compas/CompasSave.js'; diff --git a/packages/compas-open-scd/src/menu/CompasSaveAsVersion.ts b/packages/compas-open-scd/src/menu/CompasSaveAsVersion.ts index 46c51e31d..195c9889a 100644 --- a/packages/compas-open-scd/src/menu/CompasSaveAsVersion.ts +++ b/packages/compas-open-scd/src/menu/CompasSaveAsVersion.ts @@ -13,7 +13,7 @@ import '@material/mwc-button'; import '@material/mwc-dialog'; import { Dialog } from '@material/mwc-dialog'; -import { newPendingStateEvent } from '../foundation.js'; +import { newPendingStateEvent } from 'open-scd/src/foundation.js'; import CompasSaveElement from '../compas/CompasSave.js'; import { DocRetrievedEvent } from '../compas/CompasOpen.js'; diff --git a/packages/compas-open-scd/src/menu/CompasSettings.ts b/packages/compas-open-scd/src/menu/CompasSettings.ts index c90023742..d73fabb14 100644 --- a/packages/compas-open-scd/src/menu/CompasSettings.ts +++ b/packages/compas-open-scd/src/menu/CompasSettings.ts @@ -1,7 +1,7 @@ import { html, LitElement } from 'lit-element'; import { get } from 'lit-translate'; -import { newWizardEvent, Wizard, WizardInputElement } from '../foundation.js'; +import { newWizardEvent, Wizard, WizardInputElement } from 'open-scd/src/foundation.js'; import { CompasSettingsElement } from '../compas/CompasSettings.js'; diff --git a/packages/compas-open-scd/src/menu/CompasUpdateSubstation.ts b/packages/compas-open-scd/src/menu/CompasUpdateSubstation.ts index f0ac105b7..62268199e 100644 --- a/packages/compas-open-scd/src/menu/CompasUpdateSubstation.ts +++ b/packages/compas-open-scd/src/menu/CompasUpdateSubstation.ts @@ -1,7 +1,7 @@ import { html, LitElement } from 'lit-element'; import { get } from 'lit-translate'; -import { newWizardEvent, Wizard } from '../foundation.js'; +import { newWizardEvent, Wizard } from 'open-scd/src/foundation.js'; import { DocRetrievedEvent } from '../compas/CompasOpen.js'; import { mergeSubstation } from './UpdateSubstation.js'; diff --git a/packages/compas-open-scd/src/menu/ExportCommunication.ts b/packages/compas-open-scd/src/menu/ExportCommunication.ts deleted file mode 100644 index acb49fc45..000000000 --- a/packages/compas-open-scd/src/menu/ExportCommunication.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { LitElement, property } from 'lit-element'; -import { get } from 'lit-translate'; - -import { formatXml, newLogEvent } from '../foundation.js'; - -function cloneAttributes(destElement: Element, sourceElement: Element) { - let attr; - const attributes = Array.prototype.slice.call(sourceElement.attributes); - while ((attr = attributes.pop())) { - destElement.setAttribute(attr.nodeName, attr.nodeValue); - } -} - -/** - * Take an XMLDocument and pretty-print, format it, attach it to a document link and then download it. - * @param doc - The XML document - * @param document - The element to attach to within the DOM - * @param filename - The filename to produce - * @returns The blob object that is serialised - */ -export function saveXmlBlob( - doc: XMLDocument, - document: Document, - filename: string -): void { - const blob = new Blob( - [formatXml(new XMLSerializer().serializeToString(doc))], - { - type: 'application/xml', - } - ); - - const a = document.createElement('a'); - a.download = filename; - a.href = URL.createObjectURL(blob); - a.dataset.downloadurl = ['application/xml', a.download, a.href].join(':'); - a.style.display = 'none'; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - setTimeout(function () { - URL.revokeObjectURL(a.href); - }, 5000); -} - -/** - * Plug-in to allow exporting of the Communication SCL element as an XML file. - */ -export default class ExportCommunication extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - @property({ attribute: false }) doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - @property({ attribute: false }) docName!: string; - - /** Entry point for this plug-in */ - async run(): Promise { - // create document - const sclNamespace = 'http://www.iec.ch/61850/2003/SCL'; - const sclDoc = document.implementation.createDocument( - sclNamespace, - 'SCL', - null - ); - const pi = sclDoc.createProcessingInstruction( - 'xml', - 'version="1.0" encoding="UTF-8"' - ); - sclDoc.insertBefore(pi, sclDoc.firstChild); - - // ensure schema revision and namespace definitions are transferred - cloneAttributes(sclDoc.documentElement, this.doc.documentElement); - - const communicationSection = this.doc.querySelector( - ':root > Communication' - ); - - if (communicationSection) { - const header = this.doc.querySelector(':root > Header')?.cloneNode(true); - const communication = this.doc - .querySelector(':root > Communication') - ?.cloneNode(true); - - if (header) sclDoc.documentElement.appendChild(header); - sclDoc.documentElement.appendChild(communication); - - const ending = this.docName.slice(0, -4); - let docName = `${this.docName}-Communication.scd`; - // use filename extension if there seems to be one - if (ending.slice(0, 1) === '.') { - docName = `${this.docName.slice(0, -4)}-Communication${ending}`; - } - saveXmlBlob(sclDoc, document, docName); - } else { - this.dispatchEvent( - newLogEvent({ - kind: 'warning', - title: get('exportCommunication.noCommunicationSection'), - }) - ); - } - } -} diff --git a/packages/compas-open-scd/src/menu/ExportIEDParams.ts b/packages/compas-open-scd/src/menu/ExportIEDParams.ts index 01b541b36..e2a3acab9 100644 --- a/packages/compas-open-scd/src/menu/ExportIEDParams.ts +++ b/packages/compas-open-scd/src/menu/ExportIEDParams.ts @@ -2,7 +2,7 @@ import { LitElement, property } from 'lit-element'; import { stringify } from 'csv-stringify/browser/esm/sync'; -import { compareNames } from '../foundation.js'; +import { compareNames } from 'open-scd/src/foundation.js'; import { stripExtensionFromName } from '../compas/foundation.js'; import { get } from 'lit-translate'; diff --git a/packages/compas-open-scd/src/menu/Help.ts b/packages/compas-open-scd/src/menu/Help.ts deleted file mode 100644 index fee83f8e3..000000000 --- a/packages/compas-open-scd/src/menu/Help.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { html, LitElement } from 'lit-element'; -import { unsafeHTML } from 'lit-html/directives/unsafe-html'; -import * as marked from 'marked'; - -import '@material/mwc-icon'; - -import '../finder-list.js'; -import { newWizardEvent, Wizard } from '../foundation.js'; -import { openSCDIcon } from '../icons/icons.js'; -import { Directory } from '../finder-list.js'; - -function aboutBox(version: string) { - return html`
    -
    - ${openSCDIcon} -
    -

    OpenSCD

    - V${version} -
    -
    -
    -
    -

    Licences

    -

    - The IEC 61850 XSD and NSD code components used are distributed - under their - end user licence agreement.
    This - project's source code is licensed under the - Apache 2.0 license and available on - GitHub. -

    -

    © 2020-2021 OMICRON electronics GmbH

    -

    Help

    -
    `; -} - -async function getLinkedPages(path: string[]): Promise { - const edition = await (await fetch('/manifest.json')).json(); - if (path.length === 0) { - return { path, header: aboutBox(edition.version), entries: ['Home'] }; - } - - const page = path[path.length - 1].replace(/ /g, '-'); - const res = await fetch(`/public/md/${page}.md`); - const md = await res.text(); - const unlinkedMd = md.replace( - /\[([^\]]*)\]\(https:..github.com.openscd.open-scd.wiki.([^)]*)\)/g, - `$1` - ); - const header = html`
    - ${page === 'Home' ? aboutBox(edition.version) : html``} - ${unsafeHTML(marked.parse(unlinkedMd))} -
    `; - const entries = Array.from( - md.matchAll(/\(https:..github.com.openscd.open-scd.wiki.([^)]*)\)/g) - ).map(([_, child]) => child.replace(/-/g, ' ')); - - return { path, header, entries }; -} - -export function aboutBoxWizard(): Wizard { - return [ - { - title: 'Help', - content: [ - html``, - ], - }, - ]; -} - -export default class HelpPlugin extends LitElement { - async run(): Promise { - this.dispatchEvent(newWizardEvent(aboutBoxWizard())); - } -} diff --git a/packages/compas-open-scd/src/menu/ImportIEDs.ts b/packages/compas-open-scd/src/menu/ImportIEDs.ts deleted file mode 100644 index a0163951e..000000000 --- a/packages/compas-open-scd/src/menu/ImportIEDs.ts +++ /dev/null @@ -1,590 +0,0 @@ -import { - css, - html, - LitElement, - property, - query, - state, - TemplateResult, -} from 'lit-element'; -import { get, translate } from 'lit-translate'; - -import '@material/mwc-list/mwc-check-list-item'; -import '@material/dialog'; -import '@material/mwc-button'; -import { Dialog } from '@material/mwc-dialog'; -import { List } from '@material/mwc-list'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../filtered-list.js'; -import { - createElement, - find, - identity, - isPublic, - newActionEvent, - newLogEvent, - SimpleAction, -} from '../foundation.js'; - -function uniqueTemplateIedName(doc: XMLDocument, ied: Element): string { - const [manufacturer, type] = ['manufacturer', 'type'].map(attr => - ied.getAttribute(attr)?.replace(/[^A-Za-z0-9_]/g, '') - ); - const nameCore = - manufacturer || type - ? `${manufacturer ?? ''}${type ? '_' + type : ''}` - : 'TEMPLATE_IED'; - - const siblingNames = Array.from(doc.querySelectorAll('IED')) - .filter(isPublic) - .map(child => child.getAttribute('name') ?? child.tagName); - if (!siblingNames.length) return nameCore + '_001'; - - let newName = ''; - for (let i = 0; i < siblingNames.length + 1; i++) { - const newDigit = (i + 1).toString().padStart(3, '0'); - newName = nameCore + '_' + newDigit; - - if (!siblingNames.includes(newName)) return newName; - } - - return newName; -} - -/** - * Transfer namespaces from one element to another - * @param destElement - Element to transfer namespaces to - * @param sourceElement - Element to transfer namespaces from - */ -function updateNamespaces(destElement: Element, sourceElement: Element) { - Array.prototype.slice - .call(sourceElement.attributes) - .filter(attr => attr.name.startsWith('xmlns:')) - .filter(attr => !destElement.hasAttribute(attr.name)) - .forEach(attr => { - destElement.setAttributeNS( - 'http://www.w3.org/2000/xmlns/', - attr.name, - attr.value - ); - }); -} - -function getSubNetwork(elements: Element[], element: Element): Element { - const existElement = elements.find( - item => item.getAttribute('name') === element.getAttribute('name') - ); - return existElement ? existElement : element.cloneNode(false); -} - -function addCommunicationElements( - ied: Element, - doc: XMLDocument -): SimpleAction[] { - const actions = []; - - const oldCommunicationElement = doc.querySelector(':root > Communication'); - - const communication = oldCommunicationElement - ? oldCommunicationElement - : createElement(doc, 'Communication', {}); - - if (!oldCommunicationElement) - actions.push({ - new: { - parent: doc.querySelector(':root')!, - element: communication, - }, - }); - - const connectedAPs = Array.from( - ied.ownerDocument.querySelectorAll( - `:root > Communication > SubNetwork > ConnectedAP[iedName="${ied.getAttribute( - 'name' - )}"]` - ) - ); - - const createdSubNetworks: Element[] = []; - - connectedAPs.forEach(connectedAP => { - const newSubNetwork = connectedAP.parentElement!; - const oldSubNetworkMatch = communication.querySelector( - `:root > Communication > SubNetwork[name="${newSubNetwork.getAttribute( - 'name' - )}"]` - ); - - const subNetwork = oldSubNetworkMatch - ? oldSubNetworkMatch - : getSubNetwork(createdSubNetworks, newSubNetwork); - const element = connectedAP.cloneNode(true); - - if (!oldSubNetworkMatch && !createdSubNetworks.includes(subNetwork)) { - actions.push({ - new: { - parent: communication, - element: subNetwork, - }, - }); - createdSubNetworks.push(subNetwork); - } - - actions.push({ - new: { - parent: subNetwork, - element, - }, - }); - }); - - return actions; -} - -function hasConnectionToIed(type: Element, ied: Element): boolean { - const data: Element = type.parentElement!; - const id = type.getAttribute('id'); - - if (!data || !id) return false; - - if (type.tagName === 'EnumType') - return Array.from( - data.querySelectorAll( - `DOType > DA[type="${id}"],DAType > BDA[type="${id}"]` - ) - ).some(typeChild => hasConnectionToIed(typeChild.parentElement!, ied)); - - if (type.tagName === 'DAType') - return Array.from( - data.querySelectorAll( - `DOType > DA[type="${id}"],DAType > BDA[type="${id}"]` - ) - ).some(typeChild => hasConnectionToIed(typeChild.parentElement!, ied)); - - if (type.tagName === 'DOType') - return Array.from( - data.querySelectorAll( - `LNodeType > DO[type="${id}"], DOType > SDO[type="${id}"]` - ) - ).some(typeChild => hasConnectionToIed(typeChild.parentElement!, ied)); - - return Array.from(ied.getElementsByTagName('LN0')) - .concat(Array.from(ied.getElementsByTagName('LN'))) - .some(anyln => anyln.getAttribute('lnType') === id); -} - -function addEnumType( - ied: Element, - enumType: Element, - parent: Element -): SimpleAction | undefined { - if (!hasConnectionToIed(enumType, ied)) return; - - const existEnumType = parent.querySelector( - `EnumType[id="${enumType.getAttribute('id')}"]` - ); - if (existEnumType && enumType.isEqualNode(existEnumType)) return; - - if (existEnumType) { - // There is an `id` conflict in the project that must be resolved by - // concatenating the IED name with the id - const data: Element = enumType.parentElement!; - const idOld = enumType.getAttribute('id'); - const idNew = ied.getAttribute('name')! + idOld; - enumType.setAttribute('id', idNew); - - data - .querySelectorAll( - `DOType > DA[type="${idOld}"],DAType > BDA[type="${idOld}"]` - ) - .forEach(type => type.setAttribute('type', idNew)); - } - - return { - new: { - parent, - element: enumType, - }, - }; -} - -function addDAType( - ied: Element, - daType: Element, - parent: Element -): SimpleAction | undefined { - if (!hasConnectionToIed(daType, ied)) return; - - const existDAType = parent.querySelector( - `DAType[id="${daType.getAttribute('id')}"]` - ); - if (existDAType && daType.isEqualNode(existDAType)) return; - - if (existDAType) { - // There is an `id` conflict in the project that must be resolved by - // concatenating the IED name with the id - const data: Element | null = daType.parentElement!; - const idOld = daType.getAttribute('id'); - const idNew = ied.getAttribute('name')! + idOld; - daType.setAttribute('id', idNew); - - data - .querySelectorAll( - `DOType > DA[type="${idOld}"],DAType > BDA[type="${idOld}"]` - ) - .forEach(type => type.setAttribute('type', idNew)); - } - - return { - new: { - parent, - element: daType, - }, - }; -} - -function addDOType( - ied: Element, - doType: Element, - parent: Element -): SimpleAction | undefined { - if (!hasConnectionToIed(doType, ied)) return; - - const existDOType = parent.querySelector( - `DOType[id="${doType.getAttribute('id')}"]` - ); - if (existDOType && doType.isEqualNode(existDOType)) return; - - if (existDOType) { - // There is an `id` conflict in the project that must be resolved by - // concatenating the IED name with the id - const data: Element = doType.parentElement!; - const idOld = doType.getAttribute('id'); - const idNew = ied.getAttribute('name')! + idOld; - doType.setAttribute('id', idNew); - - data - .querySelectorAll( - `LNodeType > DO[type="${idOld}"], DOType > SDO[type="${idOld}"]` - ) - .forEach(type => type.setAttribute('type', idNew)); - } - - return { - new: { - parent, - element: doType, - }, - }; -} - -function addLNodeType( - ied: Element, - lNodeType: Element, - parent: Element -): SimpleAction | undefined { - if (!hasConnectionToIed(lNodeType, ied)) return; - - const existLNodeType = parent.querySelector( - `LNodeType[id="${lNodeType.getAttribute('id')}"]` - ); - if (existLNodeType && lNodeType.isEqualNode(existLNodeType)) return; - - if (existLNodeType) { - // There is an `id` conflict in the project that must be resolved by - // concatenating the IED name with the id - const idOld = lNodeType.getAttribute('id')!; - const idNew = ied.getAttribute('name')!.concat(idOld); - lNodeType.setAttribute('id', idNew); - - Array.from( - ied.querySelectorAll(`LN0[lnType="${idOld}"],LN[lnType="${idOld}"]`) - ) - .filter(isPublic) - .forEach(ln => ln.setAttribute('lnType', idNew)); - } - - return { - new: { - parent, - element: lNodeType, - }, - }; -} - -function addDataTypeTemplates(ied: Element, doc: XMLDocument): SimpleAction[] { - const actions: (SimpleAction | undefined)[] = []; - - const dataTypeTemplates = doc.querySelector(':root > DataTypeTemplates') - ? doc.querySelector(':root > DataTypeTemplates')! - : createElement(doc, 'DataTypeTemplates', {}); - - if (!dataTypeTemplates.parentElement) { - actions.push({ - new: { - parent: doc.querySelector('SCL')!, - element: dataTypeTemplates, - }, - }); - } - - ied.ownerDocument - .querySelectorAll(':root > DataTypeTemplates > LNodeType') - .forEach(lNodeType => - actions.push(addLNodeType(ied, lNodeType, dataTypeTemplates!)) - ); - - ied.ownerDocument - .querySelectorAll(':root > DataTypeTemplates > DOType') - .forEach(doType => - actions.push(addDOType(ied, doType, dataTypeTemplates!)) - ); - - ied.ownerDocument - .querySelectorAll(':root > DataTypeTemplates > DAType') - .forEach(daType => - actions.push(addDAType(ied, daType, dataTypeTemplates!)) - ); - - ied.ownerDocument - .querySelectorAll(':root > DataTypeTemplates > EnumType') - .forEach(enumType => - actions.push(addEnumType(ied, enumType, dataTypeTemplates!)) - ); - - return actions.filter(item => item !== undefined); -} - -function isIedNameUnique(ied: Element, doc: Document): boolean { - const existingIedNames = Array.from(doc.querySelectorAll(':root > IED')).map( - ied => ied.getAttribute('name')! - ); - const importedIedName = ied.getAttribute('name')!; - - if (existingIedNames.includes(importedIedName)) return false; - - return true; -} - -export default class ImportingIedPlugin extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - @state() - iedSelection: TemplateResult[] = []; - - @query('#importied-plugin-input') pluginFileUI!: HTMLInputElement; - @query('mwc-dialog') dialog!: Dialog; - - async run(): Promise { - this.iedSelection = []; - this.pluginFileUI.click(); - } - - async docUpdate(): Promise { - await ((this.getRootNode() as ShadowRoot).host as LitElement) - .updateComplete; - } - - private importIED(ied: Element): void { - if (ied.getAttribute('name') === 'TEMPLATE') { - const newIedName = uniqueTemplateIedName(this.doc, ied); - - ied.setAttribute('name', newIedName); - - Array.from( - ied.ownerDocument.querySelectorAll( - ':root > Communication > SubNetwork > ConnectedAP[iedName="TEMPLATE"]' - ) - ).forEach(connectedAp => connectedAp.setAttribute('iedName', newIedName)); - } - - if (!isIedNameUnique(ied, this.doc)) { - this.dispatchEvent( - newLogEvent({ - kind: 'error', - title: get('import.log.nouniqueied', { - name: ied.getAttribute('name')!, - }), - }) - ); - return; - } - - // This doesn't provide redo/undo capability as it is not using the Editing - // action API. To use it would require us to cache the full SCL file in - // OpenSCD as it is now which could use significant memory. - - // TODO: In open-scd core update this to allow including in undo/redo. - updateNamespaces( - this.doc.documentElement, - ied.ownerDocument.documentElement - ); - - const dataTypeTemplateActions = addDataTypeTemplates(ied, this.doc); - const communicationActions = addCommunicationElements(ied, this.doc); - const actions = communicationActions.concat(dataTypeTemplateActions); - actions.push({ - new: { - parent: this.doc!.querySelector(':root')!, - element: ied, - }, - }); - - this.dispatchEvent( - newActionEvent({ - title: get('editing.import', { name: ied.getAttribute('name')! }), - actions, - }) - ); - } - - private async importIEDs( - importDoc: XMLDocument, - fileName: string - ): Promise { - const documentDialog: Dialog = this.shadowRoot!.querySelector( - `mwc-dialog[data-file="${fileName}"]` - )!; - - const selectedItems = ( - (documentDialog.querySelector('filtered-list')).selected - ); - - const ieds = selectedItems - .map(item => { - return find(importDoc, 'IED', item.value); - }) - .filter(ied => ied) as Element[]; - - documentDialog.close(); - - for (const ied of ieds) { - this.importIED(ied); - await this.docUpdate(); - } - } - - async prepareImport(importDoc: XMLDocument, fileName: string): Promise { - if (!importDoc) { - this.dispatchEvent( - newLogEvent({ - kind: 'error', - title: get('import.log.loaderror'), - }) - ); - return; - } - - if (importDoc.querySelector('parsererror')) { - this.dispatchEvent( - newLogEvent({ - kind: 'error', - title: get('import.log.parsererror'), - }) - ); - return; - } - - const ieds = Array.from(importDoc.querySelectorAll(':root > IED')); - if (ieds.length === 0) { - this.dispatchEvent( - newLogEvent({ - kind: 'error', - title: get('import.log.missingied'), - }) - ); - return; - } - - if (ieds.length === 1) { - this.importIED(ieds[0]); - return await this.docUpdate(); - } - - this.buildIedSelection(importDoc, fileName); - await this.requestUpdate(); - const dialog = ( - this.shadowRoot!.querySelector(`mwc-dialog[data-file="${fileName}"]`) - ); - dialog.show(); - - // await closing of dialog - await new Promise(resolve => { - dialog.addEventListener('closed', function onClosed(evt) { - evt.target?.removeEventListener('closed', onClosed); - resolve(); - }); - }); - } - - /** Loads the file `event.target.files[0]` into [[`src`]] as a `blob:...`. */ - protected async onLoadFiles(event: Event): Promise { - const files = Array.from( - (event.target)?.files ?? [] - ); - - const promises = files.map(file => { - return { - text: file - .text() - .then(text => - new DOMParser().parseFromString(text, 'application/xml') - ), - name: file.name, - }; - }); - - for await (const file of promises) { - await this.prepareImport(await file.text, file.name); - } - } - - protected renderInput(): TemplateResult { - return html` { - this.onLoadFiles(event); - (event.target).value = ''; - }} id="importied-plugin-input" accept=".sed,.scd,.ssd,.isd,.iid,.cid,.icd" type="file">`; - } - - protected buildIedSelection(importDoc: XMLDocument, fileName: string): void { - this.iedSelection.push(html` - - ${Array.from(importDoc?.querySelectorAll(':root > IED') ?? []).map( - ied => - html`${ied.getAttribute('name')}` - )} - - - - this.importIEDs(importDoc, fileName)} - > - `); - } - - render(): TemplateResult { - return html`${this.iedSelection}${this.renderInput()}`; - } - - static styles = css` - input { - width: 0; - height: 0; - opacity: 0; - } - `; -} diff --git a/packages/compas-open-scd/src/menu/LocamationVMU.ts b/packages/compas-open-scd/src/menu/LocamationVMU.ts index 21fb441b5..af5fa50c4 100644 --- a/packages/compas-open-scd/src/menu/LocamationVMU.ts +++ b/packages/compas-open-scd/src/menu/LocamationVMU.ts @@ -1,7 +1,7 @@ import {LitElement} from 'lit-element'; -import {newWizardEvent} from '../foundation.js'; -import {Nsdoc} from "../foundation/nsdoc.js"; +import {newWizardEvent} from 'open-scd/src/foundation.js'; +import {Nsdoc} from "open-scd/src/foundation/nsdoc.js"; import "../locamation/LocamationIEDList.js"; diff --git a/packages/compas-open-scd/src/menu/Merge.ts b/packages/compas-open-scd/src/menu/Merge.ts deleted file mode 100644 index b5c3afa91..000000000 --- a/packages/compas-open-scd/src/menu/Merge.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { css, html, LitElement, query, TemplateResult } from 'lit-element'; - -import { newWizardEvent } from '../foundation.js'; -import { mergeWizard } from '../wizards.js'; - -export default class MergePlugin extends LitElement { - doc!: XMLDocument; - - @query('#merge-plugin-input') pluginFileUI!: HTMLInputElement; - - mergeDoc(event: Event): void { - const file = - (event.target)?.files?.item(0) ?? false; - if (file) - file.text().then(text => { - const doc = new DOMParser().parseFromString(text, 'application/xml'); - this.dispatchEvent( - newWizardEvent( - mergeWizard(this.doc.documentElement, doc.documentElement) - ) - ); - }); - this.pluginFileUI.onchange = null; - } - - async run(): Promise { - this.pluginFileUI.click(); - } - - render(): TemplateResult { - return html` - ((event.target).value = '')} @change=${ - this.mergeDoc - } id="merge-plugin-input" accept=".sed,.scd,.ssd,.isd,.iid,.cid,.icd" type="file">`; - } - - static styles = css` - input { - width: 0; - height: 0; - opacity: 0; - } - `; -} diff --git a/packages/compas-open-scd/src/menu/NewProject.ts b/packages/compas-open-scd/src/menu/NewProject.ts deleted file mode 100644 index 5abfa42b4..000000000 --- a/packages/compas-open-scd/src/menu/NewProject.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { html, LitElement } from 'lit-element'; -import { get } from 'lit-translate'; - -import '@material/mwc-list'; -import '@material/mwc-list/mwc-radio-list-item'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../wizard-textfield.js'; -import { - EditorAction, - newLogEvent, - newOpenDocEvent, - newWizardEvent, - Wizard, - WizardInputElement, -} from '../foundation.js'; -import { newEmptySCD, SupportedVersion } from '../schemas.js'; - -export default class NewProjectPlugin extends LitElement { - private createNewProject( - inputs: WizardInputElement[], - wizard: Element - ): EditorAction[] { - const docName = inputs[0].value?.match(/\.s[sc]d$/i) - ? inputs[0].value - : inputs[0].value + '.scd'; - const version = ( - (wizard.shadowRoot!.querySelector('mwc-list')!.selected) - .value - ); - - this.dispatchEvent(newLogEvent({ kind: 'reset' })); - this.dispatchEvent( - newOpenDocEvent(newEmptySCD(docName.slice(0, -4), version), docName) - ); - - return [{ actions: [], title: '', derived: true }]; - } - - private newProjectWizard(): Wizard { - return [ - { - title: get('menu.new'), - primary: { - icon: 'create_new_folder', - label: get('create'), - action: (inputs, wizard) => this.createNewProject(inputs, wizard), - }, - content: [ - html` - - Edition 1 (Schema 1.7) - Edition 2 (Schema 3.1) - Edition 2.1 (2007B4) - `, - ], - }, - ]; - } - - async run(): Promise { - this.dispatchEvent(newWizardEvent(this.newProjectWizard())); - } -} diff --git a/packages/compas-open-scd/src/menu/OpenProject.ts b/packages/compas-open-scd/src/menu/OpenProject.ts deleted file mode 100644 index 915ae50a2..000000000 --- a/packages/compas-open-scd/src/menu/OpenProject.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { css, html, LitElement, query, TemplateResult } from 'lit-element'; - -import { newLogEvent, newOpenDocEvent } from '../foundation.js'; - -export default class OpenProjectPlugin extends LitElement { - @query('#open-plugin-input') pluginFileUI!: HTMLInputElement; - - async openDoc(event: Event): Promise { - const file = - (event.target)?.files?.item(0) ?? false; - if (!file) return; - - const text = await file.text(); - const docName = file.name; - const doc = new DOMParser().parseFromString(text, 'application/xml'); - - this.dispatchEvent(newLogEvent({ kind: 'reset' })); - this.dispatchEvent(newOpenDocEvent(doc, docName)); - this.pluginFileUI.onchange = null; - this.closeMenu(); - } - - private async closeMenu() { - this.dispatchEvent( - new CustomEvent('close-drawer', { - bubbles: true, - composed: true, // to traverse shadow DOM boundaries src: https://pm.dartus.fr/blog/a-complete-guide-on-shadow-dom-and-event-propagation/ - }) - ); - } - - async run(): Promise { - this.pluginFileUI.click(); - } - - render(): TemplateResult { - return html` - ((event.target).value = '')} @change=${ - this.openDoc - } id="open-plugin-input" accept=".sed,.scd,.ssd,.isd,.iid,.cid,.icd" type="file">`; - } - - static styles = css` - input { - width: 0; - height: 0; - opacity: 0; - } - `; -} diff --git a/packages/compas-open-scd/src/menu/SaveProject.ts b/packages/compas-open-scd/src/menu/SaveProject.ts deleted file mode 100644 index 505e2e738..000000000 --- a/packages/compas-open-scd/src/menu/SaveProject.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { LitElement, property } from 'lit-element'; - -function formatXml(xml: string, tab?: string) { - let formatted = '', - indent = ''; - - if (!tab) tab = '\t'; - xml.split(/>\s*\r\n'; - if (node.match(/^]*[^/]$/)) indent += tab; - }); - return formatted.substring(1, formatted.length - 3); -} - -export default class SaveProjectPlugin extends LitElement { - @property() doc!: XMLDocument; - @property() docName!: string; - - async run(): Promise { - if (this.doc) { - let documentAsString = formatXml( - new XMLSerializer().serializeToString(this.doc) - ); - - // Add XML declaration/prolog if it's been stripped - // TODO: This can be removed once the improved OpenSCD core edit API is present - documentAsString = documentAsString.startsWith('' + '\n' + documentAsString; - - const blob = new Blob([documentAsString], { - type: 'application/xml', - }); - - const a = document.createElement('a'); - a.download = this.docName; - a.href = URL.createObjectURL(blob); - a.dataset.downloadurl = ['application/xml', a.download, a.href].join(':'); - a.style.display = 'none'; - document.body.appendChild(a); - a.click(); - document.body.removeChild(a); - setTimeout(function () { - URL.revokeObjectURL(a.href); - }, 5000); - } - } -} diff --git a/packages/compas-open-scd/src/menu/SclHistory.ts b/packages/compas-open-scd/src/menu/SclHistory.ts deleted file mode 100644 index 6797b9f54..000000000 --- a/packages/compas-open-scd/src/menu/SclHistory.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { - html, - css, - property, - query, - TemplateResult, - LitElement, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-button'; -import '@material/mwc-dialog'; -import '@material/mwc-list'; -import '@material/mwc-list/mwc-list-item'; -import { Dialog } from '@material/mwc-dialog'; - -export default class SclHistoryPlugin extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - - @query('#historyLog') historyLog!: Dialog; - - private createMessage( - who: string | null, - why: string | null - ): string | undefined { - let message = who; - if (message !== null && why !== null) { - message += ' : ' + why; - } else if (why !== null) { - message = why; - } - return message ?? undefined; - } - - get sclHistory(): Element[] { - if (this.doc) { - return Array.from( - this.doc.querySelectorAll(':root > Header > History > Hitem') - ); - } - return []; - } - - async run(): Promise { - this.historyLog.open = true; - } - - renderSclHistoryEntry(element: Element): TemplateResult { - const message = this.createMessage( - element.getAttribute('who'), - element.getAttribute('why') - ); - const title = element.getAttribute('what'); - return html` - - - ${element.getAttribute('when')} - ${title} - ${message} - `; - } - - private renderSclHistory(): TemplateResult[] | TemplateResult { - if (this.sclHistory.length > 0) - return this.sclHistory - .slice() - .reverse() - .map(this.renderSclHistoryEntry, this); - else - return html` - ${translate('history.noEntries')} - `; - } - - render(): TemplateResult { - return html` - ${this.renderSclHistory()} - ${translate('close')} - `; - } - - static styles = css` - .sclHistory { - display: flex; - } - #historyLog { - --mdc-dialog-min-width: 92vw; - } - abbr { - text-decoration: none; - } - `; -} diff --git a/packages/compas-open-scd/src/menu/SubscriberInfo.ts b/packages/compas-open-scd/src/menu/SubscriberInfo.ts deleted file mode 100644 index 537472c21..000000000 --- a/packages/compas-open-scd/src/menu/SubscriberInfo.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { LitElement } from 'lit-element'; -import { get } from 'lit-translate'; -import { - createElement, - getVersion, - newActionEvent, - SimpleAction, -} from '../foundation.js'; - -function getElementIndexOf(list: (Element | null)[], match: Element): number { - for (let i = 0; list.length; i++) if (list[i]?.isEqualNode(match)) return i; - - return -1; -} - -function addIEDName(extRef: Element, gseControl: Element): Element | null { - const [ied, accPoint, lDevice, ln, ln0] = [ - 'IED', - 'AccessPoint', - 'LDevice', - 'LN', - 'LN0', - ].map(element => extRef.closest(element)); - const anyln = ln ? ln : ln0; - - if ( - getVersion(extRef) === '2007' && - Array.from(gseControl.getElementsByTagName('IEDName')) - .filter(item => !item.closest('Private')) - .filter( - iedName => - iedName.innerHTML === ied.getAttribute('name') && - (iedName.getAttribute('apRef') ?? '') === - (accPoint.getAttribute('name') ?? '') && - (iedName.getAttribute('ldInst') ?? '') === - (lDevice.getAttribute('inst') ?? '') && - (iedName.getAttribute('prefix') ?? '') === - (anyln.getAttribute('prefix') ?? '') && - (iedName.getAttribute('lnClass') ?? '') === - (anyln.getAttribute('lnClass') ?? '') && - (iedName.getAttribute('lnInst') ?? '') === - (anyln.getAttribute('inst') ?? '') - ).length === 0 - ) { - const iedName: Element = createElement( - gseControl.ownerDocument, - 'IEDName', - { - apRef: accPoint.getAttribute('name') ?? '', - ldInst: lDevice.getAttribute('inst') ?? '', - prefix: anyln.getAttribute('prefix') ?? '', - lnClass: anyln.getAttribute('lnClass') ?? '', - lnInst: anyln.getAttribute('inst') || null, - } - ); - iedName.innerHTML = ied.getAttribute('name')!; - - return iedName; - } - - if ( - Array.from(gseControl.getElementsByTagName('IEDName')) - .filter(item => !item.closest('Private')) - .filter(iedName => iedName.innerHTML === ied.getAttribute('name')) - .length === 0 - ) { - const iedName: Element = createElement( - gseControl.ownerDocument, - 'IEDName', - {} - ); - iedName.innerHTML = ied.getAttribute('name')!; - - return iedName; - } - - return null; -} - -function getDestination(data: Element, doc: Document): Element[] { - return Array.from(doc.getElementsByTagName('ExtRef')) - .filter(item => !item.closest('Private')) - .filter( - extRef => - (extRef.getAttribute('iedName') ?? '') === - (data.closest('IED')?.getAttribute('name') ?? '') && - (extRef.getAttribute('ldInst') ?? '') === - (data.getAttribute('ldInst') ?? '') && - (extRef.getAttribute('prefix') ?? '') === - (data.getAttribute('prefix') ?? '') && - (extRef.getAttribute('lnClass') ?? '') === - (data.getAttribute('lnClass') ?? '') && - (extRef.getAttribute('lnInst') ?? '') === - (data.getAttribute('lnInst') ?? '') && - (extRef.getAttribute('doName') ?? '') === - (data.getAttribute('doName') ?? '') && - (extRef.getAttribute('daName') ?? '') === - (data.getAttribute('daName') ?? '') - ); -} - -export function createMissingIEDNameSubscriberInfo( - doc: Document -): SimpleAction[] { - const controlList = Array.from( - doc.querySelectorAll( - ':root > IED > AccessPoint > Server > LDevice > LN0 > GSEControl,' + - ':root > IED > AccessPoint > Server > LDevice > LN0 > SampledValueControl' - ) - ); - - const simpleAction: SimpleAction[] = []; - controlList.forEach(controlBlock => { - if (!controlBlock.getAttribute('datSet') || !controlBlock.parentElement) - return simpleAction; - - const ln0: Element = controlBlock.parentElement; - const dataList: Element[] = Array.from( - ln0.querySelectorAll( - `:root > IED > AccessPoint > Server > LDevice > LN0 > DataSet[name="${controlBlock.getAttribute( - 'datSet' - )}"] > FCDA` - ) - ); - - const destList: Element[] = dataList - .flatMap(data => getDestination(data, doc)) - .filter(dest => dest !== null) - .filter((v, i, a) => a.indexOf(v) === i); - - const iedNameList: (Element | null)[] = destList - .map(dest => addIEDName(dest, controlBlock)) - .filter(iedName => iedName !== null) - .filter((v, i, a) => getElementIndexOf(a, v!) === i); - - iedNameList.forEach(iedName => { - simpleAction.push({ - new: { - parent: controlBlock, - element: iedName!, - }, - }); - }); - }); - - return simpleAction; -} - -export default class SubscriberInfoPlugin extends LitElement { - doc!: XMLDocument; - - async run(): Promise { - const actions: SimpleAction[] = createMissingIEDNameSubscriberInfo( - this.doc! - ); - - if (!actions.length) - throw new Error( - get('subscriber.description') + get('subscriber.nonewitems') - ); - - this.dispatchEvent( - newActionEvent({ - title: - get('subscriber.description') + - get('subscriber.message', { - updatenumber: actions.length, - }), - actions: actions, - }) - ); - - return; - } -} diff --git a/packages/compas-open-scd/src/menu/UpdateDescriptionABB.ts b/packages/compas-open-scd/src/menu/UpdateDescriptionABB.ts deleted file mode 100644 index 3a2db629b..000000000 --- a/packages/compas-open-scd/src/menu/UpdateDescriptionABB.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { html, LitElement } from 'lit-element'; -import { get } from 'lit-translate'; - -import '@material/mwc-list/mwc-check-list-item'; -import { List } from '@material/mwc-list'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../filtered-list.js'; -import { - cloneElement, - find, - identity, - isPublic, - newWizardEvent, - SCLTag, - Wizard, - WizardAction, - WizardActor, - WizardInputElement, -} from '../foundation.js'; - -interface addDescItem { - desc: string; - tag: SCLTag; - identity: string | number; -} - -function addDescriptionAction(doc: XMLDocument): WizardActor { - return ( - _: WizardInputElement[], - wizard: Element, - list: List | null | undefined - ): WizardAction[] => { - const selectedItems = list!.selected; - - const actions = selectedItems.map(item => { - const desc = (item.querySelector('span')).textContent; - const [tag, identity] = item.value.split(' | '); - - const oldElement = find(doc, tag, identity)!; - const newElement = cloneElement(oldElement, { desc }); - return { old: { element: oldElement }, new: { element: newElement } }; - }); - - return [ - { - title: get('updatedesc.abb'), - actions, - }, - ]; - }; -} - -function createLogWizard(doc: XMLDocument, items: addDescItem[]): Wizard { - return [ - { - title: get('wizard.title.add', { tagName: 'desc' }), - primary: { - label: get('save'), - icon: 'save', - action: addDescriptionAction(doc), - }, - content: [ - html`${Array.from( - items.map( - item => - html`${item.desc}${item.tag + ' | ' + item.identity}` - ) - )}`, - ], - }, - ]; -} - -function addDescriptionToABB(ied: Element): addDescItem[] { - return Array.from(ied.getElementsByTagName('ExtRef')) - .filter(element => isPublic(element)) - .filter(extRef => extRef.getAttribute('intAddr')) - .map(extRef => { - const intAddr = extRef.getAttribute('intAddr')!; - const internalMapping = intAddr.split(',')[3]; //this might change as is vendor dependant!! - const oldDesc = extRef.getAttribute('desc'); - const newDesc = oldDesc - ? oldDesc + '-' + internalMapping - : internalMapping; - - return { - desc: newDesc, - tag: 'ExtRef', - identity: identity(extRef), - }; - }); -} - -/** Plug-in that enriched ExtRefs desc attribute based on intAddr attribute (ABB)*/ -export default class UpdateDescriptionAbb extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - doc!: XMLDocument; - - /** Entry point for this plug-in */ - async run(): Promise { - const items = Array.from(this.doc.querySelectorAll(':root > IED')).flatMap( - ied => addDescriptionToABB(ied) - ); - - this.dispatchEvent(newWizardEvent(createLogWizard(this.doc, items))); - } -} diff --git a/packages/compas-open-scd/src/menu/UpdateDescriptionSEL.ts b/packages/compas-open-scd/src/menu/UpdateDescriptionSEL.ts deleted file mode 100644 index 1918a5337..000000000 --- a/packages/compas-open-scd/src/menu/UpdateDescriptionSEL.ts +++ /dev/null @@ -1,253 +0,0 @@ -import { css, html, LitElement, query, TemplateResult } from 'lit-element'; -import { get } from 'lit-translate'; - -import '@material/mwc-list/mwc-check-list-item'; -import { List } from '@material/mwc-list'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../filtered-list.js'; -import { - cloneElement, - find, - identity, - isPublic, - newWizardEvent, - SCLTag, - Wizard, - WizardAction, - WizardActor, - WizardInputElement, -} from '../foundation.js'; - -interface SignalDescription { - desc: string; - tag: SCLTag; - identity: string | number; -} - -function addDescriptionToSEL( - ied: Element, - signalList: string[][] -): SignalDescription[] { - const iedName = ied.getAttribute('name'); - const manufacturer = ied.getAttribute('manufacturer'); - if (!iedName || manufacturer !== 'SEL') return []; - - return Array.from(ied.getElementsByTagName('DAI')) - .filter(element => isPublic(element)) - .filter(dai => { - const datasrc = dai.getAttributeNS( - 'http://www.selinc.com/2006/61850', - 'datasrc' - ); - return datasrc?.startsWith('db:'); - }) - .map(dai => { - //the next lines are vendor dependant!! - const datasrc = dai.getAttributeNS( - 'http://www.selinc.com/2006/61850', - 'datasrc' - ); - - const tag = datasrc ? datasrc.replace('db:', '') : null; - const desc = - signalList.find(row => row[2] === tag && row[1] === iedName)?.[0] ?? - null; - - return desc ? { desc, tag: 'DAI', identity: identity(dai) } : null; - }) - .filter(signalDescription => signalDescription); -} - -function addDescriptionAction(doc: XMLDocument): WizardActor { - return ( - _: WizardInputElement[], - wizard: Element, - list: List | null | undefined - ): WizardAction[] => { - const selectedItems = list!.selected; - - const actions = selectedItems.map(item => { - const desc = (item.querySelector('span')).textContent; - const [tag, identity] = item.value.split(' | '); - - const oldElement = find(doc, tag, identity)!; - const newElement = cloneElement(oldElement, { desc }); - return { old: { element: oldElement }, new: { element: newElement } }; - }); - - return [ - { - title: get('updatedesc.sel'), - actions, - }, - ]; - }; -} - -function createLogWizard(doc: XMLDocument, items: SignalDescription[]): Wizard { - return [ - { - title: get('wizard.title.add', { tagName: 'desc' }), - primary: { - label: get('save'), - icon: 'save', - action: addDescriptionAction(doc), - }, - content: [ - html`${Array.from( - items.map( - item => - html`${item.desc}${item.tag + ' | ' + item.identity}` - ) - )}`, - ], - }, - ]; -} - -function parseCsv(str: string, delimiter: ',' | ';'): string[][] { - // predefined for later use - const quoteChar = '"', - escapeChar = '\\'; - - const entries: string[][] = []; - let isInsideQuote = false; - - // Iterate over each character, keep track of current row and column (of the returned array) - for (let row = 0, col = 0, char = 0; char < str.length; char++) { - const currentChar = str[char]; - const nextChar = str[char + 1]; - - entries[row] = entries[row] || []; - entries[row][col] = entries[row][col] || ''; - - //Ignore escape character - if (currentChar === escapeChar) { - entries[row][col] += nextChar; - ++char; - continue; - } - - // Check for quoted characters. Do not miss-interpret delimiter within field - if (currentChar === quoteChar) { - isInsideQuote = !isInsideQuote; - continue; - } - - if (!isInsideQuote) { - if (currentChar === delimiter) { - ++col; - entries[row][col] = ''; - continue; - } - - if (currentChar === '\n' || currentChar === '\r') { - ++row; - col = 0; - - // Skip the next character for CRLF - if (currentChar === '\r' && nextChar === '\n') ++char; - - continue; - } - } - - entries[row][col] += currentChar; - } - - return entries; -} - -function getGuessDelimiter(csvString: string): ';' | ',' { - let numberComma = 0, - numberSemicolon = 0; - - const quoteChar = '"'; - - let isInsideQuote = false; - for (const currentChar of csvString) { - // Check for quoted characters. Do not miss-interpret delimiter within field - if (currentChar === quoteChar) { - isInsideQuote = !isInsideQuote; - continue; - } - - if (!isInsideQuote) { - if (currentChar === ';') { - numberSemicolon++; - continue; - } - - if (currentChar === ',') { - numberComma++; - continue; - } - } - } - - return numberComma > numberSemicolon ? ',' : ';'; -} - -/** - * Plug-in that enriches the desc attribute in SEL type IED elements based on a signal list - * The signal list must be a ; or , separated CSV file with 3 columns. - * 1st column: signal name - * 2nd column: IED name - * 3rd column: identifier from the SEL namespace excluding the prefix of "db:", - * similar to relay word bit name (RWB), e.g. SV24T, 51P1T, IN203 - */ -export default class UpdateDescriptionSel extends LitElement { - /** The document being edited as provided to plugins by [[`OpenSCD`]]. */ - doc!: XMLDocument; - - @query('#plugin-input') pluginFileUI!: HTMLInputElement; - - processSignalList(csvString: string): void { - const signalList = parseCsv(csvString, getGuessDelimiter(csvString)); - - const items = Array.from(this.doc.querySelectorAll('IED')) - .filter(ied => isPublic(ied)) - .flatMap(ied => addDescriptionToSEL(ied, signalList)); - - this.dispatchEvent(newWizardEvent(createLogWizard(this.doc, items))); - } - - private async onFileInput(e: Event): Promise { - const file = (e.target)?.files?.item(0) ?? false; - if (!file) return; - - this.processSignalList(await file.text()); - } - - /** Entry point for this plug-in */ - async run(): Promise { - this.pluginFileUI.click(); - } - - render(): TemplateResult { - return html` - ((event.target).value = '')} @change=${(e: Event) => - this.onFileInput( - e - )} id="plugin-input" accept=".csv" type="file">`; - } - - static styles = css` - input { - width: 0; - height: 0; - opacity: 0; - } - `; -} diff --git a/packages/compas-open-scd/src/menu/UpdateSubstation.ts b/packages/compas-open-scd/src/menu/UpdateSubstation.ts index 4a928e766..cacfdf44b 100644 --- a/packages/compas-open-scd/src/menu/UpdateSubstation.ts +++ b/packages/compas-open-scd/src/menu/UpdateSubstation.ts @@ -8,8 +8,8 @@ import { newWizardEvent, SCLTag, tags, -} from '../foundation.js'; -import { Diff, mergeWizard } from '../wizards.js'; +} from 'open-scd/src/foundation.js'; +import { Diff, mergeWizard } from 'open-scd/src/wizards.js'; export function isValidReference( doc: XMLDocument, diff --git a/packages/compas-open-scd/src/menu/VirtualTemplateIED.ts b/packages/compas-open-scd/src/menu/VirtualTemplateIED.ts deleted file mode 100644 index dd2501924..000000000 --- a/packages/compas-open-scd/src/menu/VirtualTemplateIED.ts +++ /dev/null @@ -1,340 +0,0 @@ -import { - css, - html, - LitElement, - property, - query, - queryAll, - state, - TemplateResult, -} from 'lit-element'; -import { translate } from 'lit-translate'; - -import '@material/mwc-dialog'; -import '@material/mwc-list'; -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-list/mwc-check-list-item'; -import '@material/mwc-list/mwc-radio-list-item'; -import { Dialog } from '@material/mwc-dialog'; -import { CheckListItem } from '@material/mwc-list/mwc-check-list-item'; -import { Select } from '@material/mwc-select'; - -import '../filtered-list.js'; -import { - find, - getChildElementsByTagName, - identity, - newActionEvent, -} from '../foundation.js'; -import { WizardTextField } from '../wizard-textfield.js'; -import { - getFunctionNamingPrefix, - getNonLeafParent, - getSpecificationIED, - getUniqueFunctionName, - LDeviceDescription, -} from './virtualtemplateied/foundation.js'; - -export type FunctionElementDescription = { - uniqueName: string; - lNodes: Element[]; - lln0?: Element; -}; - -/** converts FunctionElementDescription's to LDeviceDescription's */ -function getLDeviceDescriptions( - functions: Record, - selectedLNodes: Element[], - selectedLLN0s: string[] -): LDeviceDescription[] { - const lDeviceDescriptions: LDeviceDescription[] = []; - - Object.values(functions).forEach(functionDescription => { - if ( - functionDescription.lNodes.some(lNode => selectedLNodes.includes(lNode)) - ) { - const lLN0 = selectedLLN0s.find(selectedLLN0 => - selectedLLN0.includes(functionDescription.uniqueName) - )!; - const lnType = lLN0?.split(': ')[1]; - - lDeviceDescriptions.push({ - validLdInst: functionDescription.uniqueName, - anyLNs: [ - { prefix: null, lnClass: 'LLN0', inst: '', lnType }, - ...functionDescription.lNodes - .filter(lNode => selectedLNodes.includes(lNode)) - .map(lNode => { - return { - prefix: getFunctionNamingPrefix(lNode), - lnClass: lNode.getAttribute('lnClass')!, - inst: lNode.getAttribute('lnInst')!, - lnType: lNode.getAttribute('lnType')!, - }; - }), - ], - }); - } - }); - - return lDeviceDescriptions; -} - -/** Groups all incomming LNode's with non-leaf parent function type elements */ -function groupLNodesToFunctions( - lNodes: Element[] -): Record { - const functionElements: Record = {}; - - lNodes.forEach(lNode => { - const parentFunction = getNonLeafParent(lNode); - if (!parentFunction) return; - - if (functionElements[identity(parentFunction)]) - functionElements[identity(parentFunction)].lNodes.push(lNode); - else { - functionElements[identity(parentFunction)] = { - uniqueName: getUniqueFunctionName(parentFunction), - lNodes: [lNode], - lln0: getChildElementsByTagName(parentFunction, 'LNode').find( - lNode => lNode.getAttribute('lnClass') === 'LLN0' - ), - }; - } - }); - - return functionElements; -} - -export default class VirtualTemplateIED extends LitElement { - @property({ attribute: false }) - doc!: XMLDocument; - @property({ type: Number }) - editCount = -1; - @state() - get isValidManufacturer(): boolean { - const manufacturer = this.dialog?.querySelector( - 'wizard-textfield[label="manufacturer"]' - )!.value; - - return (manufacturer && manufacturer !== '') || false; - } - @state() - get isValidApName(): boolean { - const apName = this.dialog?.querySelector( - 'wizard-textfield[label="AccessPoint name"]' - )!.value; - - return (apName && apName !== '') || false; - } - @state() - get someItemsSelected(): boolean { - if (!this.selectedLNodeItems) return false; - return !!this.selectedLNodeItems.length; - } - @state() - get validPriparyAction(): boolean { - return ( - this.someItemsSelected && this.isValidManufacturer && this.isValidApName - ); - } - - get unreferencedLNodes(): Element[] { - return Array.from( - this.doc.querySelectorAll('LNode[iedName="None"]') - ).filter(lNode => lNode.getAttribute('lnClass') !== 'LLN0'); - } - - get lLN0s(): Element[] { - return Array.from(this.doc.querySelectorAll('LNodeType[lnClass="LLN0"]')); - } - - @query('mwc-dialog') dialog!: Dialog; - @queryAll('mwc-check-list-item[selected]') - selectedLNodeItems?: CheckListItem[]; - - async run(): Promise { - this.dialog.open = true; - } - - private onPrimaryAction( - functions: Record - ): void { - const selectedLNode = Array.from( - this.dialog.querySelectorAll( - 'mwc-check-list-item[selected]:not([disabled])' - ) ?? [] - ).map(selectedItem => find(this.doc, 'LNode', selectedItem.value)!); - if (!selectedLNode.length) return; - - const selectedLLN0s = Array.from( - this.dialog.querySelectorAlle.target).selected?.value; - const selectedBType = (( - (e.target).parentElement!.querySelector( - 'wizard-select[label="Val"]' - )! - ); - render(html`${enumVals}`, selectValOptionUI); - selectValOptionUI.requestUpdate(); -} - -function selectBType( - e: SelectedEvent, - bType: string | null, - type: string | null -): void { - const bTypeSelected = (( - (e.target).parentElement!.querySelector( - 'wizard-select[label="Val"]' - )! - ); - if (bTypeSelected === 'Enum') selectValOptionUI.style.display = ''; - else selectValOptionUI.style.display = 'none'; - - const textfieldValOptionUI = ( - (( - parent.wizardUI.dialog?.querySelector('mwc-select[label="type"]') - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not add conducting equipment if name attribute is not unique', async () => { - typeSelect.value = 'CBR'; - nameField.value = 'QA1'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelectorAll( - 'VoltageLevel[name="E1"] > Bay[name="COUPLING_BAY"] > ConductingEquipment[name="QA1"]' - ).length - ).to.equal(1); - }); - it('does add conducting equipment if name attribute is unique', async () => { - typeSelect.value = 'CBR'; - nameField.value = 'QA2'; - await parent.updateComplete; - primaryAction.click(); - expect( - doc.querySelector( - 'VoltageLevel[name="E1"] > Bay[name="COUPLING_BAY"] > ConductingEquipment[name="QA2"]' - ) - ).to.exist; - }); - }); - describe('open lnode wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: BayEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('bay-editor'); - - (( - element?.shadowRoot?.querySelector( - 'mwc-icon-button[icon="account_tree"]' - ) - )).click(); - await parent.updateComplete; - }); - it('opens lnode wizard ', async () => { - expect(parent.wizardUI).to.exist; - }); - it('has two wizard pages', async () => { - expect(parent.wizardUI.dialogs.length).to.equal(2); - }); - }); - describe('move action', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: BayEditor | null; - let element2: BayEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`${Array.from(doc?.querySelectorAll('Bay') ?? []).map( - bay => html`` - )} - >` - ) - ); - element = parent.querySelector('bay-editor:nth-child(1)'); - element2 = parent.querySelector('bay-editor:nth-child(2)'); - }); - it('moves Bay within VoltageLevel', async () => { - expect(doc.querySelector('Bay')?.getAttribute('name')).to.equal( - 'COUPLING_BAY' - ); - (( - element2?.shadowRoot?.querySelector('mwc-icon-button[icon="forward"]') - )).click(); - await parent.updateComplete; - (element).click(); - await parent.updateComplete; - expect(doc.querySelector('Bay')?.getAttribute('name')).to.equal('Bay2'); - }); - }); - describe('remove action', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: BayEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - element = parent.querySelector('bay-editor'); - }); - it('removes Bay on clicking delete button', async () => { - expect(doc.querySelector('Bay[name="COUPLING_BAY"]')).to.exist; - (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - )).click(); - await parent.updateComplete; - expect(doc.querySelector('Bay[name="COUPLING_BAY"]')).to.not.exist; - }); - }); - - describe('clone action', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: BayEditor | null; - let copyContentButton: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/clone/noUnusedLNode.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - element = parent.querySelector('bay-editor'); - await parent.updateComplete; - - copyContentButton = ( - element?.shadowRoot?.querySelector( - 'mwc-icon-button[icon="content_copy"]' - ) - ); - }); - it('duplicates Bay on clicking duplicate button', async () => { - copyContentButton.click(); - await parent.updateComplete; - expect(doc.querySelector('Bay[name="Q03')).to.exist; - }); - - it('removes all LNode elements in the copy', async () => { - expect(doc.querySelector('Bay[name="Q01"]')?.querySelector('LNode')).to - .exist; - copyContentButton.click(); - await parent.updateComplete; - expect(doc.querySelector('Bay[name="Q03"]')?.querySelector('LNode')).to - .not.exist; - }); - - it('removes all Terminal elements expect the grounding in the copy', async () => { - expect( - doc - .querySelector('Bay[name="Q01"]') - ?.querySelector('Terminal:not([cNodeName="grounded"])') - ).to.exist; - copyContentButton.click(); - await parent.updateComplete; - expect( - doc - .querySelector('Bay[name="Q03"]') - ?.querySelector('Terminal:not([cNodeName="grounded"])') - ).to.not.exist; - }); - - it('removes all ConnectivityNode elements in the copy', async () => { - expect( - doc.querySelector('Bay[name="Q01"]')?.querySelector('ConnectivityNode') - ).to.exist; - copyContentButton.click(); - await parent.updateComplete; - expect( - doc.querySelector('Bay[name="Q03"]')?.querySelector('ConnectivityNode') - ).to.not.exist; - }); - - it('keeps all ConductingEquipment elements in the copy', async () => { - copyContentButton.click(); - await parent.updateComplete; - expect( - doc - .querySelector('Bay[name="Q01"]') - ?.querySelectorAll('ConductingEquipment').length - ).to.equal( - doc - .querySelector('Bay[name="Q03"]') - ?.querySelectorAll('ConductingEquipment').length - ); - }); - }); - - describe('open create wizard for element Function', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: BayEditor | null; - - let nameField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('bay-editor'); - - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="Function"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not add Function if name attribute is not unique', async () => { - expect( - doc.querySelector('Bay[name="COUPLING_BAY"] > Function[name="bayName"]') - ).to.exist; - - nameField.value = 'bayName'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'Bay[name="COUPLING_BAY"] > Function[name="bayName"]' - ).length - ).to.equal(1); - }); - - it('does add Function if name attribute is unique', async () => { - expect( - doc.querySelector( - 'Bay[name="COUPLING_BAY"] > Function[name="someNewFunction"]' - ) - ).to.not.exist; - - nameField.value = 'someNewFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'Bay[name="COUPLING_BAY"] > Function[name="someNewFunction"]' - ) - ).to.exist; - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: BayEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('bay-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/bay-editor-wizarding.test.ts b/packages/compas-open-scd/test/integration/editors/substation/bay-editor-wizarding.test.ts deleted file mode 100644 index 8000af015..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/bay-editor-wizarding.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; -import fc from 'fast-check'; - -import '../../../mock-wizard.js'; -import { MockWizard } from '../../../mock-wizard.js'; - -import '../../../../src/editors/substation/bay-editor.js'; -import { regExp, regexString } from '../../../foundation.js'; - -describe('bay-editor wizarding integration', () => { - let doc: XMLDocument; - let parent: MockWizard; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - (( - parent - ?.querySelector('bay-editor') - ?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - }); - it('looks like the latest snapshot', async () => { - await expect(parent.wizardUI.dialog).to.equalSnapshot(); - }); - describe('the first input element', () => { - it('edits the attribute name', async () => { - expect(parent.wizardUI.inputs[0].label).to.equal('name'); - }); - it('edits only for valid inputs', async () => { - await fc.assert( - fc.asyncProperty(regexString(regExp.tName, 1), async name => { - parent.wizardUI.inputs[0].value = name; - await parent.updateComplete; - expect(parent.wizardUI.inputs[0].checkValidity()).to.be.true; - }) - ); - }); - }); - describe('the second input element', () => { - it('edits the attribute desc', async () => { - expect(parent.wizardUI.inputs[1].label).to.equal('desc'); - }); - it('edits only for valid inputs', async () => { - await fc.assert( - fc.asyncProperty(regexString(regExp.desc), async desc => { - parent.wizardUI.inputs[1].value = desc; - await parent.updateComplete; - expect(parent.wizardUI.inputs[1].checkValidity()).to.be.true; - }) - ); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/conducting-equipment-editor-wizarding-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/conducting-equipment-editor-wizarding-editing.test.ts deleted file mode 100644 index 0db9428e6..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/conducting-equipment-editor-wizarding-editing.test.ts +++ /dev/null @@ -1,353 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import '../../../../src/editors/substation/conducting-equipment-editor.js'; -import { ConductingEquipmentEditor } from '../../../../src/editors/substation/conducting-equipment-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: ConductingEquipmentEditor -) => Promise = ( - parent: MockWizardEditor, - element: ConductingEquipmentEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot?.querySelector("mwc-icon-button[icon='playlist_add']")!.click(); - const lnodeMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='LNode']` - )!; - lnodeMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('conducting-equipment-editor wizarding editing integration', () => { - describe('edit wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: ConductingEquipmentEditor | null; - - let nameField: WizardTextField; - let descField: WizardTextField; - let secondaryAction: HTMLElement; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - element = parent.querySelector('conducting-equipment-editor'); - await (( - element?.shadowRoot?.querySelector('*[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - descField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="desc"]') - ); - secondaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - it('closes on secondary action', async () => { - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - expect(parent.wizardUI.dialog).to.not.exist; - }); - it('does not change name attribute if not unique within parent element', async () => { - const oldName = nameField.value; - nameField.value = 'QA1'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('ConductingEquipment')?.getAttribute('name') - ).to.equal(oldName); - }); - it('changes name attribute on primary action', async () => { - nameField.value = 'newName'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('ConductingEquipment')?.getAttribute('name') - ).to.equal('newName'); - }); - it('changes desc attribute on primary action', async () => { - descField.value = 'newDesc'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('ConductingEquipment')?.getAttribute('desc') - ).to.equal('newDesc'); - }); - it('deletes desc attribute if wizard-textfield is deactivated', async () => { - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - descField.nullSwitch!.click(); - await parent.updateComplete; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('ConductingEquipment')?.getAttribute('desc')).to - .be.null; - }); - }); - describe('open lnode wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: ConductingEquipmentEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('conducting-equipment-editor'); - - (( - element?.shadowRoot?.querySelector('*[icon="account_tree"]') - )).click(); - await parent.updateComplete; - }); - it('opens lnode wizard ', async () => { - expect(parent.wizardUI).to.exist; - }); - it('has two wizard pages', async () => { - expect(parent.wizardUI.dialogs.length).to.equal(2); - }); - }); - describe('move action', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: ConductingEquipmentEditor | null; - let element2: ConductingEquipmentEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`${Array.from( - doc?.querySelectorAll( - 'Bay[name="COUPLING_BAY"] > ConductingEquipment' - ) ?? [] - ).map( - condEq => - html`` - )} - >` - ) - ); - element = parent.querySelector( - 'conducting-equipment-editor:nth-child(1)' - ); - element2 = parent.querySelector( - 'conducting-equipment-editor:nth-child(2)' - ); - }); - it('moves ConductingEquipment within Bay', async () => { - expect( - doc.querySelector('ConductingEquipment')?.getAttribute('name') - ).to.equal('QA1'); - (( - element2?.shadowRoot?.querySelector('*[icon="forward"]') - )).click(); - await parent.updateComplete; - (element).click(); - await parent.updateComplete; - expect( - doc.querySelector('ConductingEquipment')?.getAttribute('name') - ).to.equal('QB1'); - }); - }); - describe('remove action', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: ConductingEquipmentEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - element = parent.querySelector('conducting-equipment-editor'); - }); - it('removes ConductingEquipment on clicking delete button', async () => { - expect(doc.querySelector('ConductingEquipment[name="QA1"]')).to.exist; - (( - element?.shadowRoot?.querySelector('*[icon="delete"]') - )).click(); - await parent.updateComplete; - expect(doc.querySelector('ConductingEquipment[name="QA1"]')).to.not.exist; - }); - }); - - describe('open create wizard for element EqFunction', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: ConductingEquipmentEditor | null; - - let nameField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('conducting-equipment-editor'); - - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="EqFunction"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not add EqFunction if name attribute is not unique', async () => { - expect( - doc.querySelector( - 'ConductingEquipment > EqFunction[name="myEqFuncQA1"]' - ) - ).to.exist; - - nameField.value = 'myEqFuncQA1'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'ConductingEquipment > EqFunction[name="myEqFuncQA1"]' - ).length - ).to.equal(1); - }); - - it('does add EqFunction if name attribute is unique', async () => { - expect( - doc.querySelector( - 'ConductingEquipment > EqFunction[name="someNewFunction"]' - ) - ).to.not.exist; - - nameField.value = 'someNewFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'ConductingEquipment > EqFunction[name="someNewFunction"]' - ) - ).to.exist; - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: ConductingEquipmentEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('conducting-equipment-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/conducting-equipment-editor-wizarding.test.ts b/packages/compas-open-scd/test/integration/editors/substation/conducting-equipment-editor-wizarding.test.ts deleted file mode 100644 index de28338c2..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/conducting-equipment-editor-wizarding.test.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; -import fc from 'fast-check'; - -import '../../../mock-wizard.js'; -import { MockWizard } from '../../../mock-wizard.js'; - -import '../../../../src/editors/substation/conducting-equipment-editor.js'; -import { regexString, regExp } from '../../../foundation.js'; - -describe('conducting-equipment-editor wizarding integration', () => { - let doc: XMLDocument; - let parent: MockWizard; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - (( - parent - ?.querySelector('conducting-equipment-editor') - ?.shadowRoot?.querySelector('*[icon="edit"]') - )).click(); - await parent.updateComplete; - }); - it('looks like the latest snapshot', async () => { - await expect(parent.wizardUI.dialog).to.equalSnapshot(); - }); - it('the first input element only displaying the type', () => { - expect(parent.wizardUI.inputs[0]).to.have.property('disabled', true); - }); - describe('the second input element', () => { - it('edits the attribute name', async () => { - expect(parent.wizardUI.inputs[1].label).to.equal('name'); - }); - it('edits only for valid inputs', async () => { - await fc.assert( - fc.asyncProperty(regexString(regExp.tName, 1), async name => { - parent.wizardUI.inputs[1].value = name; - await parent.updateComplete; - expect(parent.wizardUI.inputs[0].checkValidity()).to.be.true; - }) - ); - }); - }); - describe('the third input element', () => { - it('edits the attribute desc', async () => { - expect(parent.wizardUI.inputs[2].label).to.equal('desc'); - }); - it('edits only for valid inputs', async () => { - await fc.assert( - fc.asyncProperty(regexString(regExp.desc), async desc => { - parent.wizardUI.inputs[2].value = desc; - await parent.updateComplete; - expect(parent.wizardUI.inputs[1].checkValidity()).to.be.true; - }) - ); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/eq-function-wizarding-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/eq-function-wizarding-editing.test.ts deleted file mode 100644 index 50944c7e9..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/eq-function-wizarding-editing.test.ts +++ /dev/null @@ -1,292 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../../../../src/editors/substation/eq-function-editor.js'; -import { EqFunctionEditor } from '../../../../src/editors/substation/eq-function-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: EqFunctionEditor -) => Promise = ( - parent: MockWizardEditor, - element: EqFunctionEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot?.querySelector("mwc-icon-button[icon='playlist_add']")!.click(); - const lnodMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='LNode']` - )!; - lnodMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('eq-function-editor wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: EqFunctionEditor | null; - - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html` EqFunction' - )} - >` - ) - ); - - element = parent.querySelector('eq-function-editor'); - }); - - describe('open create wizard for element EqSubFunction', () => { - let nameField: WizardTextField; - - beforeEach(async () => { - (( - element?.shadowRoot?.querySelector( - 'mwc-list-item[value="EqSubFunction"]' - ) - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not add EqSubFunction if name attribute is not unique', async () => { - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqSubFunc"]' - ) - ).to.exist; - - nameField.value = 'myEqSubFunc'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqSubFunc"]' - ).length - ).to.equal(1); - }); - - it('does add EqFunction if name attribute is unique', async () => { - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="someNewEqSubFunction"]' - ) - ).to.not.exist; - - nameField.value = 'someNewEqSubFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="someNewEqSubFunction"]' - ) - ).to.exist; - }); - }); - - describe('open edit wizard', () => { - let nameField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - element!.element = doc.querySelector( - 'PowerTransformer[name="myPtr3"] > EqFunction[name="myEqFuncQB3"]' - )!; - - (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not update Function if name attribute is not unique', async () => { - expect( - doc.querySelectorAll( - 'PowerTransformer[name="myPtr3"] > EqFunction[name="myEqFuncQB2"]' - ) - ).to.lengthOf(1); - - nameField.value = 'myEqFuncQB2'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'PowerTransformer[name="myPtr3"] > EqFunction[name="myEqFuncQB2"]' - ) - ).to.lengthOf(1); - }); - - it('does update Function if name attribute is unique', async () => { - nameField.value = 'someNewFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'PowerTransformer[name="myPtr3"] > EqFunction[name="someNewFunction"]' - ) - ).to.exist; - expect( - doc.querySelector( - 'PowerTransformer[name="myPtr3"] > EqFunction[name="myEqFuncQB3"]' - ) - ).to.not.exist; - }); - }); - - describe('open create wizard for element LNode', () => { - let listItems: ListItemBase[]; - - beforeEach(async () => { - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="LNode"]') - )).click(); - await parent.updateComplete; - - listItems = Array.from( - parent.wizardUI!.dialog!.querySelectorAll( - 'mwc-check-list-item' - ) - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('add selected LNode instances to SubFcuntion parent', async () => { - listItems[3].selected = true; - listItems[5].selected = true; - - await primaryAction.click(); - - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] > EqFunction > LNode[iedName="None"][lnClass="CSWI"][lnInst="1"]' - ) - ).to.exist; - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] > EqFunction > LNode[iedName="None"][lnClass="CSWI"][lnInst="2"]' - ) - ).to.exist; - }); - }); - - describe('has a delete icon button that', () => { - let deleteButton: HTMLElement; - - beforeEach(async () => { - deleteButton = ( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - ); - await parent.updateComplete; - }); - - it('removes the attached EqFunction element from the document', async () => { - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqSubFunc"]' - ) - ).to.exist; - - await deleteButton.click(); - - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqSubFunc"]' - ) - ).to.not.exist; - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: EqFunctionEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html` EqFunction' - )} - >` - ) - ); - - element = parent.querySelector('eq-function-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/eq-sub-function-editor-wizarding-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/eq-sub-function-editor-wizarding-editing.test.ts deleted file mode 100644 index 36660c1d6..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/eq-sub-function-editor-wizarding-editing.test.ts +++ /dev/null @@ -1,293 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../../../../src/editors/substation/eq-sub-function-editor.js'; -import { EqSubFunctionEditor } from '../../../../src/editors/substation/eq-sub-function-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: EqSubFunctionEditor -) => Promise = ( - parent: MockWizardEditor, - element: EqSubFunctionEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot?.querySelector("mwc-icon-button[icon='playlist_add']")!.click(); - const lnodeMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='LNode']` - )!; - lnodeMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('eq-sub-function-editor wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: EqSubFunctionEditor | null; - - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('eq-sub-function-editor'); - }); - - describe('open create wizard for element EqSubFunction', () => { - let nameField: WizardTextField; - - beforeEach(async () => { - (( - element?.shadowRoot?.querySelector( - 'mwc-list-item[value="EqSubFunction"]' - ) - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not add EqSubFunction if name attribute is not unique', async () => { - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqSubSubFunction"]' - ) - ).to.exist; - - nameField.value = 'myEqSubSubFunction'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqSubSubFunction"]' - ).length - ).to.equal(1); - }); - - it('does add EqFunction if name attribute is unique', async () => { - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="someNewEqSubFunction"]' - ) - ).to.not.exist; - - nameField.value = 'someNewEqSubFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="someNewEqSubFunction"]' - ) - ).to.exist; - }); - }); - - describe('open edit wizard', () => { - let nameField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - element!.element = doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqSubSubFunction"]' - )!; - - (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not update EqSubFunction if name attribute is not unique', async () => { - expect( - doc.querySelectorAll( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqFunc2"]' - ) - ).to.lengthOf(1); - - nameField.value = 'myEqFunc2'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqFunc2"]' - ) - ).to.lengthOf(1); - }); - - it('does update EqSubFunction if name attribute is unique', async () => { - nameField.value = 'someNewFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="someNewFunction"]' - ) - ).to.exist; - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqSubSubFunction"]' - ) - ).to.not.exist; - }); - }); - - describe('open create wizard for element LNode', () => { - let listItems: ListItemBase[]; - - beforeEach(async () => { - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="LNode"]') - )).click(); - await parent.updateComplete; - - listItems = Array.from( - parent.wizardUI!.dialog!.querySelectorAll( - 'mwc-check-list-item' - ) - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('add selected LNode instances to SubFcuntion parent', async () => { - listItems[3].selected = true; - listItems[5].selected = true; - - await primaryAction.click(); - - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction > LNode[iedName="None"][lnClass="CSWI"][lnInst="1"]' - ) - ).to.exist; - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction > LNode[iedName="None"][lnClass="CSWI"][lnInst="2"]' - ) - ).to.exist; - }); - }); - - describe('has a delete icon button that', () => { - let deleteButton: HTMLElement; - - beforeEach(async () => { - deleteButton = ( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - ); - await parent.updateComplete; - }); - - it('removes the attached Function element from the document', async () => { - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqSubSubFunction"]' - ) - ).to.exist; - - await deleteButton.click(); - - expect( - doc.querySelector( - 'ConductingEquipment[name="QA1"] EqSubFunction[name="myEqSubSubFunction"]' - ) - ).to.not.exist; - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: EqSubFunctionEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html` EqFunction' - )} - >` - ) - ); - - element = parent.querySelector('eq-sub-function-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/function-editor.test.ts b/packages/compas-open-scd/test/integration/editors/substation/function-editor.test.ts deleted file mode 100644 index 425331244..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/function-editor.test.ts +++ /dev/null @@ -1,282 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../../../../src/editors/substation/function-editor.js'; -import { FunctionEditor } from '../../../../src/editors/substation/function-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: FunctionEditor -) => Promise = ( - parent: MockWizardEditor, - element: FunctionEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot?.querySelector("mwc-icon-button[icon='playlist_add']")!.click(); - const subFunctionMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='SubFunction']` - )!; - subFunctionMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('function-editor wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: FunctionEditor | null; - - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('function-editor'); - }); - - describe('open create wizard for element SubFunction', () => { - let nameField: WizardTextField; - - beforeEach(async () => { - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="SubFunction"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not add SubFunction if name attribute is not unique', async () => { - expect( - doc.querySelector( - 'Substation > Function > SubFunction[name="mySubFunc"]' - ) - ).to.exist; - - nameField.value = 'mySubFunc'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'Substation > Function > SubFunction[name="mySubFunc"]' - ).length - ).to.equal(1); - }); - - it('does add SubFunction if name attribute is unique', async () => { - expect( - doc.querySelector( - 'Substation > Function > SubFunction[name="someNewFunction"]' - ) - ).to.not.exist; - - nameField.value = 'someNewFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'Substation > Function > SubFunction[name="someNewFunction"]' - ) - ).to.exist; - }); - }); - - describe('open edit wizard', () => { - let nameField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - element!.element = doc.querySelector( - 'Bay[name="COUPLING_BAY"] > Function[name="bayName"]' - )!; - - (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not update Function if name attribute is not unique', async () => { - expect( - doc.querySelectorAll( - 'Bay[name="COUPLING_BAY"] > Function[name="bay2Func"]' - ) - ).to.lengthOf(1); - - nameField.value = 'bay2Func'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'Bay[name="COUPLING_BAY"] > Function[name="bay2Func"]' - ) - ).to.lengthOf(1); - }); - - it('does update Function if name attribute is unique', async () => { - nameField.value = 'someNewFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'Bay[name="COUPLING_BAY"] > Function[name="someNewFunction"]' - ) - ).to.exist; - expect( - doc.querySelector('Bay[name="COUPLING_BAY"] > Function[name="bayName"]') - ).to.not.exist; - }); - }); - - describe('open create wizard for element LNode', () => { - let listItems: ListItemBase[]; - - beforeEach(async () => { - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="LNode"]') - )).click(); - await parent.updateComplete; - - listItems = Array.from( - parent.wizardUI!.dialog!.querySelectorAll( - 'mwc-check-list-item' - ) - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('add selected LNode instances to Function parent', async () => { - listItems[3].selected = true; - listItems[5].selected = true; - - await primaryAction.click(); - - expect( - doc.querySelector( - 'Function > LNode[iedName="None"][lnClass="CSWI"][lnInst="1"]' - ) - ).to.exist; - expect( - doc.querySelector( - 'Function > LNode[iedName="None"][lnClass="CSWI"][lnInst="2"]' - ) - ).to.exist; - }); - }); - - describe('has a delete icon button that', () => { - let deleteButton: HTMLElement; - - beforeEach(async () => { - deleteButton = ( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - ); - await parent.updateComplete; - }); - - it('removes the attached Function element from the document', async () => { - expect( - doc.querySelector('Substation[name="AA1"] > Function[name="myFunc"]') - ).to.exist; - - await deleteButton.click(); - - expect( - doc.querySelector('Substation[name="AA1"] > Function[name="myFunc"]') - ).to.not.exist; - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: FunctionEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('function-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/general-equipment-editor-wizard-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/general-equipment-editor-wizard-editing.test.ts deleted file mode 100644 index 9ee7b788f..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/general-equipment-editor-wizard-editing.test.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../../../../src/editors/substation/general-equipment-editor.js'; -import { GeneralEquipmentEditor } from '../../../../src/editors/substation/general-equipment-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: GeneralEquipmentEditor -) => Promise = ( - parent: MockWizardEditor, - element: GeneralEquipmentEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot - ?.querySelector("mwc-icon-button[icon='playlist_add']")! - .click(); - const lnodMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='LNode']` - )!; - lnodMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"][dialogaction="close"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('general-equipment-editor wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: GeneralEquipmentEditor | null; - - describe('edit wizard', () => { - let nameField: WizardTextField; - let descField: WizardTextField; - let typeField: WizardTextField; - let secondaryAction: HTMLElement; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch( - '/test/testfiles/editors/substation/generalequipment.scd' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('general-equipment-editor'); - await (( - element?.shadowRoot?.querySelector('mwc-fab[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - descField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="desc"]') - ); - typeField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="type"]') - ); - secondaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - it('closes on secondary action', async () => { - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - expect(parent.wizardUI.dialog).to.not.exist; - }); - it('does not change name attribute if not unique within parent element', async () => { - const oldName = nameField.value; - nameField.value = 'genSub2'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('GeneralEquipment')?.getAttribute('name') - ).to.equal(oldName); - }); - it('changes name attribute on primary action', async () => { - parent.wizardUI.inputs[0].value = 'newName'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('GeneralEquipment')?.getAttribute('name') - ).to.equal('newName'); - }); - it('changes type attribute on primary action', async () => { - parent.wizardUI.inputs[2].value = 'newAXN'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('GeneralEquipment')?.getAttribute('type') - ).to.equal('newAXN'); - }); - it('changes desc attribute on primary action', async () => { - descField.value = 'newDesc'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('GeneralEquipment')?.getAttribute('desc') - ).to.equal('newDesc'); - }); - it('deletes desc attribute if wizard-textfield is deactivated', async () => { - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - descField.nullSwitch!.click(); - await parent.updateComplete; - await primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('GeneralEquipment')?.getAttribute('desc')).to.be - .null; - }); - - describe('has a delete icon button that', () => { - let deleteButton: HTMLElement; - - beforeEach(async () => { - deleteButton = ( - element?.shadowRoot?.querySelector('mwc-fab[icon="delete"]') - ); - await parent.updateComplete; - }); - - it('removes the attached GeneralEquipment element from the document', async () => { - expect( - doc.querySelector( - 'Substation[name="AA1"] > GeneralEquipment[name="genSub"]' - ) - ).to.exist; - - await deleteButton.click(); - - expect( - doc.querySelector( - 'Substation[name="AA1"] > GeneralEquipment[name="genSub"]' - ) - ).to.not.exist; - }); - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: GeneralEquipmentEditor | null; - - beforeEach(async () => { - doc = await fetch( - '/test/testfiles/editors/substation/generalequipment.scd' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('general-equipment-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/guess-wizarding-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/guess-wizarding-editing.test.ts deleted file mode 100644 index aefa5d989..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/guess-wizarding-editing.test.ts +++ /dev/null @@ -1,258 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../../../mock-wizard.js'; -import { MockWizard } from '../../../mock-wizard.js'; -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import { guessVoltageLevel } from '../../../../src/editors/substation/guess-wizard.js'; - -describe('guess-wizard-integration', () => { - let element: MockWizard; - let validSCL: XMLDocument; - beforeEach(async () => { - validSCL = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - const substation = validSCL.querySelector('Substation')!; - substation.innerHTML = ''; - element = await fixture(html``); - - const wizard = guessVoltageLevel(validSCL, substation); - element.workflow.push(() => wizard); - await element.requestUpdate(); - }); - - describe('renders one wizard page', () => { - it('asking which ctlModel the is used for switchgear', async () => { - expect(element.wizardUI.dialogs.length).to.equal(1); - expect( - element.wizardUI.dialog!.querySelectorAll( - '#ctlModelList > mwc-check-list-item' - ).length - ).to.equal(5); - }); - - it('the first one being status-only', async () => { - expect( - element.wizardUI.dialog!.querySelector( - '#ctlModelList > mwc-check-list-item:nth-child(1)' - )?.innerHTML - ).to.equal('status-only'); - }); - - it('the second one being direct-with-normal-security', async () => { - expect( - element.wizardUI.dialog!.querySelector( - '#ctlModelList > mwc-check-list-item:nth-child(2)' - )?.innerHTML - ).to.equal('direct-with-normal-security'); - }); - - it('the second one being direct-with-enhanced-security', async () => { - expect( - element.wizardUI.dialog!.querySelector( - '#ctlModelList > mwc-check-list-item:nth-child(3)' - )?.innerHTML - ).to.equal('direct-with-enhanced-security'); - }); - - it('the second one being sbo-with-normal-security', async () => { - expect( - element.wizardUI.dialog!.querySelector( - '#ctlModelList > mwc-check-list-item:nth-child(4)' - )?.innerHTML - ).to.equal('sbo-with-normal-security'); - }); - - it('the second one being sbo-with-enhanced-security', async () => { - expect( - element.wizardUI.dialog!.querySelector( - '#ctlModelList > mwc-check-list-item:nth-child(5)' - )?.innerHTML - ).to.equal('sbo-with-enhanced-security'); - }); - }); -}); - -describe('guess-wizarding-editing-integration', () => { - let element: MockWizardEditor; - let validSCL: XMLDocument; - beforeEach(async () => { - validSCL = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - const substation = validSCL.querySelector('Substation')!; - substation.innerHTML = ''; - element = ( - await fixture(html``) - ); - - const wizard = guessVoltageLevel(validSCL, substation); - element.workflow.push(() => wizard); - await element.requestUpdate(); - - (( - element.wizardUI.dialog!.querySelector( - '#ctlModelList > mwc-check-list-item:nth-child(5)' - ) - )).click(); - //FIXME: hack as default selected attribute does not work in Karma. - await element.requestUpdate(); - (( - element.wizardUI.dialog?.querySelector('mwc-button[slot="primaryAction"]') - )).click(); - await element.requestUpdate(); - }); - - it('creates only one voltage level with default name', () => { - expect( - validSCL.querySelectorAll(':root > Substation > VoltageLevel').length - ).to.equal(1); - expect( - validSCL - .querySelector(':root > Substation > VoltageLevel') - ?.getAttribute('name') - ).to.equal('E1'); - expect( - validSCL - .querySelector(':root > Substation > VoltageLevel') - ?.getAttribute('desc') - ).to.equal('guessed by OpenSCD'); - }); - - it('creates as many bays as ieds with lnType CSWI and ctlModel sbo-with-enhanced-security', () => { - expect( - validSCL.querySelectorAll(':root > Substation > VoltageLevel > Bay') - .length - ).to.equal(1); - }); - it('creates correct number of conducting equipments', () => { - expect( - validSCL.querySelectorAll( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment' - ).length - ).to.equal(4); - }); - it('creates only unique conducting equipment names', () => { - const nameArray: string[] = Array.from( - validSCL.querySelectorAll( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment' - ) - ).map(item => item.getAttribute('name')!); - const nameSet = new Set(nameArray); - expect(nameArray.length).to.equal(nameSet.size); - }); - it('creates unique conducting equipment name, if no prefix is there', () => { - expect( - validSCL - .querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(1)' - ) - ?.getAttribute('name') - ).to.equal('QA1'); - expect( - validSCL - .querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(4)' - ) - ?.getAttribute('name') - ).to.equal('QB1'); - }); - it('uses prefix for conducting equipment name, if prefix is available', () => { - expect( - validSCL - .querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(2)' - ) - ?.getAttribute('name') - ).to.equal('CB2'); - expect( - validSCL - .querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(3)' - ) - ?.getAttribute('name') - ).to.equal('DC1'); - }); - it('automatically adds loginal nodes to the first conducting equipment', () => { - expect( - validSCL.querySelectorAll( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(1) > LNode' - ).length - ).to.equal(2); - expect( - validSCL.querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(1) > LNode[iedName="IED1"][ldInst="CircuitBreaker_CB1"][lnClass="XCBR"][lnInst="1"]' - ) - ).to.exist; - expect( - validSCL.querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(1) > LNode[iedName="IED1"][ldInst="CircuitBreaker_CB1"][lnClass="CSWI"][lnInst="1"]' - ) - ).to.exist; - }); - it('automatically adds loginal nodes to the second conducting equipment', () => { - expect( - validSCL.querySelectorAll( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(2) > LNode' - ).length - ).to.equal(2); - expect( - validSCL.querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(2) > LNode[iedName="IED1"][ldInst="CircuitBreaker_CB1"][prefix="CB"][lnClass="XCBR"][lnInst="2"]' - ) - ).to.exist; - expect( - validSCL.querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(2) > LNode[iedName="IED1"][ldInst="CircuitBreaker_CB1"][prefix="CB"][lnClass="CSWI"][lnInst="2"]' - ) - ).to.exist; - }); - it('automatically adds loginal nodes to the third conducting equipment', () => { - expect( - validSCL.querySelectorAll( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(3) > LNode' - ).length - ).to.equal(3); - expect( - validSCL.querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(3) > LNode[iedName="IED1"][ldInst="Disconnectors"][prefix="DC"][lnClass="XSWI"][lnInst="1"]' - ) - ).to.exist; - expect( - validSCL.querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(3) > LNode[iedName="IED1"][ldInst="Disconnectors"][prefix="DC"][lnClass="CSWI"][lnInst="1"]' - ) - ).to.exist; - expect( - validSCL.querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(3) > LNode[iedName="IED1"][ldInst="Disconnectors"][prefix="DC"][lnClass="CILO"][lnInst="1"]' - ) - ).to.exist; - }); - it('automatically adds loginal nodes to the fourth conducting equipment', () => { - expect( - validSCL.querySelectorAll( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(4) > LNode' - ).length - ).to.equal(3); - expect( - validSCL.querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(4) > LNode[iedName="IED1"][ldInst="Disconnectors"][lnClass="XSWI"][lnInst="3"]' - ) - ).to.exist; - expect( - validSCL.querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(4) > LNode[iedName="IED1"][ldInst="Disconnectors"][lnClass="CSWI"][lnInst="3"]' - ) - ).to.exist; - expect( - validSCL.querySelector( - ':root > Substation > VoltageLevel > Bay > ConductingEquipment:nth-child(4) > LNode[iedName="IED1"][ldInst="Disconnectors"][lnClass="CILO"][lnInst="3"]' - ) - ).to.exist; - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/ied-editor-wizarding-integration.test.ts b/packages/compas-open-scd/test/integration/editors/substation/ied-editor-wizarding-integration.test.ts deleted file mode 100644 index 9b32b6439..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/ied-editor-wizarding-integration.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import '../../../../src/editors/substation/ied-editor.js'; -import { FilteredList } from '../../../../src/filtered-list.js'; -import { IedEditor } from '../../../../src/editors/substation/ied-editor.js'; - -describe('IED editor component wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let iededitor: IedEditor; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - const ied = doc.querySelector('IED[name="IED2"]'); - - parent = ( - await fixture( - html`` - ) - ); - iededitor = parent.querySelector('ied-editor'); - await parent.updateComplete; - }); - - it('opens select wizard showing GSEControl of one IED', async () => { - (( - iededitor.shadowRoot?.querySelector('mwc-fab[class="selectgse"]') - )).click(); - await parent.updateComplete; - - expect(parent.wizardUI.dialog).to.exist; - const gseControlList = ( - parent.wizardUI.dialog?.querySelector('filtered-list') - ); - await gseControlList.updateComplete; - - expect(gseControlList.items.length).to.equal( - doc.querySelectorAll('IED[name="IED2"] GSEControl').length - ); - }); - - it('opens select wizard showing ReportControl of one IED', async () => { - (( - iededitor.shadowRoot?.querySelector('mwc-fab[class="selectreport"]') - )).click(); - await parent.updateComplete; - - expect(parent.wizardUI.dialog).to.exist; - const reportControlList = ( - parent.wizardUI.dialog?.querySelector('filtered-list') - ); - await reportControlList.updateComplete; - - expect(reportControlList.items.length).to.equal( - doc.querySelectorAll('IED[name="IED2"] ReportControl').length - ); - }); - - it('opens wizard showing References of one IED', async () => { - (( - iededitor.shadowRoot?.querySelector('mwc-fab[class="delete"]') - )).click(); - await parent.updateComplete; - - expect(parent.wizardUI.dialog).to.exist; - const referencesList = parent.wizardUI.dialog?.querySelectorAll('mwc-list-item'); - - expect(referencesList).to.be.not.undefined; - expect(referencesList!.length).to.equal(7); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/l-node-editor-wizarding-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/l-node-editor-wizarding-editing.test.ts deleted file mode 100644 index b878882f6..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/l-node-editor-wizarding-editing.test.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import '../../../../src/editors/substation/l-node-editor.js'; -import { LNodeEditor } from '../../../../src/editors/substation/l-node-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; - -describe('l-node-editor wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: LNodeEditor | null; - - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - parent = ( - await fixture( - html` LNode[lnClass="CSWI"]')} - >` - ) - ); - - element = parent.querySelector('l-node-editor'); - }); - - describe('has a delete icon button that', () => { - let deleteButton: HTMLElement; - - beforeEach(async () => { - deleteButton = ( - element?.shadowRoot?.querySelector('mwc-fab[icon="delete"]') - ); - await parent.updateComplete; - }); - - it('removes the attached LNode element from the document', async () => { - expect(doc.querySelector('Substation > LNode[lnClass="CSWI"]')).to.exist; - - await deleteButton.click(); - - expect(doc.querySelector('Substation > LNode[lnClass="CSWI"]')).to.not - .exist; - }); - }); - - describe('has a edit icon button that', () => { - let prefixField: WizardTextField; - let lnInstField: WizardTextField; - - beforeEach(async () => { - element!.element = doc.querySelector( - 'SubFunction[name="myBaySubFunc"] > LNode[lnClass="XSWI"]' - )!; - - (( - element?.shadowRoot?.querySelector('mwc-fab[icon="edit"]') - )).click(); - await parent.updateComplete; - - prefixField = ( - parent.wizardUI.dialog?.querySelector( - 'wizard-textfield[label="prefix"]' - ) - ); - - lnInstField = ( - parent.wizardUI.dialog?.querySelector( - 'wizard-textfield[label="lnInst"]' - ) - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - - await parent.updateComplete; - }); - - it('changes prefix attribute on primary action', async () => { - prefixField.value = 'newPref'; - - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelector( - 'SubFunction[name="myBaySubFunc"] > LNode[lnClass="XSWI"]' - ) - ).to.have.attribute('prefix', 'newPref'); - }); - - it('changes lnInst attribute on primary action', async () => { - lnInstField.value = '31'; - - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelector( - 'SubFunction[name="myBaySubFunc"] > LNode[lnClass="XSWI"]' - ) - ).to.have.attribute('lnInst', '31'); - }); - }); - - describe('has a copy content icon button that', () => { - let contentCopyButton: HTMLElement; - - beforeEach(async () => { - element!.element = doc.querySelector( - 'SubFunction[name="mySubFunc2"] > LNode[lnClass="XSWI"]' - )!; - await parent.updateComplete; - - contentCopyButton = ( - element?.shadowRoot?.querySelector('mwc-fab[icon="content_copy"]') - ); - await parent.updateComplete; - }); - - it('adds new LNode element', async () => { - contentCopyButton.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'SubFunction[name="mySubFunc2"] > LNode[lnClass="XSWI"]' - ) - ).to.have.lengthOf(3); - }); - - it('makes sure the lnInst is always unique', async () => { - contentCopyButton.click(); - contentCopyButton.click(); - contentCopyButton.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'SubFunction[name="mySubFunc2"] > LNode[lnClass="XSWI"]' - ) - ).to.have.lengthOf(5); - - const lnInsts = Array.from( - doc.querySelectorAll( - 'SubFunction[name="mySubFunc2"] > LNode[lnClass="XSWI"]' - ) - ).map(lNode => lNode.getAttribute('lnInst')!); - - const duplicates = lnInsts.filter( - (item, index) => lnInsts.indexOf(item) !== index - ); - - expect(duplicates).to.lengthOf(0); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/line-editor-wizard-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/line-editor-wizard-editing.test.ts deleted file mode 100644 index 1571d9f0a..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/line-editor-wizard-editing.test.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../../../../src/editors/substation/line-editor.js'; -import { LineEditor } from '../../../../src/editors/substation/line-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: LineEditor -) => Promise = ( - parent: MockWizardEditor, - element: LineEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot - ?.querySelector("mwc-icon-button[icon='playlist_add']")! - .click(); - const lnodMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='LNode']` - )!; - lnodMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"][dialogaction="close"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('line-editor wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: LineEditor | null; - - describe('edit wizard', () => { - let nameField: WizardTextField; - - let primaryAction: HTMLElement; - let secondaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/editors/substation/Line.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - element = parent.querySelector('line-editor'); - await (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - secondaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - it('closes on secondary action', async () => { - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - expect(parent.wizardUI.dialog).to.not.exist; - }); - - it('does not change name attribute if not unique within parent element', async () => { - const oldName = nameField.value; - nameField.value = 'Munich'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('Line[name="Berlin"]')?.getAttribute('name') - ).to.equal(oldName); - }); - - it('changes desc attribute on primary action', async () => { - parent.wizardUI.inputs[1].value = 'newDesc'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('Line[name="Berlin"]')?.getAttribute('desc') - ).to.equal('newDesc'); - }); - - it('changes type attribute on primary action', async () => { - parent.wizardUI.inputs[2].value = 'newType'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('Line[name="Berlin"]')?.getAttribute('type') - ).to.equal('newType'); - }); - - it('changes nomFreq attribute on primary action', async () => { - parent.wizardUI.inputs[3].value = '50'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('Line[name="Berlin"]')?.getAttribute('nomFreq') - ).to.equal('50'); - }); - - it('changes numPhases attribute on primary action', async () => { - parent.wizardUI.inputs[4].value = '3'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('Line[name="Berlin"]')?.getAttribute('numPhases') - ).to.equal('3'); - }); - describe('has a delete icon button that', () => { - let deleteButton: HTMLElement; - - beforeEach(async () => { - deleteButton = ( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - ); - await parent.updateComplete; - }); - - it('removes the Line element from the document', async () => { - expect(doc.querySelector('Line[name="Berlin"]')).to.exist; - await deleteButton.click(); - expect(doc.querySelector('Line[name="Berlin"]')).to.not.exist; - }); - }); - }); - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: LineEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/editors/substation/Line.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('line-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/lnodewizard.test.ts b/packages/compas-open-scd/test/integration/editors/substation/lnodewizard.test.ts deleted file mode 100644 index f4ddcc653..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/lnodewizard.test.ts +++ /dev/null @@ -1,149 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import { List } from '@material/mwc-list'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import { lNodeWizard } from '../../../../src/wizards/lnode.js'; - -describe('lnodewizard', () => { - let element: MockWizardEditor; - let doc: Document; - beforeEach(async () => { - doc = await fetch('/test/testfiles/lnodewizard.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - beforeEach(async () => { - element = ( - await fixture(html``) - ); - const wizard = lNodeWizard(doc.querySelector('Bay')!); - element.workflow.push(() => wizard); - await element.requestUpdate(); - }); - - it('renders three wizard pages each in a mwc-dialog', async () => { - expect( - element.wizardUI.shadowRoot?.querySelectorAll('mwc-dialog').length - ).to.equal(2); - }); - - describe('the first page', () => { - it('renders a list of available IEDs in a mwc-list with checked items', () => { - expect( - element.wizardUI.shadowRoot - ?.querySelector('mwc-dialog') - ?.querySelectorAll('mwc-check-list-item').length - ).to.equal(doc.querySelectorAll('IED').length); - }); - - it('selects the IEDs that are connected', () => { - expect( - (( - (element.wizardUI.dialogs[0].querySelector('#iedList')).selected - )).length - ).to.equal(1); - }); - - describe('the second page', () => { - it('adds logical nodes of the selected IEDs', async () => { - expect( - element.wizardUI.shadowRoot - ?.querySelector('mwc-dialog:nth-child(2)') - ?.querySelectorAll('mwc-check-list-item').length - ).to.equal( - doc.querySelectorAll('IED[name="IED2"] LN0, IED[name="IED2"] LN') - .length - ); - }); - - it('selects logical nodes connected to the substation element', async () => { - expect( - element.wizardUI.shadowRoot - ?.querySelector('mwc-dialog:nth-child(2)') - ?.querySelectorAll('mwc-check-list-item[selected]').length - ).to.have.equal(3); - }); - - it('disables logical nodes connected to another substation', async () => { - expect( - element.wizardUI.shadowRoot - ?.querySelector('mwc-dialog:nth-child(2)') - ?.querySelectorAll('mwc-check-list-item[disabled]').length - ).to.have.equal(1); - }); - }); - - describe('lNodeActions', () => { - it('removes unselected logical nodes', async () => { - expect( - doc.querySelector('Bay[name="COUPLING_BAY"]>LNode[lnClass="LLN0"]') - ).to.exist; - (( - element.wizardUI.shadowRoot - ?.querySelector('mwc-dialog:nth-child(2)') - ?.querySelector('filtered-list') - )).items[0].click(); - await element.updateComplete; - (( - element.wizardUI.shadowRoot - ?.querySelector('mwc-dialog:nth-child(2)') - ?.querySelector('mwc-button[slot="primaryAction"]') - )).click(); - await element.updateComplete; - expect( - doc.querySelector('Bay[name="COUPLING_BAY"]>LNode[lnClass="LLN0"]') - ).to.not.exist; - }); - - it('creates selected logical nodes', async () => { - expect( - doc.querySelector( - 'Bay[name="COUPLING_BAY"]>LNode[ldInst="CBSW"][lnClass="XCBR"][lnInst="1"]' - ) - ).to.not.exist; - (( - element.wizardUI.shadowRoot - ?.querySelector('mwc-dialog:nth-child(2)') - ?.querySelector('filtered-list') - )).items[3].click(); - await element.updateComplete; - (( - element.wizardUI.shadowRoot - ?.querySelector('mwc-dialog:nth-child(2)') - ?.querySelector('mwc-button[slot="primaryAction"]') - )).click(); - await element.updateComplete; - expect( - doc.querySelector( - 'Bay[name="COUPLING_BAY"]>LNode[ldInst="CBSW"][lnClass="XCBR"][lnInst="1"]' - ) - ).to.exist; - }); - it('only create and remove its own logical node references', async () => { - const allLNodesNumber = doc.querySelectorAll( - 'Bay[name="COUPLING_BAY"] LNode' - ).length; - (( - element.wizardUI.shadowRoot - ?.querySelector('mwc-dialog:nth-child(2)') - ?.querySelector('filtered-list') - )).items[3].click(); - await element.updateComplete; - (( - element.wizardUI.shadowRoot - ?.querySelector('mwc-dialog:nth-child(2)') - ?.querySelector('mwc-button[slot="primaryAction"]') - )).click(); - await element.updateComplete; - expect( - doc.querySelectorAll('Bay[name="COUPLING_BAY"] LNode').length - ).to.equal(allLNodesNumber + 1); - }); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/powertransformer-editor-wizarding-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/powertransformer-editor-wizarding-editing.test.ts deleted file mode 100644 index 75835605a..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/powertransformer-editor-wizarding-editing.test.ts +++ /dev/null @@ -1,199 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import '../../../../src/editors/substation/powertransformer-editor.js'; -import { PowerTransformerEditor } from '../../../../src/editors/substation/powertransformer-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: PowerTransformerEditor -) => Promise = ( - parent: MockWizardEditor, - element: PowerTransformerEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot - ?.querySelector("mwc-icon-button[icon='playlist_add']")! - .click(); - const lnodMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='LNode']` - )!; - lnodMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('powertransformer-editor wizarding editing integration', () => { - describe('open create wizard for element EqFunction', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: PowerTransformerEditor | null; - - let nameField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('powertransformer-editor'); - - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="EqFunction"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not add EqFunction if name attribute is not unique', async () => { - expect( - doc.querySelector( - 'PowerTransformer[name="myPtr2"] > EqFunction[name="myEqFuncPtr2"]' - ) - ).to.exist; - - nameField.value = 'myEqFuncPtr2'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'PowerTransformer[name="myPtr2"] > EqFunction[name="myEqFuncPtr2"]' - ).length - ).to.equal(1); - }); - - it('does add EqFunction if name attribute is unique', async () => { - expect( - doc.querySelector( - 'PowerTransformer[name="myPtr2"] > EqFunction[name="someNewFunction"]' - ) - ).to.not.exist; - - nameField.value = 'someNewFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'PowerTransformer[name="myPtr2"] > EqFunction[name="someNewFunction"]' - ) - ).to.exist; - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: PowerTransformerEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('powertransformer-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - - it('Should add SubEquipment', async () => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot - ?.querySelector("mwc-icon-button[icon='playlist_add']")! - .click(); - - element?.shadowRoot - ?.querySelector(`mwc-list-item[value='SubEquipment']`)! - .click(); - - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const nameTextField: WizardTextField = - parent.wizardUI!.dialog!.querySelector( - 'wizard-textfield[label="name"]' - )!; - - const subEquipmentName = 'unique-name'; - - nameTextField.value = subEquipmentName; - - await parent.updateComplete; - - const primaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - `PowerTransformer[name="myPtr2"] > SubEquipment[name="${subEquipmentName}"]` - ).length - ).to.equal(1); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/process-editor-wizard-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/process-editor-wizard-editing.test.ts deleted file mode 100644 index c5590c86d..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/process-editor-wizard-editing.test.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../../../../src/editors/substation/process-editor.js'; -import { ProcessEditor } from '../../../../src/editors/substation/process-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: ProcessEditor -) => Promise = ( - parent: MockWizardEditor, - element: ProcessEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot - ?.querySelector("mwc-icon-button[icon='playlist_add']")! - .click(); - const lnodMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='LNode']` - )!; - lnodMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"][dialogaction="close"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('process-editor wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: ProcessEditor | null; - - describe('edit wizard', () => { - let nameField: WizardTextField; - let descField: WizardTextField; - let typeField: WizardTextField; - - let primaryAction: HTMLElement; - let secondaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/editors/substation/Process.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - element = parent.querySelector('process-editor'); - await (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - typeField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="type"]') - ); - - secondaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - it('closes on secondary action', async () => { - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - expect(parent.wizardUI.dialog).to.not.exist; - }); - - it('does not change name attribute if not unique within parent element', async () => { - const oldName = nameField.value; - nameField.value = 'ProcProcSubAA1'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc - .querySelector('Process[name="ProcessGenConduct"]') - ?.getAttribute('name') - ).to.equal(oldName); - }); - - it('changes name attribute on primary action', async () => { - nameField.value = 'newName'; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('Process')?.getAttribute('name')).to.equal( - 'newName' - ); - }); - - it('changes desc attribute on primary action', async () => { - descField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="desc"]') - ); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - descField.nullSwitch!.click(); - await parent.updateComplete; - descField.value = 'newDesc'; - console.log(descField.value); - primaryAction.click(); - await parent.updateComplete; - expect( - doc - .querySelector('Process[name="ProcessGenConduct"]') - ?.getAttribute('desc') - ).to.equal('newDesc'); - }); - - it('deletes desc attribute if wizard-textfield is deactivated', async () => { - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - descField.nullSwitch!.click(); - await parent.updateComplete; - await primaryAction.click(); - await parent.updateComplete; - expect( - doc - .querySelector('Process[name="ProcessGenConduct"]') - ?.getAttribute('desc') - ).to.be.null; - }); - - it('changes type attribute on primary action', async () => { - await new Promise(resolve => setTimeout(resolve, 100)); - typeField.nullSwitch!.click(); - await parent.updateComplete; - typeField.value = 'newType'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc - .querySelector('Process[name="ProcessGenConduct"]') - ?.getAttribute('type') - ).to.equal('newType'); - }); - describe('has a delete icon button that', () => { - let deleteButton: HTMLElement; - - beforeEach(async () => { - deleteButton = ( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - ); - await parent.updateComplete; - }); - - it('removes the Process element from the document', async () => { - expect(doc.querySelector('Process[name="ProcessGenConduct"]')).to.exist; - await deleteButton.click(); - expect(doc.querySelector('Process[name="ProcessGenConduct"]')).to.not - .exist; - }); - }); - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: ProcessEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/editors/substation/Process.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('process-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/sub-equipment-wizarding-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/sub-equipment-wizarding-editing.test.ts deleted file mode 100644 index f699ea378..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/sub-equipment-wizarding-editing.test.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import '../../../../src/editors/substation/sub-equipment-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { SubEquipmentEditor } from '../../../../src/editors/substation/sub-equipment-editor.js'; -import { WizardCheckbox } from '../../../../src/wizard-checkbox.js'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: SubEquipmentEditor -) => Promise = ( - parent: MockWizardEditor, - element: SubEquipmentEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot - ?.querySelector("mwc-icon-button[icon='playlist_add']")! - .click(); - const lnodMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='LNode']` - )!; - lnodMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('sub-equipment-editor wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: SubEquipmentEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/SubEquipment.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('sub-equipment-editor'); - }); - - describe('open edit wizard', () => { - let nameField: WizardTextField; - let virtualField: WizardCheckbox; - let primaryAction: HTMLElement; - - beforeEach(async () => { - (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - virtualField = ( - parent.wizardUI.dialog?.querySelector( - 'wizard-checkbox[label="virtual"]' - ) - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not update SubEquipment if name attribute is not unique', async () => { - nameField.value = 'addEqi'; - primaryAction.click(); - await parent.updateComplete; - - expect(doc.querySelectorAll('SubEquipment[name="addEqi"]')).to.lengthOf( - 1 - ); - }); - - it('does update SubEquipment if name attribute is unique', async () => { - nameField.value = 'addEqi2'; - await parent.updateComplete; - primaryAction.click(); - - expect(doc.querySelector('SubEquipment[name="addEqi2"]')).to.exist; - expect(doc.querySelector('SubEquipment[name="subque"]')).to.not.exist; - }); - - it('does update SubEquipment when virtual is checked', async () => { - expect(virtualField.nullSwitch).to.exist; - - virtualField.nullSwitch?.click(); - - virtualField.maybeValue = 'true'; - - await parent.updateComplete; - primaryAction.click(); - - expect( - doc - .querySelector('SubEquipment[name="subque"]') - ?.hasAttribute('virtual') - ); - expect( - doc - .querySelector('SubEquipment[name="subque"]') - ?.getAttribute('virtual') - ).to.equal('true'); - }); - - describe('has a delete icon button that', () => { - let deleteButton: HTMLElement; - - beforeEach(async () => { - deleteButton = ( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - ); - await parent.updateComplete; - }); - - it('removes the attached SubEquipment element from the document', async () => { - expect(doc.querySelector('SubEquipment[name="subque"]')).to.exist; - - await deleteButton.click(); - - expect(doc.querySelector('SubEquipment[name="subque"]')).to.not.exist; - }); - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: SubEquipmentEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/SubEquipment.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('sub-equipment-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/sub-function-editor.test.ts b/packages/compas-open-scd/test/integration/editors/substation/sub-function-editor.test.ts deleted file mode 100644 index 7abc409ef..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/sub-function-editor.test.ts +++ /dev/null @@ -1,300 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import '../../../../src/editors/substation/sub-function-editor.js'; -import { SubFunctionEditor } from '../../../../src/editors/substation/sub-function-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: SubFunctionEditor -) => Promise = ( - parent: MockWizardEditor, - element: SubFunctionEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot?.querySelector("mwc-icon-button[icon='playlist_add']")!.click(); - const subFunctionMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='SubFunction']` - )!; - subFunctionMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('sub-function-editor wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: SubFunctionEditor | null; - - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html` SubFunction' - )} - >` - ) - ); - - element = parent.querySelector('sub-function-editor'); - }); - - describe('open create wizard for element SubFunction', () => { - let nameField: WizardTextField; - - beforeEach(async () => { - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="SubFunction"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not add SubFunction if name attribute is not unique', async () => { - expect( - doc.querySelector( - 'Function[name="voltLvName"] > SubFunction > SubFunction' - ) - ).to.exist; - - nameField.value = 'mySubSubFunction'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'Function[name="voltLvName"] > SubFunction > SubFunction' - ).length - ).to.equal(1); - }); - - it('does add SubFunction if name attribute is unique', async () => { - expect( - doc.querySelector( - 'Function[name="voltLvName"] > SubFunction > SubFunction[name="someNewSubFunction"]' - ) - ).to.not.exist; - - nameField.value = 'someNewSubFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'Function[name="voltLvName"] > SubFunction > SubFunction[name="someNewSubFunction"]' - ) - ).to.exist; - }); - }); - - describe('open edit wizard', () => { - let nameField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - element!.element = doc.querySelector( - 'Bay[name="COUPLING_BAY"] > Function[name="bayName"] > SubFunction[name="myBaySubFunc"]' - )!; - - (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not update SubFunction if name attribute is not unique', async () => { - expect( - doc.querySelectorAll( - 'Bay[name="COUPLING_BAY"] SubFunction[name="mySubFunc2"]' - ) - ).to.lengthOf(1); - - nameField.value = 'mySubFunc2'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'Bay[name="COUPLING_BAY"] SubFunction[name="mySubFunc2"]' - ) - ).to.lengthOf(1); - }); - - it('does update SubFunction if name attribute is unique', async () => { - nameField.value = 'someNewFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'Bay[name="COUPLING_BAY"] > Function[name="bayName"] > SubFunction[name="someNewFunction"]' - ) - ).to.exist; - expect( - doc.querySelector( - 'Bay[name="COUPLING_BAY"] > Function[name="bayName"] > SubFunction[name="myBaySubFunc"]' - ) - ).to.not.exist; - }); - }); - - describe('open create wizard for element LNode', () => { - let listItems: ListItemBase[]; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html` SubFunction' - )} - >` - ) - ); - - element = parent.querySelector('sub-function-editor'); - - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="LNode"]') - )).click(); - await parent.updateComplete; - - listItems = Array.from( - parent.wizardUI!.dialog!.querySelectorAll( - 'mwc-check-list-item' - ) - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('add selected LNode instances to SubFcuntion parent', async () => { - listItems[3].selected = true; - listItems[5].selected = true; - - await primaryAction.click(); - - expect( - doc.querySelector( - 'Function[name="voltLvName"] > SubFunction > LNode[iedName="None"][lnClass="CSWI"][lnInst="1"]' - ) - ).to.exist; - expect( - doc.querySelector( - 'Function[name="voltLvName"] > SubFunction > LNode[iedName="None"][lnClass="CSWI"][lnInst="2"]' - ) - ).to.exist; - }); - }); - - describe('has a delete icon button that', () => { - let deleteButton: HTMLElement; - - beforeEach(async () => { - deleteButton = ( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - ); - await parent.updateComplete; - }); - - it('removes the attached SubFunction element from the document', async () => { - expect(doc.querySelector('Function[name="voltLvName"] > SubFunction')).to - .exist; - - await deleteButton.click(); - - expect(doc.querySelector('Function[name="voltLvName"] > SubFunction')).to - .not.exist; - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: SubFunctionEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html` SubFunction' - )} - >` - ) - ); - - element = parent.querySelector('sub-function-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/substation-editor-wizarding-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/substation-editor-wizarding-editing.test.ts deleted file mode 100644 index b54d9d18d..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/substation-editor-wizarding-editing.test.ts +++ /dev/null @@ -1,421 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import '../../../../src/editors/substation/substation-editor.js'; -import { SubstationEditor } from '../../../../src/editors/substation/substation-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: SubstationEditor -) => Promise = ( - parent: MockWizardEditor, - element: SubstationEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot?.querySelector('mwc-menu')!.click(); - const powerTransformerMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='PowerTransformer']` - )!; - powerTransformerMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); -describe('substation-editor wizarding editing integration', () => { - describe('edit wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: SubstationEditor | null; - - let nameField: WizardTextField; - let descField: WizardTextField; - let secondaryAction: HTMLElement; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - element = parent.querySelector('substation-editor'); - await (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - descField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="desc"]') - ); - secondaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - it('closes on secondary action', async () => { - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - expect(parent.wizardUI.dialog).to.not.exist; - }); - it('changes name attribute on primary action', async () => { - nameField.value = 'newName'; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('Substation')?.getAttribute('name')).to.equal( - 'newName' - ); - }); - it('changes desc attribute on primary action', async () => { - descField.value = 'newDesc'; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('Substation')?.getAttribute('desc')).to.equal( - 'newDesc' - ); - }); - it('deletes desc attribute if wizard-textfield is deactivated', async () => { - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - descField.nullSwitch!.click(); - await parent.updateComplete; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('Substation')?.getAttribute('desc')).to.be.null; - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: SubstationEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('substation-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); - - describe('open add voltage level wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: SubstationEditor | null; - - let nameField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('substation-editor'); - - (( - element?.shadowRoot?.querySelector( - 'mwc-list-item[value="VoltageLevel"]' - ) - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - it('opens voltage level wizard ', async () => { - expect(parent.wizardUI).to.exist; - }); - it('has five wizard inputs', async () => { - expect(parent.wizardUI.inputs.length).to.equal(5); - }); - it('does not add voltage level if name attribute is not unique', async () => { - nameField.value = 'E1'; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelectorAll('VoltageLevel[name="E1"]').length).to.equal( - 1 - ); - }); - it('does add voltage level if name attribute is unique', async () => { - nameField.value = 'J1'; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('VoltageLevel[name="J1"]')).to.exist; - }); - }); - describe('open lnode wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: SubstationEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('substation-editor'); - - (( - element?.shadowRoot?.querySelector( - 'mwc-icon-button[icon="account_tree"]' - ) - )).click(); - await parent.updateComplete; - }); - it('opens lnode wizard ', async () => { - expect(parent.wizardUI).to.exist; - }); - it('has two wizard pages', async () => { - expect(parent.wizardUI.dialogs.length).to.equal(2); - }); - }); - describe('remove action', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: SubstationEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - element = parent.querySelector('substation-editor'); - }); - it('removes Substation on clicking delete button', async () => { - expect(doc.querySelector('Substation')).to.exist; - (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - )).click(); - await parent.updateComplete; - expect(doc.querySelector('Substation')).to.not.exist; - }); - }); - - describe('open create wizard for element Function', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: SubstationEditor | null; - - let nameField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('substation-editor'); - - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="Function"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not add Function if name attribute is not unique', async () => { - expect(doc.querySelector('Substation > Function[name="myFunc"]')).to - .exist; - - nameField.value = 'myFunc'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll('Substation > Function[name="myFunc"]').length - ).to.equal(1); - }); - - it('does add Function if name attribute is unique', async () => { - expect(doc.querySelector('Substation > Function[name="someNewFunction"]')) - .to.not.exist; - - nameField.value = 'someNewFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect(doc.querySelector('Substation > Function[name="someNewFunction"]')) - .to.exist; - }); - }); - - describe('open add general-equipment wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: SubstationEditor | null; - - let nameField: WizardTextField; - let typeField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch( - '/test/testfiles/editors/substation/generalequipment.scd' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('substation-editor'); - - (( - element?.shadowRoot?.querySelector( - 'mwc-list-item[value="GeneralEquipment"]' - ) - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - typeField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="type"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - it('opens general-equipment wizard ', async () => { - expect(parent.wizardUI).to.exist; - }); - it('has four wizard inputs', async () => { - expect(parent.wizardUI.inputs.length).to.equal(4); - }); - it('does not add general-equipment if name andattribute is not unique', async () => { - nameField.value = 'genSub'; - typeField.value = 'AXN'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelectorAll('GeneralEquipment[name="genSub"]').length - ).to.equal(1); - }); - it('does add general-equipment if name attribute is unique', async () => { - expect(doc.querySelector('GeneralEquipment[name="newgenSub"]')).to.not - .exist; - nameField.value = 'newgenSub'; - typeField.value = 'AXN'; - await parent.updateComplete; - primaryAction.click(); - expect(doc.querySelector('GeneralEquipment[name = "newgenSub"]')).to - .exist; - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/substation-editor-wizarding.test.ts b/packages/compas-open-scd/test/integration/editors/substation/substation-editor-wizarding.test.ts deleted file mode 100644 index 9df31bacb..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/substation-editor-wizarding.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; -import fc from 'fast-check'; - -import '../../../mock-wizard.js'; -import { MockWizard } from '../../../mock-wizard.js'; - -import '../../../../src/editors/substation/substation-editor.js'; -import { regExp, regexString } from '../../../foundation.js'; - -describe('substation-editor wizarding integration', () => { - let doc: XMLDocument; - let parent: MockWizard; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - (( - parent - ?.querySelector('substation-editor') - ?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - }); - it('looks like the latest snapshot', async () => { - await expect(parent.wizardUI.dialog).to.equalSnapshot(); - }); - describe('the first input element', () => { - it('edits the attribute name', async () => { - expect(parent.wizardUI.inputs[0].label).to.equal('name'); - }); - it('edits only for valid inputs', async () => { - await fc.assert( - fc.asyncProperty(regexString(regExp.tName, 1), async name => { - parent.wizardUI.inputs[0].value = name; - await parent.updateComplete; - expect(parent.wizardUI.inputs[0].checkValidity()).to.be.true; - }) - ); - }); - }); - describe('the second input element', () => { - it('edits the attribute desc', async () => { - expect(parent.wizardUI.inputs[1].label).to.equal('desc'); - }); - it('edits only for valid inputs', async () => { - await fc.assert( - fc.asyncProperty(regexString(regExp.desc), async desc => { - parent.wizardUI.inputs[1].value = desc; - await parent.updateComplete; - expect(parent.wizardUI.inputs[1].checkValidity()).to.be.true; - }) - ); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/tapchanger-editor-wizard-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/tapchanger-editor-wizard-editing.test.ts deleted file mode 100644 index 63c3a9b2f..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/tapchanger-editor-wizard-editing.test.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../../../../src/editors/substation/tapchanger-editor.js'; -import { TapChangerEditor } from '../../../../src/editors/substation/tapchanger-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { WizardCheckbox } from '../../../../src/wizard-checkbox.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: TapChangerEditor -) => Promise = ( - parent: MockWizardEditor, - element: TapChangerEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot - ?.querySelector("mwc-icon-button[icon='playlist_add']")! - .click(); - const lnodMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='LNode']` - )!; - lnodMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"][dialogaction="close"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('tapchanger-editor wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: TapChangerEditor | null; - - describe('edit wizard', () => { - let nameField: WizardTextField; - let descField: WizardTextField; - let primaryAction: HTMLElement; - let secondaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/editors/substation/TapChanger.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html` TapChanger[name="tapChComplet"]' - )} - >` - ) - ); - element = parent.querySelector('tapchanger-editor'); - await (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - descField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="desc"]') - ); - - secondaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - it('closes on secondary action', async () => { - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - expect(parent.wizardUI.dialog).to.not.exist; - }); - it('does not change name attribute if not unique within parent element', async () => { - const oldName = nameField.value; - nameField.value = 'empty'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc - .querySelector( - 'TransformerWinding[name="withTapChanger1"] > TapChanger[name="tapChComplet"]' - ) - ?.getAttribute('name') - ).to.equal(oldName); - }); - it('changes desc attribute on primary action', async () => { - descField.value = 'newDesc'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc - .querySelector( - 'TransformerWinding[name="withTapChanger1"] > TapChanger[name="tapChComplet"]' - ) - ?.getAttribute('desc') - ).to.equal('newDesc'); - }); - it('changes virtual attribute on primary action', async () => { - const virtualCheckbox = ( - parent.wizardUI.dialog?.querySelector( - 'wizard-checkbox[label="virtual"]' - ) - ); - virtualCheckbox.nullSwitch!.click(); - virtualCheckbox.maybeValue = 'false'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc - .querySelector( - 'TransformerWinding[name="withTapChanger1"] > TapChanger[name="tapChComplet"]' - ) - ?.getAttribute('virtual') - ).to.equal('false'); - }); - - describe('has a delete icon button that', () => { - let deleteButton: HTMLElement; - - beforeEach(async () => { - deleteButton = ( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - ); - await parent.updateComplete; - }); - - it('removes the attached TapChanger element from the document', async () => { - expect( - doc.querySelector( - 'TransformerWinding[name="withTapChanger1"] > TapChanger[name="tapChComplet"]' - ) - ).to.exist; - - await deleteButton.click(); - - expect( - doc.querySelector( - 'TransformerWinding[name="withTapChanger1"] > TapChanger[name="tapChComplet"]' - ) - ).to.not.exist; - }); - }); - }); - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: TapChangerEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/editors/substation/TapChanger.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html` TapChanger[name="tapChComplet"]' - )} - >` - ) - ); - - element = parent.querySelector('tapchanger-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/transformer-winding-editor-wizard-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/transformer-winding-editor-wizard-editing.test.ts deleted file mode 100644 index 58852ec24..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/transformer-winding-editor-wizard-editing.test.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base'; - -import '../../../../src/editors/substation/transformer-winding-editor.js'; -import { TransformerWindingEditor } from '../../../../src/editors/substation/transformer-winding-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { WizardCheckbox } from '../../../../src/wizard-checkbox.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: TransformerWindingEditor -) => Promise = ( - parent: MockWizardEditor, - element: TransformerWindingEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot - ?.querySelector("mwc-icon-button[icon='playlist_add']")! - .click(); - const lnodMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='LNode']` - )!; - lnodMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"][dialogaction="close"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('transformer-winding-editor wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: TransformerWindingEditor | null; - - describe('edit wizard', () => { - let nameField: WizardTextField; - let descField: WizardTextField; - let primaryAction: HTMLElement; - let secondaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch( - 'test/testfiles/editors/substation/TransformerWinding.scd' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html` TransformerWinding[name="some"]' - )} - >` - ) - ); - element = parent.querySelector('transformer-winding-editor'); - await (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - descField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="desc"]') - ); - - secondaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - it('closes on secondary action', async () => { - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - expect(parent.wizardUI.dialog).to.not.exist; - }); - it('does not change name attribute if not unique within parent element', async () => { - const oldName = nameField.value; - nameField.value = 'some1'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc - .querySelector( - 'PowerTransformer[name="pTransVolt"] > TransformerWinding[name="some"]' - ) - ?.getAttribute('name') - ).to.equal(oldName); - }); - it('changes desc attribute on primary action', async () => { - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - descField.nullSwitch!.click(); - await parent.updateComplete; - descField.value = 'newDesc'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc - .querySelector( - 'PowerTransformer[name="pTransVolt"] > TransformerWinding[name="some"]' - ) - ?.getAttribute('desc') - ).to.equal('newDesc'); - }); - it('changes virtual attribute on primary action', async () => { - const virtualCheckbox = ( - parent.wizardUI.dialog?.querySelector( - 'wizard-checkbox[label="virtual"]' - ) - ); - virtualCheckbox.nullSwitch!.click(); - virtualCheckbox.maybeValue = 'true'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc - .querySelector( - 'PowerTransformer[name="pTransVolt"] > TransformerWinding[name="some"]' - ) - ?.getAttribute('virtual') - ).to.equal('true'); - }); - - describe('has a delete icon button that', () => { - let deleteButton: HTMLElement; - - beforeEach(async () => { - deleteButton = ( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - ); - await parent.updateComplete; - }); - - it('removes the attached TransformerWinding element from the document', async () => { - expect( - doc.querySelector( - 'PowerTransformer[name="pTransVolt"] > TransformerWinding[name="some"]' - ) - ).to.exist; - - await deleteButton.click(); - - expect( - doc.querySelector( - 'PowerTransformer[name="pTransVolt"] > TransformerWinding[name="some"]' - ) - ).to.not.exist; - }); - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: TransformerWindingEditor | null; - - beforeEach(async () => { - doc = await fetch( - '/test/testfiles/editors/substation/TransformerWinding.scd' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html` TransformerWinding[name="some"]' - )} - >` - ) - ); - - element = parent.querySelector('transformer-winding-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/voltage-level-editor-wizarding-editing.test.ts b/packages/compas-open-scd/test/integration/editors/substation/voltage-level-editor-wizarding-editing.test.ts deleted file mode 100644 index 8a48098e2..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/voltage-level-editor-wizarding-editing.test.ts +++ /dev/null @@ -1,592 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import '../../../../src/editors/substation/voltage-level-editor.js'; -import { VoltageLevelEditor } from '../../../../src/editors/substation/voltage-level-editor.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { ListItemBase } from '@material/mwc-list/mwc-list-item-base.js'; -import { MenuBase } from '@material/mwc-menu/mwc-menu-base.js'; - -const openAndCancelMenu: ( - parent: MockWizardEditor, - element: VoltageLevelEditor -) => Promise = ( - parent: MockWizardEditor, - element: VoltageLevelEditor -): Promise => - new Promise(async resolve => { - expect(parent.wizardUI.dialog).to.be.undefined; - - element?.shadowRoot - ?.querySelector("mwc-icon-button[icon='playlist_add']")! - .click(); - const powerTransformerMenuItem: ListItemBase = - element?.shadowRoot?.querySelector( - `mwc-list-item[value='PowerTransformer']` - )!; - - console.log(powerTransformerMenuItem); - powerTransformerMenuItem.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.exist; - - const secondaryAction: HTMLElement = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - expect(parent.wizardUI.dialog).to.be.undefined; - - return resolve(); - }); - -describe('voltage-level-editor wizarding editing integration', () => { - describe('edit wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: VoltageLevelEditor | null; - - let nameField: WizardTextField; - let descField: WizardTextField; - let nomFreqField: WizardTextField; - let numPhasesField: WizardTextField; - let voltageField: WizardTextField; - let secondaryAction: HTMLElement; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - element = parent.querySelector('voltage-level-editor'); - await (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - descField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="desc"]') - ); - nomFreqField = ( - parent.wizardUI.dialog?.querySelector( - 'wizard-textfield[label="nomFreq"]' - ) - ); - numPhasesField = ( - parent.wizardUI.dialog?.querySelector( - 'wizard-textfield[label="numPhases"]' - ) - ); - voltageField = ( - parent.wizardUI.dialog?.querySelector( - 'wizard-textfield[label="Voltage"]' - ) - ); - secondaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="secondaryAction"]' - ) - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - it('closes on secondary action', async () => { - secondaryAction.click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - expect(parent.wizardUI.dialog).to.not.exist; - }); - it('does not change name attribute if not unique within parent element', async () => { - const oldName = nameField.value; - nameField.value = 'J1'; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('VoltageLevel')?.getAttribute('name')).to.equal( - oldName - ); - }); - it('changes name attribute on primary action', async () => { - nameField.value = 'newName'; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('VoltageLevel')?.getAttribute('name')).to.equal( - 'newName' - ); - }); - it('changes desc attribute on primary action', async () => { - descField.value = 'newDesc'; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('VoltageLevel')?.getAttribute('desc')).to.equal( - 'newDesc' - ); - }); - it('deletes desc attribute if wizard-textfield is deactivated', async () => { - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - descField.nullSwitch!.click(); - await parent.updateComplete; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('VoltageLevel')?.getAttribute('desc')).to.be - .null; - }); - it('changes nomFreq attribute on primary action', async () => { - nomFreqField.value = '30'; - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('VoltageLevel')?.getAttribute('nomFreq') - ).to.equal('30'); - }); - it('deletes nomFreq attribute if wizard-textfield is deactivated', async () => { - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - nomFreqField.nullSwitch!.click(); - await parent.updateComplete; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('VoltageLevel')?.getAttribute('nomFreq')).to.be - .null; - }); - it('changes numPhases attribute on primary action', async () => { - numPhasesField.value = '3'; - await parent.updateComplete; - primaryAction.click(); - expect( - doc.querySelector('VoltageLevel')?.getAttribute('numPhases') - ).to.equal('3'); - }); - it('deletes numPhases attribute if wizard-textfield is deactivated', async () => { - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - numPhasesField.nullSwitch!.click(); - await parent.updateComplete; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('VoltageLevel')?.getAttribute('numPhases')).to.be - .null; - }); - it('changes Voltage value on primary action', async () => { - voltageField.value = '20.0'; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('Voltage')?.innerHTML).to.equal('20.0'); - }); - it('changes Voltage multiplier on primary action', async () => { - voltageField.multiplier = 'M'; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('Voltage')?.getAttribute('multiplier')).to.equal( - 'M' - ); - expect(doc.querySelector('Voltage')?.getAttribute('unit')).to.equal('V'); - }); - it('deletes voltage element if voltage wizard-textfield is deactivated', async () => { - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - voltageField.nullSwitch!.click(); - await parent.updateComplete; - primaryAction.click(); - await parent.updateComplete; - expect(doc.querySelector('VoltageLevel')?.querySelector('Voltage')).to.be - .null; - }); - }); - - describe('Open add wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: VoltageLevelEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('voltage-level-editor'); - - await parent.updateComplete; - }); - - it('Should open the same wizard for the second time', async () => { - await openAndCancelMenu(parent, element!); - await openAndCancelMenu(parent, element!); - }); - }); - - describe('open add bay wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: VoltageLevelEditor | null; - - let nameField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('voltage-level-editor'); - - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="Bay"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - it('does not add bay if name attribute is not unique', async () => { - nameField.value = 'COUPLING_BAY'; - await new Promise(resolve => setTimeout(resolve, 100)); // update takes some time - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelectorAll('VoltageLevel[name="E1"] > Bay').length - ).to.equal(2); - }); - it('does add bay if name attribute is unique', async () => { - nameField.value = 'SecondBay'; - await new Promise(resolve => setTimeout(resolve, 100)); // update takes some time - primaryAction.click(); - await parent.updateComplete; - expect( - doc.querySelector('VoltageLevel[name="E1"] > Bay[name="SecondBay"]') - ).to.exist; - }); - }); - describe('open lnode wizard', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: VoltageLevelEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('voltage-level-editor'); - - (( - element?.shadowRoot?.querySelector( - 'mwc-icon-button[icon="account_tree"]' - ) - )).click(); - await parent.updateComplete; - }); - it('opens lnode wizard ', async () => { - expect(parent.wizardUI).to.exist; - }); - it('has two wizard pages', async () => { - expect(parent.wizardUI.dialogs.length).to.equal(2); - }); - }); - describe('move action', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: VoltageLevelEditor | null; - let element2: VoltageLevelEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`${Array.from(doc?.querySelectorAll('VoltageLevel') ?? []).map( - vLevel => - html`` - )} - >` - ) - ); - element = parent.querySelector('voltage-level-editor:nth-child(1)'); - element2 = parent.querySelector('voltage-level-editor:nth-child(2)'); - }); - it('moves VoltageLevel within Substation', async () => { - expect(doc.querySelector('VoltageLevel')?.getAttribute('name')).to.equal( - 'E1' - ); - (( - element2?.shadowRoot?.querySelector('mwc-icon-button[icon="forward"]') - )).click(); - await parent.updateComplete; - (element).click(); - await parent.updateComplete; - expect(doc.querySelector('VoltageLevel')?.getAttribute('name')).to.equal( - 'J1' - ); - }); - }); - describe('remove action', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: VoltageLevelEditor | null; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - element = parent.querySelector('voltage-level-editor'); - }); - it('removes VoltageLevel on clicking delete button', async () => { - expect(doc.querySelector('VoltageLevel[name="E1"]')).to.exist; - (( - element?.shadowRoot?.querySelector('mwc-icon-button[icon="delete"]') - )).click(); - await parent.updateComplete; - expect(doc.querySelector('VoltageLevel[name="E1"]')).to.not.exist; - }); - }); - describe('clone action', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: VoltageLevelEditor | null; - let copyContentButton: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/clone/noUnusedLNode.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - element = parent.querySelector('voltage-level-editor'); - await parent.updateComplete; - - copyContentButton = ( - element?.shadowRoot?.querySelector( - 'mwc-icon-button[icon="content_copy"]' - ) - ); - }); - - it('duplicates VoltageLevel on clicking duplicate button', async () => { - copyContentButton.click(); - await parent.updateComplete; - - expect(doc.querySelector('VoltageLevel[name="E2"]')).to.exist; - }); - - it('removes all LNode elements in the copy', async () => { - expect( - doc.querySelector('VoltageLevel[name="E1"]')?.querySelector('LNode') - ).to.exist; - - copyContentButton.click(); - await parent.updateComplete; - - expect( - doc.querySelector('VoltageLevel[name="E2"]')?.querySelector('LNode') - ).to.not.exist; - }); - - it('removes all Terminal elements except the grounding in the copy', async () => { - expect( - doc - .querySelector('VoltageLevel[name="E1"]') - ?.querySelector('Terminal:not([cNodeName="grounded"])') - ).to.exist; - - copyContentButton.click(); - await parent.updateComplete; - - expect( - doc - .querySelector('VoltageLevel[name="E2"]') - ?.querySelector('Terminal:not([cNodeName="grounded"])') - ).to.not.exist; - }); - - it('removes all ConnectivityNode elements in the copy', async () => { - expect( - doc - .querySelector('VoltageLevel[name="E1"]') - ?.querySelector('ConnectivityNode') - ).to.exist; - - copyContentButton.click(); - await parent.updateComplete; - - expect( - doc - .querySelector('VoltageLevel[name="E2"]') - ?.querySelector('ConnectivityNode') - ).to.not.exist; - }); - - it('keeps all Bay elements in the copy', async () => { - copyContentButton.click(); - await parent.updateComplete; - expect( - doc.querySelector('VoltageLevel[name="E1"]')?.querySelectorAll('Bay') - .length - ).to.equal( - doc.querySelector('VoltageLevel[name="E2"]')?.querySelectorAll('Bay') - .length - ); - }); - - it('keeps all ConductingEquipment elements in the copy', async () => { - copyContentButton.click(); - await parent.updateComplete; - expect( - doc - .querySelector('VoltageLevel[name="E1"]') - ?.querySelectorAll('ConductingEquipment').length - ).to.equal( - doc - .querySelector('VoltageLevel[name="E2"]') - ?.querySelectorAll('ConductingEquipment').length - ); - }); - }); - - describe('open create wizard for element Function', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let element: VoltageLevelEditor | null; - - let nameField: WizardTextField; - let primaryAction: HTMLElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('voltage-level-editor'); - - (( - element?.shadowRoot?.querySelector('mwc-list-item[value="Function"]') - )).click(); - await parent.updateComplete; - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('does not add Function if name attribute is not unique', async () => { - expect( - doc.querySelector( - 'VoltageLevel[name="E1"] > Function[name="voltLvName"]' - ) - ).to.exist; - - nameField.value = 'voltLvName'; - primaryAction.click(); - await parent.updateComplete; - - expect( - doc.querySelectorAll( - 'VoltageLevel[name="E1"] > Function[name="voltLvName"]' - ).length - ).to.equal(1); - }); - - it('does add Function if name attribute is unique', async () => { - expect( - doc.querySelector( - 'VoltageLevel[name="E1"] > Function[name="someNewFunction"]' - ) - ).to.not.exist; - - nameField.value = 'someNewFunction'; - await parent.updateComplete; - primaryAction.click(); - - expect( - doc.querySelector( - 'VoltageLevel[name="E1"] > Function[name="someNewFunction"]' - ) - ).to.exist; - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/voltage-level-editor-wizarding.test.ts b/packages/compas-open-scd/test/integration/editors/substation/voltage-level-editor-wizarding.test.ts deleted file mode 100644 index a98779412..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/voltage-level-editor-wizarding.test.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; -import fc from 'fast-check'; - -import '../../../mock-wizard.js'; -import { MockWizard } from '../../../mock-wizard.js'; - -import '../../../../src/editors/substation/voltage-level-editor.js'; -import { regexString, regExp, inverseRegExp } from '../../../foundation.js'; -import { patterns } from '../../../../src/foundation.js'; - -describe('voltage-level-editor wizarding integration', () => { - let doc: XMLDocument; - let parent: MockWizard; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - - (( - parent - ?.querySelector('voltage-level-editor') - ?.shadowRoot?.querySelector('mwc-icon-button[icon="edit"]') - )).click(); - await parent.updateComplete; - }); - it('looks like the latest snapshot', async () => { - await expect(parent.wizardUI.dialog).to.equalSnapshot({ - ignoreAttributes: [ - { tags: ['wizard-textfield'], attributes: ['pattern'] }, - ], - }); - }); - //work around, because the escapes get removed in snapshot - it('should have correct pattern', async () => { - expect( - parent.wizardUI.dialog!.querySelectorAll('wizard-textfield[pattern]') - .length - ).to.equal(2); - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')![0] - .getAttribute('pattern') - ).to.equal(patterns.unsigned); - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')![1] - .getAttribute('pattern') - ).to.equal(patterns.decimal); - }); - describe('the first input element', () => { - it('edits the attribute name', async () => { - expect(parent.wizardUI.inputs[0].label).to.equal('name'); - }); - it('edits only for valid inputs', async () => { - await fc.assert( - fc.asyncProperty(regexString(regExp.tName, 1), async name => { - parent.wizardUI.inputs[0].value = name; - await parent.updateComplete; - expect(parent.wizardUI.inputs[0].checkValidity()).to.be.true; - }) - ); - }); - }); - describe('the second input element', () => { - it('edits the attribute desc', async () => { - expect(parent.wizardUI.inputs[1].label).to.equal('desc'); - }); - it('edits only for valid inputs', async () => { - await fc.assert( - fc.asyncProperty(regexString(regExp.desc), async desc => { - parent.wizardUI.inputs[1].value = desc; - await parent.updateComplete; - expect(parent.wizardUI.inputs[1].checkValidity()).to.be.true; - }) - ); - }); - }); - describe('the third input element', () => { - it('edits the attribute nomFreq', async () => { - expect(parent.wizardUI.inputs[2].label).to.equal('nomFreq'); - }); - it('edits only for valid inputs', async () => { - await fc.assert( - fc.asyncProperty(regexString(regExp.unsigned, 1), async nomFreq => { - parent.wizardUI.inputs[2].value = nomFreq; - await parent.updateComplete; - expect(parent.wizardUI.inputs[2].checkValidity()).to.be.true; - }) - ); - }); - it('requires a nonnegative value', async () => { - parent.wizardUI.inputs[2].value = ''; - await parent.updateComplete; - expect(parent.wizardUI.inputs[2].checkValidity()).to.be.false; - parent.wizardUI.inputs[2].value = '-50.'; - await parent.updateComplete; - expect(parent.wizardUI.inputs[2].checkValidity()).to.be.false; - parent.wizardUI.inputs[2].value = '+50.'; - await parent.updateComplete; - expect(parent.wizardUI.inputs[2].checkValidity()).to.be.true; - }); - it('rejects action for invalid inputs', async () => { - await fc.assert( - fc.asyncProperty( - regexString(inverseRegExp.unsigned, 1), - async nomFreq => { - parent.wizardUI.inputs[2].value = nomFreq; - await parent.updateComplete; - expect(parent.wizardUI.inputs[2].checkValidity()).to.be.false; - } - ) - ); - }); - }); - describe('the fourth input element', () => { - it('edits the attribute ', async () => { - expect(parent.wizardUI.inputs[3].label).to.equal('numPhases'); - }); - it('edits only for valid inputs', async () => { - await fc.assert( - fc.asyncProperty(fc.integer(1, 255), async numPhases => { - parent.wizardUI.inputs[3].value = String(numPhases); - await parent.updateComplete; - expect(parent.wizardUI.inputs[3].checkValidity()).to.be.true; - }) - ); - }); - it('is of the type unsingedByte', async () => { - parent.wizardUI.inputs[3].value = '0'; - await parent.updateComplete; - expect(parent.wizardUI.inputs[3].checkValidity()).to.be.false; - parent.wizardUI.inputs[3].value = '256'; - await parent.updateComplete; - expect(parent.wizardUI.inputs[3].checkValidity()).to.be.false; - parent.wizardUI.inputs[3].value = '-65'; - await parent.updateComplete; - expect(parent.wizardUI.inputs[3].checkValidity()).to.be.false; - }); - it('rejects edition for invalid inputs', async () => { - await fc.assert( - fc.asyncProperty( - regexString(inverseRegExp.integer, 1), - async nomFreq => { - parent.wizardUI.inputs[3].value = nomFreq; - await parent.updateComplete; - expect(parent.wizardUI.inputs[3].checkValidity()).to.be.false; - } - ) - ); - }); - }); - describe('the fifth input element', () => { - it('edits the attribute ', async () => { - expect(parent.wizardUI.inputs[4].label).to.equal('Voltage'); - }); - it('edits only for valid inputs', async () => { - await fc.assert( - fc.asyncProperty(regexString(regExp.decimal), async nomFreq => { - parent.wizardUI.inputs[4].value = nomFreq; - await parent.updateComplete; - expect(parent.wizardUI.inputs[4].checkValidity()).to.be.true; - }) - ); - }); - it('rejects edition for invalid inputs', async () => { - await fc.assert( - fc.asyncProperty( - regexString(inverseRegExp.decimal, 1), - async voltage => { - parent.wizardUI.inputs[4].value = voltage; - await parent.updateComplete; - expect(parent.wizardUI.inputs[4].checkValidity()).to.be.false; - } - ) - ); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/substation/zeroline-pane.test.ts b/packages/compas-open-scd/test/integration/editors/substation/zeroline-pane.test.ts deleted file mode 100644 index aa36444cf..000000000 --- a/packages/compas-open-scd/test/integration/editors/substation/zeroline-pane.test.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import '../../../../src/editors/substation/zeroline-pane.js'; -import { FilteredList } from '../../../../src/filtered-list.js'; -import { ZerolinePane } from '../../../../src/editors/substation/zeroline-pane.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { IconButton } from '@material/mwc-icon-button'; -import { ListItem } from '@material/mwc-list/mwc-list-item'; - -describe('zeroline-pane wizarding editing integration', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - let zeroline: ZerolinePane; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/comm-map.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - parent = ( - await fixture( - html`` - ) - ); - zeroline = parent.querySelector('zeroline-pane'); - await parent.updateComplete; - }); - - it('opens selectGseControlWizard for the complete SCL file', async () => { - zeroline.gsecontrol.click(); - await parent.updateComplete; - expect(parent.wizardUI.dialog).to.exist; - const gseControlList = ( - parent.wizardUI.dialog?.querySelector('filtered-list') - ); - await gseControlList.updateComplete; - expect(gseControlList.items.length).to.equal( - doc.querySelectorAll('GSEControl').length - ); - }); - - it('opens selectSampledValueControlWizard for the complete SCL file', async () => { - zeroline.smvcontrol.click(); - await parent.updateComplete; - - expect(parent.wizardUI.dialog).to.exist; - const smvControlList = ( - parent.wizardUI.dialog?.querySelector('filtered-list') - ); - await smvControlList.updateComplete; - expect(smvControlList.items.length).to.equal( - doc.querySelectorAll('SampledValueControl').length - ); - }); - - it('opens select wizard for SCL element ReportControl for the complete project', async () => { - zeroline.reportcontrol.click(); - await parent.updateComplete; - expect(parent.wizardUI.dialog).to.exist; - const reportControlList = ( - parent.wizardUI.dialog?.querySelector('filtered-list') - ); - await reportControlList.updateComplete; - expect(reportControlList.items.length).to.equal( - doc.querySelectorAll('ReportControl').length - ); - }); - - it('add Substation element with add button', async () => { - expect(doc.querySelector('Substation[name="newSubstation"]')).to.not.exist; - zeroline.addButton.click(); - (zeroline.addMenu.querySelector('[value=Substation]')).click(); - await parent.updateComplete; - - const primaryAction = ( - parent.wizardUI.dialog?.querySelector('mwc-button[slot="primaryAction"]') - ); - await primaryAction.updateComplete; - const nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - nameField.value = 'newSubstation'; - await nameField.updateComplete; - primaryAction.click(); - - expect(doc.querySelector('Substation[name="newSubstation"]')).to.exist; - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/templates/Templates.test.ts b/packages/compas-open-scd/test/integration/editors/templates/Templates.test.ts deleted file mode 100644 index e2e61ce68..000000000 --- a/packages/compas-open-scd/test/integration/editors/templates/Templates.test.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { html, fixture, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import TemplatesPlugin from '../../../../src/editors/Templates.js'; -import { Editing, EditingElement } from '../../../../src/Editing.js'; -import { Wizarding, WizardingElement } from '../../../../src/Wizarding.js'; -import { newWizardEvent } from '../../../../src/foundation.js'; - -describe('Templates Plugin', () => { - customElements.define( - 'templates-plugin', - Wizarding(Editing(TemplatesPlugin)) - ); - - let element: TemplatesPlugin; - let parent: MockWizardEditor; - - beforeEach(async () => { - parent = ( - await fixture( - html`` - ) - ); - - element = parent.querySelector('templates-plugin')!; - }); - - describe('without a doc loaded', () => { - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('with a doc loaded', () => { - let doc: XMLDocument; - beforeEach(async () => { - doc = await fetch('/test/testfiles/templates/datypes.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - element.doc = doc; - await element.requestUpdate(); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - - describe('having a LNodeType element list that', () => { - beforeEach(async () => { - parent.workflow.length = 0; - (( - element?.shadowRoot - ?.querySelectorAll('filtered-list')[0] - .querySelector('mwc-list-item') - )).click(); - - await parent.requestUpdate(); - }); - - it('opens a LNodeType edit wizard on list element click', () => - expect( - parent.wizardUI.dialog?.querySelector( - 'wizard-textfield[label="lnClass"]' - ) - ).to.exist); - - it('allows to reopen the LNodeType edit wizard for the same element', async () => { - parent.dispatchEvent(newWizardEvent()); - - await parent.requestUpdate(); - - (( - element?.shadowRoot?.querySelector( - 'filtered-list:nth-of-type(1) > mwc-list-item' - ) - )).click(); - await parent.requestUpdate(); - - expect( - parent.wizardUI.dialog?.querySelector( - 'wizard-textfield[label="lnClass"]' - ) - ).to.exist; - }); - }); - - describe('having a DOType element list that', () => { - beforeEach(async () => { - parent.workflow.length = 0; - (( - element?.shadowRoot - ?.querySelectorAll('filtered-list')[1] - .querySelector('mwc-list-item') - )).click(); - - await parent.requestUpdate(); - }); - - it('opens a DOType edit wizard on list element click', () => - expect( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="CDC"]') - ).to.exist); - - it('allows to reopen the DOType edit wizard for the same element', async () => { - parent.dispatchEvent(newWizardEvent()); - - await parent.requestUpdate(); - - (( - element?.shadowRoot - ?.querySelectorAll('filtered-list')[1] - .querySelector('mwc-list-item') - )).click(); - await parent.requestUpdate(); - - expect( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="CDC"]') - ).to.exist; - }); - }); - - describe('having a DAType element list that', () => { - beforeEach(async () => { - parent.workflow.length = 0; - (( - element?.shadowRoot - ?.querySelectorAll('filtered-list')[2] - .querySelector('mwc-list-item') - )).click(); - - await parent.requestUpdate(); - }); - - it('opens a DAType edit wizard on list element click', () => - expect(parent.wizardUI.dialog).to.exist); - - it('allows to reopen the DAType edit wizard for the same element', async () => { - parent.dispatchEvent(newWizardEvent()); - - await parent.requestUpdate(); - - (( - element?.shadowRoot - ?.querySelectorAll('filtered-list')[3] - .querySelector('mwc-list-item') - )).click(); - await parent.requestUpdate(); - - expect(parent.wizardUI.dialog).to.exist; - }); - }); - - describe('having a EnumType element list that', () => { - beforeEach(async () => { - parent.workflow.length = 0; - (( - element?.shadowRoot - ?.querySelectorAll('filtered-list')[3] - .querySelector('mwc-list-item') - )).click(); - - await parent.requestUpdate(); - }); - - it('opens a EnumType edit wizard on list element click', () => - expect(parent.wizardUI.dialog).to.exist); - - it('allows to reopen the EnumType edit wizard for the same element', async () => { - parent.dispatchEvent(newWizardEvent()); - - await parent.requestUpdate(); - - (( - element?.shadowRoot - ?.querySelectorAll('filtered-list')[3] - .querySelector('mwc-list-item') - )).click(); - await parent.requestUpdate(); - - expect(parent.wizardUI.dialog).to.exist; - }); - }); - }); - - describe('with a doc loaded missing a datatypetemplates section', () => { - let doc: XMLDocument; - let parent: MockWizardEditor; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/templates/missingdatatypes.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - parent = ( - await fixture( - html`` - ) - ); - await element.updateComplete; - }); - - it('has a mwc-fab', () => { - expect(element.shadowRoot?.querySelector('mwc-fab')).to.exist; - }); - - it('adds a DataTypeTemplates on floating action button click', async () => { - expect(doc.querySelector('DataTypeTemplates')).to.not.exist; - (( - parent - ?.querySelector('templates-plugin') - ?.shadowRoot?.querySelector('mwc-fab') - )).click(); - await parent.updateComplete; - expect( - parent! - .querySelector('templates-plugin')! - .doc!.querySelector('DataTypeTemplates') - ).to.exist; - }); - }); - - describe('with a doc loaded having a datatypetemplates section', () => { - let doc: XMLDocument; - let parent: WizardingElement & EditingElement; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/templates/datypes.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - parent = ( - await fixture( - html`` - ) - ); - await element.updateComplete; - }); - - it('opens an add enumtype wizard', async () => { - expect(parent.wizardUI.dialogs.length).to.equal(0); - (( - parent - ?.querySelector('templates-plugin') - ?.shadowRoot?.querySelectorAll( - 'mwc-icon-button[icon="playlist_add"]' - )[2] - )).click(); - await parent.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - expect(parent.wizardUI.dialogs.length).to.equal(1); - }); - - it('adding an EnumType with the enumtype wizard', async () => { - expect(doc.querySelectorAll('EnumType').length).to.equal(4); - (( - parent - ?.querySelector('templates-plugin') - ?.shadowRoot?.querySelector( - 'section:last-child mwc-icon-button[icon="playlist_add"]' - ) - )).click(); - await parent.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - parent.wizardUI.inputs[1].value = 'myID'; - await parent.updateComplete; - (( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - )).click(); - await parent.updateComplete; - expect(doc.querySelectorAll('EnumType').length).to.equal(5); - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/Templates.test.snap.js b/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/Templates.test.snap.js deleted file mode 100644 index 76682bf27..000000000 --- a/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/Templates.test.snap.js +++ /dev/null @@ -1,584 +0,0 @@ -/* @web/test-runner snapshot v1 */ -export const snapshots = {}; - -snapshots["Templates Plugin without a doc loaded looks like the latest snapshot"] = -`

    - - [templates.missing] - - - -

    - - -`; -/* end snapshot Templates Plugin without a doc loaded looks like the latest snapshot */ - -snapshots["Templates Plugin with a doc loaded looks like the latest snapshot"] = -`
    -
    -

    - [scl.LNodeType] - -

    - - - - Dummy.LLN0 - - - LLN0 - - - 4 - - - - - Dummy.LPHD1 - - - LPHD - - - 4 - - - - - Dummy.XCBR1 - - - XCBR - - - 7 - - - - - Dummy.CSWI - - - CSWI - - - 5 - - - - - Dummy.CILO - - - CILO - - - 4 - - - - - Dummy.CSWIwithoutCtlModel - - - CSWI - - - 5 - - - - - Dummy.XSWI1 - - - XSWI - - - 7 - - - - - Dummy.GGIO1 - - - GGIO - - - 4 - - - -
    -
    -

    - [scl.DOType] - -

    - - - - Dummy.LLN0.Mod - - - ENC - - - 14 - - - - - Dummy.LLN0.Beh - - - ENS - - - 3 - - - - - Dummy.LLN0.Health - - - ENS - - - 3 - - - - - Dummy.LLN0.NamPlt - - - LPL - - - 5 - - - - - Dummy.LPHD1.PhyNam - - - DPL - - - 5 - - - - - Dummy.LPHD1.Sim - - - SPC - - - 15 - - - - - Dummy.XCBR1.Pos - - - DPC - - - 5 - - - - - Dummy.CSWI.Pos1 - - - DPC - - - 5 - - - - - Dummy.CSWI.Pos2 - - - DPC - - - 5 - - - - - Dummy.XCBR1.OpCnt - - - INS - - - 3 - - - - - Dummy.XCBR1.NamPlt - - - LPL - - - 3 - - - - - Dummy.XCBR1.BlkOpn - - - SPC - - - 5 - - - - - Dummy.SPS - - - SPS - - - 3 - - - -
    -
    -

    - [scl.DAType] - -

    - - - - Dummy_origin - - - 2 - - - - - Dummy.LLN0.Mod.SBOw - - - 6 - - - - - Dummy.LLN0.Mod.Cancel - - - 5 - - - - - Dummy.LPHD1.Sim.SBOw - - - 6 - - - - - Dummy.LPHD1.Sim.Cancel - - - 5 - - - -
    -
    -

    - [scl.EnumType] - -

    - - - - Dummy_ctlModel - - - 5 - - - - - Dummy_Beh - - - 5 - - - - - Dummy_Health - - - 3 - - - - - Dummy_orCategory - - - 9 - - - -
    -
    - - -`; -/* end snapshot Templates Plugin with a doc loaded looks like the latest snapshot */ - diff --git a/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/datype-wizarding.test.snap.js b/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/datype-wizarding.test.snap.js deleted file mode 100644 index 69e2fb7c3..000000000 --- a/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/datype-wizarding.test.snap.js +++ /dev/null @@ -1,781 +0,0 @@ -/* @web/test-runner snapshot v1 */ -export const snapshots = {}; - -snapshots["DAType wizards defines a createDATypeWizard looks like the latest snapshot"] = -` -
    - - - - AnalogueValue_FLOAT32 - - - 1 - - - - - AnalogueValue_INT32 - - - 1 - - - - - Cancel_SPC - - - 5 - - - - - Cancel_Dbpos - - - 5 - - - - - Cancel_FLOAT32 - - - 5 - - - - - Cancel_StepControlKind - - - 5 - - - - - Cancel_BehaviourModeKind - - - 5 - - - - - Cancel_INT8 - - - 5 - - - - - CalendarTime - - - 8 - - - - - Cell2D - - - 4 - - - - - Cell1D - - - 2 - - - - - OperSBOw_SPC - - - 6 - - - - - OperSBOw_Dbpos - - - 6 - - - - - OperSBOw_FLOAT32 - - - 6 - - - - - OperSBOw_StepControlKind - - - 6 - - - - - OperSBOw_BehaviourModeKind - - - 6 - - - - - OperSBOw_INT8 - - - 6 - - - - - Originator - - - 2 - - - - - Point3D - - - 3 - - - - - Point2D - - - 2 - - - - - PulseConfig - - - 4 - - - - - RangeConfig - - - 7 - - - - - ScaledValueConfig_AmpSv - - - 2 - - - - - ScaledValueConfig_VolSv - - - 2 - - - - - Unit_A - - - 1 - - - - - Unit_V - - - 1 - - - - - Unit_Hz - - - 1 - - - - - ValWithTrans_wo_transInd - - - 1 - - - - - Vector_I_w_Ang - - - 2 - - - - - Vector_F_w_Ang - - - 2 - - - - - Vector_I_wo_Ang - - - 1 - - - - - Vector_F_wo_Ang - - - 1 - - - - - ScaledValueConfig - - - 2 - - - - - Unit - - - 2 - - - - - ValWithTrans - - - 2 - - - - - - - -
    - - - - -
    -`; -/* end snapshot DAType wizards defines a createDATypeWizard looks like the latest snapshot */ - -snapshots["DAType wizards defines a dATypeWizard looks like the latest snapshot"] = -` - -
    - - - - - - - - ctlVal - - - #Dummy_Beh - - - - - origin - - - #Dummy_origin - - - - - ctlNum - - - INT8U - - - - - T - - - Timestamp - - - - - Test - - - BOOLEAN - - - - - Check - - - Check - - - -
    - - - - -
    -`; -/* end snapshot DAType wizards defines a dATypeWizard looks like the latest snapshot */ - diff --git a/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/dotype-wizarding.test.snap.js b/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/dotype-wizarding.test.snap.js deleted file mode 100644 index d05a9d404..000000000 --- a/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/dotype-wizarding.test.snap.js +++ /dev/null @@ -1,1422 +0,0 @@ -/* @web/test-runner snapshot v1 */ -export const snapshots = {}; - -snapshots["DOType wizards defines a createDOTypeWizard looks like the latest snapshot"] = -` -
    - - - - ACD_general - - - 4 - - - - - ACD_threephase - - - 10 - - - - - ACT_general_control - - - 4 - - - - - ACT_threephase_control - - - 7 - - - - - ACT_general - - - 3 - - - - - APC_VolSpt_ATCC - - - 8 - - - - - ASG_ATrg_TCTR - - - 5 - - - - - ASG_HzRtg_TCTR - - - 5 - - - - - ASG_VRtg_TVTR - - - 5 - - - - - BAC_BndCtrChg_ATCC - - - 9 - - - - - BSC_TapChg_ATCC - - - 8 - - - - - BSC_TapChg_YLTC - - - 5 - - - - - CMV_db_i_MagAndAng - - - 13 - - - - - DEL - - - 3 - - - - - DEL_wRef - - - 4 - - - - - DPL - - - 8 - - - - - DPC_statusonly - - - 4 - - - - - DPC - - - 11 - - - - - DPSsimple - - - 4 - - - - - ENS_Beh - - - 3 - - - - - ENC_Mod - - - 10 - - - - - ENC_Mod_statusonly - - - 5 - - - - - ENS_Health - - - 3 - - - - - ENS_SwTyp - - - 3 - - - - - INS_simple - - - 4 - - - - - ISC_TapPos_ATCC - - - 8 - - - - - ISC_TapPos_YLTC - - - 5 - - - - - LPL_LD - - - 5 - - - - - LPL_noLD - - - 4 - - - - - MV_db_int - - - 9 - - - - - MV_int - - - 5 - - - - - MV_db_float - - - 8 - - - - - MV_float - - - 3 - - - - - ORG_GrRef - - - 1 - - - - - SAV_AmpSv_TCTR - - - 5 - - - - - SAV_VolSv_TVTR - - - 5 - - - - - SPC_statusonly - - - 4 - - - - - SPC_Auto_ATCC - - - 7 - - - - - SPC_LocSta - - - 7 - - - - - SPS_simple - - - 4 - - - - - WYE_phases - - - 3 - - - - - - - - - -
    - - - - -
    -`; -/* end snapshot DOType wizards defines a createDOTypeWizard looks like the latest snapshot */ - -snapshots["DOType wizards defines a dOTypeWizard looks like the latest snapshot"] = -` - -
    - - - - - - - - - - stVal - - - #Dummy_Beh - - - - - q - - - Quality - - - - - t - - - Timestamp - - - - - stSeld - - - BOOLEAN - - - - - opRcvd - - - BOOLEAN - - - - - opOk - - - BOOLEAN - - - - - tOpOk - - - Timestamp - - - - - ctlModel - - - #Dummy_ctlModel - - - - - sboTimeout - - - INT32U - - - - - operTimeout - - - INT32U - - - - - SBO - - - ObjRef - - - - - SBOw - - - #Dummy.LLN0.Mod.SBOw - - - - - Oper - - - #Dummy.LLN0.Mod.SBOw - - - - - Cancel - - - #Dummy.LLN0.Mod.Cancel - - - -
    - - - - -
    -`; -/* end snapshot DOType wizards defines a dOTypeWizard looks like the latest snapshot */ - -snapshots["DOType wizards defines a sDOWizard to edit an existing SDO looks like the latest snapshot"] = -` - -
    - - > - - - - - - Dummy.LLN0.Mod - - - Dummy.LLN0.Beh - - - Dummy.LLN0.Health - - - Dummy.LLN0.NamPlt - - - Dummy.LPHD1.PhyNam - - - Dummy.LPHD1.Sim - - - Dummy.XCBR1.Pos - - - Dummy.CSWI.Pos1 - - - Dummy.CSWI.Pos2 - - - Dummy.XCBR1.OpCnt - - - Dummy.XCBR1.NamPlt - - - Dummy.XCBR1.BlkOpn - - - Dummy.SPS - - - Dummy.WYE - - - Dummy.CMV - - -
    - - - - -
    -`; -/* end snapshot DOType wizards defines a sDOWizard to edit an existing SDO looks like the latest snapshot */ - -snapshots["DOType wizards defines a sDOWizard to create a new SDO element looks like the latest snapshot"] = -` -
    - - > - - - - - - Dummy.LLN0.Mod - - - Dummy.LLN0.Beh - - - Dummy.LLN0.Health - - - Dummy.LLN0.NamPlt - - - Dummy.LPHD1.PhyNam - - - Dummy.LPHD1.Sim - - - Dummy.XCBR1.Pos - - - Dummy.CSWI.Pos1 - - - Dummy.CSWI.Pos2 - - - Dummy.XCBR1.OpCnt - - - Dummy.XCBR1.NamPlt - - - Dummy.XCBR1.BlkOpn - - - Dummy.SPS - - - Dummy.WYE - - - Dummy.CMV - - -
    - - - - -
    -`; -/* end snapshot DOType wizards defines a sDOWizard to create a new SDO element looks like the latest snapshot */ - diff --git a/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/enumtype-wizarding.test.snap.js b/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/enumtype-wizarding.test.snap.js deleted file mode 100644 index acc499b92..000000000 --- a/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/enumtype-wizarding.test.snap.js +++ /dev/null @@ -1,1648 +0,0 @@ -/* @web/test-runner snapshot v1 */ -export const snapshots = {}; - -snapshots["EnumType wizards defines a createEnumTypeWizard looks like the latest snapshot"] = -` -
    - - - - BehaviourModeKind - - - 5 - - - - - CtlModelKind - - - 5 - - - - - OpenSCD_StatusOnly - - - 1 - - - - - OriginatorCategoryKind - - - 9 - - - - - MultiplierKind - - - 21 - - - - - AngleReferenceKind - - - 4 - - - - - CurveCharKind - - - 17 - - - - - FaultDirectionKind - - - 4 - - - - - HvReferenceKind - - - 3 - - - - - MonthKind - - - 13 - - - - - OccurrenceKind - - - 5 - - - - - OutputSignalKind - - - 3 - - - - - PeriodKind - - - 5 - - - - - PhaseAngleReferenceKind - - - 12 - - - - - PhaseFaultDirectionKind - - - 3 - - - - - PhaseReferenceKind - - - 4 - - - - - RangeKind - - - 5 - - - - - SIUnitKind - - - 77 - - - - - SboClassKind - - - 2 - - - - - SequenceKind - - - 2 - - - - - SeverityKind - - - 5 - - - - - WeekdayKind - - - 8 - - - - - AdjustmentKind - - - 4 - - - - - AffectedPhasesKind - - - 8 - - - - - AutoReclosingKind - - - 12 - - - - - BreakerOpCapabilityKind - - - 7 - - - - - CalcIntervalKind - - - 8 - - - - - CalcMethodKind - - - 13 - - - - - CalcModeKind - - - 3 - - - - - ClockSourceKind - - - 5 - - - - - ClockSyncKind - - - 3 - - - - - ClockSyncLockingKind - - - 5 - - - - - DirectionModeKind - - - 3 - - - - - FailureDetectionKind - - - 4 - - - - - FaultLoopKind - - - 7 - - - - - FaultMeasuredValueTypeKind - - - 3 - - - - - FilterFunctionKind - - - 5 - - - - - FuseFunctionKind - - - 6 - - - - - HealthKind - - - 3 - - - - - InstrumentTransformerMeasurementRatingKind - - - 9 - - - - - InstrumentTransformerProtectionRatingKind - - - 5 - - - - - LeapSecondKind - - - 4 - - - - - LevelTriggerModeKind - - - 4 - - - - - LiveDeadModeKind - - - 7 - - - - - MaterialKind - - - 11 - - - - - MaterialStateKind - - - 5 - - - - - PFSignKind - - - 2 - - - - - PIDAlgorithmKind - - - 7 - - - - - POWSwitchingCapabilityKind - - - 4 - - - - - ParallelCoilModeKind - - - 4 - - - - - ParallelCtrlModeKind - - - 3 - - - - - ParallelTransfModeKind - - - 8 - - - - - PolarizingQuantityKind - - - 7 - - - - - RecordingModeKind - - - 2 - - - - - RectifierControlModeKind - - - 3 - - - - - ResetCurveKind - - - 3 - - - - - RestraintModeKind - - - 9 - - - - - RetripModeKind - - - 6 - - - - - RotatingMachineStateKind - - - 5 - - - - - RotationalDirectionKind - - - 3 - - - - - RotorThermalStateKind - - - 3 - - - - - SOFEnablingModeKind - - - 3 - - - - - SOFOperationModeKind - - - 3 - - - - - STotalCalcMethodKind - - - 2 - - - - - ScheduleEnablingErrorKind - - - 7 - - - - - ScheduleStateKind - - - 4 - - - - - SetpointEndKind - - - 16 - - - - - StageControlKind - - - 4 - - - - - SwitchFunctionKind - - - 4 - - - - - SwitchingCapabilityKind - - - 4 - - - - - SynchOperationModeKind - - - 4 - - - - - TankFillKind - - - 3 - - - - - TransientPerformanceClassKind - - - 9 - - - - - TpcAppModeKind - - - 6 - - - - - TriggerSourceKind - - - 3 - - - - - TripBehaviourKind - - - 3 - - - - - TripModeKind - - - 4 - - - - - TuningKind - - - 6 - - - - - UnbalanceDetectionKind - - - 6 - - - - - UnblockModeKind - - - 3 - - - - - VoltInterruptDetectionKind - - - 8 - - - - - WeakEndInfeedModeKind - - - 4 - - - - - - - -
    - - - - -
    -`; -/* end snapshot EnumType wizards defines a createEnumTypeWizard looks like the latest snapshot */ - -snapshots["EnumType wizards defines an eNumTypeEditWizard looks like the latest snapshot"] = -` - -
    - - - - - - - - status-only - - - 0 - - - - - direct-with-normal-security - - - 1 - - - - - sbo-with-normal-security - - - 2 - - - - - direct-with-enhanced-security - - - 3 - - - - - sbo-with-enhanced-security - - - 4 - - - -
    - - - - -
    -`; -/* end snapshot EnumType wizards defines an eNumTypeEditWizard looks like the latest snapshot */ - -snapshots["EnumType wizards defines a eNumValWizard to edit an existing EnumVal looks like the latest snapshot"] = -` - -
    - - - - - - -
    - - - - -
    -`; -/* end snapshot EnumType wizards defines a eNumValWizard to edit an existing EnumVal looks like the latest snapshot */ - -snapshots["EnumType wizards defines a eNumValWizard to create a new EnumVal element looks like the latest snapshot"] = -` -
    - - - - - - -
    - - - - -
    -`; -/* end snapshot EnumType wizards defines a eNumValWizard to create a new EnumVal element looks like the latest snapshot */ - diff --git a/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/lnodetype-wizard.test.snap.js b/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/lnodetype-wizard.test.snap.js deleted file mode 100644 index 17a711b4d..000000000 --- a/packages/compas-open-scd/test/integration/editors/templates/__snapshots__/lnodetype-wizard.test.snap.js +++ /dev/null @@ -1,4882 +0,0 @@ -/* @web/test-runner snapshot v1 */ -export const snapshots = {}; - -snapshots["LNodeType wizards defines a lNodeTypeHelperWizard looks like the latest snapshot"] = -` - -
    - - - - - - - - - - Beh - - - #Dummy.LLN0.Beh - - - - - NamPlt - - - #Dummy.XCBR1.NamPlt - - - - - Loc - - - #Dummy.SPS - - - - - OpCnt - - - #Dummy.XCBR1.OpCnt - - - - - Pos - - - #Dummy.CSWI.Pos1 - - - -
    - - - - -
    -`; -/* end snapshot LNodeType wizards defines a lNodeTypeHelperWizard looks like the latest snapshot */ - -snapshots["LNodeType wizards defines a createLNodeTypeWizard looks like the latest snapshot"] = -` -
    - - - Pre-defined lnClasses from templates - -
  • -
  • - - - ATCC - - - Auto Tap changer controller: no process bus(PB) - - - 11 - - - - - ATCC - - - Auto Tap changer controller: process bus - - - 14 - - - - - CSWI - - - Switch control: no process bus(PB) - - - 7 - - - - - CSWI - - - Switch control: three phase - - - 11 - - - - - CSWI - - - Switch control: single phase - - - 15 - - - - - CILO - - - Interlocking - - - 6 - - - - - LLN0 - - - Logical device LN: referenced - - - 7 - - - - - LLN0 - - - Logical device LN: parent - - - 6 - - - - - LPHD - - - Physical device - - - 6 - - - - - MMXU - - - Three phase measurement - - - 14 - - - - - PTRC - - - Trip conditioning: General trip signal - - - 7 - - - - - RSYC - - - Synchronism check - - - 7 - - - - - TCTR - - - Current transformer - - - 7 - - - - - TVTR - - - Voltage transformer - - - 7 - - - - - XSWI - - - Switch: no process bus(PB) - - - 11 - - - - - XSWI - - - Switch: three phase represenation - - - 12 - - - - - XSWI - - - Switch: one phase represenation - - - 11 - - - - - XCBR - - - Circuit Breaker: no process bus(PB) - - - 10 - - - - - XCBR - - - Circuit Breaker: one phase representation - - - 10 - - - - - XCBR - - - Circuit Breaker: three phase representation - - - 11 - - - - - YLTC - - - Tap changer - - - 10 - - - - Empty lnClasses from IEC 61850-7-4 - -
  • -
  • - - - LPHD - - - 16 - - - - - LLN0 - - - 13 - - - - - LCCH - - - 17 - - - - - LGOS - - - 13 - - - - - LSVS - - - 12 - - - - - LTIM - - - 13 - - - - - LTMS - - - 14 - - - - - LTRK - - - 23 - - - - - ANCR - - - 54 - - - - - ARCO - - - 30 - - - - - ARIS - - - 32 - - - - - ATCC - - - 71 - - - - - AVCO - - - 33 - - - - - CALH - - - 24 - - - - - CCGR - - - 51 - - - - - CILO - - - 22 - - - - - CPOW - - - 29 - - - - - CSWI - - - 35 - - - - - CSYN - - - 82 - - - - - FCNT - - - 23 - - - - - FCSD - - - 22 - - - - - FFIL - - - 32 - - - - - FLIM - - - 25 - - - - - FPID - - - 35 - - - - - FRMP - - - 27 - - - - - FSCC - - - 13 - - - - - FSCH - - - 28 - - - - - FSPT - - - 40 - - - - - FXOT - - - 25 - - - - - FXUT - - - 25 - - - - - GAPC - - - 35 - - - - - GGIO - - - 38 - - - - - GLOG - - - 24 - - - - - GSAL - - - 26 - - - - - IARC - - - 29 - - - - - IHMI - - - 24 - - - - - ISAF - - - 24 - - - - - ITCI - - - 25 - - - - - ITMI - - - 21 - - - - - ITPC - - - 42 - - - - - KFAN - - - 33 - - - - - KFIL - - - 36 - - - - - KPMP - - - 33 - - - - - KTNK - - - 27 - - - - - KVLV - - - 44 - - - - - MENV - - - 32 - - - - - MFLK - - - 38 - - - - - MFLW - - - 35 - - - - - MHAI - - - 59 - - - - - MHAN - - - 53 - - - - - MHET - - - 30 - - - - - MHYD - - - 28 - - - - - MMDC - - - 28 - - - - - MMET - - - 42 - - - - - MMTN - - - 27 - - - - - MMTR - - - 27 - - - - - MMXN - - - 28 - - - - - MMXU - - - 63 - - - - - MSQI - - - 33 - - - - - PDIF - - - 38 - - - - - PDIR - - - 27 - - - - - PDIS - - - 48 - - - - - PDOP - - - 30 - - - - - PDUP - - - 30 - - - - - PFRC - - - 31 - - - - - PHAR - - - 30 - - - - - PHIZ - - - 31 - - - - - PIOC - - - 27 - - - - - PMRI - - - 34 - - - - - PMSS - - - 30 - - - - - POPF - - - 33 - - - - - PPAM - - - 27 - - - - - PRTR - - - 27 - - - - - PSCH - - - 42 - - - - - PSDE - - - 33 - - - - - PSOF - - - 36 - - - - - PTDV - - - 28 - - - - - PTEF - - - 29 - - - - - PTHF - - - 27 - - - - - PTOC - - - 37 - - - - - PTOF - - - 31 - - - - - PTOV - - - 35 - - - - - PTRC - - - 29 - - - - - PTTR - - - 48 - - - - - PTUC - - - 37 - - - - - PTUF - - - 31 - - - - - PTUV - - - 35 - - - - - PUPF - - - 33 - - - - - PVOC - - - 38 - - - - - PVPH - - - 36 - - - - - PZSU - - - 29 - - - - - QFVR - - - 30 - - - - - QITR - - - 27 - - - - - QIUB - - - 28 - - - - - QVTR - - - 27 - - - - - QVUB - - - 28 - - - - - QVVR - - - 34 - - - - - RADR - - - 30 - - - - - RBDR - - - 28 - - - - - RBRF - - - 30 - - - - - RDIR - - - 30 - - - - - RDRE - - - 40 - - - - - RDRS - - - 22 - - - - - RFLO - - - 24 - - - - - RMXU - - - 25 - - - - - RPSB - - - 34 - - - - - RREC - - - 35 - - - - - RSYN - - - 58 - - - - - SARC - - - 25 - - - - - SCBR - - - 56 - - - - - SIMG - - - 33 - - - - - SIML - - - 52 - - - - - SLTC - - - 28 - - - - - SOPM - - - 40 - - - - - SPDC - - - 29 - - - - - SPRS - - - 31 - - - - - SPTR - - - 31 - - - - - SSWI - - - 48 - - - - - STMP - - - 31 - - - - - SVBR - - - 32 - - - - - TANG - - - 26 - - - - - TAXD - - - 26 - - - - - TCTR - - - 39 - - - - - TDST - - - 26 - - - - - TFLW - - - 26 - - - - - TFRQ - - - 26 - - - - - TGSN - - - 26 - - - - - THUM - - - 26 - - - - - TLVL - - - 26 - - - - - TMGF - - - 26 - - - - - TMVM - - - 26 - - - - - TPOS - - - 26 - - - - - TPRS - - - 26 - - - - - TRTN - - - 26 - - - - - TSND - - - 26 - - - - - TTMP - - - 26 - - - - - TTNS - - - 26 - - - - - TVBR - - - 26 - - - - - TVTR - - - 36 - - - - - TWPH - - - 26 - - - - - XCBR - - - 40 - - - - - XFUS - - - 27 - - - - - XSWI - - - 35 - - - - - YEFN - - - 39 - - - - - YLTC - - - 36 - - - - - YPSH - - - 33 - - - - - YPTR - - - 37 - - - - - ZAXN - - - 25 - - - - - ZBAT - - - 32 - - - - - ZBSH - - - 32 - - - - - ZCAB - - - 36 - - - - - ZCAP - - - 25 - - - - - ZCON - - - 25 - - - - - ZGEN - - - 42 - - - - - ZGIL - - - 23 - - - - - ZLIN - - - 36 - - - - - ZMOT - - - 30 - - - - - ZREA - - - 27 - - - - - ZRES - - - 23 - - - - - ZRRC - - - 31 - - - - - ZSAR - - - 25 - - - - - ZSCR - - - 30 - - - - - ZSMC - - - 59 - - - - - ZTCF - - - 24 - - - - - ZTCR - - - 23 - - - - Empty lnClasses from IEC 61850-7-420 - -
  • -
  • - - - DECP - - - 38 - - - - - DPCC - - - 40 - - - - - DVER - - - 24 - - - - - DPMC - - - 60 - - - - - DMDR - - - 92 - - - - - DGEN - - - 156 - - - - - DSTO - - - 181 - - - - - DLOD - - - 117 - - - - - SBAT - - - 76 - - - - - DBAT - - - 71 - - - - - DPVA - - - 32 - - - - - DPVM - - - 36 - - - - - DPVC - - - 38 - - - - - DTRC - - - 50 - - - - - DCIP - - - 80 - - - - - DFCL - - - 53 - - - - - DSTK - - - 41 - - - - - DFPM - - - 28 - - - - - KFUL - - - 35 - - - - - KFLV - - - 42 - - - - - DCHC - - - 38 - - - - - DCTS - - - 27 - - - - - DCHB - - - 33 - - - - - DEXC - - - 55 - - - - - DINV - - - 63 - - - - - DRTF - - - 45 - - - - - SINV - - - 26 - - - - - DCCT - - - 36 - - - - - DCST - - - 27 - - - - - MMET - - - 42 - - - - - MMXU - - - 63 - - - - - DCTE - - - 50 - - - - - DHVT - - - 45 - - - - - DLVT - - - 45 - - - - - DHFT - - - 46 - - - - - DLFT - - - 46 - - - - - DHFW - - - 70 - - - - - DLFW - - - 70 - - - - - DAGC - - - 61 - - - - - DTCD - - - 66 - - - - - DVWC - - - 68 - - - - - DWFL - - - 63 - - - - - DWGC - - - 59 - - - - - DWMN - - - 56 - - - - - DWMX - - - 56 - - - - - DFPF - - - 59 - - - - - DVVR - - - 66 - - - - - DVAR - - - 58 - - - - - DWVR - - - 60 - - - - - DRGS - - - 74 - - -
    - - - - -
    - - - - -
    -`; -/* end snapshot LNodeType wizards defines a createLNodeTypeWizard looks like the latest snapshot */ - -snapshots["LNodeType wizards defines a createLNodeTypeWizard opens a createLNodeTypeHelperWizard looks like the latest snapshot"] = -` -
    - - - Dummy.LLN0.NamPlt - - - Dummy.XCBR1.NamPlt - - - - - Dummy.LLN0.Beh - - - Dummy.LLN0.Health - - - - - Dummy.LLN0.Health - - - Dummy.LLN0.Beh - - - - - Dummy.SPS - - - - - Dummy.LLN0.Mod - - - - - - - Dummy.SPS - - - - - Dummy.XCBR1.OpCnt - - - - - Dummy.LPHD1.Sim - - - Dummy.XCBR1.BlkOpn - - - - - - - - - - - - - - - - - - - - - - - Dummy.SPS - - - - - - - Dummy.SPS - - - - - Dummy.SPS - - -
    - - - - -
    -`; -/* end snapshot LNodeType wizards defines a createLNodeTypeWizard opens a createLNodeTypeHelperWizard looks like the latest snapshot */ - -snapshots["LNodeType wizards defines a dOWizard to create a new DO element looks like the latest snapshot"] = -` -
    - - > - - - - - - Dummy.LLN0.Mod - - - Dummy.LLN0.Beh - - - Dummy.LLN0.Health - - - Dummy.LLN0.NamPlt - - - Dummy.LPHD1.PhyNam - - - Dummy.LPHD1.Sim - - - Dummy.XCBR1.Pos - - - Dummy.CSWI.Pos1 - - - Dummy.CSWI.Pos2 - - - Dummy.XCBR1.OpCnt - - - Dummy.XCBR1.NamPlt - - - Dummy.XCBR1.BlkOpn - - - Dummy.SPS - - - Dummy.WYE - - - Dummy.CMV - - - - - - -
    - - - - -
    -`; -/* end snapshot LNodeType wizards defines a dOWizard to create a new DO element looks like the latest snapshot */ - diff --git a/packages/compas-open-scd/test/integration/editors/templates/datype-wizarding.test.ts b/packages/compas-open-scd/test/integration/editors/templates/datype-wizarding.test.ts deleted file mode 100644 index 83a81f154..000000000 --- a/packages/compas-open-scd/test/integration/editors/templates/datype-wizarding.test.ts +++ /dev/null @@ -1,240 +0,0 @@ -import { html, fixture, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import { ListItem } from '@material/mwc-list/mwc-list-item'; -import { Select } from '@material/mwc-select'; - -import { FilteredList } from '../../../../src/filtered-list.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import TemplatesPlugin from '../../../../src/editors/Templates.js'; -import { patterns } from '../../../../src/foundation.js'; - -describe('DAType wizards', () => { - if (customElements.get('templates-editor') === undefined) - customElements.define('templates-editor', TemplatesPlugin); - let doc: Document; - let parent: MockWizardEditor; - let templates: TemplatesPlugin; - let dATypeList: FilteredList; - - beforeEach(async () => { - parent = await fixture( - html`` - ); - - templates = parent.querySelector('templates-editor')!; - - doc = await fetch('/test/testfiles/templates/datypes.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - templates.doc = doc; - await templates.updateComplete; - dATypeList = ( - templates.shadowRoot?.querySelector('filtered-list[id="datypelist"]') - ); - }); - - describe('defines a createDATypeWizard', () => { - let selector: Select; - let idField: WizardTextField; - let primayAction: HTMLElement; - beforeEach(async () => { - const button = ( - templates?.shadowRoot?.querySelectorAll( - 'mwc-icon-button[icon="playlist_add"]' - )[2] - ); - button.click(); - await parent.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - selector = ( - parent.wizardUI.dialog?.querySelector('mwc-select[label="values"]') - ); - idField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="id"]') - ); - cdcField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="cdc"]') - ); - primayAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('looks like the latest snapshot', async () => { - // prettier does not support escaping in regexes of the /v flag - await expect(parent.wizardUI.dialog).dom.to.equalSnapshot({ - ignoreAttributes: [ - { - tags: ['wizard-textfield'], - attributes: ['pattern'], - }, - ], - }); - }); - - // work around, because the escapes get removed in snapshot by prettier - it('should have correct pattern', async () => { - expect( - parent.wizardUI.dialog!.querySelectorAll('wizard-textfield[pattern]')! - .length - ).to.equal(3); - - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')[0] - .getAttribute('pattern') - ).to.equal(patterns.nmToken); - - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')[1] - .getAttribute('pattern') - ).to.equal(patterns.normalizedString); - - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')[2] - .getAttribute('pattern') - ).to.equal(patterns.cdc); - }); - - it('allows to add empty DOTypes to the project', async () => { - expect(doc.querySelector('DOType[id="myGeneralDOType"]')).to.not.exist; - idField.maybeValue = 'myGeneralDOType'; - cdcField.maybeValue = 'SPS'; - await parent.requestUpdate(); - primayAction.click(); - await parent.updateComplete; - expect(doc.querySelector('DOType[id="myGeneralDOType"]')).to.exist; - }); - - it('allows to define CDC only for empty DOType creation', async () => { - await cdcField.updateComplete; - expect(cdcField.disabled).to.not.be.true; - selector.value = 'OpenSCD_ENS_Health'; - await cdcField.requestUpdate(); - expect(cdcField.disabled).to.be.true; - }); - - it('requires CDC definition for empty DOTypes', async () => { - expect(doc.querySelector('DOType[id="myGeneralDOType"]')).to.not.exist; - idField.maybeValue = 'myGeneralDOType'; - cdcField.maybeValue = null; - await parent.requestUpdate(); - primayAction.click(); - await parent.updateComplete; - expect(doc.querySelector('DOType[id="myGeneralDOType"]')).to.not.exist; - }); - - it('respects the sequence defined in the standard', async () => { - idField.maybeValue = 'myGeneralDOType'; - cdcField.maybeValue = 'SPS'; - await parent.requestUpdate(); - primayAction.click(); - await parent.updateComplete; - const element = doc.querySelector('DOType[id="myGeneralDOType"]'); - expect(element?.nextElementSibling?.tagName).to.equal('DOType'); - expect(element?.previousElementSibling?.tagName).to.equal('LNodeType'); - }); - - it('recursively add missing! subsequent EnumType elements', async () => { - expect(doc.querySelector('DOType[id="myENSHealth"]')).to.not.exist; - expect(doc.querySelector('EnumType[id="HealthKind"]')).to.not.exist; - selector.value = 'OpenSCD_ENS_Health'; - idField.maybeValue = 'myENSHealth'; - await parent.requestUpdate(); - primayAction.click(); - await parent.updateComplete; - expect(doc.querySelector('DOType[id="myENSHealth"]')).to.exist; - expect(doc.querySelector('EnumType[id="HealthKind"]')).to.exist; - expect(doc.querySelectorAll('EnumType[id="HealthKind"]').length).to.equal( - 1 - ); - }); - - it('recursively add missing! subsequent DAType elements', async () => { - expect(doc.querySelector('DAType[id="OpenSCD_AnalogueValue_INT32"]')).to - .not.exist; - selector.value = 'OpenSCD_MV_int'; - idField.maybeValue = 'myMV'; - await parent.requestUpdate(); - primayAction.click(); - await parent.updateComplete; - expect(doc.querySelector('DAType[id="OpenSCD_AnalogueValue_INT32"]')).to - .exist; - expect( - doc.querySelectorAll('DAType[id="OpenSCD_AnalogueValue_INT32"]').length - ).to.equal(1); - }); - }); - - describe('defines a dOTypeWizard', () => { - let idField: WizardTextField; - let primayAction: HTMLElement; - let deleteButton: HTMLElement; - - beforeEach(async () => { - (( - dOTypeList.querySelector('mwc-list-item[value="#Dummy.LLN0.Mod"]') - )).click(); - await parent.requestUpdate(); - await new Promise(resolve => setTimeout(resolve, 100)); //recursive call takes time - idField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="id"]') - ); - primayAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - deleteButton = ( - Array.from( - parent.wizardUI.dialog!.querySelectorAll( - 'mwc-menu > mwc-list-item' - ) - ).find(item => item.innerHTML.includes(`[remove]`)) - ); - }); - - it('looks like the latest snapshot', async () => { - // prettier does not support escaping in regexes of the /v flag - await expect(parent.wizardUI.dialog).dom.to.equalSnapshot({ - ignoreAttributes: [ - { - tags: ['wizard-textfield'], - attributes: ['pattern'], - }, - ], - }); - }); - - // work around, because the escapes get removed in snapshot by prettier - it('should have correct pattern', async () => { - expect( - parent.wizardUI.dialog!.querySelectorAll('wizard-textfield[pattern]')! - .length - ).to.equal(3); - - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')[0] - .getAttribute('pattern') - ).to.equal(patterns.nmToken); - - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')[1] - .getAttribute('pattern') - ).to.equal(patterns.normalizedString); - - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')[2] - .getAttribute('pattern') - ).to.equal(patterns.normalizedString); - }); - - it('edits DOType attributes id', async () => { - expect(doc.querySelector('DOType[id="Dummy.LLN0.Mod"]')).to.exist; - idField.value = 'changedDOType'; - await parent.requestUpdate(); - primayAction.click(); - await parent.requestUpdate(); - expect(doc.querySelector('DOType[id="Dummy.LLN0.Mod"]')).to.not.exist; - expect(doc.querySelector('DOType[id="changedDOType"]')).to.exist; - }); - - it('deletes the DOType attribute on delete button click', async () => { - expect(doc.querySelector('DOType[id="Dummy.LLN0.Mod"]')).to.exist; - expect(doc.querySelectorAll('DOType').length).to.equal(15); - deleteButton.click(); - await parent.requestUpdate(); - expect(doc.querySelector('DAType[id="Dummy.LLN0.Mod"]')).to.not.exist; - expect(doc.querySelectorAll('DOType').length).to.equal(14); - }); - - it('does not edit DOType element without changes', async () => { - const originData = (( - doc.querySelector('DOType[id="Dummy.LLN0.Mod"]') - )).cloneNode(true); - primayAction.click(); - await parent.requestUpdate(); - expect( - originData.isEqualNode(doc.querySelector('DOType[id="Dummy.LLN0.Mod"]')) - ).to.be.true; - }); - }); - - describe('defines a sDOWizard to edit an existing SDO', () => { - let nameField: WizardTextField; - let primayAction: HTMLElement; - let deleteButton: HTMLElement; - let typeSelect: Select; - - beforeEach(async () => { - (( - dOTypeList.querySelector('mwc-list-item[value="#Dummy.WYE"]') - )).click(); - await parent.requestUpdate(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - (( - parent.wizardUI?.dialog?.querySelector( - 'mwc-list-item[value="#Dummy.WYE>phsA"]' - ) - )).click(); - await parent.requestUpdate(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - primayAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - deleteButton = ( - parent.wizardUI.dialog?.querySelector('mwc-menu > mwc-list-item') - ); - typeSelect = ( - parent.wizardUI.dialog?.querySelector('mwc-select[label="type"]') - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('looks like the latest snapshot', async () => { - // prettier does not support escaping in regexes of the /v flag - await expect(parent.wizardUI.dialog).dom.to.equalSnapshot({ - ignoreAttributes: [ - { - tags: ['wizard-textfield'], - attributes: ['pattern'], - }, - ], - }); - }); - - // work around, because the escapes get removed in snapshot by prettier - it('should have correct pattern', async () => { - expect( - parent.wizardUI.dialog!.querySelectorAll('wizard-textfield[pattern]')! - .length - ).to.equal(2); - - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')[0] - .getAttribute('pattern') - ).to.equal(patterns.tRestrName1stL); - - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')[1] - .getAttribute('pattern') - ).to.equal(patterns.normalizedString); - }); - - it('creates a new SDO element', async () => { - expect( - doc.querySelector( - 'DOType[id="Dummy.LLN0.Mod"] > SDO[name="newSDOElement"]' - ) - ).to.not.exist; - nameField.value = 'newSDOElement'; - typeSelect.value = 'Dummy.CMV'; - await parent.requestUpdate(); - primaryAction.click(); - await parent.requestUpdate(); - expect( - doc.querySelector( - 'DOType[id="Dummy.LLN0.Mod"] > SDO[name="newSDOElement"]:not([desc])[type="Dummy.CMV"]' - ) - ).to.exist; - }); - - it('creates yet another new SDO element', async () => { - const name = 'newSDOElement2'; - const desc = 'newSDOdesc'; - - expect( - doc.querySelector( - 'DOType[id="#Dummy.LLN0.Mod"] > SDO[name="newSDOElement2"]' - ) - ).to.not.exist; - nameField.value = name; - descField.nullable = false; - descField.value = desc; - typeSelect.value = 'Dummy.CMV'; - - await parent.requestUpdate(); - primaryAction.click(); - await parent.requestUpdate(); - expect( - doc.querySelector( - `DOType[id="Dummy.LLN0.Mod"] >` + - `SDO[name="${name}"][desc="${desc}"][type="Dummy.CMV"]` - ) - ).to.exist; - }); - }); -}); diff --git a/packages/compas-open-scd/test/integration/editors/templates/enumtype-wizarding.test.ts b/packages/compas-open-scd/test/integration/editors/templates/enumtype-wizarding.test.ts deleted file mode 100644 index 24db4625e..000000000 --- a/packages/compas-open-scd/test/integration/editors/templates/enumtype-wizarding.test.ts +++ /dev/null @@ -1,408 +0,0 @@ -import { html, fixture, expect } from '@open-wc/testing'; - -import '../../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../../mock-wizard-editor.js'; - -import { ListItem } from '@material/mwc-list/mwc-list-item'; -import { Select } from '@material/mwc-select'; - -import { FilteredList } from '../../../../src/filtered-list.js'; -import TemplatesPlugin from '../../../../src/editors/Templates.js'; -import { WizardTextField } from '../../../../src/wizard-textfield.js'; -import { patterns } from '../../../../src/foundation.js'; - -describe('EnumType wizards', () => { - if (customElements.get('templates-editor') === undefined) - customElements.define('templates-editor', TemplatesPlugin); - let doc: Document; - let parent: MockWizardEditor; - let templates: TemplatesPlugin; - let eNumTypeList: FilteredList; - - beforeEach(async () => { - parent = await fixture( - html`` - ); - - templates = parent.querySelector('templates-editor')!; - - doc = await fetch('/test/testfiles/templates/datypes.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - templates.doc = doc; - await templates.updateComplete; - eNumTypeList = ( - templates.shadowRoot?.querySelector('filtered-list[id="enumtypelist"]') - ); - }); - - describe('defines a createEnumTypeWizard', () => { - let selector: Select; - let idField: WizardTextField; - let primayAction: HTMLElement; - beforeEach(async () => { - const button = ( - templates?.shadowRoot?.querySelectorAll( - 'mwc-icon-button[icon="playlist_add"]' - )[3] - ); - button.click(); - await parent.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - selector = ( - 'mwc-select[label="lnClass"]' - )!; - idField = parent.wizardUI.dialog!.querySelector( - 'wizard-textfield[label="id"]' - )!; - primayAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - it('looks like the latest snapshot', async () => { - await expect(parent.wizardUI.dialog).to.equalSnapshot({ - ignoreAttributes: [ - { - tags: ['wizard-textfield'], - attributes: ['pattern'], - }, - ], - }); - }); - - //work around, because the escapes get removed in snapshot - it('should have correct pattern', async () => { - const pattern = - '([:_A-Za-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|[\u0370-\u037D]' + - '|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]' + - '|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]|[.0-9\\-]|\u00B7|[\u0300-\u036F]|[\u203F-\u2040])+'; - expect( - parent.wizardUI.dialog!.querySelectorAll('wizard-textfield[pattern]')! - .length - ).to.equal(2); - - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')[0] - .getAttribute('pattern') - ).to.equal(pattern); - - expect( - parent.wizardUI - .dialog!.querySelectorAll('wizard-textfield[pattern]')[1] - .getAttribute('pattern') - ).to.equal(patterns.normalizedString); - }); - - it('uses -7-4 and -7-420 namespace for lnClass suggestion', () => - expect( - selector.items.filter(item => !item.noninteractive && !item.twoline) - ).to.have.lengthOf(215)); - - it('recursively add missing! subsequent DOType elements', async () => { - expect(doc.querySelector('LNodeType[id="myCSWI"]')).to.not.exist; - expect(doc.querySelector('DOType[id="OpenSCD_ENC_Mod"]')).to.not.exist; - expect(doc.querySelector('DOType[id="OpenSCD_ENS_Beh"]')).to.not.exist; - expect(doc.querySelector('DOType[id="OpenSCD_ENS_Health"]')).to.not.exist; - expect(doc.querySelector('DOType[id="OpenSCD_LPL_noLD"]')).to.not.exist; - expect(doc.querySelector('DOType[id="OpenSCD_SPS_simple"]')).to.not.exist; - expect(doc.querySelector('DOType[id="OpenSCD_DPC"]')).to.not.exist; - await new Promise(resolve => setTimeout(resolve, 100)); //recursive call takes time - selector.value = '#OpenSCD_CSWI_noPB'; - await parent.requestUpdate(); // selector updates autoimport - idField.maybeValue = 'myCSWI'; - await parent.requestUpdate(); - primayAction.click(); - await parent.updateComplete; - expect(doc.querySelector('LNodeType[id="myCSWI"]')).to.exist; - expect( - doc.querySelectorAll('DOType[id="OpenSCD_ENC_Mod"]').length - ).to.equal(1); - expect( - doc.querySelectorAll('DOType[id="OpenSCD_ENS_Beh"]').length - ).to.equal(1); - expect( - doc.querySelectorAll('DOType[id="OpenSCD_ENS_Health"]').length - ).to.equal(1); - expect( - doc.querySelectorAll('DOType[id="OpenSCD_LPL_noLD"]').length - ).to.equal(1); - expect( - doc.querySelectorAll('DOType[id="OpenSCD_SPS_simple"]').length - ).to.equal(1); - expect(doc.querySelectorAll('DOType[id="OpenSCD_DPC"]').length).to.equal( - 1 - ); - }).timeout(5000); - - it('recursively add missing! subsequent DAType elements', async () => { - expect(doc.querySelector('LNodeType[id="myCSWI"]')).to.not.exist; - expect(doc.querySelector('DAType[id="OpenSCD_Originator"]')).to.not.exist; - expect(doc.querySelector('DAType[id="OpenSCD_OperSBOw_Dbpos"]')).to.not - .exist; - expect(doc.querySelector('DAType[id="OpenSCD_Cancel_Dbpos"]')).to.not - .exist; - expect( - doc.querySelector('DAType[id="OpenSCD_OperSBOw_BehaviourModeKind"]') - ).to.not.exist; - expect(doc.querySelector('DAType[id="OpenSCD_Cancel_BehaviourModeKind"]')) - .to.not.exist; - expect(doc.querySelector('DAType[id="OpenSCD_PulseConfig"]')).to.not - .exist; - selector.value = '#OpenSCD_CSWI_noPB'; - await parent.requestUpdate(); // selector updates autoimport - idField.maybeValue = 'myCSWI'; - await parent.requestUpdate(); - primayAction.click(); - await parent.updateComplete; - expect(doc.querySelector('LNodeType[id="myCSWI"]')).to.exist; - expect( - doc.querySelectorAll('DAType[id="OpenSCD_Originator"]').length - ).to.equal(1); - expect( - doc.querySelectorAll('DAType[id="OpenSCD_OperSBOw_Dbpos"]').length - ).to.equal(1); - expect( - doc.querySelectorAll('DAType[id="OpenSCD_Cancel_Dbpos"]').length - ).to.equal(1); - expect( - doc.querySelectorAll('DAType[id="OpenSCD_OperSBOw_BehaviourModeKind"]') - .length - ).to.equal(1); - expect( - doc.querySelectorAll('DAType[id="OpenSCD_Cancel_BehaviourModeKind"]') - .length - ).to.equal(1); - expect( - doc.querySelectorAll('DAType[id="OpenSCD_PulseConfig"]').length - ).to.equal(1); - }).timeout(5000); - - it('recursively add missing! subsequent EnumType elements', async () => { - expect(doc.querySelector('LNodeType[id="myCSWI"]')).to.not.exist; - expect(doc.querySelector('EnumType[id="OriginatorCategoryKind"]')).to.not - .exist; - expect(doc.querySelector('EnumType[id="BehaviourModeKind"]')).to.not - .exist; - expect(doc.querySelector('EnumType[id="CtlModelKind"]')).to.not.exist; - expect(doc.querySelector('EnumType[id="HealthKind"]')).to.not.exist; - expect(doc.querySelector('EnumType[id="OutputSignalKind"]')).to.not.exist; - selector.value = '#OpenSCD_CSWI_noPB'; - await parent.requestUpdate(); // selector updates autoimport - idField.maybeValue = 'myCSWI'; - await parent.requestUpdate(); - primayAction.click(); - await parent.updateComplete; - expect(doc.querySelector('LNodeType[id="myCSWI"]')).to.exist; - expect( - doc.querySelectorAll('EnumType[id="OriginatorCategoryKind"]').length - ).to.equal(1); - expect( - doc.querySelectorAll('EnumType[id="BehaviourModeKind"]').length - ).to.equal(1); - expect( - doc.querySelectorAll('EnumType[id="CtlModelKind"]').length - ).to.equal(1); - expect(doc.querySelectorAll('EnumType[id="HealthKind"]').length).to.equal( - 1 - ); - expect( - doc.querySelectorAll('EnumType[id="OutputSignalKind"]').length - ).to.equal(1); - }).timeout(5000); - - it('respects the sequence defined in the standard', async () => { - selector.value = '#OpenSCD_CSWI_noPB'; - await parent.requestUpdate(); // selector updates autoimport - idField.maybeValue = 'myGeneralLNodeType'; - await parent.requestUpdate(); - primayAction.click(); - await parent.updateComplete; - const element = doc.querySelector('LNodeType[id="myGeneralLNodeType"]'); - expect(element?.nextElementSibling?.tagName).to.equal('LNodeType'); - expect(element?.previousElementSibling).to.be.null; - }).timeout(5000); - - describe('opens a createLNodeTypeHelperWizard', () => { - let saveButton: HTMLElement; - let beh: Select; - let enaOpn: Select; - let enaCls: Select; - let ens: Element; - let sps: Element; - let ensId: string; - let spsId: string; - - beforeEach(async () => { - selector.value = 'CILO'; - idField.maybeValue = 'myGeneralLNodeType'; - await parent.updateComplete; - - (( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - )).click(); - await parent.updateComplete; - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - saveButton = parent.wizardUI.shadowRoot!.querySelector( - 'mwc-button[slot="primaryAction"]' - )!; - - beh = parent.wizardUI.shadowRoot!.querySelector( - 'wizard-select:nth-child(21)' - )!; - enaCls = parent.wizardUI.shadowRoot!.querySelector( - parent.wizardUI.dialog?.querySelector('mwc-select[label="type"]') - ); - transientSelect = ( - parent.wizardUI.dialog?.querySelector( - 'wizard-checkbox[label="transient"]' - ) - ); - primaryAction = ( - parent.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - deleteButton = ( - parent.wizardUI.dialog?.querySelector('mwc-menu > mwc-list-item') - ); - }); - - it('looks like the latest snapshot', () => { - expect(parent.wizardUI.dialog).to; - }); - it('edits DO attributes name', async () => { - expect(doc.querySelector('LNodeType[id="Dummy.LLN0"] > DO[name="Mod"]')) - .to.exist; - nameField.value = 'NewMod'; - await parent.requestUpdate(); - primaryAction.click(); - await parent.requestUpdate(); - expect(doc.querySelector('LNodeType[id="Dummy.LLN0"] > DO[name="Mod"]')) - .to.not.exist; - expect( - doc.querySelector('LNodeType[id="Dummy.LLN0"] > DO[name="NewMod"]') - ).to.exist; - }); - it('edits yet another attribute of the DO element', async () => { - expect( - doc.querySelector('LNodeType[id="Dummy.LLN0"] > DO[name="NewMod"]') - ).to.not.exist; - - nameField.value = 'NewMod'; - descField.nullable = false; - descField.value = 'myDesc'; - typeSelect.value = 'Dummy.CMV'; - accessControlField.nullable = false; - accessControlField.maybeValue = 'myAccessControl'; - transientSelect.maybeValue = 'true'; - - await parent.requestUpdate(); - primaryAction.click(); - await parent.requestUpdate(); - expect( - doc.querySelector( - `LNodeType[id="Dummy.LLN0"] >` + - `DO[name="NewMod"][desc="myDesc"][type="Dummy.CMV"][accessControl="myAccessControl"][transient="true"]` - ) - ).to.exist; - }); - it('deletes the DO element on delete button click', async () => { - expect(doc.querySelector('LNodeType[id="Dummy.LLN0"] > DO[name="Mod"]')) - .to.exist; - expect( - doc.querySelectorAll('LNodeType[id="Dummy.LLN0"] > DO').length - ).to.equal(4); - deleteButton.click(); - await parent.requestUpdate(); - expect(doc.querySelector('LNodeType[id="Dummy.LLN0"] > DO[name="Mod"]')) - .to.not.exist; - expect( - doc.querySelectorAll('LNodeType[id="Dummy.LLN0"] > DO').length - ).to.equal(3); - }); - it('does not edit DO element without changes', async () => { - const originData = (( - doc.querySelector('LNodeType[id="Dummy.LLN0"] > DO[name="Mod"]') - )).cloneNode(true); - primaryAction.click(); - await parent.requestUpdate(); - expect( - originData.isEqualNode( - doc.querySelector('LNodeType[id="Dummy.LLN0"] > DO[name="Mod"]') - ) - ).to.be.true; - }); - it('filters the type selector to DOTypes', async () => { - expect(typeSelect!.querySelectorAll('mwc-list-item').length).to.equal( - doc.querySelectorAll('DOType').length - ); - }); - }); - - describe('defines a dOWizard to create a new DO element', () => { - let nameField: WizardTextField; - let descField: WizardTextField; - let typeSelect: Select; - let accessControlField: WizardTextField; - let transientSelect: WizardCheckbox; - let primaryAction: HTMLElement; - - beforeEach(async () => { - (( - lNodeTypeList.querySelector('mwc-list-item[value="#Dummy.LLN0"]') - )).click(); - await parent.requestUpdate(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - (( - parent.wizardUI.dialog?.querySelectorAll('mwc-menu > mwc-list-item')[1] - )).click(); - await parent.requestUpdate(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - - nameField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="name"]') - ); - descField = ( - parent.wizardUI.dialog?.querySelector('wizard-textfield[label="desc"]') - ); - accessControlField = ( - parent.wizardUI.dialog?.querySelector( - 'wizard-textfield[label="accessControl"]' - ) - ); - typeSelect = ( - redirectUI.querySelector(`mwc-select[label="${oldIed}"]`) - ); - - if (select) select.value = newIed; - }); - } - - redirectUI - .querySelector('mwc-button[icon="content_copy"]') - ?.click(); - await redirectUI.updateComplete; -} - -describe('Clone Redirection UI', () => { - describe('triggered by bay-editor', () => { - let element: BayEditor; - - let actionEvent: SinonSpy; - - beforeEach(async () => { - const bay = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - - element = ( - await fixture(html``) - ); - - actionEvent = spy(); - window.addEventListener('editor-action', actionEvent); - }); - - it('looks like the latest snapshot', async () => { - await loadAndClone(element, 'validRedirect.scd'); - - expect(element.dialog).to.exist; - expect(actionEvent).to.not.have.been.called; - await expect(element.dialog).to.equalSnapshot(); - }); - - it('checks for name uniqueness ', async () => { - await loadAndClone(element, 'validRedirect.scd'); - await setUpAndTriggerRedirectUI(element.dialog, 'Q01'); - - expect(actionEvent).to.not.have.been.called; - }); - - it('only redirect selected IEDs', async () => { - await loadAndClone(element, 'validRedirect.scd'); - await setUpAndTriggerRedirectUI(element.dialog, 'Q02', { - IED1: 'IED3', - IED2: 'No', - }); - - const cloneEntity = actionEvent.args[0][0].detail.action.new.element; - expect(cloneEntity.querySelectorAll('LNode').length).to.equal(2); - expect( - cloneEntity.querySelectorAll('LNode:not([iedName="IED3"])').length - ).to.equal(0); - }); - - it('checks reference validity before redirect', async () => { - await loadAndClone(element, 'validRedirect.scd'); - await setUpAndTriggerRedirectUI(element.dialog, 'Q02', { - IED1: 'No', - IED2: 'IED4', - }); - - const cloneEntity = actionEvent.args[0][0].detail.action.new.element; - expect(cloneEntity.querySelectorAll('LNode[lnClass="CSWI"]')).to.not - .exist; - }); - - describe('is not visible to the user', () => { - it('in specification phase (LNode="None")', async () => { - await loadAndClone(element, 'specificationOnly.scd'); - - expect(element.dialog).to.not.exist; - expect(actionEvent).to.have.been.called; - }); - - it('in case LNode are all in use', async () => { - await loadAndClone(element, 'noUnusedLNode.scd'); - - expect(element.dialog).to.not.exist; - expect(actionEvent).to.have.been.called; - }); - - it('in case LNode are not present in all other IEDs', async () => { - await loadAndClone(element, 'refMissmatch.scd'); - - expect(element.dialog).to.not.exist; - expect(actionEvent).to.have.been.called; - }); - }); - }); - - describe('triggered by voltage-level-editor', () => { - let element: VoltageLevelEditor; - - beforeEach(async () => { - const voltageLevel = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - - element = ( - await fixture( - html`` - ) - ); - }); - - it('looks like the latest snapshot', async () => { - await loadAndClone(element, 'validRedirect.scd'); - - expect(element.dialog).to.exist; - await expect(element.dialog).to.equalSnapshot(); - }); - }); - - describe('triggered by substation-editor', () => { - let element: SubstationEditor; - - beforeEach(async () => { - const substation = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - - element = ( - await fixture( - html`` - ) - ); - }); - - it('looks like the latest snapshot', async () => { - await loadAndClone(element, 'validRedirect.scd'); - - expect(element.dialog).to.exist; - await expect(element.dialog).to.equalSnapshot(); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/editors/substation/sub-equipment-editor.test.ts b/packages/compas-open-scd/test/unit/editors/substation/sub-equipment-editor.test.ts deleted file mode 100644 index 5505cfa27..000000000 --- a/packages/compas-open-scd/test/unit/editors/substation/sub-equipment-editor.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../../src/editors/substation/sub-equipment-editor.js'; -import { SubEquipmentEditor } from '../../../../src/editors/substation/sub-equipment-editor.js'; - -describe('sub-equipment-editor', () => { - let element: SubEquipmentEditor; - let doc: XMLDocument; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/SubEquipment.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - element = ( - await fixture( - html`` - ) - ); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - - describe('With children', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/SubEquipment.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - element = ( - await fixture( - html`` - ) - ); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('without description and state', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/SubEquipment.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - element = ( - await fixture( - html`` - ) - ); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/editors/substation/sub-function-editor.test.ts b/packages/compas-open-scd/test/unit/editors/substation/sub-function-editor.test.ts deleted file mode 100644 index f861502ee..000000000 --- a/packages/compas-open-scd/test/unit/editors/substation/sub-function-editor.test.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../../src/editors/substation/sub-function-editor.js'; -import { SubFunctionEditor } from '../../../../src/editors/substation/sub-function-editor.js'; - -describe('web component rendering SubFunction element', () => { - let element: SubFunctionEditor; - let doc: XMLDocument; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - describe('with complete attribute set and existing children', () => { - beforeEach(async () => { - element = ( - await fixture( - html`` - ) - ); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('with missing desc and type attribute', () => { - beforeEach(async () => { - element = ( - await fixture( - html`` - ) - ); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('with existing LNode children', () => { - beforeEach(async () => { - element = ( - await fixture( - html`` - ) - ); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('with general-equipment children', () => { - beforeEach(async () => { - doc = await fetch( - '/test/testfiles/editors/substation/generalequipment.scd' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - element.element = doc.querySelector('SubFunction')!; - element.showfunctions = false; - await element.updateComplete; - }); - - it('with showfunctions false looks like the latest snapshot', async () => - await expect(element).shadowDom.to.equalSnapshot()); - - it('with showfunctions true looks like the latest snapshot', async () => { - element.showfunctions = true; - await element.updateComplete; - - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/editors/substation/substation-editor.test.ts b/packages/compas-open-scd/test/unit/editors/substation/substation-editor.test.ts deleted file mode 100644 index 220a54889..000000000 --- a/packages/compas-open-scd/test/unit/editors/substation/substation-editor.test.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { html, fixture, expect } from '@open-wc/testing'; - -import '../../../../src/editors/substation/substation-editor.js'; -import { SubstationEditor } from '../../../../src/editors/substation/substation-editor.js'; - -describe('substation-editor', () => { - let element: SubstationEditor; - let doc: XMLDocument; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - element = await fixture(html``); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - - describe('with readonly property', () => { - beforeEach(async () => { - element.readonly = true; - await element.requestUpdate(); - }); - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('with function filter deactivated', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - element.element = doc.querySelector('Substation')!; - element.showfunctions = true; - await element.requestUpdate(); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('with general-equipment children', () => { - beforeEach(async () => { - doc = await fetch( - '/test/testfiles/editors/substation/generalequipment.scd' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - element.element = doc.querySelector('Substation')!; - element.showfunctions = false; - await element.updateComplete; - }); - - it('with showfunctions false looks like the latest snapshot', async () => - await expect(element).shadowDom.to.equalSnapshot()); - - it('with showfunctions true looks like the latest snapshot', async () => { - element.showfunctions = true; - await element.updateComplete; - - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/editors/substation/tapchanger-editor.test.ts b/packages/compas-open-scd/test/unit/editors/substation/tapchanger-editor.test.ts deleted file mode 100644 index 4b0f00179..000000000 --- a/packages/compas-open-scd/test/unit/editors/substation/tapchanger-editor.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../../src/editors/substation/tapchanger-editor.js'; -import { TapChangerEditor } from '../../../../src/editors/substation/tapchanger-editor.js'; - -describe('web component rendering TapChanger element', () => { - let element: TapChangerEditor; - let doc: XMLDocument; - - describe('rendering LNode and EqFunction children', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/editors/substation/TapChanger.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - element = ( - await fixture( - html`` - ) - ); - element.showfunctions = true; - await element.updateComplete; - }); - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('rendering SubEquipment', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/editors/substation/TapChanger.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - element = ( - await fixture( - html`` - ) - ); - element.showfunctions = true; - await element.updateComplete; - }); - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/editors/substation/transformer-winding-editor.test.ts b/packages/compas-open-scd/test/unit/editors/substation/transformer-winding-editor.test.ts deleted file mode 100644 index 2ed1ada4c..000000000 --- a/packages/compas-open-scd/test/unit/editors/substation/transformer-winding-editor.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../../src/editors/substation/transformer-winding-editor.js'; -import { TransformerWindingEditor } from '../../../../src/editors/substation/transformer-winding-editor.js'; - -describe('transformer-winding-editor', () => { - let element: TransformerWindingEditor; - let doc: XMLDocument; - - beforeEach(async () => { - doc = await fetch( - 'test/testfiles/editors/substation/TransformerWinding.scd' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - describe('with children', () => { - describe('when EqFunction elements are rendered', () => { - it('looks like the latest snapshot', async () => { - element = ( - await fixture( - html`` - ) - ); - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - describe('when hiding EqFunction elements', () => { - it('looks like the latest snapshot', async () => { - element = ( - await fixture( - html`` - ) - ); - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - }); - - describe('without children', () => { - it('looks like the latest snapshot', async () => { - element = ( - await fixture( - html`` - ) - ); - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/editors/substation/voltage-level-editor.test.ts b/packages/compas-open-scd/test/unit/editors/substation/voltage-level-editor.test.ts deleted file mode 100644 index 0a6ec1021..000000000 --- a/packages/compas-open-scd/test/unit/editors/substation/voltage-level-editor.test.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { fixture, html, expect } from '@open-wc/testing'; - -import '../../../../src/editors/substation/voltage-level-editor.js'; -import { VoltageLevelEditor } from '../../../../src/editors/substation/voltage-level-editor.js'; - -describe('voltage-level-editor', () => { - let element: VoltageLevelEditor; - let doc: XMLDocument; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - element = ( - await fixture( - html`` - ) - ); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - - describe('with readonly property', () => { - beforeEach(async () => { - element.readonly = true; - await element.requestUpdate(); - }); - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('with function filter deactivated', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - element.element = doc.querySelector('VoltageLevel')!; - element.showfunctions = true; - await element.requestUpdate(); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('with function filter deactivated and existing LNode children', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/functions.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - element.element = doc.querySelector('VoltageLevel[name="J1"]')!; - element.showfunctions = true; - await element.requestUpdate(); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('with general-equipment children', () => { - beforeEach(async () => { - doc = await fetch( - '/test/testfiles/editors/substation/generalequipment.scd' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - element.element = doc.querySelector('VoltageLevel')!; - element.showfunctions = false; - await element.updateComplete; - }); - - it('with showfunctions false looks like the latest snapshot', async () => - await expect(element).shadowDom.to.equalSnapshot()); - - it('with showfunctions true looks like the latest snapshot', async () => { - element.showfunctions = true; - await element.updateComplete; - - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/editors/substation/zeroline-pane.test.ts b/packages/compas-open-scd/test/unit/editors/substation/zeroline-pane.test.ts deleted file mode 100644 index b84b12a8e..000000000 --- a/packages/compas-open-scd/test/unit/editors/substation/zeroline-pane.test.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../../../../src/editors/substation/zeroline-pane.js'; -import { ZerolinePane } from '../../../../src/editors/substation/zeroline-pane.js'; -import { - attachedIeds, - getAttachedIeds, -} from '../../../../src/editors/substation/foundation.js'; - -describe('zeroline-pane', () => { - let doc: XMLDocument; - - let substation1: Element; - let substation2: Element; - - let voltageLevel1: Element; - let voltageLevel2: Element; - - let bay1: Element; - let bay2: Element; - - let remainingIeds: Set; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/zeroline/iedalloctest.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - substation1 = doc.querySelector('Substation[name="AA1"]')!; - substation2 = doc.querySelector('Substation[name="AA2"]')!; - - voltageLevel1 = doc.querySelector('VoltageLevel[name="E1"]')!; - voltageLevel2 = doc.querySelector('VoltageLevel[name="J1"]')!; - - bay1 = doc.querySelector('Bay[name="Bay1"]')!; - bay2 = doc.querySelector('Bay[name="Bay2"]')!; - - remainingIeds = new Set(Array.from(doc.querySelectorAll('IED'))); - }); - - it('per default looks like the latest snapshot', async () => { - const element: ZerolinePane = await fixture( - html`` - ); - - if (element.showieds.on) await element.showieds.click(); - if (element.showfunctions.on) await element.showfunctions.click(); - - await new Promise(resolve => setTimeout(resolve, 2000)); // await animation - - await expect(element).shadowDom.to.equalSnapshot(); - }).timeout(5000); - - it('showieds looks like the latest snapshot', async () => { - const element: ZerolinePane = await fixture( - html`` - ); - - if (!element.showieds.on) await element.showieds.click(); - if (element.showfunctions.on) await element.showfunctions.click(); - - await new Promise(resolve => setTimeout(resolve, 2000)); // await IEDs are rendered - - await expect(element).shadowDom.to.equalSnapshot(); - }).timeout(5000); - - describe('attachedIeds', () => { - it('returns IEDs that cannot be allocated to any element', async () => { - const ieds = await attachedIeds(doc.documentElement!, remainingIeds); - - expect(ieds.length).to.equal(2); - expect(ieds[0].getAttribute('name')).to.equal('IED6'); - expect(ieds[1].getAttribute('name')).to.equal('IED8'); - }); - describe('return IEDs for Bay elements that', () => { - it('are connected itself or underlaying conduncting equipment', async () => { - const ieds = await attachedIeds(bay1, remainingIeds); - - expect(ieds.length).to.equal(2); - expect(ieds[0].getAttribute('name')).to.equal('IED1'); - expect(ieds[1].getAttribute('name')).to.equal('IED4'); - }); - - it('are not connected to another Bay as well', async () => { - expect((await attachedIeds(bay2, remainingIeds)).length).to.equal(0); - }); - }); - describe('return IEDs for VoltageLevel elements that', () => { - it('are connected itself or underlaying elements', async () => { - const ieds = await attachedIeds(voltageLevel1, remainingIeds); - - expect(ieds.length).to.equal(2); - expect(ieds[0].getAttribute('name')).to.equal('IED2'); - expect(ieds[1].getAttribute('name')).to.equal('IED5'); - }); - - it('are not connected to another Bay ass well', async () => { - expect( - (await attachedIeds(voltageLevel2, remainingIeds)).length - ).to.equal(0); - }); - }); - describe('return IEDs for Substation elements that', () => { - it('are connected itself or underlaying elements', async () => { - const ieds = await attachedIeds(substation1, remainingIeds); - - expect(ieds.length).to.equal(2); - expect(ieds[0].getAttribute('name')).to.equal('IED3'); - expect(ieds[1].getAttribute('name')).to.equal('IED7'); - }); - it('are not connected to another Substation ass well', async () => { - expect( - (await attachedIeds(substation2, remainingIeds)).length - ).to.equal(0); - }); - }); - }); - - it('both the functions return every IED only once', async () => { - const numSub1 = (await attachedIeds(substation1, remainingIeds)).length; - const numSub2 = (await attachedIeds(substation2, remainingIeds)).length; - const numVolt1 = (await attachedIeds(voltageLevel1, remainingIeds)).length; - const numVolt2 = (await attachedIeds(voltageLevel2, remainingIeds)).length; - const numBay1 = (await attachedIeds(bay1, remainingIeds)).length; - const numBay2 = (await attachedIeds(bay2, remainingIeds)).length; - - const numUnRef = (await attachedIeds(doc.documentElement, remainingIeds)) - .length; - - const sumIeds = - numBay1 + numBay2 + numVolt1 + numVolt2 + numSub1 + numSub2 + numUnRef; - - expect(sumIeds).to.equal(doc.querySelectorAll('IED').length); - }); -}).timeout(10000); diff --git a/packages/compas-open-scd/test/unit/editors/templates/datype.test.ts b/packages/compas-open-scd/test/unit/editors/templates/datype.test.ts deleted file mode 100644 index c47bfef36..000000000 --- a/packages/compas-open-scd/test/unit/editors/templates/datype.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import { SinonSpy, spy } from 'sinon'; - -import '../../../mock-wizard.js'; -import { MockWizard } from '../../../mock-wizard.js'; - -import { - ComplexAction, - identity, - isSimple, - Replace, - WizardInputElement, -} from '../../../../src/foundation.js'; -import { editDaTypeWizard } from '../../../../src/editors/templates/datype-wizards.js'; - -describe('wizards for DAType element', () => { - let doc: XMLDocument; - let element: MockWizard; - let inputs: WizardInputElement[]; - let input: WizardInputElement | undefined; - - let primaryAction: HTMLElement; - - let actionEvent: SinonSpy; - - beforeEach(async () => { - element = await fixture(html``); - - actionEvent = spy(); - window.addEventListener('editor-action', actionEvent); - }); - - describe('include an edit wizard that', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2003.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - const wizard = editDaTypeWizard( - identity(doc.querySelector('DAType')), - doc - )!; - element.workflow.push(() => wizard); - await element.requestUpdate(); - - inputs = Array.from(element.wizardUI.inputs); - - primaryAction = ( - element.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - describe('allows to edit id attribute', () => { - beforeEach(() => { - input = inputs.find(input => input.label === 'id'); - }); - - it('as wizard input', () => expect(input).to.exist); - - it('triggers a complex action', () => { - input!.value = 'someTestId'; - primaryAction.click(); - expect(actionEvent).to.be.calledOnce; - - const action = actionEvent.args[0][0].detail.action; - expect(action).to.not.satisfy(isSimple); - }); - - it('that edits the id attribute of DAType', () => { - input!.value = 'someTestId'; - primaryAction.click(); - - const complexAction = ( - actionEvent.args[0][0].detail.action - ); - const actions = complexAction.actions; - expect(actions[0].new.element).to.have.attribute('id', 'someTestId'); - }); - - it('that edits all referenced lnType attribute as well', () => { - const oldId = input?.value; - const numReferences = doc.querySelectorAll( - `DOType > DA[type="${oldId}"], DAType > BDA[type="${oldId}"]` - ).length; - - input!.value = 'someTestId'; - primaryAction.click(); - - const complexAction = ( - actionEvent.args[0][0].detail.action - ); - const actions = complexAction.actions; - expect(actions).to.have.lengthOf(numReferences + 1); - - actions.shift(); //the first updates the DAType itself and has no 'id' - for (const action of actions) - expect(action.new.element).to.have.attribute('type', 'someTestId'); - }); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/editors/templates/dotype.test.ts b/packages/compas-open-scd/test/unit/editors/templates/dotype.test.ts deleted file mode 100644 index 102a248d7..000000000 --- a/packages/compas-open-scd/test/unit/editors/templates/dotype.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import { SinonSpy, spy } from 'sinon'; - -import '../../../mock-wizard.js'; -import { MockWizard } from '../../../mock-wizard.js'; - -import { - ComplexAction, - identity, - isSimple, - Replace, - WizardInputElement, -} from '../../../../src/foundation.js'; -import { dOTypeWizard } from '../../../../src/editors/templates/dotype-wizards.js'; - -describe('wizards for DOType element', () => { - let doc: XMLDocument; - let element: MockWizard; - let inputs: WizardInputElement[]; - let input: WizardInputElement | undefined; - - let primaryAction: HTMLElement; - - let actionEvent: SinonSpy; - - beforeEach(async () => { - element = await fixture(html``); - - actionEvent = spy(); - window.addEventListener('editor-action', actionEvent); - }); - - describe('include an edit wizard that', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2003.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - const wizard = dOTypeWizard( - identity(doc.querySelector('DOType')), - doc - )!; - element.workflow.push(() => wizard); - await element.requestUpdate(); - - inputs = Array.from(element.wizardUI.inputs); - - primaryAction = ( - element.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - describe('allows to edit id attribute', () => { - beforeEach(() => { - input = inputs.find(input => input.label === 'id'); - }); - - it('as wizard input', () => expect(input).to.exist); - - it('triggers a complex action', () => { - input!.value = 'someTestId'; - primaryAction.click(); - expect(actionEvent).to.be.calledOnce; - - const action = actionEvent.args[0][0].detail.action; - expect(action).to.not.satisfy(isSimple); - }); - - it('that edits the id attribute of DOType', () => { - input!.value = 'someTestId'; - primaryAction.click(); - - const complexAction = ( - actionEvent.args[0][0].detail.action - ); - const actions = complexAction.actions; - expect(actions[0].new.element).to.have.attribute('id', 'someTestId'); - }); - - it('that edits all referenced lnType attribute as well', () => { - const oldId = input?.value; - const numReferences = doc.querySelectorAll( - `LNodeType > DO[type="${oldId}"], DOType > SDO[type="${oldId}"]` - ).length; - - input!.value = 'someTestId'; - primaryAction.click(); - - const complexAction = ( - actionEvent.args[0][0].detail.action - ); - const actions = complexAction.actions; - expect(actions).to.have.lengthOf(numReferences + 1); - actions.shift(); //the first updates the DOType itself and has no 'id' - for (const action of actions) - expect(action.new.element).to.have.attribute('type', 'someTestId'); - }); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/editors/templates/enumtype.test.ts b/packages/compas-open-scd/test/unit/editors/templates/enumtype.test.ts deleted file mode 100644 index 44a580e1e..000000000 --- a/packages/compas-open-scd/test/unit/editors/templates/enumtype.test.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import { SinonSpy, spy } from 'sinon'; - -import '../../../mock-wizard.js'; -import { MockWizard } from '../../../mock-wizard.js'; - -import { - ComplexAction, - identity, - isSimple, - Replace, - WizardInputElement, -} from '../../../../src/foundation.js'; -import { eNumTypeEditWizard } from '../../../../src/editors/templates/enumtype-wizard.js'; - -describe('wizards for EnumType element', () => { - let doc: XMLDocument; - let element: MockWizard; - let inputs: WizardInputElement[]; - let input: WizardInputElement | undefined; - - let primaryAction: HTMLElement; - - let actionEvent: SinonSpy; - - beforeEach(async () => { - element = await fixture(html``); - - actionEvent = spy(); - window.addEventListener('editor-action', actionEvent); - }); - - describe('include an edit wizard that', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2003.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - const wizard = eNumTypeEditWizard( - identity(doc.querySelector('EnumType')), - doc - )!; - element.workflow.push(() => wizard); - await element.requestUpdate(); - - inputs = Array.from(element.wizardUI.inputs); - - primaryAction = ( - element.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - describe('allows to edit id attribute', () => { - beforeEach(() => { - input = inputs.find(input => input.label === 'id'); - }); - - it('as wizard input', () => expect(input).to.exist); - - it('triggers a complex action', () => { - input!.value = 'someTestId'; - primaryAction.click(); - expect(actionEvent).to.be.calledOnce; - - const action = actionEvent.args[0][0].detail.action; - expect(action).to.not.satisfy(isSimple); - }); - - it('that edits the id attribute of EnumType', () => { - input!.value = 'someTestId'; - primaryAction.click(); - - const complexAction = ( - actionEvent.args[0][0].detail.action - ); - const actions = complexAction.actions; - expect(actions[0].new.element).to.have.attribute('id', 'someTestId'); - }); - - it('that edits all referenced lnType attribute as well', () => { - const oldId = input?.value; - const numReferences = doc.querySelectorAll( - `DOType > DA[type="${oldId}"], DAType > BDA[type="${oldId}"]` - ).length; - - input!.value = 'someTestId'; - primaryAction.click(); - - const complexAction = ( - actionEvent.args[0][0].detail.action - ); - const actions = complexAction.actions; - expect(actions).to.have.lengthOf(numReferences + 1); - - actions.shift(); //the first updates the EnumType itself and has no 'id' - for (const action of actions) - expect(action.new.element).to.have.attribute('type', 'someTestId'); - }); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/editors/templates/lnodetype-wizard.test.ts b/packages/compas-open-scd/test/unit/editors/templates/lnodetype-wizard.test.ts deleted file mode 100644 index f071fba88..000000000 --- a/packages/compas-open-scd/test/unit/editors/templates/lnodetype-wizard.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import { SinonSpy, spy } from 'sinon'; -import fc from 'fast-check'; - -import '../../../mock-wizard.js'; -import { MockWizard } from '../../../mock-wizard.js'; - -import { - ComplexAction, - identity, - isSimple, - Replace, - WizardInputElement, -} from '../../../../src/foundation.js'; -import { lNodeTypeWizard } from '../../../../src/editors/templates/lnodetype-wizard.js'; -import { regExp, regexString } from '../../../foundation.js'; - -describe('wizards for LNodeType element', () => { - let doc: XMLDocument; - let element: MockWizard; - let inputs: WizardInputElement[]; - let input: WizardInputElement | undefined; - - let primaryAction: HTMLElement; - - let actionEvent: SinonSpy; - - beforeEach(async () => { - element = await fixture(html``); - - actionEvent = spy(); - window.addEventListener('editor-action', actionEvent); - }); - describe('include an edit wizard that', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2003.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - const wizard = lNodeTypeWizard( - identity(doc.querySelector('LNodeType')), - doc - )!; - element.workflow.push(() => wizard); - await element.requestUpdate(); - - inputs = Array.from(element.wizardUI.inputs); - - primaryAction = ( - element.wizardUI.dialog?.querySelector( - 'mwc-button[slot="primaryAction"]' - ) - ); - }); - - describe('allows to edit lnClass attribute', () => { - beforeEach(() => { - input = inputs.find(input => input.label === 'lnClass'); - }); - - it('as wizard input', () => expect(input).to.exist); - - it('for valid input', async () => - await fc.assert( - fc.asyncProperty( - regexString(regExp.lnClass, 4, 4), - async testValue => { - input!.value = testValue; - await element.requestUpdate(); - expect(input!.checkValidity()).to.be.true; - } - ) - )); - - it('takes the exception LLN0 into account', async () => { - input!.value = 'LLN0'; - await element.requestUpdate(); - expect(input!.checkValidity()).to.be.true; - }); - }); - - describe('allows to edit id attribute', () => { - beforeEach(() => { - input = inputs.find(input => input.label === 'id'); - }); - - it('as wizard input', () => expect(input).to.exist); - - it('triggers a complex action', () => { - input!.value = 'someTestId'; - primaryAction.click(); - expect(actionEvent).to.be.calledOnce; - - const action = actionEvent.args[0][0].detail.action; - expect(action).to.not.satisfy(isSimple); - }); - - it('that edits the id attribute of LNodeType', () => { - input!.value = 'someTestId'; - primaryAction.click(); - - const complexAction = ( - actionEvent.args[0][0].detail.action - ); - const actions = complexAction.actions; - expect(actions[0].new.element).to.have.attribute('id', 'someTestId'); - }); - - it('that edits all referenced lnType attribute as well', () => { - const oldId = input?.value; - const numReferences = doc.querySelectorAll( - `LN0[lnType="${oldId}"], LN[lnType="${oldId}"]` - ).length; - - input!.value = 'someTestId'; - primaryAction.click(); - - const complexAction = ( - actionEvent.args[0][0].detail.action - ); - const actions = complexAction.actions; - expect(actions).to.have.lengthOf(numReferences + 1); - actions.shift(); //the first updates the LNodeType itself and has no 'id' - for (const action of actions) - expect(action.new.element).to.have.attribute('lnType', 'someTestId'); - }); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/filtered-list.test.ts b/packages/compas-open-scd/test/unit/filtered-list.test.ts deleted file mode 100644 index 3abf632f0..000000000 --- a/packages/compas-open-scd/test/unit/filtered-list.test.ts +++ /dev/null @@ -1,271 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '@material/mwc-list/mwc-check-list-item'; -import '@material/mwc-list/mwc-list-item'; -import '@material/mwc-list/mwc-radio-list-item'; - -import '../../src/filtered-list.js'; -import { FilteredList } from '../../src/filtered-list.js'; - -describe('filtered-list', () => { - let element: FilteredList; - const listItems = [ - { prim: 'item1', sec: 'item1sec', disabled: false }, - { prim: 'item2', sec: 'item2sec', disabled: false }, - { prim: 'item3', sec: 'item3sec', disabled: false }, - { prim: 'item4', sec: 'item4sec', disabled: true }, - ]; - - beforeEach(async () => { - element = await fixture( - html`${Array.from(listItems).map( - item => - html`${item.prim}${item.sec}` - )}nestedItem5
    - nestedItem6 -
    -
    ` - ); - }); - - it('looks like its latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - - it('allows items to be activated when selected', async () => { - element.setAttribute('activatable', ''); - element.children[0].setAttribute('selected', ''); - element.requestUpdate(); - await element.updateComplete; - expect(element.children[0].hasAttribute('activated')).to.be.true; - }); - - describe('has a check all checkbox that', () => { - it('is indeterminate if one but not all check-list-items are selected', async () => { - expect( - element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox') - ).to.not.have.attribute('indeterminate'); - - element.items[0].click(); - await element.updateComplete; - - expect( - element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox') - ).to.have.attribute('indeterminate'); - }); - - it('is selected if all check-list-items are selected', async () => { - expect( - element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox') - ).to.not.have.attribute('checked'); - element.items - .filter(item => !item.disabled) - .forEach(item => { - item.click(); - }); - await element.updateComplete; - - expect( - element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox') - ).to.have.attribute('checked'); - }); - - it('is none of the above if no check-list-item is selected', () => { - expect( - element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox') - ).to.not.have.attribute('checked'); - expect( - element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox') - ).to.not.have.attribute('indeterminate'); - }); - - it('can be disabled with disableCheckAll property', async () => { - expect(element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox')).to - .not.be.null; - element.disableCheckAll = true; - await element.requestUpdate(); - expect(element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox')).to - .be.null; - }); - - it('selects all enabled and visible check-list-items on checkAll click', async () => { - (( - element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox') - )).click(); - await element.updateComplete; - element.items - .filter(item => !item.disabled && !item.classList.contains('hidden')) - .forEach(item => { - expect(item).to.have.attribute('selected'); - }); - }); - - it('does not select disabled check-list-items on checkAll click', async () => { - (( - element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox') - )).click(); - await element.updateComplete; - expect(element.items[3]).to.not.have.attribute('selected'); - }); - - it('unselects all check-list-items on checkAll click', async () => { - (( - element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox') - )).click(); - (( - element.shadowRoot!.querySelector('mwc-formfield>mwc-checkbox') - )).click(); - await element.updateComplete; - element.items - .filter(item => !item.disabled) - .forEach(item => { - expect(item).to.not.have.attribute('selected'); - }); - }); - }); - - describe('allows to filter on', () => { - it('directly slotted mwc-check-list-item', async () => { - element.searchField.value = 'item1'; - element.onFilterInput(); - element.requestUpdate(); - await element.updateComplete; - expect(element.children[0].classList.contains('hidden')).to.be.false; - expect(element.children[1].classList.contains('hidden')).to.be.true; - expect(element.children[2].classList.contains('hidden')).to.be.true; - expect(element.children[3].classList.contains('hidden')).to.be.true; - expect(element.children[4].classList.contains('hidden')).to.be.true; - expect(element.children[5].classList.contains('hidden')).to.be.true; - }); - - it('directly slotted twoline mwc-check-list-item', async () => { - element.searchField.value = 'item2sec'; - element.onFilterInput(); - element.requestUpdate(); - await element.updateComplete; - expect(element.children[0].classList.contains('hidden')).to.be.true; - expect(element.children[1].classList.contains('hidden')).to.be.false; - expect(element.children[2].classList.contains('hidden')).to.be.true; - expect(element.children[3].classList.contains('hidden')).to.be.true; - expect(element.children[4].classList.contains('hidden')).to.be.true; - expect(element.children[5].classList.contains('hidden')).to.be.true; - expect(element.children[6].classList.contains('hidden')).to.be.true; - }); - - it('uses space as logic AND ', async () => { - element.searchField.value = 'item item3sec'; - element.onFilterInput(); - element.requestUpdate(); - await element.updateComplete; - expect(element.children[0].classList.contains('hidden')).to.be.true; - expect(element.children[1].classList.contains('hidden')).to.be.true; - expect(element.children[2].classList.contains('hidden')).to.be.false; - expect(element.children[3].classList.contains('hidden')).to.be.true; - expect(element.children[4].classList.contains('hidden')).to.be.true; - expect(element.children[5].classList.contains('hidden')).to.be.true; - expect(element.children[6].classList.contains('hidden')).to.be.true; - }); - - it('nested mwc-list-item elements', async () => { - element.searchField.value = 'nesteditem5'; - element.onFilterInput(); - element.requestUpdate(); - await element.updateComplete; - expect(element.children[0].classList.contains('hidden')).to.be.true; - expect(element.children[1].classList.contains('hidden')).to.be.true; - expect(element.children[2].classList.contains('hidden')).to.be.true; - expect(element.children[3].classList.contains('hidden')).to.be.true; - expect(element.children[4].classList.contains('hidden')).to.be.false; - expect(element.children[5].classList.contains('hidden')).to.be.true; - expect(element.children[6].classList.contains('hidden')).to.be.true; - }); - - it('nested mwc-radio-list-item elements', async () => { - element.searchField.value = 'nesteditem6'; - element.onFilterInput(); - element.requestUpdate(); - await element.updateComplete; - expect(element.children[0].classList.contains('hidden')).to.be.true; - expect(element.children[1].classList.contains('hidden')).to.be.true; - expect(element.children[2].classList.contains('hidden')).to.be.true; - expect(element.children[3].classList.contains('hidden')).to.be.true; - expect(element.children[4].classList.contains('hidden')).to.be.true; - expect(element.children[5].classList.contains('hidden')).to.be.false; - expect(element.children[6].classList.contains('hidden')).to.be.true; - }); - - it('items value attribute', async () => { - element.searchField.value = 'item7'; - element.onFilterInput(); - element.requestUpdate(); - await element.updateComplete; - expect(element.children[0].classList.contains('hidden')).to.be.true; - expect(element.children[1].classList.contains('hidden')).to.be.true; - expect(element.children[2].classList.contains('hidden')).to.be.true; - expect(element.children[3].classList.contains('hidden')).to.be.true; - expect(element.children[4].classList.contains('hidden')).to.be.true; - expect(element.children[5].classList.contains('hidden')).to.be.true; - expect(element.children[6].classList.contains('hidden')).to.be.false; - }); - - it('allows filtering with a ? wildcard', async () => { - element.searchField.value = 'item?'; - element.onFilterInput(); - element.requestUpdate(); - await element.updateComplete; - expect(element.children[0].classList.contains('hidden')).to.be.false; - expect(element.children[1].classList.contains('hidden')).to.be.false; - expect(element.children[2].classList.contains('hidden')).to.be.false; - expect(element.children[3].classList.contains('hidden')).to.be.false; - expect(element.children[4].classList.contains('hidden')).to.be.false; - expect(element.children[5].classList.contains('hidden')).to.be.false; - }); - - it('allows filtering with a * wildcard', async () => { - element.searchField.value = 'te*sec'; - element.onFilterInput(); - element.requestUpdate(); - await element.updateComplete; - expect(element.children[0].classList.contains('hidden')).to.be.false; - expect(element.children[1].classList.contains('hidden')).to.be.false; - expect(element.children[2].classList.contains('hidden')).to.be.false; - expect(element.children[3].classList.contains('hidden')).to.be.false; - expect(element.children[4].classList.contains('hidden')).to.be.true; - expect(element.children[5].classList.contains('hidden')).to.be.true; - }); - - it('allows filtering with two ? wildcards', async () => { - element.searchField.value = 'nest??item'; - element.onFilterInput(); - element.requestUpdate(); - await element.updateComplete; - expect(element.children[0].classList.contains('hidden')).to.be.true; - expect(element.children[1].classList.contains('hidden')).to.be.true; - expect(element.children[2].classList.contains('hidden')).to.be.true; - expect(element.children[3].classList.contains('hidden')).to.be.true; - expect(element.children[4].classList.contains('hidden')).to.be.false; - expect(element.children[5].classList.contains('hidden')).to.be.false; - }); - - it('allows filtering with a * and ? wildcard', async () => { - element.searchField.value = 'n*tem?'; - element.onFilterInput(); - element.requestUpdate(); - await element.updateComplete; - expect(element.children[0].classList.contains('hidden')).to.be.true; - expect(element.children[1].classList.contains('hidden')).to.be.true; - expect(element.children[2].classList.contains('hidden')).to.be.true; - expect(element.children[3].classList.contains('hidden')).to.be.true; - expect(element.children[4].classList.contains('hidden')).to.be.false; - expect(element.children[5].classList.contains('hidden')).to.be.false; - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/finder-list.test.ts b/packages/compas-open-scd/test/unit/finder-list.test.ts deleted file mode 100644 index d7a62c0b3..000000000 --- a/packages/compas-open-scd/test/unit/finder-list.test.ts +++ /dev/null @@ -1,313 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import { ListItem } from '@material/mwc-list/mwc-list-item'; - -import '../../src/finder-list.js'; -import { Directory, FinderList, Path } from '../../src/finder-list.js'; -import { depth } from '../../src/foundation.js'; - -const pathA = ['e2', 'e1', 'e4']; -const pathB = ['e1', 'e4']; -const pathC = ['e3']; -const selectionA = { e2: { e1: { e4: {} } } }; - -const paths = [pathA, pathB, pathC]; -const selection = { - e2: { e1: { e4: {} } }, - e1: { e4: {} }, - e3: {}, -}; - -const entries: Record = { - e1: ['e2', 'e3', 'e4'], - e2: ['e3', 'e1'], - e3: [], - e4: ['e2', 'e1'], - e5: [], -}; - -function getTitle(path: Path): string { - return `Testing ${path[path.length - 1]}`; -} - -function getDisplayString(entry: string, path: string[]) { - return 'Testing ' + path.length + ' ' + entry; -} - -async function read(path: Path): Promise { - const dir = path[path.length - 1]; - return { - path, - header: dir === 'e5' ? undefined : html`

    ${dir}

    `, - entries: entries[dir] ?? [], - }; -} - -describe('finder-list', () => { - let element: FinderList; - - beforeEach(async () => { - element = await fixture(html``); - }); - - it('displays nothing with default properties', () => - expect(element).property('container').to.be.empty); - - it('translates given .paths into a .selection tree', () => { - element.paths = paths; - expect(element.selection).to.deep.equal(selection); - }); - - it('translates a given .selection tree into .paths', () => { - element.selection = selection; - expect(element.paths).to.deep.equal(paths); - }); - - it('lets you set a singleton .path directly', () => { - element.path = pathA; - expect(element.selection).to.deep.equal(selectionA); - expect(element.paths).to.deep.equal([pathA]); - }); - - it('lets you access a singleton .path directly', () => { - element.selection = selectionA; - expect(element.path).to.deep.equal(pathA); - expect(element.paths).to.deep.equal([pathA]); - }); - - it('shows an empty .path given empty .paths', () => { - element.paths = []; - expect(element.path).to.deep.equal([]); - }); - - describe('given a one-element .path with no header or entries', () => { - beforeEach(async () => { - element = await fixture( - html`` - ); - await element.loaded; - }); - - it('displays no columns', async () => - expect(element).property('container').property('children').to.be.empty); - }); - - describe('given a .path and a .read method', () => { - let items: ListItem[]; - - beforeEach(async () => { - element = await fixture( - html`` - ); - await element.loaded; - items = Array.from( - element.shadowRoot?.querySelectorAll('mwc-list-item') ?? [] - ); - }); - - it('displays one column per path element', () => - expect(element) - .property('container') - .property('children') - .to.have.lengthOf(pathA.length)); - - describe('when provided with .getTitle and .getDisplayString methods', () => { - beforeEach(async () => { - element.getDisplayString = getDisplayString; - element.getTitle = getTitle; - element.requestUpdate(); - await element.updateComplete; - await element.loaded; - }); - - it('overrides filtered-list searchFieldLabels using .getTitle', () => { - expect(element.container.querySelector('filtered-list')) - .property('searchFieldLabel') - .to.satisfy((l: string) => l.startsWith('Testing ')); - }); - - it('overrides list-item text content using .getDisplayString', () => { - expect(element.container.querySelector('mwc-list-item')) - .property('text') - .to.satisfy((t: string) => t.startsWith('Testing ')); - }); - - it('looks like its latest snapshot', async () => - await expect(element).shadowDom.to.equalSnapshot()); - }); - - describe('when an item in the last column is selected', () => { - const parent = pathA[pathA.length - 1]; - const parentEntries = entries[parent]; - const directory = parentEntries[parentEntries.length - 1]; - - beforeEach(async () => { - items[items.length - 1].click(); - await element.updateComplete; - await element.loaded; - }); - - it('appends a new column to the container', () => - expect(element) - .property('container') - .property('children') - .to.have.lengthOf(pathA.length + 1)); - - it("renders the selected directory's header at the top of the new column", () => - expect(element) - .property('container') - .property('lastElementChild') - .property('firstElementChild') - .to.have.text(directory) - .and.to.have.property('tagName', 'H2')); - - it("renders the selected directory's children into a list below the header", () => - expect(element) - .property('container') - .property('lastElementChild') - .property('lastElementChild') - .property('children') - .to.have.lengthOf(entries[directory].length)); - - it('looks like its latest snapshot', async () => - await expect(element).shadowDom.to.equalSnapshot()); - }); - - describe('when an item in the first column is selected', () => { - const parent = pathA[0]; - const parentEntries = entries[parent]; - const directory = parentEntries[0]; - - beforeEach(async () => { - items[0].click(); - await element.updateComplete; - await element.loaded; - }); - - it('replaces all but the first column with a new column', () => - expect(element) - .property('container') - .property('children') - .to.have.lengthOf(2)); - - it("renders the selected directory's header at the top of the new column", () => - expect(element) - .property('container') - .property('lastElementChild') - .property('firstElementChild') - .to.have.text(directory) - .and.to.have.property('tagName', 'H2')); - - it("renders the selected directory's children into a list below the header", () => - expect(element) - .property('container') - .property('lastElementChild') - .property('lastElementChild') - .property('children') - .to.have.lengthOf(entries[directory].length)); - - it('looks like its latest snapshot', async () => - await expect(element).shadowDom.to.equalSnapshot()); - }); - - describe('when the selected item in the first column is deselected', () => { - beforeEach(async () => { - items[1].click(); - await element.updateComplete; - await element.loaded; - }); - - it('renders only the first column', () => - expect(element) - .property('container') - .property('children') - .to.have.lengthOf(1)); - - it('looks like its latest snapshot', async () => - await expect(element).shadowDom.to.equalSnapshot()); - }); - }); - - describe('given the "multi" attribute, some .paths, and a .read method', () => { - let items: ListItem[]; - - beforeEach(async () => { - element = await fixture( - html`` - ); - await element.loaded; - items = Array.from( - element.shadowRoot?.querySelectorAll('mwc-list-item') ?? [] - ); - }); - - it('displays one column per element of the longest path', () => - expect(element) - .property('container') - .property('children') - .to.have.lengthOf(Math.max(...paths.map(p => p.length)))); - - it('displays one header and one list of entries per maximum length path in the last column', () => - expect(element) - .property('container') - .property('lastElementChild') - .property('children') - .to.have.lengthOf( - 2 * - paths.filter(path => path.length === depth(element.selection)) - .length - )); - - it('looks like its latest snapshot', async () => - await expect(element).shadowDom.to.equalSnapshot()); - - describe('when an item in the first column is selected', () => { - const parent = paths[0][0]; - const parentEntries = entries[parent]; - const directory = parentEntries[0]; - - beforeEach(async () => { - items[0].click(); - await element.updateComplete; - await element.loaded; - }); - - it("adds the selected directory's header to the second column", () => - expect(element) - .property('container') - .descendant('.column:nth-child(2)') - .descendant('h2:nth-child(3)') - .to.have.text(directory)); - - it("adds the selected directory's entries to the second column", () => - expect(element) - .property('container') - .descendant('.column:nth-child(2)') - .descendant('filtered-list:nth-child(4)') - .property('children') - .to.have.lengthOf(entries[directory].length)); - - it('looks like its latest snapshot', async () => - await expect(element).shadowDom.to.equalSnapshot()); - }); - - describe('when a selected item in the first column is deselected', () => { - beforeEach(async () => { - items[1].click(); - await element.updateComplete; - await element.loaded; - }); - - it('removes the deselected directory from the second column', () => - expect(element) - .property('container') - .descendant('.column:nth-child(2)') - .to.not.contain.html( - `

    ${entries[paths[0][0]][1]}

    ` - )); - - it('looks like its latest snapshot', async () => - await expect(element).shadowDom.to.equalSnapshot()); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/foundation.test.ts b/packages/compas-open-scd/test/unit/foundation.test.ts deleted file mode 100644 index 5178f00bc..000000000 --- a/packages/compas-open-scd/test/unit/foundation.test.ts +++ /dev/null @@ -1,742 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import { - cloneElement, - ComplexAction, - depth, - EditorAction, - find, - findControlBlocks, - findFCDAs, - getChildElementsByTagName, - getNameAttribute, - getReference, - getSclSchemaVersion, - getUniqueElementName, - identity, - ifImplemented, - invert, - isCreate, - isDelete, - isMove, - isReplace, - isSame, - isSimple, - newActionEvent, - newLnInstGenerator, - newPendingStateEvent, - newWizardEvent, - SCLTag, - tags, - minAvailableLogicalNodeInstance, -} from '../../src/foundation.js'; - -import { MockAction } from './mock-actions.js'; - -describe('foundation', () => { - let scl1: Element; - let scl2: Element; - - let substation: Element; - let ied: Element; - let communication: Element; - let bay: Element; - let privateSection: Element; - let privateElement: Element; - let publicElement: Element; - - beforeEach(async () => { - scl1 = ( - await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')) - ).documentElement; - scl2 = ( - await fetch('/test/testfiles/valid2003.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')) - ).documentElement; - - substation = scl1.querySelector('Substation')!; - ied = scl1.querySelector('IED')!; - communication = scl1.querySelector('Communication')!; - bay = scl1.querySelector('Bay')!; - privateSection = bay.querySelector('Private')!; - privateElement = privateSection.firstElementChild!; - publicElement = bay.children.item(1)!; - }); - describe('EditorAction', () => { - it('consists of four disjunct simple types', () => { - expect(MockAction.cre).to.satisfy(isCreate); - expect(MockAction.del).to.satisfy(isDelete); - expect(MockAction.mov).to.satisfy(isMove); - expect(MockAction.upd).to.satisfy(isReplace); - isReplace; - expect(MockAction.cre).to.satisfy(isSimple); - expect(MockAction.del).to.satisfy(isSimple); - expect(MockAction.mov).to.satisfy(isSimple); - expect(MockAction.upd).to.satisfy(isSimple); - - expect(MockAction.cre).to.not.satisfy(isDelete); - expect(MockAction.cre).to.not.satisfy(isMove); - expect(MockAction.cre).to.not.satisfy(isReplace); - isReplace; - expect(MockAction.del).to.not.satisfy(isCreate); - expect(MockAction.del).to.not.satisfy(isMove); - expect(MockAction.del).to.not.satisfy(isReplace); - isReplace; - expect(MockAction.mov).to.not.satisfy(isCreate); - expect(MockAction.mov).to.not.satisfy(isDelete); - expect(MockAction.mov).to.not.satisfy(isReplace); - isReplace; - expect(MockAction.upd).to.not.satisfy(isCreate); - expect(MockAction.upd).to.not.satisfy(isDelete); - expect(MockAction.upd).to.not.satisfy(isMove); - }); - - it('consists of one complex type', () => { - expect(MockAction.complex).to.not.satisfy(isSimple); - - expect(MockAction.complex).to.not.satisfy(isCreate); - expect(MockAction.complex).to.not.satisfy(isDelete); - expect(MockAction.complex).to.not.satisfy(isMove); - expect(MockAction.complex).to.not.satisfy(isReplace); - }); - isReplace; - - describe('invert', () => { - it('turns Create into Delete and vice versa', () => { - expect(invert(MockAction.cre)).to.satisfy(isDelete); - expect(invert(MockAction.del)).to.satisfy(isCreate); - }); - - it('turns Move into Move', () => { - expect(invert(MockAction.mov)).to.satisfy(isMove); - }); - - it('turns Update into Update', () => { - expect(invert(MockAction.upd)).to.satisfy(isReplace); - }); - isReplace; - - it('inverts components of complex actions in reverse order', () => { - const action = MockAction.complex; - const inverse = invert(action); - - action.actions.forEach((element, index) => - expect( - inverse.actions[inverse.actions.length - index - 1] - ).to.deep.equal(invert(action.actions[index])) - ); - }); - - it('throws on unknown Action type', () => { - const invalid = ('Not an action!'); - expect(() => invert(invalid)).to.throw(); - }); - }); - - describe('ActionEvent', () => { - it('bears an EditorAction in its detail', () => { - expect(newActionEvent(MockAction.mov)) - .property('detail') - .property('action') - .to.satisfy(isMove); - }); - }); - }); - - describe('PendingStateEvent', () => { - it('bears a void Promise in its detail', () => { - expect(newPendingStateEvent(Promise.resolve())) - .property('detail') - .property('promise') - .to.be.a('promise'); - }); - }); - - describe('WizardEvent', () => { - it('optionally bears a wizard factory in its detail', () => { - expect(newWizardEvent()).property('detail').property('wizard').to.be.null; - expect(newWizardEvent([])) - .property('detail') - .property('wizard') - .to.be.a('function'); - }); - - it('allows to dispatch dynamic wizards', () => { - expect(newWizardEvent(() => [])) - .property('detail') - .property('wizard') - .to.be.a('function'); - }); - }); - - describe('ifImplemented', () => { - let nonEmpty: HTMLElement; - let empty: HTMLElement; - - beforeEach(async () => { - nonEmpty = await fixture(html`

    ${ifImplemented('test')}

    `); - empty = await fixture(html`

    ${ifImplemented({})}

    `); - }); - - it('renders non-empty objects into its template', () => - expect(nonEmpty).dom.to.have.text('test')); - - it('does not render empty objects into its template', () => - expect(empty).dom.to.be.empty); - }); - - describe('isSame', () => { - it('is true of any two SCL Elements', () => { - expect(isSame(scl1, scl2)).to.be.true; - }); - - it('is true of any two Header Elements', () => { - expect( - isSame(scl1.querySelector('Header')!, scl2.querySelector('Header')!) - ).to.be.true; - }); - - it('is true of any two Communication Elements', () => { - expect( - isSame( - scl1.querySelector('Communication')!, - scl2.querySelector('Communication')! - ) - ).to.be.true; - }); - - it('is true of any two DataTypeTemplates Elements', () => { - expect( - isSame( - scl1.querySelector('DataTypeTemplates')!, - scl2.querySelector('DataTypeTemplates')! - ) - ).to.be.true; - }); - - it('is true of identical private sections', () => { - expect(isSame(privateSection, privateSection)).to.be.true; - }); - - it('is false of any private elements', () => { - expect(isSame(privateElement, privateElement)).to.be.false; - expect(isSame(privateElement, publicElement)).to.be.false; - }); - - it('is true of any one Element and itself', () => { - expect(isSame(substation, substation)).to.be.true; - expect(isSame(ied, ied)).to.be.true; - expect(isSame(bay, bay)).to.be.true; - expect(isSame(communication, communication)).to.be.true; - }); - - it('is false of elements with different tagNames', () => { - expect(isSame(substation, ied)).to.be.false; - expect(isSame(substation, bay)).to.be.false; - expect(isSame(bay, communication)).to.be.false; - expect(isSame(communication, ied)).to.be.false; - }); - - it('is true of elements with equal nonempty id attributes', () => { - expect( - isSame( - scl1.querySelector('LNodeType[id="Dummy.LLN0"]')!, - scl2.querySelector('LNodeType[id="Dummy.LLN0"]')! - ) - ).to.be.true; - }); - - it('is false of elements with unequal id attributes', () => { - expect( - isSame( - scl1.querySelector('LNodeType[id="Dummy.LLN0"]')!, - scl1.querySelector('LNodeType[id="Dummy.LLN0.two"]')! - ) - ).to.be.false; - }); - }); - describe('identity', () => { - it('returns NaN for any private element', () => { - expect(identity(privateElement)).to.be.NaN; - }); - it('returns parent identity for singleton identities', () => { - Object.entries(tags).forEach(([tag, data]) => { - if (data.identity !== tags['Server'].identity) return; - - const element = scl1.querySelector(tag); - if (element) { - expect(identity(element)).to.equal(identity(element.parentElement!)); - } - }); - }); - it('returns valid identity for special identities', () => { - const expectations: Partial> = { - Hitem: '1\t143', - Terminal: 'AA1>E1>COUPLING_BAY>QC11>AA1/E1/COUPLING_BAY/L2', - 'Bay>LNode': 'IED2 CBSW/ LPHD 1', - KDC: 'IED1>IED1 P1', - LDevice: 'IED1>>CircuitBreaker_CB1', - IEDName: - 'IED1>>CircuitBreaker_CB1>GCB>IED2 P1 CircuitBreaker_CB1/ CSWI 1', - FCDA: 'IED1>>CircuitBreaker_CB1>GooseDataSet1>CircuitBreaker_CB1/ XCBR 1.Pos stVal (ST)', - ExtRef: 'IED1>>Disconnectors>DC CSWI 1>intAddr[0]', - 'ExtRef:not([iedName])': 'IED1>>Disconnectors>DC CSWI 1>stVal-t[0]', - LN: 'IED1>>CircuitBreaker_CB1> XCBR 1', - ClientLN: - 'IED2>>CBSW> XSWI 1>ReportCb>IED1 P1 CircuitBreaker_CB1/ XCBR 1', - DAI: 'IED1>>CircuitBreaker_CB1> XCBR 1>Pos>ctlModel', - SDI: 'IED1>>CircuitBreaker_CB1>CB CSWI 2>Pos>pulseConfig', - Val: 'IED1>>CircuitBreaker_CB1> XCBR 1>Pos>ctlModel> 0', - ConnectedAP: 'IED1 P1', - GSE: 'CircuitBreaker_CB1 GCB', - SMV: 'MU01 MSVCB01', - PhysConn: 'IED1 P1>RedConn', - P: 'IED1 P1>IP [0]', - EnumVal: '#Dummy_ctlModel>0', - ProtNs: '#Dummy.LLN0.Mod.SBOw>8-MMS\tIEC 61850-8-1:2003', - }; - - Object.keys(expectations).forEach(key => { - const element = scl1.querySelector(key); - expect(identity(element!)).to.equal(expectations[key]); - }); - }); - it('returns valid identity for naming identities', () => { - Object.entries(tags).forEach(([tag, data]) => { - if (data.identity !== tags['Substation'].identity) return; - - const element = scl1.querySelector(tag); - if (element) { - expect(identity(element)).to.equal( - identity(element.parentElement!) + - (element.parentElement?.tagName === 'SCL' ? '' : '>') + - element.getAttribute('name') - ); - } - }); - }); - }); - - describe('find', () => { - it('returns null for the identity NaN', () => { - const element = scl1.querySelector('Assotiation'); - const ident = identity(element!); - expect(find(scl1, 'Assotiation', ident)).to.equal(null); - }); - it('returns correct element for all tags except IEDName and ProtNs', () => { - Object.keys(tags).forEach(tag => { - const element = Array.from(scl1.querySelectorAll(tag)).filter( - item => !item.closest('Private') - )[0]; - if (element && tag !== 'IEDName' && tag !== 'ProtNs') - expect(element) - .to.satisfy((element: Element) => - element.isEqualNode(find(scl1, tag, identity(element))) - ) - .and.to.equal(find(scl1, tag, identity(element))); - }); - }); - }); - - describe('getReference', () => { - it('returns correct reference for already existing elements', () => { - Object.keys(tags) - .filter(tag => tags[tag].children.length > 0) - .forEach(tag => { - const element = Array.from(scl1.querySelectorAll(tag)).filter( - item => !item.closest('Private') - )[0]; - - if ( - !element || - element.tagName === 'Services' || - element.tagName === 'SettingGroups' - ) - return; - - const children = Array.from(element.children); - const childTags = new Set(children.map(child => child.tagName)); - - for (const childTag of childTags) { - expect(getReference(element, childTag)).to.equal( - children.find(child => child.tagName === childTag) - ); - } - }); - }); - - it('returns correct reference for LNode element', () => { - const scl = new DOMParser().parseFromString( - ` - testprivate - - `, - 'application/xml' - ).documentElement; - expect(getReference(scl, 'LNode')).to.equal( - scl.querySelector('ConductingEquipment') - ); - const scl2 = new DOMParser().parseFromString( - ` - testprivate - - - `, - 'application/xml' - ).documentElement; - expect(getReference(scl2, 'LNode')).to.equal( - scl2.querySelector('PowerTransformer') - ); - }); - it('returns correct reference for Substation element', () => { - const scl = new DOMParser().parseFromString( - ` -
    - - -
    `, - 'application/xml' - ).documentElement; - expect(getReference(scl, 'Substation')).to.equal( - scl.querySelector('IED') - ); - }); - it('returns correct reference for VoltageLevel element', () => { - const scl = new DOMParser().parseFromString( - ` - - - `, - 'application/xml' - ).documentElement; - expect(getReference(scl, 'VoltageLevel')).to.be.null; - }); - it('returns correct reference for Bay element', () => { - const scl = new DOMParser().parseFromString( - ` - - - `, - 'application/xml' - ).documentElement; - expect(getReference(scl, 'Bay')).to.equal(scl.querySelector('Function')); - }); - it('returns correct reference for ConductingEquipment element', () => { - const scl = new DOMParser().parseFromString( - ` - - - `, - 'application/xml' - ).documentElement; - expect(getReference(scl, 'ConductingEquipment')).to.equal( - scl.querySelector('ConnectivityNode') - ); - }); - }); - - describe('findControlBlocks', () => { - let doc: Document; - beforeEach(async () => { - doc = await fetch('/test/testfiles/comm-map.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - it('returns an Set of controlBlocks connected to the ExtRef', () => { - const extRef = doc.querySelector( - ':root > IED[name="IED2"] > AccessPoint > Server > LDevice[inst="CircuitBreaker_CB1"] ExtRef' - )!; - expect(findControlBlocks(extRef).size).to.have.equal(1); - expect( - Array.from(findControlBlocks(extRef))[0].isEqualNode( - doc.querySelector( - 'IED[name="IED1"] LDevice[inst="CircuitBreaker_CB1"] GSEControl[name="GCB"]' - ) - ) - ).to.be.true; - }); - - it('returns empty Set if input not ExtRef', () => { - expect(findControlBlocks(doc.querySelector('LN')!).size).to.equal(0); - }); - - it('returns empty array if input is not public', () => { - expect( - findControlBlocks(doc.querySelector('Private > ExtRef')!).size - ).to.equal(0); - }); - }); - - describe('getUniqueElementName', () => { - let parent: Element; - beforeEach(() => { - const testDoc = new DOMParser().parseFromString( - '' + - '' + - '' + - '', - 'application/xml' - ); - parent = testDoc.querySelector('Parent')!; - }); - - it('returns unique name for Child', () => - expect(getUniqueElementName(parent, 'Child')).to.equal('newChild3')); - - it('returns unique name for Child2', () => - expect(getUniqueElementName(parent, 'Child2')).to.equal('newChild22')); - }); - - describe('getNameAttribute', () => { - it('expect the correct value of the name attribute', () => { - const doElement = scl1.querySelector( - 'LNodeType[id="Dummy.LLN0"] > DO[type="Dummy.LLN0.Mod"]' - )!; - expect(getNameAttribute(doElement)).to.be.equal('Mod'); - }); - }); - - describe('findFCDAs', () => { - let doc: Document; - beforeEach(async () => { - doc = await fetch('/test/testfiles/comm-map.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - it('returns an array of FCDAs connected to the ExtRef', () => { - const extRef = doc.querySelector( - ':root > IED[name="IED2"] > AccessPoint > Server > LDevice[inst="CircuitBreaker_CB1"] ExtRef' - )!; - expect(findFCDAs(extRef).length).to.have.equal(1); - expect( - findFCDAs(extRef)[0].isEqualNode( - doc.querySelector( - 'IED[name="IED1"] LDevice[inst="CircuitBreaker_CB1"] ' + - 'FCDA[ldInst="CircuitBreaker_CB1"][lnClass="XCBR"][doName="Pos"][daName="stVal"]' - ) - ) - ).to.be.true; - }); - - it('returns empty array if input not ExtRef', () => { - expect(findFCDAs(doc.querySelector('LN')!).length).to.equal(0); - }); - - it('returns empty array if input is not public', () => { - expect(findFCDAs(doc.querySelector('Private > ExtRef')!).length).to.equal( - 0 - ); - }); - }); - - describe('getChildElementsByTagName', () => { - let doc: Document; - beforeEach(async () => { - doc = await fetch('/test/testfiles/lnodewizard.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - it('returns a child Element array with a specific tag', () => { - const parent = doc.querySelector('Bay[name="COUPLING_BAY"]'); - expect(getChildElementsByTagName(parent!, 'LNode').length).to.have.equal( - parent?.querySelectorAll( - ':root > Substation > VoltageLevel > Bay[name="COUPLING_BAY"] > LNode' - ).length - ); - }); - }); - - describe('cloneElement', () => { - let element: Element; - beforeEach(() => { - element = new DOMParser().parseFromString( - ``, - 'application/xml' - ).documentElement; - }); - it('does not copy child nodes', () => { - const newElement = cloneElement(element, {}); - expect(newElement.childNodes.length).to.equal(0); - }); - it('creates a newElement with specified attrs', () => { - const attr1 = 'newAttr1'; - const attr2 = 'newAttr2'; - const newElement = cloneElement(element, { attr1, attr2 }); - expect(newElement.attributes.length).to.equal(2); - expect(newElement).to.have.attribute('attr2', 'newAttr2'); - }); - it('leaves attr untouched if not part of attrs', () => { - const attr2 = 'newAttr2'; - const newElement = cloneElement(element, { attr2 }); - expect(newElement.attributes.length).to.equal(2); - expect(newElement).to.have.attribute('attr1', 'attrValue'); - }); - it('updates existing attr if part of attrs', () => { - const attr1 = 'newAttr1'; - const newElement = cloneElement(element, { attr1 }); - expect(newElement.attributes.length).to.equal(1); - expect(newElement).to.have.attribute('attr1', 'newAttr1'); - }); - it('removes existing attr if set to null', () => { - const attr1 = null; - const attr2 = 'newAttr2'; - const newElement = cloneElement(element, { attr1, attr2 }); - expect(newElement.attributes.length).to.equal(1); - expect(newElement).to.not.have.attribute('attr1'); - }); - }); - - describe('depth', () => { - const circular = { a: { b: {} }, c: {} }; - circular.a.b = circular; - - const fiveDeep: unknown = [ - 'first level', - 2, - { - a: 'second level', - b: 2, - c: [ - 'third level', - { a: 'fourth level', b: 2, c: { a: 'fifth level!' } }, - ], - }, - 'test', - ]; - - it("returns the given object's or array's depth", () => - expect(depth(>fiveDeep)).to.equal(5)); - - it('returns zero if given something other than an object or array', () => - expect(depth(>('test'))).to.equal(0)); - - it('returns Infinity if given a circularly defined object or array', () => - expect(depth(circular)).to.not.be.finite); - }); - - describe('getSclSchemaVersion', () => { - let doc: Document; - - it('when passing a SCL 2003 Document then correct edition is returned', async () => { - doc = await fetch('/test/testfiles/valid2003.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - expect(getSclSchemaVersion(doc)).to.be.equal('2003'); - }); - - it('when passing a SCL 2007B Document then correct edition is returned', async () => { - doc = await fetch('/test/testfiles/valid2007B.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - expect(getSclSchemaVersion(doc)).to.be.equal('2007B'); - }); - - it('when passing a SCL 2007B4 Document then correct edition is returned', async () => { - doc = await fetch('/test/testfiles/valid2007B4.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - expect(getSclSchemaVersion(doc)).to.be.equal('2007B4'); - }); - }); - - describe('generator function for new `lnInst` attribute', () => { - let lnInstGenerator: (lnClass: string) => string | undefined; - let parent: Element; - - describe('with existing unique lnInst', () => { - beforeEach(() => { - parent = new DOMParser().parseFromString( - ` - - - - - - - - - `, - 'application/xml' - ).documentElement; - - lnInstGenerator = newLnInstGenerator(parent); - }); - - it('returns unique lnInst called once', () => - expect(lnInstGenerator('CSWI')).to.equal('3')); - - it('returns unique lnInst called several times', () => { - expect(lnInstGenerator('CSWI')).to.equal('3'); - expect(lnInstGenerator('CSWI')).to.equal('4'); - expect(lnInstGenerator('CSWI')).to.equal('7'); - expect(lnInstGenerator('CSWI')).to.equal('9'); - }); - - it('returns unique lnInst called several times', () => { - expect(lnInstGenerator('CSWI')).to.equal('3'); - expect(lnInstGenerator('CSWI')).to.equal('4'); - expect(lnInstGenerator('CSWI')).to.equal('7'); - expect(lnInstGenerator('CSWI')).to.equal('9'); - }); - }); - - describe('with missing unique lnInst for lnClass PDIS', () => { - beforeEach(() => { - parent = new DOMParser().parseFromString( - ` - `, - 'application/xml' - ).documentElement; - - for (let i = 1; i <= 99; i++) { - const lNode = new DOMParser().parseFromString( - ``, - 'application/xml' - ).documentElement; - parent.appendChild(lNode); - } - - lnInstGenerator = newLnInstGenerator(parent); - }); - - it('return undefined for the lnClass PDIS', () => - expect(lnInstGenerator('PDIS')).to.be.undefined); - - it('return unique lnInst for another lnClass', () => - expect(lnInstGenerator('CSWI')).to.equal('1')); - }); - }); - - describe('minAvailableLogicalNodeInstance', () => { - it('generates the minimum number not present yet as an "inst" attribute in a set of elements', () => { - const docFragment: Document = new DOMParser().parseFromString( - ` - - - - - - SMV_PublisherCurrentTransformer/LLN0.currrentOnly - - - - - - - `, - 'application/xml' - ); - let lnElements = Array.from( - docFragment.querySelectorAll('LN[lnClass="LSVS"]') - ); - expect(minAvailableLogicalNodeInstance(lnElements)).to.be.equal('2'); - lnElements = Array.from( - docFragment.querySelectorAll('LN[lnClass="LLN0"]') - ); - expect(minAvailableLogicalNodeInstance(lnElements)).to.be.equal('1'); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/foundation/__snapshots__/compare.test.snap.js b/packages/compas-open-scd/test/unit/foundation/__snapshots__/compare.test.snap.js deleted file mode 100644 index a87eba8fc..000000000 --- a/packages/compas-open-scd/test/unit/foundation/__snapshots__/compare.test.snap.js +++ /dev/null @@ -1,405 +0,0 @@ -/* @web/test-runner snapshot v1 */ -export const snapshots = {}; - -snapshots["compas-compare-dialog renderDiff child is added, so check latest snapshot"] = -`
    -
    -
    - - - - -
    -
    - - - - Bay - - - Substation 1>S1 30kV>BUSBAR12 - - - - - -
    -
    -
    -`; -/* end snapshot compas-compare-dialog renderDiff child is added, so check latest snapshot */ - -snapshots["compas-compare-dialog renderDiff child is removed and attribute added/removed/updated, so check latest snapshot"] = -`
    -
    -
    - - - - - - Bay - - - Substation 1>S1 110kV>BAY_T3_1 - - - - - -
    -
    - - - - desc: - Extra Voltage Level - - - Substation 1>S1 110kV - - - - - - - -
    -
    -
    -
    - - - - desc: - Busbar 6 - - - Substation 1>S1 110kV>BUSBAR6 - - - - - -
    -
    - - - - -
    -
    -
    -
    - - - - desc: - First Bays - - - Substation 1>S1 110kV>BAY_L1_0 - - - - - -
    -
    - - - - desc: - First Bay - - - Substation 1>S1 110kV>BAY_L1_0 - - - - - -
    -
    -
    -`; -/* end snapshot compas-compare-dialog renderDiff child is removed and attribute added/removed/updated, so check latest snapshot */ - -snapshots["compas-compare-dialog renderDiff attribute is updated, but is ignored, so check latest snapshot"] = -`
    -
    -
    - - - - - - Bay - - - Substation 1>S1 110kV>BAY_T3_1 - - - - - -
    -
    - - - - desc: - Extra Voltage Level - - - Substation 1>S1 110kV - - - - - - - -
    -
    -
    -
    - - - - desc: - Busbar 6 - - - Substation 1>S1 110kV>BUSBAR6 - - - - - -
    -
    - - - - -
    -
    -
    -
    - - - - desc: - First Bays - - - Substation 1>S1 110kV>BAY_L1_0 - - - - - -
    -
    - - - - desc: - First Bay - - - Substation 1>S1 110kV>BAY_L1_0 - - - - - -
    -
    -
    -`; -/* end snapshot compas-compare-dialog renderDiff attribute is updated, but is ignored, so check latest snapshot */ - diff --git a/packages/compas-open-scd/test/unit/foundation/compare.test.ts b/packages/compas-open-scd/test/unit/foundation/compare.test.ts deleted file mode 100644 index 1f9319204..000000000 --- a/packages/compas-open-scd/test/unit/foundation/compare.test.ts +++ /dev/null @@ -1,318 +0,0 @@ -import { expect, fixtureSync } from '@open-wc/testing'; - -import { html } from 'lit-element'; - -import { - DiffFilter, - diffSclAttributes, - diffSclChilds, - identityForCompare, - isSame, - renderDiff, -} from '../../../src/foundation/compare.js'; - -describe('compas-compare-dialog', () => { - let oldSclElement: Element; - let newSclElement: Element; - - beforeEach(async () => { - oldSclElement = await fetch( - '/test/testfiles/foundation/compare-original.cid' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')) - .then(document => document.documentElement); - newSclElement = await fetch( - '/test/testfiles/foundation/compare-changed.cid' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')) - .then(document => document.documentElement); - }); - - describe('identityForCompare', () => { - it('will return the identity of the sub element, not the full identity', () => { - const voltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - - const result = identityForCompare(voltageLevel!); - expect(result).to.be.equal('S1 30kV'); - }); - - it('will return the identity of the main element, meaning the full identity', () => { - const substation = oldSclElement.querySelector( - 'Substation[name="Substation 1"]' - ); - - const result = identityForCompare(substation!); - expect(result).to.be.equal('Substation 1'); - }); - - it('will return the NaN of the root element', () => { - const substation = oldSclElement.querySelector('SCL'); - - const result = identityForCompare(substation!); - expect(result).to.be.NaN; - }); - }); - - describe('isSame', () => { - it('will return true when the same elements are passed', () => { - const voltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - - const same = isSame(voltageLevel!, voltageLevel!); - expect(same).to.be.true; - }); - - it('will return true when the same elements from different sources are passed', () => { - const newVoltageLevel = newSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - const oldVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - - const same = isSame(newVoltageLevel!, oldVoltageLevel!); - expect(same).to.be.true; - }); - - it('will return false when the different type of elements are passed', () => { - const voltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - const substation = oldSclElement.querySelector( - 'Substation[name="Substation 1"]' - ); - - const same = isSame(voltageLevel!, substation!); - expect(same).to.be.false; - }); - - it('will return false when the different elements of the same type are passed', () => { - const voltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - const differentVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 380kV"]' - ); - - const same = isSame(differentVoltageLevel!, voltageLevel!); - expect(same).to.be.false; - }); - }); - - describe('diffSclAttributes', () => { - it('no attributes changed', () => { - const newVoltageLevel = newSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - const oldVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - - const diffAttributes = diffSclAttributes( - newVoltageLevel!, - oldVoltageLevel!, - {}, - newVoltageLevel! - ); - expect(diffAttributes).to.have.length(0); - }); - - it('one attribute has changed', () => { - const newVoltageLevel = newSclElement.querySelector( - 'VoltageLevel[name="S1 110kV"]' - ); - const oldVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 110kV"]' - ); - - const diffAttributes = diffSclAttributes( - newVoltageLevel!, - oldVoltageLevel!, - {}, - newVoltageLevel! - ); - expect(diffAttributes).to.have.length(1); - expect(diffAttributes[0][0]).to.be.equal('desc'); - expect(diffAttributes[0][1].oldValue).to.be.null; - expect(diffAttributes[0][1].newValue).to.be.equal('Extra Voltage Level'); - }); - - it('only name changed on copied element', () => { - const newSubstation = newSclElement.querySelector( - 'Substation[name="Substation 1 (Copy)"]' - ); - const oldSubstation = oldSclElement.querySelector( - 'Substation[name="Substation 1"]' - ); - - const diffAttributes = diffSclAttributes(newSubstation!, oldSubstation!, {}, newSubstation!); - expect(diffAttributes).to.have.length(1); - expect(diffAttributes[0][0]).to.be.equal('name'); - expect(diffAttributes[0][1].oldValue).to.be.equal('Substation 1'); - expect(diffAttributes[0][1].newValue).to.be.equal('Substation 1 (Copy)'); - }); - }); - - describe('diffSclChilds', () => { - it('all children can be updated', () => { - const newVoltageLevel = newSclElement.querySelector( - 'VoltageLevel[name="S1 380kV"]' - ); - const oldVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 380kV"]' - ); - - const diffChilds = diffSclChilds(newVoltageLevel!, oldVoltageLevel!, {}, newVoltageLevel!, oldVoltageLevel!); - expect(diffChilds).to.have.length(5); - - const updatedChilds = diffChilds.filter( - diff => diff.newValue !== null && diff.oldValue !== null - ); - expect(updatedChilds).to.have.length(5); - }); - - it('all children can be updated of a copied element', () => { - const newSubstation = newSclElement.querySelector( - 'Substation[name="Substation 1 (Copy)"]' - ); - const oldSubstation = oldSclElement.querySelector( - 'Substation[name="Substation 1"]' - ); - - const diffChilds = diffSclChilds(newSubstation!, oldSubstation!, {}, newSclElement, oldSclElement); - expect(diffChilds).to.have.length(3); - - const updatedChilds = diffChilds.filter( - diff => diff.newValue !== null && diff.oldValue !== null - ); - expect(updatedChilds).to.have.length(3); - }); - - it('one child is added', () => { - const newVoltageLevel = newSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - const oldVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - - const diffChilds = diffSclChilds(newVoltageLevel!, oldVoltageLevel!, {}, newSclElement, oldSclElement); - expect(diffChilds).to.have.length(5); - - const addedBay = diffChilds.filter(diff => diff.oldValue === null); - expect(addedBay).to.have.length(1); - expect(addedBay[0].newValue?.tagName).to.be.equal('Bay'); - }); - - it('one child is removed', () => { - const newVoltageLevel = newSclElement.querySelector( - 'VoltageLevel[name="S1 110kV"]' - ); - const oldVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 110kV"]' - ); - - const diffChilds = diffSclChilds(newVoltageLevel!, oldVoltageLevel!, {}, newVoltageLevel!, oldVoltageLevel!); - expect(diffChilds).to.have.length(7); - - const removedBay = diffChilds.filter(diff => diff.newValue === null); - expect(removedBay).to.have.length(1); - expect(removedBay[0].oldValue?.tagName).to.be.equal('Bay'); - }); - }); - - describe('renderDiff', () => { - it('no changes, so no template is returned', async () => { - const newVoltageLevel = newSclElement.querySelector( - 'VoltageLevel[name="S1 380kV"]' - ); - const oldVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 380kV"]' - ); - - const templateResult = renderDiff(newVoltageLevel!, oldVoltageLevel!); - expect(templateResult).to.be.null; - }); - - it('child is added, so check latest snapshot', async () => { - const newVoltageLevel = newSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - const oldVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - - const templateResult = renderDiff(newVoltageLevel!, oldVoltageLevel!); - expect(templateResult).to.be.not.null; - - const element = fixtureSync(html`
    ${templateResult}
    `); - await element; - await expect(element).to.equalSnapshot(); - }); - - it('child is removed and attribute added/removed/updated, so check latest snapshot', async () => { - const newVoltageLevel = newSclElement.querySelector( - 'VoltageLevel[name="S1 110kV"]' - ); - const oldVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 110kV"]' - ); - - const templateResult = renderDiff(newVoltageLevel!, oldVoltageLevel!); - expect(templateResult).to.be.not.null; - - const element = fixtureSync(html`
    ${templateResult}
    `); - await element; - await expect(element).to.equalSnapshot(); - }); - - it('child is added, but is ignored', async () => { - const newVoltageLevel = newSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - const oldVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 30kV"]' - ); - - const ignoreDiffs: DiffFilter = { - 'Bay': { - full: true - } - } - const templateResult = renderDiff(newVoltageLevel!, oldVoltageLevel!, ignoreDiffs); - - expect(templateResult).to.be.null; - }); - - it('attribute is updated, but is ignored, so check latest snapshot', async () => { - const newVoltageLevel = newSclElement.querySelector( - 'VoltageLevel[name="S1 110kV"]' - ); - const oldVoltageLevel = oldSclElement.querySelector( - 'VoltageLevel[name="S1 110kV"]' - ); - const ignoreDiffs: DiffFilter = { - 'Bay': { - full: false, - attributes: { - 'desc': true - } - } - }; - - const templateResult = renderDiff(newVoltageLevel!, oldVoltageLevel!, ignoreDiffs); - - expect(templateResult).to.be.not.null; - - const element = fixtureSync(html`
    ${templateResult}
    `); - await element; - await expect(element).to.equalSnapshot(); - }); - - }); -}); diff --git a/packages/compas-open-scd/test/unit/foundation/dai.test.ts b/packages/compas-open-scd/test/unit/foundation/dai.test.ts deleted file mode 100644 index c7495c29e..000000000 --- a/packages/compas-open-scd/test/unit/foundation/dai.test.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { expect } from '@open-wc/testing'; -import { - createTemplateStructure, - determineUninitializedStructure, - initializeElements, -} from '../../../src/foundation/dai.js'; - -describe('Global DAI related functions including', () => { - let doc: Document; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/valid2007B4withIEDModifications.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - describe('determineUninitializedStructure', () => { - it('Full path needs to be initiated', () => { - const lnElement = doc.querySelector( - 'LDevice[inst="CircuitBreaker_CB1"] > LN0[lnType="Dummy.LLN0"]' - ); - const doElement = doc.querySelector( - 'LNodeType[id="Dummy.LLN0"] > DO[name="Mod"]' - ); - const daElement = doc.querySelector( - 'DOType[id="Dummy.LLN0.Mod"] > DA[name="stVal"]' - ); - - const [parentElement, templateStructure] = - determineUninitializedStructure(lnElement!, [doElement!, daElement!]); - - expect(parentElement?.tagName).to.be.equals('LN0'); - expect(templateStructure.length).to.be.equals(2); - expect(templateStructure[0].tagName).to.be.equals('DO'); - expect(templateStructure[1].tagName).to.be.equals('DA'); - }); - - it('Full path needs to be initiated, including a structure', () => { - const lnElement = doc.querySelector( - 'LDevice[inst="CircuitBreaker_CB1"] > LN0[lnType="Dummy.LLN0"]' - ); - const doElement = doc.querySelector( - 'LNodeType[id="Dummy.LLN0"] > DO[name="ExtendedMod"]' - ); - const daElement = doc.querySelector( - 'DOType[id="Dummy.LLN0.ExtendedMod"] > DA[name="SBOw"]' - ); - const bdaElement = doc.querySelector( - 'DAType[id="Dummy.LLN0.Mod.SBOw"] > BDA[name="ctlVal"]' - ); - - const [parentElement, templateStructure] = - determineUninitializedStructure(lnElement!, [ - doElement!, - daElement!, - bdaElement!, - ]); - - expect(parentElement?.tagName).to.be.equals('LN0'); - expect(templateStructure.length).to.be.equals(3); - expect(templateStructure[0].tagName).to.be.equals('DO'); - expect(templateStructure[1].tagName).to.be.equals('DA'); - expect(templateStructure[2].tagName).to.be.equals('BDA'); - }); - - it('Partial path needs to be initiated', () => { - const lnElement = doc.querySelector( - 'LDevice[inst="CircuitBreaker_CB1"] > LN[lnType="Dummy.XCBR1"]' - ); - const doElement = doc.querySelector( - 'LNodeType[id="Dummy.XCBR1"] > DO[name="Pos"]' - ); - const daElement = doc.querySelector( - 'DOType[id="Dummy.XCBR1.Pos"] > DA[name="stVal"]' - ); - - const [parentElement, templateStructure] = - determineUninitializedStructure(lnElement!, [doElement!, daElement!]); - - expect(parentElement?.tagName).to.be.equals('DOI'); - expect(templateStructure.length).to.be.equals(1); - expect(templateStructure[0].tagName).to.be.equals('DA'); - }); - }); - - describe('createTemplateStructure', async () => { - it('creates DO/DA structure for LSVS supervision', async () => { - const lsvsScl: XMLDocument = await fetch( - '/test/testfiles/editors/LaterBindingSMV-LSVS.scd' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - const lnElement = lsvsScl.querySelector( - 'IED[name="SMV_Subscriber2"] LN[lnClass="LSVS"][inst="2"]' - )!; - const structureOfElements = createTemplateStructure(lnElement, [ - 'SvCBRef', - 'setSrcRef', - ]); - - expect(structureOfElements?.length).to.be.equals(2); - expect(structureOfElements?.at(0)?.tagName).to.be.equals('DO'); - expect(structureOfElements?.at(1)?.tagName).to.be.equals('DA'); - }); - it('creates DO/DA structure for LGOS supervision', async () => { - const lsvsScl: XMLDocument = await fetch( - '/test/testfiles/editors/LaterBindingGOOSE-LGOS.scd' - ) - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - const lnElement = lsvsScl.querySelector( - 'IED[name="GOOSE_Subscriber2"] LN[lnClass="LGOS"][inst="1"]' - )!; - - const structureOfElements = createTemplateStructure(lnElement, [ - 'GoCBRef', - 'setSrcRef', - ]); - - expect(structureOfElements?.length).to.be.equals(2); - expect(structureOfElements?.at(0)?.tagName).to.be.equals('DO'); - expect(structureOfElements?.at(1)?.tagName).to.be.equals('DA'); - }); - }); - - describe('initializeElements', () => { - it('Simple creation (DOI/DAI)', () => { - const doElement = doc.querySelector( - 'LNodeType[id="Dummy.LLN0"] > DO[name="Mod"]' - ); - const daElement = doc.querySelector( - 'DOType[id="Dummy.LLN0.Mod"] > DA[name="stVal"]' - ); - - const newElement = initializeElements([doElement!, daElement!]); - - expect(newElement?.tagName).to.be.equals('DOI'); - expect(newElement?.childNodes.length).to.be.equals(1); - expect((newElement?.firstChild).tagName).to.be.equals('DAI'); - expect(newElement?.firstChild?.childNodes.length).to.be.equals(1); - expect( - (newElement?.firstChild?.firstChild).tagName - ).to.be.equals('Val'); - }); - - it('Creation of structure (DOI/SDI/DAI)', () => { - const doElement = doc.querySelector( - 'LNodeType[id="Dummy.LLN0"] > DO[name="ExtendedMod"]' - ); - const daElement = doc.querySelector( - 'DOType[id="Dummy.LLN0.ExtendedMod"] > DA[name="SBOw"]' - ); - const bdaElement = doc.querySelector( - 'DAType[id="Dummy.LLN0.Mod.SBOw"] > BDA[name="ctlVal"]' - ); - - const newElement = initializeElements([ - doElement!, - daElement!, - bdaElement!, - ]); - - expect(newElement?.tagName).to.be.equals('DOI'); - expect(newElement?.childNodes.length).to.be.equals(1); - expect((newElement?.firstChild).tagName).to.be.equals('SDI'); - expect(newElement?.firstChild?.childNodes.length).to.be.equals(1); - expect( - (newElement?.firstChild?.firstChild).tagName - ).to.be.equals('DAI'); - expect( - newElement?.firstChild?.firstChild?.childNodes.length - ).to.be.equals(1); - expect( - (newElement?.firstChild?.firstChild?.firstChild).tagName - ).to.be.equals('Val'); - }); - - it('Only create DAI', () => { - const daElement = doc.querySelector( - 'DOType[id="Dummy.XCBR1.Pos"] > DA[name="stVal"]' - ); - - const newElement = initializeElements([daElement!]); - - expect(newElement?.tagName).to.be.equals('DAI'); - expect(newElement?.childNodes.length).to.be.equals(1); - expect((newElement?.firstChild).tagName).to.be.equals('Val'); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/foundation/generators.test.ts b/packages/compas-open-scd/test/unit/foundation/generators.test.ts deleted file mode 100644 index 55673a81c..000000000 --- a/packages/compas-open-scd/test/unit/foundation/generators.test.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { expect } from '@open-wc/testing'; -import { - appIdGenerator, - mACAddressGenerator, -} from '../../../src/foundation/generators.js'; - -describe('MAC-Address generator function', () => { - let macGenerator: () => string; - let doc: XMLDocument; - - describe('for GSE elements', () => { - beforeEach(() => { - doc = new DOMParser().parseFromString( - ` -

    01-0C-CD-01-00-00

    -

    01-0C-CD-01-00-01

    -

    01-0C-CD-01-00-02

    -

    01-0C-CD-01-00-04

    -

    01-0C-CD-01-00-06

    -

    01-0C-CD-01-00-07

    -

    01-0C-CD-01-00-08

    -

    01-0C-CD-01-00-09

    -

    01-0C-CD-01-00-10

    -

    01-0C-CD-01-00-12

    -

    01-0C-CD-01-00-13

    -

    01-0C-CD-01-00-14

    -

    01-0C-CD-01-00-15

    -

    01-0C-CD-01-00-0F

    -
    `, - 'application/xml' - ); - - macGenerator = mACAddressGenerator(doc, 'GSE'); - }); - - it('returns unique MAC-Address', () => - expect(macGenerator()).to.equal('01-0C-CD-01-00-03')); - - it('always returns unique Mac-Address', () => { - expect(macGenerator()).to.equal('01-0C-CD-01-00-03'); - expect(macGenerator()).to.equal('01-0C-CD-01-00-05'); - expect(macGenerator()).to.equal('01-0C-CD-01-00-0A'); - expect(macGenerator()).to.equal('01-0C-CD-01-00-0B'); - }); - }); - - describe('for SMV elements', () => { - beforeEach(() => { - doc = new DOMParser().parseFromString( - ` -

    01-0C-CD-04-00-00

    -

    01-0C-CD-04-00-01

    -

    01-0C-CD-04-00-02

    -

    01-0C-CD-04-00-03

    -

    01-0C-CD-04-00-06

    -

    01-0C-CD-04-00-07

    -

    01-0C-CD-04-00-08

    -

    01-0C-CD-04-00-09

    -

    01-0C-CD-04-00-10

    -

    01-0C-CD-04-00-12

    -

    01-0C-CD-04-00-13

    -

    01-0C-CD-04-00-14

    -

    01-0C-CD-04-00-15

    -

    01-0C-CD-04-00-0B

    -
    `, - 'application/xml' - ); - - macGenerator = mACAddressGenerator(doc, 'SMV'); - }); - - it('returns unique MAC-Address', () => - expect(macGenerator()).to.equal('01-0C-CD-04-00-04')); - - it('always returns unique MAC-Address', () => { - expect(macGenerator()).to.equal('01-0C-CD-04-00-04'); - expect(macGenerator()).to.equal('01-0C-CD-04-00-05'); - expect(macGenerator()).to.equal('01-0C-CD-04-00-0A'); - expect(macGenerator()).to.equal('01-0C-CD-04-00-0C'); - }); - }); -}); - -describe('APPID generator function', () => { - let appidGenerator: () => string; - let doc: XMLDocument; - - describe('for GSE elements Type1B (default)', () => { - beforeEach(() => { - doc = new DOMParser().parseFromString( - ` -

    0001

    -

    0002

    -

    0004

    -

    0005

    -

    0006

    -

    0007

    -

    0008

    -

    0009

    -

    000A

    -

    000C

    -

    000E

    -

    000F

    -

    0010

    -
    `, - 'application/xml' - ); - - appidGenerator = appIdGenerator(doc, 'GSE'); - }); - - it('returns unique APPID', () => expect(appidGenerator()).to.equal('0000')); - - it('always returns unique APPID', () => { - expect(appidGenerator()).to.equal('0000'); - expect(appidGenerator()).to.equal('0003'); - expect(appidGenerator()).to.equal('000B'); - expect(appidGenerator()).to.equal('000D'); - expect(appidGenerator()).to.equal('0011'); - }); - }); - - describe('for GSE elements Type1A (Trip)', () => { - beforeEach(() => { - doc = new DOMParser().parseFromString( - ` -

    8001

    -

    8002

    -

    8004

    -

    8005

    -

    8006

    -

    8007

    -

    8008

    -

    8009

    -

    800A

    -

    800C

    -

    800E

    -

    800F

    -

    8010

    -
    `, - 'application/xml' - ); - - appidGenerator = appIdGenerator(doc, 'GSE', true); - }); - - it('returns unique APPID', () => expect(appidGenerator()).to.equal('8000')); - - it('always returns unique APPID', () => { - expect(appidGenerator()).to.equal('8000'); - expect(appidGenerator()).to.equal('8003'); - expect(appidGenerator()).to.equal('800B'); - expect(appidGenerator()).to.equal('800D'); - expect(appidGenerator()).to.equal('8011'); - }); - }); - - describe('for SMV elements', () => { - beforeEach(() => { - doc = new DOMParser().parseFromString( - ` -

    4000

    -

    4001

    -

    4002

    -

    4004

    -

    4005

    -

    4007

    -

    4009

    -

    400A

    -

    400B

    -

    400D

    -

    400E

    -

    4011

    -

    4009

    -
    `, - 'application/xml' - ); - - appidGenerator = appIdGenerator(doc, 'SMV'); - }); - - it('returns unique APPID', () => expect(appidGenerator()).to.equal('4003')); - - it('always returns unique APPID', () => { - expect(appidGenerator()).to.equal('4003'); - expect(appidGenerator()).to.equal('4006'); - expect(appidGenerator()).to.equal('4008'); - expect(appidGenerator()).to.equal('400C'); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/foundation/nsdoc.test.ts b/packages/compas-open-scd/test/unit/foundation/nsdoc.test.ts deleted file mode 100644 index e2c714f47..000000000 --- a/packages/compas-open-scd/test/unit/foundation/nsdoc.test.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { expect } from "@open-wc/testing"; -import { initializeNsdoc, Nsdoc } from "../../../src/foundation/nsdoc.js"; - -describe('nsdoc', () => { - let nsdoc74!: string; - let nsdoc73!: string; - let nsdoc81!: string; - - describe('has an initializeNsdoc function', () => { - beforeEach(async () => { - localStorage.clear(); - - nsdoc74 = await fetch('/test/testfiles/foundation/testFile74.nsdoc') - .then(response => response.text()); - nsdoc73 = await fetch('/test/testfiles/foundation/testFile73.nsdoc') - .then(response => response.text()); - nsdoc81 = await fetch('/test/testfiles/foundation/testFile81.nsdoc') - .then(response => response.text()); - }); - - it('that\'s initially loaded correct', async function () { - const nsdocsObject = await initializeNsdoc(); - - expect(nsdocsObject.nsdoc73).to.be.undefined; - expect(nsdocsObject.nsdoc74).to.be.undefined; - expect(nsdocsObject.nsdoc81).to.be.undefined; - expect(nsdocsObject.getDataDescription).to.exist; - }); - - it('that has an nsdoc object after loading a correct .nsdoc file into localStorage', async function () { - localStorage.setItem('IEC 61850-7-4', nsdoc74!) - const nsdocsObject = await initializeNsdoc(); - - expect(nsdocsObject.nsdoc74).to.not.be.undefined; - expect(nsdocsObject.nsdoc74?.querySelector('NSDoc')?.getAttribute('id')).to.eql('IEC 61850-7-4'); - }); - - describe('has an getDataDescription function', () => { - let validSCL: XMLDocument; - let nsdocsObject!: Nsdoc - - beforeEach(async () => { - localStorage.clear(); - localStorage.setItem('IEC 61850-8-1', nsdoc81!) - localStorage.setItem('IEC 61850-7-4', nsdoc74!) - localStorage.setItem('IEC 61850-7-3', nsdoc73!) - - nsdocsObject = await initializeNsdoc(); - - validSCL = await fetch('/test/testfiles/valid2007B4withIEDModifications.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - describe('which for LN elements', () => { - it('returns the title', async function () { - const ln = validSCL.querySelector( - 'IED[name="IED1"] > AccessPoint[name="P1"] > Server > LDevice[inst="CircuitBreaker_CB1"] > LN0[lnClass="LLN0"]') - - expect(nsdocsObject.getDataDescription(ln!).label).to.eql('Some LN title (LLN0)'); - }); - - it('returns the lnClass in case no title can be found', async function () { - const ln = validSCL.querySelector( - 'IED[name="IED1"] > AccessPoint[name="P1"] > Server > LDevice[inst="CircuitBreaker_CB1"] > LN[lnClass="XCBR"]'); - - expect(nsdocsObject.getDataDescription(ln!).label).to.eql('XCBR'); - }); - }); - - describe('which for DO elements', () => { - it('returns the description', async function () { - const dataObject = validSCL.querySelector('LNodeType[id="Dummy.LLN0"] > DO[name="Beh"]'); - - expect(nsdocsObject.getDataDescription(dataObject!).label).to.eql('Some DO description'); - }); - - it('returns the description where the DO is part of a parent class', async function () { - const dataObject = validSCL.querySelector('LNodeType[id="Dummy.XCBR1"] > DO[name="Beh"]'); - - expect(nsdocsObject.getDataDescription(dataObject!).label).to.eql('Some DomainLN Description'); - }); - - it('returns the name in case no description can be found', async function () { - const dataObject = validSCL.querySelector('LNodeType[id="Dummy.LLN0"] > DO[name="Health"]'); - - expect(nsdocsObject.getDataDescription(dataObject!).label).to.eql('Health'); - }); - }); - - describe('which for DA elements', () => { - it('returns the description defined in IEC 61850-7-3', async function () { - const dataObject = validSCL.querySelector('DOType[id="Dummy.LLN0.Mod"] > DA[name="q"]'); - - expect(nsdocsObject.getDataDescription(dataObject!).label).to.eql('Some DA description'); - }); - - it('returns the name in case no description can be found in IEC 61850-7-3', async function () { - const dataObject = validSCL.querySelector('DOType[id="Dummy.LLN0.Mod"] > DA[name="t"]'); - - expect(nsdocsObject.getDataDescription(dataObject!).label).to.eql('t'); - }); - - it('returns the description defined in IEC 61850-8-1', async function () { - const dataObject = validSCL.querySelector('DOType[id="Dummy.LLN0.Mod"] > DA[name="SBOw"]'); - - expect(nsdocsObject.getDataDescription(dataObject!).label).to.eql('Some SBOw title'); - }); - - it('which returns the name in case no description can be found in IEC 61850-8-1', async function () { - const dataObject = validSCL.querySelector('DOType[id="Dummy.LLN0.Mod"] > DA[name="SBO"]'); - - expect(nsdocsObject.getDataDescription(dataObject!).label).to.eql('SBO'); - }); - }); - - describe('which for BDA elements', () => { - it('returns the description defined in IEC 61850-7-3', async function () { - const bdaElement = validSCL.querySelector('DAType[id="AnalogueValue_i"] > BDA[name="i"]'); - const bdaElementParent = validSCL.querySelector('DOType[id="DummySAV"] > DA[name="instMag"]'); - - expect(nsdocsObject.getDataDescription(bdaElement!, [bdaElementParent!]).label).to.eql('Some i description'); - }); - - it('returns the name in case no description can be found in IEC 61850-7-3', async function () { - const bdaElement = validSCL.querySelector('DAType[id="AnalogueValue_i"] > BDA[name="x"]'); - const bdaElementParent = validSCL.querySelector('DOType[id="DummySAV"] > DA[name="instMag"]'); - - expect(nsdocsObject.getDataDescription(bdaElement!, [bdaElementParent!]).label).to.eql('x'); - }); - - it('returns the description defined in IEC 61850-8-1', async function () { - const bdaElement = validSCL.querySelector('DAType[id="Dummy.LLN0.Mod.SBOw"] > BDA[name="ctlNum"]'); - const bdaElementParent = validSCL.querySelector('DOType[id="Dummy.LLN0.Mod"] > DA[name="SBOw"]'); - - expect(nsdocsObject.getDataDescription(bdaElement!, [bdaElementParent!]).label).to.eql('Some ctlNum description'); - }); - - it('returns the name in case no description can be found in IEC 61850-8-1', async function () { - const bdaElement = validSCL.querySelector('DAType[id="Dummy.LLN0.Mod.SBOw"] > BDA[name="T"]'); - const bdaElementParent = validSCL.querySelector('DOType[id="Dummy.LLN0.Mod"] > DA[name="SBOw"]'); - - expect(nsdocsObject.getDataDescription(bdaElement!, [bdaElementParent!]).label).to.eql('T'); - }); - }); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/foundation/scl.test.ts b/packages/compas-open-scd/test/unit/foundation/scl.test.ts deleted file mode 100644 index 719adc077..000000000 --- a/packages/compas-open-scd/test/unit/foundation/scl.test.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { expect } from '@open-wc/testing'; - -import { existFcdaReference } from '../../../src/foundation/scl.js'; - -describe('Global SCL related functions including', () => { - let ied: Element; - let fcda1: Element; - let fcda2: Element; - - beforeEach(async () => { - const doc = await fetch('/test/testfiles/foundation/sclbasics.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - ied = doc.querySelector('IED')!; - - fcda1 = doc.createElementNS(doc.documentElement.namespaceURI, 'FCDA'); - fcda1.setAttribute('ldInst', 'ldInst1'); - fcda1.setAttribute('prefix', 'my'); - fcda1.setAttribute('lnClass', 'MMXU'); - fcda1.setAttribute('lnInst', '1'); - fcda1.setAttribute('doName', 'A.phsA'); - fcda1.setAttribute('daName', 'cVal.mag.i'); - fcda1.setAttribute('fc', 'MX'); - - fcda2 = doc.createElementNS(doc.documentElement.namespaceURI, 'FCDA'); - fcda2.setAttribute('ldInst', 'ldInst1'); - fcda2.setAttribute('prefix', ''); - fcda2.setAttribute('lnClass', 'LLN0'); - fcda2.setAttribute('lnInst', ''); - fcda2.setAttribute('doName', 'Beh'); - fcda2.setAttribute('daName', 'stVal'); - fcda2.setAttribute('fc', 'ST'); - }); - - describe('a function that checks FCDA reference validity in IED that', () => { - it('return false for invalid LDevice instance', () => { - fcda1.setAttribute('ldInst', 'ldInst'); - expect(existFcdaReference(fcda1, ied)).to.be.false; - }); - - it('returns false for invalid LN prefix', () => { - fcda1.setAttribute('prefix', 'mys'); - expect(existFcdaReference(fcda1, ied)).to.be.false; - }); - - it('equally treats missing and empty LN prefix', () => { - fcda2.removeAttribute('prefix'); - expect(existFcdaReference(fcda2, ied)).to.be.true; - }); - - it('returns false for invalid LN lnClass', () => { - fcda1.setAttribute('lnClass', 'LLN0'); - expect(existFcdaReference(fcda1, ied)).to.be.false; - }); - - it('returns false for invalid LN inst', () => { - fcda1.setAttribute('prefix', '2'); - expect(existFcdaReference(fcda1, ied)).to.be.false; - }); - - it('equally treats missing and empty LN prefix', () => { - fcda2.removeAttribute('lnInst'); - expect(existFcdaReference(fcda2, ied)).to.be.true; - }); - - it('returns false for invalid DO name', () => { - fcda2.setAttribute('doName', 'beh'); - expect(existFcdaReference(fcda2, ied)).to.be.false; - }); - - it('returns false for invalid SDO name', () => { - fcda1.setAttribute('doName', 'A.PhsA'); - expect(existFcdaReference(fcda1, ied)).to.be.false; - }); - - it('returns false for invalid DA name', () => { - fcda2.setAttribute('daName', 'StVal'); - expect(existFcdaReference(fcda2, ied)).to.be.false; - }); - - it('returns false for invalid BDA name', () => { - fcda1.setAttribute('daName', 'cVal.maG.i'); - expect(existFcdaReference(fcda1, ied)).to.be.false; - }); - - it('returns false for missing FC in FCD type data reference', () => { - fcda1.removeAttribute('daName'); - fcda1.setAttribute('fc', 'CO'); - expect(existFcdaReference(fcda1, ied)).to.be.false; - }); - - it('returns true for FCD type data reference', () => { - fcda1.removeAttribute('daName'); - expect(existFcdaReference(fcda1, ied)).to.be.true; - }); - - it('returns false for invalid FC definition', () => { - fcda1.setAttribute('fc', 'ST'); - expect(existFcdaReference(fcda1, ied)).to.be.false; - - fcda2.setAttribute('fc', 'MX'); - expect(existFcdaReference(fcda2, ied)).to.be.false; - }); - - it('returns true for existing MMXU data reference', () => - expect(existFcdaReference(fcda1, ied)).to.be.true); - - it('returns true for existing LLN0 data reference', () => - expect(existFcdaReference(fcda2, ied)).to.be.true); - }); -}); diff --git a/packages/compas-open-scd/test/unit/locamation/LocamationIEDList.test.ts b/packages/compas-open-scd/test/unit/locamation/LocamationIEDList.test.ts index 8ffc5ecb3..e86b85b41 100644 --- a/packages/compas-open-scd/test/unit/locamation/LocamationIEDList.test.ts +++ b/packages/compas-open-scd/test/unit/locamation/LocamationIEDList.test.ts @@ -1,10 +1,10 @@ import {expect, fixture, html} from "@open-wc/testing"; -import {MockWizard} from "../../mock-wizard.js"; +import {MockWizard} from "open-scd/test/mock-wizard.js"; import {fetchDoc} from "../wizards/test-support.js"; -import {initializeNsdoc, Nsdoc} from "../../../src/foundation/nsdoc.js"; +import {initializeNsdoc, Nsdoc} from "open-scd/src/foundation/nsdoc.js"; -import "../../mock-wizard.js"; +import "open-scd/test/mock-wizard.js"; import {LocamationIEDListElement, locamationIEDListWizard} from "../../../src/locamation/LocamationIEDList.js"; diff --git a/packages/compas-open-scd/test/unit/locamation/LocamationLNEdit.test.ts b/packages/compas-open-scd/test/unit/locamation/LocamationLNEdit.test.ts index a001c1d5e..da1450afd 100644 --- a/packages/compas-open-scd/test/unit/locamation/LocamationLNEdit.test.ts +++ b/packages/compas-open-scd/test/unit/locamation/LocamationLNEdit.test.ts @@ -1,12 +1,12 @@ import {expect, fixture, html} from "@open-wc/testing"; -import {MockWizard} from "../../mock-wizard.js"; -import {fetchDoc, setWizardTextFieldValue} from "../wizards/test-support.js"; -import {initializeNsdoc, Nsdoc} from "../../../src/foundation/nsdoc.js"; -import {WizardTextField} from "../../../src/wizard-textfield.js"; -import {ComplexAction, isSimple, isReplace, Replace, WizardAction} from "../../../src/foundation.js"; +import {MockWizard} from "open-scd/test/mock-wizard.js"; +import {fetchDoc, setWizardTextFieldValue} from "open-scd/test/unit/wizards/test-support.js"; +import {initializeNsdoc, Nsdoc} from "open-scd/src/foundation/nsdoc.js"; +import {WizardTextField} from "open-scd/src/wizard-textfield.js"; +import {ComplexAction, isSimple, isReplace, Replace, WizardAction} from "open-scd/src/foundation.js"; -import "../../mock-wizard.js"; +import "open-scd/test/mock-wizard.js"; import {LocamationVMUEditElement, locamationLNEditWizard} from "../../../src/locamation/LocamationLNEdit.js"; diff --git a/packages/compas-open-scd/test/unit/locamation/LocamationLNList.test.ts b/packages/compas-open-scd/test/unit/locamation/LocamationLNList.test.ts index 92ca8e687..c1326f82c 100644 --- a/packages/compas-open-scd/test/unit/locamation/LocamationLNList.test.ts +++ b/packages/compas-open-scd/test/unit/locamation/LocamationLNList.test.ts @@ -1,10 +1,10 @@ import {expect, fixture, html} from "@open-wc/testing"; -import {MockWizard} from "../../mock-wizard.js"; -import {fetchDoc} from "../wizards/test-support.js"; -import {initializeNsdoc, Nsdoc} from "../../../src/foundation/nsdoc.js"; +import {MockWizard} from "open-scd/test/mock-wizard.js"; +import {fetchDoc} from "open-scd/test/unit/wizards/test-support.js"; +import {initializeNsdoc, Nsdoc} from "open-scd/src/foundation/nsdoc.js"; -import "../../mock-wizard.js"; +import "open-scd/test/mock-wizard.js"; import {LocamationLNodeListElement, locamationLNListWizard} from "../../../src/locamation/LocamationLNList.js"; diff --git a/packages/compas-open-scd/test/unit/locamation/__snapshots__/LocamationIEDList.test.snap.js b/packages/compas-open-scd/test/unit/locamation/__snapshots__/LocamationIEDList.test.snap.js index 91cdc8ed2..1e12c619b 100644 --- a/packages/compas-open-scd/test/unit/locamation/__snapshots__/LocamationIEDList.test.snap.js +++ b/packages/compas-open-scd/test/unit/locamation/__snapshots__/LocamationIEDList.test.snap.js @@ -1,7 +1,7 @@ /* @web/test-runner snapshot v1 */ export const snapshots = {}; -snapshots["Wizards for Locamation Plugin to select the IED/Logical Device - starting screen as wizard - looks like the latest snapshot"] = +snapshots["Wizards for Locamation Plugin to select the IED/Logical Device - starting screen as wizard - looks like the latest snapshot"] = ` `; /* end snapshot Wizards for Locamation Plugin to select the IED/Logical Device - starting screen as wizard - looks like the latest snapshot */ -snapshots["Wizards for Locamation Plugin to select the IED/Logical Device - starting screen as web component with locamation IED - looks like the latest snapshot"] = +snapshots["Wizards for Locamation Plugin to select the IED/Logical Device - starting screen as web component with locamation IED - looks like the latest snapshot"] = ` `; /* end snapshot Wizards for Locamation Plugin to select the Logical Node - starting screen as wizard - looks like the latest snapshot */ -snapshots["Wizards for Locamation Plugin to select the Logical Node - starting screen as web component with locamation LN - looks like the latest snapshot"] = +snapshots["Wizards for Locamation Plugin to select the Logical Node - starting screen as web component with locamation LN - looks like the latest snapshot"] = ` { - if (customElements.get('compare-ied') === undefined) - customElements.define('compare-ied', CompareIEDPlugin); - - let plugin: CompareIEDPlugin; - let doc: XMLDocument; - let template: XMLDocument; - - beforeEach(async () => { - plugin = await fixture(html``); - doc = await fetch('/test/testfiles/menu/compare-ied-changed.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - template = await fetch('/test/testfiles/menu/compare-ied-original.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - describe('show template project selection dialog', () => { - beforeEach(async () => { - plugin.doc = doc; - plugin.run(); - await plugin.requestUpdate(); - }); - - it('after closing the dialog everything set to undefined', async () => { - expect(plugin.templateDoc).to.be.undefined; - expect(plugin.selectedProjectIed).to.be.undefined; - expect(plugin.selectedTemplateIed).to.be.undefined; - - plugin['onClosed'](); - await plugin.requestUpdate(); - - expect(plugin.templateDoc).to.be.undefined; - expect(plugin.selectedProjectIed).to.be.undefined; - expect(plugin.selectedTemplateIed).to.be.undefined; - }); - - it('looks like its latest snapshot', async () => { - await expect(plugin.dialog).to.equalSnapshot(); - }); - }); - - describe('show ied selection lists dialog', () => { - beforeEach(async () => { - plugin.doc = doc; - plugin.templateDoc = template; - plugin.run(); - await plugin.requestUpdate(); - }); - - it('expect the correct number of IEDs from project', () => { - expect(plugin.ieds).to.have.length(5); - }); - - it('expect the correct number of IEDs from template project', () => { - expect(plugin.templateIeds).to.have.length(4); - }); - - it('after closing the dialog everything set to undefined', async () => { - expect(plugin.templateDoc).to.not.be.undefined; - expect(plugin.selectedProjectIed).to.be.undefined; - expect(plugin.selectedTemplateIed).to.be.undefined; - - plugin['onClosed'](); - await plugin.requestUpdate(); - - // expect(plugin.templateDoc).to.be.undefined; - expect(plugin.selectedProjectIed).to.be.undefined; - expect(plugin.selectedTemplateIed).to.be.undefined; - }); - - it('looks like its latest snapshot', async () => { - await expect(plugin.dialog).to.equalSnapshot(); - }); - }); - - describe('show compare dialog with no differences', () => { - beforeEach(async () => { - plugin.doc = doc; - plugin.templateDoc = template; - plugin.selectedProjectIed = - doc.querySelector('IED[name="FieldC_QA1_QB1_QB2_QC9"]') ?? undefined; - plugin.selectedTemplateIed = - template.querySelector('IED[name="FieldC_QA1_QB1_QB2_QC9"]') ?? - undefined; - plugin.run(); - await plugin.requestUpdate(); - }); - - it('looks like its latest snapshot', async () => { - await expect(plugin.dialog).to.equalSnapshot(); - }); - }); - - describe('show compare dialog with differences', () => { - beforeEach(async () => { - plugin.doc = doc; - plugin.templateDoc = template; - plugin.selectedProjectIed = - doc.querySelector('IED[name="FieldA_QA1_QB1_QB2_QC9"]') ?? undefined; - plugin.selectedTemplateIed = - template.querySelector('IED[name="FieldA_QA1_QB1_QB2_QC9"]') ?? - undefined; - plugin.run(); - await plugin.requestUpdate(); - }); - - it('after closing the dialog everything set to undefined', async () => { - expect(plugin.templateDoc).to.not.be.undefined; - expect(plugin.selectedProjectIed).to.not.be.undefined; - expect(plugin.selectedTemplateIed).to.not.be.undefined; - - plugin['onClosed'](); - await plugin.requestUpdate(); - - expect(plugin.selectedProjectIed).to.be.undefined; - expect(plugin.selectedTemplateIed).to.be.undefined; - }); - - }); - -}); diff --git a/packages/compas-open-scd/test/unit/menu/CompasSaveAsVersion.test.ts b/packages/compas-open-scd/test/unit/menu/CompasSaveAsVersion.test.ts index 26df2d91d..3dc64c076 100644 --- a/packages/compas-open-scd/test/unit/menu/CompasSaveAsVersion.test.ts +++ b/packages/compas-open-scd/test/unit/menu/CompasSaveAsVersion.test.ts @@ -7,7 +7,7 @@ import { getCompasSclName, getLabels, getPrivate, -} from '../../../src/compas/private'; +} from '../../../src/compas/private.js'; describe('compas-save-menu', () => { if (customElements.get('compare-save-as-version-menu') === undefined) diff --git a/packages/compas-open-scd/test/unit/menu/ExportIEDParams.test.ts b/packages/compas-open-scd/test/unit/menu/ExportIEDParams.test.ts deleted file mode 100644 index e2b779cc6..000000000 --- a/packages/compas-open-scd/test/unit/menu/ExportIEDParams.test.ts +++ /dev/null @@ -1,439 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import ExportIEDParamsPlugin, { - Configuration, -} from '../../../src/menu/ExportIEDParams.js'; - -describe('Export IED Params Plugin -', () => { - if (customElements.get('export-ied-params') === undefined) - customElements.define('export-ied-params', ExportIEDParamsPlugin); - - let plugin: ExportIEDParamsPlugin; - let doc: XMLDocument; - - beforeEach(async () => { - plugin = await fixture(html` `); - - doc = await fetch('/test/testfiles/menu/export-ied-params.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - plugin.doc = doc; - }); - - describe('determine selector (getSelector) -', () => { - it('when no variable in string then same string returned', () => { - const selector = 'LN[lnClass="TCTR"]'; - expect(plugin['getSelector'](selector, 'IED1')).to.be.equal(selector); - }); - - it('when variable in string then variable is replaced', () => { - const iedName = 'IED1'; - const expectedSelector = `ConnectedAP[iedName="${iedName}"]`; - - const selectorVariant1 = 'ConnectedAP[iedName="{{ iedName }}"]'; - expect(plugin['getSelector'](selectorVariant1, 'IED1')).to.be.equal( - expectedSelector - ); - - const selectorVariant2 = 'ConnectedAP[iedName="{{iedName}}"]'; - expect(plugin['getSelector'](selectorVariant2, 'IED1')).to.be.equal( - expectedSelector - ); - - const selectorVariant3 = 'ConnectedAP[iedName="{{ iedName }}"]'; - expect(plugin['getSelector'](selectorVariant3, 'IED1')).to.be.equal( - expectedSelector - ); - }); - }); - - describe('retrieve the data template element from a type element (getDataTypeChildElement) -', () => { - it('when called with a LNodeType element and a known name is passed then correct DO Element returned', () => { - const typeElement = doc.querySelector('LNodeType[id="Dummy.TVTR"]'); - - const dataElement = plugin['getDataTypeChildElement']( - typeElement!, - 'Beh' - ); - expect(dataElement).to.be.not.null; - expect(dataElement?.tagName).to.be.equal('DO'); - expect(dataElement).to.have.attribute('type', 'OpenSCD_ENS_Beh'); - }); - - it('when called with a LNodeType element and a unknown name is passed then null returned', () => { - const typeElement = doc.querySelector('LNodeType[id="Dummy.TVTR"]'); - - const dataElement = plugin['getDataTypeChildElement']( - typeElement!, - 'Unknown' - ); - expect(dataElement).to.be.null; - }); - - it('when called with a DOType element and a known name is passed then correct DO Element returned', () => { - const typeElement = doc.querySelector('DOType[id="Dummy.ASG"]'); - - const dataElement = plugin['getDataTypeChildElement'](typeElement!, 'q'); - expect(dataElement).to.be.not.null; - expect(dataElement?.tagName).to.be.equal('DA'); - expect(dataElement).to.have.attribute('bType', 'Quality'); - }); - - it('when called with a DOType element and a unknown name is passed then null returned', () => { - const typeElement = doc.querySelector('DOType[id="Dummy.ASG"]'); - - const dataElement = plugin['getDataTypeChildElement']( - typeElement!, - 'Unknown' - ); - expect(dataElement).to.be.null; - }); - - it('when called with a DAType element and a known name is passed then correct BDA Element returned', () => { - const typeElement = doc.querySelector( - 'DAType[id="OpenSCD_Cancel_BehaviourModeKind"]' - ); - - const dataElement = plugin['getDataTypeChildElement']( - typeElement!, - 'ctlNum' - ); - expect(dataElement).to.be.not.null; - expect(dataElement?.tagName).to.be.equal('BDA'); - expect(dataElement).to.have.attribute('bType', 'INT8U'); - }); - - it('when called with a DAType element and a unknown name is passed then null returned', () => { - const typeElement = doc.querySelector( - 'DAType[id="OpenSCD_Cancel_BehaviourModeKind"]' - ); - - const dataElement = plugin['getDataTypeChildElement']( - typeElement!, - 'Unknown' - ); - expect(dataElement).to.be.null; - }); - }); - - describe('retrieve the type element from a data element (getDataTypeTemplateElement) -', () => { - it('when passing a DO Element then the DOType Element is returned', () => { - const doElement = doc.querySelector( - 'LNodeType[id="Dummy.TCTR"] > DO[name="Rat"]' - ); - - const typeElement = plugin['getDataTypeTemplateElement'](doElement); - expect(typeElement).to.be.not.null; - expect(typeElement?.tagName).to.be.equal('DOType'); - expect(typeElement).to.have.attribute('cdc', 'ASG'); - }); - - it('when passing a DA Element then the DAType Element is returned', () => { - const daElement = doc.querySelector( - 'DOType[id="OpenSCD_ENC_Mod"] > DA[name="Oper"]' - ); - - const typeElement = plugin['getDataTypeTemplateElement'](daElement); - expect(typeElement).to.be.not.null; - expect(typeElement?.tagName).to.be.equal('DAType'); - expect(typeElement).to.have.attribute( - 'id', - 'OpenSCD_OperSBOw_BehaviourModeKind' - ); - }); - }); - - describe('retrieving the value of a attribute of text content (getValue) -', () => { - it('when called with known attribute then the value of attribute is returned', () => { - const iedElement = doc.querySelector('IED[name="IED1"]'); - - const value = plugin['getValue'](iedElement!, 'manufacturer'); - expect(value).to.be.equal('DummyManu'); - }); - - it('when called with unknown attribute then the empty value is returned', () => { - const iedElement = doc.querySelector('IED[name="IED1"]'); - - const value = plugin['getValue'](iedElement!, 'unknown'); - expect(value).to.be.empty; - }); - - it('when called to retrieve text content then text content is returned', () => { - const daiElement = doc.querySelector( - 'IED[name="IED1"] LN[lnClass="TCTR"][inst="1"][lnType="Dummy.TCTR"] > ' + - 'DOI[name="HzRtg"] > SDI[name="setMag"] > DAI[name="i"] > Val' - ); - - const value = plugin['getValue'](daiElement!, undefined); - expect(value).to.be.equal('60'); - }); - - it('when called to retrieve text content, but there is no then the empty value is returned', () => { - const daElement = doc.querySelector( - 'DAType[id="OpenSCD_Cancel_BehaviourModeKind"] > BDA[name="ctlVal"]' - ); - - const value = plugin['getValue'](daElement!, undefined); - expect(value).to.be.empty; - }); - }); - - describe('retrieve the template value linked to a LN(0) element (getDataAttributeTemplateValue) -', () => { - let iedElement: Element; - let lnElement: Element; - - beforeEach(() => { - iedElement = doc.querySelector('IED[name="IED1"]')!; - lnElement = iedElement.querySelector( - 'LN[prefix="RES"][lnClass="TCTR"][inst="1"]' - )!; - }); - - it('when a known path is passed then the value of the template is returned', () => { - const value = plugin['getDataAttributeTemplateValue'](lnElement, [ - 'Mod', - 'ctlModel', - ]); - - expect(value).to.be.equal('sbo-with-enhanced-security'); - }); - - it('when no (complete) attribute path is passed then null is returned', () => { - const value = plugin['getDataAttributeTemplateValue'](lnElement, []); - - expect(value).to.be.null; - }); - - it('when something else as a LN element is passed then null is returned', () => { - const value = plugin['getDataAttributeTemplateValue'](iedElement, [ - 'ARtgSec', - 'setVal', - ]); - - expect(value).to.be.null; - }); - }); - - describe('retrieve the instance value below a LN(0) element (getDataAttributeInstanceValue) -', () => { - let iedElement: Element; - let lnElement: Element; - - beforeEach(() => { - iedElement = doc.querySelector('IED[name="IED1"]')!; - lnElement = iedElement.querySelector( - 'LN[prefix="RES"][lnClass="TCTR"][inst="1"]' - )!; - }); - - it('when a instance value is defined then that value is returned', () => { - const value = plugin['getDataAttributeInstanceValue'](lnElement, [ - 'ARtgSec', - 'setVal', - ]); - - expect(value).to.be.equal('5'); - }); - - it('when no instance value is defined then null will be returned', () => { - const value = plugin['getDataAttributeInstanceValue'](lnElement, [ - 'Mod', - 'ctlModel', - ]); - - expect(value).to.be.null; - }); - - it('when no (complete) attribute path is passed then null is returned', () => { - const value = plugin['getDataAttributeInstanceValue'](lnElement, []); - - expect(value).to.be.null; - }); - - it('when something else as a LN element is passed then null is returned', () => { - const value = plugin['getDataAttributeInstanceValue'](iedElement, [ - 'ARtgSec', - 'setVal', - ]); - - expect(value).to.be.null; - }); - }); - - describe('retrieve the value below a LN(0) element (getDataAttributeValue) -', () => { - let lnElement: Element; - - beforeEach(() => { - lnElement = doc.querySelector( - 'IED[name="IED1"] LN[prefix="RES"][lnClass="TCTR"][inst="1"]' - )!; - }); - - it('when a instance value is defined then that value is returned', () => { - const value = plugin['getDataAttributeValue'](lnElement, [ - 'ARtgSec', - 'setVal', - ]); - - expect(value).to.be.equal('5'); - }); - - it('when a template value is defined then that value is returned', () => { - const value = plugin['getDataAttributeValue'](lnElement, [ - 'Mod', - 'ctlModel', - ]); - - expect(value).to.be.equal('sbo-with-enhanced-security'); - }); - }); - - describe('retrieve the elements to search retrieve the value from (getElements) -', () => { - let iedElement: Element; - - beforeEach(() => { - iedElement = doc.querySelector('IED[name="IED1"]')!; - }); - - it('when no selector is passed then the IED element is returned', () => { - const elements = plugin['getElements'](iedElement, undefined, false); - - expect(elements).to.have.length(1); - expect(elements[0]).to.be.equal(iedElement); - }); - - it('when selector to search below the IED is passed then the expected elements are returned', () => { - const elements = plugin['getElements']( - iedElement, - 'LN[prefix="RES"][lnClass="TCTR"][inst="1"]', - false - ); - - expect(elements).to.have.length(1); - const lnElement = elements[0]; - expect(lnElement.tagName).to.be.equal('LN'); - expect(lnElement).to.have.attribute('lnType', 'Dummy.TCTR'); - }); - - it('when selector to search in the document is passed then the expected elements are returned', () => { - const elements = plugin['getElements']( - iedElement, - 'Communication ConnectedAP[iedName="{{ iedName }}"]', - true - ); - - expect(elements).to.have.length(1); - const lnElement = elements[0]; - expect(lnElement.tagName).to.be.equal('ConnectedAP'); - expect(lnElement).to.have.attribute('apName', 'A1'); - }); - }); - - describe('create a line of data for a single IED (cvsLine) -', () => { - let configuration: Configuration; - - beforeEach(async () => { - const jsonContent = await fetch( - '../../../public/conf/export-ied-params.json' - ).then(response => response.text()); - configuration = JSON.parse(jsonContent); - }); - - it('when passing IED1 then the expected String Array is returned', () => { - const iedElement = doc.querySelector('IED[name="IED1"]'); - - const values = plugin['cvsLine'](configuration, iedElement!); - expect(values).to.have.length(18); - expect(values[0]).to.be.equal('IED1'); - expect(values[1]).to.be.equal('192.168.210.134'); - expect(values[2]).to.be.equal('255.255.255.0'); - expect(values[3]).to.be.equal('The first IED'); - expect(values[4]).to.be.equal('1000'); - expect(values[5]).to.be.equal('1000'); - expect(values[6]).to.be.equal('5'); - expect(values[7]).to.be.equal('100'); - expect(values[8]).to.be.equal('100'); - expect(values[9]).to.be.equal('5'); - expect(values[10]).to.be.equal('10000'); - expect(values[11]).to.be.equal('200'); - expect(values[12]).to.be.equal('500'); - expect(values[13]).to.be.equal('5000'); - expect(values[14]).to.be.equal('200'); - expect(values[15]).to.be.equal('25'); - expect(values[16]).to.be.equal('Some Vendor'); - expect(values[17]).to.be.equal('Some Model'); - }); - - it('when passing IED2 then the expected String Array is returned', () => { - const iedElement = doc.querySelector('IED[name="IED2"]'); - - const values = plugin['cvsLine'](configuration, iedElement!); - expect(values).to.have.length(18); - expect(values[0]).to.be.equal('IED2'); - expect(values[1]).to.be.empty; - expect(values[2]).to.be.empty; - expect(values[3]).to.be.equal('The second IED'); - expect(values[4]).to.be.equal('1500'); - expect(values[5]).to.be.equal('1500'); - expect(values[6]).to.be.equal('10'); - expect(values[7]).to.be.equal('100'); - expect(values[8]).to.be.equal('100'); - expect(values[9]).to.be.equal('5'); - expect(values[10]).to.be.equal('15000'); - expect(values[11]).to.be.equal('250'); - expect(values[12]).to.be.equal('550'); - expect(values[13]).to.be.equal('5000'); - expect(values[14]).to.be.equal('200'); - expect(values[15]).to.be.equal('25'); - expect(values[16]).to.be.equal('Other Vendor'); - expect(values[17]).to.be.equal('Other Model'); - }); - }); - - describe('create the header line using the configuration file (columnHeaders) -', () => { - let configuration: Configuration; - - beforeEach(async () => { - const jsonContent = await fetch( - '../../../public/conf/export-ied-params.json' - ).then(response => response.text()); - configuration = JSON.parse(jsonContent); - }); - - it('when called then the expected headers are returned from the configuration file', () => { - const headers = plugin['columnHeaders'](configuration); - expect(headers).to.have.length(18); - }); - }); - - describe('create a line for each IED in the document (cvsLines) -', () => { - let configuration: Configuration; - - beforeEach(async () => { - const jsonContent = await fetch( - '../../../public/conf/export-ied-params.json' - ).then(response => response.text()); - configuration = JSON.parse(jsonContent); - }); - - it('when passing a document with IEDs then the expected number of lines are returned', () => { - const content = plugin['cvsLines'](configuration); - - expect(content).to.have.length(2); - }); - - it('when passing a document without IEDs then one lines is returned with a single column', async () => { - doc = await fetch('/test/testfiles/menu/export-ied-params-no-ied.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - plugin.doc = doc; - - const content = plugin['cvsLines'](configuration); - - // One line returned - expect(content).to.have.length(1); - // And that line only contains 1 column. - expect(content[0]).to.have.length(1); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/menu/SclHistory.test.ts b/packages/compas-open-scd/test/unit/menu/SclHistory.test.ts deleted file mode 100644 index 6553157ec..000000000 --- a/packages/compas-open-scd/test/unit/menu/SclHistory.test.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import SclHistoryPlugin from '../../../src/menu/SclHistory.js'; -describe('testing sclHistory dialog', () => { - if (customElements.get('scl-history') === undefined) - customElements.define('scl-history', SclHistoryPlugin); - let plugin: SclHistoryPlugin; - let doc: XMLDocument; - - describe('with a document loaded containing SCL history items', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/history.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - plugin = await fixture(html` `); - plugin.run(); - await plugin.requestUpdate(); - }); - - it('looks like its latest snapshot', async () => { - await expect(plugin.historyLog).to.equalSnapshot(); - }); - - it('has 7 items in the history list', () => { - expect(plugin.sclHistory.length).to.be.equal(7); - }); - - describe('testing createMessage function', () => { - it('creates a message with two valid strings', () => { - expect(plugin['createMessage']('string who', 'string why')).to.be.equal( - 'string who : string why' - ); - }); - - it('creates a message with one valid string or returns undefined', () => { - expect(plugin['createMessage']('string who', null)).to.be.equal( - 'string who' - ); - expect(plugin['createMessage'](null, 'string why')).to.be.equal( - 'string why' - ); - expect(plugin['createMessage'](null, null)).to.be.undefined; - }); - }); - }); - - describe('with no document', () => { - beforeEach(async () => { - plugin = await fixture(html` `); - plugin.run(); - await plugin.requestUpdate(); - }); - it('looks like its latest snapshot', async () => { - await expect(plugin.historyLog).to.equalSnapshot(); - }); - it('has no items in the history list', () => { - expect(plugin.sclHistory).to.be.empty; - }); - }); - - describe('with a document without SCL history items', () => { - beforeEach(async () => { - doc = await fetch('/test/testfiles/no-history.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - plugin = await fixture(html` `); - plugin.run(); - await plugin.requestUpdate(); - }); - it('looks like its latest snapshot', async () => { - await expect(plugin.historyLog).to.equalSnapshot(); - }); - it('has no items in the history list', () => { - expect(plugin.sclHistory).to.be.empty; - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/menu/SubscriberInfo.test.ts b/packages/compas-open-scd/test/unit/menu/SubscriberInfo.test.ts deleted file mode 100644 index aa7411231..000000000 --- a/packages/compas-open-scd/test/unit/menu/SubscriberInfo.test.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { expect } from '@open-wc/testing'; - -import { createMissingIEDNameSubscriberInfo } from '../../../src/menu/SubscriberInfo.js'; -import { Create, isCreate, SimpleAction } from '../../../src/foundation.js'; - -describe('menu plugin adding subscriber info', () => { - describe('for Edition2 and higher files', () => { - let doc: Document; - let actions: SimpleAction[]; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/subscriberinfo2007.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - actions = createMissingIEDNameSubscriberInfo(doc); - }); - - it('does create one action per necessary IEDName creation', () => { - expect(actions.length).to.equal(4); - }); - - it('creates correct IEDName element referencing LN0 element', () => { - expect(actions[0]).to.satisfy(isCreate); - expect( - ((actions[0]).new.element).getAttribute('apRef') - ).to.equal('P1'); - expect( - ((actions[0]).new.element).getAttribute('ldInst') - ).to.equal('CBSW'); - expect( - ((actions[0]).new.element).getAttribute('prefix') - ).to.equal(''); - expect( - ((actions[0]).new.element).getAttribute('lnClass') - ).to.equal('LLN0'); - expect( - ((actions[0]).new.element).getAttribute('lnInst') - ).to.equal(null); - expect((actions[0]).new.element.textContent).to.equal('IED2'); - }); - - it('creates correct IEDName element referencing LN element', () => { - expect(actions[1]).to.satisfy(isCreate); - expect( - ((actions[1]).new.element).getAttribute('apRef') - ).to.equal('P1'); - expect( - ((actions[1]).new.element).getAttribute('ldInst') - ).to.equal('CBSW'); - expect( - ((actions[1]).new.element).getAttribute('prefix') - ).to.equal(''); - expect( - ((actions[1]).new.element).getAttribute('lnClass') - ).to.equal('XSWI'); - expect( - ((actions[1]).new.element).getAttribute('lnInst') - ).to.equal('1'); - expect((actions[1]).new.element.textContent).to.equal('IED2'); - }); - - it('creates correct IEDName element referencing LN element', () => { - expect(actions[2]).to.satisfy(isCreate); - expect( - ((actions[2]).new.element).getAttribute('apRef') - ).to.equal('P1'); - expect( - ((actions[2]).new.element).getAttribute('ldInst') - ).to.equal('Disconnectors'); - expect( - ((actions[2]).new.element).getAttribute('prefix') - ).to.equal('DC'); - expect( - ((actions[2]).new.element).getAttribute('lnClass') - ).to.equal('CSWI'); - expect( - ((actions[2]).new.element).getAttribute('lnInst') - ).to.equal('1'); - expect((actions[2]).new.element.textContent).to.equal('IED1'); - }); - - it('creates correct IEDName element referencing LN element', () => { - expect(actions[3]).to.satisfy(isCreate); - expect( - ((actions[3]).new.element).getAttribute('apRef') - ).to.equal('P1'); - expect( - ((actions[3]).new.element).getAttribute('ldInst') - ).to.equal('Disconnectors'); - expect( - ((actions[3]).new.element).getAttribute('prefix') - ).to.equal(''); - expect( - ((actions[3]).new.element).getAttribute('lnClass') - ).to.equal('CSWI'); - expect( - ((actions[3]).new.element).getAttribute('lnInst') - ).to.equal('2'); - expect((actions[3]).new.element.textContent).to.equal('IED1'); - }); - }); - - describe('for Edition1 files', () => { - let doc: Document; - let actions: SimpleAction[]; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/subscriberinfo2003.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - actions = createMissingIEDNameSubscriberInfo(doc); - }); - - it('does create one action per necessary IEDName creation', () => { - expect(actions.length).to.equal(2); - }); - - it('creates correct IEDName element', () => { - expect(actions[0]).to.satisfy(isCreate); - expect((actions[0]).new.element.textContent).to.equal('IED1'); - }); - - it('creates correct IEDName element', () => { - expect(actions[1]).to.satisfy(isCreate); - expect((actions[1]).new.element.textContent).to.equal('IED1'); - }); - - it('does not add Edition2 attributes into the IEDName element', () => { - actions.forEach(action => { - expect(((action).new.element).getAttribute('apRef')).to - .be.null; - expect(((action).new.element).getAttribute('ldInst')) - .to.be.null; - expect(((action).new.element).getAttribute('prefix')) - .to.be.null; - expect(((action).new.element).getAttribute('lnClass')) - .to.be.null; - expect(((action).new.element).getAttribute('lnInst')) - .to.be.null; - }); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/menu/UpdateDescriptionSEL.test.ts b/packages/compas-open-scd/test/unit/menu/UpdateDescriptionSEL.test.ts deleted file mode 100644 index ba564553c..000000000 --- a/packages/compas-open-scd/test/unit/menu/UpdateDescriptionSEL.test.ts +++ /dev/null @@ -1,147 +0,0 @@ -import {expect, fixture, html} from '@open-wc/testing'; -import {SinonSpy, spy} from 'sinon'; - -import '../../mock-wizard-editor.js'; -import { MockWizardEditor } from '../../mock-wizard-editor.js'; - -import { ComplexAction, isSimple, isReplace } from '../../../src/foundation.js'; -import UpdateDescriptionSel from '../../../src/menu/UpdateDescriptionSEL.js'; - -describe('Update method for desc attributes in SEL IEDs', () => { - if (customElements.get('update-description-sel') === undefined) - customElements.define('update-description-sel', UpdateDescriptionSel); - - let parent: MockWizardEditor; - let element: UpdateDescriptionSel; - - let wizardAction: SinonSpy; - let editorAction: SinonSpy; - - let signalList: string; - - beforeEach(async () => { - parent = await fixture(html` - - `); - await parent.requestUpdate(); - await parent.updateComplete; - - element = ( - parent.querySelector('update-description-sel')! - ); - await element.requestUpdate(); - await element.updateComplete; - - editorAction = spy(); - window.addEventListener('editor-action', editorAction); - wizardAction = spy(); - window.addEventListener('wizard', wizardAction); - }); - - it('allows to select signal list only as csv file', async () => { - expect(element.pluginFileUI).to.have.property('accept', '.csv'); - expect(element.pluginFileUI).to.have.property('type', 'file'); - }); - - it('allows to select signal list as csv file', async () => { - await element.run(); - }); - - describe('working on SCL files without manufacturer SEL', () => { - beforeEach(async () => { - element.doc = await fetch('test/testfiles/validators/zeroissues.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - signalList = await fetch( - 'test/testfiles/updatedesc/testSignalListSemicolon.csv' - ).then(response => response.text()); - - element.processSignalList(signalList); - await parent.requestUpdate(); - await parent.updateComplete; - }); - - it('cannot find any desc fields to update', async () => { - expect(wizardAction).to.have.been.calledOnce; - expect(parent.wizardUI.dialog?.querySelector('mwc-checked-list-item')).to - .be.null; - }); - }); - - describe('working on SCL files containing manufacturer SEL', () => { - beforeEach(async () => { - element.doc = await fetch('test/testfiles/updatedesc/updatedescSEL.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - describe('using a semicolon separated file', () => { - beforeEach(async () => { - signalList = await fetch( - 'test/testfiles/updatedesc/testSignalListSemicolon.csv' - ).then(response => response.text()); - - element.processSignalList(signalList); - await parent.requestUpdate(); - await parent.updateComplete; - }); - - it('creates filtered list with all proposed desc attribute updates', async () => { - await expect(parent.wizardUI.dialog).dom.to.equalSnapshot(); - }); - - it('allows to update selected desc attributes updates', async () => { - parent.wizardUI?.dialog - ?.querySelector('mwc-button[slot="primaryAction"]')! - .click(); - - await parent.requestUpdate(); - await parent.updateComplete; - expect(editorAction).to.have.been.calledOnce; - expect(editorAction.args[0][0].detail.action).to.not.satisfy(isSimple); - const complexAction = ( - editorAction.args[0][0].detail.action - ); - expect(complexAction.actions.length).to.equal(7); - for (const action of complexAction.actions) - expect(action).to.satisfy(isReplace); - }); - }); - - describe('using a comma separated (CSV) file', () => { - beforeEach(async () => { - signalList = await fetch( - 'test/testfiles/updatedesc/testSignalListComma.csv' - ).then(response => response.text()); - - element.processSignalList(signalList); - await parent.requestUpdate(); - await parent.updateComplete; - }); - - it('creates filtered list with all proposed desc attribute updates', async () => { - await expect(parent.wizardUI.dialog).dom.to.equalSnapshot(); - }); - - it('allows to update selected desc attributes updates', async () => { - parent.wizardUI?.dialog - ?.querySelector('mwc-button[slot="primaryAction"]')! - .click(); - - await parent.requestUpdate(); - await parent.updateComplete; - expect(editorAction).to.have.been.calledOnce; - expect(editorAction.args[0][0].detail.action).to.not.satisfy(isSimple); - const complexAction = ( - editorAction.args[0][0].detail.action - ); - expect(complexAction.actions.length).to.equal(7); - for (const action of complexAction.actions) - expect(action).to.satisfy(isReplace); - }); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/menu/UpdateDescritionABB.test.ts b/packages/compas-open-scd/test/unit/menu/UpdateDescritionABB.test.ts deleted file mode 100644 index 637a340af..000000000 --- a/packages/compas-open-scd/test/unit/menu/UpdateDescritionABB.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import sinon, { SinonSpy } from 'sinon'; - -import '../../mock-wizard.js'; -import { MockWizard } from '../../mock-wizard.js'; - -import { ComplexAction, isSimple, isReplace } from '../../../src/foundation.js'; -import UpdateDescriptionAbb from '../../../src/menu/UpdateDescriptionABB.js'; - -describe('Update method for desc attributes in ABB IEDs', () => { - if (customElements.get('update-description-abb') === undefined) - customElements.define('update-description-abb', UpdateDescriptionAbb); - - let parent: MockWizard; - let element: UpdateDescriptionAbb; - - let editorAction: SinonSpy; - - beforeEach(async () => { - parent = await fixture(html` - - `); - - element = ( - parent.querySelector('update-description-abb')! - ); - - editorAction = sinon.spy(); - window.addEventListener('editor-action', editorAction); - }); - - describe('working on SCL files without manufacturer ABB', () => { - beforeEach(async () => { - const doc = await fetch('/test/testfiles/validators/zeroissues.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - element.doc = doc; - element.run(); - await parent.requestUpdate(); - }); - - it('creates an empty wizard indicating not found desc updates', async () => { - await expect(parent.wizardUI.dialog).to.equalSnapshot(); - }); - }); - - describe('working on SCL files containing manufacturer ABB', () => { - beforeEach(async () => { - const doc = await fetch('/test/testfiles/updatedesc/updatedescABB.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - element.doc = doc; - element.run(); - await parent.requestUpdate(); - }); - - it('creates a wizard with all valid desc update possibilities', async () => { - await expect(parent.wizardUI.dialog).to.equalSnapshot(); - }); - it('creates wizard that on save triggers a complex action containing selected desc updates', async () => { - parent.wizardUI?.dialog - ?.querySelector('mwc-button[slot="primaryAction"]')! - .click(); - await parent.updateComplete; - expect(editorAction).to.have.been.calledOnce; - expect(editorAction.args[0][0].detail.action).to.not.satisfy(isSimple); - const complexAction = ( - editorAction.args[0][0].detail.action - ); - expect(complexAction.actions.length).to.equal(2); - for (const action of complexAction.actions) - expect(action).to.satisfy(isReplace); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/menu/VirtualTemplateIED.test.ts b/packages/compas-open-scd/test/unit/menu/VirtualTemplateIED.test.ts deleted file mode 100644 index 4ce5e9e98..000000000 --- a/packages/compas-open-scd/test/unit/menu/VirtualTemplateIED.test.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import { SinonSpy, spy } from 'sinon'; - -import { Create, isCreate } from '../../../src/foundation.js'; -import VirtualTemplateIED from '../../../src/menu/VirtualTemplateIED.js'; -import { CheckListItem } from '@material/mwc-list/mwc-check-list-item'; -import { WizardTextField } from '../../../src/wizard-textfield.js'; - -describe('Plugin that creates with some user input a virtual template IED - SPECIFICATION', () => { - if (customElements.get('virtual-template-i-e-d') === undefined) - customElements.define('virtual-template-i-e-d', VirtualTemplateIED); - - let doc: XMLDocument; - let element: VirtualTemplateIED; - - let manufacturer: WizardTextField; - let apName: WizardTextField; - - let primaryAction: HTMLElement; - let checkItems: CheckListItem[]; - - let editorAction: SinonSpy; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/virtualied/specificfromfunctions.ssd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - element = await fixture(html` - - `); - - editorAction = spy(); - window.addEventListener('editor-action', editorAction); - - element.run(); - await element.requestUpdate(); - - checkItems = Array.from( - element.dialog.querySelectorAll('mwc-check-list-item') ?? [] - ); - manufacturer = element.dialog.querySelector( - 'wizard-textfield[label="manufacturer"]' - )!; - apName = element.dialog.querySelector( - 'wizard-textfield[label="AccessPoint name"]' - )!; - - primaryAction = ( - element.dialog.querySelector('mwc-button[slot="primaryAction"]') - ); - }); - - it('looks like the latest snapshot', async () => - await expect(element.dialog).dom.to.equalSnapshot()); - - it('shows all LNode that is not class LLN0 as check list items', () => - expect(checkItems.length).to.equal( - doc.querySelectorAll('LNode[iedName="None"]:not([lnClass="LLN0"])').length - )); - - it('does not trigger any actions with missing input fields', () => { - primaryAction.click(); - - expect(editorAction).to.not.have.been.called; - }); - - it('does not trigger any actions with missing input fields', () => { - manufacturer.value = 'SomeCompanyName'; - apName.value = 'P1'; - - primaryAction.click(); - - expect(editorAction).to.not.have.been.called; - }); - - it('does trigger an create actions if at least one LNode is selected', async () => { - manufacturer.value = 'SomeCompanyName'; - apName.value = 'P1'; - - checkItems[1].selected = true; - - await element.requestUpdate(); - - primaryAction.click(); - - expect(editorAction).to.have.been.calledOnce; - }); - - it('allows to add more than one SPECIFICATION type IED to the document', async () => { - manufacturer.value = 'SomeCompanyName'; - apName.value = 'P1'; - - checkItems[1].selected = true; - - await element.requestUpdate(); - - primaryAction.click(); - - const action = editorAction.args[0][0].detail.action; - expect(action).to.satisfy(isCreate); - - const createAction = action; - expect(createAction.checkValidity).to.exist; - expect(createAction.checkValidity!()).to.be.true; - }); - - it('enables primary action button only with required information', async () => { - expect(primaryAction).to.have.attribute('disabled'); - - manufacturer.value = 'SomeCompanyName'; - apName.value = 'P1'; - await element.requestUpdate(); - - expect(primaryAction).to.have.attribute('disabled'); - - checkItems[1].selected = true; - await element.requestUpdate(); - - expect(primaryAction).to.not.have.attribute('disabled'); - }); - - it('IEDs data model show selected logical nodes and its structure', async () => { - manufacturer.value = 'SomeCompanyName'; - apName.value = 'P1'; - - checkItems[1].selected = true; - checkItems[10].selected = true; - checkItems[15].selected = true; - - await element.requestUpdate(); - - primaryAction.click(); - - const action = editorAction.args[0][0].detail.action; - expect(action).to.satisfy(isCreate); - - const createAction = action; - await expect(createAction.new.element).dom.to.equalSnapshot(); - }); -}); diff --git a/packages/compas-open-scd/test/unit/menu/updatesubstation.test.ts b/packages/compas-open-scd/test/unit/menu/updatesubstation.test.ts deleted file mode 100644 index a4fc1cab3..000000000 --- a/packages/compas-open-scd/test/unit/menu/updatesubstation.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { expect } from '@open-wc/testing'; - -import { isValidReference } from '../../../src/menu/UpdateSubstation.js'; -import { identity } from '../../../src/foundation.js'; - -describe('isValidReference', () => { - let ours: XMLDocument; - beforeEach(async () => { - ours = await fetch('/test/testfiles/updatesubstation-ours.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - it('returns true for lNodeIdentity pointing to logical node in the IED', () => { - const lNode = ours.querySelector( - 'LNode[iedName="IED1"][ldInst="Disconnectors"][prefix="DC"][lnClass="XSWI"][lnInst="1"]' - ); - expect(isValidReference(ours, identity(lNode))).to.be.true; - }); - it('checks reference for client side logical nodes', () => { - const lNode = ours.querySelector( - 'LNode[iedName="IED1"][prefix="DC3"][lnClass="XSWI"][lnInst="2"]' - ); - expect(isValidReference(ours, identity(lNode))).to.be.true; - }); - it('returns false for NaN identities', () => { - expect(isValidReference(ours, NaN)).to.be.false; - }); - it('returns false for incorrect lNodeIdentities', () => { - const lNodeMissingIedNAme = ours.querySelector( - 'LNode[iedName="IED1"][prefix="DC"][lnClass="XSWI"][lnInst="2"]' - ); - lNodeMissingIedNAme?.removeAttribute('iedName'); - expect(isValidReference(ours, identity(lNodeMissingIedNAme))).to.be.false; - const lNodeMissingLnClass = ours.querySelector( - 'LNode[iedName="IED1"][prefix="DC"][lnClass="XSWI"][lnInst="2"]' - ); - lNodeMissingLnClass?.removeAttribute('iedName'); - expect(isValidReference(ours, identity(lNodeMissingLnClass))).to.be.false; - }); - it('returns false when reference does not match with logical node', () => { - const lNode = ours.querySelector( - 'LNode[iedName="IED1"][ldInst="Disconnectors"][prefix="DC"][lnClass="XSWI"][lnInst="1"]' - ); - lNode?.setAttribute('lnClass', 'LPHD'); - expect(isValidReference(ours, identity(lNode))).to.be.false; - }); -}); diff --git a/packages/compas-open-scd/test/unit/menu/virtualtemplateied/__snapshots__/foundation.test.snap.js b/packages/compas-open-scd/test/unit/menu/virtualtemplateied/__snapshots__/foundation.test.snap.js deleted file mode 100644 index a3ab41520..000000000 --- a/packages/compas-open-scd/test/unit/menu/virtualtemplateied/__snapshots__/foundation.test.snap.js +++ /dev/null @@ -1,48 +0,0 @@ -/* @web/test-runner snapshot v1 */ -export const snapshots = {}; - -snapshots["foundation for virtual IED creation getSpecificationIED function looks like the latest snapshot"] = -` - - - - - - - - - - - - - - - - - - - -`; -/* end snapshot foundation for virtual IED creation getSpecificationIED function looks like the latest snapshot */ - diff --git a/packages/compas-open-scd/test/unit/menu/virtualtemplateied/foundation.test.ts b/packages/compas-open-scd/test/unit/menu/virtualtemplateied/foundation.test.ts deleted file mode 100644 index b4adb7812..000000000 --- a/packages/compas-open-scd/test/unit/menu/virtualtemplateied/foundation.test.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { expect } from '@open-wc/testing'; -import { identity } from '../../../../src/foundation.js'; - -import { - getFunctionNamingPrefix, - getNonLeafParent, - getSpecificationIED, - getUniqueFunctionName, - isLeafFunction, - VirtualIEDDescription, -} from '../../../../src/menu/virtualtemplateied/foundation.js'; - -describe('foundation for virtual IED creation', () => { - describe('function checking for leaf function type elements', () => { - let randomElement: Element; - let leafSubFunction: Element; - let nonLeafSubFunction: Element; - let leafEqSubFunction: Element; - let nonLeafEqSubFunction: Element; - - beforeEach(() => { - randomElement = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - - leafSubFunction = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - - nonLeafSubFunction = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - - leafEqSubFunction = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - - nonLeafEqSubFunction = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - }); - - it('returns false for input null', () => - expect(isLeafFunction(null)).to.be.false); - - it('returns false for Function element', () => - expect(isLeafFunction(randomElement)).to.be.false); - - it('returns true for leaf SubFcuntion element', () => - expect(isLeafFunction(leafSubFunction)).to.be.true); - - it('returns true for non-leaf SubFuction element', () => - expect(isLeafFunction(nonLeafSubFunction)).to.be.false); - - it('returns true for leaf EqSubFunction element', () => - expect(isLeafFunction(leafEqSubFunction)).to.be.true); - - it('returns true for non-leaf SubFunction element', () => - expect(isLeafFunction(nonLeafEqSubFunction)).to.be.false); - }); - - describe('getNonLeafParent function', () => { - let invalidParantTag: Element; - let directParent: Element; - let directParentsLNode: Element | null; - let leafParent: Element; - let leafParentsLNode: Element | null; - - beforeEach(() => { - invalidParantTag = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - - directParent = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - directParentsLNode = directParent.querySelector('LNode'); - - leafParent = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - leafParentsLNode = leafParent.querySelector('LNode'); - }); - - it('return null for null inputs', () => - expect(getNonLeafParent(null)).to.be.null); - - it('returns null for invalid closest parent tag', () => - expect(getNonLeafParent(invalidParantTag)).to.be.null); - - it('returns null for invalid parent tag', () => - expect(getNonLeafParent(directParentsLNode)).to.equal(directParent)); - - it('returns null for invalid parent tag', () => - expect(getNonLeafParent(leafParentsLNode)).to.equal(leafParent)); - }); - - describe('getFunctionNamingPrefix function', () => { - let lNodeWithPrefix: Element; - let lNodeWithOutPrefix: Element; - let leafSubFunction: Element; - let leafSubFunctionsLNode: Element; - let nonLeafSubFunction: Element; - let nonLeafSubFunctionsLNode: Element; - - beforeEach(() => { - lNodeWithPrefix = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - - lNodeWithOutPrefix = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - - leafSubFunction = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - leafSubFunctionsLNode = leafSubFunction.querySelector('LNode')!; - - nonLeafSubFunction = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - nonLeafSubFunctionsLNode = nonLeafSubFunction.querySelector('LNode')!; - }); - - it('return prefix attribute if present in LNode', () => - expect(getFunctionNamingPrefix(lNodeWithPrefix)).to.equal( - lNodeWithPrefix.getAttribute('prefix') - )); - - it('return empty string if no valid prefix exist', () => - expect(getFunctionNamingPrefix(lNodeWithOutPrefix)).to.equal('')); - - it('returns leaf SubFunction name for missing prefix attribute', () => - expect(getFunctionNamingPrefix(leafSubFunctionsLNode)).to.be.equal( - 'leafFunction' - )); - - it('returns empty string if no valid string exist', () => - expect(getFunctionNamingPrefix(nonLeafSubFunctionsLNode)).to.be.equal( - '' - )); - }); - - describe('getUniqueFunctionName function', () => { - let doc: XMLDocument; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/virtualied/specificfromfunctions.ssd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - it('return unique name for function type element', () => - expect( - getUniqueFunctionName( - doc.querySelector('EqFunction[name="Disconnector"]')! - ) - ).to.equal('Q01_QB1_Disconnector')); - - it('return unique name for another function type element', () => - expect( - getUniqueFunctionName( - doc.querySelector('EqFunction[name="Earth_Switch"]')! - ) - ).to.equal('E1_Q01_QC9_Earth_Switch')); - - it('return function type element name if already unique in project', () => - expect( - getUniqueFunctionName( - doc.querySelector('Function[name="Distance_Protection"]')! - ) - ).to.equal('Distance_Protection')); - - it('return identity string in case input element is not function type element', () => - expect(getUniqueFunctionName(doc.querySelector('Bay')!)).to.equal( - identity(doc.querySelector('Bay')) - )); - }); - - describe('getUniqueFunctionName function', () => { - let doc: XMLDocument; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/virtualied/specificfromfunctions.ssd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - it('return unique name for function type element', () => - expect( - getUniqueFunctionName( - doc.querySelector('EqFunction[name="Disconnector"]')! - ) - ).to.equal('Q01_QB1_Disconnector')); - - it('return unique name for another function type element', () => - expect( - getUniqueFunctionName( - doc.querySelector('EqFunction[name="Earth_Switch"]')! - ) - ).to.equal('E1_Q01_QC9_Earth_Switch')); - - it('return function type element name if already unique in project', () => - expect( - getUniqueFunctionName( - doc.querySelector('Function[name="Distance_Protection"]')! - ) - ).to.equal('Distance_Protection')); - - it('return identity string in case input element is not function type element', () => - expect(getUniqueFunctionName(doc.querySelector('Bay')!)).to.equal( - identity(doc.querySelector('Bay')) - )); - }); - - describe('getSpecificationIED function', () => { - let doc: XMLDocument; - let virtualIED: VirtualIEDDescription; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/virtualied/specificfromfunctions.ssd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - virtualIED = { - manufacturer: 'some manufactorer', - desc: null, - apName: 'P1', - lDevices: [ - { - validLdInst: 'someProtection', - anyLNs: [ - { lnClass: 'LLN0', inst: '', prefix: null, lnType: 'someLLN0' }, - { lnClass: 'PTOC', inst: '1', prefix: 'IDD', lnType: 'somePTOC' }, - ], - }, - { - validLdInst: 'someControl', - anyLNs: [ - { lnClass: 'LLN0', inst: '', prefix: null, lnType: 'someLLN0' }, - { lnClass: 'CSWI', inst: '1', prefix: '', lnType: 'someCSWI' }, - ], - }, - ], - }; - }); - - it('looks like the latest snapshot', async () => - await expect( - getSpecificationIED(doc, virtualIED) - ).dom.to.equalSnapshot()); - }); -}); diff --git a/packages/compas-open-scd/test/unit/mock-actions.ts b/packages/compas-open-scd/test/unit/mock-actions.ts index d314e34d6..314f2bdf7 100644 --- a/packages/compas-open-scd/test/unit/mock-actions.ts +++ b/packages/compas-open-scd/test/unit/mock-actions.ts @@ -1,4 +1,4 @@ -import { ComplexAction, SimpleAction } from '../../src/foundation.js'; +import { ComplexAction, SimpleAction } from 'open-scd/src/foundation.js'; const element = document.createElement('test-element'); const parent = document.createElement('test-parent'); diff --git a/packages/compas-open-scd/test/unit/mock-document.ts b/packages/compas-open-scd/test/unit/mock-document.ts deleted file mode 100644 index b57b46945..000000000 --- a/packages/compas-open-scd/test/unit/mock-document.ts +++ /dev/null @@ -1,13 +0,0 @@ -export function mockSCD(): XMLDocument { - return new DOMParser().parseFromString( - ` - - - - - - - `, - 'application/xml' - ); -} diff --git a/packages/compas-open-scd/test/unit/mock-waiter.ts b/packages/compas-open-scd/test/unit/mock-waiter.ts deleted file mode 100644 index 4f46d25d1..000000000 --- a/packages/compas-open-scd/test/unit/mock-waiter.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { Waiting } from '../../src/Waiting.js'; -import { LitElement, customElement } from 'lit-element'; - -@customElement('mock-waiter') -export class MockWaiter extends Waiting(LitElement) {} diff --git a/packages/compas-open-scd/test/unit/oscd-filter-button.test.ts b/packages/compas-open-scd/test/unit/oscd-filter-button.test.ts deleted file mode 100644 index 32566f6b5..000000000 --- a/packages/compas-open-scd/test/unit/oscd-filter-button.test.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import { SinonSpy, spy } from 'sinon'; - -import '@material/mwc-list/mwc-check-list-item'; -import '@material/mwc-list/mwc-radio-list-item'; - -import { getIcon } from '../../src/icons/icons.js'; - -import '../../src/oscd-filter-button.js'; - -import { FilterButton } from '../../src/oscd-filter-button.js'; - -describe('oscd-filter-button', () => { - let element: FilterButton; - let primaryButton: HTMLElement; - const listItems = [ - { prim: 'item1', defaultSelected: true }, - { prim: 'item2', defaultSelected: false }, - { prim: 'item3', defaultSelected: false }, - { prim: 'item4', defaultSelected: false }, - ]; - - let selectedItemsChangedEvent: SinonSpy; - - beforeEach(() => { - selectedItemsChangedEvent = spy(); - window.addEventListener( - 'selected-items-changed', - selectedItemsChangedEvent - ); - }); - - describe('multi selection with custom header and standard icon', () => { - beforeEach(async () => { - element = await fixture( - html` - ${Array.from(listItems).map( - item => - html` - ${item.prim} - ` - )} - ` - ); - await element.requestUpdate(); - await element.updateComplete; - - primaryButton = ( - element.shadowRoot!.querySelector('mwc-button[slot="primaryAction"]') - ); - }); - - it('when closing dialog then event fired with selected items', async () => { - const filterButton = ( - element.shadowRoot!.querySelector('mwc-icon-button') - ); - filterButton.click(); - await element.requestUpdate(); - await element.updateComplete; - - (( - element.querySelector(`mwc-check-list-item[value="item2"]`) - )).click(); - (( - element.querySelector(`mwc-check-list-item[value="item3"]`) - )).click(); - primaryButton.click(); - - expect(selectedItemsChangedEvent).to.be.calledOnce; - expect( - selectedItemsChangedEvent.args[0][0].detail.selectedItems.length - ).to.be.equal(3); - expect( - selectedItemsChangedEvent.args[0][0].detail.selectedItems[0] - ).to.be.equal('item1'); - expect( - selectedItemsChangedEvent.args[0][0].detail.selectedItems[1] - ).to.be.equal('item2'); - expect( - selectedItemsChangedEvent.args[0][0].detail.selectedItems[2] - ).to.be.equal('item3'); - }); - - it('looks like its latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('single selection with default header and custom icon', () => { - beforeEach(async () => { - element = await fixture( - html` - ${getIcon('lNIcon')} - ${Array.from(listItems).map( - item => - html` - ${item.prim} - ` - )} - ` - ); - await element.requestUpdate(); - await element.updateComplete; - - primaryButton = ( - element.shadowRoot!.querySelector('mwc-button[slot="primaryAction"]') - ); - }); - - it('when closing dialog then event fired with selected item', async () => { - const filterButton = ( - element.shadowRoot!.querySelector('mwc-icon-button') - ); - filterButton.click(); - await element.requestUpdate(); - await element.updateComplete; - - (( - element.querySelector(`mwc-radio-list-item[value="item2"]`) - )).click(); - primaryButton.click(); - - expect(selectedItemsChangedEvent).to.be.calledOnce; - expect( - selectedItemsChangedEvent.args[0][0].detail.selectedItems.length - ).to.be.equal(1); - expect( - selectedItemsChangedEvent.args[0][0].detail.selectedItems[0] - ).to.be.equal('item2'); - }); - - it('looks like its latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - - describe('is disabled', () => { - beforeEach(async () => { - element = await fixture( - html` - ${Array.from(listItems).map( - item => - html` - ${item.prim} - ` - )} - ` - ); - await element.requestUpdate(); - await element.updateComplete; - }); - - it('looks like its latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/plain-compare-list.test.ts b/packages/compas-open-scd/test/unit/plain-compare-list.test.ts deleted file mode 100644 index 7f8652da4..000000000 --- a/packages/compas-open-scd/test/unit/plain-compare-list.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; - -import '../../src/plain-compare-list'; -import { PlainCompareList } from '../../src/plain-compare-list.js'; - -describe('Plain Compare List', () => { - let element: PlainCompareList; - - beforeEach(async () => { - element = await fixture( - html`` - ); - await element.updateComplete; - }); - describe('Empty list', () => { - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - describe('Basic List', () => { - let doc: XMLDocument; - let template: XMLDocument; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/menu/compare-ied-changed.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - template = await fetch('/test/testfiles/menu/compare-ied-original.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - element.leftHandObject = - doc.querySelector('IED[name="FieldC_QA1_QB1_QB2_QC9"]')!; - element.rightHandObject = - template.querySelector('IED[name="FieldC_QA1_QB1_QB2_QC9"]')!; - - element.leftHandTitle = 'Project doc'; - element.rightHandTitle = 'Template doc'; - - await element.requestUpdate(); - }); - - it('looks like the latest snapshot', async () => { - await expect(element).shadowDom.to.equalSnapshot(); - }); - - it('Has a subtitlte, so looks like the latest snapshot', async () => { - element.leftHandSubtitle = 'subtitle'; - element.rightHandSubtitle = 'right subtitle'; - - await element.requestUpdate(); - - await expect(element).shadowDom.to.equalSnapshot(); - }); - }); - -}); diff --git a/packages/compas-open-scd/test/unit/schema.test.ts b/packages/compas-open-scd/test/unit/schema.test.ts deleted file mode 100644 index 079a321e6..000000000 --- a/packages/compas-open-scd/test/unit/schema.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -import {expect} from "@open-wc/testing"; - -import {isSCLNamespace, SCL_NAMESPACE} from "../../src/schemas.js"; - -describe('schema', () => { - it('when element belongs to SCL Namespace, function should return true', () => { - const doc = document.implementation.createDocument(SCL_NAMESPACE, null, null); - const element = doc.createElementNS(SCL_NAMESPACE, "SCL"); - - expect(isSCLNamespace(element)).to.be.true; - }); - - it('when element not belonging to SCL Namespace, function should return false', () => { - const doc = document.implementation.createDocument(SCL_NAMESPACE, null, null); - const element = doc.createElementNS("https://someother.namespace.com", "SCL"); - - expect(isSCLNamespace(element)).to.be.false; - }); -}); diff --git a/packages/compas-open-scd/test/unit/validators/ValidateTemplates.test.ts b/packages/compas-open-scd/test/unit/validators/ValidateTemplates.test.ts deleted file mode 100644 index f47a7d967..000000000 --- a/packages/compas-open-scd/test/unit/validators/ValidateTemplates.test.ts +++ /dev/null @@ -1,152 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import { SinonSpy, spy } from 'sinon'; - -import '../../mock-editor-logger.js'; -import { MockEditorLogger } from '../../mock-editor-logger.js'; - -import ValidateTemplates from '../../../src/validators/ValidateTemplates.js'; - -describe('ValidateTemplates', () => { - if (customElements.get('validate-templates') === undefined) - customElements.define('validate-templates', ValidateTemplates); - - let logEvent: SinonSpy; - let issueEvent: SinonSpy; - - beforeEach(async () => { - logEvent = spy(); - issueEvent = spy(); - - window.addEventListener('log', logEvent); - window.addEventListener('issue', issueEvent); - }); - - describe('dispatch', () => { - let element: ValidateTemplates; - - beforeEach(async () => { - const doc = await fetch('/test/testfiles/validators/zeroissues.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - const parent = await fixture(html` - - `); - - element = parent.querySelector('validate-templates')!; - }); - - it('triggers as newIssuesEvent for detail not containing kind', () => { - const detail = { - title: 'title', - message: 'message', - }; - element.dispatch(detail); - expect(issueEvent).to.have.been.called; - expect(logEvent).to.not.have.been.called; - expect(issueEvent.args[0][0].type).to.equal('issue'); - expect(issueEvent.args[0][0].detail.validatorId).to.equal( - '/src/validators/ValidateTemplates.js' - ); - expect(issueEvent.args[0][0].detail.message).to.equal('message'); - expect(issueEvent.args[0][0].detail.title).to.equal('title'); - }); - - it('triggers as newLogEvent for detail containing kind info', () => { - const detail = { - kind: 'info', - title: 'title', - message: 'message', - }; - element.dispatch(detail); - expect(logEvent).to.have.been.called; - expect(issueEvent).to.not.have.been.called; - expect(logEvent.args[0][0].type).to.equal('log'); - expect(logEvent.args[0][0].detail.kind).to.equal('info'); - expect(logEvent.args[0][0].detail.message).to.equal('message'); - expect(logEvent.args[0][0].detail.title).to.equal('title'); - }); - - it('triggers as newLogEvent for detail containing kind warning', () => { - const detail = { - kind: 'warning', - title: 'title', - message: 'message', - }; - element.dispatch(detail); - expect(logEvent).to.have.been.called; - expect(issueEvent).to.not.have.been.called; - expect(logEvent.args[0][0].type).to.equal('log'); - expect(logEvent.args[0][0].detail.kind).to.equal('warning'); - }); - - it('triggers as newLogEvent for detail containing kind error', () => { - const detail = { - kind: 'error', - title: 'title', - message: 'message', - }; - element.dispatch(detail); - expect(logEvent).to.have.been.called; - expect(issueEvent).to.not.have.been.called; - expect(logEvent.args[0][0].type).to.equal('log'); - expect(logEvent.args[0][0].detail.kind).to.equal('error'); - }); - }); - - describe('validate', () => { - let element: ValidateTemplates; - beforeEach(async () => { - const doc = await fetch('/test/testfiles/validators/zeroissues.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - - const parent: MockEditorLogger = await fixture(html` - - `); - - element = parent.querySelector('validate-templates')!; - }); - - it('pushes only diag.zeroissues issue to diagnostics when no issues found', async () => { - await element.validate(); - expect(issueEvent).to.have.been.calledOnce; - expect(issueEvent.args[0][0].detail.title).to.contain( - '[diag.zeroissues]' - ); - }); - - it('pushes only diag.missingnsd issue to diagnostics pane for SCL version < 2007B3', async () => { - element.doc.querySelector('SCL')?.setAttribute('version', '2003'); - await element.validate(); - expect(issueEvent).to.have.been.calledOnce; - expect(issueEvent.args[0][0].detail.title).to.contain( - '[diag.missingnsd]' - ); - }); - - it('pushes only diag.missingnsd issue to diagnostics pane for SCL not having version information', async () => { - element.doc.querySelector('SCL')?.removeAttribute('version'); - element.doc.querySelector('SCL')?.removeAttribute('revision'); - await element.validate(); - expect(issueEvent).to.have.been.calledOnce; - expect(issueEvent.args[0][0].detail.title).to.contain( - '[diag.missingnsd]' - ); - }); - - it('does not trigger anything for SCL missing DataTypeTemplates', async () => { - const data = element.doc.querySelector('DataTypeTemplates')!; - element.doc.querySelector('SCL')?.removeChild(data); - await element.validate(); - expect(issueEvent).to.not.have.been.calledOnce; - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/validators/templates/dabda.test.ts b/packages/compas-open-scd/test/unit/validators/templates/dabda.test.ts deleted file mode 100644 index c67385371..000000000 --- a/packages/compas-open-scd/test/unit/validators/templates/dabda.test.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { expect } from '@open-wc/testing'; - -import { dAValidator } from '../../../../src/validators/templates/dabda.js'; - -describe('da or bda validator', () => { - let doc: XMLDocument; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/validators/doandsdotestfile.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - it('return Issues when DA type attribute is missing for Struct type', async () => { - const element = doc.querySelector('DOType[id="missingType1"] > DA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingAttribute'); - }); - - it('return empty array for correct DA type attribute - Struct type', async () => { - const element = doc.querySelector('DOType[id="existingType1"] > DA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(0); - }); - - it('return Issues when DA type attribute is missing for Enum type', async () => { - const element = doc.querySelector('DOType[id="missingType2"] > DA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingAttribute'); - }); - - it('return empty array for correct DA type attribute - Enum type', async () => { - const element = doc.querySelector('DOType[id="existingType2"] > DA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(0); - }); - - it('return Issues when DA type reference is missing - Struct type', async () => { - const element = doc.querySelector('DOType[id="invalidReference1"] > DA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingReference'); - }); - - it('return Issues when DA type reference is missing - Enum type', async () => { - const element = doc.querySelector('DOType[id="invalidReference2"] > DA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingReference'); - }); - - it('return Issues when BDA type attribute is missing - Struct type', async () => { - const element = doc.querySelector('DAType[id="missingType1"] > BDA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingAttribute'); - }); - - it('return empty array for correct BDA type attribute - Struct type', async () => { - const element = doc.querySelector('DAType[id="existingType1"] > BDA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(0); - }); - - it('return Issues when BDA type attribute is missing for Enum type', async () => { - const element = doc.querySelector('DAType[id="missingType2"] > BDA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingAttribute'); - }); - - it('return empty array for correct BDA type attribute - Enum type', async () => { - const element = doc.querySelector('DAType[id="existingType2"] > BDA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(0); - }); - - it('return Issues when BDA type reference is missing - Struct type', async () => { - const element = doc.querySelector('DAType[id="invalidReference1"] > BDA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingReference'); - }); - - it('return Issues when BDA type reference is missing - Enum type', async () => { - const element = doc.querySelector('DAType[id="invalidReference2"] > BDA')!; - const errors = await dAValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingReference'); - }); -}); diff --git a/packages/compas-open-scd/test/unit/validators/templates/datype.test.ts b/packages/compas-open-scd/test/unit/validators/templates/datype.test.ts deleted file mode 100644 index 19a50641b..000000000 --- a/packages/compas-open-scd/test/unit/validators/templates/datype.test.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { expect } from '@open-wc/testing'; - -import { dATypeValidator } from '../../../../src/validators/templates/datype.js'; - -describe('datype validator', () => { - let doc: XMLDocument; - beforeEach(async () => { - doc = await fetch('/test/testfiles/validators/datatypetemplateerrors.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - it('return empty array if element is not DAType', async () => { - const element = doc.querySelector('DOType')!; - const errors = await dATypeValidator(element); - expect(errors.length).to.equal(0); - }); - it('returns empty array if DAType includes all mandatory BDAs', async () => { - const element = doc.querySelector('DAType[id="Dummy.RangeConfig"]')!; - const errors = await dATypeValidator(element); - expect(errors.length).to.equal(0); - }); - it('return Issues for missing mandatory BDA e.g scaledOffset', async () => { - const element = doc.querySelector('DAType[id="Dummy.ScaledValueConfig"]')!; - const errors = await dATypeValidator(element); - expect(errors.length).to.equal(1); - }); - - it('returns Issues for missing DA within Oper structure', async () => { - const element = doc.querySelector('DAType[id="Dummy.Operfalse"]')!; - const errors = await dATypeValidator(element); - expect(errors.length).to.equal(1); - }); - - it('returns empty array for correct Oper structure', async () => { - const element = doc.querySelector('DAType[id="Dummy.Oper"]')!; - const errors = await dATypeValidator(element); - expect(errors.length).to.equal(0); - }); - - it('returns Issue array for missing DA within SBOw structure', async () => { - const element = doc.querySelector('DAType[id="Dummy.SBOwfalse"]')!; - const errors = await dATypeValidator(element); - expect(errors.length).to.equal(1); - }); - - it('returns empty array for correct SBOw structure', async () => { - const element = doc.querySelector('DAType[id="Dummy.SBOw"]')!; - const errors = await dATypeValidator(element); - expect(errors.length).to.equal(0); - }); - - it('returns Issue array for missing DA within Cancel structure', async () => { - const element = doc.querySelector('DAType[id="Dummy.Cancelfalse"]')!; - const errors = await dATypeValidator(element); - expect(errors.length).to.equal(1); - }); - - it('returns empty array for correct Cancel structure', async () => { - const element = doc.querySelector('DAType[id="Dummy.Cancel"]')!; - const errors = await dATypeValidator(element); - expect(errors.length).to.equal(0); - }); - - it('returns empty array id less DAType', async () => { - const element = doc.querySelector('DAType[id="Dummy.Cancelfalse"]')!; - element.removeAttribute('id'); - const errors = await dATypeValidator(element); - expect(errors.length).to.equal(0); - }); -}); diff --git a/packages/compas-open-scd/test/unit/validators/templates/doorsdo.test.ts b/packages/compas-open-scd/test/unit/validators/templates/doorsdo.test.ts deleted file mode 100644 index 18495ae30..000000000 --- a/packages/compas-open-scd/test/unit/validators/templates/doorsdo.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { expect } from '@open-wc/testing'; - -import { dOValidator } from '../../../../src/validators/templates/dosdo.js'; - -describe('do or sdo validator', () => { - let doc: XMLDocument; - - beforeEach(async () => { - doc = await fetch('/test/testfiles/validators/doandsdotestfile.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - it('return Issues when DO type attribute is missing', async () => { - const typelessDo = doc.querySelector('LNodeType[id="typelessDo"] > DO')!; - const errors = await dOValidator(typelessDo); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingAttribute'); - }); - - it('return Issues when DO type reference is missing', async () => { - const referencelessDo = doc.querySelector('LNodeType[id="relessDo"] > DO')!; - const errors = await dOValidator(referencelessDo); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingReference'); - }); - - it('return Issues when SDO type attribute is missing', async () => { - const typelessSDo = doc.querySelector('LNodeType[id="typelessSDo"] > SDO')!; - const errors = await dOValidator(typelessSDo); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingAttribute'); - }); - - it('return Issues when SDO type reference is missing', async () => { - const reflessSDo = doc.querySelector('LNodeType[id="relessSDo"] > SDO')!; - const errors = await dOValidator(reflessSDo); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingReference'); - }); - - it('return empty array for valid DO or SDO', async () => { - const correctDo = doc.querySelector('LNodeType[id="correctDo"] > DO')!; - const errors = await dOValidator(correctDo); - expect(errors.length).to.equal(0); - }); -}); diff --git a/packages/compas-open-scd/test/unit/validators/templates/dotype.test.ts b/packages/compas-open-scd/test/unit/validators/templates/dotype.test.ts deleted file mode 100644 index 3edf03435..000000000 --- a/packages/compas-open-scd/test/unit/validators/templates/dotype.test.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { expect } from '@open-wc/testing'; - -import { dOTypeValidator } from '../../../../src/validators/templates/dotype.js'; - -describe('dotype validator', () => { - let doc: XMLDocument; - beforeEach(async () => { - doc = await fetch('/test/testfiles/validators/datatypetemplateerrors.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - it('return empty array if element is not DOType', async () => { - const element = doc.querySelector('LNodeType')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(0); - }); - - it('returns empty array if DOType includes all mandatory DAs', async () => { - const element = doc.querySelector('DOType[id="Dummy.LPHD1.Sim"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(0); - }); - - it('return Issues for missing mandatory DA e.g stVal', async () => { - const element = doc.querySelector('DOType[id="Dummy.LLN0.Health"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('mandatoryChild'); - }); - - it('return Issues for missing mandatory DA e.g another stVal', async () => { - const element = doc.querySelector('DOType[id="Dummy.XCBR1.Pos"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('mandatoryChild'); - }); - - it('return Issues for missing mandatory DA e.g ctlModel', async () => { - const element = doc.querySelector('DOType[id="Dummy.CSWI.Pos1"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('mandatoryChild'); - }); - - it('return Issues for missing cdc attribute within DOType', async () => { - const element = doc.querySelector('DOType[id="Dummy.MissingCDC"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingAttribute'); - }); - - it('return Issues if CDC definition does not follow NSD ', async () => { - const element = doc.querySelector('DOType[id="Dummy.XCBR1.badNamPlt"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(1); - }); - - it('does not validate CDC to NSD with missing id', async () => { - const element = doc.querySelector('DOType[id="Dummy.XCBR1.badNamPlt"]')!; - element.removeAttribute('id'); - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(0); - }); - - it('returns Issues from child validation', async () => { - const element = doc.querySelector('DOType[id="Dummy.badWYE"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(1); - }); - - it('returns empty array for non-controllable data objects', async () => { - const element = doc.querySelector('DOType[id="Dummy.LPHD1.PhyNam"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(0); - }); - - it('returns Issues for missing SBOw', async () => { - const element = doc.querySelector('DOType[id="Dummy.SPC1"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('mandatoryChild'); - }); - - it('returns Issues for missing SBO', async () => { - const element = doc.querySelector('DOType[id="Dummy.SPC2"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('mandatoryChild'); - }); - - it('returns Issues for missing Oper', async () => { - const element = doc.querySelector('DOType[id="Dummy.SPC3"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('mandatoryChild'); - }); - - it('returns Issues for missing Cancel', async () => { - const element = doc.querySelector('DOType[id="Dummy.SPC3"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('mandatoryChild'); - }); - - it('does not indicate false positive for status-only DOs', async () => { - const element = doc.querySelector('DOType[id="Dummy.SPC4"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(0); - }); - - it('does not indicate false positive for empty ctlModel', async () => { - const element = doc.querySelector('DOType[id="Dummy.XCBR1.Pos1"]')!; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(0); - }); - - it('does not indicate false positive for wrong ctlModel', async () => { - const element = doc.querySelector('DOType[id="Dummy.SPC4"]')!; - const val = element.querySelector('Val')!; - val.innerHTML = 'invalidCtlModel'; - const errors = await dOTypeValidator(element); - expect(errors.length).to.equal(0); - }); -}); diff --git a/packages/compas-open-scd/test/unit/validators/templates/foundation.test.ts b/packages/compas-open-scd/test/unit/validators/templates/foundation.test.ts deleted file mode 100644 index 36510b28a..000000000 --- a/packages/compas-open-scd/test/unit/validators/templates/foundation.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { expect } from '@open-wc/testing'; - -import { - tagValidator, - validateChildren, -} from '../../../../src/validators/templates/foundation.js'; - -describe('validator foundation', () => { - describe('tagValidator', () => { - it('tagValidator returns undefined with missing tagName', () => { - expect(tagValidator['noTag']).to.be.undefined; - }); - }); - describe('validateChildren', () => { - let element: Element; - beforeEach(() => { - element = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - }); - it('does not throw Issues for unknown childTags', async () => { - const issues = await validateChildren(element); - expect(issues.length).to.equal(0); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/validators/templates/lnodetype.test.ts b/packages/compas-open-scd/test/unit/validators/templates/lnodetype.test.ts deleted file mode 100644 index 42a8ccd96..000000000 --- a/packages/compas-open-scd/test/unit/validators/templates/lnodetype.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { expect } from '@open-wc/testing'; - -import { lNodeTypeValidator } from '../../../../src/validators/templates/lnodetype.js'; - -describe('lnodetype validator', () => { - let doc: XMLDocument; - beforeEach(async () => { - doc = await fetch('/test/testfiles/validators/datatypetemplateerrors.scd') - .then(response => response.text()) - .then(str => new DOMParser().parseFromString(str, 'application/xml')); - }); - - it('return Issue for missing mandatory DO e.g Beh', async () => { - const element = doc.querySelector('LNodeType[id="Dummy.CILO"]')!; - const errors = await lNodeTypeValidator(element); - expect(errors.length).to.equal(1); - }); - - it('return Issues for missing mandatory DO e.g Pos', async () => { - const element = doc.querySelector('LNodeType[id="Dummy.CSWI"]')!; - const errors = await lNodeTypeValidator(element); - expect(errors.length).to.equal(1); - }); - - it('returns Issues if child element is invalid', async () => { - const element = doc.querySelector('LNodeType[id="Dummy.invalidChild"]')!; - const errors = await lNodeTypeValidator(element); - expect(errors.length).to.equal(1); - }); - - it('returns Issues if lnClass attribute is missing', async () => { - const element = doc.querySelector('LNodeType[id="Dummy.CILO"]')!; - element.removeAttribute('lnClass'); - const errors = await lNodeTypeValidator(element); - expect(errors.length).to.equal(1); - expect(errors[0].title).to.contain('missingAttribute'); - }); - - it('returns empty array if LNodeType includes all mandatory DOs', async () => { - const element = doc.querySelector('LNodeType[id="Dummy.GGIO1"]')!; - const errors = await lNodeTypeValidator(element); - expect(errors.length).to.equal(0); - }); -}); diff --git a/packages/compas-open-scd/test/unit/wizard-checkbox.test.ts b/packages/compas-open-scd/test/unit/wizard-checkbox.test.ts deleted file mode 100644 index e3eb3f82f..000000000 --- a/packages/compas-open-scd/test/unit/wizard-checkbox.test.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { html, fixture, expect } from '@open-wc/testing'; - -import '../../src/wizard-checkbox.js'; -import { WizardCheckbox } from '../../src/wizard-checkbox.js'; - -describe('wizard-checkbox', () => { - let element: WizardCheckbox; - beforeEach(async () => { - element = await fixture(html``); - }); - - describe('with no attribute set', () => { - it('does not render a null value switch', () => - expect(element.nullSwitch).to.not.exist); - - it('is enabled', () => - expect(element.checkbox).to.have.property('disabled', false)); - - it('is un-checked', () => - expect(element.checkbox).to.have.property('checked', false)); - - it('returns the checked attribute as maybeValue', () => { - element.maybeValue = 'true'; - expect(element).to.have.property('maybeValue', 'true'); - }); - - it('is un-checked for invalid maybeValue input', () => { - element.maybeValue = 'someinvalidinput'; - expect(element.checkbox).to.have.property('checked', false); - }); - - it('is un-checked in case input null with non-nullable property', () => { - element.maybeValue = null; - expect(element.checkbox).to.have.property('checked', false); - }); - }); - - describe('with nullable set', () => { - beforeEach(async () => { - element.nullable = true; - await element.updateComplete; - }); - - it('renders a null value switch', async () => - expect(element.nullSwitch).to.exist); - - it('disables itself on switch toggle', async () => { - expect(element).to.have.property('maybeValue', 'false'); - expect(element.checkbox).to.have.property('disabled', false); - element.nullSwitch!.click(); - await element.updateComplete; - expect(element).to.have.property('maybeValue', null); - expect(element.checkbox).to.have.property('disabled', true); - }); - - it('remembers its previous value on switch toggle', async () => { - element.maybeValue = 'true'; - await element.updateComplete; - element.nullSwitch!.click(); - await element.updateComplete; - element.nullSwitch!.click(); - await element.updateComplete; - expect(element.checkbox).to.have.property('disabled', false); - expect(element).to.have.property('maybeValue', 'true'); - }); - - describe('with a null value', () => { - beforeEach(async () => { - element.maybeValue = null; - await element.updateComplete; - }); - - it('enables itself on switch toggle', async () => { - element.nullSwitch?.click(); - await element.updateComplete; - expect(element.checkbox).to.have.property('disabled', false); - }); - - it('has a disabled checkbox', () => - expect(element.checkbox).to.have.property('disabled', true)); - - it('is false per default', () => - expect(element.checkbox).to.have.property('checked', false)); - - it('is checked with true defaultChecked', async () => { - element.defaultChecked = true; - element.nullSwitch?.click(); - await element.requestUpdate(); - - element.maybeValue = 'true'; - await element.requestUpdate(); - - element.nullSwitch?.click(); - await element.requestUpdate(); - - expect(element.checkbox).to.have.property('checked', true); - }); - - it('returns null', () => - expect(element).to.have.property('maybeValue', null)); - }); - }); - - describe('disabled', () => { - beforeEach(async () => { - element = await fixture( - html`` - ); - - await element.updateComplete; - }); - - it('disables checkbox', () => - expect(element.checkbox).to.have.property('disabled', true)); - - it('disables null switch', () => - expect(element.nullSwitch).to.have.property('disabled', true)); - - it('turns off null switch', async () => { - element.nullSwitch?.click(); - await element.updateComplete; - element.nullSwitch?.click(); - await element.updateComplete; - - expect(element.checkbox).to.have.property('disabled', true); - }); - }); -}); diff --git a/packages/compas-open-scd/test/unit/wizard-dialog.test.ts b/packages/compas-open-scd/test/unit/wizard-dialog.test.ts deleted file mode 100644 index 9023bebfe..000000000 --- a/packages/compas-open-scd/test/unit/wizard-dialog.test.ts +++ /dev/null @@ -1,658 +0,0 @@ -import { html, fixture, expect } from '@open-wc/testing'; - -import './mock-editor.js'; - -import { Button } from '@material/mwc-button'; - -import '../../src/wizard-textfield.js'; -import '../../src/wizard-dialog.js'; -import { WizardDialog } from '../../src/wizard-dialog.js'; -import { EditorAction, WizardInputElement } from '../../src/foundation.js'; -import { WizardCheckbox } from '../../src/wizard-checkbox.js'; -import { WizardSelect } from '../../src/wizard-select.js'; -import { WizardTextField } from '../../src/wizard-textfield.js'; - -describe('wizard-dialog', () => { - let element: WizardDialog; - beforeEach(async () => { - element = await fixture(html``); - }); - - describe('with user defined menu actions set', () => { - beforeEach(async () => { - element.wizard = [ - { - title: 'Page 1', - menuActions: [ - { - icon: 'delete', - label: 'remove', - action: () => [], - }, - { - icon: 'delete', - label: 'remove', - action: () => [], - }, - ], - }, - ]; - await element.updateComplete; - }); - - it('looks like its snapshot', async () => - await expect(element).shadowDom.to.equalSnapshot()); - }); - - describe('with an empty wizard property', () => { - it('shows no dialog', () => - expect(element).property('dialog').to.not.exist); - - it('is considered valid', () => expect(element.checkValidity()).to.be.true); - - it('has no invalid pages', () => - expect(element).to.have.property('firstInvalidPage', -1)); - }); - - describe('with a nonempty wizard property', () => { - beforeEach(async () => { - element.wizard = [ - { - title: 'Page 1', - content: [ - html``, - ], - secondary: { icon: 'add', action: () => [], label: 'Test secondary' }, - }, - { - title: 'Page 2', - content: [ - html``, - ], - }, - { - title: 'Page 3', - content: [], - primary: { icon: 'anchor', action: () => [], label: 'Test primary' }, - }, - ]; - await element.updateComplete; - }); - - it('shows the first dialog', () => { - expect(element).property('dialog').to.have.property('open', true); - expect(element.dialog).to.have.property('heading', 'Page 1'); - }); - - it('advances to the second page on next button click', async () => { - (( - element.shadowRoot!.querySelector('mwc-button[dialogaction="next"]') - )).click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - await element.updateComplete; - expect(element.dialog).to.have.property('heading', 'Page 2'); - }); - - it('returns to the first page on prev button click', async () => { - element.next(); - await element.updateComplete; - expect(element.dialog).to.have.property('heading', 'Page 2'); - (( - element.shadowRoot!.querySelector('mwc-button[dialogaction="prev"]') - )).click(); - await new Promise(resolve => setTimeout(resolve, 100)); // await animation - await element.updateComplete; - expect(element.dialog).to.have.property('heading', 'Page 1'); - }); - - describe('with invalid inputs', () => { - beforeEach(async () => { - element.dialogs[1].querySelector( - 'wizard-textfield' - )!.value = 'Peter'; - await element.updateComplete; - }); - - it('is considered invalid', () => - expect(element.checkValidity()).to.be.false); - - it('detects the first invalid page', () => - expect(element).to.have.property('firstInvalidPage', 1)); - - it('does not allow to advance past the invalid page', async () => { - element.next(); - element.next(); - await element.updateComplete; - expect(element.dialog).to.have.property('heading', 'Page 2'); - }); - - it('jumps to first invalid page on action', async () => { - element.act(() => []); - await element.updateComplete; - expect(element.dialog).to.have.property('heading', 'Page 2'); - }); - - it('does nothing on undefined action', async () => { - element.act(); - await element.updateComplete; - expect(element.dialog).to.have.property('heading', 'Page 1'); - }); - }); - - describe('with valid inputs', () => { - it('is considered valid', () => - expect(element.checkValidity()).to.be.true); - - it('has no invalid pages', () => - expect(element).to.have.property('firstInvalidPage', -1)); - - it('advances to the next dialog on next()', async () => { - element.next(); - await element.updateComplete; - expect(element.dialog).to.have.property('heading', 'Page 2'); - expect(element).property('dialog').to.have.property('open', true); - element.next(); - await element.updateComplete; - expect(element.dialog).to.have.property('heading', 'Page 3'); - expect(element).property('dialog').to.have.property('open', true); - }); - - it('returns to the previos dialog on prev()', async () => { - element.next(); - element.prev(); - await element.updateComplete; - expect(element.dialog).to.have.property('heading', 'Page 1'); - expect(element).property('dialog').to.have.property('open', true); - }); - - it('does not jump on action', async () => { - element.act(() => []); - await element.updateComplete; - expect(element.dialog).to.have.property('heading', 'Page 1'); - }); - }); - - it('removes primary action to prevent multiple trigger during wizard close', async () => { - element.wizard = [ - { - title: 'Page 1', - content: [], - primary: { - icon: 'anchor', - action: (): EditorAction[] => { - return [ - { - new: { - parent: element, - element: element, - reference: null, - }, - }, - ]; - }, - label: 'Test primary', - }, - }, - ]; - await element.updateComplete; - (( - element.shadowRoot!.querySelector('mwc-button[slot="primaryAction"]') - )).click(); - expect(element.wizard[0].primary).to.not.exist; - }); - - it('does not remove primary action as long as no editor action is dispatched', async () => { - element.wizard = [ - { - title: 'Page 1', - content: [], - primary: { - icon: 'anchor', - action: () => [], - label: 'Test primary', - }, - }, - ]; - await element.updateComplete; - (( - element.shadowRoot!.querySelector('mwc-button[slot="primaryAction"]') - )).click(); - expect(element.wizard[0].primary).to.exist; - }); - - describe('in pro mode', () => { - let host: Element; - - beforeEach(async () => { - element = await fixture( - html`` - ).then(elm => elm.querySelector('wizard-dialog')!); - localStorage.setItem('mode', 'pro'); - element.requestUpdate(); - await element.updateComplete; - host = new DOMParser().parseFromString( - '', - 'application/xml' - ).documentElement; - element.wizard = [ - { - title: 'Page 1', - element: host.firstElementChild!, - content: [], - primary: { - icon: 'anchor', - action: () => [], - label: 'Test primary', - }, - }, - ]; - }); - - it('looks like its snapshot', async () => - await expect(element).to.equalSnapshot()); - - it('switches to code editor view on code toggle button click', async () => { - element.dialog!.querySelector('mwc-icon-button-toggle')!.on = true; - element.requestUpdate(); - await element.updateComplete; - await element.dialog?.updateComplete; - expect(element).to.equalSnapshot(); - }); - - describe('in code editor mode', () => { - beforeEach(async () => { - element.dialog!.querySelector('mwc-icon-button-toggle')!.on = true; - element.requestUpdate(); - await element.updateComplete; - await element.dialog?.updateComplete; - }); - - it('commits the code action on primary button click', async () => { - element.dialog - ?.querySelector('ace-editor') - ?.setAttribute('value', ''); - await element.updateComplete; - element.dialog - ?.querySelector