diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..10cae55 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,45 @@ +module.exports = { + // ESLint configs are prone to particular choices, so if the first config + // below doesn't work for you then replace + // with one that you do prefer. The second config defines globals defined + // in `foundry.js` for use w/ `no-shadow`. + extends: [ + 'standard', + '@typhonjs-fvtt/eslint-config-foundry.js' + ], + + // Defines / overrides a few more environment parameters not + // provided in the configs above. + overrides: [ + ], + env: { + jquery: true, + es2021: true, + browser: true + }, + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module' + }, + // Prevents overwriting any built in + // globals particularly from + // `@typhonjs-fvtt/eslint-config-foundry.js`, + // but also + // node & browser environments. `event / + // window.event` shadowing is allowed due + // to being a common variable name and + // an uncommonly used browser feature. + // + // Note: if you are using + // Typescript you must use + // `@typescript-eslint/no-shadow` + rules: { + 'no-shadow': [ + 'error', { + builtinGlobals: true, + hoist: 'all', + allow: ['origin', 'name', 'event'] + } + ] + } +} diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 6041cd4..0000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,33 +0,0 @@ -import globals from "globals"; -import pluginJs from "@eslint/js"; - - -export default [ - pluginJs.configs.recommended, - { - rules: { - "no-unused-vars": "error", - "no-undef": "error", - }, - languageOptions: { - globals: { - ...globals.browser, - ActiveEffect: false, - canvas: false, - ChatMessage: false, - ColorAdjustmentsSamplerShader: false, - CONFIG: false, - deepClone: false, - foundry: false, - fromUuid: false, - game: false, - Hooks: false, - randomID: false, - socketlib: false, - ui: false, - VisionMode: false, - warpgate: false, - } - } - }, -]; diff --git a/package-lock.json b/package-lock.json index 72db9e9..c62bf5c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,13 +8,467 @@ "@eslint/js": "^9.1.1", "@league-of-foundry-developers/foundry-vtt-types": "^9.280.0", "@typhonjs-fvtt/eslint-config-foundry.js": "^0.8.0", + "babel-loader": "^9.1.3", "eslint": "^8.57.0", "eslint-config-standard": "^17.1.0", "eslint-plugin-import": "^2.28.1", "eslint-plugin-n": "^16.0.2", "eslint-plugin-promise": "^6.1.1", "globals": "^15.1.0", - "typescript": "^5.2.2" + "typescript": "^5.2.2", + "webpack": "^5.91.0", + "webpack-cli": "^5.1.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "dev": true, + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "peer": true + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "dev": true, + "peer": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.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-community/eslint-utils": { @@ -121,6 +575,64 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@league-of-foundry-developers/foundry-vtt-types": { "version": "9.280.0", "resolved": "https://registry.npmjs.org/@league-of-foundry-developers/foundry-vtt-types/-/foundry-vtt-types-9.280.0.tgz", @@ -2312,6 +2824,32 @@ "dev": true, "peer": true }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, "node_modules/@types/jquery": { "version": "3.5.29", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.29.tgz", @@ -2321,6 +2859,12 @@ "@types/sizzle": "*" } }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -2370,6 +2914,208 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.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.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", @@ -2382,6 +3128,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "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", @@ -2407,6 +3162,54 @@ "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.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "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", @@ -2566,6 +3369,76 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/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/babel-loader/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/babel-loader/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/backo2": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", @@ -2588,6 +3461,44 @@ "concat-map": "0.0.1" } }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "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/builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", @@ -2652,6 +3563,26 @@ "node": ">=6" } }, + "node_modules/caniuse-lite": { + "version": "1.0.30001617", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", + "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2668,6 +3599,29 @@ "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", @@ -2686,12 +3640,37 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/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/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "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/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "peer": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2832,6 +3811,12 @@ "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", "dev": true }, + "node_modules/electron-to-chromium": { + "version": "1.4.763", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.763.tgz", + "integrity": "sha512-k4J8NrtJ9QrvHLRo8Q18OncqBCB7tIUyqxRcJnlonQ0ioHKYB988GcDFF3ZePmnb8eHEopDs/wPHR/iGAFgoUQ==", + "dev": true + }, "node_modules/engine.io-client": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.0.3.tgz", @@ -2858,6 +3843,31 @@ "node": ">=10.0.0" } }, + "node_modules/enhanced-resolve": { + "version": "5.16.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.1.tgz", + "integrity": "sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", @@ -2939,6 +3949,12 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", + "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==", + "dev": true + }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", @@ -2997,6 +4013,15 @@ "integrity": "sha512-HHb0vydCpoclpd0ySPkRXMmBw80MRt1wM4RBJBlXkux97K7gleabZdsR0gvE1nNPM9mgOZIBTzjjXiPxf4lIqQ==", "dev": true }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "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", @@ -3428,6 +4453,15 @@ "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", "dev": true }, + "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", @@ -3446,6 +4480,15 @@ "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.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -3467,6 +4510,119 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -3483,6 +4639,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -3554,6 +4719,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/get-intrinsic": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", @@ -3634,6 +4809,12 @@ "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": "15.1.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.1.0.tgz", @@ -3673,6 +4854,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -3812,6 +4999,25 @@ "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", @@ -3851,6 +5057,15 @@ "node": ">= 0.4" } }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -4021,6 +5236,18 @@ "node": ">=8" } }, + "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/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -4127,6 +5354,51 @@ "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==", "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-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "peer": true + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -4139,12 +5411,31 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "node_modules/json-parse-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", @@ -4178,6 +5469,15 @@ "json-buffer": "3.0.1" } }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4191,6 +5491,15 @@ "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", @@ -4224,6 +5533,33 @@ "node": ">=10" } }, + "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/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mini-signals": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mini-signals/-/mini-signals-1.2.0.tgz", @@ -4269,6 +5605,12 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4419,6 +5761,15 @@ "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", @@ -4485,6 +5836,12 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, "node_modules/pixi-particles": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/pixi-particles/-/pixi-particles-4.3.1.tgz", @@ -4646,6 +6003,70 @@ "url": "^0.11.0" } }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -4708,6 +6129,27 @@ } ] }, + "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.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", @@ -4726,6 +6168,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "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.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -4743,6 +6194,27 @@ "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", @@ -4837,6 +6309,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", @@ -4854,6 +6346,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "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/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4863,6 +6373,15 @@ "semver": "bin/semver.js" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -4895,6 +6414,18 @@ "node": ">= 0.4" } }, + "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", @@ -4973,6 +6504,16 @@ "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/string.prototype.trim": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", @@ -5079,6 +6620,67 @@ "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.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "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", @@ -5091,6 +6693,16 @@ "integrity": "sha512-aIsFTYiuESpoYkCgkoojpVtPwrSvYBxp4mMEGsj20CnUruLCWosywkbYHDII+j7KlQZZn3p+xK89f5gT3QyuGw==", "dev": true }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -5247,6 +6859,36 @@ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", "dev": true }, + "node_modules/update-browserslist-db": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "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", @@ -5272,6 +6914,165 @@ "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "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.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "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": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "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/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", @@ -5322,6 +7123,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", diff --git a/package.json b/package.json index c69367c..9b3ecd2 100644 --- a/package.json +++ b/package.json @@ -3,12 +3,15 @@ "@eslint/js": "^9.1.1", "@league-of-foundry-developers/foundry-vtt-types": "^9.280.0", "@typhonjs-fvtt/eslint-config-foundry.js": "^0.8.0", + "babel-loader": "^9.1.3", "eslint": "^8.57.0", "eslint-config-standard": "^17.1.0", "eslint-plugin-import": "^2.28.1", "eslint-plugin-n": "^16.0.2", "eslint-plugin-promise": "^6.1.1", "globals": "^15.1.0", - "typescript": "^5.2.2" + "typescript": "^5.2.2", + "webpack": "^5.91.0", + "webpack-cli": "^5.1.4" } } diff --git a/scripts/api.js b/scripts/api.js index 6a1b339..7f04c0e 100644 --- a/scripts/api.js +++ b/scripts/api.js @@ -1,4 +1,4 @@ -import { log, module } from './globals.js' +import { log, moduleHelpers } from './globals.js' import { requestFearRollFromTokens, requestRollFromTokens } from './helpers.js' import { powerEffects } from './powerEffects.js' import { powers } from './powers.js' @@ -12,8 +12,8 @@ export class api { static globals () { const moduleName = 'swade-mb-helpers' game.modules.get(moduleName).api = { - rulesVersion: module.rulesVersion, - fearTable: module.fearTableHelper, + rulesVersion: moduleHelpers.rulesVersion, + fearTable: moduleHelpers.fearTableHelper, powerEffects, powers, requestRollFromTokens, diff --git a/scripts/basePowers.js b/scripts/basePowers.js index 4c6387b..a9babda 100644 --- a/scripts/basePowers.js +++ b/scripts/basePowers.js @@ -1,3 +1,4 @@ +/* globals warpgate */ import { moduleName } from './globals.js' const MAINTAIN_ICON = 'icons/magic/symbols/runes-star-blue.webp' @@ -11,8 +12,9 @@ export class PowerEffect { static async getStatus (label, name, favorite = true) { const effect = deepClone( - CONFIG.statusEffects.find(se => se.label === label)) - effect.name = ('name' in effect ? effect.name : effect.label) + CONFIG.statusEffects.find((se) => se.label === label) + ) + effect.name = 'name' in effect ? effect.name : effect.label if (!('flags' in effect)) { effect.flags = {} } @@ -42,7 +44,8 @@ export class PowerEffect { }, swade: { loseTurnOnHold: false, - expiration: CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.StartOfTurnAuto + expiration: + CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.StartOfTurnAuto } } } @@ -55,7 +58,6 @@ export class PowerEffect { const mutateOptions = { permanent: true, description: `${this.source.name} applying ${effectDocuments[effectDocuments.length - 1]?.name} to ${token.name}` - } for (const effectDocument of effectDocuments) { mutation.embedded.ActiveEffect[effectDocument.name] = effectDocument @@ -63,54 +65,164 @@ export class PowerEffect { await warpgate.mutate(token.document, mutation, {}, mutateOptions) } - get name () { return 'Unknown Power' } - get effectName () { return this.name } - get icon () { return 'icons/magic/symbols/question-stone-yellow.webp' } - get duration () { return 5 } - get basePowerPoints () { return 0 } - get usePrimaryEffect () { return true } - get hasAdditionalRecipients () { return false } - get isDamaging () { return false } - get additionalRecipientCost () { return 0 } - get isTargeted () { return false } - get oneTarget () { return false } - get isRaisable () { return true } - get hasAoe () { return false } + get name () { + return 'Unknown Power' + } + + get effectName () { + return this.name + } + + get icon () { + return 'icons/magic/symbols/question-stone-yellow.webp' + } + + get duration () { + return 5 + } + + get basePowerPoints () { + return 0 + } + + get usePrimaryEffect () { + return true + } + + get hasAdditionalRecipients () { + return false + } + + get isDamaging () { + return false + } + + get additionalRecipientCost () { + return 0 + } + + get isTargeted () { + return false + } + + get oneTarget () { + return false + } + + get isRaisable () { + return true + } + + get hasAoe () { + return false + } + get modifiers () { const mods = [] - mods.push({ name: 'Adaptable Caster', id: 'adaptable', - value: 1, epic: false, effect: false }) - mods.push({ name: 'Fatigue', id: 'fatigue', value: 2, epic: false, effect: false }) - mods.push({ name: 'Glow', id: 'glow', value: 1, - epic: false, effect: true, icon: 'icons/magic/light/orb-shadow-blue.webp', - changes: [ { key: '@Skill{Stealth}[system.die.modifier]', value: -2, - priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD } ] + mods.push({ + name: 'Adaptable Caster', + id: 'adaptable', + value: 1, + epic: false, + effect: false }) - mods.push({ name: 'Shroud', id: 'shroud', value: 1, epic: false, effect: true, + mods.push({ + name: 'Fatigue', + id: 'fatigue', + value: 2, + epic: false, + effect: false + }) + mods.push({ + name: 'Glow', + id: 'glow', + value: 1, + epic: false, + effect: true, + icon: 'icons/magic/light/orb-shadow-blue.webp', + changes: [ + { + key: '@Skill{Stealth}[system.die.modifier]', + value: -2, + priority: 0, + mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD + } + ] + }) + mods.push({ + name: 'Shroud', + id: 'shroud', + value: 1, + epic: false, + effect: true, icon: 'icons/magic/perception/shadow-stealth-eyes-purple.webp', - changes: [ { key: '@Skill{Stealth}[system.die.modifier]', value: 1, - priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD } ] + changes: [ + { + key: '@Skill{Stealth}[system.die.modifier]', + value: 1, + priority: 0, + mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD + } + ] }) if (this.isDamaging) { - mods.push({ name: 'Heavy Weapon', id: 'heavyweapon', value: 2, - epic: false, effect: false}) + mods.push({ + name: 'Heavy Weapon', + id: 'heavyweapon', + value: 2, + epic: false, + effect: false + }) } - mods.push({ name: 'Hinder', id: 'hinder', value: 1, epic: false, effect: true, - icon: 'icons/magic/control/debuff-chains-shackle-movement-red.webp', - changes: [ { key: 'system.stats.speed.value', value: -2, - priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD } ] + mods.push({ + name: 'Hinder', + id: 'hinder', + value: 1, + epic: false, + effect: true, + icon: 'icons/magic/control/debuff-chains-shackle-movement-red.webp', + changes: [ + { + key: 'system.stats.speed.value', + value: -2, + priority: 0, + mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD + } + ] }) - mods.push({ name: 'Hurry', id: 'hurry', value: 1, epic: false, effect: true, + mods.push({ + name: 'Hurry', + id: 'hurry', + value: 1, + epic: false, + effect: true, icon: 'icons/skills/movement/feet-winged-sandals-tan.webp', - changes: [ { key: 'system.stats.speed.value', value: 2, - priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD } ] + changes: [ + { + key: 'system.stats.speed.value', + value: 2, + priority: 0, + mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD + } + ] }) if (this.isDamaging) { - mods.push({ name: 'Lingering Damage', id: 'lingeringdamage', value: 2, - epic: false, effect: false}) + mods.push({ + name: 'Lingering Damage', + id: 'lingeringdamage', + value: 2, + epic: false, + effect: false + }) } if (this.hasAoe) { - mods.push({ name: 'Selective', id: 'selective', value: 1, epic: false, effect: false }) + mods.push({ + name: 'Selective', + id: 'selective', + value: 1, + epic: false, + effect: false + }) } return mods } @@ -118,56 +230,61 @@ export class PowerEffect { get menuData () { return { inputs: this.menuInputs, - buttons: this.menuButtons, + buttons: this.menuButtons } } get menuInputs () { const inputs = [ { type: 'header', label: `${this.name} Effect` }, - { type: 'info', label: `Apply ${this.name} Effect (base cost ${this.basePowerPoints} pp)` }, + { + type: 'info', + label: `Apply ${this.name} Effect (base cost ${this.basePowerPoints} pp)` + } ] if (this.isTargeted) { - let label = `Targets: ${this.targets.map(t => t.name).join(',')}` + let label = `Targets: ${this.targets.map((t) => t.name).join(',')}` if (this.targets.length > 1 && this.hasAdditionalRecipients) { - label += ` (${this.targets.length - 1} additional recipients ` + - `+${this.additionalRecipientCost} ea.)` + label += + ` (${this.targets.length - 1} additional recipients ` + + `+${this.additionalRecipientCost} ea.)` } - inputs.push({ type: 'info', label: label }) + inputs.push({ type: 'info', label }) } for (const mod of this.modifiers) { inputs.push({ type: 'checkbox', - label: ( + label: `${mod.epic ? '⭐ ' : ''}${mod.name} ` + `(${mod.value >= 0 ? '+' : ''}${mod.value})` - ), }) } if (this.isDamaging) { - inputs.push({ type: 'select', label: 'Armor Piercing', + inputs.push({ + type: 'select', + label: 'Armor Piercing', options: [ - {html: 'None', value: 0, selected: true}, - {html: 'AP 2 (+1)', value: 1, selected: false}, - {html: 'AP 4 (+2)', value: 2, selected: false}, - {html: 'AP 6 (+3)', value: 3, selected: false}, + { html: 'None', value: 0, selected: true }, + { html: 'AP 2 (+1)', value: 1, selected: false }, + { html: 'AP 4 (+2)', value: 2, selected: false }, + { html: 'AP 6 (+3)', value: 3, selected: false } ] }) } - inputs.push({type: 'select', label: 'Range', + inputs.push({ + type: 'select', + label: 'Range', options: [ - {html: 'Normal Range', value: 0, selected: true}, - {html: 'Range ×2 (+1)', value: 1, selected: false}, - {html: 'Range ×3 (+2)', value: 2, selected: false} + { html: 'Normal Range', value: 0, selected: true }, + { html: 'Range ×2 (+1)', value: 1, selected: false }, + { html: 'Range ×3 (+2)', value: 2, selected: false } ] }) return inputs } get menuButtons () { - const data = [ - { label: 'Apply', value: 'apply' }, - ] + const data = [{ label: 'Apply', value: 'apply' }] if (this.isRaisable) { data.push({ label: 'Apply with Raise', value: 'raise' }) } @@ -186,7 +303,8 @@ export class PowerEffect { async powerEffect () { const { buttons, inputs } = await warpgate.menu( - this.menuData, this.menuOptions + this.menuData, + this.menuOptions ) if (buttons && buttons !== 'cancel') { this.data.button = buttons @@ -229,7 +347,8 @@ export class PowerEffect { // set secondary effects of instant spells to expire on victim's next // turn doc.duration.rounds = 1 - doc.flags.swade.expiration = CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.EndOfTurnAuto + doc.flags.swade.expiration = + CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.EndOfTurnAuto } else { doc.duration.seconds = 594 doc.flags[moduleName].maintId = maintId @@ -242,18 +361,26 @@ export class PowerEffect { getPrimaryEffectChanges () { const changes = [ - { key: 'flags.swade-mb-helpers.powerAffected', value: 1, - priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.OVERRIDE } ] + { + key: 'flags.swade-mb-helpers.powerAffected', + value: 1, + priority: 0, + mode: foundry.CONST.ACTIVE_EFFECT_MODES.OVERRIDE + } + ] return changes } get description () { - return "" + return '' } async createPrimaryEffect (maintId) { - const doc = this.createEffectDocument(this.icon, this.effectName, - this.getPrimaryEffectChanges()) + const doc = this.createEffectDocument( + this.icon, + this.effectName, + this.getPrimaryEffectChanges() + ) doc.description += this.description doc.flags[moduleName].maintId = maintId doc.duration.seconds = 594 @@ -265,23 +392,28 @@ export class PowerEffect { if (!this.usePrimaryEffect) { icon = this.icon } - const doc = this.createEffectDocument(icon, `Maintaining ${this.effectName}`, []) + const doc = this.createEffectDocument( + icon, + `Maintaining ${this.effectName}`, + [] + ) doc.duration.rounds = this.duration doc.description += this.description - doc.flags.swade.expiration = CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.EndOfTurnPrompt + doc.flags.swade.expiration = + CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.EndOfTurnPrompt doc.flags.swade.loseTurnOnHold = true doc.flags[moduleName].maintainingId = maintId - doc.flags[moduleName].targetIds = this.targets.map(t => t.id) + doc.flags[moduleName].targetIds = this.targets.map((t) => t.id) return doc } // eslint-disable-next-line no-unused-vars - async secondaryDocsForTarget(docs, target) { + async secondaryDocsForTarget (docs, target) { return deepClone(docs) } // eslint-disable-next-line no-unused-vars - async primaryDocForTarget(doc, target) { + async primaryDocForTarget (doc, target) { const newDoc = deepClone(doc) newDoc.flags[moduleName].maintainingId = doc.flags[moduleName].maintId newDoc.flags[moduleName].targetIds = [target.id] @@ -295,7 +427,10 @@ export class PowerEffect { const maintainDoc = await this.createMaintainEffect(maintId) if (this.isTargeted) { for (const target of this.targets) { - const targetDocs = await this.secondaryDocsForTarget(secondaryDocs, target) + const targetDocs = await this.secondaryDocsForTarget( + secondaryDocs, + target + ) if (this.duration > 0 || this.usePrimaryEffect) { targetDocs.push(await this.primaryDocForTarget(primaryDoc, target)) } @@ -368,7 +503,7 @@ export class PowerEffect { list.push(`AP ${this.data.armorPiercing * 2}`) } if (this.data.range > 0) { - list.push(`Range ×${this.data.range +1}`) + list.push(`Range ×${this.data.range + 1}`) } return list } @@ -376,7 +511,7 @@ export class PowerEffect { get chatMessageText () { let text = `
Cast ${this.name}` if (this.isTargeted && this.targets.length > 0) { - text += ` on ${this.targets.map(t => t.name).join(', ')}` + text += ` on ${this.targets.map((t) => t.name).join(', ')}` } text += '
' const desc = this.description @@ -385,18 +520,23 @@ export class PowerEffect { } const effects = this.chatMessageEffects if (effects.length > 0) { - text += 'Hostile powers are at ${this._penaltyAmount} when targeting or damaging the affected character.
` return text } + get effectName () { const greater = this.data.mods.has('greater') const raise = this.data.raise @@ -37,41 +61,71 @@ class ArcaneProtectionEffect extends PowerEffect { } class BanishEffect extends PowerEffect { - get name () { return 'Banish' } - get duration () { return 0 } - get basePowerPoints () { return 3 } - get usePrimaryEffect () { return false } - get isTargeted () { return true } - get isRaisable () { return false } - get hasAoe () { return true } + get name () { + return 'Banish' + } + + get duration () { + return 0 + } + + get basePowerPoints () { + return 3 + } + + get usePrimaryEffect () { + return false + } + + get isTargeted () { + return true + } + + get isRaisable () { + return false + } + + get hasAoe () { + return true + } + get menuInputs () { const inputs = super.menuInputs - inputs.push - inputs.push({ type: 'select', label: '⭐ Area of Effect', - options: [ - {html: 'None', value: 0, selected: true}, - {html: 'Small Blast Template (+1)', value: 1, selected: false}, - {html: 'Medium Blast Template (+2)', value: 2, selected: false}, - {html: 'Large Blast Template (+3)', value: 3, selected: false}, - ]}) + inputs.push({ + type: 'select', + label: '⭐ Area of Effect', + options: [ + { html: 'None', value: 0, selected: true }, + { html: 'Small Blast Template (+1)', value: 1, selected: false }, + { html: 'Medium Blast Template (+2)', value: 2, selected: false }, + { html: 'Large Blast Template (+3)', value: 3, selected: false } + ] + }) return inputs } + get powerPoints () { let total = super.powerPoints total += this.data.aoe return total } + get description () { - return super.description + ` + return ( + super.description + + `An opposed roll of the caster's skill vs the target's Spirit. Success: Shaken, each Raise: 1 Wound Incapacitation results in banishment to home plane.
` + ) } + get chatMessageEffects () { const list = super.chatMessageEffects switch (this.data.aoe) { - case 0: break + case 0: + break case 1: list.push('SBT') break @@ -84,6 +138,7 @@ class BanishEffect extends PowerEffect { } return list } + async parseValues () { await super.parseValues() this.data.aoe = this.data.values.shift() @@ -91,35 +146,102 @@ class BanishEffect extends PowerEffect { } class BarrierEffect extends PowerEffect { - get name () { return 'Barrier' } - get duration () { return 5 } - get icon () { return 'icons/environment/settlement/fence-stone-brick.webp' } - get isTargeted () { return false } - get isDamaging () { return true } - get basePowerPoints () { return 2 } - get usePrimaryEffect () { return false } + get name () { + return 'Barrier' + } + + get duration () { + return 5 + } + + get icon () { + return 'icons/environment/settlement/fence-stone-brick.webp' + } + + get isTargeted () { + return false + } + + get isDamaging () { + return true + } + + get basePowerPoints () { + return 2 + } + + get usePrimaryEffect () { + return false + } + get modifiers () { const mods = super.modifiers - mods.push({ name: 'Damage', id: 'damage', value: 1, epic: false, effect: false }) - mods.push({ name: 'Damage (immaterial trapping)', id: 'damage', value: 0, epic: false, effect: false }) - mods.push({ name: 'Deadly', id: 'deadly', value: 2, epic: true, effect: false }) - mods.push({ name: 'Hardened', id: 'hardened', value: 1, epic: false, effect: false }) - mods.push({ name: 'Shaped', id: 'shaped', value: 1, epic: false, effect: false }) - mods.push({ name: 'Size', id: 'size', value: 1, epic: false, effect: false }) + mods.push({ + name: 'Damage', + id: 'damage', + value: 1, + epic: false, + effect: false + }) + mods.push({ + name: 'Damage (immaterial trapping)', + id: 'damage', + value: 0, + epic: false, + effect: false + }) + mods.push({ + name: 'Deadly', + id: 'deadly', + value: 2, + epic: true, + effect: false + }) + mods.push({ + name: 'Hardened', + id: 'hardened', + value: 1, + epic: false, + effect: false + }) + mods.push({ + name: 'Shaped', + id: 'shaped', + value: 1, + epic: false, + effect: false + }) + mods.push({ + name: 'Size', + id: 'size', + value: 1, + epic: false, + effect: false + }) return mods } + get _length () { let height = 10 - if (this.data.raise) { height *= 2 } - if (this.data.mods.has('size')) { height *= 2} - return `${height}" (${height*2} yards)` + if (this.data.raise) { + height *= 2 + } + if (this.data.mods.has('size')) { + height *= 2 + } + return `${height}" (${height * 2} yards)` } + get _height () { return `${this.data.mods.has('size') ? '2" (4' : '1" (2'} yards` } + get _hardness () { - return (this.data.raise ? 12 : 10) + (this.data.mods.has('hardened') ? 2 : 0) + return ( + (this.data.raise ? 12 : 10) + (this.data.mods.has('hardened') ? 2 : 0) + ) } + get description () { let text = super.description text += `A barrier ${this._height} tall and ${this._length} long, of hardness ${this._hardness}. ` @@ -137,35 +259,75 @@ class BarrierEffect extends PowerEffect { } class BeastFriendEffect extends PowerEffect { - get name () { return 'Beast Friend' } - get duration () { return (this.data.mods.has('duration') ? 30 : 10) * 6 * 60 } - get icon () { return 'icons/magic/nature/wolf-paw-glow-large-green.webp' } - get isTargeted () { return true } - get usePrimaryEffect () { return true } + get name () { + return 'Beast Friend' + } + + get duration () { + return (this.data.mods.has('duration') ? 30 : 10) * 6 * 60 + } + + get icon () { + return 'icons/magic/nature/wolf-paw-glow-large-green.webp' + } + + get isTargeted () { + return true + } + + get usePrimaryEffect () { + return true + } + get modifiers () { const mods = super.modifiers mods.push( - { name: 'Bestiarium', value: 2, id: 'bestiarium', epic: true, effect: false }, - { name: 'Duration', value: 1, id: 'duration', epic: false, effect: false }, - { name: 'Mind Rider', value: 1, id: 'mindrider', epic: false, effect: false }, + { + name: 'Bestiarium', + value: 2, + id: 'bestiarium', + epic: true, + effect: false + }, + { + name: 'Duration', + value: 1, + id: 'duration', + epic: false, + effect: false + }, + { + name: 'Mind Rider', + value: 1, + id: 'mindrider', + epic: false, + effect: false + } ) return mods } + get menuInputs () { const inputs = super.menuInputs const pp = Math.max( - this.targets. - map(t => Math.max(t.actor.system.stats.size, 1)). - reduce((a,b) => a+b, 0), - 1) - inputs.push({ type: 'number', label: 'Base power points', options: pp}) + this.targets + .map((t) => Math.max(t.actor.system.stats.size, 1)) + .reduce((a, b) => a + b, 0), + 1 + ) + inputs.push({ type: 'number', label: 'Base power points', options: pp }) return inputs } + async parseValues () { await super.parseValues() this.data.basePP = this.data.values.shift() } - get basePowerPoints () { return this?.data?.basePP || 2 } + + get basePowerPoints () { + return this?.data?.basePP || 2 + } + get description () { let text = super.description if (this.data.raise) { @@ -181,158 +343,289 @@ class BeastFriendEffect extends PowerEffect { } class BlastEffect extends PowerEffect { - get name () { return 'Blast' } - get icon () { return 'icons/magic/fire/explosion-fireball-large-red-orange.webp' } - get duration () { return 0 } - get isTargeted () { return true } - get usePrimaryEffect () { return false } - get isDamaging () { return true } - get basePowerPoints () { return 3 } - get hasAoe () { return true } + get name () { + return 'Blast' + } + + get icon () { + return 'icons/magic/fire/explosion-fireball-large-red-orange.webp' + } + + get duration () { + return 0 + } + + get isTargeted () { + return true + } + + get usePrimaryEffect () { + return false + } + + get isDamaging () { + return true + } + + get basePowerPoints () { + return 3 + } + + get hasAoe () { + return true + } + get menuInputs () { const inputs = super.menuInputs - inputs.push - inputs.push({ type: 'select', label: 'Area of Effect', - options: [ - {html: 'Small Blast Template (0)', value: 's', selected: false}, - {html: 'Medium Blast Template (0)', value: 'm', selected: true}, - {html: 'Large Blast Template (+1)', value: 'l', selected: false}, - ]}) + inputs.push({ + type: 'select', + label: 'Area of Effect', + options: [ + { html: 'Small Blast Template (0)', value: 's', selected: false }, + { html: 'Medium Blast Template (0)', value: 'm', selected: true }, + { html: 'Large Blast Template (+1)', value: 'l', selected: false } + ] + }) return inputs } + get modifiers () { const mods = super.modifiers mods.push( { name: 'Damage', value: 2, id: 'damage', epic: false, effect: false }, - { name: 'Greater Blast', value: 4, id: 'greater', epic: true, effect: false }, + { + name: 'Greater Blast', + value: 4, + id: 'greater', + epic: true, + effect: false + } ) return mods } + get powerPoints () { let total = super.powerPoints - total += (this.data.aoe === 'l' ? 1 : 0) + total += this.data.aoe === 'l' ? 1 : 0 return total } + async parseValues () { await super.parseValues() this.data.aoe = this.data.values.shift() } + get description () { - const dmgDie = ( - this.data.mods.has('greater') ? 4 : - (this.data.mods.has('damage') ? 3 : 2)) + (this.data.raise ? 1 : 0) - const size = ( - this.data.aoe === 'l' ? 'LBT' : (this.data.aoe === 's' ? 'SBT' : 'MBT')) - return super.description + ` + const dmgDie = + (this.data.mods.has('greater') + ? 4 + : this.data.mods.has('damage') + ? 3 + : 2) + (this.data.raise ? 1 : 0) + const size = + this.data.aoe === 'l' ? 'LBT' : this.data.aoe === 's' ? 'SBT' : 'MBT' + return ( + super.description + + `
The blast covers a ${size} and does ${dmgDie}d6 damage
` + ) } } class BlindEffect extends PowerEffect { - get name () { return 'Blind' } - get icon () { return 'icons/skills/wounds/injury-eyes-blood-red.webp' } - get duration () { return 0 } - get isTargeted () { return true } - get hasAoe () { return true } - get basePowerPoints () { return 2 } + get name () { + return 'Blind' + } + + get icon () { + return 'icons/skills/wounds/injury-eyes-blood-red.webp' + } + + get duration () { + return 0 + } + + get isTargeted () { + return true + } + + get hasAoe () { + return true + } + + get basePowerPoints () { + return 2 + } + getPrimaryEffectChanges () { const changes = [ - { key: 'system.stats.globalMods.trait', value: -2, - priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD } ] + { + key: 'system.stats.globalMods.trait', + value: -2, + priority: 0, + mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD + } + ] return changes } + get description () { - return super.description + + return ( + super.description + `${this.data.raise ? -4 : -2} penalty to all actions involving sight.
Shake off attempts at end of turns with a Vigor ${this.data.mods.has('strong') ? '-2 ' : ''}roll as a free action. Success removes 2 points of penalties. A raise removes the effect.
` + ) } + async createSecondaryEffects (maintId) { const docs = await super.createSecondaryEffects(maintId) if (this.data.raise) { const strong = this.data.mods.has('strong') const doc = this.createEffectDocument( - this.icon, `Blinded (${strong ? 'Strong, ' : ''}Raise)`, [ - { key: 'system.stats.globalMods.trait', value: -2, - priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD } - ]) + this.icon, + `Blinded (${strong ? 'Strong, ' : ''}Raise)`, + [ + { + key: 'system.stats.globalMods.trait', + value: -2, + priority: 0, + mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD + } + ] + ) doc.duration.seconds = 594 - doc.description = this.description + - "This is the raise effect which can be shaken off separately.
" + doc.description = + this.description + + 'This is the raise effect which can be shaken off separately.
' doc.flags[moduleName].maintId = maintId docs.push(doc) } return docs } + get modifiers () { const mods = super.modifiers - mods.push( - { name: 'Strong', value: 1, id: 'strong', epic: false, effect: false }, - ) + mods.push({ + name: 'Strong', + value: 1, + id: 'strong', + epic: false, + effect: false + }) return mods } + get menuInputs () { const inputs = super.menuInputs - inputs.push - inputs.push({ type: 'select', label: 'Area of Effect', - options: [ - {html: 'None', value: 0, selected: true}, - {html: 'Medium Blast Template (+2)', value: 2, selected: false}, - {html: 'Large Blast Template (+3)', value: 3, selected: false}, - ]}) + inputs.push({ + type: 'select', + label: 'Area of Effect', + options: [ + { html: 'None', value: 0, selected: true }, + { html: 'Medium Blast Template (+2)', value: 2, selected: false }, + { html: 'Large Blast Template (+3)', value: 3, selected: false } + ] + }) return inputs } + async parseValues () { await super.parseValues() this.data.aoe = this.data.values.shift() } + get powerPoints () { let total = super.powerPoints total += this.data.aoe return total } + get effectName () { const strong = this.data.mods.has('strong') return `Blinded${strong ? ' (Strong)' : ''}` } + get chatMessageEffects () { const list = super.chatMessageEffects switch (this.data.aoe) { - case 2: list.push('MBT'); break - case 3: list.push('LBT'); break + case 2: + list.push('MBT') + break + case 3: + list.push('LBT') + break } return list } } class BoltEffect extends PowerEffect { - get name () { return 'Bolt' } - get icon () { return 'icons/magic/fire/explosion-fireball-large-red-orange.webp' } - get duration () { return 0 } - get isTargeted () { return true } - get isDamaging () { return true } - get basePowerPoints () { return 3 } - get usePrimaryEffect () { return false } + get name () { + return 'Bolt' + } + + get icon () { + return 'icons/magic/fire/explosion-fireball-large-red-orange.webp' + } + + get duration () { + return 0 + } + + get isTargeted () { + return true + } + + get isDamaging () { + return true + } + + get basePowerPoints () { + return 3 + } + + get usePrimaryEffect () { + return false + } + get modifiers () { const mods = super.modifiers mods.push( { name: 'Damage', value: 2, id: 'damage', epic: false, effect: false }, - { name: 'Disintegrate', value: 1, id: 'disintigrate', epic: true, effect: false }, - { name: 'Greater Bolt', value: 4, id: 'greater', epic: true, effect: false }, - { name: 'Rate of Fire', value: 2, id: 'rof', epic: true, effect: false }, + { + name: 'Disintegrate', + value: 1, + id: 'disintigrate', + epic: true, + effect: false + }, + { + name: 'Greater Bolt', + value: 4, + id: 'greater', + epic: true, + effect: false + }, + { name: 'Rate of Fire', value: 2, id: 'rof', epic: true, effect: false } ) return mods } + get powerPoints () { let total = super.powerPoints - total += (this.data.aoe === 'l' ? 1 : 0) + total += this.data.aoe === 'l' ? 1 : 0 return total } + get description () { - const dmgDie = ( - this.data.mods.has('greater') ? 4 : - (this.data.mods.has('damage') ? 3 : 2)) + (this.data.raise ? 1 : 0) + const dmgDie = + (this.data.mods.has('greater') + ? 4 + : this.data.mods.has('damage') + ? 3 + : 2) + (this.data.raise ? 1 : 0) let desc = super.description + '' if (this.data.mods.has('rof')) { desc += `Up to two bolts (RoF 2) do ${dmgDie}d6 damage each.` @@ -340,7 +633,8 @@ class BoltEffect extends PowerEffect { desc += `The bolt does ${dmgDie}d6 damage.` } if (this.data.mods.has('disintegrate')) { - desc += 'The bolt is disintegrating. If being used to break' + + desc += + 'The bolt is disintegrating. If being used to break' + ' something, the damage dice can Ace. A creature Incapacitated by a ' + 'disintegrating bolt must make a Vigor roll or its body turns to dust' } @@ -350,53 +644,95 @@ class BoltEffect extends PowerEffect { } class BurrowEffect extends PowerEffect { - get name () { return 'Burrow' } - get duration () { return 5 } - get icon () { return 'icons/magic/earth/projectile-stone-landslide.webp' } - get hasAdditionalRecipients () { return true } - get additionalRecipientCost () { return 1 } - get basePowerPoints () { return 1 } - get isTargeted () { return true } + get name () { + return 'Burrow' + } + + get duration () { + return 5 + } + + get icon () { + return 'icons/magic/earth/projectile-stone-landslide.webp' + } + + get hasAdditionalRecipients () { + return true + } + + get additionalRecipientCost () { + return 1 + } + + get basePowerPoints () { + return 1 + } + + get isTargeted () { + return true + } + get modifiers () { const mods = super.modifiers - mods.push( - { name: 'Power', - id: 'power', - value: 1, - epic: false, - effect: false, - }) + mods.push({ + name: 'Power', + id: 'power', + value: 1, + epic: false, + effect: false + }) return mods } + get effectName () { - return `${this.name} ${this.data.mods.has('power') ? '[Power] ' : ''}` + + return ( + `${this.name} ${this.data.mods.has('power') ? '[Power] ' : ''}` + `(${this.data.raise ? 'full' : 'half'} pace)` + ) } - get description() { - let text = super.description + + + get description () { + let text = + super.description + `
Meld into the ground. Move at ${this.data.raise ? 'full' : 'half'} pace. May not run.
` if (this.data.mods.has('power')) { - text += `Can burrow through solid stone, concrete, etc
` + text += 'Can burrow through solid stone, concrete, etc
' } return text } } class BoostLowerTraitEffect extends PowerEffect { - get name () { return 'Boost/Lower Trait' } - get hasAdditionalRecipients () { return true } - get additionalRecipientCost () { return 2 } + get name () { + return 'Boost/Lower Trait' + } + + get hasAdditionalRecipients () { + return true + } + + get additionalRecipientCost () { + return 2 + } + get icon () { - return (this?.data?.direction === 'Boost' ? - 'icons/magic/life/cross-embers-glow-yellow-purple.webp' : - 'icons/magic/movement/chevrons-down-yellow.webp' - ) + return this?.data?.direction === 'Boost' + ? 'icons/magic/life/cross-embers-glow-yellow-purple.webp' + : 'icons/magic/movement/chevrons-down-yellow.webp' } + get duration () { - return (this?.data?.direction === 'Boost' ? 5 : 0) + return this?.data?.direction === 'Boost' ? 5 : 0 } - get isTargeted () { return true } - get basePowerPoints () { return 3 } + + get isTargeted () { + return true + } + + get basePowerPoints () { + return 3 + } + getPrimaryEffectChanges () { let modValue = '2' if (this.data.raise && this.data.direction === 'Boost') { @@ -404,32 +740,48 @@ class BoostLowerTraitEffect extends PowerEffect { } modValue = (this.data.direction === 'Boost' ? '+' : '-') + modValue const changes = [ - { key: this.data.trait.diekey, value: modValue, - priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD } ] + { + key: this.data.trait.diekey, + value: modValue, + priority: 0, + mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD + } + ] if (this.data.direction === 'Lower' && this.data.mods.has('greater')) { changes.push({ - key: this.data.trait.modkey, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD, - value: -2, priority: 0}) + key: this.data.trait.modkey, + mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD, + value: -2, + priority: 0 + }) } return changes } + async createSecondaryEffects (maintId) { const docs = await super.createSecondaryEffects(maintId) if (this.data.raise && this.data.direction === 'Lower') { const name = 'major ' + this.effectName - const modValue = (this.data.direction === 'Boost' ? '+2': '-2') + const modValue = this.data.direction === 'Boost' ? '+2' : '-2' const changes = [ - { key: this.data.trait.diekey, value: modValue, - priority: 0, mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD } ] + { + key: this.data.trait.diekey, + value: modValue, + priority: 0, + mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD + } + ] const doc = this.createEffectDocument(this.icon, name, changes) doc.duration.seconds = 594 - doc.description = this.description + - "This is the raise effect which can be shaken off separately.
" + doc.description = + this.description + + 'This is the raise effect which can be shaken off separately.
' doc.flags[moduleName].maintId = maintId docs.push(doc) } return docs } + get effectName () { let name = `${this.data.direction} ${this.data.trait.name}` const nameMods = [] @@ -444,9 +796,10 @@ class BoostLowerTraitEffect extends PowerEffect { } return name } + get description () { let desc = super.description - const amount = `${this.data.raise ? 2 : 1} die type${this.data.raise ? 's' :''}` + const amount = `${this.data.raise ? 2 : 1} die type${this.data.raise ? 's' : ''}` desc += `${this.data.direction === 'Boost' ? 'Raise' : 'Lower'} the target's ${this.data.trait.name} die type ${amount}.` if (this.data.mods.has('greater')) { @@ -467,15 +820,26 @@ class BoostLowerTraitEffect extends PowerEffect { } return desc } + get modifiers () { const mods = super.modifiers - mods.push( - {name: 'Greater Boost/Lower Trailt', value: 2, id: 'greater', epic: true, effect: false}) - mods.push( - { name: 'Strong (lower only)', value: 1, id: 'strong', epic: false, effect: false } - ) + mods.push({ + name: 'Greater Boost/Lower Trailt', + value: 2, + id: 'greater', + epic: true, + effect: false + }) + mods.push({ + name: 'Strong (lower only)', + value: 1, + id: 'strong', + epic: false, + effect: false + }) return mods } + get menuInputs () { const inputs = super.menuInputs let traitOptions = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'] @@ -491,14 +855,14 @@ class BoostLowerTraitEffect extends PowerEffect { } } for (const token of this.targets) { - const skills = token.actor.items.filter(item => item.type === 'skill') + const skills = token.actor.items.filter((item) => item.type === 'skill') for (const skill of skills) { const name = skill.name traits[name] = { name, type: 'skill', modkey: `@Skill{${name}}[system.die.modifier]`, - diekey: `@Skill{${name}}[system.die.sides]`, + diekey: `@Skill{${name}}[system.die.sides]` } if (name !== 'Unskilled') { allSkills.add(name) @@ -507,99 +871,172 @@ class BoostLowerTraitEffect extends PowerEffect { } traitOptions = traitOptions.concat(Array.from(allSkills).sort()) this.data.traits = traits - inputs.push({type: 'select', label: 'Trait', options: traitOptions}) - inputs.push({type: 'info', label: 'Boost or Lower?'}) - inputs.push({type: 'radio', label: 'Boost', options: ['isBoost', true]}) - inputs.push({type: 'radio', label: 'Lower', options: ['isBoost', false]}) + inputs.push({ type: 'select', label: 'Trait', options: traitOptions }) + inputs.push({ type: 'info', label: 'Boost or Lower?' }) + inputs.push({ type: 'radio', label: 'Boost', options: ['isBoost', true] }) + inputs.push({ type: 'radio', label: 'Lower', options: ['isBoost', false] }) return inputs } + async parseValues () { await super.parseValues() this.data.trait = this.data.traits[this.data.values.shift()] this.data.values.shift() this.data.direction = this.data.values.shift() ? 'Boost' : 'Lower' } + get powerPoints () { - let total = super.powerPoints + const total = super.powerPoints return total } } class BurstEffect extends PowerEffect { - get name () { return 'Blast' } - get icon () { return 'icons/magic/sonic/projectile-shock-wave-blue.webp' } - get duration () { return 0 } - get isTargeted () { return true } - get usePrimaryEffect () { return false } - get isDamaging () { return true } - get basePowerPoints () { return 3 } - get hasAoe () { return true } + get name () { + return 'Blast' + } + + get icon () { + return 'icons/magic/sonic/projectile-shock-wave-blue.webp' + } + + get duration () { + return 0 + } + + get isTargeted () { + return true + } + + get usePrimaryEffect () { + return false + } + + get isDamaging () { + return true + } + + get basePowerPoints () { + return 3 + } + + get hasAoe () { + return true + } + get modifiers () { const mods = super.modifiers mods.push( { name: 'Damage', value: 2, id: 'damage', epic: false, effect: false }, - { name: 'Greater Burst', value: 4, id: 'greater', epic: true, effect: false }, + { + name: 'Greater Burst', + value: 4, + id: 'greater', + epic: true, + effect: false + } ) return mods } + get description () { - const dmgDie = ( - this.data.mods.has('greater') ? 4 : - (this.data.mods.has('damage') ? 3 : 2)) + (this.data.raise ? 1 : 0) - return super.description + ` + const dmgDie = + (this.data.mods.has('greater') + ? 4 + : this.data.mods.has('damage') + ? 3 + : 2) + (this.data.raise ? 1 : 0) + return ( + super.description + + `
The blast covers a Cone or Stream template and does ${dmgDie}d6 damage
` + ) } } class ConfusionEffect extends PowerEffect { - get name () { return 'Confusion' } - get icon () { return 'icons/magic/control/hypnosis-mesmerism-swirl.webp' } - get duration () { return 0 } - get isTargeted () { return true } - get usePrimaryEffect () { return false } - get basePowerPoints () { return 2 } - get hasAoe () { return true } + get name () { + return 'Confusion' + } + + get icon () { + return 'icons/magic/control/hypnosis-mesmerism-swirl.webp' + } + + get duration () { + return 0 + } + + get isTargeted () { + return true + } + + get usePrimaryEffect () { + return false + } + + get basePowerPoints () { + return 2 + } + + get hasAoe () { + return true + } + get menuInputs () { const inputs = super.menuInputs - inputs.push - inputs.push({ type: 'select', label: 'Area of Effect', - options: [ - {html: 'Small Blast Template (0)', value: 's', selected: false}, - {html: 'Medium Blast Template (0)', value: 'm', selected: true}, - {html: 'Large Blast Template (+1)', value: 'l', selected: false}, - ]}) + inputs.push({ + type: 'select', + label: 'Area of Effect', + options: [ + { html: 'Small Blast Template (0)', value: 's', selected: false }, + { html: 'Medium Blast Template (0)', value: 'm', selected: true }, + { html: 'Large Blast Template (+1)', value: 'l', selected: false } + ] + }) return inputs } + get modifiers () { const mods = super.modifiers - mods.push( - { name: 'Greater Confusion', value: 2, id: 'greater', epic: true, effect: false }, - ) + mods.push({ + name: 'Greater Confusion', + value: 2, + id: 'greater', + epic: true, + effect: false + }) return mods } + get powerPoints () { let total = super.powerPoints - total += (this.data.aoe === 'l' ? 1 : 0) + total += this.data.aoe === 'l' ? 1 : 0 return total } + get menuButtons () { const data = [ { label: 'Apply with Distracted', value: 'distracted' }, { label: 'Apply with Vulnerable', value: 'vulnerable' }, { label: 'Apply with both (raise)', value: 'raise' }, - { label: 'Cancel', value: 'cancel' }, + { label: 'Cancel', value: 'cancel' } ] return data } + async parseValues () { await super.parseValues() - this.data.distracted = this.data.button === 'distracted' || this.data.button === 'raise' - this.data.vulnerable = this.data.button === 'vulnerable' || this.data.button === 'raise' + this.data.distracted = + this.data.button === 'distracted' || this.data.button === 'raise' + this.data.vulnerable = + this.data.button === 'vulnerable' || this.data.button === 'raise' this.data.aoe = this.data.values.shift() } + get description () { - const size = ( - this.data.aoe === 'l' ? 'LBT' : (this.data.aoe === 's' ? 'SBT' : 'MBT')) + const size = + this.data.aoe === 'l' ? 'LBT' : this.data.aoe === 's' ? 'SBT' : 'MBT' let effect = 'Vulnerable' if (this.data.raise) { effect = 'both Distracted and Vulnerable' @@ -609,39 +1046,75 @@ class ConfusionEffect extends PowerEffect { if (this.data.mods.has('Greater')) { effect += ' as well as Shaken' } - return super.description + ` + return ( + super.description + + `The targets in the ${size} are ${effect}.
` + ) } + async createSecondaryEffects (maintId) { const docs = await super.createSecondaryEffects(maintId) if (this.data.distracted) { - PowerEffect.getStatus('SWADE.Distr', 'Distracted', false).then(v => docs.push(v)) + PowerEffect.getStatus('SWADE.Distr', 'Distracted', false).then((v) => + docs.push(v) + ) } if (this.data.distracted) { - PowerEffect.getStatus('SWADE.Vuln', 'Vulnerable', false).then(v => docs.push(v)) + PowerEffect.getStatus('SWADE.Vuln', 'Vulnerable', false).then((v) => + docs.push(v) + ) } if (this.data.mods.has('greater')) { - PowerEffect.getStatus('SWADE.Shaken', 'Shaken', false).then(v => docs.push(v)) + PowerEffect.getStatus('SWADE.Shaken', 'Shaken', false).then((v) => + docs.push(v) + ) } return docs } } class CurseEffect extends PowerEffect { - get name () { return 'Curse' } - get icon () { return 'icons/magic/control/voodoo-doll-pain-damage-purple.webp' } - get duration () { return 500*24*60*6 } - get isTargeted () { return true } - get oneTarget () { return true } - get isRaisable () { return false } - get basePowerPoints () { return 5 } + get name () { + return 'Curse' + } + + get icon () { + return 'icons/magic/control/voodoo-doll-pain-damage-purple.webp' + } + + get duration () { + return 500 * 24 * 60 * 6 + } + + get isTargeted () { + return true + } + + get oneTarget () { + return true + } + + get isRaisable () { + return false + } + + get basePowerPoints () { + return 5 + } + get modifiers () { const mods = super.modifiers mods.push({ - name: 'Turn to Stone', value: 5, id: 'turntostone', epic: true, effect: false + name: 'Turn to Stone', + value: 5, + id: 'turntostone', + epic: true, + effect: false }) return mods } + get description () { let desc = super.description desc += `The victim must defend with a Spirit roll opposed by the @@ -664,21 +1137,67 @@ class CurseEffect extends PowerEffect { } class DamageFieldEffect extends PowerEffect { - get name () { return 'Damage Field' } - get icon () { return 'icons/magic/defensive/shield-barrier-blades-teal.webp' } - get duration () { return 5 } - get basePowerPoints () { return 4 } - get isTargeted () { return true } - get oneTarget () { return true } - get isRaisable () { return false } + get name () { + return 'Damage Field' + } + + get icon () { + return 'icons/magic/defensive/shield-barrier-blades-teal.webp' + } + + get duration () { + return 5 + } + + get basePowerPoints () { + return 4 + } + + get isTargeted () { + return true + } + + get oneTarget () { + return true + } + + get isRaisable () { + return false + } + get modifiers () { const mods = super.modifiers - mods.push({ name: 'Area of Effect', value: 2, id: 'aoe', epic: false, effect: false }) - mods.push({ name: 'Damage', value: 2, id: 'damage', epic: false, effect: false }) - mods.push({ name: 'Greater Damage Field', value: 4, id: 'greater', epic: true, effect: false }) - mods.push({ name: 'Mobile', value: 2, id: 'mobile', epic: false, effect: false }) + mods.push({ + name: 'Area of Effect', + value: 2, + id: 'aoe', + epic: false, + effect: false + }) + mods.push({ + name: 'Damage', + value: 2, + id: 'damage', + epic: false, + effect: false + }) + mods.push({ + name: 'Greater Damage Field', + value: 4, + id: 'greater', + epic: true, + effect: false + }) + mods.push({ + name: 'Mobile', + value: 2, + id: 'mobile', + epic: false, + effect: false + }) return mods } + get description () { let desc = super.description let area = 'all adjacent creatures' @@ -700,6 +1219,7 @@ class DamageFieldEffect extends PowerEffect { desc += '
' return desc } + getPrimaryEffectChanges () { const base = 'flags.swade.auras.damagefield' const priority = 0 @@ -709,26 +1229,59 @@ class DamageFieldEffect extends PowerEffect { { key: `${base}.walls`, value: true, priority, mode }, { key: `${base}.color`, value: '#ffcc00', priority, mode }, { key: `${base}.alpha`, value: 0.1, priority, mode }, - { key: `${base}.radius`, value: (this.data.mods.has('aoe') ? 1.5 : 0.5), priority, mode }, - { key: `${base}.visibleTo`, value: [-1, 0, 1], priority, mode }, + { + key: `${base}.radius`, + value: this.data.mods.has('aoe') ? 1.5 : 0.5, + priority, + mode + }, + { key: `${base}.visibleTo`, value: [-1, 0, 1], priority, mode } ] return changes } } class DarksightEffect extends PowerEffect { - get name () { return 'Darksight' } - get icon () { return 'icons/magic/perception/eye-ringed-glow-angry-small-teal.webp' } - get duration () { return 600 } - get basePowerPoints () { return 1 } - get isTargeted () { return true } - get hasAdditionalRecipients () { return true } - get additionalRecipientCost () { return 1 } + get name () { + return 'Darksight' + } + + get icon () { + return 'icons/magic/perception/eye-ringed-glow-angry-small-teal.webp' + } + + get duration () { + return 600 + } + + get basePowerPoints () { + return 1 + } + + get isTargeted () { + return true + } + + get hasAdditionalRecipients () { + return true + } + + get additionalRecipientCost () { + return 1 + } + get modifiers () { const mods = super.modifiers - mods.push({name: 'Greater Darksight', value: 2, id: 'greater', epic: true, effect: false}) + mods.push({ + name: 'Greater Darksight', + value: 2, + id: 'greater', + epic: true, + effect: false + }) return mods } + get description () { let desc = super.description desc += '' @@ -736,13 +1289,16 @@ class DarksightEffect extends PowerEffect { desc += `Can see in all darkness, ignoring all illumination penalties and 4 points of penalties from invisible creatures` } else if (this.data.raise) { - desc += 'Can see in Pitch Darkness and ignore up to 6 points of illumination penalties' + desc += + 'Can see in Pitch Darkness and ignore up to 6 points of illumination penalties' } else { - desc += 'Can see in darkness and ignore 4 points of illumination penalties' + desc += + 'Can see in darkness and ignore 4 points of illumination penalties' } desc += '
' return desc } + get effectName () { if (this.data.mods.has('greater')) { return 'Greater Darksight' @@ -755,78 +1311,163 @@ class DarksightEffect extends PowerEffect { } class DeflectionEffect extends PowerEffect { - get name () { return 'Deflection' } - get icon () { return 'icons/magic/defensive/shield-barrier-deflect-teal.webp' } - get duration () { return 5 } - get basePowerPoints () { return 2 } - get isTargeted () { return true } - get hasAdditionalRecipients () { return true } - get additionalRecipientCost () { return 1 } + get name () { + return 'Deflection' + } + + get icon () { + return 'icons/magic/defensive/shield-barrier-deflect-teal.webp' + } + + get duration () { + return 5 + } + + get basePowerPoints () { + return 2 + } + + get isTargeted () { + return true + } + + get hasAdditionalRecipients () { + return true + } + + get additionalRecipientCost () { + return 1 + } + get menuButtons () { const data = [ { label: 'Melee', value: 'melee' }, { label: 'Ranged', value: 'vulnerable' }, { label: 'Raise (both)', value: 'raise' }, - { label: 'Cancel', value: 'cancel' }, + { label: 'Cancel', value: 'cancel' } ] return data } + async parseValues () { await super.parseValues() this.data.affects = this.data.button === 'raise' ? 'all' : this.data.button } + get effectName () { return `Deflection (${this.data.affects})` } + get description () { - return super.description + `Attackers subtract -2 from ${this.data.affects} + return ( + super.description + + `
Attackers subtract -2 from ${this.data.affects} attacks when targeting this creature.
` + ) } } class DetectConcealArcanaEffect extends PowerEffect { - get name () { return 'Detect/Conceal Arcana' } - get icon () { return this.data.detect ? - 'icons/magic/perception/third-eye-blue-red.webp' : - 'icons/magic/perception/silhouette-stealth-shadow.webp' } - get duration () { return this.data.detect ? 5 : 600 } - get basePowerPoints () { return 2 } - get isTargeted () { return true } - get hasAdditionalRecipients () { return true } - get additionalRecipientCost () { return (this.data?.aoe || 0) > 0 ? 0 : 1 } + get name () { + return 'Detect/Conceal Arcana' + } + + get icon () { + return this.data.detect + ? 'icons/magic/perception/third-eye-blue-red.webp' + : 'icons/magic/perception/silhouette-stealth-shadow.webp' + } + + get duration () { + return this.data.detect ? 5 : 600 + } + + get basePowerPoints () { + return 2 + } + + get isTargeted () { + return true + } + + get hasAdditionalRecipients () { + return true + } + + get additionalRecipientCost () { + return (this.data?.aoe || 0) > 0 ? 0 : 1 + } + get modifiers () { const mods = super.modifiers - mods.push({name: 'Alignment Sense (detect)', value: 1, id: 'alignment', epic: false, effect: false}) - mods.push({name: 'Identify (detect)', value: 1, id: 'identify', epic: false, effect: false}) - mods.push({name: 'Strong (conceal)', value: 1, id: 'strong', epic: false, effect: false}) + mods.push({ + name: 'Alignment Sense (detect)', + value: 1, + id: 'alignment', + epic: false, + effect: false + }) + mods.push({ + name: 'Identify (detect)', + value: 1, + id: 'identify', + epic: false, + effect: false + }) + mods.push({ + name: 'Strong (conceal)', + value: 1, + id: 'strong', + epic: false, + effect: false + }) return mods } - get hasAoe () { return true } + + get hasAoe () { + return true + } + get menuInputs () { const inputs = super.menuInputs - inputs.push({ type: 'select', label: 'Area of Effect (conceal)', + inputs.push({ + type: 'select', + label: 'Area of Effect (conceal)', options: [ - {html: 'None', value: 0, selected: true}, - {html: 'Medium Blast Template (+1)', value: 1, selected: false}, - {html: 'Large Blast Template (+2)', value: 2, selected: false}, - ]}) - inputs.push({type: 'info', label: 'Detect or Conceal?'}) - inputs.push({type: 'radio', label: 'Detect', options: ['isDetect', true]}) - inputs.push({type: 'radio', label: 'Conceal', options: ['isDetect', false]}) + { html: 'None', value: 0, selected: true }, + { html: 'Medium Blast Template (+1)', value: 1, selected: false }, + { html: 'Large Blast Template (+2)', value: 2, selected: false } + ] + }) + inputs.push({ type: 'info', label: 'Detect or Conceal?' }) + inputs.push({ + type: 'radio', + label: 'Detect', + options: ['isDetect', true] + }) + inputs.push({ + type: 'radio', + label: 'Conceal', + options: ['isDetect', false] + }) return inputs } + async parseValues () { await super.parseValues() this.data.aoe = this.data.values.shift() this.data.values.shift() this.data.detect = this.data.values.shift() } + get powerPoints () { return super.powerPoints + this.data.aoe } + get effectName () { return `${this.data.detect ? 'Detect' : 'Conceal'} Arcana` } + get description () { let desc = super.description if (this.data.detect) { @@ -837,7 +1478,7 @@ class DetectConcealArcanaEffect extends PowerEffect { desc += `Since this was major Detect Arcana, the type of enchantments is also known.` } - desc+= `If cast to learn more about a creature, the caster learns + desc += `
If cast to learn more about a creature, the caster learns active powers and arcane abilities.` if (this.data.raise) { desc += `As major Detect in this mode, the caster also learns any @@ -869,53 +1510,80 @@ class DetectConcealArcanaEffect extends PowerEffect { } class DisguiseEffect extends PowerEffect { - get name () { return 'Disguise' } - get icon () { return 'icons/equipment/head/mask-carved-wood-white.webp' } - get duration () { return 100 } - get basePowerPoints () { return 2 } - get isTargeted () { return true } - get hasAdditionalRecipients () { return true } - get additionalRecipientCost () { return 1 } + get name () { + return 'Disguise' + } + + get icon () { + return 'icons/equipment/head/mask-carved-wood-white.webp' + } + + get duration () { + return 100 + } + + get basePowerPoints () { + return 2 + } + + get isTargeted () { + return true + } + + get hasAdditionalRecipients () { + return true + } + + get additionalRecipientCost () { + return 1 + } + get modifiers () { return [ ...super.modifiers, - {name: 'Size', value: 1, id: 'size', epic: false, effect: false} + { name: 'Size', value: 1, id: 'size', epic: false, effect: false } ] } + get description () { - let size = this.data.mods.has('size') ? 'of the same size as' : 'within two sizes of' - return super.description + ` + const size = this.data.mods.has('size') + ? 'of the same size as' + : 'within two sizes of' + return ( + super.description + + `
Assume the appearance of another person ${size} the recipient. Anyone who has cause to doubt the disguise may make a Notice roll at ${this.data.raise ? -4 : -4} as a free action to see through the disguise.
` + ) } } const PowerClasses = { - "arcane-protection": ArcaneProtectionEffect, + 'arcane-protection': ArcaneProtectionEffect, banish: BanishEffect, barrier: BarrierEffect, - "beast-friend": BeastFriendEffect, + 'beast-friend': BeastFriendEffect, blast: BlastEffect, blind: BlindEffect, bolt: BoltEffect, - "boost-lower-trait": BoostLowerTraitEffect, - "boost-trait": BoostLowerTraitEffect, + 'boost-lower-trait': BoostLowerTraitEffect, + 'boost-trait': BoostLowerTraitEffect, burrow: BurrowEffect, burst: BurstEffect, confusion: ConfusionEffect, curse: CurseEffect, - "damage-field": DamageFieldEffect, + 'damage-field': DamageFieldEffect, darksight: DarksightEffect, deflection: DeflectionEffect, - "detect-conceal-arcana": DetectConcealArcanaEffect, - "disguise" : DisguiseEffect, - "lower-trait": BoostLowerTraitEffect, + 'detect-conceal-arcana': DetectConcealArcanaEffect, + disguise: DisguiseEffect, + 'lower-trait': BoostLowerTraitEffect } /* ---------------------------------------------------------------- */ -export async function powerEffectManagementHook(effect, data, userId) { +export async function powerEffectManagementHook (effect, data, userId) { if (game.user.id !== userId) { return } @@ -939,9 +1607,10 @@ export async function powerEffectManagementHook(effect, data, userId) { continue } const effects = target.actor.effects.filter( - e => e.getFlag(moduleName, 'maintId') === maintId) - for (const effect of effects) { - mutation.embedded.ActiveEffect[effect.id] = warpgate.CONST.DELETE + (e) => e.getFlag(moduleName, 'maintId') === maintId + ) + for (const efct of effects) { + mutation.embedded.ActiveEffect[efct.id] = warpgate.CONST.DELETE } mutateOptions.description = `${effect.parent.name} is no longer ${effect.name} on ${target.name}` await warpgate.mutate(target.document, mutation, {}, mutateOptions) @@ -966,4 +1635,3 @@ export async function powers (options = {}) { } ui.notifications.error(`No power effect found for ${name}`) } - diff --git a/scripts/rollHelpers.js b/scripts/rollHelpers.js index 2ab1210..6afcfc4 100644 --- a/scripts/rollHelpers.js +++ b/scripts/rollHelpers.js @@ -1,15 +1,8 @@ -import { log, module } from './globals.js' +import { log } from './globals.js' export async function preTraitRollModifiers (actor, trait, roll, modifiers, options) { const targets = Array.from(game.user.targets) const token = game.canvas.tokens.controlled.length > 0 ? game.canvas.tokens.controlled[0] : null - // log('ACTOR', actor) - // log('TOKEN', token) - // log('TRAIT', trait) - // log('ROLL', roll) - // log('MODIFIERS', modifiers) - // log('OPTIONS', options) - // log('TARGET', targets) if (targets.some(target => target.actor.system.status.isVulnerable)) { modifiers.push({ label: 'Target is Vulnerable', value: '+2', ignore: false }) }