diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 60e09a7..b11144f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,42 +1,48 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -Issue tracker is **ONLY** used for reporting bugs. New features should be discussed on our Discord server. - - - - -## Expected Behavior - - -## Current Behavior - - -## Possible Solution - - -## Steps to Reproduce - - -1. -2. -3. -4. - -## Context (Environment) - - - - - -## Detailed Description - - -## Possible Implementation - +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' +--- + +Issue tracker is **ONLY** used for reporting bugs. New features should be discussed on our Discord server. + + + +## Expected Behavior + + + +## Current Behavior + + + +## Possible Solution + + + +## Steps to Reproduce + + + + +1. +2. +3. +4. + +## Context (Environment) + + + + + + +## Detailed Description + + + +## Possible Implementation + + diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index c5b90f3..52e9af2 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ -blank_issues_enabled: false -contact_links: - - name: Community Support - url: https://discord.gg/unblock - about: Please ask and answer questions here. - - name: Heroku, Repl.it, Blocked site issues - url: https://www.youtube.com/watch?v=BLUkgRAy_Vo - about: Do not create issues for these. +blank_issues_enabled: false +contact_links: + - name: Community Support + url: https://discord.gg/unblock + about: Please ask and answer questions here. + - name: Heroku, Repl.it, Blocked site issues + url: https://www.youtube.com/watch?v=BLUkgRAy_Vo + about: Do not create issues for these. diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..9b0bb43 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "tabWidth": 4, + "singleQuote": true +} diff --git a/package-lock.json b/package-lock.json index de728e5..5dd6e6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,4631 +1,4653 @@ { - "name": "@titaniumnetwork-dev/ultraviolet", - "version": "1.0.3", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@titaniumnetwork-dev/ultraviolet", - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "bowser": "^2.11.0", - "css-tree": "^2.0.4", - "esotope-hammerhead": "^0.6.1", - "idb": "^7.0.0", - "meriyah": "^4.2.0", - "mime-db": "^1.51.0", - "parse5": "^6.0.1", - "set-cookie-parser": "^2.4.8" - }, - "devDependencies": { - "copy-webpack-plugin": "^11.0.0", - "cross-env": "^7.0.3", - "eslint": "^8.8.0", - "terser-webpack-plugin": "^5.3.6", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "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.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "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.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/eslint": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", - "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", - "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.7.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz", - "integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==", - "dev": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "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/ajv-formats/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/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "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/browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "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/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/caniuse-lite": { - "version": "1.0.30001396", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001396.tgz", - "integrity": "sha512-Df93cp39XVZRoOl2EoiuNp2rc4Dnsb9mDQEs4qFa7/uTx3FnfEq+jyHLf/0Ik7GVJA6wvJuAI5ZKUtUEenAm9Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "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/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "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/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/copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/copy-webpack-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "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/copy-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/copy-webpack-plugin/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/copy-webpack-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/copy-webpack-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "bin": { - "cross-env": "src/bin/cross-env.js", - "cross-env-shell": "src/bin/cross-env-shell.js" - }, - "engines": { - "node": ">=10.14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "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/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/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/electron-to-chromium": { - "version": "1.4.247", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.247.tgz", - "integrity": "sha512-FLs6R4FQE+1JHM0hh3sfdxnYjKvJpHZyhQDjc2qFq/xFvmmRt/TATNToZhrcGUFzpF2XjeiuozrA8lI0PZmYYw==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "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-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/esotope-hammerhead": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/esotope-hammerhead/-/esotope-hammerhead-0.6.2.tgz", - "integrity": "sha512-SJdxje3PBgYRnHKfoTdjB9Q32vHLiuJABSvTXVBHVpzTz+uIgpkrMcXD1Y0i2k1gplPNyJ62gA8k8/f08FvFsg==", - "dependencies": { - "@types/estree": "0.0.46" - } - }, - "node_modules/espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "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.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/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/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "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/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "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/idb": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.2.tgz", - "integrity": "sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg==" - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/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/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-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-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/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/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/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - }, - "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": "4.3.1", - "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-4.3.1.tgz", - "integrity": "sha512-GavhDfCWvDFp0u920nJeCsgPvzuy+nK381Gp0B5ER7TJooYpjDngkHIwPShqPqzQhL4UodmYTADOW+IaAbuN7w==", - "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==", - "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/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/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/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "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/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/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/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/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-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-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/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/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/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/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/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/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "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/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/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.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-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/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-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/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/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", - "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/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==", - "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/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/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/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/webpack/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/webpack/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/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/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/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": { - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", - "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@humanwhocodes/config-array": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", - "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "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.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "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.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@types/eslint": { - "version": "8.4.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", - "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.46", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", - "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==" - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/node": { - "version": "18.7.16", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz", - "integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==", - "dev": true - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", - "dev": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "requires": { - "ajv": "^8.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "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" - } - }, - "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 - } - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "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 - }, - "bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "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" - } - }, - "browserslist": { - "version": "4.21.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", - "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001370", - "electron-to-chromium": "^1.4.202", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.5" - } - }, - "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 - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001396", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001396.tgz", - "integrity": "sha512-Df93cp39XVZRoOl2EoiuNp2rc4Dnsb9mDQEs4qFa7/uTx3FnfEq+jyHLf/0Ik7GVJA6wvJuAI5ZKUtUEenAm9Q==", - "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" - } - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.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 - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "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 - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "copy-webpack-plugin": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", - "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", - "dev": true, - "requires": { - "fast-glob": "^3.2.11", - "glob-parent": "^6.0.1", - "globby": "^13.1.1", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "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" - } - }, - "ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.3" - } - }, - "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", - "dev": true, - "requires": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - } - }, - "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 - }, - "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" - } - }, - "slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true - } - } - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - } - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "requires": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "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" - } - }, - "electron-to-chromium": { - "version": "1.4.247", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.247.tgz", - "integrity": "sha512-FLs6R4FQE+1JHM0hh3sfdxnYjKvJpHZyhQDjc2qFq/xFvmmRt/TATNToZhrcGUFzpF2XjeiuozrA8lI0PZmYYw==", - "dev": true - }, - "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "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-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", - "dev": true, - "requires": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - } - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "esotope-hammerhead": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/esotope-hammerhead/-/esotope-hammerhead-0.6.2.tgz", - "integrity": "sha512-SJdxje3PBgYRnHKfoTdjB9Q32vHLiuJABSvTXVBHVpzTz+uIgpkrMcXD1Y0i2k1gplPNyJ62gA8k8/f08FvFsg==", - "requires": { - "@types/estree": "0.0.46" - } - }, - "espree": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", - "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" - } - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "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 - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "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 - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "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 - }, - "idb": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.2.tgz", - "integrity": "sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg==" - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "dependencies": { - "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" - } - } - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "json-schema-traverse": { - "version": "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 - }, - "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 - }, - "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" - } - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "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.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 - }, - "mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - }, - "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": "4.3.1", - "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-4.3.1.tgz", - "integrity": "sha512-GavhDfCWvDFp0u920nJeCsgPvzuy+nK381Gp0B5ER7TJooYpjDngkHIwPShqPqzQhL4UodmYTADOW+IaAbuN7w==" - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "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-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", - "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 - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "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 - }, - "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" - } - }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-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-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 - }, - "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 - }, - "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" - } - } - } - }, - "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 - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "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" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "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 - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - }, - "dependencies": { - "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-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "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 - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "set-cookie-parser": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", - "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==" - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "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 - }, - "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==" - }, - "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" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "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 - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true - }, - "terser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", - "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", - "dev": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, - "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.14", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", - "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", - "dev": true, - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.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" - } - }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "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" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - } - } - }, - "webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true - }, - "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" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "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 - }, - "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 - } - } + "name": "@titaniumnetwork-dev/ultraviolet", + "version": "1.0.3", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@titaniumnetwork-dev/ultraviolet", + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "bowser": "^2.11.0", + "css-tree": "^2.0.4", + "esotope-hammerhead": "^0.6.1", + "idb": "^7.0.0", + "meriyah": "^4.2.0", + "mime-db": "^1.51.0", + "parse5": "^6.0.1", + "set-cookie-parser": "^2.4.8" + }, + "devDependencies": { + "copy-webpack-plugin": "^11.0.0", + "cross-env": "^7.0.3", + "eslint": "^8.8.0", + "prettier": "^2.7.1", + "terser-webpack-plugin": "^5.3.6", + "webpack": "^5.74.0", + "webpack-cli": "^4.10.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", + "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "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.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "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.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/eslint": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.7.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz", + "integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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/ajv-formats/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/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "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/browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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/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/caniuse-lite": { + "version": "1.0.30001396", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001396.tgz", + "integrity": "sha512-Df93cp39XVZRoOl2EoiuNp2rc4Dnsb9mDQEs4qFa7/uTx3FnfEq+jyHLf/0Ik7GVJA6wvJuAI5ZKUtUEenAm9Q==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "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/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, + "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/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/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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/copy-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/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/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "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/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/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/electron-to-chromium": { + "version": "1.4.247", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.247.tgz", + "integrity": "sha512-FLs6R4FQE+1JHM0hh3sfdxnYjKvJpHZyhQDjc2qFq/xFvmmRt/TATNToZhrcGUFzpF2XjeiuozrA8lI0PZmYYw==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "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-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", + "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.3.1", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esotope-hammerhead": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/esotope-hammerhead/-/esotope-hammerhead-0.6.2.tgz", + "integrity": "sha512-SJdxje3PBgYRnHKfoTdjB9Q32vHLiuJABSvTXVBHVpzTz+uIgpkrMcXD1Y0i2k1gplPNyJ62gA8k8/f08FvFsg==", + "dependencies": { + "@types/estree": "0.0.46" + } + }, + "node_modules/espree": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "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.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/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/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "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/idb": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.2.tgz", + "integrity": "sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg==" + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-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-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/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/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/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + }, + "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": "4.3.1", + "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-4.3.1.tgz", + "integrity": "sha512-GavhDfCWvDFp0u920nJeCsgPvzuy+nK381Gp0B5ER7TJooYpjDngkHIwPShqPqzQhL4UodmYTADOW+IaAbuN7w==", + "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==", + "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/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/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/node-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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/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/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-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-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/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/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/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/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/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "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/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/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/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/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", + "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/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==", + "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/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", + "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/webpack/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/webpack/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/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/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/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": { + "@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.1.tgz", + "integrity": "sha512-OhSY22oQQdw3zgPOOwdoj01l/Dzl1Z+xyUP33tkSN+aqyEhymJCcPHyXt+ylW8FSe0TfRC2VG+ROQOapD0aZSQ==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@humanwhocodes/config-array": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.4.tgz", + "integrity": "sha512-mXAIHxZT3Vcpg83opl1wGlVZ9xydbfZO3r5YfRSH6Gpp2J/PfdBP0wbDa2sO6/qRbcalpoevVyW6A/fI6LfeMw==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/gitignore-to-minimatch": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", + "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", + "dev": true + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "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.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "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.2", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", + "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", + "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@types/eslint": { + "version": "8.4.6", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz", + "integrity": "sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==" + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/node": { + "version": "18.7.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.16.tgz", + "integrity": "sha512-EQHhixfu+mkqHMZl1R2Ovuvn47PUw18azMJOTwSZr9/fhzHNGXAJ0ma0dayRVchprpCj0Kc1K1xKoWaATWF1qg==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", + "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", + "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", + "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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" + } + }, + "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 + } + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "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 + }, + "bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "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" + } + }, + "browserslist": { + "version": "4.21.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.3.tgz", + "integrity": "sha512-898rgRXLAyRkM1GryrrBHGkqA5hlpkV5MhtZwg9QXeiyLUYs2k00Un05aX5l2/yJIOObYKOpS2JNo8nJDE7fWQ==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001370", + "electron-to-chromium": "^1.4.202", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.5" + } + }, + "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 + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001396", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001396.tgz", + "integrity": "sha512-Df93cp39XVZRoOl2EoiuNp2rc4Dnsb9mDQEs4qFa7/uTx3FnfEq+jyHLf/0Ik7GVJA6wvJuAI5ZKUtUEenAm9Q==", + "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" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.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 + }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "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 + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "dev": true, + "requires": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "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" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "globby": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", + "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "dev": true, + "requires": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "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 + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + } + } + }, + "cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "requires": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "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" + } + }, + "electron-to-chromium": { + "version": "1.4.247", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.247.tgz", + "integrity": "sha512-FLs6R4FQE+1JHM0hh3sfdxnYjKvJpHZyhQDjc2qFq/xFvmmRt/TATNToZhrcGUFzpF2XjeiuozrA8lI0PZmYYw==", + "dev": true + }, + "enhanced-resolve": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", + "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "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-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "eslint": { + "version": "8.23.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", + "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.3.1", + "@humanwhocodes/config-array": "^0.10.4", + "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", + "@humanwhocodes/module-importer": "^1.0.1", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^6.0.1", + "globals": "^13.15.0", + "globby": "^11.1.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + } + }, + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } + } + }, + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + }, + "esotope-hammerhead": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/esotope-hammerhead/-/esotope-hammerhead-0.6.2.tgz", + "integrity": "sha512-SJdxje3PBgYRnHKfoTdjB9Q32vHLiuJABSvTXVBHVpzTz+uIgpkrMcXD1Y0i2k1gplPNyJ62gA8k8/f08FvFsg==", + "requires": { + "@types/estree": "0.0.46" + } + }, + "espree": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.0.tgz", + "integrity": "sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw==", + "dev": true, + "requires": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + } + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "dependencies": { + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "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 + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "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 + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "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 + }, + "idb": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.2.tgz", + "integrity": "sha512-jjKrT1EnyZewQ/gCBb/eyiYrhGzws2FeY92Yx8qT9S9GeQAmo4JFVIiWRIfKW/6Ob9A+UDAOW9j9jn58fy2HIg==" + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "is-core-module": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", + "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "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 + }, + "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 + }, + "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" + } + }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "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.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 + }, + "mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" + }, + "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": "4.3.1", + "resolved": "https://registry.npmjs.org/meriyah/-/meriyah-4.3.1.tgz", + "integrity": "sha512-GavhDfCWvDFp0u920nJeCsgPvzuy+nK381Gp0B5ER7TJooYpjDngkHIwPShqPqzQhL4UodmYTADOW+IaAbuN7w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "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-releases": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", + "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "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 + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "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 + }, + "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" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-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-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 + }, + "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 + }, + "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" + } + } + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "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" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "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 + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "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 + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "set-cookie-parser": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", + "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==" + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "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 + }, + "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==" + }, + "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" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "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 + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terser": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz", + "integrity": "sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", + "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.14", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "terser": "^5.14.1" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, + "update-browserslist-db": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.7.tgz", + "integrity": "sha512-iN/XYesmZ2RmmWAiI4Z5rq0YqSiv0brj9Ce9CfhNE4xIW2h+MFxcgkxIzZ+ShkFPUkjU3gQ+3oypadD3RAMtrg==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.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" + } + }, + "watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "webpack": { + "version": "5.74.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", + "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.10.0", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "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" + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", + "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.2.0", + "@webpack-cli/info": "^1.5.0", + "@webpack-cli/serve": "^1.7.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "cross-spawn": "^7.0.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "dependencies": { + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "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" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "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 + }, + "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/package.json b/package.json index 0978eea..9b7f2fa 100644 --- a/package.json +++ b/package.json @@ -1,36 +1,37 @@ { - "name": "@titaniumnetwork-dev/ultraviolet", - "version": "1.0.3", - "description": "Proxy", - "main": "lib/index.cjs", - "scripts": { - "build": "cross-env NODE_ENV=production webpack-cli", - "build:dev": "cross-env NODE_ENV=development webpack-cli", - "build:watch": "cross-env NODE_ENV=development webpack-cli --watch" - }, - "author": "", - "license": "MIT", - "type": "module", - "dependencies": { - "bowser": "^2.11.0", - "css-tree": "^2.0.4", - "esotope-hammerhead": "^0.6.1", - "idb": "^7.0.0", - "meriyah": "^4.2.0", - "mime-db": "^1.51.0", - "parse5": "^6.0.1", - "set-cookie-parser": "^2.4.8" - }, - "devDependencies": { - "copy-webpack-plugin": "^11.0.0", - "cross-env": "^7.0.3", - "eslint": "^8.8.0", - "terser-webpack-plugin": "^5.3.6", - "webpack": "^5.74.0", - "webpack-cli": "^4.10.0" - }, - "files": [ - "dist", - "lib" - ] + "name": "@titaniumnetwork-dev/ultraviolet", + "version": "1.0.3", + "description": "Proxy", + "main": "lib/index.cjs", + "scripts": { + "build": "cross-env NODE_ENV=production webpack-cli", + "build:dev": "cross-env NODE_ENV=development webpack-cli", + "build:watch": "cross-env NODE_ENV=development webpack-cli --watch" + }, + "author": "", + "license": "MIT", + "type": "module", + "dependencies": { + "bowser": "^2.11.0", + "css-tree": "^2.0.4", + "esotope-hammerhead": "^0.6.1", + "idb": "^7.0.0", + "meriyah": "^4.2.0", + "mime-db": "^1.51.0", + "parse5": "^6.0.1", + "set-cookie-parser": "^2.4.8" + }, + "devDependencies": { + "copy-webpack-plugin": "^11.0.0", + "cross-env": "^7.0.3", + "eslint": "^8.8.0", + "prettier": "^2.7.1", + "terser-webpack-plugin": "^5.3.6", + "webpack": "^5.74.0", + "webpack-cli": "^4.10.0" + }, + "files": [ + "dist", + "lib" + ] } diff --git a/src/client/dom/attr.js b/src/client/dom/attr.js index 4316179..3d2e1ab 100644 --- a/src/client/dom/attr.js +++ b/src/client/dom/attr.js @@ -1,5 +1,5 @@ -import EventEmitter from "../events.js"; -import HookEvent from "../hook.js"; +import EventEmitter from '../events.js'; +import HookEvent from '../hook.js'; class AttrApi extends EventEmitter { constructor(ctx) { @@ -8,8 +8,14 @@ class AttrApi extends EventEmitter { this.window = ctx.window; this.Attr = this.window.Attr || {}; this.attrProto = this.Attr.prototype || {}; - this.value = ctx.nativeMethods.getOwnPropertyDescriptor(this.attrProto, 'value'); - this.name = ctx.nativeMethods.getOwnPropertyDescriptor(this.attrProto, 'name'); + this.value = ctx.nativeMethods.getOwnPropertyDescriptor( + this.attrProto, + 'value' + ); + this.name = ctx.nativeMethods.getOwnPropertyDescriptor( + this.attrProto, + 'name' + ); this.getNamedItem = this.attrProto.getNamedItem || null; this.setNamedItem = this.attrProto.setNamedItem || null; this.removeNamedItem = this.attrProto.removeNamedItem || null; @@ -17,69 +23,100 @@ class AttrApi extends EventEmitter { this.setNamedItemNS = this.attrProto.setNamedItemNS || null; this.removeNamedItemNS = this.attrProto.removeNamedItemNS || null; this.item = this.attrProto.item || null; - }; + } overrideNameValue() { this.ctx.overrideDescriptor(this.attrProto, 'name', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('name', event); if (event.intercepted) return event.returnValue; return event.data.value; }, }); - + this.ctx.overrideDescriptor(this.attrProto, 'value', { get: (target, that) => { - const event = new HookEvent({ name: this.name.get.call(that), value: target.call(that) }, target, that); + const event = new HookEvent( + { + name: this.name.get.call(that), + value: target.call(that), + }, + target, + that + ); this.emit('getValue', event); if (event.intercepted) return event.returnValue; return event.data.value; }, - set: (target, that, [ val ]) => { - const event = new HookEvent({ name: this.name.get.call(that), value: val }, target, that); + set: (target, that, [val]) => { + const event = new HookEvent( + { name: this.name.get.call(that), value: val }, + target, + that + ); this.emit('setValue', event); if (event.intercepted) return event.returnValue; event.target.call(event.that, event.data.value); - } + }, }); - }; + } overrideItemMethods() { - this.ctx.override(this.attrProto, 'getNamedItem', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ name ] = args; + this.ctx.override( + this.attrProto, + 'getNamedItem', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [name] = args; - const event = new HookEvent({ name }, target, that); - this.emit('getNamedItem', event); + const event = new HookEvent({ name }, target, that); + this.emit('getNamedItem', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name); - }); - this.ctx.override(this.attrProto, 'setNamedItem', (target, that, args) => { - if (2 > args.length) return target.apply(that, args); - let [ name, value ] = args; + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.name); + } + ); + this.ctx.override( + this.attrProto, + 'setNamedItem', + (target, that, args) => { + if (2 > args.length) return target.apply(that, args); + let [name, value] = args; - const event = new HookEvent({ name, value }, target, that); - this.emit('setNamedItem', event); + const event = new HookEvent({ name, value }, target, that); + this.emit('setNamedItem', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name, event.data.value); - }); - this.ctx.override(this.attrProto, 'removeNamedItem', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ name ] = args; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.name, + event.data.value + ); + } + ); + this.ctx.override( + this.attrProto, + 'removeNamedItem', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [name] = args; - const event = new HookEvent({ name }, target, that); - this.emit('removeNamedItem', event); + const event = new HookEvent({ name }, target, that); + this.emit('removeNamedItem', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name); - }); + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.name); + } + ); this.ctx.override(this.attrProto, 'item', (target, that, args) => { if (!args.length) return target.apply(that, args); - let [ index ] = args; + let [index] = args; const event = new HookEvent({ index }, target, that); this.emit('item', event); @@ -87,37 +124,65 @@ class AttrApi extends EventEmitter { if (event.intercepted) return event.returnValue; return event.target.call(event.that, event.data.name); }); - this.ctx.override(this.attrProto, 'getNamedItemNS', (target, that, args) => { - if (2 > args.length) return target.apply(that, args); - let [ namespace, localName ] = args; + this.ctx.override( + this.attrProto, + 'getNamedItemNS', + (target, that, args) => { + if (2 > args.length) return target.apply(that, args); + let [namespace, localName] = args; - const event = new HookEvent({ namespace, localName }, target, that); - this.emit('getNamedItemNS', event); + const event = new HookEvent( + { namespace, localName }, + target, + that + ); + this.emit('getNamedItemNS', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.namespace, event.data.localName); - }); - this.ctx.override(this.attrProto, 'setNamedItemNS', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ attr ] = args; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.namespace, + event.data.localName + ); + } + ); + this.ctx.override( + this.attrProto, + 'setNamedItemNS', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [attr] = args; - const event = new HookEvent({ attr }, target, that); - this.emit('setNamedItemNS', event); + const event = new HookEvent({ attr }, target, that); + this.emit('setNamedItemNS', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name); - }); - this.ctx.override(this.attrProto, 'removeNamedItemNS', (target, that, args) => { - if (2 > args.length) return target.apply(that, args); - let [ namespace, localName ] = args; + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.name); + } + ); + this.ctx.override( + this.attrProto, + 'removeNamedItemNS', + (target, that, args) => { + if (2 > args.length) return target.apply(that, args); + let [namespace, localName] = args; - const event = new HookEvent({ namespace, localName }, target, that); - this.emit('removeNamedItemNS', event); + const event = new HookEvent( + { namespace, localName }, + target, + that + ); + this.emit('removeNamedItemNS', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.namespace, event.data.localName); - }); - }; -}; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.namespace, + event.data.localName + ); + } + ); + } +} -export default AttrApi; \ No newline at end of file +export default AttrApi; diff --git a/src/client/dom/document.js b/src/client/dom/document.js index cbfd1f8..619d5a0 100644 --- a/src/client/dom/document.js +++ b/src/client/dom/document.js @@ -1,5 +1,5 @@ -import EventEmitter from "../events.js"; -import HookEvent from "../hook.js"; +import EventEmitter from '../events.js'; +import HookEvent from '../hook.js'; class DocumentHook extends EventEmitter { constructor(ctx) { @@ -11,52 +11,86 @@ class DocumentHook extends EventEmitter { this.DOMParser = this.window.DOMParser || {}; this.docProto = this.Document.prototype || {}; this.domProto = this.DOMParser.prototype || {}; - this.title = ctx.nativeMethods.getOwnPropertyDescriptor(this.docProto, 'title'); - this.cookie = ctx.nativeMethods.getOwnPropertyDescriptor(this.docProto, 'cookie'); - this.referrer = ctx.nativeMethods.getOwnPropertyDescriptor(this.docProto, 'referrer'); - this.domain = ctx.nativeMethods.getOwnPropertyDescriptor(this.docProto, 'domain'); - this.documentURI = ctx.nativeMethods.getOwnPropertyDescriptor(this.docProto, 'documentURI'); + this.title = ctx.nativeMethods.getOwnPropertyDescriptor( + this.docProto, + 'title' + ); + this.cookie = ctx.nativeMethods.getOwnPropertyDescriptor( + this.docProto, + 'cookie' + ); + this.referrer = ctx.nativeMethods.getOwnPropertyDescriptor( + this.docProto, + 'referrer' + ); + this.domain = ctx.nativeMethods.getOwnPropertyDescriptor( + this.docProto, + 'domain' + ); + this.documentURI = ctx.nativeMethods.getOwnPropertyDescriptor( + this.docProto, + 'documentURI' + ); this.write = this.docProto.write; this.writeln = this.docProto.writeln; this.querySelector = this.docProto.querySelector; this.querySelectorAll = this.docProto.querySelectorAll; this.parseFromString = this.domProto.parseFromString; - this.URL = ctx.nativeMethods.getOwnPropertyDescriptor(this.docProto, 'URL'); - }; + this.URL = ctx.nativeMethods.getOwnPropertyDescriptor( + this.docProto, + 'URL' + ); + } overrideParseFromString() { - this.ctx.override(this.domProto, 'parseFromString', (target, that, args) => { - if (2 > args.length) return target.apply(that, args); - let [ string, type ] = args; + this.ctx.override( + this.domProto, + 'parseFromString', + (target, that, args) => { + if (2 > args.length) return target.apply(that, args); + let [string, type] = args; - const event = new HookEvent({ string, type }, target, that); - this.emit('parseFromString', event); + const event = new HookEvent({ string, type }, target, that); + this.emit('parseFromString', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.string, event.data.type); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.string, + event.data.type + ); + } + ); + } overrideQuerySelector() { - this.ctx.override(this.docProto, 'querySelector', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ selectors ] = args; + this.ctx.override( + this.docProto, + 'querySelector', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [selectors] = args; - const event = new HookEvent({ selectors }, target, that); - this.emit('querySelector', event); + const event = new HookEvent({ selectors }, target, that); + this.emit('querySelector', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.selectors); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.selectors); + } + ); + } overrideDomain() { this.ctx.overrideDescriptor(this.docProto, 'domain', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('getDomain', event); if (event.intercepted) return event.returnValue; return event.data.value; }, - set: (target, that, [ val ]) => { + set: (target, that, [val]) => { const event = new HookEvent({ value: val }, target, that); this.emit('setDomain', event); @@ -64,34 +98,53 @@ class DocumentHook extends EventEmitter { return event.target.call(event.that, event.data.value); }, }); - }; + } overrideReferrer() { this.ctx.overrideDescriptor(this.docProto, 'referrer', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('referrer', event); if (event.intercepted) return event.returnValue; return event.data.value; }, }); - }; + } overrideCreateTreeWalker() { - this.ctx.override(this.docProto, 'createTreeWalker', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ root, show = 0xFFFFFFFF, filter, expandEntityReferences ] = args; + this.ctx.override( + this.docProto, + 'createTreeWalker', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [root, show = 0xffffffff, filter, expandEntityReferences] = + args; - const event = new HookEvent({ root, show, filter, expandEntityReferences }, target, that); - this.emit('createTreeWalker', event); + const event = new HookEvent( + { root, show, filter, expandEntityReferences }, + target, + that + ); + this.emit('createTreeWalker', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.root, event.data.show, event.data.filter, event.data.expandEntityReferences); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.root, + event.data.show, + event.data.filter, + event.data.expandEntityReferences + ); + } + ); + } overrideWrite() { this.ctx.override(this.docProto, 'write', (target, that, args) => { if (!args.length) return target.apply(that, args); - let [ ...html ] = args; + let [...html] = args; const event = new HookEvent({ html }, target, that); this.emit('write', event); @@ -101,7 +154,7 @@ class DocumentHook extends EventEmitter { }); this.ctx.override(this.docProto, 'writeln', (target, that, args) => { if (!args.length) return target.apply(that, args); - let [ ...html ] = args; + let [...html] = args; const event = new HookEvent({ html }, target, that); this.emit('writeln', event); @@ -109,76 +162,96 @@ class DocumentHook extends EventEmitter { if (event.intercepted) return event.returnValue; return event.target.apply(event.that, event.data.html); }); - }; + } overrideDocumentURI() { this.ctx.overrideDescriptor(this.docProto, 'documentURI', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('documentURI', event); if (event.intercepted) return event.returnValue; return event.data.value; }, }); - }; + } overrideURL() { this.ctx.overrideDescriptor(this.docProto, 'URL', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('url', event); if (event.intercepted) return event.returnValue; return event.data.value; }, }); - }; + } overrideReferrer() { this.ctx.overrideDescriptor(this.docProto, 'referrer', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('referrer', event); if (event.intercepted) return event.returnValue; return event.data.value; }, }); - }; + } overrideCookie() { this.ctx.overrideDescriptor(this.docProto, 'cookie', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('getCookie', event); if (event.intercepted) return event.returnValue; return event.data.value; }, - set: (target, that, [ value ]) => { - const event = new HookEvent({ value, }, target, that); + set: (target, that, [value]) => { + const event = new HookEvent({ value }, target, that); this.emit('setCookie', event); if (event.intercepted) return event.returnValue; return event.target.call(event.that, event.data.value); }, }); - }; + } overrideTitle() { this.ctx.overrideDescriptor(this.docProto, 'title', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('getTitle', event); if (event.intercepted) return event.returnValue; return event.data.value; }, - set: (target, that, [ value ]) => { - const event = new HookEvent({ value, }, target, that); + set: (target, that, [value]) => { + const event = new HookEvent({ value }, target, that); this.emit('setTitle', event); if (event.intercepted) return event.returnValue; return event.target.call(event.that, event.data.value); }, }); - }; -}; + } +} -export default DocumentHook; \ No newline at end of file +export default DocumentHook; diff --git a/src/client/dom/element.js b/src/client/dom/element.js index 260fd50..8a7dcda 100644 --- a/src/client/dom/element.js +++ b/src/client/dom/element.js @@ -1,5 +1,5 @@ -import EventEmitter from "../events.js"; -import HookEvent from "../hook.js"; +import EventEmitter from '../events.js'; +import HookEvent from '../hook.js'; class ElementApi extends EventEmitter { constructor(ctx) { @@ -9,8 +9,14 @@ class ElementApi extends EventEmitter { this.Audio = this.window.Audio; this.Element = this.window.Element; this.elemProto = this.Element ? this.Element.prototype : {}; - this.innerHTML = ctx.nativeMethods.getOwnPropertyDescriptor(this.elemProto, 'innerHTML'); - this.outerHTML = ctx.nativeMethods.getOwnPropertyDescriptor(this.elemProto, 'outerHTML'); + this.innerHTML = ctx.nativeMethods.getOwnPropertyDescriptor( + this.elemProto, + 'innerHTML' + ); + this.outerHTML = ctx.nativeMethods.getOwnPropertyDescriptor( + this.elemProto, + 'outerHTML' + ); this.setAttribute = this.elemProto.setAttribute; this.getAttribute = this.elemProto.getAttribute; this.removeAttribute = this.elemProto.removeAttribute; @@ -19,83 +25,116 @@ class ElementApi extends EventEmitter { this.querySelectorAll = this.elemProto.querySelectorAll; this.insertAdjacentHTML = this.elemProto.insertAdjacentHTML; this.insertAdjacentText = this.elemProto.insertAdjacentText; - }; + } overrideQuerySelector() { - this.ctx.override(this.elemProto, 'querySelector', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ selectors ] = args; + this.ctx.override( + this.elemProto, + 'querySelector', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [selectors] = args; - const event = new HookEvent({ selectors }, target, that); - this.emit('querySelector', event); + const event = new HookEvent({ selectors }, target, that); + this.emit('querySelector', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.selectors); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.selectors); + } + ); + } overrideAttribute() { - this.ctx.override(this.elemProto, 'getAttribute', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ name ] = args; + this.ctx.override( + this.elemProto, + 'getAttribute', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [name] = args; - const event = new HookEvent({ name }, target, that); - this.emit('getAttribute', event); + const event = new HookEvent({ name }, target, that); + this.emit('getAttribute', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name); - }); - this.ctx.override(this.elemProto, 'setAttribute', (target, that, args) => { - if (2 > args.length) return target.apply(that, args); - let [ name, value ] = args; + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.name); + } + ); + this.ctx.override( + this.elemProto, + 'setAttribute', + (target, that, args) => { + if (2 > args.length) return target.apply(that, args); + let [name, value] = args; - const event = new HookEvent({ name, value }, target, that); - this.emit('setAttribute', event); + const event = new HookEvent({ name, value }, target, that); + this.emit('setAttribute', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name, event.data.value); - }); - this.ctx.override(this.elemProto, 'hasAttribute', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ name ] = args; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.name, + event.data.value + ); + } + ); + this.ctx.override( + this.elemProto, + 'hasAttribute', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [name] = args; - const event = new HookEvent({ name }, target, that); - this.emit('hasAttribute', event); + const event = new HookEvent({ name }, target, that); + this.emit('hasAttribute', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name); - }); - this.ctx.override(this.elemProto, 'removeAttribute', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ name ] = args; + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.name); + } + ); + this.ctx.override( + this.elemProto, + 'removeAttribute', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [name] = args; - const event = new HookEvent({ name }, target, that); - this.emit('removeAttribute', event); + const event = new HookEvent({ name }, target, that); + this.emit('removeAttribute', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.name); + } + ); + } overrideAudio() { - this.ctx.override(this.window, 'Audio', (target, that, args) => { - if (!args.length) return new target(...args); - let [ url ] = args; + this.ctx.override( + this.window, + 'Audio', + (target, that, args) => { + if (!args.length) return new target(...args); + let [url] = args; - const event = new HookEvent({ url }, target, that); - this.emit('audio', event); + const event = new HookEvent({ url }, target, that); + this.emit('audio', event); - if (event.intercepted) return event.returnValue; - return new event.target(event.data.url); - }, true); - }; + if (event.intercepted) return event.returnValue; + return new event.target(event.data.url); + }, + true + ); + } overrideHtml() { this.hookProperty(this.Element, 'innerHTML', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('getInnerHTML', event); if (event.intercepted) return event.returnValue; return event.data.value; }, - set: (target, that, [ val ]) => { + set: (target, that, [val]) => { const event = new HookEvent({ value: val }, target, that); this.emit('setInnerHTML', event); @@ -105,13 +144,17 @@ class ElementApi extends EventEmitter { }); this.hookProperty(this.Element, 'outerHTML', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('getOuterHTML', event); if (event.intercepted) return event.returnValue; return event.data.value; }, - set: (target, that, [ val ]) => { + set: (target, that, [val]) => { const event = new HookEvent({ value: val }, target, that); this.emit('setOuterHTML', event); @@ -119,47 +162,63 @@ class ElementApi extends EventEmitter { target.call(that, event.data.value); }, }); - }; + } overrideInsertAdjacentHTML() { - this.ctx.override(this.elemProto, 'insertAdjacentHTML', (target, that, args) => { - if (2 > args.length) return target.apply(that, args); - let [ position, html ] = args; + this.ctx.override( + this.elemProto, + 'insertAdjacentHTML', + (target, that, args) => { + if (2 > args.length) return target.apply(that, args); + let [position, html] = args; - const event = new HookEvent({ position, html }, target, that); - this.emit('insertAdjacentHTML', event); + const event = new HookEvent({ position, html }, target, that); + this.emit('insertAdjacentHTML', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.position, event.data.html); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.position, + event.data.html + ); + } + ); + } overrideInsertAdjacentText() { - this.ctx.override(this.elemProto, 'insertAdjacentText', (target, that, args) => { - if (2 > args.length) return target.apply(that, args); - let [ position, text ] = args; + this.ctx.override( + this.elemProto, + 'insertAdjacentText', + (target, that, args) => { + if (2 > args.length) return target.apply(that, args); + let [position, text] = args; - const event = new HookEvent({ position, text }, target, that); - this.emit('insertAdjacentText', event); + const event = new HookEvent({ position, text }, target, that); + this.emit('insertAdjacentText', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.position, event.data.text); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.position, + event.data.text + ); + } + ); + } hookProperty(element, prop, handler) { if (!element || !prop in element) return false; if (this.ctx.nativeMethods.isArray(element)) { for (const elem of element) { this.hookProperty(elem, prop, handler); - }; + } return true; - }; + } const proto = element.prototype; this.ctx.overrideDescriptor(proto, prop, handler); - - return true; - }; -}; -export default ElementApi; \ No newline at end of file + return true; + } +} + +export default ElementApi; diff --git a/src/client/dom/node.js b/src/client/dom/node.js index 9c646bc..3957591 100644 --- a/src/client/dom/node.js +++ b/src/client/dom/node.js @@ -1,5 +1,5 @@ -import EventEmitter from "../events.js"; -import HookEvent from "../hook.js"; +import EventEmitter from '../events.js'; +import HookEvent from '../hook.js'; class NodeApi extends EventEmitter { constructor(ctx) { @@ -16,24 +16,49 @@ class NodeApi extends EventEmitter { this.appendChild = this.nodeProto.appendChild; this.removeChild = this.nodeProto.removeChild; - this.textContent = ctx.nativeMethods.getOwnPropertyDescriptor(this.nodeProto, 'textContent'); - this.parentNode = ctx.nativeMethods.getOwnPropertyDescriptor(this.nodeProto, 'parentNode'); - this.parentElement = ctx.nativeMethods.getOwnPropertyDescriptor(this.nodeProto, 'parentElement'); - this.childNodes = ctx.nativeMethods.getOwnPropertyDescriptor(this.nodeProto, 'childNodes'); - this.baseURI = ctx.nativeMethods.getOwnPropertyDescriptor(this.nodeProto, 'baseURI'); - this.previousSibling = ctx.nativeMethods.getOwnPropertyDescriptor(this.nodeProto, 'previousSibling'); - this.ownerDocument = ctx.nativeMethods.getOwnPropertyDescriptor(this.nodeProto, 'ownerDocument'); - }; + this.textContent = ctx.nativeMethods.getOwnPropertyDescriptor( + this.nodeProto, + 'textContent' + ); + this.parentNode = ctx.nativeMethods.getOwnPropertyDescriptor( + this.nodeProto, + 'parentNode' + ); + this.parentElement = ctx.nativeMethods.getOwnPropertyDescriptor( + this.nodeProto, + 'parentElement' + ); + this.childNodes = ctx.nativeMethods.getOwnPropertyDescriptor( + this.nodeProto, + 'childNodes' + ); + this.baseURI = ctx.nativeMethods.getOwnPropertyDescriptor( + this.nodeProto, + 'baseURI' + ); + this.previousSibling = ctx.nativeMethods.getOwnPropertyDescriptor( + this.nodeProto, + 'previousSibling' + ); + this.ownerDocument = ctx.nativeMethods.getOwnPropertyDescriptor( + this.nodeProto, + 'ownerDocument' + ); + } overrideTextContent() { this.ctx.overrideDescriptor(this.nodeProto, 'textContent', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('getTextContent', event); if (event.intercepted) return event.returnValue; return event.data.value; }, - set: (target, that, [ val ]) => { + set: (target, that, [val]) => { const event = new HookEvent({ value: val }, target, that); this.emit('setTextContent', event); @@ -41,41 +66,57 @@ class NodeApi extends EventEmitter { target.call(that, event.data.value); }, }); - }; + } overrideAppend() { - this.ctx.override(this.nodeProto, 'append', (target, that, [ ...nodes ]) => { - const event = new HookEvent({ nodes }, target, that); - this.emit('append', event); + this.ctx.override( + this.nodeProto, + 'append', + (target, that, [...nodes]) => { + const event = new HookEvent({ nodes }, target, that); + this.emit('append', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.nodes); - }); - this.ctx.override(this.nodeProto, 'appendChild', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ node ] = args; + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.nodes); + } + ); + this.ctx.override( + this.nodeProto, + 'appendChild', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [node] = args; - const event = new HookEvent({ node }, target, that); - this.emit('appendChild', event); + const event = new HookEvent({ node }, target, that); + this.emit('appendChild', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.node); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.node); + } + ); + } overrideBaseURI() { this.ctx.overrideDescriptor(this.nodeProto, 'baseURI', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('baseURI', event); if (event.intercepted) return event.returnValue; return event.data.value; }, - }) - }; + }); + } overrideParent() { this.ctx.overrideDescriptor(this.nodeProto, 'parentNode', { get: (target, that) => { - const event = new HookEvent({ node: target.call(that) }, target, that); + const event = new HookEvent( + { node: target.call(that) }, + target, + that + ); this.emit('parentNode', event); if (event.intercepted) return event.returnValue; @@ -84,38 +125,50 @@ class NodeApi extends EventEmitter { }); this.ctx.overrideDescriptor(this.nodeProto, 'parentElement', { get: (target, that) => { - const event = new HookEvent({ element: target.call(that) }, target, that); + const event = new HookEvent( + { element: target.call(that) }, + target, + that + ); this.emit('parentElement', event); if (event.intercepted) return event.returnValue; return event.data.node; }, }); - }; + } overrideOwnerDocument() { this.ctx.overrideDescriptor(this.nodeProto, 'ownerDocument', { get: (target, that) => { - const event = new HookEvent({ document: target.call(that) }, target, that); + const event = new HookEvent( + { document: target.call(that) }, + target, + that + ); this.emit('ownerDocument', event); if (event.intercepted) return event.returnValue; return event.data.document; }, }); - }; + } overrideCompareDocumentPosit1ion() { - this.ctx.override(this.nodeProto, 'compareDocumentPosition', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ node ] = args; - const event = new HookEvent({ node }, target, that); + this.ctx.override( + this.nodeProto, + 'compareDocumentPosition', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [node] = args; + const event = new HookEvent({ node }, target, that); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.node); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.node); + } + ); + } overrideChildMethods() { - this.ctx.override(this.nodeProto, 'removeChild') - }; -}; + this.ctx.override(this.nodeProto, 'removeChild'); + } +} -export default NodeApi; \ No newline at end of file +export default NodeApi; diff --git a/src/client/dom/style.js b/src/client/dom/style.js index 8ef0474..01567ad 100644 --- a/src/client/dom/style.js +++ b/src/client/dom/style.js @@ -1,5 +1,5 @@ -import EventEmitter from "../events.js"; -import HookEvent from "../hook.js"; +import EventEmitter from '../events.js'; +import HookEvent from '../hook.js'; class StyleApi extends EventEmitter { constructor(ctx) { @@ -10,9 +10,29 @@ class StyleApi extends EventEmitter { this.cssStyleProto = this.CSSStyleDeclaration.prototype || {}; this.getPropertyValue = this.cssStyleProto.getPropertyValue || null; this.setProperty = this.cssStyleProto.setProperty || null; - this.cssText - ctx.nativeMethods.getOwnPropertyDescriptors(this.cssStyleProto, 'cssText'); - this.urlProps = ['background', 'backgroundImage', 'borderImage', 'borderImageSource', 'listStyle', 'listStyleImage', 'cursor']; - this.dashedUrlProps = ['background', 'background-image', 'border-image', 'border-image-source', 'list-style', 'list-style-image', 'cursor']; + this.cssText - + ctx.nativeMethods.getOwnPropertyDescriptors( + this.cssStyleProto, + 'cssText' + ); + this.urlProps = [ + 'background', + 'backgroundImage', + 'borderImage', + 'borderImageSource', + 'listStyle', + 'listStyleImage', + 'cursor', + ]; + this.dashedUrlProps = [ + 'background', + 'background-image', + 'border-image', + 'border-image-source', + 'list-style', + 'list-style-image', + 'cursor', + ]; this.propToDashed = { background: 'background', backgroundImage: 'background-image', @@ -20,42 +40,58 @@ class StyleApi extends EventEmitter { borderImageSource: 'border-image-source', listStyle: 'list-style', listStyleImage: 'list-style-image', - cursor: 'cursor' + cursor: 'cursor', }; - }; + } overrideSetGetProperty() { - this.ctx.override(this.cssStyleProto, 'getPropertyValue', (target, that, args) => { - if (!args.length) return target.apply(that, args); + this.ctx.override( + this.cssStyleProto, + 'getPropertyValue', + (target, that, args) => { + if (!args.length) return target.apply(that, args); - let [ property ] = args; + let [property] = args; - const event = new HookEvent({ property }, target, that); - this.emit('getPropertyValue', event); + const event = new HookEvent({ property }, target, that); + this.emit('getPropertyValue', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.property); - }); - this.ctx.override(this.cssStyleProto, 'setProperty', (target, that, args) => { - if (2 > args.length) return target.apply(that, args); - let [ property, value ] = args; + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.property); + } + ); + this.ctx.override( + this.cssStyleProto, + 'setProperty', + (target, that, args) => { + if (2 > args.length) return target.apply(that, args); + let [property, value] = args; - const event = new HookEvent({ property, value }, target, that); - this.emit('setProperty', event); + const event = new HookEvent({ property, value }, target, that); + this.emit('setProperty', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.property, event.data.value); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.property, + event.data.value + ); + } + ); + } overrideCssText() { this.ctx.overrideDescriptor(this.cssStyleProto, 'cssText', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('getCssText', event); if (event.intercepted) return event.returnValue; return event.data.value; }, - set: (target, that, [ val ]) => { + set: (target, that, [val]) => { const event = new HookEvent({ value: val }, target, that); this.emit('setCssText', event); @@ -63,7 +99,7 @@ class StyleApi extends EventEmitter { return event.target.call(event.that, event.data.value); }, }); - }; -}; + } +} -export default StyleApi; \ No newline at end of file +export default StyleApi; diff --git a/src/client/events.js b/src/client/events.js index b9be953..196b9e4 100644 --- a/src/client/events.js +++ b/src/client/events.js @@ -21,37 +21,41 @@ 'use strict'; -var R = typeof Reflect === 'object' ? Reflect : null -var ReflectApply = R && typeof R.apply === 'function' - ? R.apply - : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - } +var R = typeof Reflect === 'object' ? Reflect : null; +var ReflectApply = + R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + }; -var ReflectOwnKeys +var ReflectOwnKeys; if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys + ReflectOwnKeys = R.ownKeys; } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target) - .concat(Object.getOwnPropertySymbols(target)); - }; + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target).concat( + Object.getOwnPropertySymbols(target) + ); + }; } else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; } function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); + if (console && console.warn) console.warn(warning); } -var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; -} +var NumberIsNaN = + Number.isNaN || + function NumberIsNaN(value) { + return value !== value; + }; function EventEmitter() { - EventEmitter.init.call(this); + EventEmitter.init.call(this); } export default EventEmitter; @@ -68,430 +72,451 @@ EventEmitter.prototype._maxListeners = undefined; var defaultMaxListeners = 10; function checkListener(listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } + if (typeof listener !== 'function') { + throw new TypeError( + 'The "listener" argument must be of type Function. Received type ' + + typeof listener + ); + } } Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - defaultMaxListeners = arg; - } + enumerable: true, + get: function () { + return defaultMaxListeners; + }, + set: function (arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError( + 'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + + arg + + '.' + ); + } + defaultMaxListeners = arg; + }, }); -EventEmitter.init = function() { +EventEmitter.init = function () { + if ( + this._events === undefined || + this._events === Object.getPrototypeOf(this)._events + ) { + this._events = Object.create(null); + this._eventsCount = 0; + } - if (this._events === undefined || - this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; + this._maxListeners = this._maxListeners || undefined; }; // Obviously not all Emitters should be limited to 10. This function allows // that to be increased. Set to zero for unlimited. EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - this._maxListeners = n; - return this; + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError( + 'The value of "n" is out of range. It must be a non-negative number. Received ' + + n + + '.' + ); + } + this._maxListeners = n; + return this; }; function _getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; } EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); + return _getMaxListeners(this); }; EventEmitter.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = (type === 'error'); + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = type === 'error'; - var events = this._events; - if (events !== undefined) - doError = (doError && events.error === undefined); - else if (!doError) - return false; + var events = this._events; + if (events !== undefined) doError = doError && events.error === undefined; + else if (!doError) return false; - // If there is no 'error' event listener then throw. - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error( + 'Unhandled error.' + (er ? ' (' + er.message + ')' : '') + ); + err.context = er; + throw err; // Unhandled 'error' event } - // At least give some kind of context to the user - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - var handler = events[type]; + var handler = events[type]; - if (handler === undefined) - return false; + if (handler === undefined) return false; - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args); + } - return true; + return true; }; function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; + var m; + var events; + var existing; - checkListener(listener); + checkListener(listener); - events = target._events; - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; } else { - existing.push(listener); + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit( + 'newListener', + type, + listener.listener ? listener.listener : listener + ); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; } - // Check for listener leak - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + String(type) + ' listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = prepend + ? [listener, existing] + : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } - return target; + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error( + 'Possible EventEmitter memory leak detected. ' + + existing.length + + ' ' + + String(type) + + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit' + ); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; } EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); + return _addListener(this, type, listener, false); }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; +EventEmitter.prototype.prependListener = function prependListener( + type, + listener +) { + return _addListener(this, type, listener, true); +}; function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } } function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; + var state = { + fired: false, + wrapFn: undefined, + target: target, + type: type, + listener: listener, + }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; } EventEmitter.prototype.once = function once(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; }; -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; +EventEmitter.prototype.prependOnceListener = function prependOnceListener( + type, + listener +) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; +}; // Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; +EventEmitter.prototype.removeListener = function removeListener( + type, + listener +) { + var list, events, position, i, originalListener; - checkListener(listener); + checkListener(listener); - events = this._events; - if (events === undefined) - return this; + events = this._events; + if (events === undefined) return this; - list = events[type]; - if (list === undefined) - return this; + list = events[type]; + if (list === undefined) return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = Object.create(null); + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) this._events = Object.create(null); else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); } - } else if (typeof list !== 'function') { + } else if (typeof list !== 'function') { position = -1; for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } } - if (position < 0) - return this; + if (position < 0) return this; - if (position === 0) - list.shift(); + if (position === 0) list.shift(); else { - spliceOne(list, position); + spliceOne(list, position); } - if (list.length === 1) - events[type] = list[0]; + if (list.length === 1) events[type] = list[0]; if (events.removeListener !== undefined) - this.emit('removeListener', type, originalListener || listener); - } + this.emit('removeListener', type, originalListener || listener); + } - return this; - }; + return this; +}; EventEmitter.prototype.off = EventEmitter.prototype.removeListener; -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; +EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { + var listeners, events, i; - events = this._events; - if (events === undefined) - return this; + events = this._events; + if (events === undefined) return this; - // not listening for removeListener, no need to emit - if (events.removeListener === undefined) { + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) this._events = Object.create(null); - else - delete events[type]; + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) this._events = Object.create(null); + else delete events[type]; } return this; - } + } - // emit removeListener for all listeners on all events - if (arguments.length === 0) { + // emit removeListener for all listeners on all events + if (arguments.length === 0) { var keys = Object.keys(events); var key; for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = Object.create(null); this._eventsCount = 0; return this; - } + } - listeners = events[type]; + listeners = events[type]; - if (typeof listeners === 'function') { + if (typeof listeners === 'function') { this.removeListener(type, listeners); - } else if (listeners !== undefined) { + } else if (listeners !== undefined) { // LIFO order for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); + this.removeListener(type, listeners[i]); } - } + } - return this; - }; + return this; +}; function _listeners(target, type, unwrap) { - var events = target._events; + var events = target._events; - if (events === undefined) - return []; + if (events === undefined) return []; - var evlistener = events[type]; - if (evlistener === undefined) - return []; + var evlistener = events[type]; + if (evlistener === undefined) return []; - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? - unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); + return unwrap + ? unwrapListeners(evlistener) + : arrayClone(evlistener, evlistener.length); } EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); + return _listeners(this, type, true); }; EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); + return _listeners(this, type, false); }; -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } +EventEmitter.listenerCount = function (emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } }; EventEmitter.prototype.listenerCount = listenerCount; function listenerCount(type) { - var events = this._events; + var events = this._events; - if (events !== undefined) { - var evlistener = events[type]; + if (events !== undefined) { + var evlistener = events[type]; - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } } - } - return 0; + return 0; } EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; }; function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; + var copy = new Array(n); + for (var i = 0; i < n; ++i) copy[i] = arr[i]; + return copy; } function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); + for (; index + 1 < list.length; index++) list[index] = list[index + 1]; + list.pop(); } function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; } function once(emitter, name) { - return new Promise(function (resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } - function resolver() { - if (typeof emitter.removeListener === 'function') { - emitter.removeListener('error', errorListener); - } - resolve([].slice.call(arguments)); - }; + function resolver() { + if (typeof emitter.removeListener === 'function') { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + } - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== 'error') { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== 'error') { + addErrorHandlerIfEventEmitter(emitter, errorListener, { + once: true, + }); + } + }); } function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === 'function') { - eventTargetAgnosticAddListener(emitter, 'error', handler, flags); - } + if (typeof emitter.on === 'function') { + eventTargetAgnosticAddListener(emitter, 'error', handler, flags); + } } function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === 'function') { - if (flags.once) { - emitter.once(name, listener); + if (typeof emitter.on === 'function') { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === 'function') { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); } else { - emitter.on(name, listener); + throw new TypeError( + 'The "emitter" argument must be of type EventEmitter. Received type ' + + typeof emitter + ); } - } else if (typeof emitter.addEventListener === 'function') { - // EventTarget does not have `error` event semantics like Node - // EventEmitters, we do not listen for `error` events here. - emitter.addEventListener(name, function wrapListener(arg) { - // IE does not have builtin `{ once: true }` support so we - // have to do it manually. - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } -} \ No newline at end of file +} diff --git a/src/client/history.js b/src/client/history.js index 3b83c7c..6e93ac5 100644 --- a/src/client/history.js +++ b/src/client/history.js @@ -1,5 +1,5 @@ -import EventEmitter from "./events.js"; -import HookEvent from "./hook.js"; +import EventEmitter from './events.js'; +import HookEvent from './hook.js'; class History extends EventEmitter { constructor(ctx) { @@ -14,47 +14,73 @@ class History extends EventEmitter { this.go = this.historyProto.go; this.back = this.historyProto.back; this.forward = this.historyProto.forward; - }; + } override() { this.overridePushState(); this.overrideReplaceState(); this.overrideGo(); this.overrideForward(); this.overrideBack(); - }; + } overridePushState() { - this.ctx.override(this.historyProto, 'pushState', (target, that, args) => { - if (2 > args.length) return target.apply(that, args); - let [ state, title, url = '' ] = args; + this.ctx.override( + this.historyProto, + 'pushState', + (target, that, args) => { + if (2 > args.length) return target.apply(that, args); + let [state, title, url = ''] = args; - const event = new HookEvent({ state, title, url }, target, that); - this.emit('pushState', event); + const event = new HookEvent( + { state, title, url }, + target, + that + ); + this.emit('pushState', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.state, event.data.title, event.data.url); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.state, + event.data.title, + event.data.url + ); + } + ); + } overrideReplaceState() { - this.ctx.override(this.historyProto, 'replaceState', (target, that, args) => { - if (2 > args.length) return target.apply(that, args); - let [ state, title, url = '' ] = args; + this.ctx.override( + this.historyProto, + 'replaceState', + (target, that, args) => { + if (2 > args.length) return target.apply(that, args); + let [state, title, url = ''] = args; - const event = new HookEvent({ state, title, url }, target, that); - this.emit('replaceState', event); + const event = new HookEvent( + { state, title, url }, + target, + that + ); + this.emit('replaceState', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.state, event.data.title, event.data.url); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.state, + event.data.title, + event.data.url + ); + } + ); + } overrideGo() { - this.ctx.override(this.historyProto, 'go', (target, that, [ delta ]) => { + this.ctx.override(this.historyProto, 'go', (target, that, [delta]) => { const event = new HookEvent({ delta }, target, that); this.emit('go', event); if (event.intercepted) return event.returnValue; return event.target.call(event.that, event.data.delta); }); - }; + } overrideForward() { this.ctx.override(this.historyProto, 'forward', (target, that) => { const event = new HookEvent(null, target, that); @@ -63,7 +89,7 @@ class History extends EventEmitter { if (event.intercepted) return event.returnValue; return event.target.call(event.that); }); - }; + } overrideBack() { this.ctx.override(this.historyProto, 'back', (target, that) => { const event = new HookEvent(null, target, that); @@ -72,7 +98,7 @@ class History extends EventEmitter { if (event.intercepted) return event.returnValue; return event.target.call(event.that); }); - }; -}; + } +} -export default History; \ No newline at end of file +export default History; diff --git a/src/client/hook.js b/src/client/hook.js index aa82975..5b9539a 100644 --- a/src/client/hook.js +++ b/src/client/hook.js @@ -7,17 +7,17 @@ class HookEvent { this.data = data; this.target = target; this.that = that; - }; + } get intercepted() { return this.#intercepted; - }; + } get returnValue() { return this.#returnValue; - }; + } respondWith(input) { this.#returnValue = input; this.#intercepted = true; - }; -}; + } +} -export default HookEvent; \ No newline at end of file +export default HookEvent; diff --git a/src/client/index.js b/src/client/index.js index 4e01903..333eec0 100644 --- a/src/client/index.js +++ b/src/client/index.js @@ -1,22 +1,22 @@ -import DocumentHook from "./dom/document.js"; -import ElementApi from "./dom/element.js"; -import NodeApi from "./dom/node.js"; -import AttrApi from "./dom/attr.js"; -import FunctionHook from "./native/function.js"; -import ObjectHook from "./native/object.js"; -import Fetch from "./requests/fetch.js"; -import WebSocketApi from "./requests/websocket.js"; -import Xhr from "./requests/xhr.js"; -import EventSourceApi from "./requests/eventsource.js"; -import History from "./history.js"; -import LocationApi from "./location.js"; -import MessageApi from "./message.js"; -import NavigatorApi from "./navigator.js"; -import Workers from "./worker.js"; -import URLApi from "./url.js"; -import EventEmitter from "./events.js"; -import StorageApi from "./storage.js"; -import StyleApi from "./dom/style.js"; +import DocumentHook from './dom/document.js'; +import ElementApi from './dom/element.js'; +import NodeApi from './dom/node.js'; +import AttrApi from './dom/attr.js'; +import FunctionHook from './native/function.js'; +import ObjectHook from './native/object.js'; +import Fetch from './requests/fetch.js'; +import WebSocketApi from './requests/websocket.js'; +import Xhr from './requests/xhr.js'; +import EventSourceApi from './requests/eventsource.js'; +import History from './history.js'; +import LocationApi from './location.js'; +import MessageApi from './message.js'; +import NavigatorApi from './navigator.js'; +import Workers from './worker.js'; +import URLApi from './url.js'; +import EventEmitter from './events.js'; +import StorageApi from './storage.js'; +import StyleApi from './dom/style.js'; class UVClient extends EventEmitter { constructor(window = self, worker = !window.window) { @@ -25,8 +25,10 @@ class UVClient extends EventEmitter { this.nativeMethods = { fnToString: this.window.Function.prototype.toString, defineProperty: this.window.Object.defineProperty, - getOwnPropertyDescriptor: this.window.Object.getOwnPropertyDescriptor, - getOwnPropertyDescriptors: this.window.Object.getOwnPropertyDescriptors, + getOwnPropertyDescriptor: + this.window.Object.getOwnPropertyDescriptor, + getOwnPropertyDescriptors: + this.window.Object.getOwnPropertyDescriptors, getOwnPropertyNames: this.window.Object.getOwnPropertyNames, keys: this.window.Object.keys, getOwnPropertySymbols: this.window.Object.getOwnPropertySymbols, @@ -41,7 +43,7 @@ class UVClient extends EventEmitter { this.xhr = new Xhr(this); this.history = new History(this); this.element = new ElementApi(this); - this.node = new NodeApi(this) + this.node = new NodeApi(this); this.document = new DocumentHook(this); this.function = new FunctionHook(this); this.object = new ObjectHook(this); @@ -55,56 +57,70 @@ class UVClient extends EventEmitter { this.location = new LocationApi(this); this.storage = new StorageApi(this); this.style = new StyleApi(this); - }; + } initLocation(rewriteUrl, sourceUrl) { - this.location = new LocationApi(this, sourceUrl, rewriteUrl, this.worker); - }; + this.location = new LocationApi( + this, + sourceUrl, + rewriteUrl, + this.worker + ); + } override(obj, prop, wrapper, construct) { if (!prop in obj) return false; const wrapped = this.wrap(obj, prop, wrapper, construct); - return obj[prop] = wrapped; - }; + return (obj[prop] = wrapped); + } overrideDescriptor(obj, prop, wrapObj = {}) { const wrapped = this.wrapDescriptor(obj, prop, wrapObj); if (!wrapped) return {}; this.nativeMethods.defineProperty(obj, prop, wrapped); return wrapped; - }; + } wrap(obj, prop, wrap, construct) { const fn = obj[prop]; if (!fn) return fn; - const wrapped = 'prototype' in fn ? function attach() { - return wrap(fn, this, [...arguments]); - } : { - attach() { - return wrap(fn, this, [...arguments]); - }, - }.attach; + const wrapped = + 'prototype' in fn + ? function attach() { + return wrap(fn, this, [...arguments]); + } + : { + attach() { + return wrap(fn, this, [...arguments]); + }, + }.attach; if (!!construct) { wrapped.prototype = fn.prototype; - wrapped.prototype.constructor = wrapped; - }; + wrapped.prototype.constructor = wrapped; + } this.emit('wrap', fn, wrapped, !!construct); return wrapped; - }; + } wrapDescriptor(obj, prop, wrapObj = {}) { - const descriptor = this.nativeMethods.getOwnPropertyDescriptor(obj, prop); + const descriptor = this.nativeMethods.getOwnPropertyDescriptor( + obj, + prop + ); if (!descriptor) return false; for (let key in wrapObj) { if (key in descriptor) { if (key === 'get' || key === 'set') { descriptor[key] = this.wrap(descriptor, key, wrapObj[key]); } else { - descriptor[key] = typeof wrapObj[key] == 'function' ? wrapObj[key](descriptor[key]) : wrapObj[key]; - }; + descriptor[key] = + typeof wrapObj[key] == 'function' + ? wrapObj[key](descriptor[key]) + : wrapObj[key]; + } } - }; + } return descriptor; - }; -}; + } +} export default UVClient; -if (typeof self === 'object') self.UVClient = UVClient; \ No newline at end of file +if (typeof self === 'object') self.UVClient = UVClient; diff --git a/src/client/location.js b/src/client/location.js index 786a700..bdc10b6 100644 --- a/src/client/location.js +++ b/src/client/location.js @@ -1,4 +1,4 @@ -import EventEmitter from "./events.js"; +import EventEmitter from './events.js'; class LocationApi extends EventEmitter { constructor(ctx) { @@ -6,29 +6,45 @@ class LocationApi extends EventEmitter { this.ctx = ctx; this.window = ctx.window; this.location = this.window.location; - this.WorkerLocation = this.ctx.worker ? this.window.WorkerLocation : null; - this.workerLocProto = this.WorkerLocation ? this.WorkerLocation.prototype : {}; - this.keys = ['href', 'protocol', 'host', 'hostname', 'port', 'pathname', 'search', 'hash', 'origin']; + this.WorkerLocation = this.ctx.worker + ? this.window.WorkerLocation + : null; + this.workerLocProto = this.WorkerLocation + ? this.WorkerLocation.prototype + : {}; + this.keys = [ + 'href', + 'protocol', + 'host', + 'hostname', + 'port', + 'pathname', + 'search', + 'hash', + 'origin', + ]; this.HashChangeEvent = this.window.HashChangeEvent || null; - this.href = this.WorkerLocation ? ctx.nativeMethods.getOwnPropertyDescriptor(this.workerLocProto, 'href') : - ctx.nativeMethods.getOwnPropertyDescriptor(this.location, 'href'); - }; + this.href = this.WorkerLocation + ? ctx.nativeMethods.getOwnPropertyDescriptor( + this.workerLocProto, + 'href' + ) + : ctx.nativeMethods.getOwnPropertyDescriptor(this.location, 'href'); + } overrideWorkerLocation(parse) { if (!this.WorkerLocation) return false; const uv = this; - + for (const key of this.keys) { this.ctx.overrideDescriptor(this.workerLocProto, key, { get: (target, that) => { - return parse( - uv.href.get.call(this.location) - )[key] + return parse(uv.href.get.call(this.location))[key]; }, }); - }; + } return true; - }; + } emulate(parse, wrap) { const emulation = {}; const that = this; @@ -36,81 +52,124 @@ class LocationApi extends EventEmitter { for (const key of that.keys) { this.ctx.nativeMethods.defineProperty(emulation, key, { get() { - return parse( - that.href.get.call(that.location) - )[key]; + return parse(that.href.get.call(that.location))[key]; }, - set: key !== 'origin' ? function (val) { - switch(key) { - case 'href': - that.location.href = wrap(val); - break; - case 'hash': - that.emit('hashchange', emulation.href, (val.trim().startsWith('#') ? new URL(val.trim(), emulation.href).href : new URL('#' + val.trim(), emulation.href).href), that); - break; - default: - const url = new URL(emulation.href); - url[key] = val; - that.location.href = wrap(url.href); - }; - } : undefined, + set: + key !== 'origin' + ? function (val) { + switch (key) { + case 'href': + that.location.href = wrap(val); + break; + case 'hash': + that.emit( + 'hashchange', + emulation.href, + val.trim().startsWith('#') + ? new URL( + val.trim(), + emulation.href + ).href + : new URL( + '#' + val.trim(), + emulation.href + ).href, + that + ); + break; + default: + const url = new URL(emulation.href); + url[key] = val; + that.location.href = wrap(url.href); + } + } + : undefined, configurable: false, enumerable: true, }); - }; + } if ('reload' in this.location) { this.ctx.nativeMethods.defineProperty(emulation, 'reload', { - value: this.ctx.wrap(this.location, 'reload', (target, that) => { - return target.call(that === emulation ? this.location : that); - }), + value: this.ctx.wrap( + this.location, + 'reload', + (target, that) => { + return target.call( + that === emulation ? this.location : that + ); + } + ), writable: false, enumerable: true, }); - }; + } if ('replace' in this.location) { this.ctx.nativeMethods.defineProperty(emulation, 'replace', { - value: this.ctx.wrap(this.location, 'assign', (target, that, args) => { - if (!args.length || that !== emulation) target.call(that); - that = this.location; - let [ input ] = args; - - const url = new URL(input, emulation.href); - return target.call(that === emulation ? this.location : that, wrap(url.href)); - }), + value: this.ctx.wrap( + this.location, + 'assign', + (target, that, args) => { + if (!args.length || that !== emulation) + target.call(that); + that = this.location; + let [input] = args; + + const url = new URL(input, emulation.href); + return target.call( + that === emulation ? this.location : that, + wrap(url.href) + ); + } + ), writable: false, enumerable: true, }); - }; + } if ('assign' in this.location) { this.ctx.nativeMethods.defineProperty(emulation, 'assign', { - value: this.ctx.wrap(this.location, 'assign', (target, that, args) => { - if (!args.length || that !== emulation) target.call(that); - that = this.location; - let [ input ] = args; - - const url = new URL(input, emulation.href); - return target.call(that === emulation ? this.location : that, wrap(url.href)); - }), + value: this.ctx.wrap( + this.location, + 'assign', + (target, that, args) => { + if (!args.length || that !== emulation) + target.call(that); + that = this.location; + let [input] = args; + + const url = new URL(input, emulation.href); + return target.call( + that === emulation ? this.location : that, + wrap(url.href) + ); + } + ), writable: false, enumerable: true, }); - }; - + } + if ('ancestorOrigins' in this.location) { - this.ctx.nativeMethods.defineProperty(emulation, 'ancestorOrigins', { - get() { - const arr = []; - if (that.window.DOMStringList) that.ctx.nativeMethods.setPrototypeOf(arr, that.window.DOMStringList.prototype); - return arr; - }, - set: undefined, - enumerable: true, - }); - }; - + this.ctx.nativeMethods.defineProperty( + emulation, + 'ancestorOrigins', + { + get() { + const arr = []; + if (that.window.DOMStringList) + that.ctx.nativeMethods.setPrototypeOf( + arr, + that.window.DOMStringList.prototype + ); + return arr; + }, + set: undefined, + enumerable: true, + } + ); + } this.ctx.nativeMethods.defineProperty(emulation, 'toString', { value: this.ctx.wrap(this.location, 'toString', () => { @@ -124,12 +183,16 @@ class LocationApi extends EventEmitter { value: () => emulation.href, writable: false, enumerable: false, - }); + }); - if (this.ctx.window.Location) this.ctx.nativeMethods.setPrototypeOf(emulation, this.ctx.window.Location.prototype); + if (this.ctx.window.Location) + this.ctx.nativeMethods.setPrototypeOf( + emulation, + this.ctx.window.Location.prototype + ); - return emulation; - }; -}; + return emulation; + } +} -export default LocationApi; \ No newline at end of file +export default LocationApi; diff --git a/src/client/message.js b/src/client/message.js index 4f41717..08d7243 100644 --- a/src/client/message.js +++ b/src/client/message.js @@ -1,5 +1,5 @@ -import EventEmitter from "./events.js"; -import HookEvent from "./hook.js"; +import EventEmitter from './events.js'; +import HookEvent from './hook.js'; class MessageApi extends EventEmitter { constructor(ctx) { @@ -12,9 +12,15 @@ class MessageApi extends EventEmitter { this.mpProto = this.MessagePort.prototype || {}; this.mpPostMessage = this.mpProto.postMessage; this.messageProto = this.MessageEvent.prototype || {}; - this.messageData = ctx.nativeMethods.getOwnPropertyDescriptor(this.messageProto, 'data'); - this.messageOrigin = ctx.nativeMethods.getOwnPropertyDescriptor(this.messageProto, 'origin'); - }; + this.messageData = ctx.nativeMethods.getOwnPropertyDescriptor( + this.messageProto, + 'data' + ); + this.messageOrigin = ctx.nativeMethods.getOwnPropertyDescriptor( + this.messageProto, + 'origin' + ); + } overridePostMessage() { this.ctx.override(this.window, 'postMessage', (target, that, args) => { if (!args.length) return target.apply(that, args); @@ -22,63 +28,102 @@ class MessageApi extends EventEmitter { let message; let origin; let transfer; - - if (!this.ctx.worker) { - [ message, origin, transfer = [] ] = args; - } else { - [ message, transfer = [] ] = args; - }; - const event = new HookEvent({ message, origin, transfer, worker: this.ctx.worker }, target, that); + if (!this.ctx.worker) { + [message, origin, transfer = []] = args; + } else { + [message, transfer = []] = args; + } + + const event = new HookEvent( + { message, origin, transfer, worker: this.ctx.worker }, + target, + that + ); this.emit('postMessage', event); if (event.intercepted) return event.returnValue; - return this.ctx.worker ? event.target.call(event.that, event.data.message, event.data.transfer) : event.target.call(event.that, event.data.message, event.data.origin, event.data.transfer); + return this.ctx.worker + ? event.target.call( + event.that, + event.data.message, + event.data.transfer + ) + : event.target.call( + event.that, + event.data.message, + event.data.origin, + event.data.transfer + ); }); - }; + } wrapPostMessage(obj, prop, noOrigin = false) { return this.ctx.wrap(obj, prop, (target, that, args) => { - if (this.ctx.worker ? !args.length : 2 > args) return target.apply(that, args); + if (this.ctx.worker ? !args.length : 2 > args) + return target.apply(that, args); let message; let origin; let transfer; - - if (!noOrigin) { - [ message, origin, transfer = [] ] = args; - } else { - [ message, transfer = [] ] = args; - origin = null; - }; - const event = new HookEvent({ message, origin, transfer, worker: this.ctx.worker }, target, obj); + if (!noOrigin) { + [message, origin, transfer = []] = args; + } else { + [message, transfer = []] = args; + origin = null; + } + + const event = new HookEvent( + { message, origin, transfer, worker: this.ctx.worker }, + target, + obj + ); this.emit('postMessage', event); if (event.intercepted) return event.returnValue; - return noOrigin ? event.target.call(event.that, event.data.message, event.data.transfer) : event.target.call(event.that, event.data.message, event.data.origin, event.data.transfer); + return noOrigin + ? event.target.call( + event.that, + event.data.message, + event.data.transfer + ) + : event.target.call( + event.that, + event.data.message, + event.data.origin, + event.data.transfer + ); }); - }; + } overrideMessageOrigin() { this.ctx.overrideDescriptor(this.messageProto, 'origin', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('origin', event); - + if (event.intercepted) return event.returnValue; return event.data.value; - } + }, }); - }; + } overrideMessageData() { this.ctx.overrideDescriptor(this.messageProto, 'data', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('data', event); - + if (event.intercepted) return event.returnValue; return event.data.value; - } + }, }); - }; -}; + } +} -export default MessageApi; \ No newline at end of file +export default MessageApi; diff --git a/src/client/native/function.js b/src/client/native/function.js index 8b85ea6..7e350bb 100644 --- a/src/client/native/function.js +++ b/src/client/native/function.js @@ -1,5 +1,5 @@ -import EventEmitter from "../events.js"; -import HookEvent from "../hook.js"; +import EventEmitter from '../events.js'; +import HookEvent from '../hook.js'; class FunctionHook extends EventEmitter { constructor(ctx) { @@ -13,25 +13,38 @@ class FunctionHook extends EventEmitter { this.call = this.fnProto.call; this.apply = this.fnProto.apply; this.bind = this.fnProto.bind; - }; + } overrideFunction() { - this.ctx.override(this.window, 'Function', (target, that, args) => { - if (!args.length) return target.apply(that, args); + this.ctx.override( + this.window, + 'Function', + (target, that, args) => { + if (!args.length) return target.apply(that, args); - let script = args[args.length - 1]; - let fnArgs = []; + let script = args[args.length - 1]; + let fnArgs = []; - for (let i = 0; i < args.length - 1; i++) { - fnArgs.push(args[i]); - }; + for (let i = 0; i < args.length - 1; i++) { + fnArgs.push(args[i]); + } - const event = new HookEvent({ script, args: fnArgs }, target, that); - this.emit('function', event); + const event = new HookEvent( + { script, args: fnArgs }, + target, + that + ); + this.emit('function', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, ...event.data.args, event.data.script); - }, true); - }; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + ...event.data.args, + event.data.script + ); + }, + true + ); + } overrideToString() { this.ctx.override(this.fnProto, 'toString', (target, that) => { const event = new HookEvent({ fn: that }, target, that); @@ -40,7 +53,7 @@ class FunctionHook extends EventEmitter { if (event.intercepted) return event.returnValue; return event.target.call(event.data.fn); }); - }; -}; + } +} -export default FunctionHook; \ No newline at end of file +export default FunctionHook; diff --git a/src/client/native/object.js b/src/client/native/object.js index 1cd6caa..e94bd33 100644 --- a/src/client/native/object.js +++ b/src/client/native/object.js @@ -1,5 +1,5 @@ -import EventEmitter from "../events.js"; -import HookEvent from "../hook.js"; +import EventEmitter from '../events.js'; +import HookEvent from '../hook.js'; class ObjectHook extends EventEmitter { constructor(ctx) { @@ -10,31 +10,47 @@ class ObjectHook extends EventEmitter { this.getOwnPropertyDescriptors = this.Object.getOwnPropertyDescriptors; this.getOwnPropertyDescriptor = this.Object.getOwnPropertyDescriptor; this.getOwnPropertyNames = this.Object.getOwnPropertyNames; - }; + } overrideGetPropertyNames() { - this.ctx.override(this.Object, 'getOwnPropertyNames', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ object ] = args; + this.ctx.override( + this.Object, + 'getOwnPropertyNames', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [object] = args; - const event = new HookEvent({ names: target.call(that, object) }, target, that); - this.emit('getOwnPropertyNames', event); - - if (event.intercepted) return event.returnValue; - return event.data.names; - }); - }; + const event = new HookEvent( + { names: target.call(that, object) }, + target, + that + ); + this.emit('getOwnPropertyNames', event); + + if (event.intercepted) return event.returnValue; + return event.data.names; + } + ); + } overrideGetOwnPropertyDescriptors() { - this.ctx.override(this.Object, 'getOwnPropertyDescriptors', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ object ] = args; + this.ctx.override( + this.Object, + 'getOwnPropertyDescriptors', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [object] = args; - const event = new HookEvent({ descriptors: target.call(that, object) }, target, that); - this.emit('getOwnPropertyDescriptors', event); - - if (event.intercepted) return event.returnValue; - return event.data.descriptors; - }); - }; -}; + const event = new HookEvent( + { descriptors: target.call(that, object) }, + target, + that + ); + this.emit('getOwnPropertyDescriptors', event); -export default ObjectHook; \ No newline at end of file + if (event.intercepted) return event.returnValue; + return event.data.descriptors; + } + ); + } +} + +export default ObjectHook; diff --git a/src/client/navigator.js b/src/client/navigator.js index 1bf217b..77a3f1d 100644 --- a/src/client/navigator.js +++ b/src/client/navigator.js @@ -1,5 +1,5 @@ -import EventEmitter from "./events.js"; -import HookEvent from "./hook.js"; +import EventEmitter from './events.js'; +import HookEvent from './hook.js'; class NavigatorApi extends EventEmitter { constructor(ctx) { @@ -10,19 +10,23 @@ class NavigatorApi extends EventEmitter { this.Navigator = this.window.Navigator || {}; this.navProto = this.Navigator.prototype || {}; this.sendBeacon = this.navProto.sendBeacon; - }; + } overrideSendBeacon() { this.ctx.override(this.navProto, 'sendBeacon', (target, that, args) => { if (!args.length) return target.apply(that, args); - let [ url, data = '' ] = args; + let [url, data = ''] = args; const event = new HookEvent({ url, data }, target, that); this.emit('sendBeacon', event); if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.url, event.data.data); + return event.target.call( + event.that, + event.data.url, + event.data.data + ); }); - }; -}; + } +} -export default NavigatorApi; \ No newline at end of file +export default NavigatorApi; diff --git a/src/client/requests/eventsource.js b/src/client/requests/eventsource.js index 0b928fd..bf3d009 100644 --- a/src/client/requests/eventsource.js +++ b/src/client/requests/eventsource.js @@ -1,5 +1,5 @@ -import EventEmitter from "../events.js"; -import HookEvent from "../hook.js"; +import EventEmitter from '../events.js'; +import HookEvent from '../hook.js'; class EventSourceApi extends EventEmitter { constructor(ctx) { @@ -8,38 +8,50 @@ class EventSourceApi extends EventEmitter { this.window = ctx.window; this.EventSource = this.window.EventSource || {}; this.esProto = this.EventSource.prototype || {}; - this.url = ctx.nativeMethods.getOwnPropertyDescriptor(this.esProto, 'url'); + this.url = ctx.nativeMethods.getOwnPropertyDescriptor( + this.esProto, + 'url' + ); this.CONNECTING = 0; this.OPEN = 1; this.CLOSED = 2; - }; + } overrideConstruct() { - this.ctx.override(this.window, 'EventSource', (target, that, args) => { - if (!args.length) return new target(...args); - let [ url, config = {} ] = args; + this.ctx.override( + this.window, + 'EventSource', + (target, that, args) => { + if (!args.length) return new target(...args); + let [url, config = {}] = args; - const event = new HookEvent({ url, config }, target, that); - this.emit('construct', event); + const event = new HookEvent({ url, config }, target, that); + this.emit('construct', event); - if (event.intercepted) return event.returnValue; - return new event.target(event.data.url, event.data.config); - }, true); + if (event.intercepted) return event.returnValue; + return new event.target(event.data.url, event.data.config); + }, + true + ); if ('EventSource' in this.window) { this.window.EventSource.CONNECTING = this.CONNECTING; this.window.EventSource.OPEN = this.OPEN; this.window.EventSource.CLOSED = this.CLOSED; - }; - }; + } + } overrideUrl() { this.ctx.overrideDescriptor(this.esProto, 'url', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); - this.emit('url', event); - return event.data.value; + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); + this.emit('url', event); + return event.data.value; }, }); - }; -}; + } +} -export default EventSourceApi; \ No newline at end of file +export default EventSourceApi; diff --git a/src/client/requests/fetch.js b/src/client/requests/fetch.js index bf3e626..c2b20c6 100644 --- a/src/client/requests/fetch.js +++ b/src/client/requests/fetch.js @@ -1,5 +1,5 @@ -import EventEmitter from "../events.js"; -import HookEvent from "../hook.js"; +import EventEmitter from '../events.js'; +import HookEvent from '../hook.js'; class Fetch extends EventEmitter { constructor(ctx) { @@ -13,49 +13,75 @@ class Fetch extends EventEmitter { this.reqProto = this.Request ? this.Request.prototype : {}; this.resProto = this.Response ? this.Response.prototype : {}; this.headersProto = this.Headers ? this.Headers.prototype : {}; - this.reqUrl = ctx.nativeMethods.getOwnPropertyDescriptor(this.reqProto, 'url'); - this.resUrl = ctx.nativeMethods.getOwnPropertyDescriptor(this.resProto, 'url'); - this.reqHeaders = ctx.nativeMethods.getOwnPropertyDescriptor(this.reqProto, 'headers'); - this.resHeaders = ctx.nativeMethods.getOwnPropertyDescriptor(this.resProto, 'headers'); - }; + this.reqUrl = ctx.nativeMethods.getOwnPropertyDescriptor( + this.reqProto, + 'url' + ); + this.resUrl = ctx.nativeMethods.getOwnPropertyDescriptor( + this.resProto, + 'url' + ); + this.reqHeaders = ctx.nativeMethods.getOwnPropertyDescriptor( + this.reqProto, + 'headers' + ); + this.resHeaders = ctx.nativeMethods.getOwnPropertyDescriptor( + this.resProto, + 'headers' + ); + } override() { this.overrideRequest(); this.overrideUrl(); this.overrideHeaders(); return true; - }; + } overrideRequest() { if (!this.fetch) return false; this.ctx.override(this.window, 'fetch', (target, that, args) => { - if (!args.length || args[0] instanceof this.Request) return target.apply(that, args); + if (!args.length || args[0] instanceof this.Request) + return target.apply(that, args); - let [ input, options = {} ] = args; + let [input, options = {}] = args; const event = new HookEvent({ input, options }, target, that); this.emit('request', event); if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.input, event.data.options); + return event.target.call( + event.that, + event.data.input, + event.data.options + ); }); - this.ctx.override(this.window, 'Request', (target, that, args) => { - if (!args.length) return new target(...args); + this.ctx.override( + this.window, + 'Request', + (target, that, args) => { + if (!args.length) return new target(...args); - let [ input, options = {} ] = args; - const event = new HookEvent({ input, options }, target); + let [input, options = {}] = args; + const event = new HookEvent({ input, options }, target); - this.emit('request', event); - if (event.intercepted) return event.returnValue; + this.emit('request', event); + if (event.intercepted) return event.returnValue; - return new event.target(event.data.input, event.data.options); - }, true); + return new event.target(event.data.input, event.data.options); + }, + true + ); return true; - }; + } overrideUrl() { this.ctx.overrideDescriptor(this.reqProto, 'url', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('requestUrl', event); if (event.intercepted) return event.returnValue; @@ -66,7 +92,11 @@ class Fetch extends EventEmitter { this.ctx.overrideDescriptor(this.resProto, 'url', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('responseUrl', event); if (event.intercepted) return event.returnValue; @@ -75,35 +105,47 @@ class Fetch extends EventEmitter { }, }); return true; - }; + } overrideHeaders() { if (!this.Headers) return false; - + this.ctx.overrideDescriptor(this.reqProto, 'headers', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('requestHeaders', event); if (event.intercepted) return event.returnValue; return event.data.value; - }, + }, }); this.ctx.overrideDescriptor(this.resProto, 'headers', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('responseHeaders', event); if (event.intercepted) return event.returnValue; return event.data.value; - }, + }, }); - this.ctx.override(this.headersProto, 'get', (target, that, [ name ]) => { + this.ctx.override(this.headersProto, 'get', (target, that, [name]) => { if (!name) return target.call(that); - const event = new HookEvent({ name, value: target.call(that, name) }, target, that); + const event = new HookEvent( + { name, value: target.call(that, name) }, + target, + that + ); this.emit('getHeader', event); if (event.intercepted) return event.returnValue; @@ -114,20 +156,28 @@ class Fetch extends EventEmitter { this.ctx.override(this.headersProto, 'set', (target, that, args) => { if (2 > args.length) return target.apply(that, args); - let [ name, value ] = args; + let [name, value] = args; const event = new HookEvent({ name, value }, target, that); this.emit('setHeader', event); if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name, event.data.value); + return event.target.call( + event.that, + event.data.name, + event.data.value + ); }); this.ctx.override(this.headersProto, 'has', (target, that, args) => { if (!args.length) return target.call(that); - let [ name ] = args; + let [name] = args; - const event = new HookEvent({ name, value: target.call(that, name) }, target, that); + const event = new HookEvent( + { name, value: target.call(that, name) }, + target, + that + ); this.emit('hasHeader', event); if (event.intercepted) return event.returnValue; @@ -138,19 +188,23 @@ class Fetch extends EventEmitter { this.ctx.override(this.headersProto, 'append', (target, that, args) => { if (2 > args.length) return target.apply(that, args); - let [ name, value ] = args; + let [name, value] = args; const event = new HookEvent({ name, value }, target, that); this.emit('appendHeader', event); if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name, event.data.value); + return event.target.call( + event.that, + event.data.name, + event.data.value + ); }); this.ctx.override(this.headersProto, 'delete', (target, that, args) => { if (!args.length) return target.apply(that, args); - let [ name ] = args; + let [name] = args; const event = new HookEvent({ name }, target, that); this.emit('deleteHeader', event); @@ -160,7 +214,7 @@ class Fetch extends EventEmitter { }); return true; - }; -}; + } +} -export default Fetch; \ No newline at end of file +export default Fetch; diff --git a/src/client/requests/websocket.js b/src/client/requests/websocket.js index 9ba34df..9b6f63a 100644 --- a/src/client/requests/websocket.js +++ b/src/client/requests/websocket.js @@ -1,5 +1,5 @@ -import EventEmitter from "../events.js"; -import HookEvent from "../hook.js"; +import EventEmitter from '../events.js'; +import HookEvent from '../hook.js'; class WebSocketApi extends EventEmitter { constructor(ctx) { @@ -8,51 +8,71 @@ class WebSocketApi extends EventEmitter { this.window = ctx.window; this.WebSocket = this.window.WebSocket || {}; this.wsProto = this.WebSocket.prototype || {}; - this.url = ctx.nativeMethods.getOwnPropertyDescriptor(this.wsProto, 'url'); - this.protocol = ctx.nativeMethods.getOwnPropertyDescriptor(this.wsProto, 'protocol'); + this.url = ctx.nativeMethods.getOwnPropertyDescriptor( + this.wsProto, + 'url' + ); + this.protocol = ctx.nativeMethods.getOwnPropertyDescriptor( + this.wsProto, + 'protocol' + ); this.send = this.wsProto.send; this.close = this.wsProto.close; this.CONNECTING = 0; this.OPEN = 1; this.CLOSING = 2; this.CLOSED = 3; - }; + } overrideWebSocket() { - this.ctx.override(this.window, 'WebSocket', (target, that, args) => { - if (!args.length) return new target(...args); - let [ url, protocols = [] ] = args; + this.ctx.override( + this.window, + 'WebSocket', + (target, that, args) => { + if (!args.length) return new target(...args); + let [url, protocols = []] = args; - if (!this.ctx.nativeMethods.isArray(protocols)) protocols = [ protocols ]; - const event = new HookEvent({ url, protocols }, target, that); - this.emit('websocket', event); + if (!this.ctx.nativeMethods.isArray(protocols)) + protocols = [protocols]; + const event = new HookEvent({ url, protocols }, target, that); + this.emit('websocket', event); - if (event.intercepted) return event.returnValue; - return new event.target(event.data.url, event.data.protocols); - }, true); + if (event.intercepted) return event.returnValue; + return new event.target(event.data.url, event.data.protocols); + }, + true + ); this.window.WebSocket.CONNECTING = this.CONNECTING; this.window.WebSocket.OPEN = this.OPEN; this.window.WebSocket.CLOSING = this.CLOSING; this.window.WebSocket.CLOSED = this.CLOSED; - }; + } overrideUrl() { this.ctx.overrideDescriptor(this.wsProto, 'url', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); - this.emit('url', event); - return event.data.value; + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); + this.emit('url', event); + return event.data.value; }, }); - }; + } overrideProtocol() { this.ctx.overrideDescriptor(this.wsProto, 'protocol', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); - this.emit('protocol', event); - return event.data.value; + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); + this.emit('protocol', event); + return event.data.value; }, }); - }; -}; + } +} -export default WebSocketApi; \ No newline at end of file +export default WebSocketApi; diff --git a/src/client/requests/xhr.js b/src/client/requests/xhr.js index 493b71c..66638e0 100644 --- a/src/client/requests/xhr.js +++ b/src/client/requests/xhr.js @@ -1,5 +1,5 @@ -import EventEmitter from "../events.js"; -import HookEvent from "../hook.js"; +import EventEmitter from '../events.js'; +import HookEvent from '../hook.js'; class Xhr extends EventEmitter { constructor(ctx) { @@ -7,17 +7,25 @@ class Xhr extends EventEmitter { this.ctx = ctx; this.window = ctx.window; this.XMLHttpRequest = this.window.XMLHttpRequest; - this.xhrProto = this.window.XMLHttpRequest ? this.window.XMLHttpRequest.prototype : {}; + this.xhrProto = this.window.XMLHttpRequest + ? this.window.XMLHttpRequest.prototype + : {}; this.open = this.xhrProto.open; this.abort = this.xhrProto.abort; this.send = this.xhrProto.send; - this.overrideMimeType = this.xhrProto.overrideMimeType + this.overrideMimeType = this.xhrProto.overrideMimeType; this.getAllResponseHeaders = this.xhrProto.getAllResponseHeaders; this.getResponseHeader = this.xhrProto.getResponseHeader; this.setRequestHeader = this.xhrProto.setRequestHeader; - this.responseURL = ctx.nativeMethods.getOwnPropertyDescriptor(this.xhrProto, 'responseURL'); - this.responseText = ctx.nativeMethods.getOwnPropertyDescriptor(this.xhrProto, 'responseText'); - }; + this.responseURL = ctx.nativeMethods.getOwnPropertyDescriptor( + this.xhrProto, + 'responseURL' + ); + this.responseText = ctx.nativeMethods.getOwnPropertyDescriptor( + this.xhrProto, + 'responseText' + ); + } override() { this.overrideOpen(); this.overrideSend(); @@ -25,85 +33,119 @@ class Xhr extends EventEmitter { this.overrideGetResHeader(); this.overrideGetResHeaders(); this.overrideSetReqHeader(); - }; + } overrideOpen() { this.ctx.override(this.xhrProto, 'open', (target, that, args) => { if (2 > args.length) return target.apply(that, args); - let [ method, input, async = true, user = null, password = null ] = args; - const event = new HookEvent({ method, input, async, user, password }, target, that); + let [method, input, async = true, user = null, password = null] = + args; + const event = new HookEvent( + { method, input, async, user, password }, + target, + that + ); this.emit('open', event); if (event.intercepted) return event.returnValue; return event.target.call( - event.that, - event.data.method, - event.data.input, - event.data.async, - event.data.user, + event.that, + event.data.method, + event.data.input, + event.data.async, + event.data.user, event.data.password ); }); - }; + } overrideResponseUrl() { this.ctx.overrideDescriptor(this.xhrProto, 'responseURL', { get: (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); this.emit('responseUrl', event); if (event.intercepted) return event.returnValue; return event.data.value; }, }); - }; + } overrideSend() { - this.ctx.override(this.xhrProto, 'send', (target, that, [ body = null ]) => { - const event = new HookEvent({ body }, target, that); + this.ctx.override( + this.xhrProto, + 'send', + (target, that, [body = null]) => { + const event = new HookEvent({ body }, target, that); - this.emit('send', event); - if (event.intercepted) return event.returnValue; + this.emit('send', event); + if (event.intercepted) return event.returnValue; - return event.target.call( - event.that, - event.data.body, - ); - }); - }; + return event.target.call(event.that, event.data.body); + } + ); + } overrideSetReqHeader() { - this.ctx.override(this.xhrProto, 'setRequestHeader', (target, that, args) => { - if (2 > args.length) return target.apply(that, args); + this.ctx.override( + this.xhrProto, + 'setRequestHeader', + (target, that, args) => { + if (2 > args.length) return target.apply(that, args); - let [ name, value ] = args; - const event = new HookEvent({ name, value }, target, that); + let [name, value] = args; + const event = new HookEvent({ name, value }, target, that); - this.emit('setReqHeader', event); - if (event.intercepted) return event.returnValue; + this.emit('setReqHeader', event); + if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name, event.data.value); - }); - }; + return event.target.call( + event.that, + event.data.name, + event.data.value + ); + } + ); + } overrideGetResHeaders() { - this.ctx.override(this.xhrProto, 'getAllResponseHeaders', (target, that) => { - const event = new HookEvent({ value: target.call(that) }, target, that); + this.ctx.override( + this.xhrProto, + 'getAllResponseHeaders', + (target, that) => { + const event = new HookEvent( + { value: target.call(that) }, + target, + that + ); - this.emit('getAllResponseHeaders', event); - if (event.intercepted) return event.returnValue; + this.emit('getAllResponseHeaders', event); + if (event.intercepted) return event.returnValue; - return event.data.value; - }); - }; + return event.data.value; + } + ); + } overrideGetResHeader() { - this.ctx.override(this.xhrProto, 'getResponseHeader', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ name ] = args; + this.ctx.override( + this.xhrProto, + 'getResponseHeader', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [name] = args; - const event = new HookEvent({ name, value: target.call(that, name) }, target, that); - if (event.intercepted) return event.returnValue; + const event = new HookEvent( + { name, value: target.call(that, name) }, + target, + that + ); + if (event.intercepted) return event.returnValue; - return event.data.value; - }); - }; -}; + return event.data.value; + } + ); + } +} -export default Xhr \ No newline at end of file +export default Xhr; diff --git a/src/client/storage.js b/src/client/storage.js index 52a5827..feea283 100644 --- a/src/client/storage.js +++ b/src/client/storage.js @@ -1,5 +1,5 @@ -import EventEmitter from "./events.js"; -import HookEvent from "./hook.js"; +import EventEmitter from './events.js'; +import HookEvent from './hook.js'; class StorageApi extends EventEmitter { constructor(ctx) { @@ -17,73 +17,110 @@ class StorageApi extends EventEmitter { this.key = this.storeProto.key || null; this.methods = ['key', 'getItem', 'setItem', 'removeItem', 'clear']; this.wrappers = new ctx.nativeMethods.Map(); - }; + } overrideMethods() { this.ctx.override(this.storeProto, 'getItem', (target, that, args) => { - if (!args.length) return target.apply((this.wrappers.get(that) || that), args); - let [ name ] = args; + if (!args.length) + return target.apply(this.wrappers.get(that) || that, args); + let [name] = args; - const event = new HookEvent({ name }, target, (this.wrappers.get(that) || that)); + const event = new HookEvent( + { name }, + target, + this.wrappers.get(that) || that + ); this.emit('getItem', event); if (event.intercepted) return event.returnValue; return event.target.call(event.that, event.data.name); }); this.ctx.override(this.storeProto, 'setItem', (target, that, args) => { - if (2 > args.length) return target.apply((this.wrappers.get(that) || that), args); - let [ name, value ] = args; + if (2 > args.length) + return target.apply(this.wrappers.get(that) || that, args); + let [name, value] = args; - const event = new HookEvent({ name, value }, target, (this.wrappers.get(that) || that)); + const event = new HookEvent( + { name, value }, + target, + this.wrappers.get(that) || that + ); this.emit('setItem', event); if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name, event.data.value); + return event.target.call( + event.that, + event.data.name, + event.data.value + ); }); - this.ctx.override(this.storeProto, 'removeItem', (target, that, args) => { - if (!args.length) return target.apply((this.wrappers.get(that) || that), args); - let [ name ] = args; + this.ctx.override( + this.storeProto, + 'removeItem', + (target, that, args) => { + if (!args.length) + return target.apply(this.wrappers.get(that) || that, args); + let [name] = args; - const event = new HookEvent({ name }, target, (this.wrappers.get(that) || that)); - this.emit('removeItem', event); + const event = new HookEvent( + { name }, + target, + this.wrappers.get(that) || that + ); + this.emit('removeItem', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.name); - }); + if (event.intercepted) return event.returnValue; + return event.target.call(event.that, event.data.name); + } + ); this.ctx.override(this.storeProto, 'clear', (target, that) => { - const event = new HookEvent(null, target, (this.wrappers.get(that) || that)); + const event = new HookEvent( + null, + target, + this.wrappers.get(that) || that + ); this.emit('clear', event); if (event.intercepted) return event.returnValue; return event.target.call(event.that); }); this.ctx.override(this.storeProto, 'key', (target, that, args) => { - if (!args.length) return target.apply((this.wrappers.get(that) || that), args); - let [ index ] = args; + if (!args.length) + return target.apply(this.wrappers.get(that) || that, args); + let [index] = args; - const event = new HookEvent({ index }, target, (this.wrappers.get(that) || that)); + const event = new HookEvent( + { index }, + target, + this.wrappers.get(that) || that + ); this.emit('key', event); if (event.intercepted) return event.returnValue; return event.target.call(event.that, event.data.index); }); - }; + } overrideLength() { this.ctx.overrideDescriptor(this.storeProto, 'length', { get: (target, that) => { - const event = new HookEvent({ length: target.call((this.wrappers.get(that) || that)) }, target, (this.wrappers.get(that) || that)); + const event = new HookEvent( + { length: target.call(this.wrappers.get(that) || that) }, + target, + this.wrappers.get(that) || that + ); this.emit('length', event); - + if (event.intercepted) return event.returnValue; return event.data.length; }, }); - }; + } emulate(storage, obj = {}) { this.ctx.nativeMethods.setPrototypeOf(obj, this.storeProto); const proxy = new this.ctx.window.Proxy(obj, { get: (target, prop) => { - if (prop in this.storeProto || typeof prop === 'symbol') return storage[prop]; + if (prop in this.storeProto || typeof prop === 'symbol') + return storage[prop]; const event = new HookEvent({ name: prop }, null, storage); this.emit('get', event); @@ -92,14 +129,19 @@ class StorageApi extends EventEmitter { return storage[event.data.name]; }, set: (target, prop, value) => { - if (prop in this.storeProto || typeof prop === 'symbol') return storage[prop] = value; + if (prop in this.storeProto || typeof prop === 'symbol') + return (storage[prop] = value); - const event = new HookEvent({ name: prop, value }, null, storage); + const event = new HookEvent( + { name: prop, value }, + null, + storage + ); this.emit('set', event); if (event.intercepted) return event.returnValue; - return storage[event.data.name] = event.data.value; + return (storage[event.data.name] = event.data.value); }, deleteProperty: (target, prop) => { if (typeof prop === 'symbol') return delete storage[prop]; @@ -112,13 +154,12 @@ class StorageApi extends EventEmitter { return delete storage[event.data.name]; }, }); - + this.wrappers.set(proxy, storage); this.ctx.nativeMethods.setPrototypeOf(proxy, this.storeProto); return proxy; - }; - -}; + } +} export default StorageApi; diff --git a/src/client/url.js b/src/client/url.js index bb6e747..16f1482 100644 --- a/src/client/url.js +++ b/src/client/url.js @@ -1,5 +1,5 @@ -import EventEmitter from "./events.js"; -import HookEvent from "./hook.js"; +import EventEmitter from './events.js'; +import HookEvent from './hook.js'; class URLApi extends EventEmitter { constructor(ctx) { @@ -9,11 +9,11 @@ class URLApi extends EventEmitter { this.URL = this.window.URL || {}; this.createObjectURL = this.URL.createObjectURL; this.revokeObjectURL = this.URL.revokeObjectURL; - }; + } overrideObjectURL() { this.ctx.override(this.URL, 'createObjectURL', (target, that, args) => { if (!args.length) return target.apply(that, args); - let [ object ] = args; + let [object] = args; const event = new HookEvent({ object }, target, that); this.emit('createObjectURL', event); @@ -23,7 +23,7 @@ class URLApi extends EventEmitter { }); this.ctx.override(this.URL, 'revokeObjectURL', (target, that, args) => { if (!args.length) return target.apply(that, args); - let [ url ] = args; + let [url] = args; const event = new HookEvent({ url }, target, that); this.emit('revokeObjectURL', event); @@ -31,7 +31,7 @@ class URLApi extends EventEmitter { if (event.intercepted) return event.returnValue; return event.target.call(event.that, event.data.url); }); - }; -}; + } +} -export default URLApi; \ No newline at end of file +export default URLApi; diff --git a/src/client/worker.js b/src/client/worker.js index f567a2b..340acbf 100644 --- a/src/client/worker.js +++ b/src/client/worker.js @@ -1,5 +1,5 @@ -import EventEmitter from "./events.js"; -import HookEvent from "./hook.js"; +import EventEmitter from './events.js'; +import HookEvent from './hook.js'; class Workers extends EventEmitter { constructor(ctx) { @@ -13,54 +13,85 @@ class Workers extends EventEmitter { this.postMessage = this.workerProto.postMessage; this.terminate = this.workerProto.terminate; this.addModule = this.workletProto.addModule; - }; + } overrideWorker() { - this.ctx.override(this.window, 'Worker', (target, that, args) => { - if (!args.length) return new target(...args); - let [ url, options = {} ] = args; + this.ctx.override( + this.window, + 'Worker', + (target, that, args) => { + if (!args.length) return new target(...args); + let [url, options = {}] = args; - const event = new HookEvent({ url, options }, target, that); - this.emit('worker', event); + const event = new HookEvent({ url, options }, target, that); + this.emit('worker', event); - if (event.intercepted) return event.returnValue; - return new event.target(...[ event.data.url, event.data.options ]); - }, true); - }; + if (event.intercepted) return event.returnValue; + return new event.target( + ...[event.data.url, event.data.options] + ); + }, + true + ); + } overrideAddModule() { - this.ctx.override(this.workletProto, 'addModule', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ url, options = {} ] = args; + this.ctx.override( + this.workletProto, + 'addModule', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [url, options = {}] = args; - const event = new HookEvent({ url, options }, target, that); - this.emit('addModule', event); + const event = new HookEvent({ url, options }, target, that); + this.emit('addModule', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.url, event.data.options); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.url, + event.data.options + ); + } + ); + } overridePostMessage() { - this.ctx.override(this.workerProto, 'postMessage', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [ message, transfer = [] ] = args; + this.ctx.override( + this.workerProto, + 'postMessage', + (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [message, transfer = []] = args; - const event = new HookEvent({ message, transfer }, target, that); - this.emit('postMessage', event); + const event = new HookEvent( + { message, transfer }, + target, + that + ); + this.emit('postMessage', event); - if (event.intercepted) return event.returnValue; - return event.target.call(event.that, event.data.message, event.data.transfer); - }); - }; + if (event.intercepted) return event.returnValue; + return event.target.call( + event.that, + event.data.message, + event.data.transfer + ); + } + ); + } overrideImportScripts() { - this.ctx.override(this.window, 'importScripts', (target, that, scripts) => { - if (!scripts.length) return target.apply(that, scripts); + this.ctx.override( + this.window, + 'importScripts', + (target, that, scripts) => { + if (!scripts.length) return target.apply(that, scripts); - const event = new HookEvent({ scripts }, target, that); - this.emit('importScripts', event); + const event = new HookEvent({ scripts }, target, that); + this.emit('importScripts', event); - if (event.intercepted) return event.returnValue; - return event.target.apply(event.that, event.data.scripts); - }); - }; -}; + if (event.intercepted) return event.returnValue; + return event.target.apply(event.that, event.data.scripts); + } + ); + } +} -export default Workers; \ No newline at end of file +export default Workers; diff --git a/src/rewrite/codecs.js b/src/rewrite/codecs.js index 6a18abd..96367d0 100644 --- a/src/rewrite/codecs.js +++ b/src/rewrite/codecs.js @@ -3,15 +3,30 @@ // Do not use any browser or node-specific API! // ------------------------------------------------------------- export const xor = { - encode(str){ + encode(str) { if (!str) return str; - return encodeURIComponent(str.toString().split('').map((char, ind) => ind % 2 ? String.fromCharCode(char.charCodeAt() ^ 2) : char).join('')); + return encodeURIComponent( + str + .toString() + .split('') + .map((char, ind) => + ind % 2 ? String.fromCharCode(char.charCodeAt() ^ 2) : char + ) + .join('') + ); }, - decode(str){ + decode(str) { if (!str) return str; - let [ input, ...search ] = str.split('?'); + let [input, ...search] = str.split('?'); - return decodeURIComponent(input).split('').map((char, ind) => ind % 2 ? String.fromCharCode(char.charCodeAt(0) ^ 2) : char).join('') + (search.length ? '?' + search.join('?') : ''); + return ( + decodeURIComponent(input) + .split('') + .map((char, ind) => + ind % 2 ? String.fromCharCode(char.charCodeAt(0) ^ 2) : char + ) + .join('') + (search.length ? '?' + search.join('?') : '') + ); }, }; @@ -27,48 +42,132 @@ export const plain = { }; export const base64 = { - encode(str){ + encode(str) { if (!str) return str; str = str.toString(); - const b64chs = Array.from('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='); + const b64chs = Array.from( + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' + ); let u32; - let c0; - let c1; - let c2; + let c0; + let c1; + let c2; let asc = ''; let pad = str.length % 3; - - for (let i = 0; i < str.length;) { - if((c0 = str.charCodeAt(i++)) > 255 || (c1 = str.charCodeAt(i++)) > 255 || (c2 = str.charCodeAt(i++)) > 255)throw new TypeError('invalid character found'); + + for (let i = 0; i < str.length; ) { + if ( + (c0 = str.charCodeAt(i++)) > 255 || + (c1 = str.charCodeAt(i++)) > 255 || + (c2 = str.charCodeAt(i++)) > 255 + ) + throw new TypeError('invalid character found'); u32 = (c0 << 16) | (c1 << 8) | c2; - asc += b64chs[u32 >> 18 & 63] - + b64chs[u32 >> 12 & 63] - + b64chs[u32 >> 6 & 63] - + b64chs[u32 & 63]; + asc += + b64chs[(u32 >> 18) & 63] + + b64chs[(u32 >> 12) & 63] + + b64chs[(u32 >> 6) & 63] + + b64chs[u32 & 63]; } - - return encodeURIComponent(pad ? asc.slice(0, pad - 3) + '==='.substr(pad) : asc); + + return encodeURIComponent( + pad ? asc.slice(0, pad - 3) + '==='.substr(pad) : asc + ); }, - decode(str){ + decode(str) { if (!str) return str; str = decodeURIComponent(str.toString()); - const b64tab = {"0":52,"1":53,"2":54,"3":55,"4":56,"5":57,"6":58,"7":59,"8":60,"9":61,"A":0,"B":1,"C":2,"D":3,"E":4,"F":5,"G":6,"H":7,"I":8,"J":9,"K":10,"L":11,"M":12,"N":13,"O":14,"P":15,"Q":16,"R":17,"S":18,"T":19,"U":20,"V":21,"W":22,"X":23,"Y":24,"Z":25,"a":26,"b":27,"c":28,"d":29,"e":30,"f":31,"g":32,"h":33,"i":34,"j":35,"k":36,"l":37,"m":38,"n":39,"o":40,"p":41,"q":42,"r":43,"s":44,"t":45,"u":46,"v":47,"w":48,"x":49,"y":50,"z":51,"+":62,"/":63,"=":64}; - str = str.replace(/\s+/g, ''); + const b64tab = { + 0: 52, + 1: 53, + 2: 54, + 3: 55, + 4: 56, + 5: 57, + 6: 58, + 7: 59, + 8: 60, + 9: 61, + A: 0, + B: 1, + C: 2, + D: 3, + E: 4, + F: 5, + G: 6, + H: 7, + I: 8, + J: 9, + K: 10, + L: 11, + M: 12, + N: 13, + O: 14, + P: 15, + Q: 16, + R: 17, + S: 18, + T: 19, + U: 20, + V: 21, + W: 22, + X: 23, + Y: 24, + Z: 25, + a: 26, + b: 27, + c: 28, + d: 29, + e: 30, + f: 31, + g: 32, + h: 33, + i: 34, + j: 35, + k: 36, + l: 37, + m: 38, + n: 39, + o: 40, + p: 41, + q: 42, + r: 43, + s: 44, + t: 45, + u: 46, + v: 47, + w: 48, + x: 49, + y: 50, + z: 51, + '+': 62, + '/': 63, + '=': 64, + }; + str = str.replace(/\s+/g, ''); str += '=='.slice(2 - (str.length & 3)); let u24; let bin = ''; let r1; let r2; - - for (let i = 0; i < str.length;) { - u24 = b64tab[str.charAt(i++)] << 18 - | b64tab[str.charAt(i++)] << 12 - | (r1 = b64tab[str.charAt(i++)]) << 6 - | (r2 = b64tab[str.charAt(i++)]); - bin += r1 === 64 ? String.fromCharCode(u24 >> 16 & 255) - : r2 === 64 ? String.fromCharCode(u24 >> 16 & 255, u24 >> 8 & 255) - : String.fromCharCode(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255); - }; + + for (let i = 0; i < str.length; ) { + u24 = + (b64tab[str.charAt(i++)] << 18) | + (b64tab[str.charAt(i++)] << 12) | + ((r1 = b64tab[str.charAt(i++)]) << 6) | + (r2 = b64tab[str.charAt(i++)]); + bin += + r1 === 64 + ? String.fromCharCode((u24 >> 16) & 255) + : r2 === 64 + ? String.fromCharCode((u24 >> 16) & 255, (u24 >> 8) & 255) + : String.fromCharCode( + (u24 >> 16) & 255, + (u24 >> 8) & 255, + u24 & 255 + ); + } return bin; }, -}; \ No newline at end of file +}; diff --git a/src/rewrite/cookie.js b/src/rewrite/cookie.js index af9c593..f63a49d 100644 --- a/src/rewrite/cookie.js +++ b/src/rewrite/cookie.js @@ -8,17 +8,16 @@ function validateCookie(cookie, meta, js = false) { if (cookie.httpOnly && !!js) return false; if (cookie.domain.startsWith('.')) { - if (!meta.url.hostname.endsWith(cookie.domain.slice(1))) return false; return true; - }; + } if (cookie.domain !== meta.url.hostname) return false; if (cookie.secure && meta.url.protocol === 'http:') return false; if (!meta.url.pathname.startsWith(cookie.path)) return false; return true; -}; +} async function db(openDB) { const db = await openDB('__op', 1, { @@ -31,8 +30,7 @@ async function db(openDB) { }); db.transaction(['cookies'], 'readwrite').store.index('path'); return db; -}; - +} function serialize(cookies = [], meta, js) { let str = ''; @@ -40,56 +38,55 @@ function serialize(cookies = [], meta, js) { if (!validateCookie(cookie, meta, js)) continue; if (str.length) str += '; '; str += cookie.name; - str += '=' + str += '='; str += cookie.value; - }; + } return str; -}; +} async function getCookies(db) { const now = new Date(); - return (await db.getAll('cookies')).filter(cookie => { - + return (await db.getAll('cookies')).filter((cookie) => { let expired = false; if (cookie.set) { if (cookie.maxAge) { - expired = (cookie.set.getTime() + (cookie.maxAge * 1e3)) < now; + expired = cookie.set.getTime() + cookie.maxAge * 1e3 < now; } else if (cookie.expires) { expired = new Date(cookie.expires.toLocaleString()) < now; - }; - }; + } + } if (expired) { db.delete('cookies', cookie.id); return false; - }; + } - return true; + return true; }); -}; +} function setCookies(data, db, meta) { if (!db) return false; const cookies = setCookie(data, { decodeValues: false, - }) - + }); + for (const cookie of cookies) { if (!cookie.domain) cookie.domain = '.' + meta.url.hostname; if (!cookie.path) cookie.path = '/'; if (!cookie.domain.startsWith('.')) { cookie.domain = '.' + cookie.domain; - }; + } db.put('cookies', { - ...cookie, + ...cookie, id: `${cookie.domain}@${cookie.path}@${cookie.name}`, set: new Date(Date.now()), }); - }; + } return true; -}; +} -export { validateCookie, getCookies, setCookies, db , serialize }; \ No newline at end of file +export { validateCookie, getCookies, setCookies, db, serialize }; diff --git a/src/rewrite/css.js b/src/rewrite/css.js index 5d7dd47..3fd669d 100644 --- a/src/rewrite/css.js +++ b/src/rewrite/css.js @@ -1,6 +1,6 @@ -import { parse, walk, generate } from "css-tree"; -import EventEmitter from "./events.js"; -import parsel from "./parsel.js"; +import { parse, walk, generate } from 'css-tree'; +import EventEmitter from './events.js'; +import parsel from './parsel.js'; class CSS extends EventEmitter { constructor(ctx) { @@ -11,26 +11,29 @@ class CSS extends EventEmitter { this.parse = parse; this.walk = walk; this.generate = generate; - }; + } rewrite(str, options) { return this.recast(str, options, 'rewrite'); - }; + } source(str, options) { return this.recast(str, options, 'source'); - }; + } recast(str, options, type) { if (!str) return str; str = new String(str).toString(); try { - const ast = this.parse(str, { ...options, parseCustomProperty: true }); - this.walk(ast, node => { + const ast = this.parse(str, { + ...options, + parseCustomProperty: true, + }); + this.walk(ast, (node) => { this.emit(node.type, node, options, type); }); return this.generate(ast); - } catch(e) { + } catch (e) { return str; - }; - }; -}; + } + } +} -export default CSS; \ No newline at end of file +export default CSS; diff --git a/src/rewrite/events.js b/src/rewrite/events.js index b9be953..196b9e4 100644 --- a/src/rewrite/events.js +++ b/src/rewrite/events.js @@ -21,37 +21,41 @@ 'use strict'; -var R = typeof Reflect === 'object' ? Reflect : null -var ReflectApply = R && typeof R.apply === 'function' - ? R.apply - : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - } +var R = typeof Reflect === 'object' ? Reflect : null; +var ReflectApply = + R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + }; -var ReflectOwnKeys +var ReflectOwnKeys; if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys + ReflectOwnKeys = R.ownKeys; } else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target) - .concat(Object.getOwnPropertySymbols(target)); - }; + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target).concat( + Object.getOwnPropertySymbols(target) + ); + }; } else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; } function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); + if (console && console.warn) console.warn(warning); } -var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; -} +var NumberIsNaN = + Number.isNaN || + function NumberIsNaN(value) { + return value !== value; + }; function EventEmitter() { - EventEmitter.init.call(this); + EventEmitter.init.call(this); } export default EventEmitter; @@ -68,430 +72,451 @@ EventEmitter.prototype._maxListeners = undefined; var defaultMaxListeners = 10; function checkListener(listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } + if (typeof listener !== 'function') { + throw new TypeError( + 'The "listener" argument must be of type Function. Received type ' + + typeof listener + ); + } } Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - defaultMaxListeners = arg; - } + enumerable: true, + get: function () { + return defaultMaxListeners; + }, + set: function (arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError( + 'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + + arg + + '.' + ); + } + defaultMaxListeners = arg; + }, }); -EventEmitter.init = function() { +EventEmitter.init = function () { + if ( + this._events === undefined || + this._events === Object.getPrototypeOf(this)._events + ) { + this._events = Object.create(null); + this._eventsCount = 0; + } - if (this._events === undefined || - this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; + this._maxListeners = this._maxListeners || undefined; }; // Obviously not all Emitters should be limited to 10. This function allows // that to be increased. Set to zero for unlimited. EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - this._maxListeners = n; - return this; + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError( + 'The value of "n" is out of range. It must be a non-negative number. Received ' + + n + + '.' + ); + } + this._maxListeners = n; + return this; }; function _getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; } EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); + return _getMaxListeners(this); }; EventEmitter.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = (type === 'error'); + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = type === 'error'; - var events = this._events; - if (events !== undefined) - doError = (doError && events.error === undefined); - else if (!doError) - return false; + var events = this._events; + if (events !== undefined) doError = doError && events.error === undefined; + else if (!doError) return false; - // If there is no 'error' event listener then throw. - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error( + 'Unhandled error.' + (er ? ' (' + er.message + ')' : '') + ); + err.context = er; + throw err; // Unhandled 'error' event } - // At least give some kind of context to the user - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - var handler = events[type]; + var handler = events[type]; - if (handler === undefined) - return false; + if (handler === undefined) return false; - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args); + } - return true; + return true; }; function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; + var m; + var events; + var existing; - checkListener(listener); + checkListener(listener); - events = target._events; - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; } else { - existing.push(listener); + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit( + 'newListener', + type, + listener.listener ? listener.listener : listener + ); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; } - // Check for listener leak - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + String(type) + ' listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = prepend + ? [listener, existing] + : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } - return target; + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error( + 'Possible EventEmitter memory leak detected. ' + + existing.length + + ' ' + + String(type) + + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit' + ); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; } EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); + return _addListener(this, type, listener, false); }; EventEmitter.prototype.on = EventEmitter.prototype.addListener; -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; +EventEmitter.prototype.prependListener = function prependListener( + type, + listener +) { + return _addListener(this, type, listener, true); +}; function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } } function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; + var state = { + fired: false, + wrapFn: undefined, + target: target, + type: type, + listener: listener, + }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; } EventEmitter.prototype.once = function once(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; }; -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; +EventEmitter.prototype.prependOnceListener = function prependOnceListener( + type, + listener +) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; +}; // Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; +EventEmitter.prototype.removeListener = function removeListener( + type, + listener +) { + var list, events, position, i, originalListener; - checkListener(listener); + checkListener(listener); - events = this._events; - if (events === undefined) - return this; + events = this._events; + if (events === undefined) return this; - list = events[type]; - if (list === undefined) - return this; + list = events[type]; + if (list === undefined) return this; - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = Object.create(null); + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) this._events = Object.create(null); else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); } - } else if (typeof list !== 'function') { + } else if (typeof list !== 'function') { position = -1; for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } } - if (position < 0) - return this; + if (position < 0) return this; - if (position === 0) - list.shift(); + if (position === 0) list.shift(); else { - spliceOne(list, position); + spliceOne(list, position); } - if (list.length === 1) - events[type] = list[0]; + if (list.length === 1) events[type] = list[0]; if (events.removeListener !== undefined) - this.emit('removeListener', type, originalListener || listener); - } + this.emit('removeListener', type, originalListener || listener); + } - return this; - }; + return this; +}; EventEmitter.prototype.off = EventEmitter.prototype.removeListener; -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; +EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { + var listeners, events, i; - events = this._events; - if (events === undefined) - return this; + events = this._events; + if (events === undefined) return this; - // not listening for removeListener, no need to emit - if (events.removeListener === undefined) { + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) this._events = Object.create(null); - else - delete events[type]; + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) this._events = Object.create(null); + else delete events[type]; } return this; - } + } - // emit removeListener for all listeners on all events - if (arguments.length === 0) { + // emit removeListener for all listeners on all events + if (arguments.length === 0) { var keys = Object.keys(events); var key; for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); } this.removeAllListeners('removeListener'); this._events = Object.create(null); this._eventsCount = 0; return this; - } + } - listeners = events[type]; + listeners = events[type]; - if (typeof listeners === 'function') { + if (typeof listeners === 'function') { this.removeListener(type, listeners); - } else if (listeners !== undefined) { + } else if (listeners !== undefined) { // LIFO order for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); + this.removeListener(type, listeners[i]); } - } + } - return this; - }; + return this; +}; function _listeners(target, type, unwrap) { - var events = target._events; + var events = target._events; - if (events === undefined) - return []; + if (events === undefined) return []; - var evlistener = events[type]; - if (evlistener === undefined) - return []; + var evlistener = events[type]; + if (evlistener === undefined) return []; - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - return unwrap ? - unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); + return unwrap + ? unwrapListeners(evlistener) + : arrayClone(evlistener, evlistener.length); } EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); + return _listeners(this, type, true); }; EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); + return _listeners(this, type, false); }; -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } +EventEmitter.listenerCount = function (emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } }; EventEmitter.prototype.listenerCount = listenerCount; function listenerCount(type) { - var events = this._events; + var events = this._events; - if (events !== undefined) { - var evlistener = events[type]; + if (events !== undefined) { + var evlistener = events[type]; - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } } - } - return 0; + return 0; } EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; }; function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; + var copy = new Array(n); + for (var i = 0; i < n; ++i) copy[i] = arr[i]; + return copy; } function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); + for (; index + 1 < list.length; index++) list[index] = list[index + 1]; + list.pop(); } function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; } function once(emitter, name) { - return new Promise(function (resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } - function resolver() { - if (typeof emitter.removeListener === 'function') { - emitter.removeListener('error', errorListener); - } - resolve([].slice.call(arguments)); - }; + function resolver() { + if (typeof emitter.removeListener === 'function') { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + } - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== 'error') { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== 'error') { + addErrorHandlerIfEventEmitter(emitter, errorListener, { + once: true, + }); + } + }); } function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === 'function') { - eventTargetAgnosticAddListener(emitter, 'error', handler, flags); - } + if (typeof emitter.on === 'function') { + eventTargetAgnosticAddListener(emitter, 'error', handler, flags); + } } function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === 'function') { - if (flags.once) { - emitter.once(name, listener); + if (typeof emitter.on === 'function') { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === 'function') { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); } else { - emitter.on(name, listener); + throw new TypeError( + 'The "emitter" argument must be of type EventEmitter. Received type ' + + typeof emitter + ); } - } else if (typeof emitter.addEventListener === 'function') { - // EventTarget does not have `error` event semantics like Node - // EventEmitters, we do not listen for `error` events here. - emitter.addEventListener(name, function wrapListener(arg) { - // IE does not have builtin `{ once: true }` support so we - // have to do it manually. - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } -} \ No newline at end of file +} diff --git a/src/rewrite/html.js b/src/rewrite/html.js index dd6fefd..035bf80 100644 --- a/src/rewrite/html.js +++ b/src/rewrite/html.js @@ -7,75 +7,101 @@ class HTML extends EventEmitter { this.ctx = ctx; this.rewriteUrl = ctx.rewriteUrl; this.sourceUrl = ctx.sourceUrl; - }; + } rewrite(str, options = {}) { if (!str) return str; - return this.recast(str, node => { - if (node.tagName) this.emit('element', node, 'rewrite'); - if (node.attr) this.emit('attr', node, 'rewrite'); - if (node.nodeName === '#text') this.emit('text', node, 'rewrite'); - }, options) - }; + return this.recast( + str, + (node) => { + if (node.tagName) this.emit('element', node, 'rewrite'); + if (node.attr) this.emit('attr', node, 'rewrite'); + if (node.nodeName === '#text') + this.emit('text', node, 'rewrite'); + }, + options + ); + } source(str, options = {}) { if (!str) return str; - return this.recast(str, node => { - if (node.tagName) this.emit('element', node, 'source'); - if (node.attr) this.emit('attr', node, 'source'); - if (node.nodeName === '#text') this.emit('text', node, 'source'); - }, options) - }; + return this.recast( + str, + (node) => { + if (node.tagName) this.emit('element', node, 'source'); + if (node.attr) this.emit('attr', node, 'source'); + if (node.nodeName === '#text') + this.emit('text', node, 'source'); + }, + options + ); + } recast(str, fn, options = {}) { try { - const ast = (options.document ? parse : parseFragment)(new String(str).toString()); + const ast = (options.document ? parse : parseFragment)( + new String(str).toString() + ); this.iterate(ast, fn, options); return serialize(ast); - } catch(e) { + } catch (e) { return str; - }; - }; + } + } iterate(ast, fn, fnOptions) { if (!ast) return ast; - + if (ast.tagName) { const element = new P5Element(ast, false, fnOptions); fn(element); if (ast.attrs) { for (const attr of ast.attrs) { - if (!attr.skip) fn(new AttributeEvent(element, attr, fnOptions)); - }; - }; - }; + if (!attr.skip) + fn(new AttributeEvent(element, attr, fnOptions)); + } + } + } if (ast.childNodes) { for (const child of ast.childNodes) { if (!child.skip) this.iterate(child, fn, fnOptions); - }; - }; + } + } if (ast.nodeName === '#text') { - fn(new TextEvent(ast, new P5Element(ast.parentNode), false, fnOptions)); - }; + fn( + new TextEvent( + ast, + new P5Element(ast.parentNode), + false, + fnOptions + ) + ); + } return ast; - }; + } wrapSrcset(str, meta = this.ctx.meta) { - return str.split(',').map(src => { - const parts = src.trimStart().split(' '); - if (parts[0]) parts[0] = this.ctx.rewriteUrl(parts[0], meta); - return parts.join(' '); - }).join(', '); - }; + return str + .split(',') + .map((src) => { + const parts = src.trimStart().split(' '); + if (parts[0]) parts[0] = this.ctx.rewriteUrl(parts[0], meta); + return parts.join(' '); + }) + .join(', '); + } unwrapSrcset(str, meta = this.ctx.meta) { - return str.split(',').map(src => { - const parts = src.trimStart().split(' '); - if (parts[0]) parts[0] = this.ctx.sourceUrl(parts[0], meta); - return parts.join(' '); - }).join(', '); - }; + return str + .split(',') + .map((src) => { + const parts = src.trimStart().split(' '); + if (parts[0]) parts[0] = this.ctx.sourceUrl(parts[0], meta); + return parts.join(' '); + }) + .join(', '); + } static parse = parse; static parseFragment = parseFragment; - static serialize = serialize; -}; + static serialize = serialize; +} class P5Element extends EventEmitter { constructor(node, stream = false, options = {}) { @@ -83,96 +109,104 @@ class P5Element extends EventEmitter { this.stream = stream; this.node = node; this.options = options; - }; + } setAttribute(name, value) { for (const attr of this.attrs) { if (attr.name === name) { attr.value = value; return true; - }; - }; - - this.attrs.push( - { - name, - value, } - ); - }; + } + + this.attrs.push({ + name, + value, + }); + } getAttribute(name) { - const attr = this.attrs.find(attr => attr.name === name) || {}; + const attr = this.attrs.find((attr) => attr.name === name) || {}; return attr.value; - }; + } hasAttribute(name) { - return !!this.attrs.find(attr => attr.name === name); - }; + return !!this.attrs.find((attr) => attr.name === name); + } removeAttribute(name) { - const i = this.attrs.findIndex(attr => attr.name === name); + const i = this.attrs.findIndex((attr) => attr.name === name); if (typeof i !== 'undefined') this.attrs.splice(i, 1); - }; + } get tagName() { return this.node.tagName; - }; + } set tagName(val) { this.node.tagName = val; - }; + } get childNodes() { return !this.stream ? this.node.childNodes : null; - }; + } get innerHTML() { - return !this.stream ? serialize( - { - nodeName: '#document-fragment', - childNodes: this.childNodes, - } - ) : null; - }; + return !this.stream + ? serialize({ + nodeName: '#document-fragment', + childNodes: this.childNodes, + }) + : null; + } set innerHTML(val) { if (!this.stream) this.node.childNodes = parseFragment(val).childNodes; - }; + } get outerHTML() { - return !this.stream ? serialize( - { - nodeName: '#document-fragment', - childNodes: [ this ], - } - ) : null; - }; + return !this.stream + ? serialize({ + nodeName: '#document-fragment', + childNodes: [this], + }) + : null; + } set outerHTML(val) { - if (!this.stream) this.parentNode.childNodes.splice(this.parentNode.childNodes.findIndex(node => node === this.node), 1, ...parseFragment(val).childNodes); - }; + if (!this.stream) + this.parentNode.childNodes.splice( + this.parentNode.childNodes.findIndex( + (node) => node === this.node + ), + 1, + ...parseFragment(val).childNodes + ); + } get textContent() { if (this.stream) return null; let str = ''; - iterate(this.node, node => { + iterate(this.node, (node) => { if (node.nodeName === '#text') str += node.value; }); - + return str; - }; + } set textContent(val) { - if (!this.stream) this.node.childNodes = [ - { - nodeName: '#text', - value: val, - parentNode: this.node - } - ]; - }; + if (!this.stream) + this.node.childNodes = [ + { + nodeName: '#text', + value: val, + parentNode: this.node, + }, + ]; + } get nodeName() { return this.node.nodeName; - } + } get parentNode() { - return this.node.parentNode ? new P5Element(this.node.parentNode) : null; - }; + return this.node.parentNode + ? new P5Element(this.node.parentNode) + : null; + } get attrs() { return this.node.attrs; } get namespaceURI() { return this.node.namespaceURI; } -}; +} class AttributeEvent { constructor(node, attr, options = {}) { @@ -180,9 +214,9 @@ class AttributeEvent { this.attrs = node.attrs; this.node = node; this.options = options; - }; + } delete() { - const i = this.attrs.findIndex(attr => attr === this.attr); + const i = this.attrs.findIndex((attr) => attr === this.attr); this.attrs.splice(i, 1); @@ -191,25 +225,25 @@ class AttributeEvent { }); return true; - }; + } get name() { return this.attr.name; - }; + } set name(val) { this.attr.name = val; - }; + } get value() { return this.attr.value; - }; + } set value(val) { this.attr.value = val; - }; + } get deleted() { return false; - }; -}; + } +} class TextEvent { constructor(node, element, stream = false, options = {}) { @@ -217,21 +251,20 @@ class TextEvent { this.node = node; this.element = element; this.options = options; - }; + } get nodeName() { return this.node.nodeName; - } + } get parentNode() { return this.element; - }; + } get value() { return this.stream ? this.node.text : this.node.value; - }; + } set value(val) { - if (this.stream) this.node.text = val; else this.node.value = val; - }; -}; + } +} -export default HTML; \ No newline at end of file +export default HTML; diff --git a/src/rewrite/index.js b/src/rewrite/index.js index cc9f0a2..8069f8f 100644 --- a/src/rewrite/index.js +++ b/src/rewrite/index.js @@ -4,30 +4,53 @@ import JS from './js.js'; import setCookie from 'set-cookie-parser'; import { xor, base64, plain } from './codecs.js'; import mimeTypes from './mime.js'; -import { validateCookie, db, getCookies, setCookies, serialize } from './cookie.js'; -import { attributes, isUrl, isForbidden, isHtml, isSrcset, isStyle, text, injectHead, createInjection } from './rewrite.html.js'; +import { + validateCookie, + db, + getCookies, + setCookies, + serialize, +} from './cookie.js'; +import { + attributes, + isUrl, + isForbidden, + isHtml, + isSrcset, + isStyle, + text, + injectHead, + createInjection, +} from './rewrite.html.js'; import { importStyle, url } from './rewrite.css.js'; //import { call, destructureDeclaration, dynamicImport, getProperty, importDeclaration, setProperty, sourceMethods, wrapEval, wrapIdentifier } from './rewrite.script.js'; -import { dynamicImport, identifier, importDeclaration, property, unwrap, wrapEval } from './rewrite.script.js'; -import { openDB } from 'idb'; +import { + dynamicImport, + identifier, + importDeclaration, + property, + unwrap, + wrapEval, +} from './rewrite.script.js'; +import { openDB } from 'idb'; import parsel from './parsel.js'; import UVClient from '../client/index.js'; import Bowser from 'bowser'; - -const valid_chars = "!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~"; -const reserved_chars = "%"; +const valid_chars = + "!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~"; +const reserved_chars = '%'; class Ultraviolet { constructor(options = {}) { this.prefix = options.prefix || '/service/'; //this.urlRegex = /^(#|about:|data:|mailto:|javascript:)/; - this.urlRegex = /^(#|about:|data:|mailto:)/ + this.urlRegex = /^(#|about:|data:|mailto:)/; this.rewriteUrl = options.rewriteUrl || this.rewriteUrl; this.sourceUrl = options.sourceUrl || this.sourceUrl; this.encodeUrl = options.encodeUrl || this.encodeUrl; this.decodeUrl = options.decodeUrl || this.decodeUrl; - this.vanilla = 'vanilla' in options ? options.vanilla : false; + this.vanilla = 'vanilla' in options ? options.vanilla : false; this.meta = options.meta || {}; this.meta.base ||= undefined; this.meta.origin ||= ''; @@ -42,7 +65,10 @@ class Ultraviolet { this.parsel = parsel; this.openDB = this.constructor.openDB; this.Bowser = this.constructor.Bowser; - this.client = typeof self !== 'undefined' ? new UVClient((options.window || self)) : null; + this.client = + typeof self !== 'undefined' + ? new UVClient(options.window || self) + : null; this.master = '__uv'; this.dataPrefix = '__uv$'; this.attributePrefix = '__uv'; @@ -65,75 +91,86 @@ class Ultraviolet { serialize, setCookie, }; - }; + } rewriteUrl(str, meta = this.meta) { str = new String(str).trim(); if (!str || this.urlRegex.test(str)) return str; if (str.startsWith('javascript:')) { - return 'javascript:' + this.js.rewrite(str.slice('javascript:'.length)); - }; + return ( + 'javascript:' + this.js.rewrite(str.slice('javascript:'.length)) + ); + } try { - return meta.origin + this.prefix + this.encodeUrl(new URL(str, meta.base).href); - } catch(e) { + return ( + meta.origin + + this.prefix + + this.encodeUrl(new URL(str, meta.base).href) + ); + } catch (e) { return meta.origin + this.prefix + this.encodeUrl(str); - }; - }; + } + } sourceUrl(str, meta = this.meta) { if (!str || this.urlRegex.test(str)) return str; try { return new URL( - this.decodeUrl(str.slice(this.prefix.length + meta.origin.length)), + this.decodeUrl( + str.slice(this.prefix.length + meta.origin.length) + ), meta.base ).href; - } catch(e) { - return this.decodeUrl(str.slice(this.prefix.length + meta.origin.length)); - }; - }; + } catch (e) { + return this.decodeUrl( + str.slice(this.prefix.length + meta.origin.length) + ); + } + } encodeUrl(str) { return encodeURIComponent(str); - }; + } decodeUrl(str) { return decodeURIComponent(str); - }; + } encodeProtocol(protocol) { protocol = protocol.toString(); - + let result = ''; - - for(let i = 0; i < protocol.length; i++){ + + for (let i = 0; i < protocol.length; i++) { const char = protocol[i]; - - if(valid_chars.includes(char) && !reserved_chars.includes(char)){ + + if (valid_chars.includes(char) && !reserved_chars.includes(char)) { result += char; - }else{ + } else { const code = char.charCodeAt(); result += '%' + code.toString(16).padStart(2, 0); } } - + return result; - }; + } decodeProtocol(protocol) { - if(typeof protocol != 'string')throw new TypeError('protocol must be a string'); - + if (typeof protocol != 'string') + throw new TypeError('protocol must be a string'); + let result = ''; - - for(let i = 0; i < protocol.length; i++){ + + for (let i = 0; i < protocol.length; i++) { const char = protocol[i]; - - if(char == '%'){ + + if (char == '%') { const code = parseInt(protocol.slice(i + 1, i + 3), 16); const decoded = String.fromCharCode(code); - + result += decoded; i += 2; - }else{ + } else { result += char; } } - + return result; } implementUVMiddleware() { @@ -151,31 +188,31 @@ class Ultraviolet { wrapEval(this); identifier(this); unwrap(this); - }; + } get rewriteHtml() { return this.html.rewrite.bind(this.html); - }; + } get sourceHtml() { return this.html.source.bind(this.html); - }; + } get rewriteCSS() { return this.css.rewrite.bind(this.css); - }; + } get sourceCSS() { return this.css.source.bind(this.css); - }; + } get rewriteJS() { return this.js.rewrite.bind(this.js); - }; + } get sourceJS() { return this.js.source.bind(this.js); - }; + } static codec = { xor, base64, plain }; static mime = mimeTypes; static setCookie = setCookie; static openDB = openDB; static Bowser = Bowser; -}; +} export default Ultraviolet; -if (typeof self === 'object') self.Ultraviolet = Ultraviolet; \ No newline at end of file +if (typeof self === 'object') self.Ultraviolet = Ultraviolet; diff --git a/src/rewrite/js.js b/src/rewrite/js.js index d503a93..188ec23 100644 --- a/src/rewrite/js.js +++ b/src/rewrite/js.js @@ -27,13 +27,13 @@ class JS extends EventEmitter { }; this.parse = parseScript /*parse*/; this.generate = generate; - }; + } rewrite(str, data = {}) { return this.recast(str, data, 'rewrite'); - }; + } source(str, data = {}) { return this.recast(str, data, 'source'); - }; + } recast(str, data = {}, type = '') { try { const output = []; @@ -56,19 +56,26 @@ class JS extends EventEmitter { this.emit(node.type, node, meta, type); }); - meta.changes.sort((a, b) => (a.start - b.start) || (a.end - b.end)); + meta.changes.sort((a, b) => a.start - b.start || a.end - b.end); for (const change of meta.changes) { - if ('start' in change && typeof change.start === 'number') output.push(str.slice(slice, change.start)); - if (change.node) output.push(typeof change.node === 'string' ? change.node : generate(change.node, this.generationOptions)); - if ('end' in change && typeof change.end === 'number') slice = change.end; - }; + if ('start' in change && typeof change.start === 'number') + output.push(str.slice(slice, change.start)); + if (change.node) + output.push( + typeof change.node === 'string' + ? change.node + : generate(change.node, this.generationOptions) + ); + if ('end' in change && typeof change.end === 'number') + slice = change.end; + } output.push(str.slice(slice)); return output.join(''); - } catch(e) { + } catch (e) { return str; - }; - }; + } + } iterate(ast, handler) { if (typeof ast != 'object' || !handler) return; walk(ast, null, handler); @@ -78,16 +85,16 @@ class JS extends EventEmitter { for (const child in node) { if (child === 'parent') continue; if (Array.isArray(node[child])) { - node[child].forEach(entry => { - if (entry) walk(entry, node, handler) + node[child].forEach((entry) => { + if (entry) walk(entry, node, handler); }); } else { if (node[child]) walk(node[child], node, handler); - }; - }; + } + } if (typeof node.iterateEnd === 'function') node.iterateEnd(); - }; - }; -}; + } + } +} -export default JS; \ No newline at end of file +export default JS; diff --git a/src/rewrite/mime.js b/src/rewrite/mime.js index 8ed1803..b6cc285 100644 --- a/src/rewrite/mime.js +++ b/src/rewrite/mime.js @@ -5,18 +5,18 @@ * MIT Licensed */ -'use strict' +'use strict'; /** * Module dependencies. * @private */ -var $exports = {} - -import db from "mime-db"; +var $exports = {}; -var extname = function(path = '') { +import db from 'mime-db'; + +var extname = function (path = '') { if (!path.includes('.')) return ''; const map = path.split('.'); @@ -28,24 +28,24 @@ var extname = function(path = '') { * @private */ -var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/ -var TEXT_TYPE_REGEXP = /^text\//i +var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/; +var TEXT_TYPE_REGEXP = /^text\//i; /** * Module exports. * @public */ -$exports.charset = charset -$exports.charsets = { lookup: charset } -$exports.contentType = contentType -$exports.extension = extension -$exports.extensions = Object.create(null) -$exports.lookup = lookup -$exports.types = Object.create(null) +$exports.charset = charset; +$exports.charsets = { lookup: charset }; +$exports.contentType = contentType; +$exports.extension = extension; +$exports.extensions = Object.create(null); +$exports.lookup = lookup; +$exports.types = Object.create(null); // Populate the extensions/types maps -populateMaps($exports.extensions, $exports.types) +populateMaps($exports.extensions, $exports.types); /** * Get the default charset for a MIME type. @@ -54,25 +54,25 @@ populateMaps($exports.extensions, $exports.types) * @return {boolean|string} */ -function charset (type) { - if (!type || typeof type !== 'string') { - return false - } +function charset(type) { + if (!type || typeof type !== 'string') { + return false; + } - // TODO: use media-typer - var match = EXTRACT_TYPE_REGEXP.exec(type) - var mime = match && db[match[1].toLowerCase()] + // TODO: use media-typer + var match = EXTRACT_TYPE_REGEXP.exec(type); + var mime = match && db[match[1].toLowerCase()]; - if (mime && mime.charset) { - return mime.charset - } + if (mime && mime.charset) { + return mime.charset; + } - // default text/* to utf-8 - if (match && TEXT_TYPE_REGEXP.test(match[1])) { - return 'UTF-8' - } + // default text/* to utf-8 + if (match && TEXT_TYPE_REGEXP.test(match[1])) { + return 'UTF-8'; + } - return false + return false; } /** @@ -82,27 +82,25 @@ function charset (type) { * @return {boolean|string} */ -function contentType (str) { - // TODO: should this even be in this module? - if (!str || typeof str !== 'string') { - return false - } +function contentType(str) { + // TODO: should this even be in this module? + if (!str || typeof str !== 'string') { + return false; + } - var mime = str.indexOf('/') === -1 - ? $exports.lookup(str) - : str + var mime = str.indexOf('/') === -1 ? $exports.lookup(str) : str; - if (!mime) { - return false - } + if (!mime) { + return false; + } - // TODO: use content-type or other module - if (mime.indexOf('charset') === -1) { - var charset = $exports.charset(mime) - if (charset) mime += '; charset=' + charset.toLowerCase() - } + // TODO: use content-type or other module + if (mime.indexOf('charset') === -1) { + var charset = $exports.charset(mime); + if (charset) mime += '; charset=' + charset.toLowerCase(); + } - return mime + return mime; } /** @@ -112,22 +110,22 @@ function contentType (str) { * @return {boolean|string} */ -function extension (type) { - if (!type || typeof type !== 'string') { - return false - } +function extension(type) { + if (!type || typeof type !== 'string') { + return false; + } - // TODO: use media-typer - var match = EXTRACT_TYPE_REGEXP.exec(type) + // TODO: use media-typer + var match = EXTRACT_TYPE_REGEXP.exec(type); - // get extensions - var exts = match && $exports.extensions[match[1].toLowerCase()] + // get extensions + var exts = match && $exports.extensions[match[1].toLowerCase()]; - if (!exts || !exts.length) { - return false - } + if (!exts || !exts.length) { + return false; + } - return exts[0] + return exts[0]; } /** @@ -137,21 +135,21 @@ function extension (type) { * @return {boolean|string} */ -function lookup (path) { - if (!path || typeof path !== 'string') { - return false - } +function lookup(path) { + if (!path || typeof path !== 'string') { + return false; + } - // get the extension ("ext" or ".ext" or full path) - var extension = extname('x.' + path) - .toLowerCase() - .substr(1) + // get the extension ("ext" or ".ext" or full path) + var extension = extname('x.' + path) + .toLowerCase() + .substr(1); - if (!extension) { - return false - } + if (!extension) { + return false; + } - return $exports.types[extension] || false + return $exports.types[extension] || false; } /** @@ -159,40 +157,44 @@ function lookup (path) { * @private */ -function populateMaps (extensions, types) { - // source preference (least -> most) - var preference = ['nginx', 'apache', undefined, 'iana'] +function populateMaps(extensions, types) { + // source preference (least -> most) + var preference = ['nginx', 'apache', undefined, 'iana']; - Object.keys(db).forEach(function forEachMimeType (type) { - var mime = db[type] - var exts = mime.extensions + Object.keys(db).forEach(function forEachMimeType(type) { + var mime = db[type]; + var exts = mime.extensions; - if (!exts || !exts.length) { - return - } - - // mime -> extensions - extensions[type] = exts - - // extension -> mime - for (var i = 0; i < exts.length; i++) { - var extension = exts[i] - - if (types[extension]) { - var from = preference.indexOf(db[types[extension]].source) - var to = preference.indexOf(mime.source) - - if (types[extension] !== 'application/octet-stream' && - (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) { - // skip the remapping - continue + if (!exts || !exts.length) { + return; } - } - // set the extension -> mime - types[extension] = type - } - }) + // mime -> extensions + extensions[type] = exts; + + // extension -> mime + for (var i = 0; i < exts.length; i++) { + var extension = exts[i]; + + if (types[extension]) { + var from = preference.indexOf(db[types[extension]].source); + var to = preference.indexOf(mime.source); + + if ( + types[extension] !== 'application/octet-stream' && + (from > to || + (from === to && + types[extension].substr(0, 12) === 'application/')) + ) { + // skip the remapping + continue; + } + } + + // set the extension -> mime + types[extension] = type; + } + }); } -export default $exports; \ No newline at end of file +export default $exports; diff --git a/src/rewrite/parsel.js b/src/rewrite/parsel.js index 896092b..9eff61c 100644 --- a/src/rewrite/parsel.js +++ b/src/rewrite/parsel.js @@ -1,382 +1,435 @@ export default (function (exports) { - 'use strict'; - - const TOKENS = { - attribute: /\[\s*(?:(?\*|[-\w]*)\|)?(?[-\w\u{0080}-\u{FFFF}]+)\s*(?:(?\W?=)\s*(?.+?)\s*(?[iIsS])?\s*)?\]/gu, - id: /#(?(?:[-\w\u{0080}-\u{FFFF}]|\\.)+)/gu, - class: /\.(?(?:[-\w\u{0080}-\u{FFFF}]|\\.)+)/gu, - comma: /\s*,\s*/g, // must be before combinator - combinator: /\s*[\s>+~]\s*/g, // this must be after attribute - "pseudo-element": /::(?[-\w\u{0080}-\u{FFFF}]+)(?:\((?¶+)\))?/gu, // this must be before pseudo-class - "pseudo-class": /:(?[-\w\u{0080}-\u{FFFF}]+)(?:\((?¶+)\))?/gu, - type: /(?:(?\*|[-\w]*)\|)?(?[-\w\u{0080}-\u{FFFF}]+)|\*/gu // this must be last - }; - - const TOKENS_WITH_PARENS = new Set(["pseudo-class", "pseudo-element"]); - const TOKENS_WITH_STRINGS = new Set([...TOKENS_WITH_PARENS, "attribute"]); - const TRIM_TOKENS = new Set(["combinator", "comma"]); - const RECURSIVE_PSEUDO_CLASSES = new Set(["not", "is", "where", "has", "matches", "-moz-any", "-webkit-any", "nth-child", "nth-last-child"]); - - const RECURSIVE_PSEUDO_CLASSES_ARGS = { - "nth-child": /(?[\dn+-]+)\s+of\s+(?.+)/ - }; - - RECURSIVE_PSEUDO_CLASSES["nth-last-child"] = RECURSIVE_PSEUDO_CLASSES_ARGS["nth-child"]; - - const TOKENS_FOR_RESTORE = Object.assign({}, TOKENS); - TOKENS_FOR_RESTORE["pseudo-element"] = RegExp(TOKENS["pseudo-element"].source.replace("(?¶+)", "(?.+?)"), "gu"); - TOKENS_FOR_RESTORE["pseudo-class"] = RegExp(TOKENS["pseudo-class"].source.replace("(?¶+)", "(?.+)"), "gu"); - - function gobbleParens(text, i) { - let str = "", stack = []; - - for (; i < text.length; i++) { - let char = text[i]; - - if (char === "(") { - stack.push(char); - } - else if (char === ")") { - if (stack.length > 0) { - stack.pop(); - } - else { - throw new Error("Closing paren without opening paren at " + i); - } - } - - str += char; - - if (stack.length === 0) { - return str; - } - } - - throw new Error("Opening paren without closing paren"); - } - - function tokenizeBy (text, grammar) { - if (!text) { - return []; - } - - var strarr = [text]; - - for (var token in grammar) { - let pattern = grammar[token]; - - for (var i=0; i < strarr.length; i++) { // Don’t cache length as it changes during the loop - var str = strarr[i]; - - if (typeof str === "string") { - pattern.lastIndex = 0; - - var match = pattern.exec(str); - - if (match) { - let from = match.index - 1; - let args = []; - let content = match[0]; - - let before = str.slice(0, from + 1); - if (before) { - args.push(before); - } - - args.push({ - type: token, - content, - ...match.groups - }); - - let after = str.slice(from + content.length + 1); - if (after) { - args.push(after); - } - - strarr.splice(i, 1, ...args); - } - - } - } - } - - let offset = 0; - for (let i=0; i { - strings.push({str, start}); - return quote + "§".repeat(content.length) + quote; - }); - - // Now that strings are out of the way, extract parens and replace them with parens with whitespace (to preserve offsets) - let parens = [], offset = 0, start; - while ((start = selector.indexOf("(", offset)) > -1) { - let str = gobbleParens(selector, start); - parens.push({str, start}); - selector = selector.substring(0, start) + "(" + "¶".repeat(str.length - 2) + ")" + selector.substring(start + str.length); - offset = start + str.length; - } - - // Now we have no nested structures and we can parse with regexes - let tokens = tokenizeBy(selector, TOKENS); - - // Now restore parens and strings in reverse order - function restoreNested(strings, regex, types) { - for (let str of strings) { - for (let token of tokens) { - if (types.has(token.type) && token.pos[0] < str.start && str.start < token.pos[1]) { - let content = token.content; - token.content = token.content.replace(regex, str.str); - - if (token.content !== content) { // actually changed? - // Re-evaluate groups - TOKENS_FOR_RESTORE[token.type].lastIndex = 0; - let match = TOKENS_FOR_RESTORE[token.type].exec(token.content); - let groups = match.groups; - Object.assign(token, groups); - } - } - } - } - } - - restoreNested(parens, /\(¶+\)/, TOKENS_WITH_PARENS); - restoreNested(strings, /(['"])§+?\1/, TOKENS_WITH_STRINGS); - - return tokens; - } - - // Convert a flat list of tokens into a tree of complex & compound selectors - function nestTokens(tokens, {list = true} = {}) { - if (list && tokens.find(t => t.type === "comma")) { - let selectors = [], temp = []; - - for (let i=0; i=0; i--) { - let token = tokens[i]; - - if (token.type === "combinator") { - let left = tokens.slice(0, i); - let right = tokens.slice(i + 1); - - return { - type: "complex", - combinator: token.content, - left: nestTokens(left), - right: nestTokens(right) - }; - } - } - - if (tokens.length === 0) { - return null; - } - - // If we're here, there are no combinators, so it's just a list - return tokens.length === 1? tokens[0] : { - type: "compound", - list: [...tokens] // clone to avoid pointers messing up the AST - }; - } - - // Traverse an AST (or part thereof), in depth-first order - function walk(node, callback, o, parent) { - if (!node) { - return; - } - - if (node.type === "complex") { - walk(node.left, callback, o, node); - walk(node.right, callback, o, node); - } - else if (node.type === "compound") { - for (let n of node.list) { - walk(n, callback, o, node); - } - } - else if (node.subtree && o && o.subtree) { - walk(node.subtree, callback, o, node); - } - - callback(node, parent); - } - - /** - * Parse a CSS selector - * @param selector {String} The selector to parse - * @param options.recursive {Boolean} Whether to parse the arguments of pseudo-classes like :is(), :has() etc. Defaults to true. - * @param options.list {Boolean} Whether this can be a selector list (A, B, C etc). Defaults to true. - */ - function parse(selector, {recursive = true, list = true} = {}) { - let tokens = tokenize(selector); - - if (!tokens) { - return null; - } - - let ast = nestTokens(tokens, {list}); - - if (recursive) { - walk(ast, node => { - if (node.type === "pseudo-class" && node.argument) { - if (RECURSIVE_PSEUDO_CLASSES.has(node.name)) { - let argument = node.argument; - const childArg = RECURSIVE_PSEUDO_CLASSES_ARGS[node.name]; - if (childArg) { - const match = childArg.exec(argument); - if (!match) { - return; - } - - Object.assign(node, match.groups); - argument = match.groups.subtree; - } - if (argument) { - node.subtree = parse(argument, {recursive: true, list: true}); - } - } - } - }); - } - - return ast; - } - - function specificityToNumber(specificity, base) { - base = base || Math.max(...specificity) + 1; - - return specificity[0] * base ** 2 + specificity[1] * base + specificity[2]; - } - - function maxIndexOf(arr) { - let max = arr[0], ret = 0; - - for (let i=0; i max) { - ret = i; - max = arr[i]; - } - } - - return arr.length === 0? -1 : ret; - } - - /** - * Calculate specificity of a selector. - * If the selector is a list, the max specificity is returned. - */ - function specificity(selector, {format = "array"} = {}) { - let ast = typeof selector === "object"? selector : parse(selector, {recursive: true}); - - if (!ast) { - return null; - } - - if (ast.type === "list") { - // Return max specificity - let base = 10; - let specificities = ast.list.map(s => { - let sp = specificity(s); - base = Math.max(base, ...sp); - return sp; - }); - let numbers = specificities.map(s => specificityToNumber(s, base)); - let i = maxIndexOf(numbers); - return specificities[i]; - } - - let ret = [0, 0, 0]; - - walk(ast, node => { - if (node.type === "id") { - ret[0]++; - } - else if (node.type === "class" || node.type === "attribute") { - ret[1]++; - } - else if ((node.type === "type" && node.content !== "*") || node.type === "pseudo-element") { - ret[2]++; - } - else if (node.type === "pseudo-class" && node.name !== "where") { - if (RECURSIVE_PSEUDO_CLASSES.has(node.name) && node.subtree) { - // Max of argument list - let sub = specificity(node.subtree); - sub.forEach((s, i) => ret[i] += s); - } - else { - ret[1]++; - } - } - }); - - return ret; - } - - exports.RECURSIVE_PSEUDO_CLASSES = RECURSIVE_PSEUDO_CLASSES; - exports.RECURSIVE_PSEUDO_CLASSES_ARGS = RECURSIVE_PSEUDO_CLASSES_ARGS; - exports.TOKENS = TOKENS; - exports.TRIM_TOKENS = TRIM_TOKENS; - exports.gobbleParens = gobbleParens; - exports.nestTokens = nestTokens; - exports.parse = parse; - exports.specificity = specificity; - exports.specificityToNumber = specificityToNumber; - exports.tokenize = tokenize; - exports.tokenizeBy = tokenizeBy; - exports.walk = walk; - - Object.defineProperty(exports, '__esModule', { value: true }); - - return exports; - -}({})); \ No newline at end of file + 'use strict'; + + const TOKENS = { + attribute: + /\[\s*(?:(?\*|[-\w]*)\|)?(?[-\w\u{0080}-\u{FFFF}]+)\s*(?:(?\W?=)\s*(?.+?)\s*(?[iIsS])?\s*)?\]/gu, + id: /#(?(?:[-\w\u{0080}-\u{FFFF}]|\\.)+)/gu, + class: /\.(?(?:[-\w\u{0080}-\u{FFFF}]|\\.)+)/gu, + comma: /\s*,\s*/g, // must be before combinator + combinator: /\s*[\s>+~]\s*/g, // this must be after attribute + 'pseudo-element': + /::(?[-\w\u{0080}-\u{FFFF}]+)(?:\((?¶+)\))?/gu, // this must be before pseudo-class + 'pseudo-class': + /:(?[-\w\u{0080}-\u{FFFF}]+)(?:\((?¶+)\))?/gu, + type: /(?:(?\*|[-\w]*)\|)?(?[-\w\u{0080}-\u{FFFF}]+)|\*/gu, // this must be last + }; + + const TOKENS_WITH_PARENS = new Set(['pseudo-class', 'pseudo-element']); + const TOKENS_WITH_STRINGS = new Set([...TOKENS_WITH_PARENS, 'attribute']); + const TRIM_TOKENS = new Set(['combinator', 'comma']); + const RECURSIVE_PSEUDO_CLASSES = new Set([ + 'not', + 'is', + 'where', + 'has', + 'matches', + '-moz-any', + '-webkit-any', + 'nth-child', + 'nth-last-child', + ]); + + const RECURSIVE_PSEUDO_CLASSES_ARGS = { + 'nth-child': /(?[\dn+-]+)\s+of\s+(?.+)/, + }; + + RECURSIVE_PSEUDO_CLASSES['nth-last-child'] = + RECURSIVE_PSEUDO_CLASSES_ARGS['nth-child']; + + const TOKENS_FOR_RESTORE = Object.assign({}, TOKENS); + TOKENS_FOR_RESTORE['pseudo-element'] = RegExp( + TOKENS['pseudo-element'].source.replace( + '(?¶+)', + '(?.+?)' + ), + 'gu' + ); + TOKENS_FOR_RESTORE['pseudo-class'] = RegExp( + TOKENS['pseudo-class'].source.replace( + '(?¶+)', + '(?.+)' + ), + 'gu' + ); + + function gobbleParens(text, i) { + let str = '', + stack = []; + + for (; i < text.length; i++) { + let char = text[i]; + + if (char === '(') { + stack.push(char); + } else if (char === ')') { + if (stack.length > 0) { + stack.pop(); + } else { + throw new Error( + 'Closing paren without opening paren at ' + i + ); + } + } + + str += char; + + if (stack.length === 0) { + return str; + } + } + + throw new Error('Opening paren without closing paren'); + } + + function tokenizeBy(text, grammar) { + if (!text) { + return []; + } + + var strarr = [text]; + + for (var token in grammar) { + let pattern = grammar[token]; + + for (var i = 0; i < strarr.length; i++) { + // Don’t cache length as it changes during the loop + var str = strarr[i]; + + if (typeof str === 'string') { + pattern.lastIndex = 0; + + var match = pattern.exec(str); + + if (match) { + let from = match.index - 1; + let args = []; + let content = match[0]; + + let before = str.slice(0, from + 1); + if (before) { + args.push(before); + } + + args.push({ + type: token, + content, + ...match.groups, + }); + + let after = str.slice(from + content.length + 1); + if (after) { + args.push(after); + } + + strarr.splice(i, 1, ...args); + } + } + } + } + + let offset = 0; + for (let i = 0; i < strarr.length; i++) { + let token = strarr[i]; + let length = token.length || token.content.length; + + if (typeof token === 'object') { + token.pos = [offset, offset + length]; + + if (TRIM_TOKENS.has(token.type)) { + token.content = token.content.trim() || ' '; + } + } + + offset += length; + } + + return strarr; + } + + function tokenize(selector) { + if (!selector) { + return null; + } + + selector = selector.trim(); // prevent leading/trailing whitespace be interpreted as combinators + + // Replace strings with whitespace strings (to preserve offsets) + let strings = []; + // FIXME Does not account for escaped backslashes before a quote + selector = selector.replace( + /(['"])(\\\1|.)+?\1/g, + (str, quote, content, start) => { + strings.push({ str, start }); + return quote + '§'.repeat(content.length) + quote; + } + ); + + // Now that strings are out of the way, extract parens and replace them with parens with whitespace (to preserve offsets) + let parens = [], + offset = 0, + start; + while ((start = selector.indexOf('(', offset)) > -1) { + let str = gobbleParens(selector, start); + parens.push({ str, start }); + selector = + selector.substring(0, start) + + '(' + + '¶'.repeat(str.length - 2) + + ')' + + selector.substring(start + str.length); + offset = start + str.length; + } + + // Now we have no nested structures and we can parse with regexes + let tokens = tokenizeBy(selector, TOKENS); + + // Now restore parens and strings in reverse order + function restoreNested(strings, regex, types) { + for (let str of strings) { + for (let token of tokens) { + if ( + types.has(token.type) && + token.pos[0] < str.start && + str.start < token.pos[1] + ) { + let content = token.content; + token.content = token.content.replace(regex, str.str); + + if (token.content !== content) { + // actually changed? + // Re-evaluate groups + TOKENS_FOR_RESTORE[token.type].lastIndex = 0; + let match = TOKENS_FOR_RESTORE[token.type].exec( + token.content + ); + let groups = match.groups; + Object.assign(token, groups); + } + } + } + } + } + + restoreNested(parens, /\(¶+\)/, TOKENS_WITH_PARENS); + restoreNested(strings, /(['"])§+?\1/, TOKENS_WITH_STRINGS); + + return tokens; + } + + // Convert a flat list of tokens into a tree of complex & compound selectors + function nestTokens(tokens, { list = true } = {}) { + if (list && tokens.find((t) => t.type === 'comma')) { + let selectors = [], + temp = []; + + for (let i = 0; i < tokens.length; i++) { + if (tokens[i].type === 'comma') { + if (temp.length === 0) { + throw new Error('Incorrect comma at ' + i); + } + + selectors.push(nestTokens(temp, { list: false })); + temp.length = 0; + } else { + temp.push(tokens[i]); + } + } + + if (temp.length === 0) { + throw new Error('Trailing comma'); + } else { + selectors.push(nestTokens(temp, { list: false })); + } + + return { type: 'list', list: selectors }; + } + + for (let i = tokens.length - 1; i >= 0; i--) { + let token = tokens[i]; + + if (token.type === 'combinator') { + let left = tokens.slice(0, i); + let right = tokens.slice(i + 1); + + return { + type: 'complex', + combinator: token.content, + left: nestTokens(left), + right: nestTokens(right), + }; + } + } + + if (tokens.length === 0) { + return null; + } + + // If we're here, there are no combinators, so it's just a list + return tokens.length === 1 + ? tokens[0] + : { + type: 'compound', + list: [...tokens], // clone to avoid pointers messing up the AST + }; + } + + // Traverse an AST (or part thereof), in depth-first order + function walk(node, callback, o, parent) { + if (!node) { + return; + } + + if (node.type === 'complex') { + walk(node.left, callback, o, node); + walk(node.right, callback, o, node); + } else if (node.type === 'compound') { + for (let n of node.list) { + walk(n, callback, o, node); + } + } else if (node.subtree && o && o.subtree) { + walk(node.subtree, callback, o, node); + } + + callback(node, parent); + } + + /** + * Parse a CSS selector + * @param selector {String} The selector to parse + * @param options.recursive {Boolean} Whether to parse the arguments of pseudo-classes like :is(), :has() etc. Defaults to true. + * @param options.list {Boolean} Whether this can be a selector list (A, B, C etc). Defaults to true. + */ + function parse(selector, { recursive = true, list = true } = {}) { + let tokens = tokenize(selector); + + if (!tokens) { + return null; + } + + let ast = nestTokens(tokens, { list }); + + if (recursive) { + walk(ast, (node) => { + if (node.type === 'pseudo-class' && node.argument) { + if (RECURSIVE_PSEUDO_CLASSES.has(node.name)) { + let argument = node.argument; + const childArg = + RECURSIVE_PSEUDO_CLASSES_ARGS[node.name]; + if (childArg) { + const match = childArg.exec(argument); + if (!match) { + return; + } + + Object.assign(node, match.groups); + argument = match.groups.subtree; + } + if (argument) { + node.subtree = parse(argument, { + recursive: true, + list: true, + }); + } + } + } + }); + } + + return ast; + } + + function specificityToNumber(specificity, base) { + base = base || Math.max(...specificity) + 1; + + return ( + specificity[0] * base ** 2 + specificity[1] * base + specificity[2] + ); + } + + function maxIndexOf(arr) { + let max = arr[0], + ret = 0; + + for (let i = 0; i < arr.length; i++) { + if (arr[i] > max) { + ret = i; + max = arr[i]; + } + } + + return arr.length === 0 ? -1 : ret; + } + + /** + * Calculate specificity of a selector. + * If the selector is a list, the max specificity is returned. + */ + function specificity(selector, { format = 'array' } = {}) { + let ast = + typeof selector === 'object' + ? selector + : parse(selector, { recursive: true }); + + if (!ast) { + return null; + } + + if (ast.type === 'list') { + // Return max specificity + let base = 10; + let specificities = ast.list.map((s) => { + let sp = specificity(s); + base = Math.max(base, ...sp); + return sp; + }); + let numbers = specificities.map((s) => + specificityToNumber(s, base) + ); + let i = maxIndexOf(numbers); + return specificities[i]; + } + + let ret = [0, 0, 0]; + + walk(ast, (node) => { + if (node.type === 'id') { + ret[0]++; + } else if (node.type === 'class' || node.type === 'attribute') { + ret[1]++; + } else if ( + (node.type === 'type' && node.content !== '*') || + node.type === 'pseudo-element' + ) { + ret[2]++; + } else if (node.type === 'pseudo-class' && node.name !== 'where') { + if (RECURSIVE_PSEUDO_CLASSES.has(node.name) && node.subtree) { + // Max of argument list + let sub = specificity(node.subtree); + sub.forEach((s, i) => (ret[i] += s)); + } else { + ret[1]++; + } + } + }); + + return ret; + } + + exports.RECURSIVE_PSEUDO_CLASSES = RECURSIVE_PSEUDO_CLASSES; + exports.RECURSIVE_PSEUDO_CLASSES_ARGS = RECURSIVE_PSEUDO_CLASSES_ARGS; + exports.TOKENS = TOKENS; + exports.TRIM_TOKENS = TRIM_TOKENS; + exports.gobbleParens = gobbleParens; + exports.nestTokens = nestTokens; + exports.parse = parse; + exports.specificity = specificity; + exports.specificityToNumber = specificityToNumber; + exports.tokenize = tokenize; + exports.tokenizeBy = tokenizeBy; + exports.walk = walk; + + Object.defineProperty(exports, '__esModule', { value: true }); + + return exports; +})({}); diff --git a/src/rewrite/rewrite.css.js b/src/rewrite/rewrite.css.js index ece0cb1..363cf93 100644 --- a/src/rewrite/rewrite.css.js +++ b/src/rewrite/rewrite.css.js @@ -1,9 +1,12 @@ function url(ctx) { const { css } = ctx; css.on('Url', (node, data, type) => { - node.value = type === 'rewrite' ? ctx.rewriteUrl(node.value) : ctx.sourceUrl(node.value); + node.value = + type === 'rewrite' + ? ctx.rewriteUrl(node.value) + : ctx.sourceUrl(node.value); }); -}; +} function importStyle(ctx) { const { css } = ctx; @@ -12,9 +15,11 @@ function importStyle(ctx) { const { data: url } = node.prelude.children.head; // Already handling Url's if (url.type === 'Url') return false; - url.value = type === 'rewrite' ? ctx.rewriteUrl(url.value) : ctx.sourceUrl(url.value); - + url.value = + type === 'rewrite' + ? ctx.rewriteUrl(url.value) + : ctx.sourceUrl(url.value); }); -}; +} -export { url, importStyle }; \ No newline at end of file +export { url, importStyle }; diff --git a/src/rewrite/rewrite.html.js b/src/rewrite/rewrite.html.js index 3becc9d..1ebe48d 100644 --- a/src/rewrite/rewrite.html.js +++ b/src/rewrite/rewrite.html.js @@ -3,50 +3,54 @@ function attributes(ctx, meta = ctx.meta) { const origPrefix = attributePrefix + '-attr-'; html.on('attr', (attr, type) => { - if (attr.node.tagName === 'base' && attr.name === 'href' && attr.options.document) { + if ( + attr.node.tagName === 'base' && + attr.name === 'href' && + attr.options.document + ) { meta.base = new URL(attr.value, meta.url); - }; - + } + if (type === 'rewrite' && isUrl(attr.name, attr.tagName)) { attr.node.setAttribute(origPrefix + attr.name, attr.value); attr.value = ctx.rewriteUrl(attr.value, meta); - }; + } if (type === 'rewrite' && isSrcset(attr.name)) { attr.node.setAttribute(origPrefix + attr.name, attr.value); attr.value = html.wrapSrcset(attr.value, meta); - }; - + } if (type === 'rewrite' && isHtml(attr.name)) { attr.node.setAttribute(origPrefix + attr.name, attr.value); - attr.value = html.rewrite(attr.value, { + attr.value = html.rewrite(attr.value, { ...meta, document: true, injectHead: attr.options.injectHead || [], }); - }; + } - if (type === 'rewrite' && isStyle(attr.name)) { attr.node.setAttribute(origPrefix + attr.name, attr.value); - attr.value = ctx.rewriteCSS(attr.value, { context: 'declarationList', }); - }; + attr.value = ctx.rewriteCSS(attr.value, { + context: 'declarationList', + }); + } if (type === 'rewrite' && isForbidden(attr.name)) { attr.name = origPrefix + attr.name; - }; + } if (type === 'rewrite' && isEvent(attr.name)) { attr.node.setAttribute(origPrefix + attr.name, attr.value); attr.value = js.rewrite(attr.value, meta); - }; + } if (type === 'source' && attr.name.startsWith(origPrefix)) { - if (attr.node.hasAttribute(attr.name.slice(origPrefix.length))) attr.node.removeAttribute(attr.name.slice(origPrefix.length)); + if (attr.node.hasAttribute(attr.name.slice(origPrefix.length))) + attr.node.removeAttribute(attr.name.slice(origPrefix.length)); attr.name = attr.name.slice(origPrefix.length); - }; - + } /* if (isHtml(attr.name)) { @@ -61,102 +65,120 @@ function attributes(ctx, meta = ctx.meta) { }; */ - }); - -}; - + }); +} function text(ctx, meta = ctx.meta) { const { html, js, css, attributePrefix } = ctx; html.on('text', (text, type) => { if (text.element.tagName === 'script') { - text.value = type === 'rewrite' ? js.rewrite(text.value) : js.source(text.value); - }; + text.value = + type === 'rewrite' + ? js.rewrite(text.value) + : js.source(text.value); + } if (text.element.tagName === 'style') { - text.value = type === 'rewrite' ? css.rewrite(text.value) : css.source(text.value); - }; + text.value = + type === 'rewrite' + ? css.rewrite(text.value) + : css.source(text.value); + } }); return true; -}; +} function isUrl(name, tag) { - return tag === 'object' && name === 'data' || ['src', 'href', 'ping', 'movie', 'action', 'poster', 'profile', 'background'].indexOf(name) > -1; -}; + return ( + (tag === 'object' && name === 'data') || + [ + 'src', + 'href', + 'ping', + 'movie', + 'action', + 'poster', + 'profile', + 'background', + ].indexOf(name) > -1 + ); +} function isEvent(name) { - return [ - 'onafterprint', - 'onbeforeprint', - 'onbeforeunload', - 'onerror', - 'onhashchange', - 'onload', - 'onmessage', - 'onoffline', - 'ononline', - 'onpagehide', - 'onpopstate', - 'onstorage', - 'onunload', - 'onblur', - 'onchange', - 'oncontextmenu', - 'onfocus', - 'oninput', - 'oninvalid', - 'onreset', - 'onsearch', - 'onselect', - 'onsubmit', - 'onkeydown', - 'onkeypress', - 'onkeyup', - 'onclick', - 'ondblclick', - 'onmousedown', - 'onmousemove', - 'onmouseout', - 'onmouseover', - 'onmouseup', - 'onmousewheel', - 'onwheel', - 'ondrag', - 'ondragend', - 'ondragenter', - 'ondragleave', - 'ondragover', - 'ondragstart', - 'ondrop', - 'onscroll', - 'oncopy', - 'oncut', - 'onpaste', - 'onabort', - 'oncanplay', - 'oncanplaythrough', - 'oncuechange', - 'ondurationchange', - 'onemptied', - 'onended', - 'onerror', - 'onloadeddata', - 'onloadedmetadata', - 'onloadstart', - 'onpause', - 'onplay', - 'onplaying', - 'onprogress', - 'onratechange', - 'onseeked', - 'onseeking', - 'onstalled', - 'onsuspend', - 'ontimeupdate', - 'onvolumechange', - 'onwaiting', - ].indexOf(name) > -1; -}; + return ( + [ + 'onafterprint', + 'onbeforeprint', + 'onbeforeunload', + 'onerror', + 'onhashchange', + 'onload', + 'onmessage', + 'onoffline', + 'ononline', + 'onpagehide', + 'onpopstate', + 'onstorage', + 'onunload', + 'onblur', + 'onchange', + 'oncontextmenu', + 'onfocus', + 'oninput', + 'oninvalid', + 'onreset', + 'onsearch', + 'onselect', + 'onsubmit', + 'onkeydown', + 'onkeypress', + 'onkeyup', + 'onclick', + 'ondblclick', + 'onmousedown', + 'onmousemove', + 'onmouseout', + 'onmouseover', + 'onmouseup', + 'onmousewheel', + 'onwheel', + 'ondrag', + 'ondragend', + 'ondragenter', + 'ondragleave', + 'ondragover', + 'ondragstart', + 'ondrop', + 'onscroll', + 'oncopy', + 'oncut', + 'onpaste', + 'onabort', + 'oncanplay', + 'oncanplaythrough', + 'oncuechange', + 'ondurationchange', + 'onemptied', + 'onended', + 'onerror', + 'onloadeddata', + 'onloadedmetadata', + 'onloadstart', + 'onpause', + 'onplay', + 'onplaying', + 'onprogress', + 'onratechange', + 'onseeked', + 'onseeking', + 'onstalled', + 'onsuspend', + 'ontimeupdate', + 'onvolumechange', + 'onwaiting', + ].indexOf(name) > -1 + ); +} function injectHead(ctx) { const { html, js, css, attributePrefix } = ctx; @@ -165,14 +187,18 @@ function injectHead(ctx) { if (type !== 'rewrite') return false; if (element.tagName !== 'head') return false; if (!('injectHead' in element.options)) return false; - - element.childNodes.unshift( - ...element.options.injectHead - ); - }); -}; -function createInjection(handler = '/uv.handler.js', bundle = '/uv.bundle.js', config = '/uv.config.js', cookies = '', referrer = '') { + element.childNodes.unshift(...element.options.injectHead); + }); +} + +function createInjection( + handler = '/uv.handler.js', + bundle = '/uv.bundle.js', + config = '/uv.config.js', + cookies = '', + referrer = '' +) { return [ { tagName: 'script', @@ -180,7 +206,9 @@ function createInjection(handler = '/uv.handler.js', bundle = '/uv.bundle.js', c childNodes: [ { nodeName: '#text', - value: `window.__uv$cookies = atob("${btoa(cookies)}");\nwindow.__uv$referrer = atob("${btoa(referrer)}");` + value: `window.__uv$cookies = atob("${btoa( + cookies + )}");\nwindow.__uv$referrer = atob("${btoa(referrer)}");`, }, ], attrs: [ @@ -188,7 +216,7 @@ function createInjection(handler = '/uv.handler.js', bundle = '/uv.bundle.js', c name: '__uv-script', value: '1', skip: true, - } + }, ], skip: true, }, @@ -202,7 +230,7 @@ function createInjection(handler = '/uv.handler.js', bundle = '/uv.bundle.js', c name: '__uv-script', value: '1', skip: true, - } + }, ], }, { @@ -215,7 +243,7 @@ function createInjection(handler = '/uv.handler.js', bundle = '/uv.bundle.js', c name: '__uv-script', value: '1', skip: true, - } + }, ], }, { @@ -228,27 +256,41 @@ function createInjection(handler = '/uv.handler.js', bundle = '/uv.bundle.js', c name: '__uv-script', value: '1', skip: true, - } + }, ], - } + }, ]; -}; +} function isForbidden(name) { - return ['http-equiv', 'integrity', 'sandbox', 'nonce', 'crossorigin'].indexOf(name) > -1; -}; + return ( + ['http-equiv', 'integrity', 'sandbox', 'nonce', 'crossorigin'].indexOf( + name + ) > -1 + ); +} -function isHtml(name){ +function isHtml(name) { return name === 'srcdoc'; -}; +} function isStyle(name) { return name === 'style'; -}; +} function isSrcset(name) { return name === 'srcset' || name === 'imagesrcset'; +} + +export { + attributes, + createInjection, + text, + isUrl, + isEvent, + isForbidden, + isHtml, + isStyle, + isSrcset, + injectHead, }; - - -export { attributes, createInjection, text, isUrl, isEvent, isForbidden, isHtml, isStyle, isSrcset, injectHead }; \ No newline at end of file diff --git a/src/rewrite/rewrite.script.js b/src/rewrite/rewrite.script.js index 4e360b1..fb27c9c 100644 --- a/src/rewrite/rewrite.script.js +++ b/src/rewrite/rewrite.script.js @@ -10,92 +10,167 @@ function property(ctx) { node: '__uv.$wrap((', start: node.property.start, end: node.property.start, - }) - node.iterateEnd = function() { + }); + node.iterateEnd = function () { data.changes.push({ node: '))', start: node.property.end, end: node.property.end, }); }; - - }; - - if (!node.computed && node.property.name === 'location' && type === 'rewrite' || node.property.name === '__uv$location' && type === 'source') { + } + + if ( + (!node.computed && + node.property.name === 'location' && + type === 'rewrite') || + (node.property.name === '__uv$location' && type === 'source') + ) { data.changes.push({ start: node.property.start, end: node.property.end, - node: type === 'rewrite' ? '__uv$setSource(__uv).__uv$location' : 'location' + node: + type === 'rewrite' + ? '__uv$setSource(__uv).__uv$location' + : 'location', }); - }; + } - - if (!node.computed && node.property.name === 'top' && type === 'rewrite' || node.property.name === '__uv$top' && type === 'source') { + if ( + (!node.computed && + node.property.name === 'top' && + type === 'rewrite') || + (node.property.name === '__uv$top' && type === 'source') + ) { data.changes.push({ start: node.property.start, end: node.property.end, - node: type === 'rewrite' ? '__uv$setSource(__uv).__uv$top' : 'top' + node: + type === 'rewrite' + ? '__uv$setSource(__uv).__uv$top' + : 'top', }); - }; + } - if (!node.computed && node.property.name === 'parent' && type === 'rewrite' || node.property.name === '__uv$parent' && type === 'source') { + if ( + (!node.computed && + node.property.name === 'parent' && + type === 'rewrite') || + (node.property.name === '__uv$parent' && type === 'source') + ) { data.changes.push({ start: node.property.start, end: node.property.end, - node: type === 'rewrite' ? '__uv$setSource(__uv).__uv$parent' : 'parent' + node: + type === 'rewrite' + ? '__uv$setSource(__uv).__uv$parent' + : 'parent', }); - }; + } - - if (!node.computed && node.property.name === 'postMessage' && type === 'rewrite') { + if ( + !node.computed && + node.property.name === 'postMessage' && + type === 'rewrite' + ) { data.changes.push({ start: node.property.start, end: node.property.end, - node:'__uv$setSource(__uv).postMessage', + node: '__uv$setSource(__uv).postMessage', }); - }; + } - - if (!node.computed && node.property.name === 'eval' && type === 'rewrite' || node.property.name === '__uv$eval' && type === 'source') { + if ( + (!node.computed && + node.property.name === 'eval' && + type === 'rewrite') || + (node.property.name === '__uv$eval' && type === 'source') + ) { data.changes.push({ start: node.property.start, end: node.property.end, - node: type === 'rewrite' ? '__uv$setSource(__uv).__uv$eval' : 'eval' + node: + type === 'rewrite' + ? '__uv$setSource(__uv).__uv$eval' + : 'eval', }); - }; + } - if (!node.computed && node.property.name === '__uv$setSource' && type === 'source' && node.parent.type === Syntax.CallExpression) { - const { parent, property } = node; + if ( + !node.computed && + node.property.name === '__uv$setSource' && + type === 'source' && + node.parent.type === Syntax.CallExpression + ) { + const { parent, property } = node; data.changes.push({ start: property.start - 1, end: parent.end, }); - node.iterateEnd = function() { + node.iterateEnd = function () { data.changes.push({ start: property.start, end: parent.end, }); }; - }; + } }); -}; +} function identifier(ctx) { const { js } = ctx; js.on('Identifier', (node, data, type) => { if (type !== 'rewrite') return false; const { parent } = node; - if (!['location', 'eval', 'parent', 'top'].includes(node.name)) return false; - if (parent.type === Syntax.VariableDeclarator && parent.id === node) return false; - if ((parent.type === Syntax.AssignmentExpression || parent.type === Syntax.AssignmentPattern) && parent.left === node) return false; - if ((parent.type === Syntax.FunctionExpression || parent.type === Syntax.FunctionDeclaration) && parent.id === node) return false; - if (parent.type === Syntax.MemberExpression && parent.property === node && !parent.computed) return false; - if (node.name === 'eval' && parent.type === Syntax.CallExpression && parent.callee === node) return false; - if (parent.type === Syntax.Property && parent.key === node) return false; - if (parent.type === Syntax.Property && parent.value === node && parent.shorthand) return false; - if (parent.type === Syntax.UpdateExpression && (parent.operator === '++' || parent.operator === '--')) return false; - if ((parent.type === Syntax.FunctionExpression || parent.type === Syntax.FunctionDeclaration || parent.type === Syntax.ArrowFunctionExpression) && parent.params.indexOf(node) !== -1) return false; + if (!['location', 'eval', 'parent', 'top'].includes(node.name)) + return false; + if (parent.type === Syntax.VariableDeclarator && parent.id === node) + return false; + if ( + (parent.type === Syntax.AssignmentExpression || + parent.type === Syntax.AssignmentPattern) && + parent.left === node + ) + return false; + if ( + (parent.type === Syntax.FunctionExpression || + parent.type === Syntax.FunctionDeclaration) && + parent.id === node + ) + return false; + if ( + parent.type === Syntax.MemberExpression && + parent.property === node && + !parent.computed + ) + return false; + if ( + node.name === 'eval' && + parent.type === Syntax.CallExpression && + parent.callee === node + ) + return false; + if (parent.type === Syntax.Property && parent.key === node) + return false; + if ( + parent.type === Syntax.Property && + parent.value === node && + parent.shorthand + ) + return false; + if ( + parent.type === Syntax.UpdateExpression && + (parent.operator === '++' || parent.operator === '--') + ) + return false; + if ( + (parent.type === Syntax.FunctionExpression || + parent.type === Syntax.FunctionDeclaration || + parent.type === Syntax.ArrowFunctionExpression) && + parent.params.indexOf(node) !== -1 + ) + return false; if (parent.type === Syntax.MethodDefinition) return false; if (parent.type === Syntax.ClassDeclaration) return false; if (parent.type === Syntax.RestElement) return false; @@ -105,10 +180,10 @@ function identifier(ctx) { data.changes.push({ start: node.start, end: node.end, - node: '__uv.$get(' + node.name + ')' + node: '__uv.$get(' + node.name + ')', }); }); -}; +} function wrapEval(ctx) { const { js } = ctx; @@ -117,15 +192,15 @@ function wrapEval(ctx) { if (!node.arguments.length) return false; if (node.callee.type !== 'Identifier') return false; if (node.callee.name !== 'eval') return false; - - const [ script ] = node.arguments; - + + const [script] = node.arguments; + data.changes.push({ node: '__uv.js.rewrite(', start: script.start, end: script.start, - }) - node.iterateEnd = function() { + }); + node.iterateEnd = function () { data.changes.push({ node: ')', start: script.end, @@ -133,21 +208,31 @@ function wrapEval(ctx) { }); }; }); -}; +} function importDeclaration(ctx) { const { js } = ctx; js.on(Syntax.Literal, (node, data, type) => { - if (!((node.parent.type === Syntax.ImportDeclaration || node.parent.type === Syntax.ExportAllDeclaration || node.parent.type === Syntax.ExportNamedDeclaration) - && node.parent.source === node)) return false; + if ( + !( + (node.parent.type === Syntax.ImportDeclaration || + node.parent.type === Syntax.ExportAllDeclaration || + node.parent.type === Syntax.ExportNamedDeclaration) && + node.parent.source === node + ) + ) + return false; data.changes.push({ start: node.start + 1, end: node.end - 1, - node: type === 'rewrite' ? ctx.rewriteUrl(node.value) : ctx.sourceUrl(node.value) + node: + type === 'rewrite' + ? ctx.rewriteUrl(node.value) + : ctx.sourceUrl(node.value), }); }); -}; +} function dynamicImport(ctx) { const { js } = ctx; @@ -157,8 +242,8 @@ function dynamicImport(ctx) { node: '__uv.rewriteUrl(', start: node.source.start, end: node.source.start, - }) - node.iterateEnd = function() { + }); + node.iterateEnd = function () { data.changes.push({ node: ')', start: node.source.end, @@ -166,7 +251,7 @@ function dynamicImport(ctx) { }); }; }); -}; +} function unwrap(ctx) { const { js } = ctx; @@ -174,70 +259,82 @@ function unwrap(ctx) { if (type !== 'source') return false; if (!isWrapped(node.callee)) return false; - switch(node.callee.property.name) { + switch (node.callee.property.name) { case '$wrap': - if (!node.arguments || node.parent.type !== Syntax.MemberExpression || node.parent.property !== node) return false; - const [ property ] = node.arguments; + if ( + !node.arguments || + node.parent.type !== Syntax.MemberExpression || + node.parent.property !== node + ) + return false; + const [property] = node.arguments; data.changes.push({ start: node.callee.start, end: property.start, }); - node.iterateEnd = function() { + node.iterateEnd = function () { data.changes.push({ start: node.end - 2, end: node.end, }); - }; + }; break; case '$get': case 'rewriteUrl': - const [ arg ] = node.arguments; + const [arg] = node.arguments; data.changes.push({ start: node.callee.start, end: arg.start, }); - node.iterateEnd = function() { - data.changes.push({ - start: node.end - 1, - end: node.end, - }); - }; - break; - case 'rewrite': - const [ script ] = node.arguments; - data.changes.push({ - start: node.callee.start, - end: script.start, - }); - node.iterateEnd = function() { + node.iterateEnd = function () { data.changes.push({ start: node.end - 1, end: node.end, }); }; - }; - + break; + case 'rewrite': + const [script] = node.arguments; + data.changes.push({ + start: node.callee.start, + end: script.start, + }); + node.iterateEnd = function () { + data.changes.push({ + start: node.end - 1, + end: node.end, + }); + }; + } }); -}; +} function isWrapped(node) { if (node.type !== Syntax.MemberExpression) return false; if (node.property.name === 'rewrite' && isWrapped(node.object)) return true; - if (node.object.type !== Syntax.Identifier || node.object.name !== '__uv') return false; - if (!['js', '$get', '$wrap', 'rewriteUrl'].includes(node.property.name)) return false; + if (node.object.type !== Syntax.Identifier || node.object.name !== '__uv') + return false; + if (!['js', '$get', '$wrap', 'rewriteUrl'].includes(node.property.name)) + return false; return true; -}; +} function computedProperty(parent) { if (!parent.computed) return false; - const { property: node } = parent; + const { property: node } = parent; if (node.type === 'Literal' && !['location', 'top', 'parent']) return false; return true; +} + +export { + property, + wrapEval, + dynamicImport, + importDeclaration, + identifier, + unwrap, }; - - -export { property, wrapEval, dynamicImport, importDeclaration, identifier, unwrap }; \ No newline at end of file diff --git a/src/uv.config.js b/src/uv.config.js index 16f08dd..6627583 100644 --- a/src/uv.config.js +++ b/src/uv.config.js @@ -1,10 +1,10 @@ -self.__uv$config = { - prefix: '/service/', - bare: 'https://incog.dev/bare/', - encodeUrl: Ultraviolet.codec.xor.encode, - decodeUrl: Ultraviolet.codec.xor.decode, - handler: '/uv.handler.js', - bundle: '/uv.bundle.js', - config: '/uv.config.js', - sw: '/uv.sw.js', -}; \ No newline at end of file +self.__uv$config = { + prefix: '/service/', + bare: 'https://incog.dev/bare/', + encodeUrl: Ultraviolet.codec.xor.encode, + decodeUrl: Ultraviolet.codec.xor.decode, + handler: '/uv.handler.js', + bundle: '/uv.bundle.js', + config: '/uv.config.js', + sw: '/uv.sw.js', +}; diff --git a/src/uv.handler.js b/src/uv.handler.js index c387875..1229346 100644 --- a/src/uv.handler.js +++ b/src/uv.handler.js @@ -1,1131 +1,1428 @@ -if (!self.__uv) { - __uvHook(self, self.__uv$config, self.__uv$config.bare); -}; - -function __uvHook(window, config = {}, bare = '/bare/') { - if ('__uv' in window && window.__uv instanceof Ultraviolet) return false; - - if (window.document && !!window.window) { - window.document.querySelectorAll("script[__uv-script]").forEach(node => node.remove()) - }; - - const worker = !window.window; - const master = '__uv'; - const methodPrefix = '__uv$'; - const __uv = new Ultraviolet({ - ...config, - window, - }); - - if (typeof config.construct === 'function') { - config.construct(__uv, worker ? 'worker' : 'window'); - }; - - const { client } = __uv; - const { - HTMLMediaElement, - HTMLScriptElement, - HTMLAudioElement, - HTMLVideoElement, - HTMLInputElement, - HTMLEmbedElement, - HTMLTrackElement, - HTMLAnchorElement, - HTMLIFrameElement, - HTMLAreaElement, - HTMLLinkElement, - HTMLBaseElement, - HTMLFormElement, - HTMLImageElement, - HTMLSourceElement, - } = window; - - client.nativeMethods.defineProperty(window, '__uv', { - value: __uv, - enumerable: false, - }); - - - __uv.meta.origin = location.origin; - __uv.location = client.location.emulate( - (href) => { - if (href === 'about:srcdoc') return new URL(href); - if (href.startsWith('blob:')) href = href.slice('blob:'.length); - return new URL(__uv.sourceUrl(href)); - }, - (href) => { - return __uv.rewriteUrl(href); - }, - ); - - __uv.cookieStr = window.__uv$cookies || ''; - __uv.meta.url = __uv.location; - __uv.domain = __uv.meta.url.host; - __uv.blobUrls = new window.Map(); - __uv.referrer = ''; - __uv.cookies = []; - __uv.localStorageObj = {}; - __uv.sessionStorageObj = {}; - - try { - __uv.bare = new URL(bare, window.location.href); - } catch(e) { - __uv.bare = window.parent.__uv.bare; - }; - - if (__uv.location.href === 'about:srcdoc') { - __uv.meta = window.parent.__uv.meta; - }; - - if (window.EventTarget) { - __uv.addEventListener = window.EventTarget.prototype.addEventListener; - __uv.removeListener = window.EventTarget.prototype.removeListener; - __uv.dispatchEvent = window.EventTarget.prototype.dispatchEvent; - }; - - // Storage wrappers - client.nativeMethods.defineProperty(client.storage.storeProto, '__uv$storageObj', { - get() { - if (this === client.storage.sessionStorage) return __uv.sessionStorageObj; - if (this === client.storage.localStorage) return __uv.localStorageObj; - }, - enumerable: false, - }); - - if (window.localStorage) { - for (const key in window.localStorage) { - if (key.startsWith(methodPrefix + __uv.location.origin + '@')) { - __uv.localStorageObj[key.slice((methodPrefix + __uv.location.origin + '@').length)] = window.localStorage.getItem(key); - }; - }; - - __uv.lsWrap = client.storage.emulate(client.storage.localStorage, __uv.localStorageObj); - }; - - if (window.sessionStorage) { - for (const key in window.sessionStorage) { - if (key.startsWith(methodPrefix + __uv.location.origin + '@')) { - __uv.sessionStorageObj[key.slice((methodPrefix + __uv.location.origin + '@').length)] = window.sessionStorage.getItem(key); - }; - }; - - __uv.ssWrap = client.storage.emulate(client.storage.sessionStorage, __uv.sessionStorageObj); - }; - - - - let rawBase = window.document ? client.node.baseURI.get.call(window.document) : window.location.href; - let base = __uv.sourceUrl(rawBase); - - client.nativeMethods.defineProperty(__uv.meta, 'base', { - get() { - if (!window.document) return __uv.meta.url.href; - - if (client.node.baseURI.get.call(window.document) !== rawBase) { - rawBase = client.node.baseURI.get.call(window.document); - base = __uv.sourceUrl(rawBase); - }; - - return base; - }, - }); - - - __uv.methods = { - setSource: methodPrefix + 'setSource', - source: methodPrefix + 'source', - location: methodPrefix + 'location', - function: methodPrefix + 'function', - string: methodPrefix + 'string', - eval: methodPrefix + 'eval', - parent: methodPrefix + 'parent', - top: methodPrefix + 'top', - }; - - __uv.filterKeys = [ - master, - __uv.methods.setSource, - __uv.methods.source, - __uv.methods.location, - __uv.methods.function, - __uv.methods.string, - __uv.methods.eval, - __uv.methods.parent, - __uv.methods.top, - methodPrefix + 'protocol', - methodPrefix + 'storageObj', - methodPrefix + 'url', - methodPrefix + 'modifiedStyle', - methodPrefix + 'config', - methodPrefix + 'dispatched', - 'Ultraviolet', - '__uvHook', - ]; - - - client.on('wrap', (target, wrapped) => { - client.nativeMethods.defineProperty(wrapped, 'name', client.nativeMethods.getOwnPropertyDescriptor(target, 'name')); - client.nativeMethods.defineProperty(wrapped, 'length', client.nativeMethods.getOwnPropertyDescriptor(target, 'length')); - - client.nativeMethods.defineProperty(wrapped, __uv.methods.string, { - enumerable: false, - value: client.nativeMethods.fnToString.call(target), - }); - - client.nativeMethods.defineProperty(wrapped, __uv.methods.function, { - enumerable: false, - value: target, - }); - }); - - client.fetch.on('request', event => { - event.data.input = __uv.rewriteUrl(event.data.input); - }); - - client.fetch.on('requestUrl', event => { - event.data.value = __uv.sourceUrl(event.data.value); - }); - - client.fetch.on('responseUrl', event => { - event.data.value = __uv.sourceUrl(event.data.value); - }); - - // XMLHttpRequest - client.xhr.on('open', event => { - event.data.input = __uv.rewriteUrl(event.data.input); - }); - - client.xhr.on('responseUrl', event => { - event.data.value = __uv.sourceUrl(event.data.value); - }); - - - // Workers - client.workers.on('worker', event => { - event.data.url = __uv.rewriteUrl(event.data.url); - }); - - client.workers.on('addModule', event => { - event.data.url = __uv.rewriteUrl(event.data.url); - }); - - client.workers.on('importScripts', event => { - for (const i in event.data.scripts) { - event.data.scripts[i] = __uv.rewriteUrl(event.data.scripts[i]); - }; - }); - - client.workers.on('postMessage', event => { - let to = event.data.origin; - - event.data.origin = '*'; - event.data.message = { - __data: event.data.message, - __origin: __uv.meta.url.origin, - __to: to, - }; - }); - - // Navigator - client.navigator.on('sendBeacon', event => { - event.data.url = __uv.rewriteUrl(event.data.url); - }); - - // Cookies - client.document.on('getCookie', event => { - event.data.value = __uv.cookieStr; - }); - - client.document.on('setCookie', event => { - Promise.resolve(__uv.cookie.setCookies(event.data.value, __uv.db, __uv.meta)).then(() => { - __uv.cookie.db().then(db => { - __uv.cookie.getCookies(db).then(cookies => { - __uv.cookieStr = __uv.cookie.serialize(cookies, __uv.meta, true); - }); - }); - }); - const cookie = __uv.cookie.setCookie(event.data.value)[0]; - - if (!cookie.path) cookie.path = '/'; - if (!cookie.domain) cookie.domain = __uv.meta.url.hostname; - - if (__uv.cookie.validateCookie(cookie, __uv.meta, true)) { - if (__uv.cookieStr.length) __uv.cookieStr += '; '; - __uv.cookieStr += `${cookie.name}=${cookie.value}`; - }; - - event.respondWith(event.data.value); - }); - - // HTML - client.element.on('setInnerHTML', event => { - switch (event.that.tagName) { - case 'SCRIPT': - event.data.value = __uv.js.rewrite(event.data.value); - break; - case 'STYLE': - event.data.value = __uv.rewriteCSS(event.data.value); - break; - default: - event.data.value = __uv.rewriteHtml(event.data.value); - }; - }); - - client.element.on('getInnerHTML', event => { - switch (event.that.tagName) { - case 'SCRIPT': - event.data.value = __uv.js.source(event.data.value); - break; - default: - event.data.value = __uv.sourceHtml(event.data.value); - }; - }); - - client.element.on('setOuterHTML', event => { - event.data.value = __uv.rewriteHtml(event.data.value, { document: event.that.tagName === 'HTML' }); - }); - - client.element.on('getOuterHTML', event => { - switch (event.that.tagName) { - case 'HEAD': - event.data.value = __uv.sourceHtml( - event.data.value.replace(/(.*)<\/head>/s, '$2') - ).replace(/(.*)<\/op-head>/s, '$2'); - break; - case 'BODY': - event.data.value = __uv.sourceHtml( - event.data.value.replace(/(.*)<\/body>/s, '$2') - ).replace(/(.*)<\/op-body>/s, '$2'); - break; - default: - event.data.value = __uv.sourceHtml(event.data.value, { document: event.that.tagName === 'HTML' }); - break; - }; - - //event.data.value = __uv.sourceHtml(event.data.value, { document: event.that.tagName === 'HTML' }); - }); - - client.document.on('write', event => { - if (!event.data.html.length) return false; - event.data.html = [__uv.rewriteHtml(event.data.html.join(''))]; - }); - - client.document.on('writeln', event => { - if (!event.data.html.length) return false; - event.data.html = [__uv.rewriteHtml(event.data.html.join(''))]; - }); - - client.element.on('insertAdjacentHTML', event => { - event.data.html = __uv.rewriteHtml(event.data.html); - }); - - // EventSource - - client.eventSource.on('construct', event => { - event.data.url = __uv.rewriteUrl(event.data.url); - }); - - - client.eventSource.on('url', event => { - event.data.url = __uv.rewriteUrl(event.data.url); - }); - - // History - client.history.on('replaceState', event => { - if (event.data.url) event.data.url = __uv.rewriteUrl(event.data.url, '__uv' in event.that ? event.that.__uv.meta : __uv.meta); - }); - client.history.on('pushState', event => { - if (event.data.url) event.data.url = __uv.rewriteUrl(event.data.url, '__uv' in event.that ? event.that.__uv.meta : __uv.meta); - }); - - // Element get set attribute methods - client.element.on('getAttribute', event => { - if (client.element.hasAttribute.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name)) { - event.respondWith( - event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name) - ); - }; - }); - - // Message - client.message.on('postMessage', event => { - let to = event.data.origin; - let call = __uv.call; - - - if (event.that) { - call = event.that.__uv$source.call; - }; - - event.data.origin = '*'; - event.data.message = { - __data: event.data.message, - __origin: (event.that || event.target).__uv$source.location.origin, - __to: to, - }; - - event.respondWith( - worker ? - call(event.target, [event.data.message, event.data.transfer], event.that) : - call(event.target, [event.data.message, event.data.origin, event.data.transfer], event.that) - ); - - }); - - client.message.on('data', event => { - const { value: data } = event.data; - if (typeof data === 'object' && '__data' in data && '__origin' in data) { - event.respondWith(data.__data); - }; - }); - - client.message.on('origin', event => { - const data = client.message.messageData.get.call(event.that); - if (typeof data === 'object' && data.__data && data.__origin) { - event.respondWith(data.__origin); - }; - }); - - client.overrideDescriptor(window, 'origin', { - get: (target, that) => { - return __uv.location.origin; - }, - }); - - client.node.on('baseURI', event => { - if (event.data.value.startsWith(window.location.origin)) event.data.value = __uv.sourceUrl(event.data.value); - }); - - client.element.on('setAttribute', event => { - if (event.that instanceof HTMLMediaElement && event.data.name === 'src' && event.data.value.startsWith('blob:')) { - event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); - event.data.value = __uv.blobUrls.get(event.data.value); - return; - }; - - if (__uv.attrs.isUrl(event.data.name)) { - event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); - event.data.value = __uv.rewriteUrl(event.data.value); - }; - - if (__uv.attrs.isStyle(event.data.name)) { - event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); - event.data.value = __uv.rewriteCSS(event.data.value, { context: 'declarationList' }); - }; - - if (__uv.attrs.isHtml(event.data.name)) { - event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); - event.data.value = __uv.rewriteHtml(event.data.value, {...__uv.meta, document: true, injectHead:__uv.createHtmlInject(__uv.handlerScript, __uv.bundleScript, __uv.configScript, __uv.cookieStr, window.location.href) }); - }; - - if (__uv.attrs.isSrcset(event.data.name)) { - event.target.call(event.that, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); - event.data.value = __uv.html.wrapSrcset(event.data.value); - }; - - if (__uv.attrs.isForbidden(event.data.name)) { - event.data.name = __uv.attributePrefix + '-attr-' + event.data.name; - }; - }); - - client.element.on('audio', event => { - event.data.url = __uv.rewriteUrl(event.data.url); - }); - - // Element Property Attributes - client.element.hookProperty([HTMLAnchorElement, HTMLAreaElement, HTMLLinkElement, HTMLBaseElement], 'href', { - get: (target, that) => { - return __uv.sourceUrl( - target.call(that) - ); - }, - set: (target, that, [val]) => { - client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-href', val) - target.call(that, __uv.rewriteUrl(val)); - }, - }); - - client.element.hookProperty([HTMLScriptElement, HTMLAudioElement, HTMLVideoElement, HTMLMediaElement, HTMLImageElement, HTMLInputElement, HTMLEmbedElement, HTMLIFrameElement, HTMLTrackElement, HTMLSourceElement], 'src', { - get: (target, that) => { - return __uv.sourceUrl( - target.call(that) - ); - }, - set: (target, that, [val]) => { - if (new String(val).toString().trim().startsWith('blob:') && that instanceof HTMLMediaElement) { - client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-src', val) - return target.call(that, __uv.blobUrls.get(val) || val); - }; - - client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-src', val) - target.call(that, __uv.rewriteUrl(val)); - }, - }); - - client.element.hookProperty([HTMLFormElement], 'action', { - get: (target, that) => { - return __uv.sourceUrl( - target.call(that) - ); - }, - set: (target, that, [val]) => { - client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-action', val) - target.call(that, __uv.rewriteUrl(val)); - }, - }); - - client.element.hookProperty([HTMLImageElement], 'srcset', { - get: (target, that) => { - return client.element.getAttribute.call(that, __uv.attributePrefix + '-attr-srcset') || target.call(that); - }, - set: (target, that, [val]) => { - client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-srcset', val) - target.call(that, __uv.html.wrapSrcset(val)); - }, - }); - - client.element.hookProperty(HTMLScriptElement, 'integrity', { - get: (target, that) => { - return client.element.getAttribute.call(that, __uv.attributePrefix + '-attr-integrity'); - }, - set: (target, that, [val]) => { - client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-integrity', val); - }, - }); - - client.element.hookProperty(HTMLIFrameElement, 'sandbox', { - get: (target, that) => { - return client.element.getAttribute.call(that, __uv.attributePrefix + '-attr-sandbox') || target.call(that); - }, - set: (target, that, [val]) => { - client.element.setAttribute.call(that, __uv.attributePrefix + '-attr-sandbox', val); - }, - }); - - client.element.hookProperty(HTMLIFrameElement, 'contentWindow', { - get: (target, that) => { - const win = target.call(that); - try { - if (!win.__uv) __uvHook(win, config, bare); - return win; - } catch (e) { - return win; - }; - }, - }); - - client.element.hookProperty(HTMLIFrameElement, 'contentDocument', { - get: (target, that) => { - const doc = target.call(that); - try { - const win = doc.defaultView - if (!win.__uv) __uvHook(win, config, bare); - return doc; - } catch (e) { - return win; - }; - }, - }); - - client.element.hookProperty(HTMLIFrameElement, 'srcdoc', { - get: (target, that) => { - return client.element.getAttribute.call(that, __uv.attributePrefix + '-attr-srcdoc') || target.call(that); - }, - set: (target, that, [val]) => { - target.call(that, __uv.rewriteHtml(val, { - document: true, - injectHead: __uv.createHtmlInject(__uv.handlerScript, __uv.bundleScript, __uv.configScript, __uv.cookieStr, window.location.href) - })) - }, - }); - - client.node.on('getTextContent', event => { - if (event.that.tagName === 'SCRIPT') { - event.data.value = __uv.js.source(event.data.value); - }; - }); - - client.node.on('setTextContent', event => { - if (event.that.tagName === 'SCRIPT') { - event.data.value = __uv.js.rewrite(event.data.value); - }; - }); - - // Until proper rewriting is implemented for service workers. - // Not sure atm how to implement it with the already built in service worker - if ('serviceWorker' in window.navigator) { - delete window.Navigator.prototype.serviceWorker; - }; - - // Document - client.document.on('getDomain', event => { - event.data.value = __uv.domain; - }); - client.document.on('setDomain', event => { - if (!event.data.value.toString().endsWith(__uv.meta.url.hostname.split('.').slice(-2).join('.'))) return event.respondWith(''); - event.respondWith(__uv.domain = event.data.value); - }) - - client.document.on('url', event => { - event.data.value = __uv.location.href; - }); - - client.document.on('documentURI', event => { - event.data.value = __uv.location.href; - }); - - client.document.on('referrer', event => { - event.data.value = __uv.referrer || __uv.sourceUrl(event.data.value); - }); - - client.document.on('parseFromString', event => { - if (event.data.type !== 'text/html') return false; - event.data.string = __uv.rewriteHtml(event.data.string, {...__uv.meta, document: true, }); - }); - - // Attribute (node.attributes) - client.attribute.on('getValue', event => { - if (client.element.hasAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name)) { - event.data.value = client.element.getAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name); - }; - }); - - client.attribute.on('setValue', event => { - if (__uv.attrs.isUrl(event.data.name)) { - client.element.setAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); - event.data.value = __uv.rewriteUrl(event.data.value); - }; - - if (__uv.attrs.isStyle(event.data.name)) { - client.element.setAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); - event.data.value = __uv.rewriteCSS(event.data.value, { context: 'declarationList' }); - }; - - if (__uv.attrs.isHtml(event.data.name)) { - client.element.setAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); - event.data.value = __uv.rewriteHtml(event.data.value, {...__uv.meta, document: true, injectHead:__uv.createHtmlInject(__uv.handlerScript, __uv.bundleScript, __uv.configScript, __uv.cookieStr, window.location.href) }); - }; - - if (__uv.attrs.isSrcset(event.data.name)) { - client.element.setAttribute.call(event.that.ownerElement, __uv.attributePrefix + '-attr-' + event.data.name, event.data.value); - event.data.value = __uv.html.wrapSrcset(event.data.value); - }; - - }); - - // URL - client.url.on('createObjectURL', event => { - let url = event.target.call(event.that, event.data.object); - if (url.startsWith('blob:' + location.origin)) { - let newUrl = 'blob:' + (__uv.meta.url.href !== 'about:blank' ? __uv.meta.url.origin : window.parent.__uv.meta.url.origin) + url.slice('blob:'.length + location.origin.length); - __uv.blobUrls.set(newUrl, url); - event.respondWith(newUrl); - } else { - event.respondWith(url); - }; - }); - - client.url.on('revokeObjectURL', event => { - if (__uv.blobUrls.has(event.data.url)) { - const old = event.data.url; - event.data.url = __uv.blobUrls.get(event.data.url); - __uv.blobUrls.delete(old); - }; - }); - - client.storage.on('get', event => { - event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; - }); - - client.storage.on('set', event => { - if (event.that.__uv$storageObj) { - event.that.__uv$storageObj[event.data.name] = event.data.value; - }; - event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; - }); - - client.storage.on('delete', event => { - if (event.that.__uv$storageObj) { - delete event.that.__uv$storageObj[event.data.name]; - }; - event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; - }); - - client.storage.on('getItem', event => { - event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; - }); - - client.storage.on('setItem', event => { - if (event.that.__uv$storageObj) { - event.that.__uv$storageObj[event.data.name] = event.data.value; - }; - event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; - }); - - client.storage.on('removeItem', event => { - if (event.that.__uv$storageObj) { - delete event.that.__uv$storageObj[event.data.name]; - }; - event.data.name = methodPrefix + __uv.meta.url.origin + '@' + event.data.name; - }); - - client.storage.on('clear', event => { - if (event.that.__uv$storageObj) { - for (const key of client.nativeMethods.keys.call(null, event.that.__uv$storageObj)) { - delete event.that.__uv$storageObj[key]; - client.storage.removeItem.call(event.that, methodPrefix + __uv.meta.url.origin + '@' + key); - event.respondWith(); - }; - }; - }); - - client.storage.on('length', event => { - if (event.that.__uv$storageObj) { - event.respondWith(client.nativeMethods.keys.call(null, event.that.__uv$storageObj).length); - }; - }); - - client.storage.on('key', event => { - if (event.that.__uv$storageObj) { - event.respondWith( - (client.nativeMethods.keys.call(null, event.that.__uv$storageObj)[event.data.index] || null) - ); - }; - }); - - client.websocket.on('websocket', async event => { - let url; - try { - url = new URL(event.data.url); - } catch(e) { - return; - }; - - const headers = { - Host: url.host, - Origin: __uv.meta.url.origin, - Pragma: 'no-cache', - 'Cache-Control': 'no-cache', - Upgrade: 'websocket', - 'User-Agent': window.navigator.userAgent, - 'Connection': 'Upgrade', - }; - - const cookies = __uv.cookie.serialize(__uv.cookies, { url }, false); - - if (cookies) headers.Cookie = cookies; - const protocols = [...event.data.protocols]; - - const remote = { - protocol: url.protocol, - host: url.hostname, - port: url.port || (url.protocol === 'wss:' ? '443' : '80'), - path: url.pathname + url.search, - }; - - if (protocols.length) headers['Sec-WebSocket-Protocol'] = protocols.join(', '); - - event.data.url = (__uv.bare.protocol === 'https:' ? 'wss://' : 'ws://') + __uv.bare.host + __uv.bare.pathname + 'v1/'; - event.data.protocols = [ - 'bare', - __uv.encodeProtocol(JSON.stringify({ - remote, - headers, - forward_headers: [ - 'accept', - 'accept-encoding', - 'accept-language', - 'sec-websocket-extensions', - 'sec-websocket-key', - 'sec-websocket-version', - ], - })), - ]; - - const ws = new event.target(event.data.url, event.data.protocols); - - client.nativeMethods.defineProperty(ws, methodPrefix + 'url', { - enumerable: false, - value: url.href, - }); - - event.respondWith( - ws - ); - }); - - client.websocket.on('url', event => { - if ('__uv$url' in event.that) { - event.data.value = event.that.__uv$url; - }; - }); - - client.websocket.on('protocol', event => { - if ('__uv$protocol' in event.that) { - event.data.value = event.that.__uv$protocol; - }; - }); - - client.function.on('function', event => { - event.data.script = __uv.rewriteJS(event.data.script); - }); - - client.function.on('toString', event => { - if (__uv.methods.string in event.that) event.respondWith(event.that[__uv.methods.string]); - }); - - client.object.on('getOwnPropertyNames', event => { - event.data.names = event.data.names.filter(element => !(__uv.filterKeys.includes(element))); - }); - - client.object.on('getOwnPropertyDescriptors', event => { - for (const forbidden of __uv.filterKeys) { - delete event.data.descriptors[forbidden]; - }; - - }); - - client.style.on('setProperty', event => { - if (client.style.dashedUrlProps.includes(event.data.property)) { - event.data.value = __uv.rewriteCSS(event.data.value, { - context: 'value', - ...__uv.meta - }) - }; - }); - - client.style.on('getPropertyValue', event => { - if (client.style.dashedUrlProps.includes(event.data.property)) { - event.respondWith( - __uv.sourceCSS( - event.target.call(event.that, event.data.property), - { - context: 'value', - ...__uv.meta - } - ) - ); - }; - }); - - if ('CSS2Properties' in window) { - for (const key of client.style.urlProps) { - client.overrideDescriptor(window.CSS2Properties.prototype, key, { - get: (target, that) => { - return __uv.sourceCSS( - target.call(that), - { - context: 'value', - ...__uv.meta - } - ) - }, - set: (target, that, val) => { - target.call( - that, - __uv.rewriteCSS(val, { - context: 'value', - ...__uv.meta - }) - ); - } - }); - }; - } else if ('HTMLElement' in window) { - - client.overrideDescriptor( - window.HTMLElement.prototype, - 'style', - { - get: (target, that) => { - const value = target.call(that); - if (!value[methodPrefix + 'modifiedStyle']) { - - for (const key of client.style.urlProps) { - client.nativeMethods.defineProperty(value, key, { - enumerable: true, - configurable: true, - get() { - const value = client.style.getPropertyValue.call(this, key) || ''; - return __uv.sourceCSS( - value, - { - context: 'value', - ...__uv.meta - } - ) - }, - set(val) { - client.style.setProperty.call(this, - (client.style.propToDashed[key] || key), - __uv.rewriteCSS(val, { - context: 'value', - ...__uv.meta - }) - ) - } - }); - client.nativeMethods.defineProperty(value, methodPrefix + 'modifiedStyle', { - enumerable: false, - value: true - }); - }; - }; - return value; - } - } - ); - }; - - client.style.on('setCssText', event => { - event.data.value = __uv.rewriteCSS(event.data.value, { - context: 'declarationList', - ...__uv.meta - }); - }); - - client.style.on('getCssText', event => { - event.data.value = __uv.sourceCSS(event.data.value, { - context: 'declarationList', - ...__uv.meta - }); - }); - - // Proper hash emulation. - if (!!window.window) { - __uv.addEventListener.call(window, 'hashchange', event => { - if (event.__uv$dispatched) return false; - event.stopImmediatePropagation(); - const hash = window.location.hash; - client.history.replaceState.call(window.history, '', '', event.oldURL); - __uv.location.hash = hash; - }); - }; - - client.location.on('hashchange', (oldUrl, newUrl, ctx) => { - if (ctx.HashChangeEvent && client.history.replaceState) { - client.history.replaceState.call(window.history, '', '', __uv.rewriteUrl(newUrl)); - - const event = new ctx.HashChangeEvent('hashchange', { newURL: newUrl, oldURL: oldUrl }); - - client.nativeMethods.defineProperty(event, methodPrefix + 'dispatched', { - value: true, - enumerable: false, - }); - - __uv.dispatchEvent.call(window, event); - }; - }); - - // Hooking functions & descriptors - client.fetch.overrideRequest(); - client.fetch.overrideUrl(); - client.xhr.overrideOpen(); - client.xhr.overrideResponseUrl(); - client.element.overrideHtml(); - client.element.overrideAttribute(); - client.element.overrideInsertAdjacentHTML(); - client.element.overrideAudio(); - // client.element.overrideQuerySelector(); - client.node.overrideBaseURI(); - client.node.overrideTextContent(); - client.attribute.overrideNameValue(); - client.document.overrideDomain(); - client.document.overrideURL(); - client.document.overrideDocumentURI(); - client.document.overrideWrite(); - client.document.overrideReferrer(); - client.document.overrideParseFromString(); - client.storage.overrideMethods(); - client.storage.overrideLength(); - //client.document.overrideQuerySelector(); - client.object.overrideGetPropertyNames(); - client.object.overrideGetOwnPropertyDescriptors(); - client.history.overridePushState(); - client.history.overrideReplaceState(); - client.eventSource.overrideConstruct(); - client.eventSource.overrideUrl(); - client.websocket.overrideWebSocket(); - client.websocket.overrideProtocol(); - client.websocket.overrideUrl(); - client.url.overrideObjectURL(); - client.document.overrideCookie(); - client.message.overridePostMessage(); - client.message.overrideMessageOrigin(); - client.message.overrideMessageData(); - client.workers.overrideWorker(); - client.workers.overrideAddModule(); - client.workers.overrideImportScripts(); - client.workers.overridePostMessage(); - client.style.overrideSetGetProperty(); - client.style.overrideCssText(); - client.navigator.overrideSendBeacon(); - client.function.overrideFunction(); - client.function.overrideToString(); - client.location.overrideWorkerLocation( - (href) => { - return new URL(__uv.sourceUrl(href)); - } - ); - - client.overrideDescriptor(window, 'localStorage', { - get: (target, that) => { - return (that || window).__uv.lsWrap; - }, - }); - client.overrideDescriptor(window, 'sessionStorage', { - get: (target, that) => { - return (that || window).__uv.ssWrap; - }, - }); - - - client.override(window, 'open', (target, that, args) => { - if (!args.length) return target.apply(that, args); - let [url] = args; - - url = __uv.rewriteUrl(url); - - return target.call(that, url); - }); - - __uv.$wrap = function(name) { - if (name === 'location') return __uv.methods.location; - if (name === 'eval') return __uv.methods.eval; - return name; - }; - - - __uv.$get = function(that) { - if (that === window.location) return __uv.location; - if (that === window.eval) return __uv.eval; - if (that === window.parent) { - return window.__uv$parent; - }; - if (that === window.top) { - return window.__uv$top; - }; - return that; - }; - - __uv.eval = client.wrap(window, 'eval', (target, that, args) => { - if (!args.length || typeof args[0] !== 'string') return target.apply(that, args); - let [script] = args; - - script = __uv.rewriteJS(script); - return target.call(that, script); - }); - - __uv.call = function(target, args, that) { - return that ? target.apply(that, args) : target(...args); - }; - - __uv.call$ = function(obj, prop, args = []) { - return obj[prop].apply(obj, args); - }; - - client.nativeMethods.defineProperty(window.Object.prototype, master, { - get: () => { - return __uv; - }, - enumerable: false - }); - - client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.setSource, { - value: function(source) { - if (!client.nativeMethods.isExtensible(this)) return this; - - client.nativeMethods.defineProperty(this, __uv.methods.source, { - value: source, - writable: true, - enumerable: false - }); - - return this; - }, - enumerable: false, - }); - - client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.source, { - value: __uv, - writable: true, - enumerable: false - }); - - client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.location, { - configurable: true, - get() { - return (this === window.document || this === window) ? __uv.location : this.location; - }, - set(val) { - if (this === window.document || this === window) { - __uv.location.href = val; - } else { - this.location = val; - }; - }, - }); - - client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.parent, { - configurable: true, - get() { - const val = this.parent; - - if (this === window) { - try { - return '__uv' in val ? val : this; - } catch (e) { - return this; - }; - }; - return val; - }, - set(val) { - this.parent = val; - }, - }); - - client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.top, { - configurable: true, - get() { - const val = this.top; - - if (this === window) { - if (val === this.parent) return this[__uv.methods.parent]; - try { - if (!('__uv' in val)) { - let current = this; - - while (current.parent !== val) { - current = current.parent - }; - - return '__uv' in current ? current : this; - - } else { - return val; - }; - } catch (e) { - return this; - }; - }; - return val; - }, - set(val) { - this.top = val; - }, - }); - - - client.nativeMethods.defineProperty(window.Object.prototype, __uv.methods.eval, { - configurable: true, - get() { - return this === window ? __uv.eval : this.eval; - }, - set(val) { - this.eval = val; - }, - }); -}; - -self.__uvHook = __uvHook; \ No newline at end of file +if (!self.__uv) { + __uvHook(self, self.__uv$config, self.__uv$config.bare); +} + +function __uvHook(window, config = {}, bare = '/bare/') { + if ('__uv' in window && window.__uv instanceof Ultraviolet) return false; + + if (window.document && !!window.window) { + window.document + .querySelectorAll('script[__uv-script]') + .forEach((node) => node.remove()); + } + + const worker = !window.window; + const master = '__uv'; + const methodPrefix = '__uv$'; + const __uv = new Ultraviolet({ + ...config, + window, + }); + + if (typeof config.construct === 'function') { + config.construct(__uv, worker ? 'worker' : 'window'); + } + + const { client } = __uv; + const { + HTMLMediaElement, + HTMLScriptElement, + HTMLAudioElement, + HTMLVideoElement, + HTMLInputElement, + HTMLEmbedElement, + HTMLTrackElement, + HTMLAnchorElement, + HTMLIFrameElement, + HTMLAreaElement, + HTMLLinkElement, + HTMLBaseElement, + HTMLFormElement, + HTMLImageElement, + HTMLSourceElement, + } = window; + + client.nativeMethods.defineProperty(window, '__uv', { + value: __uv, + enumerable: false, + }); + + __uv.meta.origin = location.origin; + __uv.location = client.location.emulate( + (href) => { + if (href === 'about:srcdoc') return new URL(href); + if (href.startsWith('blob:')) href = href.slice('blob:'.length); + return new URL(__uv.sourceUrl(href)); + }, + (href) => { + return __uv.rewriteUrl(href); + } + ); + + __uv.cookieStr = window.__uv$cookies || ''; + __uv.meta.url = __uv.location; + __uv.domain = __uv.meta.url.host; + __uv.blobUrls = new window.Map(); + __uv.referrer = ''; + __uv.cookies = []; + __uv.localStorageObj = {}; + __uv.sessionStorageObj = {}; + + try { + __uv.bare = new URL(bare, window.location.href); + } catch (e) { + __uv.bare = window.parent.__uv.bare; + } + + if (__uv.location.href === 'about:srcdoc') { + __uv.meta = window.parent.__uv.meta; + } + + if (window.EventTarget) { + __uv.addEventListener = window.EventTarget.prototype.addEventListener; + __uv.removeListener = window.EventTarget.prototype.removeListener; + __uv.dispatchEvent = window.EventTarget.prototype.dispatchEvent; + } + + // Storage wrappers + client.nativeMethods.defineProperty( + client.storage.storeProto, + '__uv$storageObj', + { + get() { + if (this === client.storage.sessionStorage) + return __uv.sessionStorageObj; + if (this === client.storage.localStorage) + return __uv.localStorageObj; + }, + enumerable: false, + } + ); + + if (window.localStorage) { + for (const key in window.localStorage) { + if (key.startsWith(methodPrefix + __uv.location.origin + '@')) { + __uv.localStorageObj[ + key.slice( + (methodPrefix + __uv.location.origin + '@').length + ) + ] = window.localStorage.getItem(key); + } + } + + __uv.lsWrap = client.storage.emulate( + client.storage.localStorage, + __uv.localStorageObj + ); + } + + if (window.sessionStorage) { + for (const key in window.sessionStorage) { + if (key.startsWith(methodPrefix + __uv.location.origin + '@')) { + __uv.sessionStorageObj[ + key.slice( + (methodPrefix + __uv.location.origin + '@').length + ) + ] = window.sessionStorage.getItem(key); + } + } + + __uv.ssWrap = client.storage.emulate( + client.storage.sessionStorage, + __uv.sessionStorageObj + ); + } + + let rawBase = window.document + ? client.node.baseURI.get.call(window.document) + : window.location.href; + let base = __uv.sourceUrl(rawBase); + + client.nativeMethods.defineProperty(__uv.meta, 'base', { + get() { + if (!window.document) return __uv.meta.url.href; + + if (client.node.baseURI.get.call(window.document) !== rawBase) { + rawBase = client.node.baseURI.get.call(window.document); + base = __uv.sourceUrl(rawBase); + } + + return base; + }, + }); + + __uv.methods = { + setSource: methodPrefix + 'setSource', + source: methodPrefix + 'source', + location: methodPrefix + 'location', + function: methodPrefix + 'function', + string: methodPrefix + 'string', + eval: methodPrefix + 'eval', + parent: methodPrefix + 'parent', + top: methodPrefix + 'top', + }; + + __uv.filterKeys = [ + master, + __uv.methods.setSource, + __uv.methods.source, + __uv.methods.location, + __uv.methods.function, + __uv.methods.string, + __uv.methods.eval, + __uv.methods.parent, + __uv.methods.top, + methodPrefix + 'protocol', + methodPrefix + 'storageObj', + methodPrefix + 'url', + methodPrefix + 'modifiedStyle', + methodPrefix + 'config', + methodPrefix + 'dispatched', + 'Ultraviolet', + '__uvHook', + ]; + + client.on('wrap', (target, wrapped) => { + client.nativeMethods.defineProperty( + wrapped, + 'name', + client.nativeMethods.getOwnPropertyDescriptor(target, 'name') + ); + client.nativeMethods.defineProperty( + wrapped, + 'length', + client.nativeMethods.getOwnPropertyDescriptor(target, 'length') + ); + + client.nativeMethods.defineProperty(wrapped, __uv.methods.string, { + enumerable: false, + value: client.nativeMethods.fnToString.call(target), + }); + + client.nativeMethods.defineProperty(wrapped, __uv.methods.function, { + enumerable: false, + value: target, + }); + }); + + client.fetch.on('request', (event) => { + event.data.input = __uv.rewriteUrl(event.data.input); + }); + + client.fetch.on('requestUrl', (event) => { + event.data.value = __uv.sourceUrl(event.data.value); + }); + + client.fetch.on('responseUrl', (event) => { + event.data.value = __uv.sourceUrl(event.data.value); + }); + + // XMLHttpRequest + client.xhr.on('open', (event) => { + event.data.input = __uv.rewriteUrl(event.data.input); + }); + + client.xhr.on('responseUrl', (event) => { + event.data.value = __uv.sourceUrl(event.data.value); + }); + + // Workers + client.workers.on('worker', (event) => { + event.data.url = __uv.rewriteUrl(event.data.url); + }); + + client.workers.on('addModule', (event) => { + event.data.url = __uv.rewriteUrl(event.data.url); + }); + + client.workers.on('importScripts', (event) => { + for (const i in event.data.scripts) { + event.data.scripts[i] = __uv.rewriteUrl(event.data.scripts[i]); + } + }); + + client.workers.on('postMessage', (event) => { + let to = event.data.origin; + + event.data.origin = '*'; + event.data.message = { + __data: event.data.message, + __origin: __uv.meta.url.origin, + __to: to, + }; + }); + + // Navigator + client.navigator.on('sendBeacon', (event) => { + event.data.url = __uv.rewriteUrl(event.data.url); + }); + + // Cookies + client.document.on('getCookie', (event) => { + event.data.value = __uv.cookieStr; + }); + + client.document.on('setCookie', (event) => { + Promise.resolve( + __uv.cookie.setCookies(event.data.value, __uv.db, __uv.meta) + ).then(() => { + __uv.cookie.db().then((db) => { + __uv.cookie.getCookies(db).then((cookies) => { + __uv.cookieStr = __uv.cookie.serialize( + cookies, + __uv.meta, + true + ); + }); + }); + }); + const cookie = __uv.cookie.setCookie(event.data.value)[0]; + + if (!cookie.path) cookie.path = '/'; + if (!cookie.domain) cookie.domain = __uv.meta.url.hostname; + + if (__uv.cookie.validateCookie(cookie, __uv.meta, true)) { + if (__uv.cookieStr.length) __uv.cookieStr += '; '; + __uv.cookieStr += `${cookie.name}=${cookie.value}`; + } + + event.respondWith(event.data.value); + }); + + // HTML + client.element.on('setInnerHTML', (event) => { + switch (event.that.tagName) { + case 'SCRIPT': + event.data.value = __uv.js.rewrite(event.data.value); + break; + case 'STYLE': + event.data.value = __uv.rewriteCSS(event.data.value); + break; + default: + event.data.value = __uv.rewriteHtml(event.data.value); + } + }); + + client.element.on('getInnerHTML', (event) => { + switch (event.that.tagName) { + case 'SCRIPT': + event.data.value = __uv.js.source(event.data.value); + break; + default: + event.data.value = __uv.sourceHtml(event.data.value); + } + }); + + client.element.on('setOuterHTML', (event) => { + event.data.value = __uv.rewriteHtml(event.data.value, { + document: event.that.tagName === 'HTML', + }); + }); + + client.element.on('getOuterHTML', (event) => { + switch (event.that.tagName) { + case 'HEAD': + event.data.value = __uv + .sourceHtml( + event.data.value.replace( + /(.*)<\/head>/s, + '$2' + ) + ) + .replace( + /(.*)<\/op-head>/s, + '$2' + ); + break; + case 'BODY': + event.data.value = __uv + .sourceHtml( + event.data.value.replace( + /(.*)<\/body>/s, + '$2' + ) + ) + .replace( + /(.*)<\/op-body>/s, + '$2' + ); + break; + default: + event.data.value = __uv.sourceHtml(event.data.value, { + document: event.that.tagName === 'HTML', + }); + break; + } + + //event.data.value = __uv.sourceHtml(event.data.value, { document: event.that.tagName === 'HTML' }); + }); + + client.document.on('write', (event) => { + if (!event.data.html.length) return false; + event.data.html = [__uv.rewriteHtml(event.data.html.join(''))]; + }); + + client.document.on('writeln', (event) => { + if (!event.data.html.length) return false; + event.data.html = [__uv.rewriteHtml(event.data.html.join(''))]; + }); + + client.element.on('insertAdjacentHTML', (event) => { + event.data.html = __uv.rewriteHtml(event.data.html); + }); + + // EventSource + + client.eventSource.on('construct', (event) => { + event.data.url = __uv.rewriteUrl(event.data.url); + }); + + client.eventSource.on('url', (event) => { + event.data.url = __uv.rewriteUrl(event.data.url); + }); + + // History + client.history.on('replaceState', (event) => { + if (event.data.url) + event.data.url = __uv.rewriteUrl( + event.data.url, + '__uv' in event.that ? event.that.__uv.meta : __uv.meta + ); + }); + client.history.on('pushState', (event) => { + if (event.data.url) + event.data.url = __uv.rewriteUrl( + event.data.url, + '__uv' in event.that ? event.that.__uv.meta : __uv.meta + ); + }); + + // Element get set attribute methods + client.element.on('getAttribute', (event) => { + if ( + client.element.hasAttribute.call( + event.that, + __uv.attributePrefix + '-attr-' + event.data.name + ) + ) { + event.respondWith( + event.target.call( + event.that, + __uv.attributePrefix + '-attr-' + event.data.name + ) + ); + } + }); + + // Message + client.message.on('postMessage', (event) => { + let to = event.data.origin; + let call = __uv.call; + + if (event.that) { + call = event.that.__uv$source.call; + } + + event.data.origin = '*'; + event.data.message = { + __data: event.data.message, + __origin: (event.that || event.target).__uv$source.location.origin, + __to: to, + }; + + event.respondWith( + worker + ? call( + event.target, + [event.data.message, event.data.transfer], + event.that + ) + : call( + event.target, + [ + event.data.message, + event.data.origin, + event.data.transfer, + ], + event.that + ) + ); + }); + + client.message.on('data', (event) => { + const { value: data } = event.data; + if ( + typeof data === 'object' && + '__data' in data && + '__origin' in data + ) { + event.respondWith(data.__data); + } + }); + + client.message.on('origin', (event) => { + const data = client.message.messageData.get.call(event.that); + if (typeof data === 'object' && data.__data && data.__origin) { + event.respondWith(data.__origin); + } + }); + + client.overrideDescriptor(window, 'origin', { + get: (target, that) => { + return __uv.location.origin; + }, + }); + + client.node.on('baseURI', (event) => { + if (event.data.value.startsWith(window.location.origin)) + event.data.value = __uv.sourceUrl(event.data.value); + }); + + client.element.on('setAttribute', (event) => { + if ( + event.that instanceof HTMLMediaElement && + event.data.name === 'src' && + event.data.value.startsWith('blob:') + ) { + event.target.call( + event.that, + __uv.attributePrefix + '-attr-' + event.data.name, + event.data.value + ); + event.data.value = __uv.blobUrls.get(event.data.value); + return; + } + + if (__uv.attrs.isUrl(event.data.name)) { + event.target.call( + event.that, + __uv.attributePrefix + '-attr-' + event.data.name, + event.data.value + ); + event.data.value = __uv.rewriteUrl(event.data.value); + } + + if (__uv.attrs.isStyle(event.data.name)) { + event.target.call( + event.that, + __uv.attributePrefix + '-attr-' + event.data.name, + event.data.value + ); + event.data.value = __uv.rewriteCSS(event.data.value, { + context: 'declarationList', + }); + } + + if (__uv.attrs.isHtml(event.data.name)) { + event.target.call( + event.that, + __uv.attributePrefix + '-attr-' + event.data.name, + event.data.value + ); + event.data.value = __uv.rewriteHtml(event.data.value, { + ...__uv.meta, + document: true, + injectHead: __uv.createHtmlInject( + __uv.handlerScript, + __uv.bundleScript, + __uv.configScript, + __uv.cookieStr, + window.location.href + ), + }); + } + + if (__uv.attrs.isSrcset(event.data.name)) { + event.target.call( + event.that, + __uv.attributePrefix + '-attr-' + event.data.name, + event.data.value + ); + event.data.value = __uv.html.wrapSrcset(event.data.value); + } + + if (__uv.attrs.isForbidden(event.data.name)) { + event.data.name = __uv.attributePrefix + '-attr-' + event.data.name; + } + }); + + client.element.on('audio', (event) => { + event.data.url = __uv.rewriteUrl(event.data.url); + }); + + // Element Property Attributes + client.element.hookProperty( + [HTMLAnchorElement, HTMLAreaElement, HTMLLinkElement, HTMLBaseElement], + 'href', + { + get: (target, that) => { + return __uv.sourceUrl(target.call(that)); + }, + set: (target, that, [val]) => { + client.element.setAttribute.call( + that, + __uv.attributePrefix + '-attr-href', + val + ); + target.call(that, __uv.rewriteUrl(val)); + }, + } + ); + + client.element.hookProperty( + [ + HTMLScriptElement, + HTMLAudioElement, + HTMLVideoElement, + HTMLMediaElement, + HTMLImageElement, + HTMLInputElement, + HTMLEmbedElement, + HTMLIFrameElement, + HTMLTrackElement, + HTMLSourceElement, + ], + 'src', + { + get: (target, that) => { + return __uv.sourceUrl(target.call(that)); + }, + set: (target, that, [val]) => { + if ( + new String(val).toString().trim().startsWith('blob:') && + that instanceof HTMLMediaElement + ) { + client.element.setAttribute.call( + that, + __uv.attributePrefix + '-attr-src', + val + ); + return target.call(that, __uv.blobUrls.get(val) || val); + } + + client.element.setAttribute.call( + that, + __uv.attributePrefix + '-attr-src', + val + ); + target.call(that, __uv.rewriteUrl(val)); + }, + } + ); + + client.element.hookProperty([HTMLFormElement], 'action', { + get: (target, that) => { + return __uv.sourceUrl(target.call(that)); + }, + set: (target, that, [val]) => { + client.element.setAttribute.call( + that, + __uv.attributePrefix + '-attr-action', + val + ); + target.call(that, __uv.rewriteUrl(val)); + }, + }); + + client.element.hookProperty([HTMLImageElement], 'srcset', { + get: (target, that) => { + return ( + client.element.getAttribute.call( + that, + __uv.attributePrefix + '-attr-srcset' + ) || target.call(that) + ); + }, + set: (target, that, [val]) => { + client.element.setAttribute.call( + that, + __uv.attributePrefix + '-attr-srcset', + val + ); + target.call(that, __uv.html.wrapSrcset(val)); + }, + }); + + client.element.hookProperty(HTMLScriptElement, 'integrity', { + get: (target, that) => { + return client.element.getAttribute.call( + that, + __uv.attributePrefix + '-attr-integrity' + ); + }, + set: (target, that, [val]) => { + client.element.setAttribute.call( + that, + __uv.attributePrefix + '-attr-integrity', + val + ); + }, + }); + + client.element.hookProperty(HTMLIFrameElement, 'sandbox', { + get: (target, that) => { + return ( + client.element.getAttribute.call( + that, + __uv.attributePrefix + '-attr-sandbox' + ) || target.call(that) + ); + }, + set: (target, that, [val]) => { + client.element.setAttribute.call( + that, + __uv.attributePrefix + '-attr-sandbox', + val + ); + }, + }); + + client.element.hookProperty(HTMLIFrameElement, 'contentWindow', { + get: (target, that) => { + const win = target.call(that); + try { + if (!win.__uv) __uvHook(win, config, bare); + return win; + } catch (e) { + return win; + } + }, + }); + + client.element.hookProperty(HTMLIFrameElement, 'contentDocument', { + get: (target, that) => { + const doc = target.call(that); + try { + const win = doc.defaultView; + if (!win.__uv) __uvHook(win, config, bare); + return doc; + } catch (e) { + return win; + } + }, + }); + + client.element.hookProperty(HTMLIFrameElement, 'srcdoc', { + get: (target, that) => { + return ( + client.element.getAttribute.call( + that, + __uv.attributePrefix + '-attr-srcdoc' + ) || target.call(that) + ); + }, + set: (target, that, [val]) => { + target.call( + that, + __uv.rewriteHtml(val, { + document: true, + injectHead: __uv.createHtmlInject( + __uv.handlerScript, + __uv.bundleScript, + __uv.configScript, + __uv.cookieStr, + window.location.href + ), + }) + ); + }, + }); + + client.node.on('getTextContent', (event) => { + if (event.that.tagName === 'SCRIPT') { + event.data.value = __uv.js.source(event.data.value); + } + }); + + client.node.on('setTextContent', (event) => { + if (event.that.tagName === 'SCRIPT') { + event.data.value = __uv.js.rewrite(event.data.value); + } + }); + + // Until proper rewriting is implemented for service workers. + // Not sure atm how to implement it with the already built in service worker + if ('serviceWorker' in window.navigator) { + delete window.Navigator.prototype.serviceWorker; + } + + // Document + client.document.on('getDomain', (event) => { + event.data.value = __uv.domain; + }); + client.document.on('setDomain', (event) => { + if ( + !event.data.value + .toString() + .endsWith(__uv.meta.url.hostname.split('.').slice(-2).join('.')) + ) + return event.respondWith(''); + event.respondWith((__uv.domain = event.data.value)); + }); + + client.document.on('url', (event) => { + event.data.value = __uv.location.href; + }); + + client.document.on('documentURI', (event) => { + event.data.value = __uv.location.href; + }); + + client.document.on('referrer', (event) => { + event.data.value = __uv.referrer || __uv.sourceUrl(event.data.value); + }); + + client.document.on('parseFromString', (event) => { + if (event.data.type !== 'text/html') return false; + event.data.string = __uv.rewriteHtml(event.data.string, { + ...__uv.meta, + document: true, + }); + }); + + // Attribute (node.attributes) + client.attribute.on('getValue', (event) => { + if ( + client.element.hasAttribute.call( + event.that.ownerElement, + __uv.attributePrefix + '-attr-' + event.data.name + ) + ) { + event.data.value = client.element.getAttribute.call( + event.that.ownerElement, + __uv.attributePrefix + '-attr-' + event.data.name + ); + } + }); + + client.attribute.on('setValue', (event) => { + if (__uv.attrs.isUrl(event.data.name)) { + client.element.setAttribute.call( + event.that.ownerElement, + __uv.attributePrefix + '-attr-' + event.data.name, + event.data.value + ); + event.data.value = __uv.rewriteUrl(event.data.value); + } + + if (__uv.attrs.isStyle(event.data.name)) { + client.element.setAttribute.call( + event.that.ownerElement, + __uv.attributePrefix + '-attr-' + event.data.name, + event.data.value + ); + event.data.value = __uv.rewriteCSS(event.data.value, { + context: 'declarationList', + }); + } + + if (__uv.attrs.isHtml(event.data.name)) { + client.element.setAttribute.call( + event.that.ownerElement, + __uv.attributePrefix + '-attr-' + event.data.name, + event.data.value + ); + event.data.value = __uv.rewriteHtml(event.data.value, { + ...__uv.meta, + document: true, + injectHead: __uv.createHtmlInject( + __uv.handlerScript, + __uv.bundleScript, + __uv.configScript, + __uv.cookieStr, + window.location.href + ), + }); + } + + if (__uv.attrs.isSrcset(event.data.name)) { + client.element.setAttribute.call( + event.that.ownerElement, + __uv.attributePrefix + '-attr-' + event.data.name, + event.data.value + ); + event.data.value = __uv.html.wrapSrcset(event.data.value); + } + }); + + // URL + client.url.on('createObjectURL', (event) => { + let url = event.target.call(event.that, event.data.object); + if (url.startsWith('blob:' + location.origin)) { + let newUrl = + 'blob:' + + (__uv.meta.url.href !== 'about:blank' + ? __uv.meta.url.origin + : window.parent.__uv.meta.url.origin) + + url.slice('blob:'.length + location.origin.length); + __uv.blobUrls.set(newUrl, url); + event.respondWith(newUrl); + } else { + event.respondWith(url); + } + }); + + client.url.on('revokeObjectURL', (event) => { + if (__uv.blobUrls.has(event.data.url)) { + const old = event.data.url; + event.data.url = __uv.blobUrls.get(event.data.url); + __uv.blobUrls.delete(old); + } + }); + + client.storage.on('get', (event) => { + event.data.name = + methodPrefix + __uv.meta.url.origin + '@' + event.data.name; + }); + + client.storage.on('set', (event) => { + if (event.that.__uv$storageObj) { + event.that.__uv$storageObj[event.data.name] = event.data.value; + } + event.data.name = + methodPrefix + __uv.meta.url.origin + '@' + event.data.name; + }); + + client.storage.on('delete', (event) => { + if (event.that.__uv$storageObj) { + delete event.that.__uv$storageObj[event.data.name]; + } + event.data.name = + methodPrefix + __uv.meta.url.origin + '@' + event.data.name; + }); + + client.storage.on('getItem', (event) => { + event.data.name = + methodPrefix + __uv.meta.url.origin + '@' + event.data.name; + }); + + client.storage.on('setItem', (event) => { + if (event.that.__uv$storageObj) { + event.that.__uv$storageObj[event.data.name] = event.data.value; + } + event.data.name = + methodPrefix + __uv.meta.url.origin + '@' + event.data.name; + }); + + client.storage.on('removeItem', (event) => { + if (event.that.__uv$storageObj) { + delete event.that.__uv$storageObj[event.data.name]; + } + event.data.name = + methodPrefix + __uv.meta.url.origin + '@' + event.data.name; + }); + + client.storage.on('clear', (event) => { + if (event.that.__uv$storageObj) { + for (const key of client.nativeMethods.keys.call( + null, + event.that.__uv$storageObj + )) { + delete event.that.__uv$storageObj[key]; + client.storage.removeItem.call( + event.that, + methodPrefix + __uv.meta.url.origin + '@' + key + ); + event.respondWith(); + } + } + }); + + client.storage.on('length', (event) => { + if (event.that.__uv$storageObj) { + event.respondWith( + client.nativeMethods.keys.call(null, event.that.__uv$storageObj) + .length + ); + } + }); + + client.storage.on('key', (event) => { + if (event.that.__uv$storageObj) { + event.respondWith( + client.nativeMethods.keys.call( + null, + event.that.__uv$storageObj + )[event.data.index] || null + ); + } + }); + + client.websocket.on('websocket', async (event) => { + let url; + try { + url = new URL(event.data.url); + } catch (e) { + return; + } + + const headers = { + Host: url.host, + Origin: __uv.meta.url.origin, + Pragma: 'no-cache', + 'Cache-Control': 'no-cache', + Upgrade: 'websocket', + 'User-Agent': window.navigator.userAgent, + Connection: 'Upgrade', + }; + + const cookies = __uv.cookie.serialize(__uv.cookies, { url }, false); + + if (cookies) headers.Cookie = cookies; + const protocols = [...event.data.protocols]; + + const remote = { + protocol: url.protocol, + host: url.hostname, + port: url.port || (url.protocol === 'wss:' ? '443' : '80'), + path: url.pathname + url.search, + }; + + if (protocols.length) + headers['Sec-WebSocket-Protocol'] = protocols.join(', '); + + event.data.url = + (__uv.bare.protocol === 'https:' ? 'wss://' : 'ws://') + + __uv.bare.host + + __uv.bare.pathname + + 'v1/'; + event.data.protocols = [ + 'bare', + __uv.encodeProtocol( + JSON.stringify({ + remote, + headers, + forward_headers: [ + 'accept', + 'accept-encoding', + 'accept-language', + 'sec-websocket-extensions', + 'sec-websocket-key', + 'sec-websocket-version', + ], + }) + ), + ]; + + const ws = new event.target(event.data.url, event.data.protocols); + + client.nativeMethods.defineProperty(ws, methodPrefix + 'url', { + enumerable: false, + value: url.href, + }); + + event.respondWith(ws); + }); + + client.websocket.on('url', (event) => { + if ('__uv$url' in event.that) { + event.data.value = event.that.__uv$url; + } + }); + + client.websocket.on('protocol', (event) => { + if ('__uv$protocol' in event.that) { + event.data.value = event.that.__uv$protocol; + } + }); + + client.function.on('function', (event) => { + event.data.script = __uv.rewriteJS(event.data.script); + }); + + client.function.on('toString', (event) => { + if (__uv.methods.string in event.that) + event.respondWith(event.that[__uv.methods.string]); + }); + + client.object.on('getOwnPropertyNames', (event) => { + event.data.names = event.data.names.filter( + (element) => !__uv.filterKeys.includes(element) + ); + }); + + client.object.on('getOwnPropertyDescriptors', (event) => { + for (const forbidden of __uv.filterKeys) { + delete event.data.descriptors[forbidden]; + } + }); + + client.style.on('setProperty', (event) => { + if (client.style.dashedUrlProps.includes(event.data.property)) { + event.data.value = __uv.rewriteCSS(event.data.value, { + context: 'value', + ...__uv.meta, + }); + } + }); + + client.style.on('getPropertyValue', (event) => { + if (client.style.dashedUrlProps.includes(event.data.property)) { + event.respondWith( + __uv.sourceCSS( + event.target.call(event.that, event.data.property), + { + context: 'value', + ...__uv.meta, + } + ) + ); + } + }); + + if ('CSS2Properties' in window) { + for (const key of client.style.urlProps) { + client.overrideDescriptor(window.CSS2Properties.prototype, key, { + get: (target, that) => { + return __uv.sourceCSS(target.call(that), { + context: 'value', + ...__uv.meta, + }); + }, + set: (target, that, val) => { + target.call( + that, + __uv.rewriteCSS(val, { + context: 'value', + ...__uv.meta, + }) + ); + }, + }); + } + } else if ('HTMLElement' in window) { + client.overrideDescriptor(window.HTMLElement.prototype, 'style', { + get: (target, that) => { + const value = target.call(that); + if (!value[methodPrefix + 'modifiedStyle']) { + for (const key of client.style.urlProps) { + client.nativeMethods.defineProperty(value, key, { + enumerable: true, + configurable: true, + get() { + const value = + client.style.getPropertyValue.call( + this, + key + ) || ''; + return __uv.sourceCSS(value, { + context: 'value', + ...__uv.meta, + }); + }, + set(val) { + client.style.setProperty.call( + this, + client.style.propToDashed[key] || key, + __uv.rewriteCSS(val, { + context: 'value', + ...__uv.meta, + }) + ); + }, + }); + client.nativeMethods.defineProperty( + value, + methodPrefix + 'modifiedStyle', + { + enumerable: false, + value: true, + } + ); + } + } + return value; + }, + }); + } + + client.style.on('setCssText', (event) => { + event.data.value = __uv.rewriteCSS(event.data.value, { + context: 'declarationList', + ...__uv.meta, + }); + }); + + client.style.on('getCssText', (event) => { + event.data.value = __uv.sourceCSS(event.data.value, { + context: 'declarationList', + ...__uv.meta, + }); + }); + + // Proper hash emulation. + if (!!window.window) { + __uv.addEventListener.call(window, 'hashchange', (event) => { + if (event.__uv$dispatched) return false; + event.stopImmediatePropagation(); + const hash = window.location.hash; + client.history.replaceState.call( + window.history, + '', + '', + event.oldURL + ); + __uv.location.hash = hash; + }); + } + + client.location.on('hashchange', (oldUrl, newUrl, ctx) => { + if (ctx.HashChangeEvent && client.history.replaceState) { + client.history.replaceState.call( + window.history, + '', + '', + __uv.rewriteUrl(newUrl) + ); + + const event = new ctx.HashChangeEvent('hashchange', { + newURL: newUrl, + oldURL: oldUrl, + }); + + client.nativeMethods.defineProperty( + event, + methodPrefix + 'dispatched', + { + value: true, + enumerable: false, + } + ); + + __uv.dispatchEvent.call(window, event); + } + }); + + // Hooking functions & descriptors + client.fetch.overrideRequest(); + client.fetch.overrideUrl(); + client.xhr.overrideOpen(); + client.xhr.overrideResponseUrl(); + client.element.overrideHtml(); + client.element.overrideAttribute(); + client.element.overrideInsertAdjacentHTML(); + client.element.overrideAudio(); + // client.element.overrideQuerySelector(); + client.node.overrideBaseURI(); + client.node.overrideTextContent(); + client.attribute.overrideNameValue(); + client.document.overrideDomain(); + client.document.overrideURL(); + client.document.overrideDocumentURI(); + client.document.overrideWrite(); + client.document.overrideReferrer(); + client.document.overrideParseFromString(); + client.storage.overrideMethods(); + client.storage.overrideLength(); + //client.document.overrideQuerySelector(); + client.object.overrideGetPropertyNames(); + client.object.overrideGetOwnPropertyDescriptors(); + client.history.overridePushState(); + client.history.overrideReplaceState(); + client.eventSource.overrideConstruct(); + client.eventSource.overrideUrl(); + client.websocket.overrideWebSocket(); + client.websocket.overrideProtocol(); + client.websocket.overrideUrl(); + client.url.overrideObjectURL(); + client.document.overrideCookie(); + client.message.overridePostMessage(); + client.message.overrideMessageOrigin(); + client.message.overrideMessageData(); + client.workers.overrideWorker(); + client.workers.overrideAddModule(); + client.workers.overrideImportScripts(); + client.workers.overridePostMessage(); + client.style.overrideSetGetProperty(); + client.style.overrideCssText(); + client.navigator.overrideSendBeacon(); + client.function.overrideFunction(); + client.function.overrideToString(); + client.location.overrideWorkerLocation((href) => { + return new URL(__uv.sourceUrl(href)); + }); + + client.overrideDescriptor(window, 'localStorage', { + get: (target, that) => { + return (that || window).__uv.lsWrap; + }, + }); + client.overrideDescriptor(window, 'sessionStorage', { + get: (target, that) => { + return (that || window).__uv.ssWrap; + }, + }); + + client.override(window, 'open', (target, that, args) => { + if (!args.length) return target.apply(that, args); + let [url] = args; + + url = __uv.rewriteUrl(url); + + return target.call(that, url); + }); + + __uv.$wrap = function (name) { + if (name === 'location') return __uv.methods.location; + if (name === 'eval') return __uv.methods.eval; + return name; + }; + + __uv.$get = function (that) { + if (that === window.location) return __uv.location; + if (that === window.eval) return __uv.eval; + if (that === window.parent) { + return window.__uv$parent; + } + if (that === window.top) { + return window.__uv$top; + } + return that; + }; + + __uv.eval = client.wrap(window, 'eval', (target, that, args) => { + if (!args.length || typeof args[0] !== 'string') + return target.apply(that, args); + let [script] = args; + + script = __uv.rewriteJS(script); + return target.call(that, script); + }); + + __uv.call = function (target, args, that) { + return that ? target.apply(that, args) : target(...args); + }; + + __uv.call$ = function (obj, prop, args = []) { + return obj[prop].apply(obj, args); + }; + + client.nativeMethods.defineProperty(window.Object.prototype, master, { + get: () => { + return __uv; + }, + enumerable: false, + }); + + client.nativeMethods.defineProperty( + window.Object.prototype, + __uv.methods.setSource, + { + value: function (source) { + if (!client.nativeMethods.isExtensible(this)) return this; + + client.nativeMethods.defineProperty(this, __uv.methods.source, { + value: source, + writable: true, + enumerable: false, + }); + + return this; + }, + enumerable: false, + } + ); + + client.nativeMethods.defineProperty( + window.Object.prototype, + __uv.methods.source, + { + value: __uv, + writable: true, + enumerable: false, + } + ); + + client.nativeMethods.defineProperty( + window.Object.prototype, + __uv.methods.location, + { + configurable: true, + get() { + return this === window.document || this === window + ? __uv.location + : this.location; + }, + set(val) { + if (this === window.document || this === window) { + __uv.location.href = val; + } else { + this.location = val; + } + }, + } + ); + + client.nativeMethods.defineProperty( + window.Object.prototype, + __uv.methods.parent, + { + configurable: true, + get() { + const val = this.parent; + + if (this === window) { + try { + return '__uv' in val ? val : this; + } catch (e) { + return this; + } + } + return val; + }, + set(val) { + this.parent = val; + }, + } + ); + + client.nativeMethods.defineProperty( + window.Object.prototype, + __uv.methods.top, + { + configurable: true, + get() { + const val = this.top; + + if (this === window) { + if (val === this.parent) return this[__uv.methods.parent]; + try { + if (!('__uv' in val)) { + let current = this; + + while (current.parent !== val) { + current = current.parent; + } + + return '__uv' in current ? current : this; + } else { + return val; + } + } catch (e) { + return this; + } + } + return val; + }, + set(val) { + this.top = val; + }, + } + ); + + client.nativeMethods.defineProperty( + window.Object.prototype, + __uv.methods.eval, + { + configurable: true, + get() { + return this === window ? __uv.eval : this.eval; + }, + set(val) { + this.eval = val; + }, + } + ); +} + +self.__uvHook = __uvHook; diff --git a/src/uv.sw.js b/src/uv.sw.js index 696bd3b..8f09190 100644 --- a/src/uv.sw.js +++ b/src/uv.sw.js @@ -1,789 +1,874 @@ -// Users must import the config (and bundle) prior to importing uv.sw.js -// This is to allow us to produce a generic bundle with no hard-coded paths. - -class UVServiceWorker extends EventEmitter { - constructor(config = __uv$config) { - super(); - if (!config.bare) config.bare = '/bare/'; - this.addresses = typeof config.bare === 'string' ? [ new URL(config.bare, location) ] : config.bare.map(str => new URL(str, location)); - this.headers = { - csp: [ - 'cross-origin-embedder-policy', - 'cross-origin-opener-policy', - 'cross-origin-resource-policy', - 'content-security-policy', - 'content-security-policy-report-only', - 'expect-ct', - 'feature-policy', - 'origin-isolation', - 'strict-transport-security', - 'upgrade-insecure-requests', - 'x-content-type-options', - 'x-download-options', - 'x-frame-options', - 'x-permitted-cross-domain-policies', - 'x-powered-by', - 'x-xss-protection', - ], - forward: [ - 'accept-encoding', - 'connection', - 'content-length', - ], - }; - this.method = { - empty: [ - 'GET', - 'HEAD' - ] - }; - this.statusCode = { - empty: [ - 204, - 304, - ], - }; - this.config = config; - this.browser = Ultraviolet.Bowser.getParser(self.navigator.userAgent).getBrowserName(); - - if (this.browser === 'Firefox') { - this.headers.forward.push('user-agent'); - this.headers.forward.push('content-type'); - }; - }; - async fetch({ request }) { - if (!request.url.startsWith(location.origin + (this.config.prefix || '/service/'))) { - return fetch(request); - }; - try { - - const ultraviolet = new Ultraviolet(this.config); - - if (typeof this.config.construct === 'function') { - this.config.construct(ultraviolet, 'service'); - }; - - const db = await ultraviolet.cookie.db(); - - ultraviolet.meta.origin = location.origin; - ultraviolet.meta.base = ultraviolet.meta.url = new URL(ultraviolet.sourceUrl(request.url)); - - const requestCtx = new RequestContext( - request, - this, - ultraviolet, - !this.method.empty.includes(request.method.toUpperCase()) ? await request.blob() : null - ); - - if (ultraviolet.meta.url.protocol === 'blob:') { - requestCtx.blob = true; - requestCtx.base = requestCtx.url = new URL(requestCtx.url.pathname); - }; - - if (request.referrer && request.referrer.startsWith(location.origin)) { - const referer = new URL(ultraviolet.sourceUrl(request.referrer)); - - if (requestCtx.headers.origin || ultraviolet.meta.url.origin !== referer.origin && request.mode === 'cors') { - requestCtx.headers.origin = referer.origin; - }; - - requestCtx.headers.referer = referer.href; - }; - - const cookies = await ultraviolet.cookie.getCookies(db) || []; - const cookieStr = ultraviolet.cookie.serialize(cookies, ultraviolet.meta, false); - - if (this.browser === 'Firefox' && !(request.destination === 'iframe' || request.destination === 'document')) { - requestCtx.forward.shift(); - }; - - if (cookieStr) requestCtx.headers.cookie = cookieStr; - requestCtx.headers.Host = requestCtx.url.host; - - - const reqEvent = new HookEvent(requestCtx, null, null); - this.emit('request', reqEvent); - - if (reqEvent.intercepted) return reqEvent.returnValue; - - const response = await fetch(requestCtx.send); - - if (response.status === 500) { - return Promise.reject(''); - }; - - const responseCtx = new ResponseContext(requestCtx, response, this); - const resEvent = new HookEvent(responseCtx, null, null); - - this.emit('beforemod', resEvent); - if (resEvent.intercepted) return resEvent.returnValue; - - for (const name of this.headers.csp) { - if (responseCtx.headers[name]) delete responseCtx.headers[name]; - }; - - if (responseCtx.headers.location) { - responseCtx.headers.location = ultraviolet.rewriteUrl(responseCtx.headers.location); - }; - - if (responseCtx.headers['set-cookie']) { - Promise.resolve(ultraviolet.cookie.setCookies(responseCtx.headers['set-cookie'], db, ultraviolet.meta)).then(() => { - self.clients.matchAll().then(function (clients){ - clients.forEach(function(client){ - client.postMessage({ - msg: 'updateCookies', - url: ultraviolet.meta.url.href, - }); - }); - }); - }); - delete responseCtx.headers['set-cookie']; - }; - - if (responseCtx.body) { - switch(request.destination) { - case 'script': - case 'worker': - responseCtx.body = `if (!self.__uv && self.importScripts) importScripts('${__uv$config.bundle}', '${__uv$config.config}', '${__uv$config.handler}');\n`; - responseCtx.body += ultraviolet.js.rewrite( - await response.text() - ); - break; - case 'style': - responseCtx.body = ultraviolet.rewriteCSS( - await response.text() - ); - break; - case 'iframe': - case 'document': - if (isHtml(ultraviolet.meta.url, (responseCtx.headers['content-type'] || ''))) { - responseCtx.body = ultraviolet.rewriteHtml( - await response.text(), - { - document: true , - injectHead: ultraviolet.createHtmlInject( - this.config.handler, - this.config.bundle, - this.config.config, - ultraviolet.cookie.serialize(cookies, ultraviolet.meta, true), - request.referrer - ) - } - ); - }; - }; - }; - - if (requestCtx.headers.accept === 'text/event-stream') { - responseCtx.headers['content-type'] = 'text/event-stream'; - }; - - this.emit('response', resEvent); - if (resEvent.intercepted) return resEvent.returnValue; - - return new Response(responseCtx.body, { - headers: responseCtx.headers, - status: responseCtx.status, - statusText: responseCtx.statusText, - }); - - } catch(err) { - return new Response(err.toString(), { - status: 500, - }); - }; - }; - getBarerResponse(response) { - const headers = {}; - const raw = JSON.parse(response.headers.get('x-bare-headers')); - - for (const key in raw) { - headers[key.toLowerCase()] = raw[key]; - }; - - return { - headers, - status: +response.headers.get('x-bare-status'), - statusText: response.headers.get('x-bare-status-text'), - body: !this.statusCode.empty.includes(+response.headers.get('x-bare-status')) ? response.body : null, - }; - }; - get address() { - return this.addresses[Math.floor(Math.random() * this.addresses.length)]; - }; - static Ultraviolet = Ultraviolet; -}; - -self.UVServiceWorker = UVServiceWorker; - - -class ResponseContext { - constructor(request, response, worker) { - const { headers, status, statusText, body } = !request.blob ? worker.getBarerResponse(response) : { - status: response.status, - statusText: response.statusText, - headers: Object.fromEntries([...response.headers.entries()]), - body: response.body, - }; - this.request = request; - this.raw = response; - this.ultraviolet = request.ultraviolet; - this.headers = headers; - this.status = status; - this.statusText = statusText; - this.body = body; - }; - get url() { - return this.request.url; - } - get base() { - return this.request.base; - }; - set base(val) { - this.request.base = val; - }; -}; - -class RequestContext { - constructor(request, worker, ultraviolet, body = null) { - this.ultraviolet = ultraviolet; - this.request = request; - this.headers = Object.fromEntries([...request.headers.entries()]); - this.method = request.method; - this.forward = [...worker.headers.forward]; - this.address = worker.address; - this.body = body || null; - this.redirect = request.redirect; - this.credentials = 'omit'; - this.mode = request.mode === 'cors' ? request.mode : 'same-origin'; - this.blob = false; - }; - get send() { - return new Request((!this.blob ? this.address.href + 'v1/' : 'blob:' + location.origin + this.url.pathname), { - method: this.method, - headers: { - 'x-bare-protocol': this.url.protocol, - 'x-bare-host': this.url.hostname, - 'x-bare-path': this.url.pathname + this.url.search, - 'x-bare-port': this.url.port || (this.url.protocol === 'https:' ? '443' : '80'), - 'x-bare-headers': JSON.stringify(this.headers), - 'x-bare-forward-headers': JSON.stringify(this.forward), - }, - redirect: this.redirect, - credentials: this.credentials, - mode: location.origin !== this.address.origin ? 'cors' : this.mode, - body: this.body - }); - }; - get url() { - return this.ultraviolet.meta.url; - }; - set url(val) { - this.ultraviolet.meta.url = val; - }; - get base() { - return this.ultraviolet.meta.base; - }; - set base(val) { - this.ultraviolet.meta.base = val; - }; -} - -function isHtml(url, contentType = '') { - return (Ultraviolet.mime.contentType((contentType || url.pathname)) || 'text/html').split(';')[0] === 'text/html'; -}; - -class HookEvent { - #intercepted; - #returnValue; - constructor(data = {}, target = null, that = null) { - this.#intercepted = false; - this.#returnValue = null; - this.data = data; - this.target = target; - this.that = that; - }; - get intercepted() { - return this.#intercepted; - }; - get returnValue() { - return this.#returnValue; - }; - respondWith(input) { - this.#returnValue = input; - this.#intercepted = true; - }; -}; - -var R = typeof Reflect === 'object' ? Reflect : null -var ReflectApply = R && typeof R.apply === 'function' - ? R.apply - : function ReflectApply(target, receiver, args) { - return Function.prototype.apply.call(target, receiver, args); - } - -var ReflectOwnKeys -if (R && typeof R.ownKeys === 'function') { - ReflectOwnKeys = R.ownKeys -} else if (Object.getOwnPropertySymbols) { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target) - .concat(Object.getOwnPropertySymbols(target)); - }; -} else { - ReflectOwnKeys = function ReflectOwnKeys(target) { - return Object.getOwnPropertyNames(target); - }; -} - -function ProcessEmitWarning(warning) { - if (console && console.warn) console.warn(warning); -} - -var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) { - return value !== value; -} - -function EventEmitter() { - EventEmitter.init.call(this); -} - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._eventsCount = 0; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -var defaultMaxListeners = 10; - -function checkListener(listener) { - if (typeof listener !== 'function') { - throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof listener); - } -} - -Object.defineProperty(EventEmitter, 'defaultMaxListeners', { - enumerable: true, - get: function() { - return defaultMaxListeners; - }, - set: function(arg) { - if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { - throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + arg + '.'); - } - defaultMaxListeners = arg; - } -}); - -EventEmitter.init = function() { - - if (this._events === undefined || - this._events === Object.getPrototypeOf(this)._events) { - this._events = Object.create(null); - this._eventsCount = 0; - } - - this._maxListeners = this._maxListeners || undefined; -}; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { - if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { - throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + n + '.'); - } - this._maxListeners = n; - return this; -}; - -function _getMaxListeners(that) { - if (that._maxListeners === undefined) - return EventEmitter.defaultMaxListeners; - return that._maxListeners; -} - -EventEmitter.prototype.getMaxListeners = function getMaxListeners() { - return _getMaxListeners(this); -}; - -EventEmitter.prototype.emit = function emit(type) { - var args = []; - for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); - var doError = (type === 'error'); - - var events = this._events; - if (events !== undefined) - doError = (doError && events.error === undefined); - else if (!doError) - return false; - - // If there is no 'error' event listener then throw. - if (doError) { - var er; - if (args.length > 0) - er = args[0]; - if (er instanceof Error) { - // Note: The comments on the `throw` lines are intentional, they show - // up in Node's output if this results in an unhandled exception. - throw er; // Unhandled 'error' event - } - // At least give some kind of context to the user - var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : '')); - err.context = er; - throw err; // Unhandled 'error' event - } - - var handler = events[type]; - - if (handler === undefined) - return false; - - if (typeof handler === 'function') { - ReflectApply(handler, this, args); - } else { - var len = handler.length; - var listeners = arrayClone(handler, len); - for (var i = 0; i < len; ++i) - ReflectApply(listeners[i], this, args); - } - - return true; -}; - -function _addListener(target, type, listener, prepend) { - var m; - var events; - var existing; - - checkListener(listener); - - events = target._events; - if (events === undefined) { - events = target._events = Object.create(null); - target._eventsCount = 0; - } else { - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (events.newListener !== undefined) { - target.emit('newListener', type, - listener.listener ? listener.listener : listener); - - // Re-assign `events` because a newListener handler could have caused the - // this._events to be assigned to a new object - events = target._events; - } - existing = events[type]; - } - - if (existing === undefined) { - // Optimize the case of one listener. Don't need the extra array object. - existing = events[type] = listener; - ++target._eventsCount; - } else { - if (typeof existing === 'function') { - // Adding the second element, need to change to array. - existing = events[type] = - prepend ? [listener, existing] : [existing, listener]; - // If we've already got an array, just append. - } else if (prepend) { - existing.unshift(listener); - } else { - existing.push(listener); - } - - // Check for listener leak - m = _getMaxListeners(target); - if (m > 0 && existing.length > m && !existing.warned) { - existing.warned = true; - // No error code for this since it is a Warning - // eslint-disable-next-line no-restricted-syntax - var w = new Error('Possible EventEmitter memory leak detected. ' + - existing.length + ' ' + String(type) + ' listeners ' + - 'added. Use emitter.setMaxListeners() to ' + - 'increase limit'); - w.name = 'MaxListenersExceededWarning'; - w.emitter = target; - w.type = type; - w.count = existing.length; - ProcessEmitWarning(w); - } - } - - return target; -} - -EventEmitter.prototype.addListener = function addListener(type, listener) { - return _addListener(this, type, listener, false); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.prependListener = - function prependListener(type, listener) { - return _addListener(this, type, listener, true); - }; - -function onceWrapper() { - if (!this.fired) { - this.target.removeListener(this.type, this.wrapFn); - this.fired = true; - if (arguments.length === 0) - return this.listener.call(this.target); - return this.listener.apply(this.target, arguments); - } -} - -function _onceWrap(target, type, listener) { - var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener }; - var wrapped = onceWrapper.bind(state); - wrapped.listener = listener; - state.wrapFn = wrapped; - return wrapped; -} - -EventEmitter.prototype.once = function once(type, listener) { - checkListener(listener); - this.on(type, _onceWrap(this, type, listener)); - return this; -}; - -EventEmitter.prototype.prependOnceListener = - function prependOnceListener(type, listener) { - checkListener(listener); - this.prependListener(type, _onceWrap(this, type, listener)); - return this; - }; - -// Emits a 'removeListener' event if and only if the listener was removed. -EventEmitter.prototype.removeListener = - function removeListener(type, listener) { - var list, events, position, i, originalListener; - - checkListener(listener); - - events = this._events; - if (events === undefined) - return this; - - list = events[type]; - if (list === undefined) - return this; - - if (list === listener || list.listener === listener) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else { - delete events[type]; - if (events.removeListener) - this.emit('removeListener', type, list.listener || listener); - } - } else if (typeof list !== 'function') { - position = -1; - - for (i = list.length - 1; i >= 0; i--) { - if (list[i] === listener || list[i].listener === listener) { - originalListener = list[i].listener; - position = i; - break; - } - } - - if (position < 0) - return this; - - if (position === 0) - list.shift(); - else { - spliceOne(list, position); - } - - if (list.length === 1) - events[type] = list[0]; - - if (events.removeListener !== undefined) - this.emit('removeListener', type, originalListener || listener); - } - - return this; - }; - -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - -EventEmitter.prototype.removeAllListeners = - function removeAllListeners(type) { - var listeners, events, i; - - events = this._events; - if (events === undefined) - return this; - - // not listening for removeListener, no need to emit - if (events.removeListener === undefined) { - if (arguments.length === 0) { - this._events = Object.create(null); - this._eventsCount = 0; - } else if (events[type] !== undefined) { - if (--this._eventsCount === 0) - this._events = Object.create(null); - else - delete events[type]; - } - return this; - } - - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - var keys = Object.keys(events); - var key; - for (i = 0; i < keys.length; ++i) { - key = keys[i]; - if (key === 'removeListener') continue; - this.removeAllListeners(key); - } - this.removeAllListeners('removeListener'); - this._events = Object.create(null); - this._eventsCount = 0; - return this; - } - - listeners = events[type]; - - if (typeof listeners === 'function') { - this.removeListener(type, listeners); - } else if (listeners !== undefined) { - // LIFO order - for (i = listeners.length - 1; i >= 0; i--) { - this.removeListener(type, listeners[i]); - } - } - - return this; - }; - -function _listeners(target, type, unwrap) { - var events = target._events; - - if (events === undefined) - return []; - - var evlistener = events[type]; - if (evlistener === undefined) - return []; - - if (typeof evlistener === 'function') - return unwrap ? [evlistener.listener || evlistener] : [evlistener]; - - return unwrap ? - unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length); -} - -EventEmitter.prototype.listeners = function listeners(type) { - return _listeners(this, type, true); -}; - -EventEmitter.prototype.rawListeners = function rawListeners(type) { - return _listeners(this, type, false); -}; - -EventEmitter.listenerCount = function(emitter, type) { - if (typeof emitter.listenerCount === 'function') { - return emitter.listenerCount(type); - } else { - return listenerCount.call(emitter, type); - } -}; - -EventEmitter.prototype.listenerCount = listenerCount; -function listenerCount(type) { - var events = this._events; - - if (events !== undefined) { - var evlistener = events[type]; - - if (typeof evlistener === 'function') { - return 1; - } else if (evlistener !== undefined) { - return evlistener.length; - } - } - - return 0; -} - -EventEmitter.prototype.eventNames = function eventNames() { - return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; -}; - -function arrayClone(arr, n) { - var copy = new Array(n); - for (var i = 0; i < n; ++i) - copy[i] = arr[i]; - return copy; -} - -function spliceOne(list, index) { - for (; index + 1 < list.length; index++) - list[index] = list[index + 1]; - list.pop(); -} - -function unwrapListeners(arr) { - var ret = new Array(arr.length); - for (var i = 0; i < ret.length; ++i) { - ret[i] = arr[i].listener || arr[i]; - } - return ret; -} - -function once(emitter, name) { - return new Promise(function (resolve, reject) { - function errorListener(err) { - emitter.removeListener(name, resolver); - reject(err); - } - - function resolver() { - if (typeof emitter.removeListener === 'function') { - emitter.removeListener('error', errorListener); - } - resolve([].slice.call(arguments)); - }; - - eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); - if (name !== 'error') { - addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true }); - } - }); -} - -function addErrorHandlerIfEventEmitter(emitter, handler, flags) { - if (typeof emitter.on === 'function') { - eventTargetAgnosticAddListener(emitter, 'error', handler, flags); - } -} - -function eventTargetAgnosticAddListener(emitter, name, listener, flags) { - if (typeof emitter.on === 'function') { - if (flags.once) { - emitter.once(name, listener); - } else { - emitter.on(name, listener); - } - } else if (typeof emitter.addEventListener === 'function') { - // EventTarget does not have `error` event semantics like Node - // EventEmitters, we do not listen for `error` events here. - emitter.addEventListener(name, function wrapListener(arg) { - // IE does not have builtin `{ once: true }` support so we - // have to do it manually. - if (flags.once) { - emitter.removeEventListener(name, wrapListener); - } - listener(arg); - }); - } else { - throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof emitter); - } -} +// Users must import the config (and bundle) prior to importing uv.sw.js +// This is to allow us to produce a generic bundle with no hard-coded paths. + +class UVServiceWorker extends EventEmitter { + constructor(config = __uv$config) { + super(); + if (!config.bare) config.bare = '/bare/'; + this.addresses = + typeof config.bare === 'string' + ? [new URL(config.bare, location)] + : config.bare.map((str) => new URL(str, location)); + this.headers = { + csp: [ + 'cross-origin-embedder-policy', + 'cross-origin-opener-policy', + 'cross-origin-resource-policy', + 'content-security-policy', + 'content-security-policy-report-only', + 'expect-ct', + 'feature-policy', + 'origin-isolation', + 'strict-transport-security', + 'upgrade-insecure-requests', + 'x-content-type-options', + 'x-download-options', + 'x-frame-options', + 'x-permitted-cross-domain-policies', + 'x-powered-by', + 'x-xss-protection', + ], + forward: ['accept-encoding', 'connection', 'content-length'], + }; + this.method = { + empty: ['GET', 'HEAD'], + }; + this.statusCode = { + empty: [204, 304], + }; + this.config = config; + this.browser = Ultraviolet.Bowser.getParser( + self.navigator.userAgent + ).getBrowserName(); + + if (this.browser === 'Firefox') { + this.headers.forward.push('user-agent'); + this.headers.forward.push('content-type'); + } + } + async fetch({ request }) { + if ( + !request.url.startsWith( + location.origin + (this.config.prefix || '/service/') + ) + ) { + return fetch(request); + } + try { + const ultraviolet = new Ultraviolet(this.config); + + if (typeof this.config.construct === 'function') { + this.config.construct(ultraviolet, 'service'); + } + + const db = await ultraviolet.cookie.db(); + + ultraviolet.meta.origin = location.origin; + ultraviolet.meta.base = ultraviolet.meta.url = new URL( + ultraviolet.sourceUrl(request.url) + ); + + const requestCtx = new RequestContext( + request, + this, + ultraviolet, + !this.method.empty.includes(request.method.toUpperCase()) + ? await request.blob() + : null + ); + + if (ultraviolet.meta.url.protocol === 'blob:') { + requestCtx.blob = true; + requestCtx.base = requestCtx.url = new URL( + requestCtx.url.pathname + ); + } + + if ( + request.referrer && + request.referrer.startsWith(location.origin) + ) { + const referer = new URL( + ultraviolet.sourceUrl(request.referrer) + ); + + if ( + requestCtx.headers.origin || + (ultraviolet.meta.url.origin !== referer.origin && + request.mode === 'cors') + ) { + requestCtx.headers.origin = referer.origin; + } + + requestCtx.headers.referer = referer.href; + } + + const cookies = (await ultraviolet.cookie.getCookies(db)) || []; + const cookieStr = ultraviolet.cookie.serialize( + cookies, + ultraviolet.meta, + false + ); + + if ( + this.browser === 'Firefox' && + !( + request.destination === 'iframe' || + request.destination === 'document' + ) + ) { + requestCtx.forward.shift(); + } + + if (cookieStr) requestCtx.headers.cookie = cookieStr; + requestCtx.headers.Host = requestCtx.url.host; + + const reqEvent = new HookEvent(requestCtx, null, null); + this.emit('request', reqEvent); + + if (reqEvent.intercepted) return reqEvent.returnValue; + + const response = await fetch(requestCtx.send); + + if (response.status === 500) { + return Promise.reject(''); + } + + const responseCtx = new ResponseContext(requestCtx, response, this); + const resEvent = new HookEvent(responseCtx, null, null); + + this.emit('beforemod', resEvent); + if (resEvent.intercepted) return resEvent.returnValue; + + for (const name of this.headers.csp) { + if (responseCtx.headers[name]) delete responseCtx.headers[name]; + } + + if (responseCtx.headers.location) { + responseCtx.headers.location = ultraviolet.rewriteUrl( + responseCtx.headers.location + ); + } + + if (responseCtx.headers['set-cookie']) { + Promise.resolve( + ultraviolet.cookie.setCookies( + responseCtx.headers['set-cookie'], + db, + ultraviolet.meta + ) + ).then(() => { + self.clients.matchAll().then(function (clients) { + clients.forEach(function (client) { + client.postMessage({ + msg: 'updateCookies', + url: ultraviolet.meta.url.href, + }); + }); + }); + }); + delete responseCtx.headers['set-cookie']; + } + + if (responseCtx.body) { + switch (request.destination) { + case 'script': + case 'worker': + responseCtx.body = `if (!self.__uv && self.importScripts) importScripts('${__uv$config.bundle}', '${__uv$config.config}', '${__uv$config.handler}');\n`; + responseCtx.body += ultraviolet.js.rewrite( + await response.text() + ); + break; + case 'style': + responseCtx.body = ultraviolet.rewriteCSS( + await response.text() + ); + break; + case 'iframe': + case 'document': + if ( + isHtml( + ultraviolet.meta.url, + responseCtx.headers['content-type'] || '' + ) + ) { + responseCtx.body = ultraviolet.rewriteHtml( + await response.text(), + { + document: true, + injectHead: ultraviolet.createHtmlInject( + this.config.handler, + this.config.bundle, + this.config.config, + ultraviolet.cookie.serialize( + cookies, + ultraviolet.meta, + true + ), + request.referrer + ), + } + ); + } + } + } + + if (requestCtx.headers.accept === 'text/event-stream') { + responseCtx.headers['content-type'] = 'text/event-stream'; + } + + this.emit('response', resEvent); + if (resEvent.intercepted) return resEvent.returnValue; + + return new Response(responseCtx.body, { + headers: responseCtx.headers, + status: responseCtx.status, + statusText: responseCtx.statusText, + }); + } catch (err) { + return new Response(err.toString(), { + status: 500, + }); + } + } + getBarerResponse(response) { + const headers = {}; + const raw = JSON.parse(response.headers.get('x-bare-headers')); + + for (const key in raw) { + headers[key.toLowerCase()] = raw[key]; + } + + return { + headers, + status: +response.headers.get('x-bare-status'), + statusText: response.headers.get('x-bare-status-text'), + body: !this.statusCode.empty.includes( + +response.headers.get('x-bare-status') + ) + ? response.body + : null, + }; + } + get address() { + return this.addresses[ + Math.floor(Math.random() * this.addresses.length) + ]; + } + static Ultraviolet = Ultraviolet; +} + +self.UVServiceWorker = UVServiceWorker; + +class ResponseContext { + constructor(request, response, worker) { + const { headers, status, statusText, body } = !request.blob + ? worker.getBarerResponse(response) + : { + status: response.status, + statusText: response.statusText, + headers: Object.fromEntries([...response.headers.entries()]), + body: response.body, + }; + this.request = request; + this.raw = response; + this.ultraviolet = request.ultraviolet; + this.headers = headers; + this.status = status; + this.statusText = statusText; + this.body = body; + } + get url() { + return this.request.url; + } + get base() { + return this.request.base; + } + set base(val) { + this.request.base = val; + } +} + +class RequestContext { + constructor(request, worker, ultraviolet, body = null) { + this.ultraviolet = ultraviolet; + this.request = request; + this.headers = Object.fromEntries([...request.headers.entries()]); + this.method = request.method; + this.forward = [...worker.headers.forward]; + this.address = worker.address; + this.body = body || null; + this.redirect = request.redirect; + this.credentials = 'omit'; + this.mode = request.mode === 'cors' ? request.mode : 'same-origin'; + this.blob = false; + } + get send() { + return new Request( + !this.blob + ? this.address.href + 'v1/' + : 'blob:' + location.origin + this.url.pathname, + { + method: this.method, + headers: { + 'x-bare-protocol': this.url.protocol, + 'x-bare-host': this.url.hostname, + 'x-bare-path': this.url.pathname + this.url.search, + 'x-bare-port': + this.url.port || + (this.url.protocol === 'https:' ? '443' : '80'), + 'x-bare-headers': JSON.stringify(this.headers), + 'x-bare-forward-headers': JSON.stringify(this.forward), + }, + redirect: this.redirect, + credentials: this.credentials, + mode: + location.origin !== this.address.origin + ? 'cors' + : this.mode, + body: this.body, + } + ); + } + get url() { + return this.ultraviolet.meta.url; + } + set url(val) { + this.ultraviolet.meta.url = val; + } + get base() { + return this.ultraviolet.meta.base; + } + set base(val) { + this.ultraviolet.meta.base = val; + } +} + +function isHtml(url, contentType = '') { + return ( + ( + Ultraviolet.mime.contentType(contentType || url.pathname) || + 'text/html' + ).split(';')[0] === 'text/html' + ); +} + +class HookEvent { + #intercepted; + #returnValue; + constructor(data = {}, target = null, that = null) { + this.#intercepted = false; + this.#returnValue = null; + this.data = data; + this.target = target; + this.that = that; + } + get intercepted() { + return this.#intercepted; + } + get returnValue() { + return this.#returnValue; + } + respondWith(input) { + this.#returnValue = input; + this.#intercepted = true; + } +} + +var R = typeof Reflect === 'object' ? Reflect : null; +var ReflectApply = + R && typeof R.apply === 'function' + ? R.apply + : function ReflectApply(target, receiver, args) { + return Function.prototype.apply.call(target, receiver, args); + }; + +var ReflectOwnKeys; +if (R && typeof R.ownKeys === 'function') { + ReflectOwnKeys = R.ownKeys; +} else if (Object.getOwnPropertySymbols) { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target).concat( + Object.getOwnPropertySymbols(target) + ); + }; +} else { + ReflectOwnKeys = function ReflectOwnKeys(target) { + return Object.getOwnPropertyNames(target); + }; +} + +function ProcessEmitWarning(warning) { + if (console && console.warn) console.warn(warning); +} + +var NumberIsNaN = + Number.isNaN || + function NumberIsNaN(value) { + return value !== value; + }; + +function EventEmitter() { + EventEmitter.init.call(this); +} + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._eventsCount = 0; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +var defaultMaxListeners = 10; + +function checkListener(listener) { + if (typeof listener !== 'function') { + throw new TypeError( + 'The "listener" argument must be of type Function. Received type ' + + typeof listener + ); + } +} + +Object.defineProperty(EventEmitter, 'defaultMaxListeners', { + enumerable: true, + get: function () { + return defaultMaxListeners; + }, + set: function (arg) { + if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) { + throw new RangeError( + 'The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + + arg + + '.' + ); + } + defaultMaxListeners = arg; + }, +}); + +EventEmitter.init = function () { + if ( + this._events === undefined || + this._events === Object.getPrototypeOf(this)._events + ) { + this._events = Object.create(null); + this._eventsCount = 0; + } + + this._maxListeners = this._maxListeners || undefined; +}; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) { + if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) { + throw new RangeError( + 'The value of "n" is out of range. It must be a non-negative number. Received ' + + n + + '.' + ); + } + this._maxListeners = n; + return this; +}; + +function _getMaxListeners(that) { + if (that._maxListeners === undefined) + return EventEmitter.defaultMaxListeners; + return that._maxListeners; +} + +EventEmitter.prototype.getMaxListeners = function getMaxListeners() { + return _getMaxListeners(this); +}; + +EventEmitter.prototype.emit = function emit(type) { + var args = []; + for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); + var doError = type === 'error'; + + var events = this._events; + if (events !== undefined) doError = doError && events.error === undefined; + else if (!doError) return false; + + // If there is no 'error' event listener then throw. + if (doError) { + var er; + if (args.length > 0) er = args[0]; + if (er instanceof Error) { + // Note: The comments on the `throw` lines are intentional, they show + // up in Node's output if this results in an unhandled exception. + throw er; // Unhandled 'error' event + } + // At least give some kind of context to the user + var err = new Error( + 'Unhandled error.' + (er ? ' (' + er.message + ')' : '') + ); + err.context = er; + throw err; // Unhandled 'error' event + } + + var handler = events[type]; + + if (handler === undefined) return false; + + if (typeof handler === 'function') { + ReflectApply(handler, this, args); + } else { + var len = handler.length; + var listeners = arrayClone(handler, len); + for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args); + } + + return true; +}; + +function _addListener(target, type, listener, prepend) { + var m; + var events; + var existing; + + checkListener(listener); + + events = target._events; + if (events === undefined) { + events = target._events = Object.create(null); + target._eventsCount = 0; + } else { + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (events.newListener !== undefined) { + target.emit( + 'newListener', + type, + listener.listener ? listener.listener : listener + ); + + // Re-assign `events` because a newListener handler could have caused the + // this._events to be assigned to a new object + events = target._events; + } + existing = events[type]; + } + + if (existing === undefined) { + // Optimize the case of one listener. Don't need the extra array object. + existing = events[type] = listener; + ++target._eventsCount; + } else { + if (typeof existing === 'function') { + // Adding the second element, need to change to array. + existing = events[type] = prepend + ? [listener, existing] + : [existing, listener]; + // If we've already got an array, just append. + } else if (prepend) { + existing.unshift(listener); + } else { + existing.push(listener); + } + + // Check for listener leak + m = _getMaxListeners(target); + if (m > 0 && existing.length > m && !existing.warned) { + existing.warned = true; + // No error code for this since it is a Warning + // eslint-disable-next-line no-restricted-syntax + var w = new Error( + 'Possible EventEmitter memory leak detected. ' + + existing.length + + ' ' + + String(type) + + ' listeners ' + + 'added. Use emitter.setMaxListeners() to ' + + 'increase limit' + ); + w.name = 'MaxListenersExceededWarning'; + w.emitter = target; + w.type = type; + w.count = existing.length; + ProcessEmitWarning(w); + } + } + + return target; +} + +EventEmitter.prototype.addListener = function addListener(type, listener) { + return _addListener(this, type, listener, false); +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.prependListener = function prependListener( + type, + listener +) { + return _addListener(this, type, listener, true); +}; + +function onceWrapper() { + if (!this.fired) { + this.target.removeListener(this.type, this.wrapFn); + this.fired = true; + if (arguments.length === 0) return this.listener.call(this.target); + return this.listener.apply(this.target, arguments); + } +} + +function _onceWrap(target, type, listener) { + var state = { + fired: false, + wrapFn: undefined, + target: target, + type: type, + listener: listener, + }; + var wrapped = onceWrapper.bind(state); + wrapped.listener = listener; + state.wrapFn = wrapped; + return wrapped; +} + +EventEmitter.prototype.once = function once(type, listener) { + checkListener(listener); + this.on(type, _onceWrap(this, type, listener)); + return this; +}; + +EventEmitter.prototype.prependOnceListener = function prependOnceListener( + type, + listener +) { + checkListener(listener); + this.prependListener(type, _onceWrap(this, type, listener)); + return this; +}; + +// Emits a 'removeListener' event if and only if the listener was removed. +EventEmitter.prototype.removeListener = function removeListener( + type, + listener +) { + var list, events, position, i, originalListener; + + checkListener(listener); + + events = this._events; + if (events === undefined) return this; + + list = events[type]; + if (list === undefined) return this; + + if (list === listener || list.listener === listener) { + if (--this._eventsCount === 0) this._events = Object.create(null); + else { + delete events[type]; + if (events.removeListener) + this.emit('removeListener', type, list.listener || listener); + } + } else if (typeof list !== 'function') { + position = -1; + + for (i = list.length - 1; i >= 0; i--) { + if (list[i] === listener || list[i].listener === listener) { + originalListener = list[i].listener; + position = i; + break; + } + } + + if (position < 0) return this; + + if (position === 0) list.shift(); + else { + spliceOne(list, position); + } + + if (list.length === 1) events[type] = list[0]; + + if (events.removeListener !== undefined) + this.emit('removeListener', type, originalListener || listener); + } + + return this; +}; + +EventEmitter.prototype.off = EventEmitter.prototype.removeListener; + +EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) { + var listeners, events, i; + + events = this._events; + if (events === undefined) return this; + + // not listening for removeListener, no need to emit + if (events.removeListener === undefined) { + if (arguments.length === 0) { + this._events = Object.create(null); + this._eventsCount = 0; + } else if (events[type] !== undefined) { + if (--this._eventsCount === 0) this._events = Object.create(null); + else delete events[type]; + } + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + var keys = Object.keys(events); + var key; + for (i = 0; i < keys.length; ++i) { + key = keys[i]; + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = Object.create(null); + this._eventsCount = 0; + return this; + } + + listeners = events[type]; + + if (typeof listeners === 'function') { + this.removeListener(type, listeners); + } else if (listeners !== undefined) { + // LIFO order + for (i = listeners.length - 1; i >= 0; i--) { + this.removeListener(type, listeners[i]); + } + } + + return this; +}; + +function _listeners(target, type, unwrap) { + var events = target._events; + + if (events === undefined) return []; + + var evlistener = events[type]; + if (evlistener === undefined) return []; + + if (typeof evlistener === 'function') + return unwrap ? [evlistener.listener || evlistener] : [evlistener]; + + return unwrap + ? unwrapListeners(evlistener) + : arrayClone(evlistener, evlistener.length); +} + +EventEmitter.prototype.listeners = function listeners(type) { + return _listeners(this, type, true); +}; + +EventEmitter.prototype.rawListeners = function rawListeners(type) { + return _listeners(this, type, false); +}; + +EventEmitter.listenerCount = function (emitter, type) { + if (typeof emitter.listenerCount === 'function') { + return emitter.listenerCount(type); + } else { + return listenerCount.call(emitter, type); + } +}; + +EventEmitter.prototype.listenerCount = listenerCount; +function listenerCount(type) { + var events = this._events; + + if (events !== undefined) { + var evlistener = events[type]; + + if (typeof evlistener === 'function') { + return 1; + } else if (evlistener !== undefined) { + return evlistener.length; + } + } + + return 0; +} + +EventEmitter.prototype.eventNames = function eventNames() { + return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : []; +}; + +function arrayClone(arr, n) { + var copy = new Array(n); + for (var i = 0; i < n; ++i) copy[i] = arr[i]; + return copy; +} + +function spliceOne(list, index) { + for (; index + 1 < list.length; index++) list[index] = list[index + 1]; + list.pop(); +} + +function unwrapListeners(arr) { + var ret = new Array(arr.length); + for (var i = 0; i < ret.length; ++i) { + ret[i] = arr[i].listener || arr[i]; + } + return ret; +} + +function once(emitter, name) { + return new Promise(function (resolve, reject) { + function errorListener(err) { + emitter.removeListener(name, resolver); + reject(err); + } + + function resolver() { + if (typeof emitter.removeListener === 'function') { + emitter.removeListener('error', errorListener); + } + resolve([].slice.call(arguments)); + } + + eventTargetAgnosticAddListener(emitter, name, resolver, { once: true }); + if (name !== 'error') { + addErrorHandlerIfEventEmitter(emitter, errorListener, { + once: true, + }); + } + }); +} + +function addErrorHandlerIfEventEmitter(emitter, handler, flags) { + if (typeof emitter.on === 'function') { + eventTargetAgnosticAddListener(emitter, 'error', handler, flags); + } +} + +function eventTargetAgnosticAddListener(emitter, name, listener, flags) { + if (typeof emitter.on === 'function') { + if (flags.once) { + emitter.once(name, listener); + } else { + emitter.on(name, listener); + } + } else if (typeof emitter.addEventListener === 'function') { + // EventTarget does not have `error` event semantics like Node + // EventEmitters, we do not listen for `error` events here. + emitter.addEventListener(name, function wrapListener(arg) { + // IE does not have builtin `{ once: true }` support so we + // have to do it manually. + if (flags.once) { + emitter.removeEventListener(name, wrapListener); + } + listener(arg); + }); + } else { + throw new TypeError( + 'The "emitter" argument must be of type EventEmitter. Received type ' + + typeof emitter + ); + } +} diff --git a/webpack.config.js b/webpack.config.js index 272a7fa..4a99b6b 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -9,40 +9,46 @@ const isDevelopment = process.env.NODE_ENV !== 'production'; * @type {webpack.Configuration} */ const config = { - mode: isDevelopment ? 'development' : 'production', - entry: { - bundle: fileURLToPath(new URL('./src/rewrite/index.js', import.meta.url)), - handler: fileURLToPath(new URL('./src/uv.handler.js', import.meta.url)), - sw: fileURLToPath(new URL('./src/uv.sw.js', import.meta.url)), - }, - output: { - path: fileURLToPath(new URL('./dist/', import.meta.url)), - filename: 'uv.[name].js', - }, - optimization: { - minimize: !isDevelopment, - minimizer: [ - new TerserPlugin({ - exclude: ['sw.js', 'uv.config.js'], - }), - ], - }, - plugins: [ - new CopyPlugin({ - patterns: [ - { - from: fileURLToPath(new URL('./src/uv.config.js', import.meta.url)), - }, - { - from: fileURLToPath(new URL('./src/sw.js', import.meta.url)), - }, - ], - }), - ], - performance: { - // suppress "entrypoint size limit" warning - hints: false, - }, + mode: isDevelopment ? 'development' : 'production', + entry: { + bundle: fileURLToPath( + new URL('./src/rewrite/index.js', import.meta.url) + ), + handler: fileURLToPath(new URL('./src/uv.handler.js', import.meta.url)), + sw: fileURLToPath(new URL('./src/uv.sw.js', import.meta.url)), + }, + output: { + path: fileURLToPath(new URL('./dist/', import.meta.url)), + filename: 'uv.[name].js', + }, + optimization: { + minimize: !isDevelopment, + minimizer: [ + new TerserPlugin({ + exclude: ['sw.js', 'uv.config.js'], + }), + ], + }, + plugins: [ + new CopyPlugin({ + patterns: [ + { + from: fileURLToPath( + new URL('./src/uv.config.js', import.meta.url) + ), + }, + { + from: fileURLToPath( + new URL('./src/sw.js', import.meta.url) + ), + }, + ], + }), + ], + performance: { + // suppress "entrypoint size limit" warning + hints: false, + }, }; export default config;