From 4adde0852b1ab6529177721aa62a3e8620c8c454 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Mon, 4 Sep 2023 17:47:12 -0500 Subject: [PATCH 01/20] updates and prep for macro-action style --- module.json | 163 ++-- package-lock.json | 1554 +++++++++++++++++++++++---------------- package.json | 12 +- scripts/api.js | 2 + scripts/helpers.js | 22 +- scripts/module.js | 4 + scripts/powerEffects.js | 181 +++++ scripts/shim.js | 61 ++ 8 files changed, 1276 insertions(+), 723 deletions(-) create mode 100644 scripts/powerEffects.js create mode 100644 scripts/shim.js diff --git a/module.json b/module.json index 6b68e12..adecb8a 100644 --- a/module.json +++ b/module.json @@ -1,67 +1,102 @@ { - "id": "swade-mb-helpers", - "name": "SWADE Helpers (MB)", - "title": "SWADE Helpers (MB)", - "description": "Mike's collection of swade helpers", - "version": "1.1.0", - "authors": [ - { - "name": "Mike" - } - ], - "minimumCoreVersion": "10", - "compatibleCoreVersion": "10", - "compatibility": { - "minimum": "10", - "verified": "10" + "id": "swade-mb-helpers", + "title": "SWADE Helpers (MB)", + "description": "Mike's collection of swade helpers", + "version": "1.1.0", + "authors": [ + { + "name": "Mike" + } + ], + "compatibility": { + "minimum": "11", + "verified": "11" + }, + "esmodules": [ + "scripts/module.js" + ], + "packs": [ + { + "name": "module-docs", + "label": "SWADE MB Helpers Documentation", + "path": "packs/module-docs", + "type": "JournalEntry", + "system": "swade", + "ownership": { + "PLAYER": "OBSERVER", + "ASSISTANT": "OWNER" + } }, - "esmodules": [ - "./scripts/module.js" - ], - "packs": [ - { - "name": "module-docs", - "label": "SWADE MB Helpers Documentation", - "path": "./packs/module-docs.db", - "type": "JournalEntry" - }, - { - "name": "effect-macros", - "label": "SWADE MB Effect Macros", - "path": "./packs/effect-macros.db", - "type": "Macro" - }, - { - "name": "helper-macros", - "label": "SWADE MB Helper Macros", - "path": "./packs/helper-macros.db", - "type": "Macro" - }, - { - "name": "Common Actions", - "label": "SWADE MB Common Actions", - "path": "./packs/common-actions.db", - "type": "Item" - } - ], - "relationships": { - "systems": [{ - "id": "swade", - "type": "system", - "manifest": "https://gitlab.com/api/v4/projects/16269883/packages/generic/swade/latest/system.json", - "compatibility": { "verified": "2.2.5" } - }], - "requires": [{ - "id": "warpgate", - "type": "module", - "manifest": "https://github.com/trioderegion/warpgate/releases/latest/download/module.json", - "compatibility": { "verified": "1.16.2" } - }] + { + "name": "effect-macros", + "label": "SWADE MB Effect Macros", + "path": "packs/effect-macros", + "type": "Macro", + "system": "swade", + "ownership": { + "PLAYER": "OBSERVER", + "ASSISTANT": "OWNER" + } }, - "system": ["swade"], - "url": "https://git.bloy.org/foundryvtt/swade-mb-helpers", - "manifest": "https://git.bloy.org/foundryvtt/swade-mb-helpers/raw/branch/main/module.json", - "download": "https://git.bloy.org/foundryvtt/swade-mb-helpers/archive/main.zip", - "license": "./LICENSE", - "readme": "./README.md" - } + { + "name": "helper-macros", + "label": "SWADE MB Helper Macros", + "path": "packs/helper-macros", + "type": "Macro", + "system": "swade", + "ownership": { + "PLAYER": "OBSERVER", + "ASSISTANT": "OWNER" + } + }, + { + "name": "Common Actions", + "label": "SWADE MB Common Actions", + "path": "packs/common-actions", + "type": "Item", + "system": "swade", + "ownership": { + "PLAYER": "OBSERVER", + "ASSISTANT": "OWNER" + } + } + ], + "relationships": { + "systems": [ + { + "id": "swade", + "type": "system", + "manifest": "https://gitlab.com/api/v4/projects/16269883/packages/generic/swade/latest/system.json", + "compatibility": { + "verified": "2.2.5" + } + } + ], + "requires": [ + { + "id": "warpgate", + "type": "module", + "manifest": "https://github.com/trioderegion/warpgate/releases/latest/download/module.json", + "compatibility": { + "verified": "1.16.2" + } + } + ], + "recommends": [ + { + "id": "token-variants", + "type": "module", + "compatibility": {} + }, + { + "id": "torch", + "type": "module" + } + ] + }, + "url": "https://git.bloy.org/foundryvtt/swade-mb-helpers", + "manifest": "https://git.bloy.org/foundryvtt/swade-mb-helpers/raw/branch/main/module.json", + "download": "https://git.bloy.org/foundryvtt/swade-mb-helpers/archive/main.zip", + "license": "./LICENSE", + "readme": "./README.md" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e72ee7b..27a52e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,25 +4,59 @@ "requires": true, "packages": { "": { + "name": "swade-mb-helpers", "devDependencies": { "@league-of-foundry-developers/foundry-vtt-types": "^9.280.0", - "eslint": "^8.35.0", - "eslint-config-standard": "^17.0.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.6.1", + "eslint": "^8.48.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", - "typescript": "^4.9.5" + "typescript": "^5.2.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -38,18 +72,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -308,16 +342,16 @@ } }, "node_modules/@pixi/constants": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-6.5.9.tgz", - "integrity": "sha512-749Vv+DUh4Tguku6uouXUIAUHThYU/cDZzWW4lYNv2UrqUrPxE1a7b8Ca0GakFjt6HZIenl6DnUYLP4yE6PWiQ==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-6.5.10.tgz", + "integrity": "sha512-PUF2Y9YISRu5eVrVVHhHCWpc/KmxQTg3UH8rIUs8UI9dCK41/wsPd3pEahzf7H47v7x1HCohVZcFO3XQc1bUDw==", "dev": true, "peer": true }, "node_modules/@pixi/core": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-6.5.9.tgz", - "integrity": "sha512-NQGaEYtUIKNAQNeqLsfHSkx1BYuOWJzAYDpb63QEZFvV8gTRf2t3SBuyvSxvMFAGakNrqYefIXkfJXpmHOrk7A==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/core/-/core-6.5.10.tgz", + "integrity": "sha512-Gdzp5ENypyglvsh5Gv3teUZnZnmizo4xOsL+QqmWALdFlJXJwLJMVhKVThV/q/095XR6i4Ou54oshn+m4EkuFw==", "dev": true, "peer": true, "dependencies": { @@ -328,32 +362,32 @@ "url": "https://opencollective.com/pixijs" }, "peerDependencies": { - "@pixi/constants": "6.5.9", - "@pixi/extensions": "6.5.9", - "@pixi/math": "6.5.9", - "@pixi/runner": "6.5.9", - "@pixi/settings": "6.5.9", - "@pixi/ticker": "6.5.9", - "@pixi/utils": "6.5.9" + "@pixi/constants": "6.5.10", + "@pixi/extensions": "6.5.10", + "@pixi/math": "6.5.10", + "@pixi/runner": "6.5.10", + "@pixi/settings": "6.5.10", + "@pixi/ticker": "6.5.10", + "@pixi/utils": "6.5.10" } }, "node_modules/@pixi/display": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-6.5.9.tgz", - "integrity": "sha512-85eODYWsOM/kIt2N/L51lsAl3DLJA+1Eed+Nl6ZeF/pEvQnXf7jDZzGwVmUKJurpPWhjkA5OnzWabFw3De2qZg==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/display/-/display-6.5.10.tgz", + "integrity": "sha512-NxFdDDxlbH5fQkzGHraLGoTMucW9pVgXqQm13TSmkA3NWIi/SItHL4qT2SI8nmclT9Vid1VDEBCJFAbdeuQw1Q==", "dev": true, "peer": true, "peerDependencies": { - "@pixi/constants": "6.5.9", - "@pixi/math": "6.5.9", - "@pixi/settings": "6.5.9", - "@pixi/utils": "6.5.9" + "@pixi/constants": "6.5.10", + "@pixi/math": "6.5.10", + "@pixi/settings": "6.5.10", + "@pixi/utils": "6.5.10" } }, "node_modules/@pixi/extensions": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-6.5.9.tgz", - "integrity": "sha512-vwzEhLkGiiCw9e7QmXBKHuJzX1DzaA2JcFw0Kl1DTI0lH1cIZccE3rVBbuVY8+Zvb33WV5XxwQC03/qyx4DUbw==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-6.5.10.tgz", + "integrity": "sha512-EIUGza+E+sCy3dupuIjvRK/WyVyfSzHb5XsxRaxNrPwvG1iIUIqNqZ3owLYCo4h17fJWrj/yXVufNNtUKQccWQ==", "dev": true, "peer": true }, @@ -894,18 +928,18 @@ } }, "node_modules/@pixi/graphics": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-6.5.9.tgz", - "integrity": "sha512-+b7Ke6MkngftcRq2WweqsEWtV4ttRRurCiiPYeOhM5kGuAwDoyWGhXnWltiBQUHAE026uEep8wFi3vmlAzlXTQ==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-6.5.10.tgz", + "integrity": "sha512-KPHGJ910fi8bRQQ+VcTIgrK+bKIm8yAQaZKPqMtm14HzHPGcES6HkgeNY1sd7m8J4aS9btm5wOSyFu0p5IzTpA==", "dev": true, "peer": true, "peerDependencies": { - "@pixi/constants": "6.5.9", - "@pixi/core": "6.5.9", - "@pixi/display": "6.5.9", - "@pixi/math": "6.5.9", - "@pixi/sprite": "6.5.9", - "@pixi/utils": "6.5.9" + "@pixi/constants": "6.5.10", + "@pixi/core": "6.5.10", + "@pixi/display": "6.5.10", + "@pixi/math": "6.5.10", + "@pixi/sprite": "6.5.10", + "@pixi/utils": "6.5.10" } }, "node_modules/@pixi/graphics-smooth": { @@ -1096,9 +1130,9 @@ } }, "node_modules/@pixi/math": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-6.5.9.tgz", - "integrity": "sha512-L6EARDZiMXXqyqrgvc4lTVpMppRhkeJcCCg+6XAilp73ZAehmcCKt1fuCENbscpJgdX8EDBDWlGVrDOq6Yfa3Q==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/math/-/math-6.5.10.tgz", + "integrity": "sha512-fxeu7ykVbMGxGV2S3qRTupHToeo1hdWBm8ihyURn3BMqJZe2SkZEECPd5RyvIuuNUtjRnmhkZRnF3Jsz2S+L0g==", "dev": true, "peer": true }, @@ -1711,35 +1745,35 @@ } }, "node_modules/@pixi/runner": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-6.5.9.tgz", - "integrity": "sha512-xIfmhflbhrDw9ZEDezL46K+/L3pz79KU0qvtmg82eXgJdpsp9irDY2+QcEYgOO1AnYmqO9E1ygZd/RofCxRM1g==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-6.5.10.tgz", + "integrity": "sha512-4HiHp6diCmigJT/DSbnqQP62OfWKmZB7zPWMdV1AEdr4YT1QxzXAW1wHg7dkoEfyTHqZKl0tm/zcqKq/iH7tMA==", "dev": true, "peer": true }, "node_modules/@pixi/settings": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-6.5.9.tgz", - "integrity": "sha512-cOODlDuToO3uixgDRHlsxGbzlgZKNyZn+AeZKHyo6z8JpLh5mYrC4wEgLyHoKSOX0VgNzlSY6VNLthmgpu2gAg==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-6.5.10.tgz", + "integrity": "sha512-ypAS5L7pQ2Qb88yQK72bXtc7sD8OrtLWNXdZ/gnw5kwSWCFaOSoqhKqJCXrR5DQtN98+RQefwbEAmMvqobhFyw==", "dev": true, "peer": true, "peerDependencies": { - "@pixi/constants": "6.5.9" + "@pixi/constants": "6.5.10" } }, "node_modules/@pixi/sprite": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-6.5.9.tgz", - "integrity": "sha512-pgYHrIES9vZ1HfcFVpvDpdI8sMwzNRhInDkfRCfJX0K3NaAW8AWzu1DPPsn+eYzIF14gpi9JZXS3lT8JtD8lug==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-6.5.10.tgz", + "integrity": "sha512-UiK+8LgM9XQ/SBDKjRgZ8WggdOSlFRXqiWjEZVmNkiyU8HvXeFzWPRhpc8RR1zDwAUhZWKtMhF8X/ba9m+z2lg==", "dev": true, "peer": true, "peerDependencies": { - "@pixi/constants": "6.5.9", - "@pixi/core": "6.5.9", - "@pixi/display": "6.5.9", - "@pixi/math": "6.5.9", - "@pixi/settings": "6.5.9", - "@pixi/utils": "6.5.9" + "@pixi/constants": "6.5.10", + "@pixi/core": "6.5.10", + "@pixi/display": "6.5.10", + "@pixi/math": "6.5.10", + "@pixi/settings": "6.5.10", + "@pixi/utils": "6.5.10" } }, "node_modules/@pixi/sprite-animated": { @@ -2230,20 +2264,20 @@ } }, "node_modules/@pixi/ticker": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-6.5.9.tgz", - "integrity": "sha512-y7bpdSXc+UkfH2HPvOCV7XBk1eFsmoexsvVGqlRNd9r0sb/OXqcYLvnW4+BEyt5xKp7TpQibNBEKJCNih4dcMQ==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-6.5.10.tgz", + "integrity": "sha512-UqX1XYtzqFSirmTOy8QAK4Ccg4KkIZztrBdRPKwFSOEiKAJoGDCSBmyQBo/9aYQKGObbNnrJ7Hxv3/ucg3/1GA==", "dev": true, "peer": true, "peerDependencies": { - "@pixi/extensions": "6.5.9", - "@pixi/settings": "6.5.9" + "@pixi/extensions": "6.5.10", + "@pixi/settings": "6.5.10" } }, "node_modules/@pixi/utils": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-6.5.9.tgz", - "integrity": "sha512-eLYZihYs9gEyPscoNvxgpZtKTXeCskoZ7TFmI23gAoegOIA3SWUsCudi/DJuQwGJSulitQ0M2BDJoVoSEoonEA==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-6.5.10.tgz", + "integrity": "sha512-4f4qDMmAz9IoSAe08G2LAxUcEtG9jSdudfsMQT2MG+OpfToirboE6cNoO0KnLCvLzDVE/mfisiQ9uJbVA9Ssdw==", "dev": true, "peer": true, "dependencies": { @@ -2253,8 +2287,8 @@ "url": "^0.11.0" }, "peerDependencies": { - "@pixi/constants": "6.5.9", - "@pixi/settings": "6.5.9" + "@pixi/constants": "6.5.10", + "@pixi/settings": "6.5.10" } }, "node_modules/@socket.io/component-emitter": { @@ -2271,9 +2305,9 @@ "peer": true }, "node_modules/@types/jquery": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", - "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.18.tgz", + "integrity": "sha512-sNm7O6LECFhHmF+3KYo6QIl2fIbjlPYa0PDgDQwfOaEJzwpK20Eub9Ke7VKkGsSJ2K0HUR50S266qYzRX4GlSw==", "dev": true, "dependencies": { "@types/sizzle": "*" @@ -2286,15 +2320,15 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz", - "integrity": "sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==", + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", "dev": true }, "node_modules/@types/offscreencanvas": { - "version": "2019.7.0", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz", - "integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==", + "version": "2019.7.1", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.1.tgz", + "integrity": "sha512-+HSrJgjBW77ALieQdMJvXhRZUIRN1597L+BKvsyeiIlHHERnqjcuOLyodK3auJ3Y3zRezNKtKAhuQWYJfEgFHQ==", "dev": true, "peer": true }, @@ -2314,9 +2348,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2380,16 +2414,29 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -2399,6 +2446,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", @@ -2435,6 +2501,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -2479,9 +2565,9 @@ } }, "node_modules/builtins/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2644,27 +2730,28 @@ } }, "node_modules/engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", + "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==", "dev": true, "engines": { "node": ">=10.0.0" } }, "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -2672,8 +2759,8 @@ "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", @@ -2681,16 +2768,21 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -2758,26 +2850,27 @@ } }, "node_modules/eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -2785,23 +2878,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -2815,9 +2904,9 @@ } }, "node_modules/eslint-config-standard": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", - "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "funding": [ { @@ -2833,22 +2922,25 @@ "url": "https://feross.org/support" } ], + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "eslint": "^8.0.1", "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", "eslint-plugin-promise": "^6.0.0" } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -2861,9 +2953,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -2886,70 +2978,48 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "node_modules/eslint-plugin-es-x": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.2.0.tgz", + "integrity": "sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==", "dev": true, "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0" }, "engines": { - "node": ">=8.10.0" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" + "eslint": ">=8" } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, "dependencies": { "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", "array.prototype.flat": "^1.3.1", "array.prototype.flatmap": "^1.3.1", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", + "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { "node": ">=4" @@ -2980,22 +3050,22 @@ } }, "node_modules/eslint-plugin-n": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", - "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz", + "integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", + "eslint-plugin-es-x": "^7.1.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.1", "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" + "resolve": "^1.22.2", + "semver": "^7.5.3" }, "engines": { - "node": ">=12.22.0" + "node": ">=16.0.0" }, "funding": { "url": "https://github.com/sponsors/mysticatea" @@ -3005,9 +3075,9 @@ } }, "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3032,9 +3102,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -3042,53 +3112,32 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3098,9 +3147,9 @@ } }, "node_modules/esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -3201,16 +3250,17 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { @@ -3241,15 +3291,15 @@ "dev": true }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -3268,13 +3318,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -3330,9 +3381,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -3371,10 +3422,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/handlebars": { @@ -3550,13 +3601,13 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" }, "funding": { @@ -3604,9 +3655,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -3746,16 +3797,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -3776,6 +3823,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3788,16 +3841,6 @@ "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==", "dev": true }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -3810,6 +3853,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "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-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3834,6 +3883,15 @@ "json5": "lib/cli.js" } }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -3970,15 +4028,44 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -3997,17 +4084,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -4280,19 +4367,27 @@ } }, "node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { - "node": ">=0.4.x" + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/queue-microtask": { @@ -4316,14 +4411,14 @@ ] }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -4332,25 +4427,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -4428,6 +4511,24 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -4443,9 +4544,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4525,6 +4626,23 @@ "node": ">=0.10.0" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", @@ -4658,6 +4776,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -4673,16 +4842,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/uglify-js": { @@ -4722,25 +4891,22 @@ "punycode": "^2.1.0" } }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", "dev": true, "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.0" } }, + "node_modules/url/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4773,17 +4939,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -4792,15 +4957,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", @@ -4869,15 +5025,36 @@ } }, "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "dev": true + }, "@eslint/eslintrc": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.0.tgz", - "integrity": "sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -4887,15 +5064,15 @@ } }, "@eslint/js": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.35.0.tgz", - "integrity": "sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz", + "integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==", "dev": true }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -5131,16 +5308,16 @@ } }, "@pixi/constants": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-6.5.9.tgz", - "integrity": "sha512-749Vv+DUh4Tguku6uouXUIAUHThYU/cDZzWW4lYNv2UrqUrPxE1a7b8Ca0GakFjt6HZIenl6DnUYLP4yE6PWiQ==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-6.5.10.tgz", + "integrity": "sha512-PUF2Y9YISRu5eVrVVHhHCWpc/KmxQTg3UH8rIUs8UI9dCK41/wsPd3pEahzf7H47v7x1HCohVZcFO3XQc1bUDw==", "dev": true, "peer": true }, "@pixi/core": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-6.5.9.tgz", - "integrity": "sha512-NQGaEYtUIKNAQNeqLsfHSkx1BYuOWJzAYDpb63QEZFvV8gTRf2t3SBuyvSxvMFAGakNrqYefIXkfJXpmHOrk7A==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/core/-/core-6.5.10.tgz", + "integrity": "sha512-Gdzp5ENypyglvsh5Gv3teUZnZnmizo4xOsL+QqmWALdFlJXJwLJMVhKVThV/q/095XR6i4Ou54oshn+m4EkuFw==", "dev": true, "peer": true, "requires": { @@ -5148,17 +5325,17 @@ } }, "@pixi/display": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-6.5.9.tgz", - "integrity": "sha512-85eODYWsOM/kIt2N/L51lsAl3DLJA+1Eed+Nl6ZeF/pEvQnXf7jDZzGwVmUKJurpPWhjkA5OnzWabFw3De2qZg==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/display/-/display-6.5.10.tgz", + "integrity": "sha512-NxFdDDxlbH5fQkzGHraLGoTMucW9pVgXqQm13TSmkA3NWIi/SItHL4qT2SI8nmclT9Vid1VDEBCJFAbdeuQw1Q==", "dev": true, "peer": true, "requires": {} }, "@pixi/extensions": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-6.5.9.tgz", - "integrity": "sha512-vwzEhLkGiiCw9e7QmXBKHuJzX1DzaA2JcFw0Kl1DTI0lH1cIZccE3rVBbuVY8+Zvb33WV5XxwQC03/qyx4DUbw==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/extensions/-/extensions-6.5.10.tgz", + "integrity": "sha512-EIUGza+E+sCy3dupuIjvRK/WyVyfSzHb5XsxRaxNrPwvG1iIUIqNqZ3owLYCo4h17fJWrj/yXVufNNtUKQccWQ==", "dev": true, "peer": true }, @@ -5685,9 +5862,9 @@ } }, "@pixi/graphics": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-6.5.9.tgz", - "integrity": "sha512-+b7Ke6MkngftcRq2WweqsEWtV4ttRRurCiiPYeOhM5kGuAwDoyWGhXnWltiBQUHAE026uEep8wFi3vmlAzlXTQ==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-6.5.10.tgz", + "integrity": "sha512-KPHGJ910fi8bRQQ+VcTIgrK+bKIm8yAQaZKPqMtm14HzHPGcES6HkgeNY1sd7m8J4aS9btm5wOSyFu0p5IzTpA==", "dev": true, "peer": true, "requires": {} @@ -5865,9 +6042,9 @@ } }, "@pixi/math": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-6.5.9.tgz", - "integrity": "sha512-L6EARDZiMXXqyqrgvc4lTVpMppRhkeJcCCg+6XAilp73ZAehmcCKt1fuCENbscpJgdX8EDBDWlGVrDOq6Yfa3Q==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/math/-/math-6.5.10.tgz", + "integrity": "sha512-fxeu7ykVbMGxGV2S3qRTupHToeo1hdWBm8ihyURn3BMqJZe2SkZEECPd5RyvIuuNUtjRnmhkZRnF3Jsz2S+L0g==", "dev": true, "peer": true }, @@ -6474,24 +6651,24 @@ } }, "@pixi/runner": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-6.5.9.tgz", - "integrity": "sha512-xIfmhflbhrDw9ZEDezL46K+/L3pz79KU0qvtmg82eXgJdpsp9irDY2+QcEYgOO1AnYmqO9E1ygZd/RofCxRM1g==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-6.5.10.tgz", + "integrity": "sha512-4HiHp6diCmigJT/DSbnqQP62OfWKmZB7zPWMdV1AEdr4YT1QxzXAW1wHg7dkoEfyTHqZKl0tm/zcqKq/iH7tMA==", "dev": true, "peer": true }, "@pixi/settings": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-6.5.9.tgz", - "integrity": "sha512-cOODlDuToO3uixgDRHlsxGbzlgZKNyZn+AeZKHyo6z8JpLh5mYrC4wEgLyHoKSOX0VgNzlSY6VNLthmgpu2gAg==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-6.5.10.tgz", + "integrity": "sha512-ypAS5L7pQ2Qb88yQK72bXtc7sD8OrtLWNXdZ/gnw5kwSWCFaOSoqhKqJCXrR5DQtN98+RQefwbEAmMvqobhFyw==", "dev": true, "peer": true, "requires": {} }, "@pixi/sprite": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-6.5.9.tgz", - "integrity": "sha512-pgYHrIES9vZ1HfcFVpvDpdI8sMwzNRhInDkfRCfJX0K3NaAW8AWzu1DPPsn+eYzIF14gpi9JZXS3lT8JtD8lug==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-6.5.10.tgz", + "integrity": "sha512-UiK+8LgM9XQ/SBDKjRgZ8WggdOSlFRXqiWjEZVmNkiyU8HvXeFzWPRhpc8RR1zDwAUhZWKtMhF8X/ba9m+z2lg==", "dev": true, "peer": true, "requires": {} @@ -6974,17 +7151,17 @@ } }, "@pixi/ticker": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-6.5.9.tgz", - "integrity": "sha512-y7bpdSXc+UkfH2HPvOCV7XBk1eFsmoexsvVGqlRNd9r0sb/OXqcYLvnW4+BEyt5xKp7TpQibNBEKJCNih4dcMQ==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-6.5.10.tgz", + "integrity": "sha512-UqX1XYtzqFSirmTOy8QAK4Ccg4KkIZztrBdRPKwFSOEiKAJoGDCSBmyQBo/9aYQKGObbNnrJ7Hxv3/ucg3/1GA==", "dev": true, "peer": true, "requires": {} }, "@pixi/utils": { - "version": "6.5.9", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-6.5.9.tgz", - "integrity": "sha512-eLYZihYs9gEyPscoNvxgpZtKTXeCskoZ7TFmI23gAoegOIA3SWUsCudi/DJuQwGJSulitQ0M2BDJoVoSEoonEA==", + "version": "6.5.10", + "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-6.5.10.tgz", + "integrity": "sha512-4f4qDMmAz9IoSAe08G2LAxUcEtG9jSdudfsMQT2MG+OpfToirboE6cNoO0KnLCvLzDVE/mfisiQ9uJbVA9Ssdw==", "dev": true, "peer": true, "requires": { @@ -7008,9 +7185,9 @@ "peer": true }, "@types/jquery": { - "version": "3.5.16", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.16.tgz", - "integrity": "sha512-bsI7y4ZgeMkmpG9OM710RRzDFp+w4P1RGiIt30C1mSBT+ExCleeh4HObwgArnDFELmRrOpXgSYN9VF1hj+f1lw==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.18.tgz", + "integrity": "sha512-sNm7O6LECFhHmF+3KYo6QIl2fIbjlPYa0PDgDQwfOaEJzwpK20Eub9Ke7VKkGsSJ2K0HUR50S266qYzRX4GlSw==", "dev": true, "requires": { "@types/sizzle": "*" @@ -7023,15 +7200,15 @@ "dev": true }, "@types/node": { - "version": "18.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.2.tgz", - "integrity": "sha512-1uEQxww3DaghA0RxqHx0O0ppVlo43pJhepY51OxuQIKHpjbnYLA7vcdwioNPzIqmC2u3I/dmylcqjlh0e7AyUA==", + "version": "20.5.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz", + "integrity": "sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ==", "dev": true }, "@types/offscreencanvas": { - "version": "2019.7.0", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.0.tgz", - "integrity": "sha512-PGcyveRIpL1XIqK8eBsmRBt76eFgtzuPiSTyKHZxnGemp2yzGzWpjYKAfK3wIMiU7eH+851yEpiuP8JZerTmWg==", + "version": "2019.7.1", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.1.tgz", + "integrity": "sha512-+HSrJgjBW77ALieQdMJvXhRZUIRN1597L+BKvsyeiIlHHERnqjcuOLyodK3auJ3Y3zRezNKtKAhuQWYJfEgFHQ==", "dev": true, "peer": true }, @@ -7051,9 +7228,9 @@ "dev": true }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true }, "acorn-jsx": { @@ -7096,19 +7273,42 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "is-array-buffer": "^3.0.1" + } + }, + "array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" } }, + "array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, "array.prototype.flat": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", @@ -7133,6 +7333,20 @@ "es-shim-unscopables": "^1.0.0" } }, + "arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -7171,9 +7385,9 @@ }, "dependencies": { "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -7297,24 +7511,25 @@ } }, "engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", + "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==", "dev": true }, "es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "requires": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -7322,8 +7537,8 @@ "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", @@ -7331,16 +7546,21 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.10" } }, "es-set-tostringtag": { @@ -7387,26 +7607,27 @@ "dev": true }, "eslint": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.35.0.tgz", - "integrity": "sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==", + "version": "8.48.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz", + "integrity": "sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==", "dev": true, "requires": { - "@eslint/eslintrc": "^2.0.0", - "@eslint/js": "8.35.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.48.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -7414,42 +7635,38 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" } }, "eslint-config-standard": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", - "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "requires": {} }, "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "requires": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" }, "dependencies": { "debug": { @@ -7464,9 +7681,9 @@ } }, "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "requires": { "debug": "^3.2.7" @@ -7483,54 +7700,39 @@ } } }, - "eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "eslint-plugin-es-x": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.2.0.tgz", + "integrity": "sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==", "dev": true, "requires": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0" } }, "eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, "requires": { "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", "array.prototype.flat": "^1.3.1", "array.prototype.flatmap": "^1.3.1", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", + "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "dependencies": { "debug": { @@ -7554,25 +7756,25 @@ } }, "eslint-plugin-n": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", - "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz", + "integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.4.0", "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", + "eslint-plugin-es-x": "^7.1.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.1", "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" + "resolve": "^1.22.2", + "semver": "^7.5.3" }, "dependencies": { "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -7588,53 +7790,36 @@ "requires": {} }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true }, "espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "requires": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" } }, "esquery": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz", - "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -7714,12 +7899,13 @@ } }, "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "requires": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, @@ -7751,15 +7937,15 @@ "dev": true }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, "functions-have-names": { @@ -7769,13 +7955,14 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" } }, @@ -7813,9 +8000,9 @@ } }, "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", "dev": true, "requires": { "type-fest": "^0.20.2" @@ -7839,10 +8026,10 @@ "get-intrinsic": "^1.1.3" } }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "handlebars": { @@ -7965,13 +8152,13 @@ } }, "is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "requires": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" } }, @@ -8001,9 +8188,9 @@ "dev": true }, "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "requires": { "has": "^1.0.3" @@ -8092,16 +8279,12 @@ } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" } }, "is-weakref": { @@ -8113,6 +8296,12 @@ "call-bind": "^1.0.2" } }, + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -8125,12 +8314,6 @@ "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==", "dev": true }, - "js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true - }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -8140,6 +8323,12 @@ "argparse": "^2.0.1" } }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -8161,6 +8350,15 @@ "minimist": "^1.2.0" } }, + "keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -8264,15 +8462,38 @@ "object-keys": "^1.1.1" } }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "once": { @@ -8285,17 +8506,17 @@ } }, "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" } }, "p-limit": { @@ -8527,16 +8748,19 @@ "dev": true }, "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "dev": true + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } }, "queue-microtask": { "version": "1.2.3", @@ -8545,29 +8769,23 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" } }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -8612,6 +8830,18 @@ "queue-microtask": "^1.2.2" } }, + "safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, "safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -8624,9 +8854,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "shebang-command": { @@ -8685,6 +8915,17 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "string.prototype.trimend": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", @@ -8782,6 +9023,42 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -8794,9 +9071,9 @@ } }, "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true }, "uglify-js": { @@ -8825,24 +9102,24 @@ "dev": true, "requires": { "punycode": "^2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - } } }, "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.1.tgz", + "integrity": "sha512-rWS3H04/+mzzJkv0eZ7vEDGiQbgquI1fGfOad6zKvgYQi1SzMmhl7c/DdRGxhaWrVH6z0qWITo8rpnxK/RfEhA==", "dev": true, "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.0" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + } } }, "which": { @@ -8868,25 +9145,18 @@ } }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" } }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index ceaffc1..3fbd7fe 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,11 @@ { "devDependencies": { "@league-of-foundry-developers/foundry-vtt-types": "^9.280.0", - "typescript": "^4.9.5", - "eslint": "^8.35.0", - "eslint-config-standard": "^17.0.0", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-n": "^15.6.1", - "eslint-plugin-promise": "^6.1.1" + "eslint": "^8.48.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", + "typescript": "^5.2.2" } } diff --git a/scripts/api.js b/scripts/api.js index 1144575..70a8a10 100644 --- a/scripts/api.js +++ b/scripts/api.js @@ -1,4 +1,5 @@ import { helpers } from './helpers.js' +import { powerEffects } from './powerEffects.js' export class api { static registerFunctions () { @@ -9,6 +10,7 @@ export class api { static globals () { globalThis.swadeMBHelpers = { DEBUG: true, + powerEffects, createEffectDocument: helpers.createEffectDocument, createMutationWithEffect: helpers.createMutationWithEffect, defaultMutationOptions: helpers.defaultMutationOptions, diff --git a/scripts/helpers.js b/scripts/helpers.js index a194193..553e929 100644 --- a/scripts/helpers.js +++ b/scripts/helpers.js @@ -1,28 +1,29 @@ +import { CONST, shim } from './shim.js' + export class helpers { static runOnTargetOrSelectedTokens (runFunc) { let tokens = [] - const targets = Array.from(game.user.targets) + const targets = Array.from(shim.targets) if (targets.length > 0) { tokens = targets - } else if (canvas.tokens.controlled.length > 0) { - tokens = canvas.tokens.controlled + } else if (shim.controlled.length > 0) { + tokens = shim.controlled } if (tokens.length > 0) { runFunc(tokens) } else { - ui.notifications.error('Please select or target a token') + shim.notifications.error('Please select or target a token') } } static createEffectDocument (icon, name, durationRounds, changes) { const effectData = { icon, - id: name, - label: name, + name, duration: { rounds: durationRounds }, flags: { swade: { - expiration: CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.EndOfTurnPrompt, + expiration: CONST.SWADE.STATUS_EFFECT_EXPIRATION.EndOfTurnPrompt, loseTurnOnHold: true } }, @@ -42,7 +43,6 @@ export class helpers { static defaultMutationOptions (name) { const mutateOptions = { - comparisonKeys: { ActiveEffect: 'label' }, name, permanent: true, description: name @@ -56,7 +56,7 @@ export class helpers { names.shift() } let name = names.shift() - let folder = game.folders.find(f => f.name === name && !f.folder) + let folder = shim.folders.find(f => f.name === name && !f.folder) while (names.length > 0) { name = names.shift() folder = folder.children.find(c => c.folder.name === name) @@ -75,8 +75,8 @@ export class helpers { const folder = folderStack.shift() for (const actor of folder.contents) { if ( - game.user.isGM || actor.testUserPermission( - game.user, foundry.CONST.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER) + shim.user.isGM || actor.testUserPermission( + shim.user, CONST.FOUNDRY.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER) ) { actors[`${prefix}${actor.name}`] = actor } diff --git a/scripts/module.js b/scripts/module.js index adfcc12..11e58ed 100644 --- a/scripts/module.js +++ b/scripts/module.js @@ -1,4 +1,5 @@ import { api } from './api.js' +import { log, shim, CONST } from './shim.js' function _checkModule (name) { if (!game.modules.get(name)?.active && game.user.isGM) { @@ -13,4 +14,7 @@ Hooks.on('setup', api.registerFunctions) Hooks.on('ready', () => { _checkModule('warpgate') + CONST.FOUNDRY = foundry.CONST + CONST.SWADE = CONFIG.SWADE.CONST + log('Initialized SWADE MB Helpers') }) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js new file mode 100644 index 0000000..aa9a9ae --- /dev/null +++ b/scripts/powerEffects.js @@ -0,0 +1,181 @@ +import { CONST, shim } from './shim.js' + +function baseMenu (title, targets) { + const targetList = targets.map(t => t.name).join(', ') + return { + menuOptions: { + title, + defaultButton: 'Cancel', + options: {} + }, + menuData: { + inputs: [ + { type: 'header', label: title }, + { type: 'info', label: `Apply ${title} to ${targetList}` }, + { type: 'header', label: 'Global Modifiers' }, + { type: 'checkbox', label: 'Glow (+1)' }, + { type: 'checkbox', label: 'Shroud (+1)' }, + { type: 'checkbox', label: 'Hinder (+1)' }, + { type: 'checkbox', label: 'Hurry (+1)' }, + { type: 'header', label: 'Power Modifiers' } + ], + buttons: [ + { label: 'Apply', value: 'apply' }, + { label: 'Apply with Raise', value: 'raise' }, + { label: 'Cancel', value: 'cancel' } + ] + } + } +} + +class ModifierEffects { + static glow (basename, durationRounds) { + const effectDoc = shim.createEffectDocument( + 'icons/magic/light/orb-shadow-blue.webp', + 'Glow', + durationRounds + ) + effectDoc.changes = [ + { + key: '@Skill{Stealth}[system.die.modifier]', + mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, + value: -2, + priority: 0 + } + ] + return effectDoc + } + + static shroud (basename, durationRounds) { + const effectDoc = shim.createEffectDocument( + 'icons/magic/perception/shadow-stealth-eyes-purple.webp', + 'Shroud', + durationRounds + ) + effectDoc.changes = [ + { + key: '@Skill{Stealth}[system.die.modifier]', + mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, + value: 1, + priority: 0 + } + ] + return effectDoc + } + + static hinder (basename, durationRounds) { + const effectDoc = shim.createEffectDocument( + 'icons/magic/control/debuff-chains-shackle-movement-red.webp', + 'Hinder', + durationRounds + ) + effectDoc.changes = [ + { + key: 'system.stats.speed.value', + mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, + value: -2, + priority: 0 + } + ] + return effectDoc + } + + static hurry (basename, durationRounds) { + const effectDoc = shim.createEffectDocument( + 'icons/skills/movement/feet-winged-sandals-tan.webp', + 'Hurry', + durationRounds + ) + effectDoc.changes = [ + { + key: 'system.stats.speed.value', + mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, + value: 2, + priority: 0 + } + ] + return effectDoc + } +} + +function globalModifierEffects (inputs, basename, durationRounds) { + const effectDocs = [] + const inputIndex = 8 + if (inputs[3]) { // glow + effectDocs.push(ModifierEffects.glow(basename, durationRounds)) + } + if (inputs[4]) { // shroud + effectDocs.push(ModifierEffects.shroud(basename, durationRounds)) + } + if (inputs[5]) { // hinder + effectDocs.push(ModifierEffects.hinder(basename, durationRounds)) + } + if (inputs[6]) { // hurry + effectDocs.push(ModifierEffects.hurry(basename, durationRounds)) + } + return { effectDocs, inputIndex } +} + +class PowerMenus { + static blind (token, targets) { + const { menuOptions, menuData } = baseMenu('Blind', targets) + menuData.inputs.push({ + type: 'checkbox', + label: 'Strong (+1 point)', + options: false + }) + return { menuOptions, menuData } + } +} + +class PowerHandlers { + static async blind (token, targets, buttons, inputs) { + const raise = (buttons === 'raise') + const { effectDocs, inputIndex } = globalModifierEffects(inputs, 'Blind', 1) + const strong = !!inputs[inputIndex] + const icon = 'icons/skills/wounds/injury-eyes-blood-red.webp' + const changes = [ + { + key: 'system.stats.globalMods.trait', + mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, + value: -2, + priority: 0 + } + ] + effectDocs.push( + shim.createEffectDocument( + icon, `minor Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1) + ) + effectDocs[effectDocs.length - 1].changes = changes + if (raise) { + effectDocs.push( + shim.createEffectDocument( + icon, `major Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1) + ) + effectDocs[effectDocs.length - 1].changes = changes + } + for (const target of targets) { + shim.applyActiveEffects(target, effectDocs) + } + } +} + +export async function powerEffects (options = {}) { + // options available + const token = 'token' in options ? options.token : [] + const targets = 'targets' in options ? Array.from(options.targets) : [] + const item = 'item' in options ? options.item : null + const name = 'name' in options + ? options.name + : ( + item !== null ? item.name : null) + + const lcName = name.toLowerCase() + if (lcName in PowerMenus && lcName in PowerHandlers) { + const { menuOptions, menuData } = PowerMenus[lcName](token, targets) + const { buttons, inputs } = await shim.warpgateMenu(menuData, menuOptions) + if (buttons && buttons !== 'cancel') { + await PowerHandlers[lcName](token, targets, buttons, inputs) + } + } +} diff --git a/scripts/shim.js b/scripts/shim.js new file mode 100644 index 0000000..5268000 --- /dev/null +++ b/scripts/shim.js @@ -0,0 +1,61 @@ +export const CONST = { + SWADE: null, + FOUNDRY: null +} + +export class shim { + static get folders () { + return game.folders + } + + static get controlled () { + return canvas.tokens.controlled + } + + static get targets () { + return game.user.targets + } + + static get notifications () { + return ui.notifications + } + + static get user () { + return game.user + } + + static createEffectDocument (icon, name, durationRounds) { + return { + icon, + name, + duration: { rounds: durationRounds }, + flags: { + swade: { + expiration: CONST.SWADE.STATUS_EFFECT_EXPIRATION.EndOfTurnPrompt + } + } + } + } + + static async applyActiveEffects (token, effectDocuments) { + const mutation = { + embedded: { ActiveEffect: {} } + } + const mutateOptions = { + permanent: true, + description: effectDocuments[effectDocuments.length - 1] + } + for (const effectDocument of effectDocuments) { + mutation.embedded.ActiveEffect[effectDocument.name] = effectDocument + } + await warpgate.mutate(token.document, mutation, {}, mutateOptions) + } + + static warpgateMenu (menuData, menuOptions) { + return warpgate.menu(menuData, menuOptions) + } +} + +export function log (...args) { + console.log('SWADE MB HELPERS |', ...args) +} From ec5e9f770b495558bb1d39e7e42f7e3d96ffa1c7 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Mon, 4 Sep 2023 22:10:51 -0500 Subject: [PATCH 02/20] boost/lower added to new effect macro --- scripts/powerEffects.js | 117 +++++++++++++++++++++++++++++++++++----- scripts/shim.js | 7 ++- 2 files changed, 111 insertions(+), 13 deletions(-) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index aa9a9ae..cfc3070 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -116,20 +116,69 @@ function globalModifierEffects (inputs, basename, durationRounds) { return { effectDocs, inputIndex } } -class PowerMenus { - static blind (token, targets) { +const PowerMenus = { + blind: function (token, targets) { + if (targets.length < 1) { + shim.notifications.error('No target selected for Blind') + return null + } const { menuOptions, menuData } = baseMenu('Blind', targets) menuData.inputs.push({ type: 'checkbox', label: 'Strong (+1 point)', options: false }) - return { menuOptions, menuData } + return { menuOptions, menuData, extra: {} } + }, + + 'boost/lower trait': function (token, targets) { + if (targets.length < 1) { + shim.notifications.error('No target selected for Boost/Lower Trait') + return null + } + const { menuOptions, menuData } = baseMenu('Boost/Lower Trait', targets) + let traitOptions = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'] + const allSkills = [] + const traits = {} + for (const traitName of traitOptions) { + const lower = traitName.toLowerCase() + traits[traitName] = { + name: traitName, + type: 'attribute', + modkey: `system.attributes.${lower}.die.modifier`, + diekey: `system.attributes.${lower}.die.sides` + } + } + for (const token of targets) { + 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]` + } + if (name !== 'Unskilled' && !allSkills.find(v => v === name)) { + allSkills.push(name) + } + } + traitOptions = traitOptions.concat(allSkills.sort()) + } + menuData.inputs.push({ + type: 'select', label: 'Trait', options: traitOptions + }) + menuData.inputs.push({ type: 'info', label: 'Boost or Lower?' }) + menuData.inputs.push({ type: 'radio', label: 'Boost', options: ['isBoost', true] }) + menuData.inputs.push({ type: 'radio', label: 'Lower', options: ['isBoost', false] }) + menuData.inputs.push({ type: 'checkbox', label: 'Greater', options: false }) + menuData.inputs.push({ type: 'checkbox', label: 'Strong (lower only)', options: false }) + return { menuOptions, menuData, extra: { traits } } } } -class PowerHandlers { - static async blind (token, targets, buttons, inputs) { +const PowerHandlers = { + blind: async function (token, targets, buttons, inputs, extra) { const raise = (buttons === 'raise') const { effectDocs, inputIndex } = globalModifierEffects(inputs, 'Blind', 1) const strong = !!inputs[inputIndex] @@ -138,25 +187,67 @@ class PowerHandlers { { key: 'system.stats.globalMods.trait', mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, - value: -2, + value: '-2', priority: 0 } ] effectDocs.push( shim.createEffectDocument( - icon, `minor Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1) + icon, `minor Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1, changes) ) - effectDocs[effectDocs.length - 1].changes = changes if (raise) { effectDocs.push( shim.createEffectDocument( - icon, `major Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1) + icon, `major Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1, changes) ) - effectDocs[effectDocs.length - 1].changes = changes } for (const target of targets) { shim.applyActiveEffects(target, effectDocs) } + }, + + 'boost/lower trait': async function (token, targets, buttons, inputs, extra) { + const raise = (buttons === 'raise') + const direction = inputs[inputs.length - 4] ? 'Boost' : 'Lower' + const durationRounds = (direction === 'Boost' ? 5 : 1) + const { effectDocs, inputIndex } = globalModifierEffects( + inputs, 'Boost/Lower Trait', durationRounds) + const icon = (direction === 'Boost' + ? 'icons/magic/life/cross-embers-glow-yellow-purple.webp' + : 'icons/magic/movement/chevrons-down-yellow.webp') + const trait = extra.traits[inputs[inputIndex]] + const greater = !!inputs[inputIndex + 4] + const strong = !!inputs[inputIndex + 5] + + let namePart = `${direction} ${trait.name}` + const mods = [] + if (direction === 'Lower') { + mods.push(`Spirit${strong ? '-2' : ''} ends`) + } + if (greater) { + mods.push('greater') + } + if (mods.length > 0) { + namePart = `${namePart} (${mods.join(', ')})` + } + const mode = CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD + const modValue = (direction === 'Boost' ? '+2' : '-2') + const minorEffect = shim.createEffectDocument( + icon, `minor ${namePart}`, durationRounds, [ + { key: trait.diekey, mode, value: modValue, priority: 0 } + ]) + if (direction === 'Lower' && greater) { + minorEffect.changes.push({ key: trait.modkey, mode, value: modValue, priority: 0 }) + } + const majorEffect = shim.createEffectDocument( + icon, `major ${namePart}`, durationRounds, [ + { key: trait.diekey, mode, value: modValue, priority: 0 } + ]) + effectDocs.push(minorEffect) + if (raise) { effectDocs.push(majorEffect) } + for (const target of targets) { + shim.applyActiveEffects(target, effectDocs) + } } } @@ -172,10 +263,12 @@ export async function powerEffects (options = {}) { const lcName = name.toLowerCase() if (lcName in PowerMenus && lcName in PowerHandlers) { - const { menuOptions, menuData } = PowerMenus[lcName](token, targets) + const data = PowerMenus[lcName](token, targets) + if (data === null) { return } + const { menuOptions, menuData, extra } = data const { buttons, inputs } = await shim.warpgateMenu(menuData, menuOptions) if (buttons && buttons !== 'cancel') { - await PowerHandlers[lcName](token, targets, buttons, inputs) + await PowerHandlers[lcName](token, targets, buttons, inputs, extra) } } } diff --git a/scripts/shim.js b/scripts/shim.js index 5268000..aca15d1 100644 --- a/scripts/shim.js +++ b/scripts/shim.js @@ -24,13 +24,18 @@ export class shim { return game.user } - static createEffectDocument (icon, name, durationRounds) { + static createEffectDocument (icon, name, durationRounds, changes = null) { + if (changes === null) { + changes = [] + } return { icon, name, duration: { rounds: durationRounds }, + changes, flags: { swade: { + favorite: true, expiration: CONST.SWADE.STATUS_EFFECT_EXPIRATION.EndOfTurnPrompt } } From e4cf396b4350c52dd365ebc3c5debe059a798087 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Mon, 4 Sep 2023 22:49:06 -0500 Subject: [PATCH 03/20] add confusion to supported powers --- scripts/powerEffects.js | 33 +++++++++++++++++++++++++++++++++ scripts/shim.js | 9 +++++++++ 2 files changed, 42 insertions(+) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index cfc3070..10525c4 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -174,6 +174,22 @@ const PowerMenus = { menuData.inputs.push({ type: 'checkbox', label: 'Greater', options: false }) menuData.inputs.push({ type: 'checkbox', label: 'Strong (lower only)', options: false }) return { menuOptions, menuData, extra: { traits } } + }, + + confusion: function (token, targets) { + if (targets.length < 1) { + shim.notifications.error('No target selected for Confusion') + return null + } + const { menuOptions, menuData } = baseMenu('Confusion', targets) + menuData.inputs.push({ type: 'checkbox', label: 'Greater (adds Shaken)', options: false }) + menuData.buttons = [ + { label: 'Distracted', value: 'distracted' }, + { label: 'Vulnerable', value: 'vulnerable' }, + { label: 'Raise (both)', value: 'raise' }, + { label: 'Cancel', value: 'cancel' } + ] + return { menuOptions, menuData, extra: {} } } } @@ -248,6 +264,23 @@ const PowerHandlers = { for (const target of targets) { shim.applyActiveEffects(target, effectDocs) } + }, + + confusion: async function (token, targets, buttons, inputs, extra) { + const { effectDocs, inputIndex } = globalModifierEffects(inputs, 'Confusion', 1) + const greater = !!inputs[inputIndex] + if (buttons === 'distracted' || buttons === 'raise') { + effectDocs.push(shim.getStatus('SWADE.Distr', 'Distracted')) + } + if (buttons === 'vulnerable' || buttons === 'raise') { + effectDocs.push(shim.getStatus('SWADE.Vuln', 'Vulnerable')) + } + if (greater) { + effectDocs.push(shim.getStatus('SWADE.Shaken', 'Shaken')) + } + for (const target of targets) { + shim.applyActiveEffects(target, effectDocs) + } } } diff --git a/scripts/shim.js b/scripts/shim.js index aca15d1..d15d6f5 100644 --- a/scripts/shim.js +++ b/scripts/shim.js @@ -24,6 +24,15 @@ export class shim { return game.user } + static getStatus (label, name) { + const effect = JSON.parse(JSON.stringify( + CONFIG.statusEffects.find(se => se.label === label))) + effect.name = ('name' in effect ? effect.name : effect.label) + effect.flags.swade.favorite = true + effect.flags.core = { statusId: effect.id } + return effect + } + static createEffectDocument (icon, name, durationRounds, changes = null) { if (changes === null) { changes = [] From da25549c09841524460d86faa8975a8602ff600f Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Mon, 4 Sep 2023 23:00:52 -0500 Subject: [PATCH 04/20] add deflection to supported powers --- scripts/powerEffects.js | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index 10525c4..74fb26c 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -190,6 +190,21 @@ const PowerMenus = { { label: 'Cancel', value: 'cancel' } ] return { menuOptions, menuData, extra: {} } + }, + + deflection: function (token, targets) { + if (targets.length < 1) { + shim.notifications.error('No target selected for Deflection') + return null + } + const { menuOptions, menuData } = baseMenu('Deflection', targets) + menuData.buttons = [ + { label: 'Melee', value: 'melee' }, + { label: 'Ranged', value: 'ranged' }, + { label: 'Raise (both)', value: 'raise' }, + { label: 'Cancel', value: 'cancel' } + ] + return { menuOptions, menuData, extra: {} } } } @@ -281,6 +296,16 @@ const PowerHandlers = { for (const target of targets) { shim.applyActiveEffects(target, effectDocs) } + }, + + deflection: async function (token, targets, buttons, inputs, extra) { + const { effectDocs } = globalModifierEffects(inputs, 'Confusion', 1) + const effectName = `Deflection (${buttons === 'raise' ? 'all' : buttons})` + const icon = 'icons/magic/defensive/shield-barrier-deflect-teal.webp' + effectDocs.push(shim.createEffectDocument(icon, effectName, 5)) + for (const target of targets) { + shim.applyActiveEffects(target, effectDocs) + } } } From d7c452879daac3165052b4ce6767b45ece1a38db Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Tue, 5 Sep 2023 22:04:30 -0500 Subject: [PATCH 05/20] add entangle new style --- packs/common-actions.db | 8 -------- packs/effect-macros.db | 15 -------------- packs/helper-macros.db | 1 - packs/module-docs.db | 1 - scripts/powerEffects.js | 44 +++++++++++++++++++++++++++++++++++++++++ scripts/shim.js | 12 +++++++++-- 6 files changed, 54 insertions(+), 27 deletions(-) delete mode 100644 packs/common-actions.db delete mode 100644 packs/effect-macros.db delete mode 100644 packs/helper-macros.db delete mode 100644 packs/module-docs.db diff --git a/packs/common-actions.db b/packs/common-actions.db deleted file mode 100644 index 6051bb8..0000000 --- a/packs/common-actions.db +++ /dev/null @@ -1,8 +0,0 @@ -{"name":"Grapple","type":"action","img":"icons/skills/melee/unarmed-punch-fist.webp","system":{"description":"

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03situationalr00#grappling]{Grappling}

","notes":"","additionalStats":{},"actions":{"skill":"","skillMod":"","dmgMod":"","additional":{"XEC2IWM0":{"name":"Grapple","type":"skill","skillOverride":"Athletics","skillMod":"","rof":null,"shotsUsed":null},"g7oxsNqI":{"name":"Resist Grapple","type":"resist","skillOverride":"Athletics","skillMod":"","rof":null,"shotsUsed":null},"KCvw4z5i":{"name":"Crush","type":"skill","skillOverride":"Strength","skillMod":"","rof":null,"shotsUsed":null},"1wWLiKwK":{"name":"Resist Crush","type":"resist","skillOverride":"Strength","skillMod":"","rof":null,"shotsUsed":null},"t1Db4fxd":{"name":"Crush","type":"damage","skillOverride":"","skillMod":"","rof":null,"shotsUsed":null,"dmgOverride":"@str","dmgMod":""}}},"favorite":false,"source":""},"effects":[],"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3},"flags":{"swim":{"config":{"reloadSFX":"","fireSFX":"","autoFireSFX":"","silencedFireSFX":"","silencedAutoFireSFX":"","emptySFX":"","isPack":false,"isConsumable":false,"isSilenced":false,"loadedAmmo":"","_version":1}},"exportSource":{"world":"swpf-rotr","system":"swade","coreVersion":"10.291","systemVersion":"2.2.5"},"core":{"sourceId":"Item.VDKhDxOtfGnZt4W0"}},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1667883835416,"modifiedTime":1681014020440,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"folder":null,"sort":0,"_id":"2jAOeH9QKQqjugAt"} -{"name":"Grapple (Tentacles)","type":"action","img":"icons/skills/melee/unarmed-punch-fist.webp","system":{"description":"

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03situationalr00#grappling]{Grappling}

","notes":"","additionalStats":{},"actions":{"skill":"","skillMod":"","dmgMod":"","additional":{"XEC2IWM0":{"name":"Grapple","type":"skill","skillOverride":"Athletics","skillMod":"+2","rof":null,"shotsUsed":null},"g7oxsNqI":{"name":"Resist Grapple","type":"resist","skillOverride":"Athletics","skillMod":"","rof":null,"shotsUsed":null},"KCvw4z5i":{"name":"Crush","type":"skill","skillOverride":"Strength","skillMod":"","rof":null,"shotsUsed":null},"1wWLiKwK":{"name":"Resist Crush","type":"resist","skillOverride":"Strength","skillMod":"","rof":null,"shotsUsed":null},"t1Db4fxd":{"name":"Crush","type":"damage","skillOverride":"","skillMod":"","rof":null,"shotsUsed":null,"dmgOverride":"@str","dmgMod":""}}},"favorite":false,"source":""},"effects":[],"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3},"flags":{"swim":{"config":{"reloadSFX":"","fireSFX":"","autoFireSFX":"","silencedFireSFX":"","silencedAutoFireSFX":"","emptySFX":"","isPack":false,"isConsumable":false,"isSilenced":false,"loadedAmmo":"","_version":1}},"core":{"sourceId":"Item.OPK9APtdci9h9ltN"},"exportSource":{"world":"swpf-rotr","system":"swade","coreVersion":"10.291","systemVersion":"2.2.5"}},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1667883835416,"modifiedTime":1681014018893,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"folder":null,"sort":0,"_id":"7hCuCBWngOYb7DMB"} -{"name":"Networking","type":"action","img":"icons/skills/social/diplomacy-handshake.webp","system":{"description":"

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore04theadv.JournalEntryPage.04networking0000]{Networking}

","notes":"","additionalStats":{},"actions":{"skill":"","skillMod":"","dmgMod":"","additional":{"VvEhWhmL":{"name":"Persuasion","type":"skill","skillOverride":"Persuasion","skillMod":"","rof":null,"shotsUsed":null},"vyhH3l9E":{"name":"Intimidation","type":"skill","skillOverride":"Intimidation","skillMod":"","rof":null,"shotsUsed":null}}},"favorite":false,"source":""},"effects":[],"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3},"flags":{"swim":{"config":{"reloadSFX":"","fireSFX":"","autoFireSFX":"","silencedFireSFX":"","silencedAutoFireSFX":"","emptySFX":"","isPack":false,"isConsumable":false,"isSilenced":false,"loadedAmmo":"","_version":1}},"exportSource":{"world":"swpf-rotr","system":"swade","coreVersion":"10.291","systemVersion":"2.2.5"},"core":{"sourceId":"Item.XoWhd1ycgoU4ncig"}},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1667885227318,"modifiedTime":1681014016960,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"folder":null,"sort":0,"_id":"KOiLsMDf2M6h6a1K"} -{"name":"Evade","type":"action","img":"icons/skills/movement/figure-running-gray.webp","system":{"description":"

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03situationalr00#evasion]{Evasion}

","notes":"","additionalStats":{},"actions":{"skill":"","skillMod":"","dmgMod":"","additional":{"L0XtU5KM":{"name":"Evade (Agility)","type":"resist","skillOverride":"Agility","skillMod":"-2","rof":null,"shotsUsed":null}}},"favorite":false,"equipped":"true","source":""},"effects":[],"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3},"flags":{"core":{"sourceId":"Actor.nN6vdXjmbPij159e.Item.nYBD8hiCOTkm8ZPC"},"exportSource":{"world":"swpf-rotr","system":"swade","coreVersion":"10.291","systemVersion":"2.2.5"}},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1674019466231,"modifiedTime":1681014023930,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"folder":null,"sort":0,"_id":"NuVPqEyIe7KaQHvr"} -{"name":"Push","type":"action","img":"icons/skills/melee/shield-block-bash-blue.webp","system":{"description":"

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03situationalr00#push]{Push}

","notes":"","additionalStats":{},"actions":{"skill":"","skillMod":"","dmgMod":"","additional":{"wwxI37Do":{"name":"Push","type":"skill","skillOverride":"Strength","skillMod":"","rof":null,"shotsUsed":null},"o5BwRFE0":{"name":"Oppose Push","type":"resist","skillOverride":"Strength","skillMod":"","rof":null,"shotsUsed":null},"SceRYgjP":{"name":"Resist Prone","type":"resist","skillOverride":"Athletics","skillMod":"","rof":null,"shotsUsed":null}}},"favorite":false,"source":""},"effects":[],"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3},"flags":{"swim":{"config":{"reloadSFX":"","fireSFX":"","autoFireSFX":"","silencedFireSFX":"","silencedAutoFireSFX":"","emptySFX":"","isPack":false,"isConsumable":false,"isSilenced":false,"loadedAmmo":"","_version":1}},"exportSource":{"world":"swpf-rotr","system":"swade","coreVersion":"10.291","systemVersion":"2.2.5"},"core":{"sourceId":"Item.tuKRrhwS9UKIEVwE"}},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1667884673139,"modifiedTime":1681014015412,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"folder":null,"sort":0,"_id":"Z9nICkaRkzyMkdrr"} -{"name":"Work the Room","type":"action","img":"icons/skills/social/diplomacy-unity-alliance.webp","system":{"description":"
  • @UUID[Compendium.swpf-core-rules.swpf-edges.H2kXu5SWIf4hZ99G]{Work the Room}

  • @UUID[Compendium.swpf-core-rules.swpf-edges.2W87DoEcg9sheggg]{Work the Crowd}

","notes":"","additionalStats":{},"actions":{"skill":"","skillMod":"","dmgMod":"","additional":{"VHwhhR0B":{"name":"Persuasion","type":"skill","skillOverride":"Persuasion","skillMod":"","rof":2,"shotsUsed":null},"WF83NRE1":{"name":"Performance","type":"skill","skillOverride":"Performance","skillMod":"","rof":2,"shotsUsed":null}}},"favorite":false,"source":""},"effects":[],"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3},"flags":{"swim":{"config":{"reloadSFX":"","fireSFX":"","autoFireSFX":"","silencedFireSFX":"","silencedAutoFireSFX":"","emptySFX":"","isPack":false,"isConsumable":false,"isSilenced":false,"loadedAmmo":"","_version":1}},"exportSource":{"world":"swpf-rotr","system":"swade","coreVersion":"10.291","systemVersion":"2.2.5"},"core":{"sourceId":"Item.341DHgHgVRvAO2Zm"}},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1667885448561,"modifiedTime":1681014013808,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"folder":null,"sort":0,"_id":"ccLpXqADP6FTIoMy"} -{"name":"Disarm","type":"action","img":"icons/skills/melee/sword-damaged-broken-orange.webp","system":{"description":"

@UUID[Compendium.swpf-core-rules.swpf-rules.swpfcore03rules0.JournalEntryPage.03situationalr00#disarm]{DISARM}

","notes":"","additionalStats":{},"actions":{"skill":"","skillMod":"","dmgMod":"","additional":{"nRh9e5kO":{"name":"Disarm","type":"resist","skillOverride":"Strength","skillMod":"","rof":null,"shotsUsed":null}}},"favorite":false,"source":"Savage Pathfinder - Enhanced"},"effects":[],"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3},"flags":{"core":{"sourceId":"Item.qL8jMZC3S26pu9YU"},"exportSource":{"world":"swpf-rotr","system":"swade","coreVersion":"10.291","systemVersion":"2.2.5"}},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1679667342015,"modifiedTime":1681014011833,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"folder":null,"sort":0,"_id":"da2BUepbnG4S4DAY"} -{"name":"Frenzy","type":"action","img":"icons/skills/melee/strikes-sword-scimitar.webp","system":{"description":"","notes":"","additionalStats":{},"actions":{"skill":"","skillMod":"","dmgMod":"","additional":{"qQtymA5P":{"name":"Frenzy Attack","type":"skill","skillOverride":"Fighting","skillMod":"","rof":2,"shotsUsed":null}}},"favorite":false,"source":""},"effects":[],"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3},"flags":{"exportSource":{"world":"swpf-rotr","system":"swade","coreVersion":"10.291","systemVersion":"2.2.5"},"core":{"sourceId":"Item.YJftrFaCCzVkNXt3"}},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1668048955652,"modifiedTime":1681014022280,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"folder":null,"sort":0,"_id":"nQHHXfEN7Ey2iWIM"} diff --git a/packs/effect-macros.db b/packs/effect-macros.db deleted file mode 100644 index b337d22..0000000 --- a/packs/effect-macros.db +++ /dev/null @@ -1,15 +0,0 @@ -{"name":"Invisibility","type":"script","author":"ueJGUfSYuRRL3Ypr","img":"icons/svg/invisible.svg","scope":"global","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const menuOptions = {\n title: 'Invisibility',\n defaultButton: 'Cancel',\n options: {}\n }\n\n const menuData = {\n inputs: [\n { type: 'header', label: 'Invisibility' },\n { type: 'info', label: `Apply Invisibility to ${tokenList}` },\n { type: 'checkbox', label: 'Duration', options: false }\n ],\n buttons: [\n { label: 'Apply', value: 'apply' },\n { label: 'Raise', value: 'raise' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const { buttons, inputs } = await warpgate.menu(menuData, menuOptions)\n if (buttons && buttons !== 'cancel') {\n const options = {\n raise: (buttons === 'raise'),\n duration: (!!inputs[2])\n }\n await createEffect(tokens, options)\n }\n}\n\nasync function createEffect (tokens, options) {\n const effectName = `${options.raise ? 'major' : 'minor'} Invisibility`\n const baseEffect = CONFIG.statusEffects.find(se => se.label === 'EFFECT.StatusInvisible')\n const duration = (options.duration ? 5 * 6 * 60 : 5)\n for (const token of tokens) {\n const mutate = swadeMBHelpers.createMutationWithEffect(baseEffect.icon, effectName, duration, [])\n mutate.embedded.ActiveEffect[effectName].flags.core = { statusId: baseEffect.id }\n const mutateOptions = swadeMBHelpers.defaultMutationOptions('Blind')\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1678168163811,"modifiedTime":1678206183465,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"11GOryzx2Q8MXbT6","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Boost/Lower Trait","type":"script","author":"ueJGUfSYuRRL3Ypr","img":"icons/magic/life/cross-embers-glow-yellow-purple.webp","scope":"global","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n let traitOptions = [\n 'Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'\n ]\n const allSkills = []\n const traits = {}\n for (const traitName of traitOptions) {\n const lower = traitName.toLowerCase()\n traits[traitName] = {\n name: traitName,\n type: 'attribute',\n modkey: `system.attributes.${lower}.die.modifier`,\n diekey: `system.attributes.${lower}.die.sides`\n }\n }\n\n const tokenList = tokens.map(t => t.name).join(', ')\n for (const token of tokens) {\n const skills = token.actor.items.filter(item => item.type === 'skill')\n for (const skill of skills) {\n const name = skill.name\n traits[name] = {\n type: 'skill',\n name,\n modkey: `@Skill{${name}}[system.die.modifier]`,\n diekey: `@Skill{${name}}[system.die.sides]`\n }\n if (name !== 'Unskilled' && !allSkills.find(v => v === name)) {\n allSkills.push(name)\n }\n }\n }\n traitOptions = traitOptions.concat(allSkills.sort())\n\n const menuOptions = {\n title: 'Boost/Lower Trait',\n defaultButton: 'Cancel',\n options: {}\n }\n const menuData = {\n inputs: [\n { type: 'header', label: 'Boost/Lower Trait' },\n { type: 'info', label: `Affected Tokens ${tokenList}` },\n { type: 'select', label: 'Trait', options: traitOptions },\n { type: 'info', label: 'Boost or Lower?' },\n { type: 'radio', label: 'Boost', options: ['isBoost', true] },\n { type: 'radio', label: 'Lower', options: ['isBoost', false] },\n { type: 'checkbox', label: 'Greater', options: false },\n { type: 'checkbox', label: 'Strong (lower only)', options: false }\n ],\n buttons: [\n { label: 'Apply', value: 'apply' },\n { label: 'Apply with raise', value: 'raise' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n const { buttons, inputs } = await warpgate.menu(menuData, menuOptions)\n if (buttons && buttons !== 'cancel') {\n const options = {\n action: buttons,\n name: inputs[2],\n trait: traits[inputs[2]],\n direction: inputs[4] || inputs[5],\n greater: inputs[6],\n strong: inputs[7]\n }\n createEffect(tokens, options)\n }\n}\n\nconst UPICON = 'icons/magic/life/cross-embers-glow-yellow-purple.webp'\nconst DOWNICON = 'icons/magic/movement/chevrons-down-yellow.webp'\n\nasync function createEffect (tokens, options) {\n const raise = (options.action === 'raise')\n const icon = (options.direction === 'Boost' ? UPICON : DOWNICON)\n let namePart = `${options.direction} ${options.trait.name}`\n const mode = CONST.ACTIVE_EFFECT_MODES.ADD\n const mods = []\n if (options.strong && options.direction === 'Lower') {\n mods.push('strong')\n }\n if (options.greater) {\n mods.push('greater')\n }\n if (mods.length > 0) {\n namePart = `${namePart} (${mods.join(', ')})`\n }\n const minorEffect = swadeMBHelpers.createEffectDocument(\n icon, `minor ${namePart}`, 5, [\n {\n key: options.trait.diekey,\n mode,\n value: (options.direction === 'Boost' ? '+2' : '-2'),\n priority: 0\n }\n ]\n )\n const majorEffect = swadeMBHelpers.createEffectDocument(\n icon, `major ${namePart}`, 5, [\n {\n key: options.trait.diekey,\n mode,\n value: (options.direction === 'Boost' ? '+2' : '-2'),\n priority: 0\n }\n ]\n )\n if (options.direction === 'Lower' && options.greater === 'Greater') {\n minorEffect.changes.push({\n key: options.trait.modkey,\n mode,\n value: '-2',\n priority: 0\n })\n }\n const mutate = {\n embedded: {\n ActiveEffect: {\n }\n }\n }\n mutate.embedded.ActiveEffect[minorEffect.id] = minorEffect\n if (raise) {\n mutate.embedded.ActiveEffect[majorEffect.id] = majorEffect\n }\n const mutateOptions = swadeMBHelpers.defaultMutationOptions(namePart)\n for (const token of tokens) {\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1677458254287,"modifiedTime":1678206183465,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"1AqIFHAcX5TRdE8X","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Entangle","type":"script","scope":"global","author":"ueJGUfSYuRRL3Ypr","img":"icons/magic/nature/root-vine-barrier-wall-brown.webp","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const menuOptions = {\n title: 'Entangle',\n defaultButton: 'Cancel',\n options: {}\n }\n\n const menuData = {\n inputs: [\n { type: 'header', label: 'Entangle' },\n { type: 'info', label: `Apply Entangle to ${tokenList}` },\n { type: 'radio', label: 'Not Damaging', options: ['dmg', true] },\n { type: 'radio', label: 'Damaging', options: ['dmg', false] },\n { type: 'radio', label: 'Deadly', options: ['dmg', false] },\n { type: 'checkbox', label: 'Tough', options: false }\n ],\n buttons: [\n { label: 'Entangled', value: 'apply' },\n { label: 'Bound (raise)', value: 'raise' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const { buttons, inputs } = await warpgate.menu(menuData, menuOptions)\n if (buttons && buttons !== 'cancel') {\n const options = {\n apply: (buttons === 'raise' ? 'bound' : 'entangled'),\n damage: (inputs[3] ? '2d4' : (inputs[4] ? '2d6' : null)),\n tough: (!!inputs[5])\n }\n await createEffect(tokens, options)\n }\n}\n\nfunction getStatus (label, name) {\n const effect = JSON.parse(JSON.stringify(\n CONFIG.statusEffects.find(se => se.label === label)))\n effect.label = name\n if (!effect.flags) {\n effect.flags = {}\n }\n effect.flags.core = { statusId: effect.id }\n effect.id = name\n return effect\n}\n\nasync function createEffect (tokens, options) {\n const effectSearch = (options.apply === 'bound' ? 'SWADE.Bound' : 'SWADE.Entangled')\n const effectName = (options.apply === 'bound' ? 'Bound' : 'Entangled')\n const effect = getStatus(effectSearch, effectName)\n const extraIcon = 'icons/magic/nature/root-vine-barrier-wall-brown.webp'\n const extraEffect = swadeMBHelpers.createEffectDocument(extraIcon, 'Entangle Modifier', 1, [])\n\n if (options.damage) {\n extraEffect.id = `${extraEffect.id} - ${options.damage} dmg`\n extraEffect.label = `${extraEffect.label} - ${options.damage} dmg`\n }\n if (options.tough) {\n extraEffect.id = `Tough ${extraEffect.id}`\n extraEffect.label = `Tough ${extraEffect.label}`\n }\n for (const token of tokens) {\n const mutateOptions = swadeMBHelpers.defaultMutationOptions('Entangle')\n const mutate = { embedded: { ActiveEffect: {} } }\n mutate.embedded.ActiveEffect[effect.id] = effect\n if (options.damage || options.tough) {\n mutate.embedded.ActiveEffect[extraEffect.id] = extraEffect\n }\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1678164427219,"modifiedTime":1678206183466,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"2TOeRNCJT3T2px8D","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Smite","type":"script","scope":"global","author":"ueJGUfSYuRRL3Ypr","img":"systems/swade/assets/icons/status/status_smite.svg","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const menuOptions = {\n title: 'Smite',\n defaultButton: 'Cancel',\n options: {}\n }\n\n const menuData = {\n inputs: [\n { type: 'header', label: 'Smite' },\n { type: 'info', label: `Apply Smite to ${tokenList}` },\n { type: 'checkbox', label: 'Greater', options: false }\n ],\n buttons: [\n { label: 'Apply', value: 'apply' },\n { label: 'Apply with Raise', value: 'raise' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const tokenWeapons = {}\n let index = 2\n for (const token of tokens) {\n index += 2\n tokenWeapons[token.id] = index\n menuData.inputs.push({ type: 'info', label: `

${token.name}

` })\n const weapons = token.actor.items.filter(i => i.type === 'weapon').map(\n i => { return { value: i.name, html: i.name } })\n weapons.unshift({ value: '', html: 'None' })\n menuData.inputs.push({ type: 'select', label: token.name, options: weapons })\n }\n const { buttons, inputs } = await warpgate.menu(menuData, menuOptions)\n for (const tokenId in tokenWeapons) {\n tokenWeapons[tokenId] = inputs[tokenWeapons[tokenId]]\n }\n const greater = (inputs[2] === 'Greater')\n if (buttons && buttons !== 'cancel') {\n await createEffect(tokens, tokenWeapons, buttons, greater)\n }\n}\n\nasync function createEffect (tokens, tokenWeapons, choice, greater) {\n const baseEffect = CONFIG.statusEffects.find(se => se.label === 'SWADE.Smite')\n const effectIcon = baseEffect.icon\n let changeValue = (choice === 'raise' ? '+4' : '+2')\n if (greater) {\n changeValue = (choice === 'raise' ? '+6' : '+4')\n }\n for (const token of tokens) {\n const weaponName = tokenWeapons[token.id]\n const weaponId = token.actor.items.getName(weaponName)?.id\n const changeKey = `@Weapon{${weaponName}}[system.damage]`\n if (!weaponId) {\n continue\n }\n const effectName = `${choice === 'raise' ? 'major' : 'minor'} Smite${greater ? '(greater)' : ''} (${weaponName})`\n const changes = [\n {\n key: changeKey,\n mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,\n value: changeValue,\n priority: 0\n }\n ]\n const mutate = swadeMBHelpers.createMutationWithEffect(\n effectIcon, effectName, 5, changes)\n mutate.embedded.ActiveEffect[effectName].flags.core = { statusId: baseEffect.id }\n const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName)\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{"core":{"sourceId":"Macro.1GnCpp1vjEucgNGk"}},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1677548889704,"modifiedTime":1678206183466,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"C1vGk7AKQDpcvKyP","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Deflection","type":"script","scope":"global","author":"ueJGUfSYuRRL3Ypr","img":"icons/magic/defensive/shield-barrier-deflect-teal.webp","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const dialogOptions = {\n title: 'Deflection',\n content: `Apply Deflection to ${tokenList}`,\n default: 'cancel',\n buttons: [\n { label: 'Apply (melee)', value: 'melee' },\n { label: 'Apply (ranged)', value: 'ranged' },\n { label: 'Apply with raise (both)', value: 'raise' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const choice = await warpgate.buttonDialog(dialogOptions)\n\n if (choice && choice !== 'cancel') {\n await createEffect(tokens, choice)\n }\n}\n\nasync function createEffect (tokens, choice) {\n const icon = 'icons/magic/defensive/shield-barrier-deflect-teal.webp'\n let effectName = 'Deflection'\n if (choice === 'raise') {\n effectName = `${effectName} (all)`\n } else {\n effectName = `${effectName} (${choice})`\n }\n for (const token of tokens) {\n const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 5, [])\n const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName)\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1677645552357,"modifiedTime":1678206183466,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"HYTiftQW0pwwOQGH","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Glow","type":"script","scope":"global","author":"ueJGUfSYuRRL3Ypr","img":"icons/magic/light/explosion-star-blue-large.webp","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const dialogOptions = {\n title: 'Glow',\n content: `Apply Glow to ${tokenList}`,\n default: 'cancel',\n buttons: [\n { label: 'OK', value: 'ok' },\n { label: 'Mutate token lighting', value: 'mutate' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const choice = await warpgate.buttonDialog(dialogOptions)\n\n if (choice === 'ok' || choice === 'mutate') {\n await createEffect(tokens, choice)\n }\n}\n\nasync function createEffect (tokens, choice) {\n const icon = 'icons/magic/light/explosion-star-blue-large.webp'\n const effectName = 'Glow'\n for (const token of tokens) {\n const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 5, [])\n const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName)\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n if (choice === 'mutate') {\n const mutate2 = {\n token: {\n light: {\n alpha: 0.5,\n angle: 360,\n attenuation: 0.5,\n animation: {\n intensity: 5,\n reverse: false,\n speed: 5,\n type: 'starlight'\n },\n bright: 0,\n color: '#0f3fff',\n coloration: 1,\n contrast: 0,\n dim: 0.5,\n luminosity: 0.5,\n saturation: 0,\n shadows: 0\n }\n }\n }\n mutateOptions.permanent = false\n await warpgate.mutate(token.document, mutate2, {}, mutateOptions)\n }\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1677704975699,"modifiedTime":1678206183466,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"JcZ9kxBZJpw8KLQ6","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Confusion","type":"script","author":"ueJGUfSYuRRL3Ypr","img":"icons/magic/control/hypnosis-mesmerism-swirl.webp","scope":"global","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const menuOptions = {\n title: 'Confusion',\n defaultButton: 'Cancel',\n options: {}\n }\n\n const menuData = {\n inputs: [\n { type: 'header', label: 'Confusion' },\n { type: 'info', label: `Apply Confusion to ${tokenList}` },\n { type: 'checkbox', label: 'Greater (adds shaken)', options: false }\n ],\n buttons: [\n { label: 'Distracted', value: 'distracted' },\n { label: 'Vulnerable', value: 'vulnerable' },\n { label: 'Raise (both)', value: 'raise' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const { buttons, inputs } = await warpgate.menu(menuData, menuOptions)\n const greater = (inputs[2] === 'Greater (adds shaken)')\n if (buttons && buttons !== 'cancel') {\n await createEffect(tokens, buttons, greater)\n }\n}\n\nfunction getStatus (label, name) {\n const effect = JSON.parse(JSON.stringify(\n CONFIG.statusEffects.find(se => se.label === label)))\n effect.flags.core = { statusId: effect.id }\n effect.id = name\n return effect\n}\n\nasync function createEffect (tokens, choice, greater) {\n const effects = []\n if (choice === 'distracted' || choice === 'raise') {\n effects.push(getStatus('SWADE.Distr', 'Distracted'))\n }\n if (choice === 'vulnerable' || choice === 'raise') {\n effects.push(getStatus('SWADE.Vuln', 'Vulnerable'))\n }\n if (greater) {\n effects.push(getStatus('SWADE.Shaken', 'Shaken'))\n }\n for (const token of tokens) {\n const mutateOptions = swadeMBHelpers.defaultMutationOptions('Confusion')\n const mutate = {\n embedded: { ActiveEffect: {} }\n }\n for (const effect of effects) {\n mutate.embedded.ActiveEffect[effect.id] = effect\n }\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1678082334572,"modifiedTime":1678206183466,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"L2IstecV7ivcrgUI","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Intangibility","type":"script","author":"ueJGUfSYuRRL3Ypr","img":"icons/magic/control/debuff-energy-hold-levitate-blue-yellow.webp","scope":"global","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const menuOptions = {\n title: 'Intangibility',\n defaultButton: 'Cancel',\n options: {}\n }\n\n const menuData = {\n inputs: [\n { type: 'header', label: 'Intangibility' },\n { type: 'info', label: `Apply Intangibility to ${tokenList}` },\n { type: 'checkbox', label: 'Duration', options: false }\n ],\n buttons: [\n { label: 'Apply', value: 'apply' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const { buttons, inputs } = await warpgate.menu(menuData, menuOptions)\n if (buttons && buttons !== 'cancel') {\n const options = {\n duration: (!!inputs[2])\n }\n await createEffect(tokens, options)\n }\n}\n\nasync function createEffect (tokens, options) {\n const effectName = 'Intangibility'\n const duration = (options.duration ? 5 * 6 * 60 : 5)\n const icon = 'icons/magic/control/debuff-energy-hold-levitate-blue-yellow.webp'\n for (const token of tokens) {\n const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, duration, [])\n const mutateOptions = swadeMBHelpers.defaultMutationOptions('Intangibility')\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1678168528898,"modifiedTime":1678206183466,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"OMDjgWLJyE9BJAwT","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Shroud","type":"script","scope":"global","author":"ueJGUfSYuRRL3Ypr","img":"icons/magic/perception/silhouette-stealth-shadow.webp","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const dialogOptions = {\n title: 'Shroud',\n content: `Apply Shroud to ${tokenList}`,\n default: 'cancel',\n buttons: [\n { label: 'OK', value: 'ok' },\n { label: 'Mutate token lighting', value: 'mutate' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const choice = await warpgate.buttonDialog(dialogOptions)\n\n if (choice === 'ok' || choice === 'mutate') {\n await createEffect(tokens, choice)\n }\n}\n\nasync function createEffect (tokens, choice) {\n const icon = 'icons/magic/perception/silhouette-stealth-shadow.webp'\n const effectName = 'Shroud'\n for (const token of tokens) {\n const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 5, [])\n const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName)\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n if (choice === 'mutate') {\n const mutate2 = {\n token: {\n light: {\n alpha: 0.5,\n angle: 360,\n attenuation: 0.1,\n animation: {\n intensity: 5,\n reverse: false,\n speed: 5,\n type: 'roiling'\n },\n bright: 0,\n color: null,\n coloration: 0,\n contrast: 0,\n dim: 0.1,\n luminosity: -0.15,\n saturation: 0,\n shadows: 0.25\n }\n }\n }\n mutateOptions.permanent = false\n await warpgate.mutate(token.document, mutate2, {}, mutateOptions)\n }\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1677649631598,"modifiedTime":1678206183466,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"QpillIBvZmuHeuTV","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Summon","type":"script","author":"ueJGUfSYuRRL3Ypr","img":"icons/magic/symbols/runes-star-orange.webp","scope":"global","command":"const ACTORFOLDER = 'Summonables'\nconst SUMMONICON = 'icons/magic/symbols/runes-star-orange.webp'\n\nswadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const token = tokens[0]\n const tokenList = token.name\n const folder = swadeMBHelpers.getActorFolderByPath(ACTORFOLDER)\n const actors = swadeMBHelpers.getActorsInFolder(folder)\n const menuOptions = {\n title: 'Summon Creature',\n defaultButton: 'cancel',\n options: {}\n }\n const menuData = {\n inputs: [\n { type: 'header', label: 'Summon Creature' },\n { type: 'info', label: `${tokenList} is summoning` },\n {\n type: 'select',\n label: 'Ally to summon',\n options: Object.keys(actors).sort().map(k => { return { value: actors[k].id, html: k } })\n },\n { type: 'number', label: 'Number to spawn (+half base cost per)', options: 1 }\n ],\n buttons: [\n { label: 'Apply', value: 'apply' },\n { label: 'Apply with raise', value: 'raise' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n const { buttons, inputs } = await warpgate.menu(menuData, menuOptions)\n if (buttons && buttons !== 'cancel') {\n const summonData = {\n raise: (buttons === 'raise'),\n actorId: inputs[2],\n number: inputs[3]\n }\n summonData.actor = game.actors.get(summonData.actorId)\n summonData.actorName = summonData.actor.name\n summonData.icon = summonData.actor.prototypeToken.texture.src\n summonData.token = summonData.actor.prototypeToken\n\n doWork(summonData, token)\n }\n}\n\nasync function doWork (summonData, token) {\n console.log('Summon ', token, summonData)\n const effectName = `Summoned ${summonData.actorName} (${summonData.number})`\n const tokenEffectMutation = swadeMBHelpers.createMutationWithEffect(SUMMONICON, effectName, 5, [])\n const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName)\n await warpgate.mutate(token.document, tokenEffectMutation, {}, mutateOptions)\n\n const spawnOptions = {\n controllingActor: token.actor,\n duplicates: summonData.number,\n comparisonKeys: { ActiveEffect: 'label' },\n crosshairs: {\n icon: summonData.icon,\n label: `Summon ${summonData.actorName}`,\n drawOutline: false,\n rememberControlled: true\n }\n }\n const spawnMutation = {\n token: {\n actorLink: false,\n name: `${token.name}'s ${summonData.token.name}`\n }\n }\n await warpgate.spawn(summonData.actorName, spawnMutation, {}, spawnOptions)\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1677996503821,"modifiedTime":1678206183466,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"RV09eJi9iG5bfupo","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Protection","type":"script","scope":"global","author":"ueJGUfSYuRRL3Ypr","img":"systems/swade/assets/icons/status/status_protection.svg","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const dialogOptions = {\n title: 'Protection',\n content: `Apply Protection to ${tokenList}`,\n default: 'cancel',\n buttons: [\n { label: 'Apply (+2 armor)', value: 'apply' },\n { label: 'Apply with raise (+2 toughness)', value: 'raise' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const choice = await warpgate.buttonDialog(dialogOptions)\n\n if (choice && choice !== 'cancel') {\n await createEffect(tokens, choice)\n }\n}\n\nasync function createEffect (tokens, choice) {\n const baseEffect = CONFIG.statusEffects.find(se => se.label === 'SWADE.Protection')\n const changes = [\n {\n key: 'system.stats.toughness.armor',\n mode: foundry.CONST.ACTIVE_EFFECT_MODES.UPGRADE,\n value: 2,\n priority: 0\n }\n ]\n let effectName = 'minor Protection'\n if (choice === 'raise') {\n changes[0].key = 'system.stats.toughness.value'\n effectName = 'major Protection'\n }\n for (const token of tokens) {\n const mutate = swadeMBHelpers.createMutationWithEffect(\n baseEffect.icon, effectName, 5, changes)\n mutate.embedded.ActiveEffect[effectName].flags.core = { statusId: baseEffect.id }\n const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName)\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1677630174987,"modifiedTime":1678206183467,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"YETsNWOWfIxyLPdC","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Blind","type":"script","author":"ueJGUfSYuRRL3Ypr","img":"icons/svg/blind.svg","scope":"global","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const menuOptions = {\n title: 'Blind',\n defaultButton: 'Cancel',\n options: {}\n }\n\n const menuData = {\n inputs: [\n { type: 'header', label: 'Blind' },\n { type: 'info', label: `Apply Blind to ${tokenList}` },\n { type: 'checkbox', label: 'Strong', options: false }\n ],\n buttons: [\n { label: 'Apply', value: 'apply' },\n { label: 'Raise', value: 'raise' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const { buttons, inputs } = await warpgate.menu(menuData, menuOptions)\n if (buttons && buttons !== 'cancel') {\n const options = {\n raise: (buttons === 'raise'),\n strong: (!!inputs[2])\n }\n await createEffect(tokens, options)\n }\n}\n\nasync function createEffect (tokens, options) {\n const effectDetails = (options.raise ? '-4' : '-2')\n const effectEnd = (options.strong ? 'Vigor -2' : 'Vigor')\n const effectName = `Blind (${effectDetails}) ${effectEnd} ends`\n const baseEffect = CONFIG.statusEffects.find(se => se.label === 'EFFECT.StatusBlind')\n for (const token of tokens) {\n const mutate = swadeMBHelpers.createMutationWithEffect(baseEffect.icon, effectName, 1, [])\n mutate.embedded.ActiveEffect[effectName].flags.core = { statusId: baseEffect.id }\n const mutateOptions = swadeMBHelpers.defaultMutationOptions('Blind')\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1678165762773,"modifiedTime":1678206183468,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"e9HvLMtaDw2qpcE8","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Lingering Damage","type":"script","scope":"global","author":"ueJGUfSYuRRL3Ypr","img":"icons/magic/acid/dissolve-arm-flesh.webp","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const dialogOptions = {\n title: 'Lingering Damage',\n content: `Apply Lingering Damage to ${tokenList}`,\n default: 'cancel',\n buttons: [\n { label: 'Ok', value: 'ok' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const choice = await warpgate.buttonDialog(dialogOptions)\n\n if (choice === 'ok') {\n await createEffect(tokens)\n }\n}\n\nasync function createEffect (tokens) {\n const icon = 'icons/magic/acid/dissolve-arm-flesh.webp'\n const effectName = 'Lingering Damage'\n for (const token of tokens) {\n const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 1, [])\n mutate.embedded.ActiveEffect['Lingering Damage'].flags.swade.expiration =\n CONFIG.SWADE.CONST.STATUS_EFFECT_EXPIRATION.StartOfTurnPrompt\n const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName)\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1677800587229,"modifiedTime":1678206183468,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"txJBrqgVNO3jpvFG","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Hinder","type":"script","author":"ueJGUfSYuRRL3Ypr","img":"icons/magic/movement/abstract-ribbons-red-orange.webp","scope":"global","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const dialogOptions = {\n title: 'Hinder',\n content: `Apply Hinder to ${tokenList}`,\n default: 'cancel',\n buttons: [\n { label: 'OK', value: 'ok' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const choice = await warpgate.buttonDialog(dialogOptions, 'column')\n\n if (choice === 'ok') {\n await createEffect(tokens, choice)\n }\n}\n\nasync function createEffect (tokens, choice) {\n const icon = 'icons/magic/movement/abstract-ribbons-red-orange.webp'\n const effectName = 'Hinder'\n const changes = [\n {\n key: 'system.stats.speed.value',\n mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,\n value: -2,\n priority: 0\n }\n ]\n for (const token of tokens) {\n const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 5, changes)\n const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName)\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1677802063142,"modifiedTime":1678206183468,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"uvHTdYUn5l3Z1rAV","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} -{"name":"Hurry","type":"script","author":"ueJGUfSYuRRL3Ypr","img":"icons/skills/movement/feet-winged-boots-blue.webp","scope":"global","command":"swadeMBHelpers.runOnTargetOrSelectedTokens(main)\n\nasync function main (tokens) {\n const tokenList = tokens.map(t => t.name).join(', ')\n const dialogOptions = {\n title: 'Hurry',\n content: `Apply Hurry to ${tokenList}`,\n default: 'cancel',\n buttons: [\n { label: 'OK', value: 'ok' },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n\n const choice = await warpgate.buttonDialog(dialogOptions, 'column')\n\n if (choice === 'ok') {\n await createEffect(tokens, choice)\n }\n}\n\nasync function createEffect (tokens, choice) {\n const icon = 'icons/skills/movement/feet-winged-boots-blue.webp'\n const effectName = 'Hurry'\n const changes = [\n {\n key: 'system.stats.speed.value',\n mode: foundry.CONST.ACTIVE_EFFECT_MODES.ADD,\n value: 2,\n priority: 0\n }\n ]\n for (const token of tokens) {\n const mutate = swadeMBHelpers.createMutationWithEffect(icon, effectName, 5, changes)\n const mutateOptions = swadeMBHelpers.defaultMutationOptions(effectName)\n await warpgate.mutate(token.document, mutate, {}, mutateOptions)\n }\n}","flags":{},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1677802063142,"modifiedTime":1678206183468,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"yG1ZQO30ZlntYJp7","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} diff --git a/packs/helper-macros.db b/packs/helper-macros.db deleted file mode 100644 index 73d5ad5..0000000 --- a/packs/helper-macros.db +++ /dev/null @@ -1 +0,0 @@ -{"name":"Gold Totals","type":"script","author":"ueJGUfSYuRRL3Ypr","img":"icons/commodities/currency/coins-plain-stack-gold-yellow.webp","scope":"global","command":"let tokens = []\nif (canvas.tokens.controlled.length > 0) {\n tokens = canvas.tokens.controlled\n}\nif (tokens.length > 0) {\n main(tokens)\n} else {\n ui.notifications.error('Please select or target a token')\n}\n\nasync function main (tokens) {\n const currencies = ['Copper', 'Silver', 'Gold', 'Platinum']\n let template = '
'\n const fmtOptions = {\n minimumIntegerDigits: 1,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2\n }\n const fmt = Intl.NumberFormat('en-US', fmtOptions)\n for (const token of tokens) {\n const actor = token.actor\n let total = 0\n for (const item of actor.items.filter(i => currencies.indexOf(i.name) > -1)) {\n total += item.system.price * item.system.quantity\n }\n template += ``\n }\n template += ''\n Dialog.prompt({\n title: 'Currency Totals',\n content: template\n })\n}","ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3},"flags":{"advanced-macros":{"runAsGM":false,"runForSpecificUser":""},"exportSource":{"world":"swade-module-test","system":"swade","coreVersion":"10.291","systemVersion":"2.2.5"},"core":{"sourceId":"Macro.lOAxoK00x5QQFbTH"}},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1680966567327,"modifiedTime":1681013325194,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"folder":null,"sort":0,"_id":"QMnx9cuyw81kRS2o"} diff --git a/packs/module-docs.db b/packs/module-docs.db deleted file mode 100644 index 05c7f2f..0000000 --- a/packs/module-docs.db +++ /dev/null @@ -1 +0,0 @@ -{"name":"Macros","pages":[{"sort":100000,"name":"Effect Macros","type":"text","_id":"i31qmsZnIGhjvA2K","title":{"show":true,"level":1},"image":{},"text":{"format":1,"content":"

The effect macros found in the SWADE MB Effect Macros compendium are all set up to handle applying effects to multiple tokens at once, with one exception, the Summon macro.

Summon Macro

The Summon macro expects to have one and only one target, and depends on the existence of an Actor folder called \"Summonables\" on the Actor sidebar. If this folder has subfolders, they'll be used by the macro to sort the list of available summonables. In the Summonables folder and subfolders, place the Actors that are available for summoning.

","markdown":""},"video":{"controls":true,"volume":0.5},"src":null,"system":{},"ownership":{"default":-1},"flags":{}}],"flags":{"core":{"sourceId":"JournalEntry.Mw1g2Fx5dp4SoqVP"}},"_stats":{"systemId":"swade","systemVersion":"2.2.5","coreVersion":"10.291","createdTime":1678169291843,"modifiedTime":1678169602285,"lastModifiedBy":"ueJGUfSYuRRL3Ypr"},"_id":"Mw1g2Fx5dp4SoqVP","folder":null,"sort":0,"ownership":{"default":0,"ueJGUfSYuRRL3Ypr":3}} diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index 74fb26c..36ce2dd 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -205,6 +205,26 @@ const PowerMenus = { { label: 'Cancel', value: 'cancel' } ] return { menuOptions, menuData, extra: {} } + }, + + entangle: function (token, targets) { + if (targets.length < 1) { + shim.notifications.error('No target selected for Deflection') + return null + } + const { menuOptions, menuData } = baseMenu('Entangle', targets) + menuData.inputs = menuData.inputs.concat([ + { type: 'radio', label: 'Not Damaging', options: ['dmg', true] }, + { type: 'radio', label: 'Damaging', options: ['dmg', false] }, + { type: 'radio', label: 'Deadly', options: ['dmg', false] }, + { type: 'checkbox', label: 'Tough', options: false } + ]) + menuData.buttons = [ + { label: 'Entangled', value: 'apply' }, + { label: 'Bound (raise)', value: 'raise' }, + { label: 'Cancel', value: 'cancel' } + ] + return { menuOptions, menuData, extra: {} } } } @@ -306,6 +326,30 @@ const PowerHandlers = { for (const target of targets) { shim.applyActiveEffects(target, effectDocs) } + }, + + entangle: async function (token, targets, buttons, inputs, extra) { + const { effectDocs, inputIndex } = globalModifierEffects(inputs, 'Entangle', 1) + const damage = (inputs[inputIndex + 1] ? '2d4' : (inputs[inputIndex + 2] ? '2d6' : null)) + const tough = !!inputs[inputIndex + 3] + const effectSearch = (buttons === 'raise' ? 'SWADE.Bound' : 'SWADE.Entangled') + const effectName = (buttons === 'raise' ? 'Bound' : 'Entangled') + const effect = shim.getStatus(effectSearch, effectName) + const extraIcon = 'icons/magic/nature/root-vine-barrier-wall-brown.webp' + const extraEffect = shim.createEffectDocument(extraIcon, 'Entangle Modifier', 1, []) + if (damage) { + extraEffect.name = `${extraEffect.name} - ${damage} dmg` + } + if (tough) { + extraEffect.name = `Tough ${extraEffect.name}` + } + effectDocs.push(effect) + if (damage || tough) { + effectDocs.push(extraEffect) + } + for (const target of targets) { + shim.applyActiveEffects(target, effectDocs) + } } } diff --git a/scripts/shim.js b/scripts/shim.js index d15d6f5..6fba75f 100644 --- a/scripts/shim.js +++ b/scripts/shim.js @@ -24,11 +24,19 @@ export class shim { return game.user } - static getStatus (label, name) { + static getStatus (label, name, favorite = true) { const effect = JSON.parse(JSON.stringify( CONFIG.statusEffects.find(se => se.label === label))) effect.name = ('name' in effect ? effect.name : effect.label) - effect.flags.swade.favorite = true + if (!('flags' in effect)) { + effect.flags = {} + } + if (favorite) { + if (!('swade' in effect.flags)) { + effect.flags.swade = {} + } + effect.flags.swade.favorite = true + } effect.flags.core = { statusId: effect.id } return effect } From cb84e208cc83fd3f1bfbeb464e9766aabaa985c2 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Tue, 5 Sep 2023 22:05:24 -0500 Subject: [PATCH 06/20] add .gitattributes --- .gitattributes | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..eec4eb9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +packs/** binary +*.webp filter=lfs diff=lfs merge=lfs -text +*.jpeg filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text From acc38b401d4d3643abab4783652c5b21206c47c5 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Thu, 7 Sep 2023 00:15:56 -0500 Subject: [PATCH 07/20] move again to class based power effects --- scripts/powerEffects.js | 428 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 410 insertions(+), 18 deletions(-) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index 36ce2dd..c29242a 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -209,7 +209,7 @@ const PowerMenus = { entangle: function (token, targets) { if (targets.length < 1) { - shim.notifications.error('No target selected for Deflection') + shim.notifications.error('No target selected for Entangle') return null } const { menuOptions, menuData } = baseMenu('Entangle', targets) @@ -225,6 +225,17 @@ const PowerMenus = { { label: 'Cancel', value: 'cancel' } ] return { menuOptions, menuData, extra: {} } + }, + + intangibility: function (token, targets) { + if (targets.length < 1) { + shim.notifications.error('No target selected for Intangibility') + return null + } + const { menuOptions, menuData } = baseMenu('Intangibility', targets) + menuData.inputs.push({ type: 'checkbox', label: 'Duration', options: false }) + menuData.buttons.splice(1, 1) // delete the raise button + return { menuOptions, menuData, extra: {} } } } @@ -353,24 +364,405 @@ const PowerHandlers = { } } -export async function powerEffects (options = {}) { - // options available - const token = 'token' in options ? options.token : [] - const targets = 'targets' in options ? Array.from(options.targets) : [] - const item = 'item' in options ? options.item : null - const name = 'name' in options - ? options.name - : ( - item !== null ? item.name : null) +class PowerEffect { + constructor (token, targets) { + this.token = token + this.targets = targets + this.effectDocs = [] + this.menuData = { + inputs: [ + { type: 'header', label: `${this.name} Effect` }, + { type: 'info', label: `Apply ${this.name} Effect` }, + { type: 'header', label: 'Global Modifiers' }, + { type: 'checkbox', label: 'Glow (+1)' }, + { type: 'checkbox', label: 'Shroud (+1)' }, + { type: 'checkbox', label: 'Hinder (+1)' }, + { type: 'checkbox', label: 'Hurry (+1)' }, + { type: 'header', label: '---------------' } + ], + buttons: [ + { label: 'Apply', value: 'apply' }, + { label: 'Apply with Raise', value: 'raise' }, + { label: 'Cancel', value: 'cancel' } + ] + } + this.menuOptions = { + title: `${this.name} Effect`, + defaultButton: 'Cancel', + options: {} + } + this.inputs = [] + this.buttons = null + } - const lcName = name.toLowerCase() - if (lcName in PowerMenus && lcName in PowerHandlers) { - const data = PowerMenus[lcName](token, targets) - if (data === null) { return } - const { menuOptions, menuData, extra } = data - const { buttons, inputs } = await shim.warpgateMenu(menuData, menuOptions) - if (buttons && buttons !== 'cancel') { - await PowerHandlers[lcName](token, targets, buttons, inputs, extra) + get name () { + return 'Unknown Power' + } + + get durationRounds () { + return 5 + } + + async powerEffect () { + this.prepMenu() + const { buttons, inputs } = await shim.warpgateMenu( + this.menuData, this.menuOptions) + this.buttons = buttons + this.inputs = inputs + if (this.buttons && this.buttons !== 'cancel') { + this.globalModifierEffects() + await this.prepResult() + await this.applyResult() + } + } + + async prepResult () { + } + + async applyResult () { + for (const target of this.targets) { + shim.applyActiveEffects(target, this.effectDocs) + } + } + + static modEffectDoc (icon, name, key, value, durationRounds) { + return shim.createEffectDocument(icon, name, durationRounds, [ + { + key, + mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, + value, + priority: 0 + } + ]) + } + + static glow (durationRounds) { + return PowerEffect.modEffectDoc( + 'icons/magic/light/orb-shadow-blue.webp', + 'Glow', '@Skill{Stealth}[system.die.modifier]', -2, durationRounds) + } + + static shroud (durationRounds) { + return PowerEffect.modEffectDoc( + 'icons/magic/perception/shadow-stealth-eyes-purple.webp', + 'Shroud', '@Skill{Stealth}[system.die.modifier]', 1, durationRounds) + } + + static hinder (durationRounds) { + return PowerEffect.modEffectDoc( + 'icons/magic/control/debuff-chains-shackle-movement-red.webp', + 'Hinder', 'system.stats.speed.value', -2, durationRounds) + } + + static hurry (durationRounds) { + return PowerEffect.modEffectDoc( + 'icons/skills/movement/feet-winged-sandals-tan.webp', + 'Hurry', 'system.stats.speed.value', 2, durationRounds) + } + + globalModifierEffects () { + this.inputIndex = 8 + if (this.inputs[3]) { // glow + this.effectDocs.push(PowerEffect.glow(this.durationRounds)) + } + if (this.inputs[4]) { // shroud + this.effectDocs.push(PowerEffect.shroud(this.durationRounds)) + } + if (this.inputs[5]) { // hinder + this.effectDocs.push(PowerEffect.hinder(this.durationRounds)) + } + if (this.inputs[6]) { // hurry + this.effectDocs.push(PowerEffect.hurry(this.durationRounds)) } } } + +class TargetedPowerEffect extends PowerEffect { + constructor (token, targets) { + super(token, targets) + const targetList = this.targets.map(t => t.name).join(', ') + this.menuData.inputs[1] = { + type: 'info', + label: `Apply ${this.name} Effect to ${targetList}` + } + } + + async powerEffect () { + if (this.targets.length < 1) { + shim.notifications.error(`No target selected for ${this.name}`) + return + } + super.powerEffect() + } +} + +class BlindEffect extends TargetedPowerEffect { + async prepMenu (token, targets) { + this.menuData.inputs.push({ + type: 'checkbox', + label: 'Strong (+1 point)', + options: false + }) + } + + get name () { + return 'Blind' + } + + get durationRounds () { + return 1 + } + + async prepResult () { + const raise = (this.buttons === 'raise') + const strong = !!this.inputs[this.inputIndex] + const icon = 'icons/skills/wounds/injury-eyes-blood-red.webp' + const changes = [ + { + key: 'system.stats.globalMods.trait', + mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, + value: '-2', + priority: 0 + } + ] + this.effectDocs.push( + shim.createEffectDocument( + icon, `minor Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, + this.durationRounds, changes)) + if (raise) { + this.effectDocs.push( + shim.createEffectDocument( + icon, `major Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, + this.durationRounds, changes) + ) + } + } +} + +class BoostLowerTraitEffect extends TargetedPowerEffect { + get name () { + return 'Boost/Lower Trait' + } + + get durationRounds () { + if (!this.inputs) { + return 1 + } + if (this.inputs[this.inputs.length - 4]) { // Boost + return 5 + } + return 1 // Lower + } + + async prepMenu () { + let traitOptions = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'] + const allSkills = [] + const traits = {} + for (const traitName of traitOptions) { + const lower = traitName.toLowerCase() + traits[traitName] = { + name: traitName, + type: 'attribute', + modkey: `system.attributes.${lower}.die.modifier`, + diekey: `system.attributes.${lower}.die.sides` + } + } + for (const token of this.targets) { + 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]` + } + if (name !== 'Unskilled' && !allSkills.find(v => v === name)) { + allSkills.push(name) + } + } + traitOptions = traitOptions.concat(allSkills.sort()) + } + this.menuData.inputs = this.menuData.inputs.concat( + { type: 'select', label: 'Trait', options: traitOptions }, + { type: 'info', label: 'Boost or Lower?' }, + { type: 'radio', label: 'Boost', options: ['isBoost', true] }, + { type: 'radio', label: 'Lower', options: ['isBoost', false] }, + { type: 'checkbox', label: 'Greater', options: false }, + { type: 'checkbox', label: 'Strong (lower only)', options: false } + ) + this.traits = traits + } + + async prepResult () { + const raise = (this.buttons === 'raise') + const direction = this.inputs[this.inputs.length - 4] ? 'Boost' : 'Lower' + const durationRounds = (direction === 'Boost' ? 5 : 1) + const icon = (direction === 'Boost' + ? 'icons/magic/life/cross-embers-glow-yellow-purple.webp' + : 'icons/magic/movement/chevrons-down-yellow.webp') + const trait = this.traits[this.inputs[this.inputIndex]] + const greater = !!this.inputs[this.inputIndex + 4] + const strong = !!this.inputs[this.inputIndex + 5] + + let namePart = `${direction} ${trait.name}` + const mods = [] + if (direction === 'Lower') { + mods.push(`Spirit${strong ? '-2' : ''} ends`) + } + if (greater) { + mods.push('greater') + } + if (mods.length > 0) { + namePart = `${namePart} (${mods.join(', ')})` + } + const mode = CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD + const modValue = (direction === 'Boost' ? '+2' : '-2') + const minorEffect = shim.createEffectDocument( + icon, `minor ${namePart}`, durationRounds, [ + { key: trait.diekey, mode, value: modValue, priority: 0 } + ]) + if (direction === 'Lower' && greater) { + minorEffect.changes.push({ key: trait.modkey, mode, value: modValue, priority: 0 }) + } + const majorEffect = shim.createEffectDocument( + icon, `major ${namePart}`, durationRounds, [ + { key: trait.diekey, mode, value: modValue, priority: 0 } + ]) + this.effectDocs.push(minorEffect) + if (raise) { this.effectDocs.push(majorEffect) } + } +} + +class ConfusionEffect extends TargetedPowerEffect { + get name () { + return 'Confusion' + } + + get durationRounds () { + return 1 + } + + prepMenu () { + this.menuData.inputs.push( + { type: 'checkbox', label: 'Greater (adds Shaken)', options: false }) + this.menuData.buttons = [ + { label: 'Distracted', value: 'distracted' }, + { label: 'Vulnerable', value: 'vulnerable' }, + { label: 'Raise (both)', value: 'raise' }, + { label: 'Cancel', value: 'cancel' } + ] + } + + prepResult () { + const greater = !!this.inputs[this.inputIndex] + if (this.buttons === 'distracted' || this.buttons === 'raise') { + this.effectDocs.push(shim.getStatus('SWADE.Distr', 'Distracted')) + } + if (this.buttons === 'vulnerable' || this.buttons === 'raise') { + this.effectDocs.push(shim.getStatus('SWADE.Vuln', 'Vulnerable')) + } + if (greater) { + this.effectDocs.push(shim.getStatus('SWADE.Shaken', 'Shaken')) + } + } +} + +class DeflectionEffect extends TargetedPowerEffect { + get name () { + return 'Deflection' + } + + get durationRounds () { + return 5 + } + + prepMenu () { + this.menuData.buttons = [ + { label: 'Melee', value: 'melee' }, + { label: 'Ranged', value: 'ranged' }, + { label: 'Raise (both)', value: 'raise' }, + { label: 'Cancel', value: 'cancel' } + ] + } + + prepResult () { + const effectName = `Deflection (${this.buttons === 'raise' ? 'all' : this.buttons})` + const icon = 'icons/magic/defensive/shield-barrier-deflect-teal.webp' + this.effectDocs.push(shim.createEffectDocument(icon, effectName, this.durationRounds)) + } +} + +class EntangleEffect extends TargetedPowerEffect { + get name () { + return 'Entangle' + } + + get durationRounds () { + return 1 + } + + prepMenu () { + this.menuData.inputs = this.menuData.inputs.concat([ + { type: 'radio', label: 'Not Damaging', options: ['dmg', true] }, + { type: 'radio', label: 'Damaging', options: ['dmg', false] }, + { type: 'radio', label: 'Deadly', options: ['dmg', false] }, + { type: 'checkbox', label: 'Tough', options: false } + ]) + this.menuData.buttons = [ + { label: 'Entangled', value: 'apply' }, + { label: 'Bound (raise)', value: 'raise' }, + { label: 'Cancel', value: 'cancel' } + ] + } + + prepResult () { + const damage = (this.inputs[this.inputIndex + 1] + ? '2d4' + : (this.inputs[this.inputIndex + 2] ? '2d6' : null)) + const tough = !!this.inputs[this.inputIndex + 3] + const effectSearch = (this.buttons === 'raise' ? 'SWADE.Bound' : 'SWADE.Entangled') + const effectName = (this.buttons === 'raise' ? 'Bound' : 'Entangled') + const effect = shim.getStatus(effectSearch, effectName) + const extraIcon = 'icons/magic/nature/root-vine-barrier-wall-brown.webp' + const extraEffect = shim.createEffectDocument(extraIcon, + 'Entangle Modifier', this.durationRounds, []) + if (damage) { + extraEffect.name = `${extraEffect.name} - ${damage} dmg` + } + if (tough) { + extraEffect.name = `Tough ${extraEffect.name}` + } + this.effectDocs.push(effect) + if (damage || tough) { + this.effectDocs.push(extraEffect) + } + } +} + +const PowerClasses = { + blind: BlindEffect, + 'boost/lower trait': BoostLowerTraitEffect, + 'boost trait': BoostLowerTraitEffect, + confusion: ConfusionEffect, + deflection: DeflectionEffect, + entangle: EntangleEffect, + 'lower trait': BoostLowerTraitEffect +} + +export async function powerEffects (options = {}) { + const token = 'token' in options ? options.token : [] + const targets = 'targets' in options ? Array.from(options.targets) : [] + const item = 'item' in options ? options.item : null + const name = 'name' in options ? options.name : (item !== null ? item.name : null) + + const lcName = name.toLowerCase() + for (const name in PowerClasses) { + if (lcName.includes(name)) { + const runner = new PowerClasses[name](token, targets) + runner.powerEffect() + return + } + } + shim.notifications.error(`No power effect found for ${name}`) +} From ecd614db3373fed30b244c62fdc63c252d2ad8ea Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Thu, 7 Sep 2023 00:18:37 -0500 Subject: [PATCH 08/20] remove old code --- scripts/powerEffects.js | 364 ---------------------------------------- 1 file changed, 364 deletions(-) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index c29242a..bc3a301 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -1,369 +1,5 @@ import { CONST, shim } from './shim.js' -function baseMenu (title, targets) { - const targetList = targets.map(t => t.name).join(', ') - return { - menuOptions: { - title, - defaultButton: 'Cancel', - options: {} - }, - menuData: { - inputs: [ - { type: 'header', label: title }, - { type: 'info', label: `Apply ${title} to ${targetList}` }, - { type: 'header', label: 'Global Modifiers' }, - { type: 'checkbox', label: 'Glow (+1)' }, - { type: 'checkbox', label: 'Shroud (+1)' }, - { type: 'checkbox', label: 'Hinder (+1)' }, - { type: 'checkbox', label: 'Hurry (+1)' }, - { type: 'header', label: 'Power Modifiers' } - ], - buttons: [ - { label: 'Apply', value: 'apply' }, - { label: 'Apply with Raise', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - } - } -} - -class ModifierEffects { - static glow (basename, durationRounds) { - const effectDoc = shim.createEffectDocument( - 'icons/magic/light/orb-shadow-blue.webp', - 'Glow', - durationRounds - ) - effectDoc.changes = [ - { - key: '@Skill{Stealth}[system.die.modifier]', - mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, - value: -2, - priority: 0 - } - ] - return effectDoc - } - - static shroud (basename, durationRounds) { - const effectDoc = shim.createEffectDocument( - 'icons/magic/perception/shadow-stealth-eyes-purple.webp', - 'Shroud', - durationRounds - ) - effectDoc.changes = [ - { - key: '@Skill{Stealth}[system.die.modifier]', - mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, - value: 1, - priority: 0 - } - ] - return effectDoc - } - - static hinder (basename, durationRounds) { - const effectDoc = shim.createEffectDocument( - 'icons/magic/control/debuff-chains-shackle-movement-red.webp', - 'Hinder', - durationRounds - ) - effectDoc.changes = [ - { - key: 'system.stats.speed.value', - mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, - value: -2, - priority: 0 - } - ] - return effectDoc - } - - static hurry (basename, durationRounds) { - const effectDoc = shim.createEffectDocument( - 'icons/skills/movement/feet-winged-sandals-tan.webp', - 'Hurry', - durationRounds - ) - effectDoc.changes = [ - { - key: 'system.stats.speed.value', - mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, - value: 2, - priority: 0 - } - ] - return effectDoc - } -} - -function globalModifierEffects (inputs, basename, durationRounds) { - const effectDocs = [] - const inputIndex = 8 - if (inputs[3]) { // glow - effectDocs.push(ModifierEffects.glow(basename, durationRounds)) - } - if (inputs[4]) { // shroud - effectDocs.push(ModifierEffects.shroud(basename, durationRounds)) - } - if (inputs[5]) { // hinder - effectDocs.push(ModifierEffects.hinder(basename, durationRounds)) - } - if (inputs[6]) { // hurry - effectDocs.push(ModifierEffects.hurry(basename, durationRounds)) - } - return { effectDocs, inputIndex } -} - -const PowerMenus = { - blind: function (token, targets) { - if (targets.length < 1) { - shim.notifications.error('No target selected for Blind') - return null - } - const { menuOptions, menuData } = baseMenu('Blind', targets) - menuData.inputs.push({ - type: 'checkbox', - label: 'Strong (+1 point)', - options: false - }) - return { menuOptions, menuData, extra: {} } - }, - - 'boost/lower trait': function (token, targets) { - if (targets.length < 1) { - shim.notifications.error('No target selected for Boost/Lower Trait') - return null - } - const { menuOptions, menuData } = baseMenu('Boost/Lower Trait', targets) - let traitOptions = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'] - const allSkills = [] - const traits = {} - for (const traitName of traitOptions) { - const lower = traitName.toLowerCase() - traits[traitName] = { - name: traitName, - type: 'attribute', - modkey: `system.attributes.${lower}.die.modifier`, - diekey: `system.attributes.${lower}.die.sides` - } - } - for (const token of targets) { - 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]` - } - if (name !== 'Unskilled' && !allSkills.find(v => v === name)) { - allSkills.push(name) - } - } - traitOptions = traitOptions.concat(allSkills.sort()) - } - menuData.inputs.push({ - type: 'select', label: 'Trait', options: traitOptions - }) - menuData.inputs.push({ type: 'info', label: 'Boost or Lower?' }) - menuData.inputs.push({ type: 'radio', label: 'Boost', options: ['isBoost', true] }) - menuData.inputs.push({ type: 'radio', label: 'Lower', options: ['isBoost', false] }) - menuData.inputs.push({ type: 'checkbox', label: 'Greater', options: false }) - menuData.inputs.push({ type: 'checkbox', label: 'Strong (lower only)', options: false }) - return { menuOptions, menuData, extra: { traits } } - }, - - confusion: function (token, targets) { - if (targets.length < 1) { - shim.notifications.error('No target selected for Confusion') - return null - } - const { menuOptions, menuData } = baseMenu('Confusion', targets) - menuData.inputs.push({ type: 'checkbox', label: 'Greater (adds Shaken)', options: false }) - menuData.buttons = [ - { label: 'Distracted', value: 'distracted' }, - { label: 'Vulnerable', value: 'vulnerable' }, - { label: 'Raise (both)', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - return { menuOptions, menuData, extra: {} } - }, - - deflection: function (token, targets) { - if (targets.length < 1) { - shim.notifications.error('No target selected for Deflection') - return null - } - const { menuOptions, menuData } = baseMenu('Deflection', targets) - menuData.buttons = [ - { label: 'Melee', value: 'melee' }, - { label: 'Ranged', value: 'ranged' }, - { label: 'Raise (both)', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - return { menuOptions, menuData, extra: {} } - }, - - entangle: function (token, targets) { - if (targets.length < 1) { - shim.notifications.error('No target selected for Entangle') - return null - } - const { menuOptions, menuData } = baseMenu('Entangle', targets) - menuData.inputs = menuData.inputs.concat([ - { type: 'radio', label: 'Not Damaging', options: ['dmg', true] }, - { type: 'radio', label: 'Damaging', options: ['dmg', false] }, - { type: 'radio', label: 'Deadly', options: ['dmg', false] }, - { type: 'checkbox', label: 'Tough', options: false } - ]) - menuData.buttons = [ - { label: 'Entangled', value: 'apply' }, - { label: 'Bound (raise)', value: 'raise' }, - { label: 'Cancel', value: 'cancel' } - ] - return { menuOptions, menuData, extra: {} } - }, - - intangibility: function (token, targets) { - if (targets.length < 1) { - shim.notifications.error('No target selected for Intangibility') - return null - } - const { menuOptions, menuData } = baseMenu('Intangibility', targets) - menuData.inputs.push({ type: 'checkbox', label: 'Duration', options: false }) - menuData.buttons.splice(1, 1) // delete the raise button - return { menuOptions, menuData, extra: {} } - } -} - -const PowerHandlers = { - blind: async function (token, targets, buttons, inputs, extra) { - const raise = (buttons === 'raise') - const { effectDocs, inputIndex } = globalModifierEffects(inputs, 'Blind', 1) - const strong = !!inputs[inputIndex] - const icon = 'icons/skills/wounds/injury-eyes-blood-red.webp' - const changes = [ - { - key: 'system.stats.globalMods.trait', - mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, - value: '-2', - priority: 0 - } - ] - effectDocs.push( - shim.createEffectDocument( - icon, `minor Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1, changes) - ) - if (raise) { - effectDocs.push( - shim.createEffectDocument( - icon, `major Blindness (Vigor ${strong ? '-2 ' : ''}ends)`, 1, changes) - ) - } - for (const target of targets) { - shim.applyActiveEffects(target, effectDocs) - } - }, - - 'boost/lower trait': async function (token, targets, buttons, inputs, extra) { - const raise = (buttons === 'raise') - const direction = inputs[inputs.length - 4] ? 'Boost' : 'Lower' - const durationRounds = (direction === 'Boost' ? 5 : 1) - const { effectDocs, inputIndex } = globalModifierEffects( - inputs, 'Boost/Lower Trait', durationRounds) - const icon = (direction === 'Boost' - ? 'icons/magic/life/cross-embers-glow-yellow-purple.webp' - : 'icons/magic/movement/chevrons-down-yellow.webp') - const trait = extra.traits[inputs[inputIndex]] - const greater = !!inputs[inputIndex + 4] - const strong = !!inputs[inputIndex + 5] - - let namePart = `${direction} ${trait.name}` - const mods = [] - if (direction === 'Lower') { - mods.push(`Spirit${strong ? '-2' : ''} ends`) - } - if (greater) { - mods.push('greater') - } - if (mods.length > 0) { - namePart = `${namePart} (${mods.join(', ')})` - } - const mode = CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD - const modValue = (direction === 'Boost' ? '+2' : '-2') - const minorEffect = shim.createEffectDocument( - icon, `minor ${namePart}`, durationRounds, [ - { key: trait.diekey, mode, value: modValue, priority: 0 } - ]) - if (direction === 'Lower' && greater) { - minorEffect.changes.push({ key: trait.modkey, mode, value: modValue, priority: 0 }) - } - const majorEffect = shim.createEffectDocument( - icon, `major ${namePart}`, durationRounds, [ - { key: trait.diekey, mode, value: modValue, priority: 0 } - ]) - effectDocs.push(minorEffect) - if (raise) { effectDocs.push(majorEffect) } - for (const target of targets) { - shim.applyActiveEffects(target, effectDocs) - } - }, - - confusion: async function (token, targets, buttons, inputs, extra) { - const { effectDocs, inputIndex } = globalModifierEffects(inputs, 'Confusion', 1) - const greater = !!inputs[inputIndex] - if (buttons === 'distracted' || buttons === 'raise') { - effectDocs.push(shim.getStatus('SWADE.Distr', 'Distracted')) - } - if (buttons === 'vulnerable' || buttons === 'raise') { - effectDocs.push(shim.getStatus('SWADE.Vuln', 'Vulnerable')) - } - if (greater) { - effectDocs.push(shim.getStatus('SWADE.Shaken', 'Shaken')) - } - for (const target of targets) { - shim.applyActiveEffects(target, effectDocs) - } - }, - - deflection: async function (token, targets, buttons, inputs, extra) { - const { effectDocs } = globalModifierEffects(inputs, 'Confusion', 1) - const effectName = `Deflection (${buttons === 'raise' ? 'all' : buttons})` - const icon = 'icons/magic/defensive/shield-barrier-deflect-teal.webp' - effectDocs.push(shim.createEffectDocument(icon, effectName, 5)) - for (const target of targets) { - shim.applyActiveEffects(target, effectDocs) - } - }, - - entangle: async function (token, targets, buttons, inputs, extra) { - const { effectDocs, inputIndex } = globalModifierEffects(inputs, 'Entangle', 1) - const damage = (inputs[inputIndex + 1] ? '2d4' : (inputs[inputIndex + 2] ? '2d6' : null)) - const tough = !!inputs[inputIndex + 3] - const effectSearch = (buttons === 'raise' ? 'SWADE.Bound' : 'SWADE.Entangled') - const effectName = (buttons === 'raise' ? 'Bound' : 'Entangled') - const effect = shim.getStatus(effectSearch, effectName) - const extraIcon = 'icons/magic/nature/root-vine-barrier-wall-brown.webp' - const extraEffect = shim.createEffectDocument(extraIcon, 'Entangle Modifier', 1, []) - if (damage) { - extraEffect.name = `${extraEffect.name} - ${damage} dmg` - } - if (tough) { - extraEffect.name = `Tough ${extraEffect.name}` - } - effectDocs.push(effect) - if (damage || tough) { - effectDocs.push(extraEffect) - } - for (const target of targets) { - shim.applyActiveEffects(target, effectDocs) - } - } -} - class PowerEffect { constructor (token, targets) { this.token = token From c577a8ec0f8eb0ed707704b19562017e813f5b22 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Fri, 8 Sep 2023 10:48:16 -0500 Subject: [PATCH 09/20] untested intangibility --- package-lock.json | 1 - scripts/powerEffects.js | 31 +++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 27a52e0..f88b860 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,7 +4,6 @@ "requires": true, "packages": { "": { - "name": "swade-mb-helpers", "devDependencies": { "@league-of-foundry-developers/foundry-vtt-types": "^9.280.0", "eslint": "^8.48.0", diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index bc3a301..97fea85 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -376,6 +376,36 @@ class EntangleEffect extends TargetedPowerEffect { } } +class IntangibilityEffect extends TargetedPowerEffect { + get name () { + return 'Intangility' + } + + get durationRounds () { + if (!this.inputs) { + return 5 + } + if (this.inputs[this.inputs.length - 1]) { // Duration + return 50 + } + return 5 // no duration + } + + prepMenu () { + this.menuData.inputs.push({ type: 'checkbox', label: 'Duration', options: false }) + this.menuData.buttons = [ + { label: 'Apply', value: 'apply' }, + { label: 'Cancel', value: 'cancel' } + ] + } + + prepResult () { + const icon = 'icons/magic/control/debuff-energy-hold-levitate-blue-yellow.webp' + const effect = shim.createEffectDocument(icon, this.name, this.durationRounds, []) + this.effectDocs.push(effect) + } +} + const PowerClasses = { blind: BlindEffect, 'boost/lower trait': BoostLowerTraitEffect, @@ -383,6 +413,7 @@ const PowerClasses = { confusion: ConfusionEffect, deflection: DeflectionEffect, entangle: EntangleEffect, + inangibility: IntangibilityEffect, 'lower trait': BoostLowerTraitEffect } From d7c30e39902c206703acf1a323bac22173efa79c Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sat, 9 Sep 2023 00:26:55 -0500 Subject: [PATCH 10/20] add several more powers Invisiblity, Intangability, Protection, Smite --- scripts/powerEffects.js | 135 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 125 insertions(+), 10 deletions(-) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index 97fea85..6d1a64e 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -279,7 +279,7 @@ class ConfusionEffect extends TargetedPowerEffect { return 1 } - prepMenu () { + async prepMenu () { this.menuData.inputs.push( { type: 'checkbox', label: 'Greater (adds Shaken)', options: false }) this.menuData.buttons = [ @@ -290,7 +290,7 @@ class ConfusionEffect extends TargetedPowerEffect { ] } - prepResult () { + async prepResult () { const greater = !!this.inputs[this.inputIndex] if (this.buttons === 'distracted' || this.buttons === 'raise') { this.effectDocs.push(shim.getStatus('SWADE.Distr', 'Distracted')) @@ -313,7 +313,7 @@ class DeflectionEffect extends TargetedPowerEffect { return 5 } - prepMenu () { + async prepMenu () { this.menuData.buttons = [ { label: 'Melee', value: 'melee' }, { label: 'Ranged', value: 'ranged' }, @@ -322,7 +322,7 @@ class DeflectionEffect extends TargetedPowerEffect { ] } - prepResult () { + async prepResult () { const effectName = `Deflection (${this.buttons === 'raise' ? 'all' : this.buttons})` const icon = 'icons/magic/defensive/shield-barrier-deflect-teal.webp' this.effectDocs.push(shim.createEffectDocument(icon, effectName, this.durationRounds)) @@ -338,7 +338,7 @@ class EntangleEffect extends TargetedPowerEffect { return 1 } - prepMenu () { + async prepMenu () { this.menuData.inputs = this.menuData.inputs.concat([ { type: 'radio', label: 'Not Damaging', options: ['dmg', true] }, { type: 'radio', label: 'Damaging', options: ['dmg', false] }, @@ -352,7 +352,7 @@ class EntangleEffect extends TargetedPowerEffect { ] } - prepResult () { + async prepResult () { const damage = (this.inputs[this.inputIndex + 1] ? '2d4' : (this.inputs[this.inputIndex + 2] ? '2d6' : null)) @@ -391,7 +391,7 @@ class IntangibilityEffect extends TargetedPowerEffect { return 5 // no duration } - prepMenu () { + async prepMenu () { this.menuData.inputs.push({ type: 'checkbox', label: 'Duration', options: false }) this.menuData.buttons = [ { label: 'Apply', value: 'apply' }, @@ -399,13 +399,125 @@ class IntangibilityEffect extends TargetedPowerEffect { ] } - prepResult () { + async prepResult () { const icon = 'icons/magic/control/debuff-energy-hold-levitate-blue-yellow.webp' const effect = shim.createEffectDocument(icon, this.name, this.durationRounds, []) this.effectDocs.push(effect) } } +class InvisibilityEffect extends TargetedPowerEffect { + get name () { + return 'Invisiblity' + } + + get durationRounds () { + if (!this.inputs) { + return 5 + } + if (this.inputs[this.inputs.length - 1]) { // Duration + return 50 + } + return 5 // no duration + } + + async prepMenu () { + this.menuData.inputs.push({ type: 'checkbox', label: 'Duration', options: false }) + } + + async prepResult () { + const effect = shim.getStatus('EFFECT.StatusInvisible', 'Invisible') + effect.duration = { rounds: this.durationRounds } + this.effectDocs.push(effect) + } +} + +class ProtectionEffect extends TargetedPowerEffect { + get name () { + return 'Protection' + } + + get durationRounds () { + return 5 + } + + async prepMenu () { + this.menuData.buttons = [ + { label: 'Apply (+2 armor)', value: 'apply' }, + { label: 'Apply with raise (+2 toughness)', value: 'raise' }, + { label: 'Cancel', value: 'cancel' } + ] + } + + async prepResult () { + const effect = shim.getStatus('SWADE.Protection', 'Protection') + effect.duration = { rounds: this.durationRounds } + const mode = CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD + effect.changes = [ + { key: 'system.stats.toughness.armor', mode, value: 2, priority: 0 } + ] + if (this.buttons === 'raise') { + effect.changes[0].key = 'system.stats.toughness.value' + } + this.effectDocs.push(effect) + } +} + +class SmiteEffect extends TargetedPowerEffect { + get name () { + return 'Smite' + } + + get durationRounds () { + return 5 + } + + async prepMenu () { + this.menuData.inputs.push({ + type: 'checkbox', label: 'Greater', options: false + }) + const tokenWeapons = {} + let index = this.menuData.inputs.length - 1 + for (const token of this.targets) { + index += 2 + tokenWeapons[token.id] = index + this.menuData.inputs.push({ type: 'info', label: `

${token.name}

` }) + const weapons = token.actor.items.filter(i => i.type === 'weapon').map( + i => { return { value: i.name, html: i.name } }) + weapons.unshift({ value: '', html: 'None' }) + this.menuData.inputs.push({ type: 'select', label: token.name, options: weapons }) + } + this.tokenWeapons = tokenWeapons + } + + async prepResult () { + this.baseEffect = shim.getStatus('SWADE.Smite', 'Smite') + } + + async applyResult () { + const mode = CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD + const raise = (this.buttons === 'raise') + const greater = !!this.inputs[this.inputIndex] + const changeValue = (greater ? (raise ? '+6' : '+4') : (raise ? '+4' : '+2')) + for (const token of this.targets) { + const weaponName = this.inputs[this.tokenWeapons[token.id]] + const weaponId = token.actor.items.getName(weaponName)?.id + const changeKey = `@Weapon{${weaponName}}[system.actions.dmgMod]` + if (!weaponId) { + continue + } + const effectName = `${this.buttons === 'raise' ? 'major' : 'minor'} Smite${greater ? ' (greater)' : ''} (${weaponName})` + const changes = [ + { key: changeKey, mode, value: changeValue, priority: 0 } + ] + this.baseEffect.changes = changes + this.baseEffect.name = effectName + console.log(token, weaponName, weaponId, effectName, changeKey) + await shim.applyActiveEffects(token, [this.baseEffect].concat(this.effectDocs)) + } + } +} + const PowerClasses = { blind: BlindEffect, 'boost/lower trait': BoostLowerTraitEffect, @@ -413,8 +525,11 @@ const PowerClasses = { confusion: ConfusionEffect, deflection: DeflectionEffect, entangle: EntangleEffect, - inangibility: IntangibilityEffect, - 'lower trait': BoostLowerTraitEffect + intangibility: IntangibilityEffect, + invisibility: InvisibilityEffect, + 'lower trait': BoostLowerTraitEffect, + protection: ProtectionEffect, + smite: SmiteEffect } export async function powerEffects (options = {}) { From 19c1e697db7d094524e6f3fc536431414ee6e42d Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sat, 9 Sep 2023 20:47:57 -0500 Subject: [PATCH 11/20] working summon --- scripts/api.js | 9 +-- scripts/powerEffects.js | 138 +++++++++++++++++++++++++++++++++++++++- scripts/shim.js | 51 +++++++++++++++ 3 files changed, 191 insertions(+), 7 deletions(-) diff --git a/scripts/api.js b/scripts/api.js index 70a8a10..63353d9 100644 --- a/scripts/api.js +++ b/scripts/api.js @@ -1,9 +1,10 @@ import { helpers } from './helpers.js' +import { shim, log } from './shim.js' import { powerEffects } from './powerEffects.js' export class api { static registerFunctions () { - console.log('SWADE MB Helpers initialized') + log('SWADE MB Helpers initialized') api.globals() } @@ -11,11 +12,11 @@ export class api { globalThis.swadeMBHelpers = { DEBUG: true, powerEffects, - createEffectDocument: helpers.createEffectDocument, + createEffectDocument: shim.createEffectDocument, createMutationWithEffect: helpers.createMutationWithEffect, defaultMutationOptions: helpers.defaultMutationOptions, - getActorFolderByPath: helpers.getActorFolderByPath, - getActorsInFolder: helpers.getActorsInFolder, + getActorFolderByPath: shim.getActorFolderByPath, + getActorsInFolder: shim.getActorsInFolder, runOnTargetOrSelectedTokens: helpers.runOnTargetOrSelectedTokens } } diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index 6d1a64e..80e888f 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -1,4 +1,4 @@ -import { CONST, shim } from './shim.js' +import { CONST, log, shim } from './shim.js' class PowerEffect { constructor (token, targets) { @@ -40,7 +40,12 @@ class PowerEffect { } async powerEffect () { - this.prepMenu() + try { + await this.prepMenu() + } catch (e) { + log('Error preparing menu for power effect: ' + e.toString()) + return + } const { buttons, inputs } = await shim.warpgateMenu( this.menuData, this.menuOptions) this.buttons = buttons @@ -518,6 +523,132 @@ class SmiteEffect extends TargetedPowerEffect { } } +class SummonEffect extends PowerEffect { + ICON = 'icons/magic/symbols/runes-triangle-blue.webp' + + get actorFolder () { + return 'Summonables' + } + + get name () { + return 'Summon Creature' + } + + get durationRounds () { + return 5 + } + + async prepFolders () { + const folders = [] + const folderNames = [ + this.actorFolder, + `${this.actorFolder} - Default`, + `${this.actorFolder}/Default`, + `${this.actorFolder} - ${this.token.name}`, + `${this.actorFolder} - ${this.token.actor.name}`, + `${this.actorFolder}/${this.token.name}`, + `${this.actorFolder}/${this.token.actor.name}` + ] + for (const folderName of folderNames) { + const folder = shim.getActorFolderByPath(folderName) + if (folder) { + log(`Found actor folder ${folderName}`) + folders.push(folder) + } + } + if (folders.length > 1) { + folders.shift() + } + return folders + } + + async prepActors () { + const folders = await this.prepFolders() + const actors = {} + for (const folder of folders) { + const folderActors = shim.getActorsInFolder(folder) + for (const key in folderActors) { + actors[key] = folderActors[key] + } + } + return actors + } + + async prepMenu () { + this.menuData.inputs[1].label = `${this.token.name} is summoning...` + const actors = await this.prepActors() + if (Object.keys(actors).length < 1) { + shim.notifications.error('No summonables found') + throw new Error('No summonables found') + } + + function actorData (key) { + return { + value: actors[key].id, + html: key + } + } + + this.menuData.inputs.push({ + type: 'select', + label: 'Creature to summon', + options: Object.keys(actors).filter( + k => !k.includes('_template')).sort().map(actorData) + }) + this.menuData.inputs.push({ + type: 'number', + label: 'Number to spawn (+half base cost per)', + options: 1 + }) + } + + async prepResult () { + this.raise = (this.buttons === 'raise') + this.actorId = (this.inputs[this.inputIndex]) + this.number = (this.inputs[this.inputIndex + 1]) + this.actor = shim.actors.get(this.actorId) + this.icon = this.actor.prototypeToken.texture.src + this.protoDoc = await this.actor.getTokenDocument() + this.spawnOptions = { + controllingActor: this.token.actor, + duplicates: this.number, + crosshairs: { + icon: this.icon, + label: `Summon ${this.actor.name}`, + drawOutline: true, + rememberControlled: true + } + } + this.spawnMutation = { + actor: { + name: `${this.token.name}'s ${this.actor.name}` + }, + token: { + actorLink: false, + name: `${this.token.name}'s ${this.protoDoc.name}` + }, + embedded: { ActiveEffect: {} } + } + for (const effectDocument of this.effectDocs) { + this.spawnMutation.embedded.ActiveEffect[effectDocument.name] = effectDocument + } + } + + async applyResult () { + await shim.warpgateSpawn(this.protoDoc, this.spawnMutation, {}, this.spawnOptions) + } +} + +class SummonAllyEffect extends SummonEffect { + get name () { + return 'Summon Ally' + } + + get actorFolder () { + return `${super.actorFolder}/Summon Ally` + } +} + const PowerClasses = { blind: BlindEffect, 'boost/lower trait': BoostLowerTraitEffect, @@ -529,7 +660,8 @@ const PowerClasses = { invisibility: InvisibilityEffect, 'lower trait': BoostLowerTraitEffect, protection: ProtectionEffect, - smite: SmiteEffect + smite: SmiteEffect, + 'summon ally': SummonAllyEffect } export async function powerEffects (options = {}) { diff --git a/scripts/shim.js b/scripts/shim.js index 6fba75f..22d1571 100644 --- a/scripts/shim.js +++ b/scripts/shim.js @@ -24,6 +24,10 @@ export class shim { return game.user } + static get actors () { + return game.actors + } + static getStatus (label, name, favorite = true) { const effect = JSON.parse(JSON.stringify( CONFIG.statusEffects.find(se => se.label === label))) @@ -76,6 +80,53 @@ export class shim { static warpgateMenu (menuData, menuOptions) { return warpgate.menu(menuData, menuOptions) } + + static warpgateSpawn (...args) { + return warpgate.spawn(...args) + } + + static getActorFolderByPath (path) { + const names = path.split('/') + if (names[0] === '') { + names.shift() + } + let name = names.shift() + let folder = shim.folders.filter( + f => f.type === 'Actor' && !f.folder + ).find(f => f.name === name) + if (!folder) { return undefined } + while (names.length > 0) { + name = names.shift() + folder = folder.children.find(c => c.folder.name === name) + if (!folder) { return undefined } + folder = folder.folder + } + return folder + } + + static getActorsInFolder (inFolder) { + const prefixStack = [''] + const actors = {} + const folderStack = [inFolder] + while (folderStack.length > 0) { + const prefix = prefixStack.shift() + const folder = folderStack.shift() + for (const actor of folder.contents) { + if (shim.user.isGM || + actor.testUserPermission( + shim.user, CONST.FOUNDRY.DOCUMENT_OWNERSHIP_LEVELS.OBSERVER) + ) { + actors[`${prefix}${actor.name}`] = actor + } + } + for (const child of folder.children) { + const newPrefix = `${prefix}${child.folder.name} | ` + prefixStack.push(newPrefix) + folderStack.push(child.folder) + } + } + return actors + } } export function log (...args) { From dd9390f15f175b42f77d37319a04a1f37ab7e066 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sat, 9 Sep 2023 23:00:41 -0500 Subject: [PATCH 12/20] summon with a raise --- scripts/powerEffects.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index 80e888f..b2a3402 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -589,6 +589,8 @@ class SummonEffect extends PowerEffect { } } + this.summonableActors = actors + this.menuData.inputs.push({ type: 'select', label: 'Creature to summon', @@ -627,8 +629,16 @@ class SummonEffect extends PowerEffect { actorLink: false, name: `${this.token.name}'s ${this.protoDoc.name}` }, - embedded: { ActiveEffect: {} } + embedded: { ActiveEffect: {}, Item: {} } } + if (this.raise && ('raise_template' in this.summonableActors)) { + const raiseTemplate = this.summonableActors.raise_template + for (const item of raiseTemplate.items) { + const raiseItemDoc = await raiseTemplate.getEmbeddedDocument('Item', item.id) + this.spawnMutation.embedded.Item[item.name] = raiseItemDoc + } + } + for (const effectDocument of this.effectDocs) { this.spawnMutation.embedded.ActiveEffect[effectDocument.name] = effectDocument } From 202ca09d181256c80192b9c5969bc8e4f0589bdb Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sat, 9 Sep 2023 23:29:32 -0500 Subject: [PATCH 13/20] update shim const handling --- scripts/module.js | 6 ++---- scripts/shim.js | 15 ++++++++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/scripts/module.js b/scripts/module.js index 11e58ed..71ec9e8 100644 --- a/scripts/module.js +++ b/scripts/module.js @@ -1,12 +1,12 @@ import { api } from './api.js' -import { log, shim, CONST } from './shim.js' +import { log } from './shim.js' function _checkModule (name) { if (!game.modules.get(name)?.active && game.user.isGM) { let action = 'install and activate' if (game.modules.get(name)) action = 'activate' ui.notifications.error( - `SWADE MB Helpers requires the ${name} module. Please ${action} it.`) + `SWADE MB Helpers requires the ${name} module. Please ${action} it.`) } } @@ -14,7 +14,5 @@ Hooks.on('setup', api.registerFunctions) Hooks.on('ready', () => { _checkModule('warpgate') - CONST.FOUNDRY = foundry.CONST - CONST.SWADE = CONFIG.SWADE.CONST log('Initialized SWADE MB Helpers') }) diff --git a/scripts/shim.js b/scripts/shim.js index 22d1571..591c9f5 100644 --- a/scripts/shim.js +++ b/scripts/shim.js @@ -1,6 +1,15 @@ -export const CONST = { - SWADE: null, - FOUNDRY: null +export class CONST { + static get SWADE () { + return CONFIG.SWADE.CONST + } + + static get FOUNDRY () { + return foundry.CONST + } + + static get WARPGATE () { + return warpgate.CONST + } } export class shim { From 00d1bedaa00242f995389a8695171f28ce3a1daa Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sat, 9 Sep 2023 23:29:44 -0500 Subject: [PATCH 14/20] setup base duration for later --- scripts/powerEffects.js | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index b2a3402..a658d8b 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -36,6 +36,10 @@ class PowerEffect { } get durationRounds () { + return this.baseDurationRounds() + } + + get baseDurationRounds () { return 5 } @@ -150,7 +154,7 @@ class BlindEffect extends TargetedPowerEffect { return 'Blind' } - get durationRounds () { + get baseDurationRounds () { return 1 } @@ -185,7 +189,7 @@ class BoostLowerTraitEffect extends TargetedPowerEffect { return 'Boost/Lower Trait' } - get durationRounds () { + get baseDurationRounds () { if (!this.inputs) { return 1 } @@ -280,7 +284,7 @@ class ConfusionEffect extends TargetedPowerEffect { return 'Confusion' } - get durationRounds () { + get baseDurationRounds () { return 1 } @@ -314,7 +318,7 @@ class DeflectionEffect extends TargetedPowerEffect { return 'Deflection' } - get durationRounds () { + get baseDurationRounds () { return 5 } @@ -339,7 +343,7 @@ class EntangleEffect extends TargetedPowerEffect { return 'Entangle' } - get durationRounds () { + get baseDurationRounds () { return 1 } @@ -386,7 +390,7 @@ class IntangibilityEffect extends TargetedPowerEffect { return 'Intangility' } - get durationRounds () { + get baseDurationRounds () { if (!this.inputs) { return 5 } @@ -416,7 +420,7 @@ class InvisibilityEffect extends TargetedPowerEffect { return 'Invisiblity' } - get durationRounds () { + get baseDurationRounds () { if (!this.inputs) { return 5 } @@ -442,7 +446,7 @@ class ProtectionEffect extends TargetedPowerEffect { return 'Protection' } - get durationRounds () { + get baseDurationRounds () { return 5 } @@ -473,7 +477,7 @@ class SmiteEffect extends TargetedPowerEffect { return 'Smite' } - get durationRounds () { + get baseDurationRounds () { return 5 } @@ -534,7 +538,7 @@ class SummonEffect extends PowerEffect { return 'Summon Creature' } - get durationRounds () { + get baseDurationRounds () { return 5 } From 46a946df2c6adf976b8c63971611e292e317adc3 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sun, 10 Sep 2023 01:05:24 -0500 Subject: [PATCH 15/20] summon increased effect --- scripts/powerEffects.js | 93 +++++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 12 deletions(-) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index a658d8b..424570f 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -36,7 +36,7 @@ class PowerEffect { } get durationRounds () { - return this.baseDurationRounds() + return this.baseDurationRounds } get baseDurationRounds () { @@ -595,17 +595,22 @@ class SummonEffect extends PowerEffect { this.summonableActors = actors - this.menuData.inputs.push({ - type: 'select', - label: 'Creature to summon', - options: Object.keys(actors).filter( - k => !k.includes('_template')).sort().map(actorData) - }) - this.menuData.inputs.push({ - type: 'number', - label: 'Number to spawn (+half base cost per)', - options: 1 - }) + this.menuData.inputs = this.menuData.inputs.concat([ + { + type: 'select', + label: 'Creature to summon', + options: Object.keys(actors).filter( + k => !k.includes('_template')).sort().map(actorData) + }, { + type: 'number', + label: 'Number to spawn (+half base cost per)', + options: 1 + }, { + type: 'checkbox', + label: 'Add Increased Trait(s)? (+1 per trait)', + options: false + } + ]) } async prepResult () { @@ -615,6 +620,8 @@ class SummonEffect extends PowerEffect { this.actor = shim.actors.get(this.actorId) this.icon = this.actor.prototypeToken.texture.src this.protoDoc = await this.actor.getTokenDocument() + this.increasedTrait = !!(this.inputs[this.inputIndex + 2]) + this.inputIndex += 2 this.spawnOptions = { controllingActor: this.token.actor, duplicates: this.number, @@ -648,7 +655,69 @@ class SummonEffect extends PowerEffect { } } + async prepAdditional () { + await this.prepIncreasedTrait() + } + + async prepIncreasedTrait () { + if (!this.increasedTrait) { + return + } + const traitMenuOptions = { + title: `${this.name} Summon Trait Increase`, + defaultButton: 'Cancel', + options: {} + } + const skillSet = new Set() + for (const skill of this.actor.items.filter(i => i.type === 'skill')) { + skillSet.add(skill.name) + } + for (const item of Object.values(this.spawnMutation.embedded.Item).filter(i => i.type === 'skill')) { + skillSet.add(item.name) + } + const skillList = Array.from(skillSet) + const attrList = ['Agility', 'Smarts', 'Spirit', 'Strength', 'Vigor'] + skillList.sort() + const traitMenuData = { + inputs: [ + { type: 'header', label: 'Increase Attributes (+1 each)' } + ], + buttons: [ + { label: 'Apply', value: 'apply' }, + { label: 'Increase no traits', value: 'cancel' } + ] + } + traitMenuData.inputs = traitMenuData.inputs.concat( + attrList.map((x) => { return { type: 'checkbox', label: x, options: false } })) + traitMenuData.inputs.push({ type: 'header', label: 'Increase Skills (+1 each)' }) + traitMenuData.inputs = traitMenuData.inputs.concat( + skillList.map((x) => { return { type: 'checkbox', label: x, options: false } })) + const { buttons, inputs } = await shim.warpgateMenu(traitMenuData, traitMenuOptions) + if (!buttons || buttons === 'cancel') { + return + } + const modKeys = [] + for (let i = 0; i < attrList.length; i++) { + if (inputs[i + 1]) { + modKeys.push(`system.attributes.${attrList[i].toLowerCase()}.die.sides`) + } + } + for (let i = 0; i < skillList.length; i++) { + if (inputs[i + 7]) { + modKeys.push(`@Skill{${skillList[i]}}[system.die.sides]`) + } + } + const effectDoc = shim.createEffectDocument(this.ICON, 'Increased Trait', this.durationRounds) + effectDoc.changes = modKeys.map(key => { + return { + key, mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, value: '+2', priority: 0 + } + }) + this.spawnMutation.embedded.ActiveEffect[effectDoc.name] = effectDoc + } + async applyResult () { + await this.prepAdditional() await shim.warpgateSpawn(this.protoDoc, this.spawnMutation, {}, this.spawnOptions) } } From 66ea4c4388533b08fe77d399f13e30621bcce163 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sun, 10 Sep 2023 12:44:20 -0500 Subject: [PATCH 16/20] add summon ally specific mods flight and combat edge --- scripts/powerEffects.js | 112 +++++++++++++++++++++++++++++++++++++--- scripts/shim.js | 4 ++ 2 files changed, 110 insertions(+), 6 deletions(-) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index 424570f..49fc326 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -621,7 +621,7 @@ class SummonEffect extends PowerEffect { this.icon = this.actor.prototypeToken.texture.src this.protoDoc = await this.actor.getTokenDocument() this.increasedTrait = !!(this.inputs[this.inputIndex + 2]) - this.inputIndex += 2 + this.inputIndex += 3 this.spawnOptions = { controllingActor: this.token.actor, duplicates: this.number, @@ -656,10 +656,6 @@ class SummonEffect extends PowerEffect { } async prepAdditional () { - await this.prepIncreasedTrait() - } - - async prepIncreasedTrait () { if (!this.increasedTrait) { return } @@ -707,7 +703,8 @@ class SummonEffect extends PowerEffect { modKeys.push(`@Skill{${skillList[i]}}[system.die.sides]`) } } - const effectDoc = shim.createEffectDocument(this.ICON, 'Increased Trait', this.durationRounds) + const effectDoc = shim.createEffectDocument( + this.ICON, 'Increased Trait', this.durationRounds) effectDoc.changes = modKeys.map(key => { return { key, mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, value: '+2', priority: 0 @@ -730,6 +727,109 @@ class SummonAllyEffect extends SummonEffect { get actorFolder () { return `${super.actorFolder}/Summon Ally` } + + async prepMenu () { + await super.prepMenu() + this.menuData.inputs = this.menuData.inputs.concat([ + { + type: 'checkbox', + label: 'Bite/Claw (+1)', + options: false + }, { + type: 'checkbox', + label: 'Up to 3 Combat Edges (+1 per)', + options: false + }, { + type: 'checkbox', + label: 'Flight (+3)', + options: false + } + ]) + } + + async prepResult () { + await super.prepResult() + this.biteClaw = !!(this.inputs[this.inputIndex]) + this.combatEdge = !!(this.inputs[this.inputIndex + 1]) + this.flight = !!(this.inputs[this.inputIndex + 2]) + } + + async prepAdditional () { + await super.prepAdditional() + await this.prepBiteClaw() + await this.prepFlight() + await this.prepCombatEdge() + } + + async prepCombatEdge () { + if (!this.combatEdge || !('combat-edge_template' in this.summonableActors)) { + return + } + const template = this.summonableActors['combat-edge_template'] + const edges = template.items.filter(i => i.type === 'edge').map(i => i.name) + edges.sort() + edges.unshift('None') + const edgeMenuData = { + inputs: [ + { type: 'header', label: 'Choose Edges (+1 per choice)' }, + { type: 'select', label: 'Edge 1', options: edges }, + { type: 'select', label: 'Edge 2', options: edges }, + { type: 'select', label: 'Edge 3', options: edges } + ], + buttons: [ + { label: 'Apply', value: 'apply' }, + { label: 'Add no edges', value: 'cancel' } + ] + } + const edgeMenuOptions = { + title: `${this.name} Combat Edge Selection`, + defaultButton: 'Cancel', + options: {} + } + const { buttons, inputs } = await shim.warpgateMenu(edgeMenuData, edgeMenuOptions) + if (!buttons || buttons === 'cancel') { + return + } + for (let i = 1; i <= 3; i++) { + if (inputs[i] === 'None') { + continue + } + const edge = template.items.getName(inputs[i]) + if (edge) { + const doc = template.getEmbeddedDocument('Item', edge.id) + this.spawnMutation.embedded.Item[edge.name] = doc + } + } + } + + async prepBiteClaw () { + if (!this.biteClaw || !('bite-claw_template' in this.summonableActors)) { + return + } + const template = this.summonableActors['bite-claw_template'] + for (const item of template.items) { + const doc = await template.getEmbeddedDocument('Item', item.id) + this.spawnMutation.embedded.Item[item.name] = doc + log(`Added ${item.name} to spawn mutation`) + } + } + + async prepFlight () { + if (!this.flight || !('flight_template' in this.summonableActors)) { + return + } + const template = this.summonableActors.flight_template + for (const item of template.items) { + const doc = await template.getEmbeddedDocument('Item', item.id) + this.spawnMutation.embedded.Item[item.name] = doc + log(`Added ${item.name} to spawn mutation`) + } + for (const effect of template.effects.values()) { + const doc = shim.ActiveEffect.fromSource(effect) + this.spawnMutation.embedded.ActiveEffect[effect.name] = doc + log(`Added ${effect.name} to spawn mutation`) + } + } } const PowerClasses = { diff --git a/scripts/shim.js b/scripts/shim.js index 591c9f5..26c7e8c 100644 --- a/scripts/shim.js +++ b/scripts/shim.js @@ -13,6 +13,10 @@ export class CONST { } export class shim { + static get ActiveEffect () { + return ActiveEffect + } + static get folders () { return game.folders } From 7dce7780b95df39ec2e0bca4db889b64ed66730b Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sun, 10 Sep 2023 17:39:23 -0500 Subject: [PATCH 17/20] working but imperfect mirror self --- scripts/powerEffects.js | 48 +++++++++++++++++++++++++++++++++++++++++ scripts/shim.js | 4 ++++ 2 files changed, 52 insertions(+) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index 49fc326..3b4ce12 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -752,6 +752,7 @@ class SummonAllyEffect extends SummonEffect { this.biteClaw = !!(this.inputs[this.inputIndex]) this.combatEdge = !!(this.inputs[this.inputIndex + 1]) this.flight = !!(this.inputs[this.inputIndex + 2]) + await this.prepMirrorSelf() } async prepAdditional () { @@ -830,6 +831,53 @@ class SummonAllyEffect extends SummonEffect { log(`Added ${effect.name} to spawn mutation`) } } + + async prepMirrorSelf () { + if (this.actor.name !== 'Mirror Self') { + return + } + const actorDoc = this.token.actor.clone({ + 'system.wildcard': false, + 'system.fatigue.value': 0, + 'system.wounds.value': 0, + 'system.wounds.max': 0, + 'system.bennies.max': 0, + 'system.bennies.value': 0 + }) + await shim.mergeObject( + this.spawnMutation.actor, { + name: `Mirrored ${this.token.actor.name}`, + img: this.token.actor.img, + system: actorDoc.system + }, { inplace: true, recursive: true } + ) + await shim.mergeObject( + this.spawnMutation.token, { + actorLink: false, + disposition: this.token.document.disposition, + light: this.token.document.light, + sight: this.token.document.sight, + name: `Mirrored ${this.token.name}`, + texture: this.token.document.texture + }, { inplace: true, recursive: true }) + this.spawnMutation.token.texture.scaleX = -1 * this.token.document.texture.scaleX + const effectChanges = [] + for (const item of this.token.actor.items) { + this.spawnMutation.embedded.Item[item.name] = + this.token.actor.getEmbeddedDocument('Item', item.id) + if (item.type === 'skill') { + effectChanges.push({ + key: `@Skill{${item.name}}[system.die.sides]`, + mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, + value: '-2', + priority: 0 + }) + } + } + this.spawnMutation.embedded.ActiveEffect['Mirror Self'] = + shim.createEffectDocument(this.ICON, 'Mirror Self', + this.durationRounds, effectChanges) + } } const PowerClasses = { diff --git a/scripts/shim.js b/scripts/shim.js index 26c7e8c..03d601b 100644 --- a/scripts/shim.js +++ b/scripts/shim.js @@ -41,6 +41,10 @@ export class shim { return game.actors } + static mergeObject (...args) { + return mergeObject(...args) + } + static getStatus (label, name, favorite = true) { const effect = JSON.parse(JSON.stringify( CONFIG.statusEffects.find(se => se.label === label))) From e35046cecb54ae6c73968b287f0a4c7af9909f42 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sun, 10 Sep 2023 22:19:22 -0500 Subject: [PATCH 18/20] working summon --- scripts/powerEffects.js | 63 ++++++++++++++++++++++------------------- scripts/shim.js | 4 +++ 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/scripts/powerEffects.js b/scripts/powerEffects.js index 3b4ce12..1c99bb0 100644 --- a/scripts/powerEffects.js +++ b/scripts/powerEffects.js @@ -728,6 +728,10 @@ class SummonAllyEffect extends SummonEffect { return `${super.actorFolder}/Summon Ally` } + get mirrorFolder () { + return `${super.actorFolder}/Mirror Selves` + } + async prepMenu () { await super.prepMenu() this.menuData.inputs = this.menuData.inputs.concat([ @@ -836,43 +840,44 @@ class SummonAllyEffect extends SummonEffect { if (this.actor.name !== 'Mirror Self') { return } + const actorFolder = shim.getActorFolderByPath(this.mirrorFolder) + const oldActor = actorFolder.contents.find(a => a.name === `Mirror ${this.token.name}`) + if (oldActor) { + await oldActor.delete() + } const actorDoc = this.token.actor.clone({ + type: 'npc', + name: `Mirror ${this.token.actor.name}`, + folder: actorFolder.id, 'system.wildcard': false, 'system.fatigue.value': 0, 'system.wounds.value': 0, 'system.wounds.max': 0, 'system.bennies.max': 0, - 'system.bennies.value': 0 + 'system.bennies.value': 0, + 'prototypeToken.actorLink': false, + 'prototypeToken.name': `Mirror ${this.token.name}`, + 'prototypeToken.texture.scaleX': this.token.document.texture.scaleX * -1 }) - await shim.mergeObject( - this.spawnMutation.actor, { - name: `Mirrored ${this.token.actor.name}`, - img: this.token.actor.img, - system: actorDoc.system - }, { inplace: true, recursive: true } - ) - await shim.mergeObject( - this.spawnMutation.token, { - actorLink: false, - disposition: this.token.document.disposition, - light: this.token.document.light, - sight: this.token.document.sight, - name: `Mirrored ${this.token.name}`, - texture: this.token.document.texture - }, { inplace: true, recursive: true }) - this.spawnMutation.token.texture.scaleX = -1 * this.token.document.texture.scaleX + const mirrorActor = this.actor + this.actor = await shim.Actor.create(actorDoc) + this.actorId = this.actor.id + this.icon = this.actor.prototypeToken.texture.src + this.protoDoc = await this.actor.getTokenDocument() + this.spawnOptions.crosshairs.icon = this.icon + for (const mirrorItem of mirrorActor.items) { + this.spawnMutation.embedded.Item[mirrorItem.name] = + mirrorActor.getEmbeddedDocument('Item', mirrorItem.id) + } + this.spawnMutation.embedded.Item['Summon Ally'] = CONST.WARPGATE.DELETE const effectChanges = [] - for (const item of this.token.actor.items) { - this.spawnMutation.embedded.Item[item.name] = - this.token.actor.getEmbeddedDocument('Item', item.id) - if (item.type === 'skill') { - effectChanges.push({ - key: `@Skill{${item.name}}[system.die.sides]`, - mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, - value: '-2', - priority: 0 - }) - } + for (const item of this.token.actor.items.filter(i => i.type === 'skill')) { + effectChanges.push({ + key: `@Skill{${item.name}}[system.die.sides]`, + mode: CONST.FOUNDRY.ACTIVE_EFFECT_MODES.ADD, + value: '-2', + priority: 0 + }) } this.spawnMutation.embedded.ActiveEffect['Mirror Self'] = shim.createEffectDocument(this.ICON, 'Mirror Self', diff --git a/scripts/shim.js b/scripts/shim.js index 03d601b..b2d4adc 100644 --- a/scripts/shim.js +++ b/scripts/shim.js @@ -17,6 +17,10 @@ export class shim { return ActiveEffect } + static get Actor () { + return Actor + } + static get folders () { return game.folders } From 208fbb9defc784f9013e1538208aa00f358565a3 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Sun, 10 Sep 2023 22:57:44 -0500 Subject: [PATCH 19/20] update packs with new game information --- packs/common-actions/000060.ldb | Bin 0 -> 4312 bytes packs/common-actions/CURRENT | 1 + packs/common-actions/LOCK | 0 packs/common-actions/LOG | 8 ++++ packs/common-actions/LOG.old | 8 ++++ packs/common-actions/MANIFEST-000093 | Bin 0 -> 168 bytes packs/effect-macros/000097.ldb | Bin 0 -> 2931 bytes packs/effect-macros/CURRENT | 1 + packs/effect-macros/LOCK | 0 packs/effect-macros/LOG | 15 ++++++++ packs/effect-macros/LOG.old | 8 ++++ packs/effect-macros/MANIFEST-000093 | Bin 0 -> 371 bytes packs/helper-macros/000005.ldb | Bin 0 -> 1376 bytes packs/helper-macros/000059.ldb | Bin 0 -> 798 bytes packs/helper-macros/CURRENT | 1 + packs/helper-macros/LOCK | 0 packs/helper-macros/LOG | 8 ++++ packs/helper-macros/LOG.old | 8 ++++ packs/helper-macros/MANIFEST-000092 | Bin 0 -> 207 bytes packs/module-docs/000096.ldb | Bin 0 -> 2537 bytes packs/module-docs/CURRENT | 1 + packs/module-docs/LOCK | 0 packs/module-docs/LOG | 15 ++++++++ packs/module-docs/LOG.old | 8 ++++ packs/module-docs/MANIFEST-000092 | Bin 0 -> 434 bytes scripts/powerEffects.js | 54 +++++++++++++++++++++++---- 26 files changed, 129 insertions(+), 7 deletions(-) create mode 100644 packs/common-actions/000060.ldb create mode 100644 packs/common-actions/CURRENT create mode 100644 packs/common-actions/LOCK create mode 100644 packs/common-actions/LOG create mode 100644 packs/common-actions/LOG.old create mode 100644 packs/common-actions/MANIFEST-000093 create mode 100644 packs/effect-macros/000097.ldb create mode 100644 packs/effect-macros/CURRENT create mode 100644 packs/effect-macros/LOCK create mode 100644 packs/effect-macros/LOG create mode 100644 packs/effect-macros/LOG.old create mode 100644 packs/effect-macros/MANIFEST-000093 create mode 100644 packs/helper-macros/000005.ldb create mode 100644 packs/helper-macros/000059.ldb create mode 100644 packs/helper-macros/CURRENT create mode 100644 packs/helper-macros/LOCK create mode 100644 packs/helper-macros/LOG create mode 100644 packs/helper-macros/LOG.old create mode 100644 packs/helper-macros/MANIFEST-000092 create mode 100644 packs/module-docs/000096.ldb create mode 100644 packs/module-docs/CURRENT create mode 100644 packs/module-docs/LOCK create mode 100644 packs/module-docs/LOG create mode 100644 packs/module-docs/LOG.old create mode 100644 packs/module-docs/MANIFEST-000092 diff --git a/packs/common-actions/000060.ldb b/packs/common-actions/000060.ldb new file mode 100644 index 0000000000000000000000000000000000000000..00b2b7f8b4021a0b566bc7047eb77556876b7f19 GIT binary patch literal 4312 zcmb7{du$u^0mtu0eNLP>juY&X6bI~Uqb7~*`27eW)N!2Hjh(p8!%5q;J^Rk~#pgTc z?rg^iK~1N06xLF8yjq~FXerRg2GZCVtdoL(KbQ)%QpaGE7^;dY5Uen?!OF~jb{ZOJ zOULPc$vu5{zsKkE{XNqpAh#cvX()kA@fy>(tDp2bH}-Cv7|+CA0;oq&FgT4dc#6c@ zupSOir)d(?VnRL*YA*Wms6ep{+^14;c%F)~4ByHpDVpY6QzT82tr-UAQY4{EXP9V0 z7o&JVpCcn_cnhEB;WM$eX^bHGC`YBy-sjq|_H;*kD=g`b^+Q9xuFY;Xl_nX2%B1vs zE*;ZFS&r0k8JgtvsJy;XQQS9}Q8{7IZ(uVVgVP>H;POE{PU;P2o)R)Rh}GdVXE3ae zqi@P7CO$STc~=Vm&w%MJ_#O-^kUV^OxQP=4C9$p<5O4t=nV!*BeFdrz4E=|s1+6R( zu!KZbPNd>WX}w2VeDM*F+vE!e3_!YdGeG^CwVJ-V{w&FH6rthOE+Ija0u|+JR7%3n zu`#TT$UK&iY_|C5^rXJ+7|V|bS3U@yYjVmQr{ zTFkfG4{LQGhZCea(5Z$EnPM5WYcB5kTouIyGR|^&(AbV=VNnPlH(bH?bg>IDxRWACQ1?^C4#s*^oX2H zrG>mQprH659!*+nn<(B5`*bFSM`-8Ta*7|QiYS}FAq7de;P*%l%eTSy<_{kfwHYw84<%9w90(eWBV>x}7}hkl~u1I?QO$o18{hE!tFH zFE{B;daGs{7{FNb>xd6*AN0Y|p&#z*O>|B63$Y$%lVAxOFtA^=jX&Y9nnYV`raGdC z+^je1E#3POxlwO6IKVBi1HsBA2C0Q#8jLoZ-Qh4h%vOuh_RxA|LzmNRcRC$L3p}pH zXq*=U&(@2GPS-#?Kg_zbokPYXlNy;~M@jIGG{(}zVaJJ45zG19qHPrTpu<$Q1)C|W zJ1(;)+!=Rgn2Gm~M(kaIPH@Zlo=$I>R^2p6G6Eij1GM?TD}}+b@2y`AN?S~rmK!cB zcz?wDM{n8IbK>^?V6W2^6o@G0OgL$wZ^2Oz%I*`&L^E3WbN}&{$qjb1-2k^g@WOZf z!0Z2{qPL&&^MS6IDPT+3aAPk}wt36e^pOH=pd`e=!*`V>cs5GmbSpunX*PvN^ST7i z5PSkplKNc_$byi^Ks%w=}*_V>Gdu1jqf;M0uRTg&3^t)xMY(C*N(@syrkvbnEP$`P2 zeWQBUGf0~rDI7(%9!2myh11fj*Mp~}?IUbBK^XJVI6GuvqEsASwfD5N&T2B*%|^$j z(^3U&W~0Sk*o_|E-NB=4uo(m{pjeLFbl2Fw*Fx$)P=1;EeVO6lgeUJK?Y;O$Z$o%Sy`+ku5Y?e&H_HTtlFH-_F!@w%m#W_5GUGA3@QX>BikzZ24 zBK?b-m*Icw55fOe?Thdyvp5f3H8$;$NJeIgj=2W=jmz2pd5QfOuET!6VMG|R_6C4d z9|CLCO|CdaQ$oJkxkUjH4oR(P)C9k^L8hvuW|btlT?hL=`>g`#RM*+`9fau1(;nw5O#HWmZR1q{sj+za0#|W8h@X*7$kQIx0>GX;#MQO zA#R^4;DGcu7)45$V??9rlLel zOfv|17;pqGpvP+ZB-`rki$K)4A++?dtEq_p6jIS{F&Lc|o6Tf4T2C!e(QY-{O}5Ka zZ2lBdQFGubDrz1rQPEWuXonAI-VLd!QFbUrB`Th;+~j0@?j#;cPUQnhg5$u=bL$SY zNP|Tczsao=(WOiTbw<*JE<&@>q%MN<3AmYoq**7zUqadoM$t~ANRfv3j7@{Hg%;7n zEh1GeH|aCmyI9vpds@JZGcxzHj!Q~l4>!6!Y}x$L>x&ao(L3! z0c-8dg}Ob4hC_Az=`_oeYTG;#c};ZY2r~YvXpI&dh?1ev_;|44=SXPYEmsFQmYH2R z^+M!9M70!TX5Tn+2N-_{nMFHC(dPcc*z8E52mP=ImGU_%rO_@qx8jO(7gj1@H287W zJ)2x^-FJ6f!@8nv+2{8n(71)O=zV8VMEe@5(Kf$6f9ADVyO8M(af#f3bEwzn8P0hM zKzt7nHx*3?wP!Y(om+ue?r<24R(NUwbbO310RMbtH0n=}Ot`v&w(db68^{BB8xR}9 zP!ej$eszdtQwLsTD#XH7vdA!S;OlUjrf?>@t4gfM&>ihGbwnoKLK1P9RK2F;NX9x4 z_QfoTO-^Ue*tF?oWd5S4y%mfA(V=m%WJ|j#?10VdiN>9Lf{e%G4O?J@V{=5qSb1xP zF6^w>wX;Gs?9C+-Aw#F@)ze{V(J{5MO6UCCH!uN8%GcdpQB+K$ZJQV|ZJ4UCZ4nO# z#j0?(!`v707;TRrueb5aaFi3eQmlltf(XYZNk+$VI1}IX2lUVgT6?Y<(aVlj$y%yJ#azGl zpVbI~zNH$Q?(z+|LV@`_f)zfizUQ-Q6%$H0No%tIiNACVgUACFh1HcEt1G8YiOL}e z3wtU)+*6_XlV(jvSkgY>cZ>%%xy=J6TRP($9g>}p6)s5byC5kBhm+OZ$?7^M%t~g9 zsrE_9C%3hotd^UsR;#mcX$5|%IVh72nd0rk|eL=OO?e(VK@+Q?nVNIPx#(k1|+mN zy=*o!T{7APoYB~>IiH!>DCAQvYY<3He?#iv1O^7VWc@ib1df3}FS!g{Qgu`DgaEx> zbE}ftQL>q7*{o)1nzJM_$>UchHLI^PS&*y^UTd-t)hM;g6$To&U*BNP?;7m?oiH@U zmSQ{l0=T0T+ck-%#iRi}glVmB!{`o_kb_e?eKBiM=7J;k>#7?%iMsU)pj1noQ4M{|Ck9Py_$~ literal 0 HcmV?d00001 diff --git a/packs/common-actions/CURRENT b/packs/common-actions/CURRENT new file mode 100644 index 0000000..f60e23b --- /dev/null +++ b/packs/common-actions/CURRENT @@ -0,0 +1 @@ +MANIFEST-000093 diff --git a/packs/common-actions/LOCK b/packs/common-actions/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/packs/common-actions/LOG b/packs/common-actions/LOG new file mode 100644 index 0000000..d387200 --- /dev/null +++ b/packs/common-actions/LOG @@ -0,0 +1,8 @@ +2023/09/10-09:15:57.495301 7fc4427fc700 Recovering log #91 +2023/09/10-09:15:57.536628 7fc4427fc700 Delete type=0 #91 +2023/09/10-09:15:57.536656 7fc4427fc700 Delete type=3 #89 +2023/09/10-22:54:31.992405 7fc441b3b700 Level-0 table #96: started +2023/09/10-22:54:31.992425 7fc441b3b700 Level-0 table #96: 0 bytes OK +2023/09/10-22:54:31.999139 7fc441b3b700 Delete type=0 #94 +2023/09/10-22:54:31.999290 7fc441b3b700 Manual compaction at level-0 from '!items!2jAOeH9QKQqjugAt' @ 72057594037927935 : 1 .. '!items!nQHHXfEN7Ey2iWIM' @ 0 : 0; will stop at (end) +2023/09/10-22:54:32.006620 7fc441b3b700 Manual compaction at level-1 from '!items!2jAOeH9QKQqjugAt' @ 72057594037927935 : 1 .. '!items!nQHHXfEN7Ey2iWIM' @ 0 : 0; will stop at (end) diff --git a/packs/common-actions/LOG.old b/packs/common-actions/LOG.old new file mode 100644 index 0000000..af974a4 --- /dev/null +++ b/packs/common-actions/LOG.old @@ -0,0 +1,8 @@ +2023/09/09-23:23:04.947886 7fc442ffd700 Recovering log #87 +2023/09/09-23:23:04.986132 7fc442ffd700 Delete type=3 #85 +2023/09/09-23:23:04.986170 7fc442ffd700 Delete type=0 #87 +2023/09/10-01:07:03.948089 7fc441b3b700 Level-0 table #92: started +2023/09/10-01:07:03.948109 7fc441b3b700 Level-0 table #92: 0 bytes OK +2023/09/10-01:07:03.956567 7fc441b3b700 Delete type=0 #90 +2023/09/10-01:07:03.956693 7fc441b3b700 Manual compaction at level-0 from '!items!2jAOeH9QKQqjugAt' @ 72057594037927935 : 1 .. '!items!nQHHXfEN7Ey2iWIM' @ 0 : 0; will stop at (end) +2023/09/10-01:07:03.983281 7fc441b3b700 Manual compaction at level-1 from '!items!2jAOeH9QKQqjugAt' @ 72057594037927935 : 1 .. '!items!nQHHXfEN7Ey2iWIM' @ 0 : 0; will stop at (end) diff --git a/packs/common-actions/MANIFEST-000093 b/packs/common-actions/MANIFEST-000093 new file mode 100644 index 0000000000000000000000000000000000000000..ef8ab0553cc5a85f92525d1f0dbb62348915432c GIT binary patch literal 168 zcmWe((dBApU}TiaNi9pwNlDUksw_z@&n!-L&d)7KEJ`fNFJfhsSIjI)%`H~U3-s`a zNOScwcdaza4EOY9lwtq_b|#w}iZDe+S&sgx9+rXLfrVM6>5e6gk`P5Oc??6OA@cft dr#5jgFfzq)GBC%pNSo$eDhF}nf!stEX#go1Dlh;5 literal 0 HcmV?d00001 diff --git a/packs/effect-macros/000097.ldb b/packs/effect-macros/000097.ldb new file mode 100644 index 0000000000000000000000000000000000000000..b3e18a182d627009cc238188fa5f4d0683ec5bd2 GIT binary patch literal 2931 zcmai$eQX=$9mnr^a&hcBDQ@euNoZHwq#{Ljd@sH`pA)>=d9j_^dA0L0b%C>eb}l*J zxp!wLF3SW%ASj@*f`XPxWiY{B{y?a#nUu1zvX$4Vo4T=40o_zFX`5&SNNh+?f2 zB-mh&o=3XhJ&zwhzu)uweZKcY&o?mlv(Q~o<-Dlr?j>s5xUH$GR7b{f;EC) z+~HA#lIRI}CZ;0&1FlrmHBcysIm49_a+<1pydGWE3`r@XB?7VvjiX(jkW!Ilug9pB zL2skigqF(G9@>&HFuiO*h0+0wf&z zqL3FsxN%SKBs!s_DrgV7o9qsFKnmBy_PtJ$?52qz*tcI31w+iICGh4b$?|~!5ugZ? zWCC7KNzF?IDSQC)a#Vm}ydGK5jZ}-f9Ic`4^hvd^8qJUkN@@CpIwN|Pm%+i4cr; zGKGnm%J_Jao+)c+N-EU@B;`~^_v_W7U$Px_%3?Qqbnn4)>Y)?PqO4{G8GPhaOC>?c zgL7^+n2N?lxr|)zE~|^8cKG*%-gU<@#pN>81yS)f?&ue^qG;$LR}o!OcSRSq?v_1` z2O}NUkn85|modl9$CTy6ktXvzICUO$aY2$roeq-Z?0MiIX_ny8d(4}9Jp5AtE~VZm zoQHEHL6a1Ule(y&zn+uI=zctTu^?3B#Fgl;!0jP=dD*t_EFL+Y7>q}9(@c6iKMj(__>=CZ9j>${NRf`x)Qh*ku98rca(-DVh<@Q`M|7W9%A(DE$m>O4O_V`X zSGl5UsljGNz{Ccf-L*88uETDV?Kz_KZx)8v)KdJdtfJuT_8Yl6v@x_KnF>(40pB% zhJOuCZJHEAyw(Gg-^0;)i#a`5GxWaX=(I?Jo=^|$ny8dYs^W?$Qt9G&_z3*lJK-3H zd%QF8sK1GQ#gd47^;#*b%DTTK=nLO@)S+tV+~%YB?IevpG>ER&>9u3BOGTM#l{{Q^V&qyz#9}N5?;{ z4ph9FxU<3P)YXcX6L&weV|SxH-c81ozH*tY&JR>_#o^e3XL)DM3Z65s?wGu~qm$#9 zKrk5OIU;*?hXYk+fIWK}55EsqPU8-O;DXe=vtj%u8#?n-czh-;6^yYdqP(~`G8T)2 zK71{*5=WyshH&8KNL}cld4Q z9Gstn?eB(5(2T%uMqnF@IKWW!g%>6dwltF{XlrjlI|;sdP&qIz2wsuB`tGH zbOoZ!neTzESIrPy51|Yqf)q^$7>=5qLwCuumKDyN0qC8=|{_6?tdAho5;5zw0+`G@?O} z=d=?SIJ}HlMewJa6gbSehWY z03YPCzXi>K0MDMi2M_-atlon+lMGA0bPt~VxIyIO)nv*L`WLC=<=j9JkfA7aL}f|I z58Vpy^}^J?W+dua(4VqKE6{9*^X;(ldD98kotvt`a4f}f^sE!97tPSrStkrX1y-F9 zNtY9j+V*`H7pLjCTB9;cDiakmec-F1J@EQJ92q4q3d1+TS0BT~Pz<~Fm}U37R=g&f z2kci5*r^RHlR9dpWW~+|(thB|#Ni*k{g7gtIcBM^Xhp-0U3!PU3G*}*B-ub8LWojG46@zP3bG|7DywQ~ zaC3@!uJtS1`(omCXAIlbu+7*M`1e-B&e$; 2931 bytes +2023/09/10-22:54:31.992296 7fc441b3b700 compacted to: files[ 0 0 1 0 0 0 0 ] +2023/09/10-22:54:31.992328 7fc441b3b700 Delete type=2 #96 +2023/09/10-22:54:31.992362 7fc441b3b700 Delete type=2 #60 +2023/09/10-22:54:31.999275 7fc441b3b700 Manual compaction at level-1 from '!macros!yG1ZQO30ZlntYJp7' @ 30 : 0 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at (end) diff --git a/packs/effect-macros/LOG.old b/packs/effect-macros/LOG.old new file mode 100644 index 0000000..7d48dc3 --- /dev/null +++ b/packs/effect-macros/LOG.old @@ -0,0 +1,8 @@ +2023/09/09-23:23:04.905935 7fc442ffd700 Recovering log #87 +2023/09/09-23:23:04.946402 7fc442ffd700 Delete type=3 #85 +2023/09/09-23:23:04.946439 7fc442ffd700 Delete type=0 #87 +2023/09/10-01:07:03.930401 7fc441b3b700 Level-0 table #92: started +2023/09/10-01:07:03.930420 7fc441b3b700 Level-0 table #92: 0 bytes OK +2023/09/10-01:07:03.939308 7fc441b3b700 Delete type=0 #90 +2023/09/10-01:07:03.956611 7fc441b3b700 Manual compaction at level-0 from '!macros!11GOryzx2Q8MXbT6' @ 72057594037927935 : 1 .. '!macros!yG1ZQO30ZlntYJp7' @ 0 : 0; will stop at (end) +2023/09/10-01:07:03.956718 7fc441b3b700 Manual compaction at level-1 from '!macros!11GOryzx2Q8MXbT6' @ 72057594037927935 : 1 .. '!macros!yG1ZQO30ZlntYJp7' @ 0 : 0; will stop at (end) diff --git a/packs/effect-macros/MANIFEST-000093 b/packs/effect-macros/MANIFEST-000093 new file mode 100644 index 0000000000000000000000000000000000000000..eb5f4c0cb23c68ebc35037ad0d6857747d90b8bb GIT binary patch literal 371 zcmY#7(CN{}z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&P9&pqQJOT$Ep|Xq;E& z;#!!T;TC3L>g8^b!zjQ22JB2WhYI1U3=Q4=iz=%si~=ouBa%YQ7#Sg|;0h|;4Wk16 zjSZr5@=7AT3d|Y#AqukNcRk`@U}TEpWMGbG5oC;;e>DKejR$fQSsd6I6XqExDyHS< zq@)%VD^{ci`x)nZdiom|So(&RxG_2qu!TVmqM$KI_(z8wZ737W#%*Fxo=w2LRq5UO)f< literal 0 HcmV?d00001 diff --git a/packs/helper-macros/000005.ldb b/packs/helper-macros/000005.ldb new file mode 100644 index 0000000000000000000000000000000000000000..f0a41fbd14b67a5119efc8889c4efbbffd95a273 GIT binary patch literal 1376 zcmaJ>-)|c=9JjUH=&kA0ZY^}uvbm>3Nmz1C(zR=|CafK58Ee`9?URu*}C%8NTYljZBHYZU<@u%N%|a2yh+>dXt~qjjM%Q%=Frod^#7 z7AjBDNSis1^_GxkTTGsv-w4*O#H*_dV^<<+)@ax=3)B-_jd~&sg->aIa&6 zl&fOIFy%$1v3I@LGRcY^!kE}`cStibD9RI-LMvDl3rz#+VNJ~yTq32Ax$H6{SP`TMBc4V=B8_Fs)Pn7|Ko-uQZtw=j zs>3}L#N2~VSrnjwm+aMiSV;(VO{${qltFbzfr zN`p<|cj{TVY2WP+LcJ8h`|xf?`v`@U(=ZM%a7|i7K22Lxt12oN;Kb00o;iuFKL$>M z%D~A4Zo}H_NdRkL4_ZU*$dqCZG51m&Hi?`QGQ>KUCA_$?mMx^-19>>n9~e?{_Swv@ zJxBz$4OB4%sP78EBfSY!vs1ve4#RT*<(F_KX#h+1(bPtgY7)YAs|;LtxTM^GGEHQT zqFTN7UCyQ4C+(#mM_s%>oHu{6Sk4cq4D37r)ub0{->m0Pw(1y;Em*-;cetk_;{BdH^@&}4?w;z)jz6b{TjS% zZMbUyWH)-j=+)%urzvKlW$;B9>D=OD#|<0_dg(vc+HU7fHf(b!gLy@QJQk z#SSM@ZPCc7?m9jRaLlw*Eft*ER}<;#*j~X27;Y(e3Soa6bC3ANn-Ag9Ng4AQHNWUo z17kZa~b?_{--v6zLkyF^5Sz5>l^;Sb79bHFkt#U2CWv?31GLTg*sN6LoJ0 zsLbtw6mVYtbU~8mOi4!3W@EYJR;J2Mp)YsrSbxQ>xZ^PF@r1MpP?i7};1*cC_tBQi zmS)=GVyV;~Us;)Ju0P}KndF^jc{JH+d!L+jnOoQDX+`7H641fjBL2$4ewN38@AH4g`Ja7&?5|6R{Her6#osEr{ zD4%6QgmeGts`9;kq{M^9da=%ke%eY_d?zW2Rv=FPl2aUV$Q zfvBw;E@jc&-C9mn%U2TV802B-NHtkHS8iK zEbi7E6l2)JBvvH4QHfQtQ&H-uSmkZZpjF}VltpM!Cmb8pwspr8P`a+0Xg)uSNENwE zsR~=6SMq4H;7F23E69NvSd9Dxtnzx!|qE`pAP*YSTA?^oUG;}hes){zA76yi0qQ>;l2hr4Nf{EIdGn!YAm50do!%6LZGeT1>99|D8Q?GeE7BS|wjBt} zoNh}#o@811rf8TD~ zFC3I69*N;jSH}xX>=wR)Za)qKGw(d_`#kf!yRiCc6#eIt=#&$9HZh~4)pWUg(am zhLzpP?qo(wNKYh&rY4I9&a{qTNcZ%;zA9D|iub~Q@% zrMkN}W)hl7xIY?-?is8>w195gGG5xfFW9wfd(S@C(}W9%2|pUVfi6J;j%iR&%i4iy zCIG$XYuQvnbE-C=sW5jjCxezqVER(q;3UG?p4nMB^_R9}tTOmR0VQ+Of+%ES=S4IV zvcz;s5KtohZtHNVM2kMoT$BBp8~wP|r$>A!rt&^wxetVJLi3q#c3d|qPF2hLUO)jf zou;OiO+%TOMalveXA{a}2>?)XJc|IZboAvp+ov`>Y6EU=Plb9EGmagbV%LL3UJX;_ z6=dn-LwM8pcz)=~&5q?#+hBo}jNMOkT7}LEHC@OpsmQ2P>JoWU`sk^oJ{9QcbY*An z#_?@Cs^-?onK7qIJ*@nFE5~`D3hPB5$eG1{h4{jAPgs=LKK314pg7>vz=UIhU7=rW z=b;x7k$NvBVIi(E)5Ik39Y}x`iD}lb?f4YJ0P@AS4CcUEVbyjBQt})N6C0wrF3cph zphP?eQUmH6|M3zl!Sr?xdr})S%QdM5#h^wKLn&|>gxg6<(aSQk%gSpAk6sFUfXbuE zUL?II8wL|T6NxGPMx3T0Ch~-IT-e#zBt0s;KEz=6Lf`{9%w1Y!#N4qK#UX_ft~mif zjAm5GJQ2-^Snp^I!*tzd(UqGV8|v@jJvN?ivpy7bl5sRvRh4IEitrcK^2L+`DMG;-$zcTm0@rgnwcMZF@|u-`Z;+ip=mCpw<+M_dARQw~(e z;wq<@O5+G8Z!gJD#X*v|T7k+3oV0|wV^K`>Dn#E2f9Kl1`cQm2+fKW%qvb{8u^PU zP=bd6q+x+)3CF`OcwL3e7ZAU3Q^dueg;fw|dt+hUF3Oq70PsNLWV{`d0*w3`jz@2b z#Qx<&367~%poRe|V!A34zwsf|k@;2V3w4p2kzWYXijD^`_UPe&LFS$LS2u+@^#eCc zFNYm7H(;{peMGW#bsI;S=Ybe@Q*)Z~1KQ4+NE`^OfUOPRLWInT9RKw>{R^3Ju7A3$ z%KQp$8x%`evQU>WC5RC>M{K-fY_p>Ge}8p1$SHq=9EwfD8EI;gb>++}>B-1uP&t@X zv44`TX?!p;LWu`@T`RvU7t8j}{#ZPAH_=A~0{RNMBUuBa`#xxTaFBe%k!T4M5r%ahm8f$mXi%_?^@!@Bd^;+qc3cla(v}#7-nKyX9W=PFtqXQ-|=vr!olR?qRjyOw(h3 zkimAcYr%9eI0iYkROW#=G4_dyi~oJ6Q#u=1$Uj=vJD^APn=g#XT$yaHFrV{U#r{BhmgJeOI6ygy%N0qPM!`a&B$8mhnBw`Qo^|tq29&cgV|XGm#}zeCa!kQ4Gz7D&?@19#kUIF z^=ND4jiX4bD=`ylpZunu8-?Ux0ApqknvP?QeDkUMc2m>hs>N97-ofh}DRr9g@Bd!t g!~cDwbu+*JyeW06dBx()|9|cM*WB@S!InG!0mZ=)lK=n! literal 0 HcmV?d00001 diff --git a/packs/module-docs/CURRENT b/packs/module-docs/CURRENT new file mode 100644 index 0000000..5b83d76 --- /dev/null +++ b/packs/module-docs/CURRENT @@ -0,0 +1 @@ +MANIFEST-000092 diff --git a/packs/module-docs/LOCK b/packs/module-docs/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/packs/module-docs/LOG b/packs/module-docs/LOG new file mode 100644 index 0000000..43fe456 --- /dev/null +++ b/packs/module-docs/LOG @@ -0,0 +1,15 @@ +2023/09/10-09:15:57.422391 7fc443fff700 Recovering log #90 +2023/09/10-09:15:57.460369 7fc443fff700 Delete type=0 #90 +2023/09/10-09:15:57.460392 7fc443fff700 Delete type=3 #88 +2023/09/10-22:54:31.953241 7fc441b3b700 Level-0 table #95: started +2023/09/10-22:54:31.956096 7fc441b3b700 Level-0 table #95: 22051 bytes OK +2023/09/10-22:54:31.959002 7fc441b3b700 Delete type=0 #93 +2023/09/10-22:54:31.974981 7fc441b3b700 Manual compaction at level-0 from '!journal!Mw1g2Fx5dp4SoqVP' @ 72057594037927935 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at (end) +2023/09/10-22:54:31.980598 7fc441b3b700 Manual compaction at level-1 from '!journal!Mw1g2Fx5dp4SoqVP' @ 72057594037927935 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 3 : 1 +2023/09/10-22:54:31.980606 7fc441b3b700 Compacting 1@1 + 1@2 files +2023/09/10-22:54:31.983098 7fc441b3b700 Generated table #96@1: 2 keys, 2537 bytes +2023/09/10-22:54:31.983111 7fc441b3b700 Compacted 1@1 + 1@2 files => 2537 bytes +2023/09/10-22:54:31.985952 7fc441b3b700 compacted to: files[ 0 0 1 0 0 0 0 ] +2023/09/10-22:54:31.986001 7fc441b3b700 Delete type=2 #5 +2023/09/10-22:54:31.986048 7fc441b3b700 Delete type=2 #95 +2023/09/10-22:54:31.999197 7fc441b3b700 Manual compaction at level-1 from '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 3 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at (end) diff --git a/packs/module-docs/LOG.old b/packs/module-docs/LOG.old new file mode 100644 index 0000000..5a05a1d --- /dev/null +++ b/packs/module-docs/LOG.old @@ -0,0 +1,8 @@ +2023/09/09-23:23:04.872878 7fc4437fe700 Recovering log #86 +2023/09/09-23:23:04.909922 7fc4437fe700 Delete type=0 #86 +2023/09/09-23:23:04.909943 7fc4437fe700 Delete type=3 #84 +2023/09/10-01:07:03.922079 7fc441b3b700 Level-0 table #91: started +2023/09/10-01:07:03.922101 7fc441b3b700 Level-0 table #91: 0 bytes OK +2023/09/10-01:07:03.930291 7fc441b3b700 Delete type=0 #89 +2023/09/10-01:07:03.939365 7fc441b3b700 Manual compaction at level-0 from '!journal!Mw1g2Fx5dp4SoqVP' @ 72057594037927935 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at (end) +2023/09/10-01:07:03.956638 7fc441b3b700 Manual compaction at level-1 from '!journal!Mw1g2Fx5dp4SoqVP' @ 72057594037927935 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at (end) diff --git a/packs/module-docs/MANIFEST-000092 b/packs/module-docs/MANIFEST-000092 new file mode 100644 index 0000000000000000000000000000000000000000..7ecae3d4d505e76092de748e76eb0d1e2dc79c33 GIT binary patch literal 434 zcmWG)>CdTQU}TiaNi9pwNlDUksw_z@&n!-L&d)7KEJ`fNFJfn6eaNAxn3Z2zl$V&J z=v!`>Zsb;Bno?jAoL?9gz{tb^1{N?CdIgE;sl^!T^fHYN3v-L3@;u!$vdSEdycroG z8t)lh=;UBvWQyfvV2)#9>JjP@%LH=cfZPNYGj_)K#cLSxSZ_wI^~?~BG7mzgtc2Q^ f$YRFINV-R$Cb2QbvoW! Date: Sun, 10 Sep 2023 23:09:13 -0500 Subject: [PATCH 20/20] update module version --- module.json | 18 ++++++++++++-- packs/common-actions/CURRENT | 2 +- packs/common-actions/LOG | 16 ++++++------ packs/common-actions/LOG.old | 11 +++------ .../{MANIFEST-000093 => MANIFEST-000103} | Bin 168 -> 168 bytes packs/effect-macros/CURRENT | 2 +- packs/effect-macros/LOG | 23 ++++++------------ packs/effect-macros/LOG.old | 11 +++------ packs/effect-macros/MANIFEST-000093 | Bin 371 -> 0 bytes packs/effect-macros/MANIFEST-000104 | Bin 0 -> 172 bytes packs/helper-macros/CURRENT | 2 +- packs/helper-macros/LOG | 16 ++++++------ packs/helper-macros/LOG.old | 11 +++------ .../{MANIFEST-000092 => MANIFEST-000102} | Bin 207 -> 207 bytes packs/module-docs/CURRENT | 2 +- packs/module-docs/LOG | 23 ++++++------------ packs/module-docs/LOG.old | 11 +++------ packs/module-docs/MANIFEST-000092 | Bin 434 -> 0 bytes packs/module-docs/MANIFEST-000103 | Bin 0 -> 220 bytes 19 files changed, 64 insertions(+), 84 deletions(-) rename packs/common-actions/{MANIFEST-000093 => MANIFEST-000103} (78%) delete mode 100644 packs/effect-macros/MANIFEST-000093 create mode 100644 packs/effect-macros/MANIFEST-000104 rename packs/helper-macros/{MANIFEST-000092 => MANIFEST-000102} (84%) delete mode 100644 packs/module-docs/MANIFEST-000092 create mode 100644 packs/module-docs/MANIFEST-000103 diff --git a/module.json b/module.json index adecb8a..62d33b7 100644 --- a/module.json +++ b/module.json @@ -2,7 +2,7 @@ "id": "swade-mb-helpers", "title": "SWADE Helpers (MB)", "description": "Mike's collection of swade helpers", - "version": "1.1.0", + "version": "1.2.0", "authors": [ { "name": "Mike" @@ -61,6 +61,20 @@ } } ], + "packFolders": [ + { + "name": "Swade MB Helpers", + "sorting": "m", + "color": "#008080", + "folders": [], + "packs": [ + "module-docs", + "effect-macros", + "helper-macros", + "Common Actions" + ] + } + ], "relationships": { "systems": [ { @@ -99,4 +113,4 @@ "download": "https://git.bloy.org/foundryvtt/swade-mb-helpers/archive/main.zip", "license": "./LICENSE", "readme": "./README.md" -} \ No newline at end of file +} diff --git a/packs/common-actions/CURRENT b/packs/common-actions/CURRENT index f60e23b..1fb45e8 100644 --- a/packs/common-actions/CURRENT +++ b/packs/common-actions/CURRENT @@ -1 +1 @@ -MANIFEST-000093 +MANIFEST-000103 diff --git a/packs/common-actions/LOG b/packs/common-actions/LOG index d387200..09dcc00 100644 --- a/packs/common-actions/LOG +++ b/packs/common-actions/LOG @@ -1,8 +1,8 @@ -2023/09/10-09:15:57.495301 7fc4427fc700 Recovering log #91 -2023/09/10-09:15:57.536628 7fc4427fc700 Delete type=0 #91 -2023/09/10-09:15:57.536656 7fc4427fc700 Delete type=3 #89 -2023/09/10-22:54:31.992405 7fc441b3b700 Level-0 table #96: started -2023/09/10-22:54:31.992425 7fc441b3b700 Level-0 table #96: 0 bytes OK -2023/09/10-22:54:31.999139 7fc441b3b700 Delete type=0 #94 -2023/09/10-22:54:31.999290 7fc441b3b700 Manual compaction at level-0 from '!items!2jAOeH9QKQqjugAt' @ 72057594037927935 : 1 .. '!items!nQHHXfEN7Ey2iWIM' @ 0 : 0; will stop at (end) -2023/09/10-22:54:32.006620 7fc441b3b700 Manual compaction at level-1 from '!items!2jAOeH9QKQqjugAt' @ 72057594037927935 : 1 .. '!items!nQHHXfEN7Ey2iWIM' @ 0 : 0; will stop at (end) +2023/09/10-23:06:22.613628 7febd9214700 Recovering log #102 +2023/09/10-23:06:22.626850 7febd9214700 Delete type=0 #102 +2023/09/10-23:06:22.626874 7febd9214700 Delete type=3 #101 +2023/09/10-23:07:07.251557 7febcb05d700 Level-0 table #106: started +2023/09/10-23:07:07.251576 7febcb05d700 Level-0 table #106: 0 bytes OK +2023/09/10-23:07:07.254523 7febcb05d700 Delete type=0 #104 +2023/09/10-23:07:07.257493 7febcb05d700 Manual compaction at level-0 from '!items!2jAOeH9QKQqjugAt' @ 72057594037927935 : 1 .. '!items!nQHHXfEN7Ey2iWIM' @ 0 : 0; will stop at (end) +2023/09/10-23:07:07.257579 7febcb05d700 Manual compaction at level-1 from '!items!2jAOeH9QKQqjugAt' @ 72057594037927935 : 1 .. '!items!nQHHXfEN7Ey2iWIM' @ 0 : 0; will stop at (end) diff --git a/packs/common-actions/LOG.old b/packs/common-actions/LOG.old index af974a4..d0b838c 100644 --- a/packs/common-actions/LOG.old +++ b/packs/common-actions/LOG.old @@ -1,8 +1,3 @@ -2023/09/09-23:23:04.947886 7fc442ffd700 Recovering log #87 -2023/09/09-23:23:04.986132 7fc442ffd700 Delete type=3 #85 -2023/09/09-23:23:04.986170 7fc442ffd700 Delete type=0 #87 -2023/09/10-01:07:03.948089 7fc441b3b700 Level-0 table #92: started -2023/09/10-01:07:03.948109 7fc441b3b700 Level-0 table #92: 0 bytes OK -2023/09/10-01:07:03.956567 7fc441b3b700 Delete type=0 #90 -2023/09/10-01:07:03.956693 7fc441b3b700 Manual compaction at level-0 from '!items!2jAOeH9QKQqjugAt' @ 72057594037927935 : 1 .. '!items!nQHHXfEN7Ey2iWIM' @ 0 : 0; will stop at (end) -2023/09/10-01:07:03.983281 7fc441b3b700 Manual compaction at level-1 from '!items!2jAOeH9QKQqjugAt' @ 72057594037927935 : 1 .. '!items!nQHHXfEN7Ey2iWIM' @ 0 : 0; will stop at (end) +2023/09/10-23:05:53.772370 7f36d57fa700 Recovering log #99 +2023/09/10-23:05:53.784345 7f36d57fa700 Delete type=0 #99 +2023/09/10-23:05:53.784375 7f36d57fa700 Delete type=3 #97 diff --git a/packs/common-actions/MANIFEST-000093 b/packs/common-actions/MANIFEST-000103 similarity index 78% rename from packs/common-actions/MANIFEST-000093 rename to packs/common-actions/MANIFEST-000103 index ef8ab0553cc5a85f92525d1f0dbb62348915432c..89316305a08c3f5d2311efb500f064092325911b 100644 GIT binary patch delta 37 pcmZ3%xPoy)mmE)N@;wd)My3o-2Ifo_=_BjkW`MYvKyEgRGyum#2_^sl delta 37 pcmZ3%xPoy)mz;jzsZAUVj7)Ky49xK?(x!Qr%0b+CAUBak8UV&b2$=u? diff --git a/packs/effect-macros/CURRENT b/packs/effect-macros/CURRENT index f60e23b..c8e9be6 100644 --- a/packs/effect-macros/CURRENT +++ b/packs/effect-macros/CURRENT @@ -1 +1 @@ -MANIFEST-000093 +MANIFEST-000104 diff --git a/packs/effect-macros/LOG b/packs/effect-macros/LOG index 0b4b9aa..6857cd5 100644 --- a/packs/effect-macros/LOG +++ b/packs/effect-macros/LOG @@ -1,15 +1,8 @@ -2023/09/10-09:15:57.455935 7fc4427fc700 Recovering log #91 -2023/09/10-09:15:57.493853 7fc4427fc700 Delete type=0 #91 -2023/09/10-09:15:57.493880 7fc4427fc700 Delete type=3 #89 -2023/09/10-22:54:31.968498 7fc441b3b700 Level-0 table #96: started -2023/09/10-22:54:31.971962 7fc441b3b700 Level-0 table #96: 6174 bytes OK -2023/09/10-22:54:31.974879 7fc441b3b700 Delete type=0 #94 -2023/09/10-22:54:31.980574 7fc441b3b700 Manual compaction at level-0 from '!folders!xeSN3oIIO3p9MUtF' @ 72057594037927935 : 1 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at (end) -2023/09/10-22:54:31.986133 7fc441b3b700 Manual compaction at level-1 from '!folders!xeSN3oIIO3p9MUtF' @ 72057594037927935 : 1 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at '!macros!yG1ZQO30ZlntYJp7' @ 30 : 0 -2023/09/10-22:54:31.986141 7fc441b3b700 Compacting 1@1 + 1@2 files -2023/09/10-22:54:31.989428 7fc441b3b700 Generated table #97@1: 16 keys, 2931 bytes -2023/09/10-22:54:31.989437 7fc441b3b700 Compacted 1@1 + 1@2 files => 2931 bytes -2023/09/10-22:54:31.992296 7fc441b3b700 compacted to: files[ 0 0 1 0 0 0 0 ] -2023/09/10-22:54:31.992328 7fc441b3b700 Delete type=2 #96 -2023/09/10-22:54:31.992362 7fc441b3b700 Delete type=2 #60 -2023/09/10-22:54:31.999275 7fc441b3b700 Manual compaction at level-1 from '!macros!yG1ZQO30ZlntYJp7' @ 30 : 0 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at (end) +2023/09/10-23:06:22.599116 7febd9214700 Recovering log #103 +2023/09/10-23:06:22.611701 7febd9214700 Delete type=0 #103 +2023/09/10-23:06:22.611728 7febd9214700 Delete type=3 #102 +2023/09/10-23:07:07.248454 7febcb05d700 Level-0 table #107: started +2023/09/10-23:07:07.248477 7febcb05d700 Level-0 table #107: 0 bytes OK +2023/09/10-23:07:07.251508 7febcb05d700 Delete type=0 #105 +2023/09/10-23:07:07.257465 7febcb05d700 Manual compaction at level-0 from '!folders!xeSN3oIIO3p9MUtF' @ 72057594037927935 : 1 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at (end) +2023/09/10-23:07:07.257570 7febcb05d700 Manual compaction at level-1 from '!folders!xeSN3oIIO3p9MUtF' @ 72057594037927935 : 1 .. '!macros!wU2mAUnw3RW9qMT8' @ 0 : 0; will stop at (end) diff --git a/packs/effect-macros/LOG.old b/packs/effect-macros/LOG.old index 7d48dc3..f4433ae 100644 --- a/packs/effect-macros/LOG.old +++ b/packs/effect-macros/LOG.old @@ -1,8 +1,3 @@ -2023/09/09-23:23:04.905935 7fc442ffd700 Recovering log #87 -2023/09/09-23:23:04.946402 7fc442ffd700 Delete type=3 #85 -2023/09/09-23:23:04.946439 7fc442ffd700 Delete type=0 #87 -2023/09/10-01:07:03.930401 7fc441b3b700 Level-0 table #92: started -2023/09/10-01:07:03.930420 7fc441b3b700 Level-0 table #92: 0 bytes OK -2023/09/10-01:07:03.939308 7fc441b3b700 Delete type=0 #90 -2023/09/10-01:07:03.956611 7fc441b3b700 Manual compaction at level-0 from '!macros!11GOryzx2Q8MXbT6' @ 72057594037927935 : 1 .. '!macros!yG1ZQO30ZlntYJp7' @ 0 : 0; will stop at (end) -2023/09/10-01:07:03.956718 7fc441b3b700 Manual compaction at level-1 from '!macros!11GOryzx2Q8MXbT6' @ 72057594037927935 : 1 .. '!macros!yG1ZQO30ZlntYJp7' @ 0 : 0; will stop at (end) +2023/09/10-23:05:53.762234 7f36d67fc700 Recovering log #100 +2023/09/10-23:05:53.770717 7f36d67fc700 Delete type=0 #100 +2023/09/10-23:05:53.770733 7f36d67fc700 Delete type=3 #98 diff --git a/packs/effect-macros/MANIFEST-000093 b/packs/effect-macros/MANIFEST-000093 deleted file mode 100644 index eb5f4c0cb23c68ebc35037ad0d6857747d90b8bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 371 zcmY#7(CN{}z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&P9&pqQJOT$Ep|Xq;E& z;#!!T;TC3L>g8^b!zjQ22JB2WhYI1U3=Q4=iz=%si~=ouBa%YQ7#Sg|;0h|;4Wk16 zjSZr5@=7AT3d|Y#AqukNcRk`@U}TEpWMGbG5oC;;e>DKejR$fQSsd6I6XqExDyHS< zq@)%VD^{ci`x)nZdiom|So(&RxG_2qu!TVmqM$KI_(z8wZ737W#%*Fxo=w2LRq5UO)f< diff --git a/packs/effect-macros/MANIFEST-000104 b/packs/effect-macros/MANIFEST-000104 new file mode 100644 index 0000000000000000000000000000000000000000..4bb6522e36af13123106aa825435d0ff88c7b76a GIT binary patch literal 172 zcmebJlNZ>|z{n_-lUkOVlai$8R9TW*o>`pgoS$2eSd>_jU&P9&pqQJOT$Ep|Sm|yU z73gnl5S5cx66sZ7&LGDC2JB3UpT!gv)ADmtQj3ZeD^i2~jPpG`{f!GOeM3v!7#$$W z;O3Nv8s$2M=9L=MmcA$-C`UJj7;gA49poUtbYY0-+{OpKyDTbD*(E82onGR delta 37 pcmX@lc%E^>M!BprvKKiR7@1-@8JOc(SaW>LeuKDiKyCsHD*)172*v;a diff --git a/packs/module-docs/CURRENT b/packs/module-docs/CURRENT index 5b83d76..1fb45e8 100644 --- a/packs/module-docs/CURRENT +++ b/packs/module-docs/CURRENT @@ -1 +1 @@ -MANIFEST-000092 +MANIFEST-000103 diff --git a/packs/module-docs/LOG b/packs/module-docs/LOG index 43fe456..3e056d6 100644 --- a/packs/module-docs/LOG +++ b/packs/module-docs/LOG @@ -1,15 +1,8 @@ -2023/09/10-09:15:57.422391 7fc443fff700 Recovering log #90 -2023/09/10-09:15:57.460369 7fc443fff700 Delete type=0 #90 -2023/09/10-09:15:57.460392 7fc443fff700 Delete type=3 #88 -2023/09/10-22:54:31.953241 7fc441b3b700 Level-0 table #95: started -2023/09/10-22:54:31.956096 7fc441b3b700 Level-0 table #95: 22051 bytes OK -2023/09/10-22:54:31.959002 7fc441b3b700 Delete type=0 #93 -2023/09/10-22:54:31.974981 7fc441b3b700 Manual compaction at level-0 from '!journal!Mw1g2Fx5dp4SoqVP' @ 72057594037927935 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at (end) -2023/09/10-22:54:31.980598 7fc441b3b700 Manual compaction at level-1 from '!journal!Mw1g2Fx5dp4SoqVP' @ 72057594037927935 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 3 : 1 -2023/09/10-22:54:31.980606 7fc441b3b700 Compacting 1@1 + 1@2 files -2023/09/10-22:54:31.983098 7fc441b3b700 Generated table #96@1: 2 keys, 2537 bytes -2023/09/10-22:54:31.983111 7fc441b3b700 Compacted 1@1 + 1@2 files => 2537 bytes -2023/09/10-22:54:31.985952 7fc441b3b700 compacted to: files[ 0 0 1 0 0 0 0 ] -2023/09/10-22:54:31.986001 7fc441b3b700 Delete type=2 #5 -2023/09/10-22:54:31.986048 7fc441b3b700 Delete type=2 #95 -2023/09/10-22:54:31.999197 7fc441b3b700 Manual compaction at level-1 from '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 3 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at (end) +2023/09/10-23:06:22.585546 7febd9214700 Recovering log #102 +2023/09/10-23:06:22.598553 7febd9214700 Delete type=0 #102 +2023/09/10-23:06:22.598574 7febd9214700 Delete type=3 #101 +2023/09/10-23:07:07.241420 7febcb05d700 Level-0 table #106: started +2023/09/10-23:07:07.241437 7febcb05d700 Level-0 table #106: 0 bytes OK +2023/09/10-23:07:07.244507 7febcb05d700 Delete type=0 #104 +2023/09/10-23:07:07.244613 7febcb05d700 Manual compaction at level-0 from '!journal!Mw1g2Fx5dp4SoqVP' @ 72057594037927935 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at (end) +2023/09/10-23:07:07.248425 7febcb05d700 Manual compaction at level-1 from '!journal!Mw1g2Fx5dp4SoqVP' @ 72057594037927935 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at (end) diff --git a/packs/module-docs/LOG.old b/packs/module-docs/LOG.old index 5a05a1d..c271a8e 100644 --- a/packs/module-docs/LOG.old +++ b/packs/module-docs/LOG.old @@ -1,8 +1,3 @@ -2023/09/09-23:23:04.872878 7fc4437fe700 Recovering log #86 -2023/09/09-23:23:04.909922 7fc4437fe700 Delete type=0 #86 -2023/09/09-23:23:04.909943 7fc4437fe700 Delete type=3 #84 -2023/09/10-01:07:03.922079 7fc441b3b700 Level-0 table #91: started -2023/09/10-01:07:03.922101 7fc441b3b700 Level-0 table #91: 0 bytes OK -2023/09/10-01:07:03.930291 7fc441b3b700 Delete type=0 #89 -2023/09/10-01:07:03.939365 7fc441b3b700 Manual compaction at level-0 from '!journal!Mw1g2Fx5dp4SoqVP' @ 72057594037927935 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at (end) -2023/09/10-01:07:03.956638 7fc441b3b700 Manual compaction at level-1 from '!journal!Mw1g2Fx5dp4SoqVP' @ 72057594037927935 : 1 .. '!journal.pages!Mw1g2Fx5dp4SoqVP.i31qmsZnIGhjvA2K' @ 0 : 0; will stop at (end) +2023/09/10-23:05:53.751263 7f36d57fa700 Recovering log #99 +2023/09/10-23:05:53.759524 7f36d57fa700 Delete type=0 #99 +2023/09/10-23:05:53.759553 7f36d57fa700 Delete type=3 #97 diff --git a/packs/module-docs/MANIFEST-000092 b/packs/module-docs/MANIFEST-000092 deleted file mode 100644 index 7ecae3d4d505e76092de748e76eb0d1e2dc79c33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 434 zcmWG)>CdTQU}TiaNi9pwNlDUksw_z@&n!-L&d)7KEJ`fNFJfn6eaNAxn3Z2zl$V&J z=v!`>Zsb;Bno?jAoL?9gz{tb^1{N?CdIgE;sl^!T^fHYN3v-L3@;u!$vdSEdycroG z8t)lh=;UBvWQyfvV2)#9>JjP@%LH=cfZPNYGj_)K#cLSxSZ_wI^~?~BG7mzgtc2Q^ f$YRFINV-R$Cb2QbvoW!Bi8< pXa-S6y7{IMjo;_jC2=q?GG%ZwFlVxu&42dg35c5s
ActorCurrency
${actor.name}${fmt.format(total)}