From 65cc95c35c8e13a49528f8cbe072edb002c8a0dc Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Sat, 27 Sep 2025 11:48:04 -0600 Subject: [PATCH 001/105] Begin working on a symlink script to make intellisense better --- .env.template | 2 + .gitignore | 1 + .vscode/settings.json | 1 + package-lock.json | 181 ++++------------------------------------ package.json | 6 +- scripts/linkFoundry.mjs | 10 +++ 6 files changed, 31 insertions(+), 170 deletions(-) create mode 100644 .env.template create mode 100644 scripts/linkFoundry.mjs diff --git a/.env.template b/.env.template new file mode 100644 index 0000000..180dbd6 --- /dev/null +++ b/.env.template @@ -0,0 +1,2 @@ +# The absolute path to the Foundry installation to create symlinks to +FOUNDRY_ROOT="" diff --git a/.gitignore b/.gitignore index b22745b..7ab2098 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ deprecated +.env diff --git a/.vscode/settings.json b/.vscode/settings.json index 3f6e97a..70ee187 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,6 +11,7 @@ ".styles": false, "node_modules": true, "packs": true, + "foundry": false }, "html.customData": [ "./.vscode/components.html-data.json" diff --git a/package-lock.json b/package-lock.json index 961d542..050c8aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,9 @@ "@foundryvtt/foundryvtt-cli": "^1.0.3", "@league-of-foundry-developers/foundry-vtt-types": "^9.280.0", "@stylistic/eslint-plugin": "^2.6.1", + "dotenv": "^17.2.2", "eslint": "^9.8.0", - "globals": "^15.9.0", - "sass": "^1.77.8" + "globals": "^15.9.0" } }, "node_modules/@eslint-community/eslint-utils": { @@ -2743,31 +2743,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2830,18 +2805,6 @@ } ] }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2941,42 +2904,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/classic-level": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz", @@ -3098,6 +3025,19 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "17.2.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", + "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, "node_modules/earcut": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", @@ -3460,20 +3400,6 @@ "is-callable": "^1.1.3" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -3701,12 +3627,6 @@ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", "dev": true }, - "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", - "dev": true - }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -3754,18 +3674,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", @@ -4133,15 +4041,6 @@ "node-gyp-build-test": "build-test.js" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4505,30 +4404,6 @@ } ] }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -4590,23 +4465,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/sass": { - "version": "1.77.8", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.8.tgz", - "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", @@ -4723,15 +4581,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", diff --git a/package.json b/package.json index b58c939..4804900 100644 --- a/package.json +++ b/package.json @@ -4,13 +4,11 @@ "@foundryvtt/foundryvtt-cli": "^1.0.3", "@league-of-foundry-developers/foundry-vtt-types": "^9.280.0", "@stylistic/eslint-plugin": "^2.6.1", + "dotenv": "^17.2.2", "eslint": "^9.8.0", - "globals": "^15.9.0", - "sass": "^1.77.8" + "globals": "^15.9.0" }, "scripts": { - "css": "sass --watch --embed-source-map --no-error-css styles/:.styles/", - "build": "sass --embed-source-map --no-error-css styles/:.styles/", "lint": "eslint --fix", "lint:nofix": "eslint" } diff --git a/scripts/linkFoundry.mjs b/scripts/linkFoundry.mjs new file mode 100644 index 0000000..2ed162f --- /dev/null +++ b/scripts/linkFoundry.mjs @@ -0,0 +1,10 @@ +import { config } from "dotenv"; +config(); + +console.log(process.env) +const root = process.env.FOUNDRY_ROOT; + +// Early exit +if (!root) { process.exit(1) }; + +// Assert root exists From 6866bea13160c996e375b463d6b52f415449e8fd Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Sun, 28 Sep 2025 00:34:49 -0600 Subject: [PATCH 002/105] Update scripts to allow auto-linking of Foundry source for intellisense --- .gitignore | 1 + .vscode/settings.json | 2 +- augments.d.ts | 5 +++++ eslint.config.mjs | 2 +- jsconfig.json | 16 +++++++++++++-- package.json | 3 +++ scripts/linkFoundry.mjs | 45 +++++++++++++++++++++++++++++++++++++---- 7 files changed, 66 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 7ab2098..f3a0af4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules/ deprecated .env +/foundry diff --git a/.vscode/settings.json b/.vscode/settings.json index 70ee187..aa3ed17 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -11,7 +11,7 @@ ".styles": false, "node_modules": true, "packs": true, - "foundry": false + "foundry": true }, "html.customData": [ "./.vscode/components.html-data.json" diff --git a/augments.d.ts b/augments.d.ts index df16590..a08bb60 100644 --- a/augments.d.ts +++ b/augments.d.ts @@ -1,3 +1,8 @@ +declare global { + class Hooks extends foundry.helpers.Hooks {}; + const fromUuid = foundry.utils.fromUuid; +} + interface Actor { /** The system-specific data */ system: any; diff --git a/eslint.config.mjs b/eslint.config.mjs index 454af9e..55aea5c 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -4,7 +4,7 @@ import stylistic from "@stylistic/eslint-plugin"; export default [ // Tell eslint to ignore files that I don't mind being formatted slightly differently - { ignores: [ `scripts/` ] }, + { ignores: [ `scripts/`, `foundry/*` ] }, { languageOptions: { globals: globals.browser, diff --git a/jsconfig.json b/jsconfig.json index 231558c..fd36906 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,7 +1,19 @@ { "compilerOptions": { + "module": "es2022", + "target": "es2022", "types": [ "./augments.d.ts" - ] - } + ], + "paths": { + "@client/*": ["./foundry/client/*"], + "@common/*": ["./foundry/common/*"], + } + }, + "include": [ + "module/main.mjs", + "foundry/client/client.mjs", + "foundry/client/global.d.mts", + "foundry/common/primitives/global.d.mts" + ] } diff --git a/package.json b/package.json index 4804900..c2b1830 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,9 @@ "globals": "^15.9.0" }, "scripts": { + "build": "node scripts/buildCompendia.mjs", + "extract": "node scripts/extractCompendia.mjs", + "link": "node scripts/linkFoundry.mjs", "lint": "eslint --fix", "lint:nofix": "eslint" } diff --git a/scripts/linkFoundry.mjs b/scripts/linkFoundry.mjs index 2ed162f..1cbb71a 100644 --- a/scripts/linkFoundry.mjs +++ b/scripts/linkFoundry.mjs @@ -1,10 +1,47 @@ +import { existsSync } from "fs"; +import { symlink, unlink } from "fs/promises"; +import { join } from "path"; import { config } from "dotenv"; -config(); -console.log(process.env) +config({ quiet: true }); + const root = process.env.FOUNDRY_ROOT; // Early exit -if (!root) { process.exit(1) }; +if (!root) { + console.error(`Must provide a FOUNDRY_ROOT environment variable`); + process.exit(1); +}; -// Assert root exists +// Assert Foundry exists +if (!existsSync(root)) { + console.error(`Foundry root not found.`); + process.exit(1); +}; + +// Removing existing symlink +if (existsSync(`foundry`)) { + console.log(`Attempting to unlink foundry instance`); + try { + await unlink(`foundry`); + } catch { + console.error(`Failed to unlink foundry folder.`); + process.exit(1); + }; +}; + +// Account for if the root is pointing at an Electron install +let targetRoot = root; +if (existsSync(join(root, `resources`, `app`))) { + console.log(`Switching to use the "${root}/resources/app" directory`); + targetRoot = join(root, `resources`, `app`); +}; + +// Create symlink +console.log(`Linking foundry source into folder`) +try { + await symlink(targetRoot, `foundry`); +} catch (e) { + console.error(e); + process.exit(1); +}; From 48e40538dce3d5f4b89725e5e06e028780095e34 Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Wed, 1 Oct 2025 00:38:17 -0600 Subject: [PATCH 003/105] Restore intellisense for the module code --- jsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jsconfig.json b/jsconfig.json index fd36906..6811918 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -11,7 +11,7 @@ } }, "include": [ - "module/main.mjs", + "module/**/*", "foundry/client/client.mjs", "foundry/client/global.d.mts", "foundry/common/primitives/global.d.mts" From c7c0deaec7477b312c6b05c02fb4515ce12e2c30 Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Wed, 1 Oct 2025 20:52:42 -0600 Subject: [PATCH 004/105] Make the hotReload target the correct styles directory --- system.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system.json b/system.json index 0f4d84a..1aaa3a5 100644 --- a/system.json +++ b/system.json @@ -44,7 +44,7 @@ "flags": { "hotReload": { "extensions": ["css", "hbs", "json", "js", "mjs", "svg"], - "paths": ["templates", "langs", ".styles", "module", "assets"] + "paths": ["templates", "langs", "styles", "module", "assets"] } } } From 6081b8f9e89ad0de218c851e44d1abd42ba70647 Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Sat, 4 Oct 2025 19:40:37 -0600 Subject: [PATCH 005/105] Add a custom DocumentSheetConfig that supports tab-based configuration for my system-specific stuff --- langs/en-ca.json | 18 ++ module/apps/TAFDocumentSheetConfig.mjs | 171 +++++++++++++++++++ module/utils/getSizing.mjs | 32 ++++ styles/Apps/TAFDocumentSheetConfig.css | 15 ++ styles/main.css | 2 +- templates/TAFDocumentSheetConfig/foundry.hbs | 4 + templates/TAFDocumentSheetConfig/system.hbs | 48 ++++++ 7 files changed, 289 insertions(+), 1 deletion(-) create mode 100644 module/apps/TAFDocumentSheetConfig.mjs create mode 100644 module/utils/getSizing.mjs create mode 100644 styles/Apps/TAFDocumentSheetConfig.css create mode 100644 templates/TAFDocumentSheetConfig/foundry.hbs create mode 100644 templates/TAFDocumentSheetConfig/system.hbs diff --git a/langs/en-ca.json b/langs/en-ca.json index 99de0b3..de83d02 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -13,6 +13,24 @@ }, "sheet-names": { "PlayerSheet": "Player Sheet" + }, + "Apps": { + "TAFDocumentSheetConfig": { + "Sizing": "Sizing", + "Width": { + "label": "Width" + }, + "Height": { + "label": "Height" + }, + "Resizable": { + "label": "Resizable" + }, + "tabs": { + "foundry": "Foundry", + "system": "Text-Based Actors" + } + } } } } diff --git a/module/apps/TAFDocumentSheetConfig.mjs b/module/apps/TAFDocumentSheetConfig.mjs new file mode 100644 index 0000000..760e462 --- /dev/null +++ b/module/apps/TAFDocumentSheetConfig.mjs @@ -0,0 +1,171 @@ +import { __ID__, filePath } from "../consts.mjs"; +import { getDefaultSizing } from "../utils/getSizing.mjs"; + +const { diffObject, expandObject, flattenObject } = foundry.utils; +const { DocumentSheetConfig } = foundry.applications.apps; +const { CONST } = foundry; + +export class TAFDocumentSheetConfig extends DocumentSheetConfig { + + // #region Options + static DEFAULT_OPTIONS = { + classes: [`taf`], + form: { + handler: this.#onSubmit, + }, + }; + + static get PARTS() { + const { form, footer } = super.PARTS; + return { + tabs: { template: `templates/generic/tab-navigation.hbs` }, + foundryTab: { + ...form, + template: filePath(`templates/TAFDocumentSheetConfig/foundry.hbs`), + templates: [ `templates/sheets/document-sheet-config.hbs` ], + }, + systemTab: { + template: filePath(`templates/TAFDocumentSheetConfig/system.hbs`), + classes: [`standard-form`], + }, + footer, + }; + }; + + static TABS = { + main: { + initial: `system`, + labelPrefix: `taf.Apps.TAFDocumentSheetConfig.tabs`, + tabs: [ + { id: `system` }, + { id: `foundry` }, + ], + }, + }; + // #endregion Options + + // #region Data Prep + async _preparePartContext(partID, context, options) { + this._prepareTabs(`main`); + + context.meta = { + idp: this.id, + }; + + switch (partID) { + case `foundryTab`: { + await this._prepareFormContext(context, options); + break; + }; + case `systemTab`: { + await this._prepareSystemSettingsContext(context, options); + break; + }; + case `footer`: { + await this._prepareFooterContext(context, options); + break; + }; + }; + return context; + }; + + async _prepareSystemSettingsContext(context, _options) { + // Inherited values for placeholders + const defaults = getDefaultSizing(); + context.placeholders = { + ...defaults, + resizable: defaults.resizable ? `Resizable` : `Not Resizable`, + }; + + // Custom values from document itself + const sheetConfig = this.document.getFlag(__ID__, `PlayerSheet`) ?? {}; + const sizing = sheetConfig.size ?? {}; + context.values = { + width: sizing.width, + height: sizing.height, + resizable: sizing.resizable ?? ``, + }; + + // Static prep + context.resizeOptions = [ + { label: `Default (${context.placeholders.resizable})`, value: `` }, + { label: `Resizable`, value: `true` }, + { label: `No Resizing`, value: `false` }, + ]; + }; + // #endregion Data Prep + + // #region Actions + /** @this {TAFDocumentSheetConfig} */ + static async #onSubmit(event, form, formData) { + const foundryReopen = await TAFDocumentSheetConfig.#submitFoundry.call(this, event, form, formData); + const systemReopen = await TAFDocumentSheetConfig.#submitSystem.call(this, event, form, formData); + if (foundryReopen || systemReopen) { + this.document._onSheetChange({ sheetOpen: true }); + }; + }; + + /** + * This method is mostly the form submission handler that foundry uses in + * DocumentSheetConfig, however because we clobber that in order to save our + * own config stuff as well, we need to duplicate Foundry's handling and tweak + * it a bit to make it work nicely with our custom saving. + * + * @this {TAFDocumentSheetConfig} + */ + static async #submitFoundry(_event, _form, formData) { + const { object } = formData; + const { documentName, type = CONST.BASE_DOCUMENT_TYPE } = this.document; + + // Update themes. + const themes = game.settings.get(`core`, `sheetThemes`); + const defaultTheme = foundry.utils.getProperty(themes, `defaults.${documentName}.${type}`); + const documentTheme = themes.documents?.[this.document.uuid]; + const themeChanged = (object.defaultTheme !== defaultTheme) || (object.theme !== documentTheme); + if (themeChanged) { + foundry.utils.setProperty(themes, `defaults.${documentName}.${type}`, object.defaultTheme); + themes.documents ??= {}; + themes.documents[this.document.uuid] = object.theme; + await game.settings.set(`core`, `sheetThemes`, themes); + } + + // Update sheets. + const { defaultClass } = this.constructor.getSheetClassesForSubType(documentName, type); + const sheetClass = this.document.getFlag(`core`, `sheetClass`) ?? ``; + const defaultSheetChanged = object.defaultClass !== defaultClass; + const documentSheetChanged = object.sheetClass !== sheetClass; + + if (themeChanged || (game.user.isGM && defaultSheetChanged)) { + if (game.user.isGM && defaultSheetChanged) { + const setting = game.settings.get(`core`, `sheetClasses`); + foundry.utils.setProperty(setting, `${documentName}.${type}`, object.defaultClass); + await game.settings.set(`core`, `sheetClasses`, setting); + } + + // This causes us to manually rerender the sheet due to the theme or default + // sheet class changing resulting in no update making it to the client-document's + // _onUpdate handling + if (!documentSheetChanged) { + return true; + } + } + + // Update the document-specific override. + if (documentSheetChanged) { + this.document.setFlag(`core`, `sheetClass`, object.sheetClass); + }; + return false; + }; + + /** @this {TAFDocumentSheetConfig} */ + static async #submitSystem(_event, _form, formData) { + const { FLAGS: flags } = expandObject(formData.object); + const diff = flattenObject(diffObject(this.document.flags, flags)); + const hasChanges = Object.keys(diff).length > 0; + if (hasChanges) { + await this.document.update({ flags }); + }; + return hasChanges; + }; + // #endregion Actions +}; diff --git a/module/utils/getSizing.mjs b/module/utils/getSizing.mjs new file mode 100644 index 0000000..63e6822 --- /dev/null +++ b/module/utils/getSizing.mjs @@ -0,0 +1,32 @@ +import { PlayerSheet } from "../apps/PlayerSheet.mjs"; + +/** + * @typedef SheetSizing + * @property {number} width The initial width of the application + * @property {number} height The initial height of the application + * @property {boolean} resizable Whether or not the application + * is able to be resized with a drag handle. + */ + +/** + * Retrieves the computed default sizing data based on world settings + * and the sheet class' DEFAULT_OPTIONS + * @returns {SheetSizing} + */ +export function getDefaultSizing() { + /** @type {SheetSizing} */ + const sizing = { + width: undefined, + height: undefined, + resizable: undefined, + }; + + // TODO: defaults from world settings + + // Defaults from the sheet class itself + sizing.height ||= PlayerSheet.DEFAULT_OPTIONS.position.height; + sizing.width ||= PlayerSheet.DEFAULT_OPTIONS.position.width; + sizing.resizable ||= PlayerSheet.DEFAULT_OPTIONS.window.resizable; + + return sizing; +}; diff --git a/styles/Apps/TAFDocumentSheetConfig.css b/styles/Apps/TAFDocumentSheetConfig.css new file mode 100644 index 0000000..247c8fd --- /dev/null +++ b/styles/Apps/TAFDocumentSheetConfig.css @@ -0,0 +1,15 @@ +.taf.sheet-config { + + section { + display: flex; + flex-direction: column; + gap: 1rem; + } + + .tab { + display: none; + } + .tab.active { + display: unset; + } +} diff --git a/styles/main.css b/styles/main.css index bc257ab..10ea6ec 100644 --- a/styles/main.css +++ b/styles/main.css @@ -20,4 +20,4 @@ @import url("./Apps/Ask.css") layer(apps); @import url("./Apps/AttributeManager.css") layer(apps); @import url("./Apps/PlayerSheet.css") layer(apps); -@import url("./Apps/ResizeControlManager.css") layer(apps); +@import url("./Apps/TAFDocumentSheetConfig.css") layer(apps); diff --git a/templates/TAFDocumentSheetConfig/foundry.hbs b/templates/TAFDocumentSheetConfig/foundry.hbs new file mode 100644 index 0000000..c23dc90 --- /dev/null +++ b/templates/TAFDocumentSheetConfig/foundry.hbs @@ -0,0 +1,4 @@ +{{log this}} +
+ {{> "templates/sheets/document-sheet-config.hbs" }} +
diff --git a/templates/TAFDocumentSheetConfig/system.hbs b/templates/TAFDocumentSheetConfig/system.hbs new file mode 100644 index 0000000..a39e0c8 --- /dev/null +++ b/templates/TAFDocumentSheetConfig/system.hbs @@ -0,0 +1,48 @@ +
+
+ + {{ localize "taf.Apps.TAFDocumentSheetConfig.Sizing" }} + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
From 4e304f7d229cecb76d0768f4b78a512232406b48 Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Sat, 4 Oct 2025 19:41:24 -0600 Subject: [PATCH 006/105] Override the default configureSheet action in order to open the custom DocumentSheetConfig --- module/apps/PlayerSheet.mjs | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/module/apps/PlayerSheet.mjs b/module/apps/PlayerSheet.mjs index e9caf53..56b8744 100644 --- a/module/apps/PlayerSheet.mjs +++ b/module/apps/PlayerSheet.mjs @@ -1,7 +1,7 @@ import { __ID__, filePath } from "../consts.mjs"; import { AttributeManager } from "./AttributeManager.mjs"; import { attributeSorter } from "../utils/attributeSort.mjs"; -import { ResizeControlManager } from "./ResizeControlManager.mjs"; +import { TAFDocumentSheetConfig } from "./TAFDocumentSheetConfig.mjs"; const { HandlebarsApplicationMixin } = foundry.applications.api; const { ActorSheetV2 } = foundry.applications.sheets; @@ -28,7 +28,7 @@ export class PlayerSheet extends HandlebarsApplicationMixin(ActorSheetV2) { }, actions: { manageAttributes: this.#manageAttributes, - sizeSettings: this.#configureSizeSettings, + configureSheet: this.#configureSheet, }, }; @@ -156,15 +156,18 @@ export class PlayerSheet extends HandlebarsApplicationMixin(ActorSheetV2) { }; }; - #sizeSettings = null; - /** @this {PlayerSheet} */ - static async #configureSizeSettings() { - this.#sizeSettings ??= new ResizeControlManager({ document: this.actor }); - if (this.#sizeSettings.rendered) { - await this.#sizeSettings.bringToFront(); - } else { - await this.#sizeSettings.render({ force: true }); - }; + static async #configureSheet(event) { + event.stopPropagation(); + if ( event.detail > 1 ) { return } + + // const docSheetConfigWidth = TAFDocumentSheetConfig.DEFAULT_OPTIONS.position.width; + new TAFDocumentSheetConfig({ + document: this.document, + position: { + top: this.position.top + 40, + left: this.position.left + ((this.position.width - 60) / 2), + }, + }).render({ force: true }); }; // #endregion Actions }; From 72ebc0354df7646a99af51b4b7b08fc8dea3f292 Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Sat, 4 Oct 2025 19:41:53 -0600 Subject: [PATCH 007/105] Remove old application that is no longer used by anything --- module/apps/ResizeControlManager.mjs | 61 --------------------- styles/Apps/ResizeControlManager.css | 20 ------- templates/ResizeControlManager/controls.hbs | 7 --- templates/ResizeControlManager/settings.hbs | 29 ---------- 4 files changed, 117 deletions(-) delete mode 100644 module/apps/ResizeControlManager.mjs delete mode 100644 styles/Apps/ResizeControlManager.css delete mode 100644 templates/ResizeControlManager/controls.hbs delete mode 100644 templates/ResizeControlManager/settings.hbs diff --git a/module/apps/ResizeControlManager.mjs b/module/apps/ResizeControlManager.mjs deleted file mode 100644 index 3bd2b08..0000000 --- a/module/apps/ResizeControlManager.mjs +++ /dev/null @@ -1,61 +0,0 @@ -import { __ID__, filePath } from "../consts.mjs"; - -const { HandlebarsApplicationMixin, DocumentSheetV2 } = foundry.applications.api; -const { getProperty } = foundry.utils; - -export class ResizeControlManager extends HandlebarsApplicationMixin(DocumentSheetV2) { - - // #region Options - static DEFAULT_OPTIONS = { - classes: [ - __ID__, - `ResizeControlManager`, - ], - position: { - width: 400, - height: `auto`, - }, - window: { - resizable: true, - }, - form: { - submitOnChange: false, - closeOnSubmit: true, - }, - actions: {}, - }; - - static PARTS = { - settings: { template: filePath(`templates/ResizeControlManager/settings.hbs`) }, - controls: { template: filePath(`templates/ResizeControlManager/controls.hbs`) }, - }; - // #endregion Options - - // #region Instance Data - get title() { - return `Sizing Settings For : ${this.document.name}`; - }; - // #endregion Instance Data - - // #region Data Prep - async _prepareContext() { - const sizing = getProperty(this.document, `flags.${__ID__}.PlayerSheet.size`) ?? {}; - - const ctx = { - meta: { - idp: this.id, - }, - width: sizing.width, - height: sizing.height, - resizable: sizing.resizable, - resizeOptions: [ - { label: `Default`, value: `` }, - { label: `Resizable`, value: `true` }, - { label: `No Resizing`, value: `false` }, - ], - }; - - return ctx; - }; - // #endregion Data Prep -}; diff --git a/styles/Apps/ResizeControlManager.css b/styles/Apps/ResizeControlManager.css deleted file mode 100644 index 7783d40..0000000 --- a/styles/Apps/ResizeControlManager.css +++ /dev/null @@ -1,20 +0,0 @@ -.taf.ResizeControlManager { - fieldset { - display: grid; - grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); - align-items: center; - gap: 8px; - border: 1px solid rebeccapurple; - border-radius: 4px; - } - - .controls { - display: flex; - flex-direction: row; - gap: 8px; - - button { - flex-grow: 1; - } - } -} diff --git a/templates/ResizeControlManager/controls.hbs b/templates/ResizeControlManager/controls.hbs deleted file mode 100644 index 6f62afb..0000000 --- a/templates/ResizeControlManager/controls.hbs +++ /dev/null @@ -1,7 +0,0 @@ -
- -
diff --git a/templates/ResizeControlManager/settings.hbs b/templates/ResizeControlManager/settings.hbs deleted file mode 100644 index 39a1f20..0000000 --- a/templates/ResizeControlManager/settings.hbs +++ /dev/null @@ -1,29 +0,0 @@ -
-

- Changes to these settings will only take effect after a reload of Foundry. -

-
- Sizing - - - - - - -
-
From 696f9e8261aa351147260f06ad2cc6125edb3581 Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Sat, 4 Oct 2025 19:42:27 -0600 Subject: [PATCH 008/105] Remove context menu action that is deprecated --- module/apps/PlayerSheet.mjs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/module/apps/PlayerSheet.mjs b/module/apps/PlayerSheet.mjs index 56b8744..257182a 100644 --- a/module/apps/PlayerSheet.mjs +++ b/module/apps/PlayerSheet.mjs @@ -78,15 +78,6 @@ export class PlayerSheet extends HandlebarsApplicationMixin(ActorSheetV2) { return isGM || (allowPlayerEdits && editable); }, }); - controls.push({ - icon: `fa-solid fa-crop-simple`, - label: `Configure Size`, - action: `sizeSettings`, - visible: () => { - const isGM = game.user.isGM; - return isGM; - }, - }); return controls; }; From a7f91babf73cd404a17932b8b791415f150de38e Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Sun, 5 Oct 2025 11:58:58 -0600 Subject: [PATCH 009/105] Remove log --- templates/TAFDocumentSheetConfig/foundry.hbs | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/TAFDocumentSheetConfig/foundry.hbs b/templates/TAFDocumentSheetConfig/foundry.hbs index c23dc90..5c0644d 100644 --- a/templates/TAFDocumentSheetConfig/foundry.hbs +++ b/templates/TAFDocumentSheetConfig/foundry.hbs @@ -1,4 +1,3 @@ -{{log this}}
{{> "templates/sheets/document-sheet-config.hbs" }}
From 8632054e63e269ec41e36c52f9528a9139dcdfa7 Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Wed, 15 Oct 2025 16:40:53 -0600 Subject: [PATCH 010/105] Switch to using pnpm --- package-lock.json | 4907 --------------------------------------------- pnpm-lock.yaml | 2119 ++++++++++++++++++++ 2 files changed, 2119 insertions(+), 4907 deletions(-) delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 050c8aa..0000000 --- a/package-lock.json +++ /dev/null @@ -1,4907 +0,0 @@ -{ - "name": "Text-Actors-Foundry", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "devDependencies": { - "@eslint/js": "^9.8.0", - "@foundryvtt/foundryvtt-cli": "^1.0.3", - "@league-of-foundry-developers/foundry-vtt-types": "^9.280.0", - "@stylistic/eslint-plugin": "^2.6.1", - "dotenv": "^17.2.2", - "eslint": "^9.8.0", - "globals": "^15.9.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/eslint-utils/node_modules/eslint-visitor-keys": { - "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/@eslint-community/regexpp": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", - "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.17.1.tgz", - "integrity": "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA==", - "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.4", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.8.0.tgz", - "integrity": "sha512-MfluB7EUfxXtv3i/++oh89uzAr4PDI4nn201hsp+qaXqsjAWzinlZEHEfPgAX4doIlKvPG/i0A9dpKxOLII8yA==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", - "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@foundryvtt/foundryvtt-cli": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@foundryvtt/foundryvtt-cli/-/foundryvtt-cli-1.0.3.tgz", - "integrity": "sha512-M8NrMXFYpOEsLAbgRWfuMvUa9F6HwrROLtqhhBljqfVS1lgm0RJJY/7MObuXsTJOC6+Uu+QOPZTlw4k+hguG7w==", - "dev": true, - "dependencies": { - "chalk": "^5.2.0", - "classic-level": "^1.2.0", - "esm": "^3.2.25", - "js-yaml": "^4.1.0", - "mkdirp": "^3.0.0", - "nedb-promises": "^6.2.1", - "yargs": "^17.7.1" - }, - "bin": { - "fvtt": "fvtt.mjs" - }, - "engines": { - "node": ">17.0.0" - } - }, - "node_modules/@foundryvtt/foundryvtt-cli/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz", - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==", - "dev": true, - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@league-of-foundry-developers/foundry-vtt-types": { - "version": "9.280.0", - "resolved": "https://registry.npmjs.org/@league-of-foundry-developers/foundry-vtt-types/-/foundry-vtt-types-9.280.0.tgz", - "integrity": "sha512-Dv8/+kgAnI2F5snSWcnMnZsgO/87AFyBruflluZkWDbP7Pm5qi32GlNYCDEg7HMKybzyKmgLV2qXMmYPHtCT7w==", - "dev": true, - "dependencies": { - "@pixi/graphics-smooth": "0.0.22", - "@types/jquery": "~3.5.9", - "@types/simple-peer": "~9.11.1", - "handlebars": "4.7.7", - "pixi-particles": "4.3.1", - "pixi.js": "5.3.11", - "socket.io-client": "4.3.2", - "tinymce": "5.10.1" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pixi/accessibility": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-5.3.11.tgz", - "integrity": "sha512-/oSizd8/g6KUCeAlknMLJ9CRxBt+vWs6e2DrOctMoRupEHcmhICCjIyAp5GF6RZy9T9gNHDOU5p7vo7qEyVxgQ==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/accessibility/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/accessibility/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/accessibility/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/accessibility/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/accessibility/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/accessibility/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/accessibility/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/accessibility/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/app": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/app/-/app-5.3.11.tgz", - "integrity": "sha512-ZWrOjGvVl+lK5OJQT3OqSnSRtU2XgQSe/ULg2uGsSWUqMkJews33JIGOjvk4tIsjm4ekSKiPZRMdYFHzPfgEJg==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11" - } - }, - "node_modules/@pixi/app/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/app/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/app/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/app/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/app/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/app/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/app/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/app/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/constants": { - "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.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": { - "@types/offscreencanvas": "^2019.6.4" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - }, - "peerDependencies": { - "@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.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.10", - "@pixi/math": "6.5.10", - "@pixi/settings": "6.5.10", - "@pixi/utils": "6.5.10" - } - }, - "node_modules/@pixi/extensions": { - "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 - }, - "node_modules/@pixi/extract": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-5.3.11.tgz", - "integrity": "sha512-YeBrpIO3E5HUgcdKEldCUqwwDNHm5OBe98YFcdLr5Z0+dQaHnxp9Dm4n75/NojoGb5guYdrV00x+gU2UPHsVdw==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/extract/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/extract/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/extract/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/extract/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/extract/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/extract/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/extract/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/filter-alpha": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-5.3.11.tgz", - "integrity": "sha512-HC4PbiEqDWSi3A715av7knFqD3knSXRxPJKG9mWat2CU9eCizSw+JxXp/okMU/fL4ewooiqQWVU2l1wXOHhVFw==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11" - } - }, - "node_modules/@pixi/filter-alpha/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/filter-alpha/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/filter-alpha/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/filter-alpha/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/filter-alpha/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/filter-alpha/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/filter-alpha/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/filter-blur": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-5.3.11.tgz", - "integrity": "sha512-iW5cOMEcDiJidOV95bUfhxdcvwM9JzCoWAd+92gAie8L+ElRSHpu1jxXbKHjo/QczQV1LulOlheyDaJNpaBCDg==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/filter-blur/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/filter-blur/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/filter-blur/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/filter-blur/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/filter-blur/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/filter-blur/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/filter-blur/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/filter-color-matrix": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-5.3.11.tgz", - "integrity": "sha512-u9NT4+N1I3XV9ygwsmF8/jIwCLqNCLeFOdM4f73kbw/UmakZZ6i6xjjJMc5YFUpC25qDr1TFlqgdGGGHAPl4ug==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11" - } - }, - "node_modules/@pixi/filter-color-matrix/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/filter-color-matrix/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/filter-color-matrix/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/filter-color-matrix/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/filter-color-matrix/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/filter-color-matrix/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/filter-color-matrix/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/filter-displacement": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-5.3.11.tgz", - "integrity": "sha512-CTIy7C/L9I1X3VNx4nMzQbMFvznsGk2viQh0dSo8r5NLgmaAdxhkGI0KUpNjLBz30278tzFfNuRe59K1y1kHuw==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/math": "5.3.11" - } - }, - "node_modules/@pixi/filter-displacement/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/filter-displacement/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/filter-displacement/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/filter-displacement/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/filter-displacement/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/filter-displacement/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/filter-displacement/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/filter-fxaa": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-5.3.11.tgz", - "integrity": "sha512-0ahjui5385e1vRvd7zCc0n5W8ULtNI1uVbDJHP9ueeiF25TKC0GqtZzntNwrQPoU46q8zXdnIGjzMpikbbAasg==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11" - } - }, - "node_modules/@pixi/filter-fxaa/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/filter-fxaa/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/filter-fxaa/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/filter-fxaa/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/filter-fxaa/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/filter-fxaa/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/filter-fxaa/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/filter-noise": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-5.3.11.tgz", - "integrity": "sha512-98WC9Nd5u2F03Ned9T3vnbmO/YF1jLSioZ623z9wjqpd5DosZgRtYTSGxjVcXTSfpviIuiJpkyF+X097pbVprg==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11" - } - }, - "node_modules/@pixi/filter-noise/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/filter-noise/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/filter-noise/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/filter-noise/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/filter-noise/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/filter-noise/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/filter-noise/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/graphics": { - "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.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": { - "version": "0.0.22", - "resolved": "https://registry.npmjs.org/@pixi/graphics-smooth/-/graphics-smooth-0.0.22.tgz", - "integrity": "sha512-qq2u+BJBIDBuuSTc2Xzm1D/8RiiKBdxnVDiMb7Go5v8achnV5ctC6m+rf8Mq0sWm66mbOqu1aq/9efT4A4sPrA==", - "dev": true, - "engines": { - "node": ">=14", - "npm": ">=7" - }, - "peerDependencies": { - "@pixi/constants": "^6.0.4", - "@pixi/core": "^6.0.4", - "@pixi/display": "^6.0.4", - "@pixi/graphics": "^6.0.4", - "@pixi/math": "^6.0.4", - "@pixi/utils": "^6.0.4" - } - }, - "node_modules/@pixi/interaction": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/interaction/-/interaction-5.3.11.tgz", - "integrity": "sha512-n2K99CYyBcrf8NPxpzmZ5IlJ9TEplsSZfJ/uzMNOEnTObKl4wAhxs51Nb58raH3Ouzwu14YHOpqYrBTEoT1yPA==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/interaction/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/interaction/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/interaction/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/interaction/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/interaction/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/interaction/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/interaction/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/interaction/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/loaders": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/loaders/-/loaders-5.3.11.tgz", - "integrity": "sha512-1HAeb/NFXyhNhZWAbVkngsTPBGpjZEPhQflBTrKycRaub7XDSZ8F0fwPltpKKVRWNDT+HBgU/zDNE2fpjzqfYg==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/utils": "5.3.11", - "resource-loader": "^3.0.1" - } - }, - "node_modules/@pixi/loaders/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/loaders/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/loaders/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/loaders/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/loaders/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/loaders/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/loaders/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/math": { - "version": "6.5.10", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-6.5.10.tgz", - "integrity": "sha512-fxeu7ykVbMGxGV2S3qRTupHToeo1hdWBm8ihyURn3BMqJZe2SkZEECPd5RyvIuuNUtjRnmhkZRnF3Jsz2S+L0g==", - "dev": true, - "peer": true - }, - "node_modules/@pixi/mesh": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-5.3.11.tgz", - "integrity": "sha512-KWKKksEr0YuUX1uz1FmpIa/Y37b/0pvFUS+87LoyYq0mRtGbKsTY5i3lBPG/taHwN7a2DQAX3JZpw6yhGKoGpA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/mesh-extras": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-5.3.11.tgz", - "integrity": "sha512-1GTCMMUW1xv/72x26cxRysblBXW0wU77TNgqtSIMZ1M6JbleObChklWTvwi9MzQO2vQ3S6Hvcsa5m5EiM2hSPQ==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/mesh": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/mesh-extras/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/mesh-extras/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/mesh-extras/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/mesh-extras/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/mesh-extras/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/mesh-extras/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/mesh-extras/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/mesh/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/mesh/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/mesh/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/mesh/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/mesh/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/mesh/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/mesh/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/mesh/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/mixin-cache-as-bitmap": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-5.3.11.tgz", - "integrity": "sha512-uQUxatGTTD5zfQ0pWdjibVjT+xEEZJ/xZDZtm/GxC7HSHd4jgoJBcTXWVhbhzwpLPVTnD8+sMnRrGlhoKcpTpQ==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/sprite": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/mixin-cache-as-bitmap/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/mixin-cache-as-bitmap/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/mixin-cache-as-bitmap/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/mixin-cache-as-bitmap/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/mixin-cache-as-bitmap/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/mixin-cache-as-bitmap/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/mixin-cache-as-bitmap/node_modules/@pixi/sprite": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-5.3.11.tgz", - "integrity": "sha512-RM6Sp8kqzsBdX/hDAO25HZywe9VU4uhOronUOQ5Ve0zRe+trdBWQYfi7+5kAcvzqkp25Izc0C+e+4YCqe5OaHQ==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/mixin-cache-as-bitmap/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/mixin-cache-as-bitmap/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/mixin-get-child-by-name": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-5.3.11.tgz", - "integrity": "sha512-fWFVxWtMYcwJttrgDNmZ4CJrx316p8ToNliC2ILmJZW77me7I4GzJ57gSHQU1xFwdHoOYRC4fnlrZoK5qJ9lDw==", - "dev": true, - "dependencies": { - "@pixi/display": "5.3.11" - } - }, - "node_modules/@pixi/mixin-get-child-by-name/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/mixin-get-child-by-name/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/mixin-get-child-by-name/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/mixin-get-child-by-name/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/mixin-get-child-by-name/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/mixin-get-global-position": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-5.3.11.tgz", - "integrity": "sha512-wrS9i+UUodLM5XL2N0Y+XSKiqLRdJV3ltFUWG6+jPT5yoP0HsKtx3sFAzX526RwIYwRzRusbc/quxHfRA4tvgg==", - "dev": true, - "dependencies": { - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11" - } - }, - "node_modules/@pixi/mixin-get-global-position/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/mixin-get-global-position/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/mixin-get-global-position/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/mixin-get-global-position/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/mixin-get-global-position/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/particles": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/particles/-/particles-5.3.11.tgz", - "integrity": "sha512-+mkt/inWXtRrxQc07RZ29uNIDWV1oMsrRBVBIvHgpR92Kn8EjIDRgoSXNu0jiZ18gRKKCBhwsS4dCXGsZRQ/sA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/particles/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/particles/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/particles/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/particles/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/particles/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/particles/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/particles/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/particles/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/polyfill": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/polyfill/-/polyfill-5.3.11.tgz", - "integrity": "sha512-yQOngcnn+2/L7n6L/g45hCnIDLWdnWmmcCY3UKJrOgbNX+JtLru1RR8AGLifkdsa0R5u48x584YQGqkTAChWVA==", - "dev": true, - "dependencies": { - "es6-promise-polyfill": "^1.2.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/@pixi/prepare": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-5.3.11.tgz", - "integrity": "sha512-TvjGeg7xPKjv5NxbM5NXReno9yxUCw/N0HtDEtEFRVeBLN3u0Q/dZsXxL6gIvkHoS09NFW+7AwsYQLZrVbppjA==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/graphics": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/text": "5.3.11", - "@pixi/ticker": "5.3.11" - } - }, - "node_modules/@pixi/prepare/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/prepare/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/prepare/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/prepare/node_modules/@pixi/graphics": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-5.3.11.tgz", - "integrity": "sha512-HLu53LV6mRlY0uFSIM2OrCuL7xqXzeJs5d2QfmUJfKJVVZ9sbHDS+6/N/f0tXzvkRPYhSKXvcNPsNn4HmlIE9w==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/sprite": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/prepare/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/prepare/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/prepare/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/prepare/node_modules/@pixi/sprite": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-5.3.11.tgz", - "integrity": "sha512-RM6Sp8kqzsBdX/hDAO25HZywe9VU4uhOronUOQ5Ve0zRe+trdBWQYfi7+5kAcvzqkp25Izc0C+e+4YCqe5OaHQ==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/prepare/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/prepare/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/runner": { - "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.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.10" - } - }, - "node_modules/@pixi/sprite": { - "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.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": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-5.3.11.tgz", - "integrity": "sha512-xU1b6H8nJ1l05h7cBGw2DGo4QdLj7xootstZUx2BrTVX5ZENn5mjAGVD0uRpk8yt7Q6Bj7M+PS7ktzAgBW/hmQ==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/sprite": "5.3.11", - "@pixi/ticker": "5.3.11" - } - }, - "node_modules/@pixi/sprite-animated/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/sprite-animated/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/sprite-animated/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/sprite-animated/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/sprite-animated/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/sprite-animated/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/sprite-animated/node_modules/@pixi/sprite": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-5.3.11.tgz", - "integrity": "sha512-RM6Sp8kqzsBdX/hDAO25HZywe9VU4uhOronUOQ5Ve0zRe+trdBWQYfi7+5kAcvzqkp25Izc0C+e+4YCqe5OaHQ==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/sprite-animated/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/sprite-animated/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/sprite-tiling": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-5.3.11.tgz", - "integrity": "sha512-KUiWsIumjrnp9QKGMe1BqtrV9Hxm91KoaiOlCBk/gw8753iKvuMmH+/Z0RnzeZylJ1sJsdonTWy/IaLi1jnd0g==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/sprite": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/sprite-tiling/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/sprite-tiling/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/sprite-tiling/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/sprite-tiling/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/sprite-tiling/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/sprite-tiling/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/sprite-tiling/node_modules/@pixi/sprite": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-5.3.11.tgz", - "integrity": "sha512-RM6Sp8kqzsBdX/hDAO25HZywe9VU4uhOronUOQ5Ve0zRe+trdBWQYfi7+5kAcvzqkp25Izc0C+e+4YCqe5OaHQ==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/sprite-tiling/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/sprite-tiling/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/spritesheet": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-5.3.11.tgz", - "integrity": "sha512-Y9Wiwcz/YOuS1v73Ij9KWQakYBzZfldEy3H8T4GPLK+S19/sypntdkNtRZbmR2wWfhJ4axYEB2/Df86aOAU2qA==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/loaders": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/spritesheet/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/spritesheet/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/spritesheet/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/spritesheet/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/spritesheet/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/spritesheet/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/spritesheet/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/text": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/text/-/text-5.3.11.tgz", - "integrity": "sha512-PmWvJv0wiKyyz3fahnxM19+m8IbF2vpDKIImqb5472WyxRGzKyVBW90xrADf5202tdKMk4b8hqvpof2XULr5PA==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/sprite": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/text-bitmap": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-5.3.11.tgz", - "integrity": "sha512-Bjc/G4VHaPXc9HJsvyYOm5cNTHdqmX6AgzBAlCfltuMAlnveUgUPuX8D/MJHRRnoVSDHSmCBtnJgTc0y/nIeCw==", - "dev": true, - "dependencies": { - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/loaders": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/mesh": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/text": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/text-bitmap/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/text-bitmap/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/text-bitmap/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/text-bitmap/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/text-bitmap/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/text-bitmap/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/text-bitmap/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/text-bitmap/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/text/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/@pixi/text/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/@pixi/text/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/text/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/@pixi/text/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/@pixi/text/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/@pixi/text/node_modules/@pixi/sprite": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-5.3.11.tgz", - "integrity": "sha512-RM6Sp8kqzsBdX/hDAO25HZywe9VU4uhOronUOQ5Ve0zRe+trdBWQYfi7+5kAcvzqkp25Izc0C+e+4YCqe5OaHQ==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/@pixi/text/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/@pixi/text/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/@pixi/ticker": { - "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.10", - "@pixi/settings": "6.5.10" - } - }, - "node_modules/@pixi/utils": { - "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": { - "@types/earcut": "^2.1.0", - "earcut": "^2.2.4", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - }, - "peerDependencies": { - "@pixi/constants": "6.5.10", - "@pixi/settings": "6.5.10" - } - }, - "node_modules/@seald-io/binary-search-tree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@seald-io/binary-search-tree/-/binary-search-tree-1.0.3.tgz", - "integrity": "sha512-qv3jnwoakeax2razYaMsGI/luWdliBLHTdC6jU55hQt1hcFqzauH/HsBollQ7IR4ySTtYhT+xyHoijpA16C+tA==", - "dev": true - }, - "node_modules/@seald-io/nedb": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@seald-io/nedb/-/nedb-4.0.4.tgz", - "integrity": "sha512-CUNcMio7QUHTA+sIJ/DC5JzVNNsHe743TPmC4H5Gij9zDLMbmrCT2li3eVB72/gF63BPS8pWEZrjlAMRKA8FDw==", - "dev": true, - "dependencies": { - "@seald-io/binary-search-tree": "^1.0.3", - "localforage": "^1.9.0", - "util": "^0.12.4" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.0.0.tgz", - "integrity": "sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==", - "dev": true - }, - "node_modules/@stylistic/eslint-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.6.1.tgz", - "integrity": "sha512-UT0f4t+3sQ/GKW7875NiIIjZJ1Bh4gd7JNfoIkwIQyWqO7wGd0Pqzu0Ho30Ka8MNF5lm++SkVeqAk26vGxoUpg==", - "dev": true, - "dependencies": { - "@stylistic/eslint-plugin-js": "2.6.1", - "@stylistic/eslint-plugin-jsx": "2.6.1", - "@stylistic/eslint-plugin-plus": "2.6.1", - "@stylistic/eslint-plugin-ts": "2.6.1", - "@types/eslint": "^9.6.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@stylistic/eslint-plugin-js": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-js/-/eslint-plugin-js-2.6.1.tgz", - "integrity": "sha512-iLOiVzcvqzDGD9U0EuVOX680v+XOPiPAjkxWj+Q6iV2GLOM5NB27tKVOpJY7AzBhidwpRbaLTgg3T4UzYx09jw==", - "dev": true, - "dependencies": { - "@types/eslint": "^9.6.0", - "acorn": "^8.12.1", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@stylistic/eslint-plugin-jsx": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-jsx/-/eslint-plugin-jsx-2.6.1.tgz", - "integrity": "sha512-5qHLXqxfY6jubAQfDqrifv41fx7gaqA9svDaChxMI6JiHpEBfh+PXxmm3g+B8gJCYVBTC62Rjl0Ny5QabK58bw==", - "dev": true, - "dependencies": { - "@stylistic/eslint-plugin-js": "^2.6.1", - "@types/eslint": "^9.6.0", - "estraverse": "^5.3.0", - "picomatch": "^4.0.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@stylistic/eslint-plugin-plus": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-plus/-/eslint-plugin-plus-2.6.1.tgz", - "integrity": "sha512-z/IYu/q8ipApzNam5utSU+BrXg4pK/Gv9xNbr4eWv/bZppvTWJU62xCO4nw/6r2dHNPnqc7uCHEC7GMlBnPY0A==", - "dev": true, - "dependencies": { - "@types/eslint": "^9.6.0", - "@typescript-eslint/utils": "^8.0.0" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@stylistic/eslint-plugin-ts": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin-ts/-/eslint-plugin-ts-2.6.1.tgz", - "integrity": "sha512-Mxl1VMorEG1Hc6oBYPD0+KIJOWkjEF1R0liL7wWgKfwpqOkgmnh5lVdZBrYyfRKOE4RlGcwEFTNai1IW6orgVg==", - "dev": true, - "dependencies": { - "@stylistic/eslint-plugin-js": "2.6.1", - "@types/eslint": "^9.6.0", - "@typescript-eslint/utils": "^8.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "peerDependencies": { - "eslint": ">=8.40.0" - } - }, - "node_modules/@types/earcut": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", - "integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==", - "dev": true, - "peer": true - }, - "node_modules/@types/eslint": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", - "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, - "node_modules/@types/jquery": { - "version": "3.5.30", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.30.tgz", - "integrity": "sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==", - "dev": true, - "dependencies": { - "@types/sizzle": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/node": { - "version": "22.4.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.4.1.tgz", - "integrity": "sha512-1tbpb9325+gPnKK0dMm+/LMriX0vKxf6RnB0SZUqfyVkQ4fMgUSySqhxE/y8Jvs4NyF1yHzTfG9KlnkIODxPKg==", - "dev": true, - "dependencies": { - "undici-types": "~6.19.2" - } - }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.3", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", - "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", - "dev": true, - "peer": true - }, - "node_modules/@types/simple-peer": { - "version": "9.11.8", - "resolved": "https://registry.npmjs.org/@types/simple-peer/-/simple-peer-9.11.8.tgz", - "integrity": "sha512-rvqefdp2rvIA6wiomMgKWd2UZNPe6LM2EV5AuY3CPQJF+8TbdrL5TjYdMf0VAjGczzlkH4l1NjDkihwbj3Xodw==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/sizzle": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", - "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==", - "dev": true - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.0.1.tgz", - "integrity": "sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.0.1", - "@typescript-eslint/visitor-keys": "8.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.0.1.tgz", - "integrity": "sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.0.1.tgz", - "integrity": "sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.0.1", - "@typescript-eslint/visitor-keys": "8.0.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.0.1.tgz", - "integrity": "sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.0.1", - "@typescript-eslint/types": "8.0.1", - "@typescript-eslint/typescript-estree": "8.0.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.0.1.tgz", - "integrity": "sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "8.0.1", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "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/abstract-level": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", - "integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dev": true, - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/classic-level": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz", - "integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "17.2.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.2.tgz", - "integrity": "sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/engine.io-client": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.0.3.tgz", - "integrity": "sha512-IH8ZhDIwiLv0d/wXVzmjfV9Y82hbJIDhCGSVUV8o1kcpDe2I6Y3bZA3ZbJy4Ls7k7IVmcy/qn4k9RKWFhUGf5w==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~8.2.3", - "xmlhttprequest-ssl": "~2.0.0", - "yeast": "0.1.2" - } - }, - "node_modules/engine.io-parser": { - "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-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es6-promise-polyfill": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz", - "integrity": "sha512-HHb0vydCpoclpd0ySPkRXMmBw80MRt1wM4RBJBlXkux97K7gleabZdsR0gvE1nNPM9mgOZIBTzjjXiPxf4lIqQ==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.8.0.tgz", - "integrity": "sha512-K8qnZ/QJzT2dLKdZJVX6W4XOwBzutMYmt0lqUS+JdXgd+HTYFlonFgkJ8s44d/zMPPCnOOk0kMWCApCPhiOy9A==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.11.0", - "@eslint/config-array": "^0.17.1", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.8.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.3.0", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.0.2", - "eslint-visitor-keys": "^4.0.0", - "espree": "^10.1.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "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.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/eslint-scope": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.2.tgz", - "integrity": "sha512-6E4xmrTw5wtxnLA5wYL3WDfhZ/1bUBGOXV0zQvVRDOtrR8D0p6W7fs3JweNYhwRYeGvd/1CKX2se0/2s7Q/nJA==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", - "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esm": { - "version": "3.2.25", - "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", - "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/espree": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", - "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", - "dev": true, - "dependencies": { - "acorn": "^8.12.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.0.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter3": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", - "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "15.9.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz", - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dev": true, - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/ismobilejs": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz", - "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-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", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", - "dev": true, - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/localforage": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", - "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "dev": true, - "dependencies": { - "lie": "3.1.1" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mini-signals": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mini-signals/-/mini-signals-1.2.0.tgz", - "integrity": "sha512-alffqMkGCjjTSwvYMVLx+7QeJ6sTuxbXqBkP21my4iWU5+QpTQAJt3h7htA1OKm9F3BpMM0vnu72QIoiJakrLA==", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", - "dev": true - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/nedb-promises": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/nedb-promises/-/nedb-promises-6.2.3.tgz", - "integrity": "sha512-enq0IjNyBz9Qy9W/QPCcLGh/QORGBjXbIeZeWvIjO3OMLyAvlKT3hiJubP2BKEiFniUlR3L01o18ktqgn5jxqA==", - "dev": true, - "dependencies": { - "@seald-io/nedb": "^4.0.2" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-uri": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/parse-uri/-/parse-uri-1.0.9.tgz", - "integrity": "sha512-YZfRHHkEZa6qTfPF/xgZ1ErQYCABfud/Vcqp1Q1GNa7RKwv6Oe0YaxXfQQMnQsGdNTo3fwaT0GbVEX7dMAr7tw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", - "dev": true - }, - "node_modules/parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pixi-particles": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/pixi-particles/-/pixi-particles-4.3.1.tgz", - "integrity": "sha512-XSqDFgYwm/7FRCgP5I2Fc57d98qvb1ql/x4uTjdP4uXDUGgjdO8OW/2A0HVWS1CkOht/1x6dQzsM1oCJAUlaow==", - "dev": true, - "peerDependencies": { - "pixi.js": ">=4.0.0" - } - }, - "node_modules/pixi.js": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-5.3.11.tgz", - "integrity": "sha512-/9td6IHDQqG0Po5lyQ5aKDzrnEVD1SvGourI4Nqp0mvNI0Cbm74tMHLjk1V5foqGPAS9pochENr6Y3ft/2cDiQ==", - "dev": true, - "dependencies": { - "@pixi/accessibility": "5.3.11", - "@pixi/app": "5.3.11", - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/extract": "5.3.11", - "@pixi/filter-alpha": "5.3.11", - "@pixi/filter-blur": "5.3.11", - "@pixi/filter-color-matrix": "5.3.11", - "@pixi/filter-displacement": "5.3.11", - "@pixi/filter-fxaa": "5.3.11", - "@pixi/filter-noise": "5.3.11", - "@pixi/graphics": "5.3.11", - "@pixi/interaction": "5.3.11", - "@pixi/loaders": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/mesh": "5.3.11", - "@pixi/mesh-extras": "5.3.11", - "@pixi/mixin-cache-as-bitmap": "5.3.11", - "@pixi/mixin-get-child-by-name": "5.3.11", - "@pixi/mixin-get-global-position": "5.3.11", - "@pixi/particles": "5.3.11", - "@pixi/polyfill": "5.3.11", - "@pixi/prepare": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/sprite": "5.3.11", - "@pixi/sprite-animated": "5.3.11", - "@pixi/sprite-tiling": "5.3.11", - "@pixi/spritesheet": "5.3.11", - "@pixi/text": "5.3.11", - "@pixi/text-bitmap": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/pixi.js/node_modules/@pixi/constants": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.11.tgz", - "integrity": "sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==", - "dev": true - }, - "node_modules/pixi.js/node_modules/@pixi/core": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.11.tgz", - "integrity": "sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/runner": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/ticker": "5.3.11", - "@pixi/utils": "5.3.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/pixijs" - } - }, - "node_modules/pixi.js/node_modules/@pixi/display": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.11.tgz", - "integrity": "sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==", - "dev": true, - "dependencies": { - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/pixi.js/node_modules/@pixi/graphics": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-5.3.11.tgz", - "integrity": "sha512-HLu53LV6mRlY0uFSIM2OrCuL7xqXzeJs5d2QfmUJfKJVVZ9sbHDS+6/N/f0tXzvkRPYhSKXvcNPsNn4HmlIE9w==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/sprite": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/pixi.js/node_modules/@pixi/math": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.11.tgz", - "integrity": "sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==", - "dev": true - }, - "node_modules/pixi.js/node_modules/@pixi/runner": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.11.tgz", - "integrity": "sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==", - "dev": true - }, - "node_modules/pixi.js/node_modules/@pixi/settings": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.11.tgz", - "integrity": "sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==", - "dev": true, - "dependencies": { - "ismobilejs": "^1.1.0" - } - }, - "node_modules/pixi.js/node_modules/@pixi/sprite": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-5.3.11.tgz", - "integrity": "sha512-RM6Sp8kqzsBdX/hDAO25HZywe9VU4uhOronUOQ5Ve0zRe+trdBWQYfi7+5kAcvzqkp25Izc0C+e+4YCqe5OaHQ==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/core": "5.3.11", - "@pixi/display": "5.3.11", - "@pixi/math": "5.3.11", - "@pixi/settings": "5.3.11", - "@pixi/utils": "5.3.11" - } - }, - "node_modules/pixi.js/node_modules/@pixi/ticker": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.11.tgz", - "integrity": "sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==", - "dev": true, - "dependencies": { - "@pixi/settings": "5.3.11" - } - }, - "node_modules/pixi.js/node_modules/@pixi/utils": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.11.tgz", - "integrity": "sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==", - "dev": true, - "dependencies": { - "@pixi/constants": "5.3.11", - "@pixi/settings": "5.3.11", - "earcut": "^2.1.5", - "eventemitter3": "^3.1.0", - "url": "^0.11.0" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resource-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/resource-loader/-/resource-loader-3.0.1.tgz", - "integrity": "sha512-fBuCRbEHdLCI1eglzQhUv9Rrdcmqkydr1r6uHE2cYHvRBrcLXeSmbE/qI/urFt8rPr/IGxir3BUwM5kUK8XoyA==", - "dev": true, - "dependencies": { - "mini-signals": "^1.2.0", - "parse-uri": "^1.0.0" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/socket.io-client": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.3.2.tgz", - "integrity": "sha512-2B9LqSunN60yV8F7S84CCEEcgbYNfrn7ejIInZtLZ7ppWtiX8rGZAjvdCvbnC8bqo/9RlCNOUsORLyskxSFP1g==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.0.0", - "backo2": "~1.0.2", - "debug": "~4.3.2", - "engine.io-client": "~6.0.1", - "parseuri": "0.0.6", - "socket.io-parser": "~4.1.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.1.2.tgz", - "integrity": "sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==", - "dev": true, - "dependencies": { - "@socket.io/component-emitter": "~3.0.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/tinymce": { - "version": "5.10.1", - "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-5.10.1.tgz", - "integrity": "sha512-aIsFTYiuESpoYkCgkoojpVtPwrSvYBxp4mMEGsj20CnUruLCWosywkbYHDII+j7KlQZZn3p+xK89f5gT3QyuGw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", - "dev": true, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.19.2", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.2.tgz", - "integrity": "sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==", - "dev": true, - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici-types": { - "version": "6.19.6", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.6.tgz", - "integrity": "sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==", - "dev": true - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", - "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", - "dev": true, - "dependencies": { - "punycode": "^1.4.1", - "qs": "^6.12.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "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", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/ws": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", - "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==", - "dev": true - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..78cc67b --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,2119 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +devDependencies: + '@eslint/js': + specifier: ^9.8.0 + version: 9.37.0 + '@foundryvtt/foundryvtt-cli': + specifier: ^1.0.3 + version: 1.1.0 + '@league-of-foundry-developers/foundry-vtt-types': + specifier: ^9.280.0 + version: 9.280.1(@pixi/constants@6.5.10)(@pixi/core@6.5.10)(@pixi/display@6.5.10)(@pixi/graphics@6.5.10)(@pixi/math@6.5.10)(@pixi/utils@6.5.10) + '@playwright/test': + specifier: ^1.56.0 + version: 1.56.0 + '@stylistic/eslint-plugin': + specifier: ^2.6.1 + version: 2.13.0(eslint@9.37.0)(typescript@5.9.3) + '@types/node': + specifier: ^24.7.2 + version: 24.7.2 + dotenv: + specifier: ^17.2.2 + version: 17.2.3 + eslint: + specifier: ^9.8.0 + version: 9.37.0 + globals: + specifier: ^15.9.0 + version: 15.15.0 + +packages: + + /@eslint-community/eslint-utils@4.9.0(eslint@9.37.0): + resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 9.37.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.12.1: + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/config-array@0.21.0: + resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.3 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/config-helpers@0.4.0: + resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/core': 0.16.0 + dev: true + + /@eslint/core@0.16.0: + resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@types/json-schema': 7.0.15 + dev: true + + /@eslint/eslintrc@3.3.1: + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@9.37.0: + resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/object-schema@2.1.6: + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/plugin-kit@0.4.0: + resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/core': 0.16.0 + levn: 0.4.1 + dev: true + + /@foundryvtt/foundryvtt-cli@1.1.0: + resolution: {integrity: sha512-ergKZDUSgQ79168r38ORyN4v/UTliA40rxElaUh5iS27Qw9H8Ep/ll8j3/HfiikO3XUDwYxZLfDJfbcyj2i9TQ==} + engines: {node: '>17.0.0'} + hasBin: true + dependencies: + chalk: 5.6.2 + classic-level: 1.4.1 + esm: 3.2.25 + js-yaml: 4.1.0 + mkdirp: 3.0.1 + nedb-promises: 6.2.3 + yargs: 17.7.2 + dev: true + + /@humanfs/core@0.19.1: + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + dev: true + + /@humanfs/node@0.16.7: + resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + engines: {node: '>=18.18.0'} + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.4.3 + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/retry@0.4.3: + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + dev: true + + /@league-of-foundry-developers/foundry-vtt-types@9.280.1(@pixi/constants@6.5.10)(@pixi/core@6.5.10)(@pixi/display@6.5.10)(@pixi/graphics@6.5.10)(@pixi/math@6.5.10)(@pixi/utils@6.5.10): + resolution: {integrity: sha512-o7+hUxUgCR0wlIQR+fdYYl/n+k/HYWPcqJhJpzm+p4YjMIivVrLf7XOut2wwFUDpUHvcJn85Nlj9dvf3PEQnHw==} + dependencies: + '@pixi/graphics-smooth': 0.0.22(@pixi/constants@6.5.10)(@pixi/core@6.5.10)(@pixi/display@6.5.10)(@pixi/graphics@6.5.10)(@pixi/math@6.5.10)(@pixi/utils@6.5.10) + '@types/jquery': 3.5.33 + '@types/simple-peer': 9.11.8 + handlebars: 4.7.7 + pixi-particles: 4.3.1(pixi.js@5.3.11) + pixi.js: 5.3.11 + socket.io-client: 4.3.2 + tinymce: 5.10.1 + transitivePeerDependencies: + - '@pixi/constants' + - '@pixi/core' + - '@pixi/display' + - '@pixi/graphics' + - '@pixi/math' + - '@pixi/utils' + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + dev: true + + /@pixi/accessibility@5.3.11: + resolution: {integrity: sha512-/oSizd8/g6KUCeAlknMLJ9CRxBt+vWs6e2DrOctMoRupEHcmhICCjIyAp5GF6RZy9T9gNHDOU5p7vo7qEyVxgQ==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/app@5.3.11: + resolution: {integrity: sha512-ZWrOjGvVl+lK5OJQT3OqSnSRtU2XgQSe/ULg2uGsSWUqMkJews33JIGOjvk4tIsjm4ekSKiPZRMdYFHzPfgEJg==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + dev: true + + /@pixi/constants@5.3.11: + resolution: {integrity: sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==} + dev: true + + /@pixi/constants@6.5.10: + resolution: {integrity: sha512-PUF2Y9YISRu5eVrVVHhHCWpc/KmxQTg3UH8rIUs8UI9dCK41/wsPd3pEahzf7H47v7x1HCohVZcFO3XQc1bUDw==} + dev: true + + /@pixi/core@5.3.11: + resolution: {integrity: sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==} + dependencies: + '@pixi/constants': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/runner': 5.3.11 + '@pixi/settings': 5.3.11 + '@pixi/ticker': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/core@6.5.10(@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): + resolution: {integrity: sha512-Gdzp5ENypyglvsh5Gv3teUZnZnmizo4xOsL+QqmWALdFlJXJwLJMVhKVThV/q/095XR6i4Ou54oshn+m4EkuFw==} + peerDependencies: + '@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 + dependencies: + '@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/constants@6.5.10) + '@pixi/ticker': 6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10) + '@pixi/utils': 6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10) + '@types/offscreencanvas': 2019.7.3 + dev: true + + /@pixi/display@5.3.11: + resolution: {integrity: sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==} + dependencies: + '@pixi/math': 5.3.11 + '@pixi/settings': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/display@6.5.10(@pixi/constants@6.5.10)(@pixi/math@6.5.10)(@pixi/settings@6.5.10)(@pixi/utils@6.5.10): + resolution: {integrity: sha512-NxFdDDxlbH5fQkzGHraLGoTMucW9pVgXqQm13TSmkA3NWIi/SItHL4qT2SI8nmclT9Vid1VDEBCJFAbdeuQw1Q==} + peerDependencies: + '@pixi/constants': 6.5.10 + '@pixi/math': 6.5.10 + '@pixi/settings': 6.5.10 + '@pixi/utils': 6.5.10 + dependencies: + '@pixi/constants': 6.5.10 + '@pixi/math': 6.5.10 + '@pixi/settings': 6.5.10(@pixi/constants@6.5.10) + '@pixi/utils': 6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10) + dev: true + + /@pixi/extensions@6.5.10: + resolution: {integrity: sha512-EIUGza+E+sCy3dupuIjvRK/WyVyfSzHb5XsxRaxNrPwvG1iIUIqNqZ3owLYCo4h17fJWrj/yXVufNNtUKQccWQ==} + dev: true + + /@pixi/extract@5.3.11: + resolution: {integrity: sha512-YeBrpIO3E5HUgcdKEldCUqwwDNHm5OBe98YFcdLr5Z0+dQaHnxp9Dm4n75/NojoGb5guYdrV00x+gU2UPHsVdw==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/filter-alpha@5.3.11: + resolution: {integrity: sha512-HC4PbiEqDWSi3A715av7knFqD3knSXRxPJKG9mWat2CU9eCizSw+JxXp/okMU/fL4ewooiqQWVU2l1wXOHhVFw==} + dependencies: + '@pixi/core': 5.3.11 + dev: true + + /@pixi/filter-blur@5.3.11: + resolution: {integrity: sha512-iW5cOMEcDiJidOV95bUfhxdcvwM9JzCoWAd+92gAie8L+ElRSHpu1jxXbKHjo/QczQV1LulOlheyDaJNpaBCDg==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/settings': 5.3.11 + dev: true + + /@pixi/filter-color-matrix@5.3.11: + resolution: {integrity: sha512-u9NT4+N1I3XV9ygwsmF8/jIwCLqNCLeFOdM4f73kbw/UmakZZ6i6xjjJMc5YFUpC25qDr1TFlqgdGGGHAPl4ug==} + dependencies: + '@pixi/core': 5.3.11 + dev: true + + /@pixi/filter-displacement@5.3.11: + resolution: {integrity: sha512-CTIy7C/L9I1X3VNx4nMzQbMFvznsGk2viQh0dSo8r5NLgmaAdxhkGI0KUpNjLBz30278tzFfNuRe59K1y1kHuw==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/math': 5.3.11 + dev: true + + /@pixi/filter-fxaa@5.3.11: + resolution: {integrity: sha512-0ahjui5385e1vRvd7zCc0n5W8ULtNI1uVbDJHP9ueeiF25TKC0GqtZzntNwrQPoU46q8zXdnIGjzMpikbbAasg==} + dependencies: + '@pixi/core': 5.3.11 + dev: true + + /@pixi/filter-noise@5.3.11: + resolution: {integrity: sha512-98WC9Nd5u2F03Ned9T3vnbmO/YF1jLSioZ623z9wjqpd5DosZgRtYTSGxjVcXTSfpviIuiJpkyF+X097pbVprg==} + dependencies: + '@pixi/core': 5.3.11 + dev: true + + /@pixi/graphics-smooth@0.0.22(@pixi/constants@6.5.10)(@pixi/core@6.5.10)(@pixi/display@6.5.10)(@pixi/graphics@6.5.10)(@pixi/math@6.5.10)(@pixi/utils@6.5.10): + resolution: {integrity: sha512-qq2u+BJBIDBuuSTc2Xzm1D/8RiiKBdxnVDiMb7Go5v8achnV5ctC6m+rf8Mq0sWm66mbOqu1aq/9efT4A4sPrA==} + peerDependencies: + '@pixi/constants': ^6.0.4 + '@pixi/core': ^6.0.4 + '@pixi/display': ^6.0.4 + '@pixi/graphics': ^6.0.4 + '@pixi/math': ^6.0.4 + '@pixi/utils': ^6.0.4 + dependencies: + '@pixi/constants': 6.5.10 + '@pixi/core': 6.5.10(@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) + '@pixi/display': 6.5.10(@pixi/constants@6.5.10)(@pixi/math@6.5.10)(@pixi/settings@6.5.10)(@pixi/utils@6.5.10) + '@pixi/graphics': 6.5.10(@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) + '@pixi/math': 6.5.10 + '@pixi/utils': 6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10) + dev: true + + /@pixi/graphics@5.3.11: + resolution: {integrity: sha512-HLu53LV6mRlY0uFSIM2OrCuL7xqXzeJs5d2QfmUJfKJVVZ9sbHDS+6/N/f0tXzvkRPYhSKXvcNPsNn4HmlIE9w==} + dependencies: + '@pixi/constants': 5.3.11 + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/sprite': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/graphics@6.5.10(@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): + resolution: {integrity: sha512-KPHGJ910fi8bRQQ+VcTIgrK+bKIm8yAQaZKPqMtm14HzHPGcES6HkgeNY1sd7m8J4aS9btm5wOSyFu0p5IzTpA==} + peerDependencies: + '@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 + dependencies: + '@pixi/constants': 6.5.10 + '@pixi/core': 6.5.10(@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) + '@pixi/display': 6.5.10(@pixi/constants@6.5.10)(@pixi/math@6.5.10)(@pixi/settings@6.5.10)(@pixi/utils@6.5.10) + '@pixi/math': 6.5.10 + '@pixi/sprite': 6.5.10(@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) + '@pixi/utils': 6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10) + dev: true + + /@pixi/interaction@5.3.11: + resolution: {integrity: sha512-n2K99CYyBcrf8NPxpzmZ5IlJ9TEplsSZfJ/uzMNOEnTObKl4wAhxs51Nb58raH3Ouzwu14YHOpqYrBTEoT1yPA==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/ticker': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/loaders@5.3.11: + resolution: {integrity: sha512-1HAeb/NFXyhNhZWAbVkngsTPBGpjZEPhQflBTrKycRaub7XDSZ8F0fwPltpKKVRWNDT+HBgU/zDNE2fpjzqfYg==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/utils': 5.3.11 + resource-loader: 3.0.1 + dev: true + + /@pixi/math@5.3.11: + resolution: {integrity: sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==} + dev: true + + /@pixi/math@6.5.10: + resolution: {integrity: sha512-fxeu7ykVbMGxGV2S3qRTupHToeo1hdWBm8ihyURn3BMqJZe2SkZEECPd5RyvIuuNUtjRnmhkZRnF3Jsz2S+L0g==} + dev: true + + /@pixi/mesh-extras@5.3.11: + resolution: {integrity: sha512-1GTCMMUW1xv/72x26cxRysblBXW0wU77TNgqtSIMZ1M6JbleObChklWTvwi9MzQO2vQ3S6Hvcsa5m5EiM2hSPQ==} + dependencies: + '@pixi/constants': 5.3.11 + '@pixi/core': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/mesh': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/mesh@5.3.11: + resolution: {integrity: sha512-KWKKksEr0YuUX1uz1FmpIa/Y37b/0pvFUS+87LoyYq0mRtGbKsTY5i3lBPG/taHwN7a2DQAX3JZpw6yhGKoGpA==} + dependencies: + '@pixi/constants': 5.3.11 + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/settings': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/mixin-cache-as-bitmap@5.3.11: + resolution: {integrity: sha512-uQUxatGTTD5zfQ0pWdjibVjT+xEEZJ/xZDZtm/GxC7HSHd4jgoJBcTXWVhbhzwpLPVTnD8+sMnRrGlhoKcpTpQ==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/settings': 5.3.11 + '@pixi/sprite': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/mixin-get-child-by-name@5.3.11: + resolution: {integrity: sha512-fWFVxWtMYcwJttrgDNmZ4CJrx316p8ToNliC2ILmJZW77me7I4GzJ57gSHQU1xFwdHoOYRC4fnlrZoK5qJ9lDw==} + dependencies: + '@pixi/display': 5.3.11 + dev: true + + /@pixi/mixin-get-global-position@5.3.11: + resolution: {integrity: sha512-wrS9i+UUodLM5XL2N0Y+XSKiqLRdJV3ltFUWG6+jPT5yoP0HsKtx3sFAzX526RwIYwRzRusbc/quxHfRA4tvgg==} + dependencies: + '@pixi/display': 5.3.11 + '@pixi/math': 5.3.11 + dev: true + + /@pixi/particles@5.3.11: + resolution: {integrity: sha512-+mkt/inWXtRrxQc07RZ29uNIDWV1oMsrRBVBIvHgpR92Kn8EjIDRgoSXNu0jiZ18gRKKCBhwsS4dCXGsZRQ/sA==} + dependencies: + '@pixi/constants': 5.3.11 + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/polyfill@5.3.11: + resolution: {integrity: sha512-yQOngcnn+2/L7n6L/g45hCnIDLWdnWmmcCY3UKJrOgbNX+JtLru1RR8AGLifkdsa0R5u48x584YQGqkTAChWVA==} + dependencies: + es6-promise-polyfill: 1.2.0 + object-assign: 4.1.1 + dev: true + + /@pixi/prepare@5.3.11: + resolution: {integrity: sha512-TvjGeg7xPKjv5NxbM5NXReno9yxUCw/N0HtDEtEFRVeBLN3u0Q/dZsXxL6gIvkHoS09NFW+7AwsYQLZrVbppjA==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + '@pixi/graphics': 5.3.11 + '@pixi/settings': 5.3.11 + '@pixi/text': 5.3.11 + '@pixi/ticker': 5.3.11 + dev: true + + /@pixi/runner@5.3.11: + resolution: {integrity: sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==} + dev: true + + /@pixi/runner@6.5.10: + resolution: {integrity: sha512-4HiHp6diCmigJT/DSbnqQP62OfWKmZB7zPWMdV1AEdr4YT1QxzXAW1wHg7dkoEfyTHqZKl0tm/zcqKq/iH7tMA==} + dev: true + + /@pixi/settings@5.3.11: + resolution: {integrity: sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==} + dependencies: + ismobilejs: 1.1.1 + dev: true + + /@pixi/settings@6.5.10(@pixi/constants@6.5.10): + resolution: {integrity: sha512-ypAS5L7pQ2Qb88yQK72bXtc7sD8OrtLWNXdZ/gnw5kwSWCFaOSoqhKqJCXrR5DQtN98+RQefwbEAmMvqobhFyw==} + peerDependencies: + '@pixi/constants': 6.5.10 + dependencies: + '@pixi/constants': 6.5.10 + dev: true + + /@pixi/sprite-animated@5.3.11: + resolution: {integrity: sha512-xU1b6H8nJ1l05h7cBGw2DGo4QdLj7xootstZUx2BrTVX5ZENn5mjAGVD0uRpk8yt7Q6Bj7M+PS7ktzAgBW/hmQ==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/sprite': 5.3.11 + '@pixi/ticker': 5.3.11 + dev: true + + /@pixi/sprite-tiling@5.3.11: + resolution: {integrity: sha512-KUiWsIumjrnp9QKGMe1BqtrV9Hxm91KoaiOlCBk/gw8753iKvuMmH+/Z0RnzeZylJ1sJsdonTWy/IaLi1jnd0g==} + dependencies: + '@pixi/constants': 5.3.11 + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/sprite': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/sprite@5.3.11: + resolution: {integrity: sha512-RM6Sp8kqzsBdX/hDAO25HZywe9VU4uhOronUOQ5Ve0zRe+trdBWQYfi7+5kAcvzqkp25Izc0C+e+4YCqe5OaHQ==} + dependencies: + '@pixi/constants': 5.3.11 + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/settings': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/sprite@6.5.10(@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): + resolution: {integrity: sha512-UiK+8LgM9XQ/SBDKjRgZ8WggdOSlFRXqiWjEZVmNkiyU8HvXeFzWPRhpc8RR1zDwAUhZWKtMhF8X/ba9m+z2lg==} + peerDependencies: + '@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 + dependencies: + '@pixi/constants': 6.5.10 + '@pixi/core': 6.5.10(@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) + '@pixi/display': 6.5.10(@pixi/constants@6.5.10)(@pixi/math@6.5.10)(@pixi/settings@6.5.10)(@pixi/utils@6.5.10) + '@pixi/math': 6.5.10 + '@pixi/settings': 6.5.10(@pixi/constants@6.5.10) + '@pixi/utils': 6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10) + dev: true + + /@pixi/spritesheet@5.3.11: + resolution: {integrity: sha512-Y9Wiwcz/YOuS1v73Ij9KWQakYBzZfldEy3H8T4GPLK+S19/sypntdkNtRZbmR2wWfhJ4axYEB2/Df86aOAU2qA==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/loaders': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/text-bitmap@5.3.11: + resolution: {integrity: sha512-Bjc/G4VHaPXc9HJsvyYOm5cNTHdqmX6AgzBAlCfltuMAlnveUgUPuX8D/MJHRRnoVSDHSmCBtnJgTc0y/nIeCw==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + '@pixi/loaders': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/mesh': 5.3.11 + '@pixi/settings': 5.3.11 + '@pixi/text': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/text@5.3.11: + resolution: {integrity: sha512-PmWvJv0wiKyyz3fahnxM19+m8IbF2vpDKIImqb5472WyxRGzKyVBW90xrADf5202tdKMk4b8hqvpof2XULr5PA==} + dependencies: + '@pixi/core': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/settings': 5.3.11 + '@pixi/sprite': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /@pixi/ticker@5.3.11: + resolution: {integrity: sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==} + dependencies: + '@pixi/settings': 5.3.11 + dev: true + + /@pixi/ticker@6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10): + resolution: {integrity: sha512-UqX1XYtzqFSirmTOy8QAK4Ccg4KkIZztrBdRPKwFSOEiKAJoGDCSBmyQBo/9aYQKGObbNnrJ7Hxv3/ucg3/1GA==} + peerDependencies: + '@pixi/extensions': 6.5.10 + '@pixi/settings': 6.5.10 + dependencies: + '@pixi/extensions': 6.5.10 + '@pixi/settings': 6.5.10(@pixi/constants@6.5.10) + dev: true + + /@pixi/utils@5.3.11: + resolution: {integrity: sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==} + dependencies: + '@pixi/constants': 5.3.11 + '@pixi/settings': 5.3.11 + earcut: 2.2.4 + eventemitter3: 3.1.2 + url: 0.11.4 + dev: true + + /@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10): + resolution: {integrity: sha512-4f4qDMmAz9IoSAe08G2LAxUcEtG9jSdudfsMQT2MG+OpfToirboE6cNoO0KnLCvLzDVE/mfisiQ9uJbVA9Ssdw==} + peerDependencies: + '@pixi/constants': 6.5.10 + '@pixi/settings': 6.5.10 + dependencies: + '@pixi/constants': 6.5.10 + '@pixi/settings': 6.5.10(@pixi/constants@6.5.10) + '@types/earcut': 2.1.4 + earcut: 2.2.4 + eventemitter3: 3.1.2 + url: 0.11.4 + dev: true + + /@playwright/test@1.56.0: + resolution: {integrity: sha512-Tzh95Twig7hUwwNe381/K3PggZBZblKUe2wv25oIpzWLr6Z0m4KgV1ZVIjnR6GM9ANEqjZD7XsZEa6JL/7YEgg==} + engines: {node: '>=18'} + hasBin: true + dependencies: + playwright: 1.56.0 + dev: true + + /@seald-io/binary-search-tree@1.0.3: + resolution: {integrity: sha512-qv3jnwoakeax2razYaMsGI/luWdliBLHTdC6jU55hQt1hcFqzauH/HsBollQ7IR4ySTtYhT+xyHoijpA16C+tA==} + dev: true + + /@seald-io/nedb@4.1.2: + resolution: {integrity: sha512-bDr6TqjBVS2rDyYM9CPxAnotj5FuNL9NF8o7h7YyFXM7yruqT4ddr+PkSb2mJvvw991bqdftazkEo38gykvaww==} + dependencies: + '@seald-io/binary-search-tree': 1.0.3 + localforage: 1.10.0 + util: 0.12.5 + dev: true + + /@socket.io/component-emitter@3.0.0: + resolution: {integrity: sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==} + dev: true + + /@stylistic/eslint-plugin@2.13.0(eslint@9.37.0)(typescript@5.9.3): + resolution: {integrity: sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.40.0' + dependencies: + '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.9.3) + eslint: 9.37.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + estraverse: 5.3.0 + picomatch: 4.0.3 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@types/earcut@2.1.4: + resolution: {integrity: sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==} + dev: true + + /@types/estree@1.0.8: + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + dev: true + + /@types/jquery@3.5.33: + resolution: {integrity: sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==} + dependencies: + '@types/sizzle': 2.3.10 + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/node@24.7.2: + resolution: {integrity: sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==} + dependencies: + undici-types: 7.14.0 + dev: true + + /@types/offscreencanvas@2019.7.3: + resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} + dev: true + + /@types/simple-peer@9.11.8: + resolution: {integrity: sha512-rvqefdp2rvIA6wiomMgKWd2UZNPe6LM2EV5AuY3CPQJF+8TbdrL5TjYdMf0VAjGczzlkH4l1NjDkihwbj3Xodw==} + dependencies: + '@types/node': 24.7.2 + dev: true + + /@types/sizzle@2.3.10: + resolution: {integrity: sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==} + dev: true + + /@typescript-eslint/project-service@8.46.1(typescript@5.9.3): + resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) + '@typescript-eslint/types': 8.46.1 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@8.46.1: + resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 + dev: true + + /@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.9.3): + resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + dependencies: + typescript: 5.9.3 + dev: true + + /@typescript-eslint/types@8.46.1: + resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@typescript-eslint/typescript-estree@8.46.1(typescript@5.9.3): + resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@typescript-eslint/project-service': 8.46.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/visitor-keys': 8.46.1 + debug: 4.4.3 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@8.46.1(eslint@9.37.0)(typescript@5.9.3): + resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) + '@typescript-eslint/scope-manager': 8.46.1 + '@typescript-eslint/types': 8.46.1 + '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) + eslint: 9.37.0 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/visitor-keys@8.46.1: + resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@typescript-eslint/types': 8.46.1 + eslint-visitor-keys: 4.2.1 + dev: true + + /abstract-level@1.0.4: + resolution: {integrity: sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==} + engines: {node: '>=12'} + dependencies: + buffer: 6.0.3 + catering: 2.1.1 + is-buffer: 2.0.5 + level-supports: 4.0.1 + level-transcoder: 1.0.1 + module-error: 1.0.2 + queue-microtask: 1.2.3 + dev: true + + /acorn-jsx@5.3.2(acorn@8.15.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.15.0 + dev: true + + /acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.1.0 + dev: true + + /backo2@1.0.2: + resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: true + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + dev: true + + /call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + dev: true + + /call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /catering@2.1.1: + resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} + engines: {node: '>=6'} + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /classic-level@1.4.1: + resolution: {integrity: sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==} + engines: {node: '>=12'} + requiresBuild: true + dependencies: + abstract-level: 1.0.4 + catering: 2.1.1 + module-error: 1.0.2 + napi-macros: 2.2.2 + node-gyp-build: 4.8.4 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + + /dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + dev: true + + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: true + + /earcut@2.2.4: + resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /engine.io-client@6.0.3: + resolution: {integrity: sha512-IH8ZhDIwiLv0d/wXVzmjfV9Y82hbJIDhCGSVUV8o1kcpDe2I6Y3bZA3ZbJy4Ls7k7IVmcy/qn4k9RKWFhUGf5w==} + dependencies: + '@socket.io/component-emitter': 3.0.0 + debug: 4.3.7 + engine.io-parser: 5.0.7 + has-cors: 1.1.0 + parseqs: 0.0.6 + parseuri: 0.0.6 + ws: 8.2.3 + xmlhttprequest-ssl: 2.0.0 + yeast: 0.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /engine.io-parser@5.0.7: + resolution: {integrity: sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==} + engines: {node: '>=10.0.0'} + dev: true + + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + + /es6-promise-polyfill@1.2.0: + resolution: {integrity: sha512-HHb0vydCpoclpd0ySPkRXMmBw80MRt1wM4RBJBlXkux97K7gleabZdsR0gvE1nNPM9mgOZIBTzjjXiPxf4lIqQ==} + dev: true + + /escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /eslint@9.37.0: + resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.21.0 + '@eslint/config-helpers': 0.4.0 + '@eslint/core': 0.16.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.37.0 + '@eslint/plugin-kit': 0.4.0 + '@humanfs/node': 0.16.7 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + transitivePeerDependencies: + - supports-color + dev: true + + /esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + dev: true + + /espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + dev: true + + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /eventemitter3@3.1.2: + resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.19.1: + resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + dependencies: + reusify: 1.1.0 + dev: true + + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + dependencies: + flat-cache: 4.0.1 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 + dev: true + + /flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + dev: true + + /for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + dev: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + dev: true + + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + dev: true + + /globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + dev: true + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + dev: true + + /handlebars@4.7.7: + resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + dev: true + + /has-cors@1.1.0: + resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.1 + dev: true + + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + dev: true + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + dev: true + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: true + + /import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-arguments@1.2.0: + resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + dev: true + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.19 + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /ismobilejs@1.1.1: + resolution: {integrity: sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /level-supports@4.0.1: + resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} + engines: {node: '>=12'} + dev: true + + /level-transcoder@1.0.1: + resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} + engines: {node: '>=12'} + dependencies: + buffer: 6.0.3 + module-error: 1.0.2 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lie@3.1.1: + resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} + dependencies: + immediate: 3.0.6 + dev: true + + /localforage@1.10.0: + resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + dependencies: + lie: 3.1.1 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: true + + /mini-signals@1.2.0: + resolution: {integrity: sha512-alffqMkGCjjTSwvYMVLx+7QeJ6sTuxbXqBkP21my4iWU5+QpTQAJt3h7htA1OKm9F3BpMM0vnu72QIoiJakrLA==} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.12 + dev: true + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.2 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /module-error@1.0.2: + resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} + engines: {node: '>=10'} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /napi-macros@2.2.2: + resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /nedb-promises@6.2.3: + resolution: {integrity: sha512-enq0IjNyBz9Qy9W/QPCcLGh/QORGBjXbIeZeWvIjO3OMLyAvlKT3hiJubP2BKEiFniUlR3L01o18ktqgn5jxqA==} + dependencies: + '@seald-io/nedb': 4.1.2 + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + dev: true + + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-uri@1.0.16: + resolution: {integrity: sha512-WMX9ygt2zzbtd3UlChi8S2Uj/dZa0N9QaotTkyRD7v06c50dor4qEWrM5ZvHiiaZYpXal4otRS9hynwwX0DVoA==} + engines: {node: '>= 0.10'} + dev: true + + /parseqs@0.0.6: + resolution: {integrity: sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==} + dev: true + + /parseuri@0.0.6: + resolution: {integrity: sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==} + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + dev: true + + /pixi-particles@4.3.1(pixi.js@5.3.11): + resolution: {integrity: sha512-XSqDFgYwm/7FRCgP5I2Fc57d98qvb1ql/x4uTjdP4uXDUGgjdO8OW/2A0HVWS1CkOht/1x6dQzsM1oCJAUlaow==} + peerDependencies: + pixi.js: '>=4.0.0' + dependencies: + pixi.js: 5.3.11 + dev: true + + /pixi.js@5.3.11: + resolution: {integrity: sha512-/9td6IHDQqG0Po5lyQ5aKDzrnEVD1SvGourI4Nqp0mvNI0Cbm74tMHLjk1V5foqGPAS9pochENr6Y3ft/2cDiQ==} + dependencies: + '@pixi/accessibility': 5.3.11 + '@pixi/app': 5.3.11 + '@pixi/constants': 5.3.11 + '@pixi/core': 5.3.11 + '@pixi/display': 5.3.11 + '@pixi/extract': 5.3.11 + '@pixi/filter-alpha': 5.3.11 + '@pixi/filter-blur': 5.3.11 + '@pixi/filter-color-matrix': 5.3.11 + '@pixi/filter-displacement': 5.3.11 + '@pixi/filter-fxaa': 5.3.11 + '@pixi/filter-noise': 5.3.11 + '@pixi/graphics': 5.3.11 + '@pixi/interaction': 5.3.11 + '@pixi/loaders': 5.3.11 + '@pixi/math': 5.3.11 + '@pixi/mesh': 5.3.11 + '@pixi/mesh-extras': 5.3.11 + '@pixi/mixin-cache-as-bitmap': 5.3.11 + '@pixi/mixin-get-child-by-name': 5.3.11 + '@pixi/mixin-get-global-position': 5.3.11 + '@pixi/particles': 5.3.11 + '@pixi/polyfill': 5.3.11 + '@pixi/prepare': 5.3.11 + '@pixi/runner': 5.3.11 + '@pixi/settings': 5.3.11 + '@pixi/sprite': 5.3.11 + '@pixi/sprite-animated': 5.3.11 + '@pixi/sprite-tiling': 5.3.11 + '@pixi/spritesheet': 5.3.11 + '@pixi/text': 5.3.11 + '@pixi/text-bitmap': 5.3.11 + '@pixi/ticker': 5.3.11 + '@pixi/utils': 5.3.11 + dev: true + + /playwright-core@1.56.0: + resolution: {integrity: sha512-1SXl7pMfemAMSDn5rkPeZljxOCYAmQnYLBTExuh6E8USHXGSX3dx6lYZN/xPpTz1vimXmPA9CDnILvmJaB8aSQ==} + engines: {node: '>=18'} + hasBin: true + dev: true + + /playwright@1.56.0: + resolution: {integrity: sha512-X5Q1b8lOdWIE4KAoHpW3SE8HvUB+ZZsUoN64ZhjnN8dOb1UpujxBtENGiZFE+9F/yhzJwYa+ca3u43FeLbboHA==} + engines: {node: '>=18'} + hasBin: true + dependencies: + playwright-core: 1.56.0 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /punycode@1.4.1: + resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.1.0 + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resource-loader@3.0.1: + resolution: {integrity: sha512-fBuCRbEHdLCI1eglzQhUv9Rrdcmqkydr1r6uHE2cYHvRBrcLXeSmbE/qI/urFt8rPr/IGxir3BUwM5kUK8XoyA==} + dependencies: + mini-signals: 1.2.0 + parse-uri: 1.0.16 + dev: true + + /reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + dev: true + + /semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + dev: true + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + dev: true + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + dev: true + + /socket.io-client@4.3.2: + resolution: {integrity: sha512-2B9LqSunN60yV8F7S84CCEEcgbYNfrn7ejIInZtLZ7ppWtiX8rGZAjvdCvbnC8bqo/9RlCNOUsORLyskxSFP1g==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.0.0 + backo2: 1.0.2 + debug: 4.3.7 + engine.io-client: 6.0.3 + parseuri: 0.0.6 + socket.io-parser: 4.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /socket.io-parser@4.1.2: + resolution: {integrity: sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.0.0 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /tinymce@5.10.1: + resolution: {integrity: sha512-aIsFTYiuESpoYkCgkoojpVtPwrSvYBxp4mMEGsj20CnUruLCWosywkbYHDII+j7KlQZZn3p+xK89f5gT3QyuGw==} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /ts-api-utils@2.1.0(typescript@5.9.3): + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + dependencies: + typescript: 5.9.3 + dev: true + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /url@0.11.4: + resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} + engines: {node: '>= 0.4'} + dependencies: + punycode: 1.4.1 + qs: 6.14.0 + dev: true + + /util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + dependencies: + inherits: 2.0.4 + is-arguments: 1.2.0 + is-generator-function: 1.1.2 + is-typed-array: 1.1.15 + which-typed-array: 1.1.19 + dev: true + + /which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /ws@8.2.3: + resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + + /yeast@0.1.2: + resolution: {integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true From ce6ac8a93b4ac64d2ecc150a42aba522615c4138 Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Wed, 5 Nov 2025 22:41:53 -0700 Subject: [PATCH 011/105] Add foundations for the data request sockets --- langs/en-ca.json | 7 +++++++ module/hooks/init.mjs | 2 ++ module/sockets/_index.mjs | 34 ++++++++++++++++++++++++++++++++ module/sockets/cancelRequest.mjs | 1 + module/sockets/createNotif.mjs | 1 + module/sockets/dataRequest.mjs | 1 + module/sockets/submitRequest.mjs | 1 + system.json | 1 + 8 files changed, 48 insertions(+) create mode 100644 module/sockets/_index.mjs create mode 100644 module/sockets/cancelRequest.mjs create mode 100644 module/sockets/createNotif.mjs create mode 100644 module/sockets/dataRequest.mjs create mode 100644 module/sockets/submitRequest.mjs diff --git a/langs/en-ca.json b/langs/en-ca.json index de83d02..425e065 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -31,6 +31,13 @@ "system": "Text-Based Actors" } } + }, + "notifs": { + "error": { + "invalid-socket": "Invalid socket data received, this means a module or system bug is present.", + "unknown-socket-event": "An unknown socket event was received: {event}", + "malformed-socket-payload": "Socket event \"{event}\" received with malformed payload. Details: {details}" + } } } } diff --git a/module/hooks/init.mjs b/module/hooks/init.mjs index ecf09b9..f3db2fb 100644 --- a/module/hooks/init.mjs +++ b/module/hooks/init.mjs @@ -17,6 +17,7 @@ import { __ID__ } from "../consts.mjs"; import helpers from "../handlebarsHelpers/_index.mjs"; import { Logger } from "../utils/Logger.mjs"; import { registerCustomComponents } from "../apps/elements/_index.mjs"; +import { registerSockets } from "../sockets/_index.mjs"; Hooks.on(`init`, () => { Logger.debug(`Initializing`); @@ -41,6 +42,7 @@ Hooks.on(`init`, () => { registerWorldSettings(); + registerSockets(); registerCustomComponents(); Handlebars.registerHelper(helpers); }); diff --git a/module/sockets/_index.mjs b/module/sockets/_index.mjs new file mode 100644 index 0000000..1f34107 --- /dev/null +++ b/module/sockets/_index.mjs @@ -0,0 +1,34 @@ +import { cancelRequest } from "./cancelRequest.mjs"; +import { createNotif } from "./createNotif.mjs"; +import { dataRequest } from "./dataRequest.mjs"; +import { localizer } from "../utils/Localizer.mjs"; +import { Logger } from "../utils/Logger.mjs"; +import { submitRequest } from "./submitRequest.mjs"; + +const events = { + // Data Request sockets + cancelRequest, + createNotif, + dataRequest, + submitRequest, +}; + +export function registerSockets() { + Logger.info(`Setting up socket listener`); + + game.socket.on(`system.taf`, (data, userID) => { + const { event, payload } = data ?? {}; + if (event == null || payload === undefined) { + ui.notifications.error(localizer(`taf.notifs.error.invalid-socket`)); + return; + }; + + if (events[event] == null) { + ui.notifications.error(localizer(`taf.notifs.error.unknown-socket-event`, { event })); + return; + }; + + const user = game.users.get(userID); + events[event](payload, user); + }); +}; diff --git a/module/sockets/cancelRequest.mjs b/module/sockets/cancelRequest.mjs new file mode 100644 index 0000000..865071a --- /dev/null +++ b/module/sockets/cancelRequest.mjs @@ -0,0 +1 @@ +export function cancelRequest() {}; diff --git a/module/sockets/createNotif.mjs b/module/sockets/createNotif.mjs new file mode 100644 index 0000000..55b72a1 --- /dev/null +++ b/module/sockets/createNotif.mjs @@ -0,0 +1 @@ +export function createNotif() {}; diff --git a/module/sockets/dataRequest.mjs b/module/sockets/dataRequest.mjs new file mode 100644 index 0000000..e75521f --- /dev/null +++ b/module/sockets/dataRequest.mjs @@ -0,0 +1 @@ +export function dataRequest() {}; diff --git a/module/sockets/submitRequest.mjs b/module/sockets/submitRequest.mjs new file mode 100644 index 0000000..44ebf1d --- /dev/null +++ b/module/sockets/submitRequest.mjs @@ -0,0 +1 @@ +export function submitRequest() {}; diff --git a/system.json b/system.json index 1aaa3a5..2283284 100644 --- a/system.json +++ b/system.json @@ -41,6 +41,7 @@ }, "Item": {} }, + "socket": true, "flags": { "hotReload": { "extensions": ["css", "hbs", "json", "js", "mjs", "svg"], From 36811b268ce18656c626623fa4813d751ab23a75 Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Sat, 8 Nov 2025 00:40:33 -0700 Subject: [PATCH 012/105] Add a QueryManager helper class --- module/api.mjs | 2 + module/utils/QueryManager.mjs | 77 +++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 module/utils/QueryManager.mjs diff --git a/module/api.mjs b/module/api.mjs index b139ef9..8655eb3 100644 --- a/module/api.mjs +++ b/module/api.mjs @@ -6,6 +6,7 @@ import { PlayerSheet } from "./apps/PlayerSheet.mjs"; // Utils import { attributeSorter } from "./utils/attributeSort.mjs"; import { DialogManager } from "./utils/DialogManager.mjs"; +import { QueryManager } from "./utils/QueryManager.mjs"; import { toID } from "./utils/toID.mjs"; const { deepFreeze } = foundry.utils; @@ -16,6 +17,7 @@ Object.defineProperty( { value: deepFreeze({ DialogManager, + QueryManager, Apps: { Ask, AttributeManager, diff --git a/module/utils/QueryManager.mjs b/module/utils/QueryManager.mjs new file mode 100644 index 0000000..2dfc381 --- /dev/null +++ b/module/utils/QueryManager.mjs @@ -0,0 +1,77 @@ +/** + * @typedef Apple + * @property {string[]} users + * @property {Function} resolve + * @property {Record} responses + */ + +const { randomID } = foundry.utils; + +export class QueryManager { + static #queries = new Map(); + static #promises = new Map(); + + static has(requestID) { + return this.#queries.has(requestID); + }; + + static async query(request, users = null, config = undefined) { + request.id ??= randomID(); + + game.socket.emit(`system.taf`, { + event: `query.prompt`, + payload: { + id: request.id, + users, + request, + config, + }, + }); + + if (this.#promises.has(request.id)) { + return null; + }; + + const promise = new Promise((resolve) => { + this.#queries.set( + request.id, + { + users: users ?? game.users.filter(u => u.id !== game.user.id), + resolve, + responses: {}, + }, + ); + }); + return promise; + }; + + static async submit(requestID, answers) { + game.socket.emit(`system.taf`, { + event: `query.submit`, + payload: { + id: requestID, + answers, + }, + }); + }; + + static async addResponse(requestID, userID, answers) { + const data = this.#queries.get(requestID); + data.responses[userID] = answers; + + // Validate for responses from everyone + if (data.users.length === Object.keys(data.responses).length) { + data.resolve(data.responses); + }; + }; + + static async cancel(requestID) { + // prevent cancelling other people's queries + if (!this.#queries.has(requestID)) { return }; + + game.socket.emit(`system.taf`, { + event: `query.cancel`, + payload: { id: requestID }, + }); + }; +}; From bfd408ef0be1d26e14f393999482996340b8e6cc Mon Sep 17 00:00:00 2001 From: Eldritch-Oliver Date: Sat, 8 Nov 2025 00:40:48 -0700 Subject: [PATCH 013/105] Begin implementing the socket event handlers --- module/sockets/_index.mjs | 11 ++++---- module/sockets/dataRequest.mjs | 46 +++++++++++++++++++++++++++++++- module/sockets/submitRequest.mjs | 23 +++++++++++++++- 3 files changed, 72 insertions(+), 8 deletions(-) diff --git a/module/sockets/_index.mjs b/module/sockets/_index.mjs index 1f34107..259834d 100644 --- a/module/sockets/_index.mjs +++ b/module/sockets/_index.mjs @@ -1,16 +1,15 @@ import { cancelRequest } from "./cancelRequest.mjs"; import { createNotif } from "./createNotif.mjs"; import { dataRequest } from "./dataRequest.mjs"; -import { localizer } from "../utils/Localizer.mjs"; import { Logger } from "../utils/Logger.mjs"; import { submitRequest } from "./submitRequest.mjs"; const events = { // Data Request sockets - cancelRequest, createNotif, - dataRequest, - submitRequest, + "query.cancel": cancelRequest, + "query.prompt": dataRequest, + "query.submit": submitRequest, }; export function registerSockets() { @@ -19,12 +18,12 @@ export function registerSockets() { game.socket.on(`system.taf`, (data, userID) => { const { event, payload } = data ?? {}; if (event == null || payload === undefined) { - ui.notifications.error(localizer(`taf.notifs.error.invalid-socket`)); + ui.notifications.error(game.i18n.format(`taf.notifs.error.invalid-socket`)); return; }; if (events[event] == null) { - ui.notifications.error(localizer(`taf.notifs.error.unknown-socket-event`, { event })); + ui.notifications.error(game.i18n.format(`taf.notifs.error.unknown-socket-event`, { event })); return; }; diff --git a/module/sockets/dataRequest.mjs b/module/sockets/dataRequest.mjs index e75521f..a4e6cbf 100644 --- a/module/sockets/dataRequest.mjs +++ b/module/sockets/dataRequest.mjs @@ -1 +1,45 @@ -export function dataRequest() {}; +import { DialogManager } from "../utils/DialogManager.mjs"; + +export async function dataRequest(payload) { + const { + id, + users, + config, + request, + } = payload; + + if (!id) { + ui.notifications.error(game.i18n.format( + `taf.notifs.error.malformed-socket-payload`, + { + event: `query.prompt`, + details: `A request ID must be provided`, + }), + ); + return; + }; + + // null/undefined is a special case for "all users but me" by default + if (!Array.isArray(users) || users != null) { + ui.notifications.error(game.i18n.format( + `taf.notifs.error.malformed-socket-payload`, + { + event: `query.prompt`, + details: ``, + }), + ); + return; + }; + + if (!users.includes(game.user.id)) { return }; + + request.id = id; + const result = await DialogManager.ask(request, config); + if (result.state === `fronted`) { return }; + if (result.state === `errored`) { + ui.notifications.error(result.error); + return; + }; + + +}; diff --git a/module/sockets/submitRequest.mjs b/module/sockets/submitRequest.mjs index 44ebf1d..91dfbc3 100644 --- a/module/sockets/submitRequest.mjs +++ b/module/sockets/submitRequest.mjs @@ -1 +1,22 @@ -export function submitRequest() {}; +import { QueryManager } from "../utils/QueryManager.mjs"; + +export function submitRequest(payload, user) { + const { + id, + answers, + } = payload; + + if (!id) { + ui.notifications.error(game.i18n.format( + `taf.notifs.error.malformed-socket-payload`, + { + event: `query.submit`, + details: `A request ID must be provided`, + }), + ); + return; + }; + + if (!QueryManager.has(id)) { return }; + QueryManager.addResponse(id, user.id, answers); +}; From b6ab0a229ad748c41dbea8ce6858258114ade343 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 8 Nov 2025 19:06:01 -0700 Subject: [PATCH 014/105] Rename the notification event name --- module/sockets/_index.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/sockets/_index.mjs b/module/sockets/_index.mjs index 259834d..a133c06 100644 --- a/module/sockets/_index.mjs +++ b/module/sockets/_index.mjs @@ -6,8 +6,8 @@ import { submitRequest } from "./submitRequest.mjs"; const events = { // Data Request sockets - createNotif, "query.cancel": cancelRequest, + "query.notify": createNotif, "query.prompt": dataRequest, "query.submit": submitRequest, }; From bd301d69fb1e99017fd4151468bf32101847820d Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 8 Nov 2025 19:06:19 -0700 Subject: [PATCH 015/105] Implement the chat notification for the player --- module/sockets/createNotif.mjs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/module/sockets/createNotif.mjs b/module/sockets/createNotif.mjs index 55b72a1..8ec4c2f 100644 --- a/module/sockets/createNotif.mjs +++ b/module/sockets/createNotif.mjs @@ -1 +1,19 @@ -export function createNotif() {}; +export function createNotif(payload) { + const { userID, content, includeGM } = payload; + + if (userID !== game.user.id) { return }; + + // TODO: prevent this from working if the user hasn't submitted a query response + + let whisper = [game.user.id]; + if (includeGM) { + whisper = game.users.filter(u => u.isGM).map(u => u.id); + }; + + ChatMessage.implementation.create({ + flavor: `Data Query Notification`, + content, + whisper, + style: CONST.CHAT_MESSAGE_STYLES.OOC, + }); +}; From 723bcf873528f21a47a963453794e005f2e81734 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 8 Nov 2025 19:07:01 -0700 Subject: [PATCH 016/105] Add notification and submission tracking for the QueryManager --- langs/en-ca.json | 1 + module/utils/QueryManager.mjs | 53 ++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/langs/en-ca.json b/langs/en-ca.json index 425e065..1854bf9 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -34,6 +34,7 @@ }, "notifs": { "error": { + "missing-id": "An ID must be provided", "invalid-socket": "Invalid socket data received, this means a module or system bug is present.", "unknown-socket-event": "An unknown socket event was received: {event}", "malformed-socket-payload": "Socket event \"{event}\" received with malformed payload. Details: {details}" diff --git a/module/utils/QueryManager.mjs b/module/utils/QueryManager.mjs index 2dfc381..b56b813 100644 --- a/module/utils/QueryManager.mjs +++ b/module/utils/QueryManager.mjs @@ -1,13 +1,24 @@ /** - * @typedef Apple + * @typedef QueryData * @property {string[]} users * @property {Function} resolve * @property {Record} responses + * @property {(() => Promise)|null} onSubmit */ -const { randomID } = foundry.utils; +import { filePath } from "../consts.mjs"; + +async function sendBasicNotification(userID, answers) { + const content = await foundry.applications.handlebars.renderTemplate( + filePath(`templates/query-response.hbs`), + { answers }, + ); + + QueryManager.notify(userID, content, { includeGM: false }); +}; export class QueryManager { + /** @type {Map} */ static #queries = new Map(); static #promises = new Map(); @@ -15,8 +26,18 @@ export class QueryManager { return this.#queries.has(requestID); }; - static async query(request, users = null, config = undefined) { - request.id ??= randomID(); + static async query( + request, + { + onSubmit = sendBasicNotification, + users = null, + config = undefined, + } = {}, + ) { + if (!request.id) { + ui.notifications.error(game.i18n.localize(`taf.notifs.error.missing-id`)); + return; + }; game.socket.emit(`system.taf`, { event: `query.prompt`, @@ -39,32 +60,36 @@ export class QueryManager { users: users ?? game.users.filter(u => u.id !== game.user.id), resolve, responses: {}, + onSubmit, }, ); }); return promise; }; - static async submit(requestID, answers) { - game.socket.emit(`system.taf`, { - event: `query.submit`, - payload: { - id: requestID, - answers, - }, - }); - }; - static async addResponse(requestID, userID, answers) { const data = this.#queries.get(requestID); data.responses[userID] = answers; + await data.onSubmit?.(userID, answers); + // Validate for responses from everyone if (data.users.length === Object.keys(data.responses).length) { data.resolve(data.responses); }; }; + static async notify(userID, content, { includeGM = false } = {}) { + game.socket.emit(`system.taf`, { + event: `query.notify`, + payload: { + userID, + content, + includeGM, + }, + }); + } + static async cancel(requestID) { // prevent cancelling other people's queries if (!this.#queries.has(requestID)) { return }; From db4f57fc905662592ef138f23a7406e19fbc0dd4 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 8 Nov 2025 19:11:52 -0700 Subject: [PATCH 017/105] Add the special case for prompting all but the requesting user --- module/sockets/dataRequest.mjs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/module/sockets/dataRequest.mjs b/module/sockets/dataRequest.mjs index a4e6cbf..34cd39f 100644 --- a/module/sockets/dataRequest.mjs +++ b/module/sockets/dataRequest.mjs @@ -20,26 +20,32 @@ export async function dataRequest(payload) { }; // null/undefined is a special case for "all users but me" by default - if (!Array.isArray(users) || users != null) { + if (users != null && !Array.isArray(users)) { ui.notifications.error(game.i18n.format( `taf.notifs.error.malformed-socket-payload`, { event: `query.prompt`, - details: ``, + details: `A list of users must be provided`, }), ); return; }; - if (!users.includes(game.user.id)) { return }; + if (users != null && !users.includes(game.user.id)) { return }; request.id = id; const result = await DialogManager.ask(request, config); - if (result.state === `fronted`) { return }; - if (result.state === `errored`) { - ui.notifications.error(result.error); + if (result.state === `fronted`) { return; + } else if (result.state === `errored`) { + ui.notifications.error(result.error); + } else if (result.state === `prompted`) { + game.socket.emit(`system.taf`, { + event: `query.submit`, + payload: { + id: request.id, + answers: result.answers, + }, + }); }; - - }; From e79bd4d505a6d16acbe2ecdf432fde351526f589 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 8 Nov 2025 19:12:19 -0700 Subject: [PATCH 018/105] Add the template and styles for the chat notification --- styles/elements/table.css | 21 +++++++++++++++++++++ styles/main.css | 1 + templates/query-response.hbs | 16 ++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 styles/elements/table.css create mode 100644 templates/query-response.hbs diff --git a/styles/elements/table.css b/styles/elements/table.css new file mode 100644 index 0000000..5f9310c --- /dev/null +++ b/styles/elements/table.css @@ -0,0 +1,21 @@ +/* +This styling is unscoped in order to make it so that it still applies +to the chat messages which are not within a scope I control. +*/ +table.taf-query-summary { + margin: 0px; + + tr:hover > td { + background-color: var(--table-header-border-highlight); + } + + td { + padding: 4px 8px; + border: 1px solid var(--table-header-border-color); + width: 40%; + + &:first-of-type { + width: 60%; + } + } +} diff --git a/styles/main.css b/styles/main.css index 10ea6ec..40f4ed2 100644 --- a/styles/main.css +++ b/styles/main.css @@ -14,6 +14,7 @@ @import url("./elements/input.css") layer(elements); @import url("./elements/p.css") layer(elements); @import url("./elements/prose-mirror.css") layer(elements); +@import url("./elements/table.css") layer(elements); /* Apps */ @import url("./Apps/common.css") layer(apps); diff --git a/templates/query-response.hbs b/templates/query-response.hbs new file mode 100644 index 0000000..c2e1219 --- /dev/null +++ b/templates/query-response.hbs @@ -0,0 +1,16 @@ +{{#if answers}} + + + + + + {{#each answers as | answer |}} + + + + + {{/each}} +
KeyValue
{{ @key }}{{ answer }}
+{{else}} +No data submitted +{{/if}} From 47b68621c12689c752de683774da18a9256a796f Mon Sep 17 00:00:00 2001 From: Oliver Date: Sat, 8 Nov 2025 19:12:30 -0700 Subject: [PATCH 019/105] Add CONST as a readonly global --- eslint.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/eslint.config.mjs b/eslint.config.mjs index 55aea5c..d5f0390 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -16,6 +16,7 @@ export default [ languageOptions: { globals: { CONFIG: `writable`, + CONST: `readonly`, game: `readonly`, Handlebars: `readonly`, Hooks: `readonly`, From a242101b5b4609680e38b726e19c23573f2ef70a Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 9 Nov 2025 00:31:04 -0700 Subject: [PATCH 020/105] Begin working on the QueryStatus application for the requestor to monitor user responses --- module/api.mjs | 2 + module/apps/QueryStatus.mjs | 75 +++++++++++++++++++++++++++++++++ module/utils/QueryManager.mjs | 11 +++++ styles/elements/span.css | 44 +++++++++++++++++++ styles/main.css | 1 + templates/QueryStatus/users.hbs | 21 +++++++++ 6 files changed, 154 insertions(+) create mode 100644 module/apps/QueryStatus.mjs create mode 100644 styles/elements/span.css create mode 100644 templates/QueryStatus/users.hbs diff --git a/module/api.mjs b/module/api.mjs index 8655eb3..dc38c3d 100644 --- a/module/api.mjs +++ b/module/api.mjs @@ -2,6 +2,7 @@ import { Ask } from "./apps/Ask.mjs"; import { AttributeManager } from "./apps/AttributeManager.mjs"; import { PlayerSheet } from "./apps/PlayerSheet.mjs"; +import { QueryStatus } from "./apps/QueryStatus.mjs"; // Utils import { attributeSorter } from "./utils/attributeSort.mjs"; @@ -22,6 +23,7 @@ Object.defineProperty( Ask, AttributeManager, PlayerSheet, + QueryStatus, }, utils: { attributeSorter, diff --git a/module/apps/QueryStatus.mjs b/module/apps/QueryStatus.mjs new file mode 100644 index 0000000..bcae4ce --- /dev/null +++ b/module/apps/QueryStatus.mjs @@ -0,0 +1,75 @@ +import { __ID__, filePath } from "../consts.mjs"; +import { QueryManager } from "../utils/QueryManager.mjs"; + +const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; + +export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { + // #region Options + static DEFAULT_OPTIONS = { + classes: [ + __ID__, + `QueryStatus`, + ], + }; + + static PARTS = { + users: { + template: filePath(`templates/QueryStatus/users.hbs`), + }, + // controls: { + // template: filePath(`templates/QueryStatus/controls.hbs`), + // }, + }; + // #endregion Options + + // #region Instance + constructor({ + requestID, + ...opts + }) { + super(opts); + this.requestID = requestID; + }; + // #endregion Instance + + // #region Lifecycle + async _preparePartContext(partID) { + const ctx = {}; + + switch (partID) { + case `users`: { + this._prepareUsers(ctx); + break; + }; + case `controls`: { + this._prepareControls(ctx); + break; + }; + }; + + return ctx; + }; + + async _prepareUsers(ctx) { + const query = QueryManager.get(this.requestID); + if (!query) { return }; + + const users = []; + for (const userID of query.users) { + const user = game.users.get(userID); + users.push({ + id: userID, + name: user.name, + colour: user.color, + answers: query.responses[userID] ?? null, + }); + }; + ctx.users = users; + }; + + async _prepareControls(ctx) {}; + // #endregion Lifecycle + + // #region Actions + // #endregion Actions +}; diff --git a/module/utils/QueryManager.mjs b/module/utils/QueryManager.mjs index b56b813..35ece0a 100644 --- a/module/utils/QueryManager.mjs +++ b/module/utils/QueryManager.mjs @@ -26,6 +26,17 @@ export class QueryManager { return this.#queries.has(requestID); }; + static get(requestID) { + if (!this.#queries.has(requestID)) { return null }; + const query = this.#queries.get(requestID); + const cloned = foundry.utils.deepClone(query); + + delete cloned.onSubmit; + delete cloned.resolve; + + return cloned; + }; + static async query( request, { diff --git a/styles/elements/span.css b/styles/elements/span.css new file mode 100644 index 0000000..da5c58a --- /dev/null +++ b/styles/elements/span.css @@ -0,0 +1,44 @@ +@keyframes rotate { + 0% { transform: rotate(0deg); } + 50% { transform: rotate(360deg); } + 100% { transform: rotate(720deg); } +} + +@keyframes prixClipFix { + 0%, 100% { + clip-path: polygon(50% 50%,0 0,0 0,0 0,0 0,0 0); + } + 25%, 63% { + clip-path: polygon(50% 50%,0 0,100% 0,100% 0,100% 0,100% 0); + } + 37%, 50% { + clip-path: polygon(50% 50%,0 0,100% 0,100% 100%,100% 100%,100% 100%); + } +} + +.taf > .window-content span { + &.loader { + width: 48px; + height: 48px; + border-radius: 50%; + position: relative; + animation: rotate 2s linear infinite; + display: block; + + &::before, &::after { + content: ""; + box-sizing: border-box; + position: absolute; + inset: 0px; + border-radius: 50%; + border: 5px solid #FFF; + animation: prixClipFix 4s linear infinite; + } + + &::after{ + inset: 8px; + transform: rotate3d(90, 90, 0, 180deg ); + border-color: #FF3D00; /* This can be the user colour */ + } + } +} diff --git a/styles/main.css b/styles/main.css index 40f4ed2..28a27a4 100644 --- a/styles/main.css +++ b/styles/main.css @@ -14,6 +14,7 @@ @import url("./elements/input.css") layer(elements); @import url("./elements/p.css") layer(elements); @import url("./elements/prose-mirror.css") layer(elements); +@import url("./elements/span.css") layer(elements); @import url("./elements/table.css") layer(elements); /* Apps */ diff --git a/templates/QueryStatus/users.hbs b/templates/QueryStatus/users.hbs new file mode 100644 index 0000000..ca9049f --- /dev/null +++ b/templates/QueryStatus/users.hbs @@ -0,0 +1,21 @@ +
    + {{#each users as | user |}} +
  • + {{ user.name }} + {{#if user.answers}} +
    + {{#each user.answers as | answer |}} + + {{ @key }} + + {{ answer }} + + + {{/each}} +
    + {{else}} + + {{/if}} +
  • + {{/each}} +
From 5770abb7e81d77d767e9ae257096c5dfaec9f8bc Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 12 Nov 2025 00:08:49 -0700 Subject: [PATCH 021/105] Add a disconnected icon for the purposes of the QueryStatus app --- assets/icons/disconnected.svg | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 assets/icons/disconnected.svg diff --git a/assets/icons/disconnected.svg b/assets/icons/disconnected.svg new file mode 100644 index 0000000..c47a732 --- /dev/null +++ b/assets/icons/disconnected.svg @@ -0,0 +1,3 @@ + + + From 03623424196c7f9f4f24fb660db84d6814ee0bbe Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 12 Nov 2025 00:09:52 -0700 Subject: [PATCH 022/105] Get the QueryStatus application displaying the status more appropriately --- langs/en-ca.json | 3 ++ module/apps/QueryStatus.mjs | 20 +++++++++++--- module/hooks/userConnected.mjs | 5 ++++ module/main.mjs | 1 + module/utils/QueryManager.mjs | 44 ++++++++++++++++++++++++++++-- styles/Apps/QueryStatus.css | 20 ++++++++++++++ styles/elements/span.css | 7 +++-- styles/elements/utils.css | 3 ++ styles/main.css | 2 ++ templates/QueryStatus/controls.hbs | 8 ++++++ templates/QueryStatus/users.hbs | 18 +++++++++--- 11 files changed, 117 insertions(+), 14 deletions(-) create mode 100644 module/hooks/userConnected.mjs create mode 100644 styles/Apps/QueryStatus.css create mode 100644 styles/elements/utils.css create mode 100644 templates/QueryStatus/controls.hbs diff --git a/langs/en-ca.json b/langs/en-ca.json index 1854bf9..24dc2cb 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -15,6 +15,9 @@ "PlayerSheet": "Player Sheet" }, "Apps": { + "QueryStatus": { + "user-disconnected-tooltip": "This user is not logged in to Foundry" + }, "TAFDocumentSheetConfig": { "Sizing": "Sizing", "Width": { diff --git a/module/apps/QueryStatus.mjs b/module/apps/QueryStatus.mjs index bcae4ce..e5ce09b 100644 --- a/module/apps/QueryStatus.mjs +++ b/module/apps/QueryStatus.mjs @@ -1,4 +1,5 @@ import { __ID__, filePath } from "../consts.mjs"; +import { Logger } from "../utils/Logger.mjs"; import { QueryManager } from "../utils/QueryManager.mjs"; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -10,15 +11,22 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { __ID__, `QueryStatus`, ], + position: { + width: 300, + height: `auto`, + }, + window: { + resizable: true, + }, }; static PARTS = { users: { template: filePath(`templates/QueryStatus/users.hbs`), }, - // controls: { - // template: filePath(`templates/QueryStatus/controls.hbs`), - // }, + controls: { + template: filePath(`templates/QueryStatus/controls.hbs`), + }, }; // #endregion Options @@ -27,6 +35,10 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { requestID, ...opts }) { + if (!requestID) { + Logger.error(`A requestID must be provided for QueryStatus applications`); + return null; + }; super(opts); this.requestID = requestID; }; @@ -60,7 +72,7 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { users.push({ id: userID, name: user.name, - colour: user.color, + active: user.active, answers: query.responses[userID] ?? null, }); }; diff --git a/module/hooks/userConnected.mjs b/module/hooks/userConnected.mjs new file mode 100644 index 0000000..750417e --- /dev/null +++ b/module/hooks/userConnected.mjs @@ -0,0 +1,5 @@ +import { QueryManager } from "../utils/QueryManager.mjs"; + +Hooks.on(`userConnected`, (user) => { + QueryManager.userActivity(user.id); +}); diff --git a/module/main.mjs b/module/main.mjs index abde62f..05cf7d9 100644 --- a/module/main.mjs +++ b/module/main.mjs @@ -1,2 +1,3 @@ import "./api.mjs"; import "./hooks/init.mjs"; +import "./hooks/userConnected.mjs"; diff --git a/module/utils/QueryManager.mjs b/module/utils/QueryManager.mjs index 35ece0a..9adce82 100644 --- a/module/utils/QueryManager.mjs +++ b/module/utils/QueryManager.mjs @@ -4,9 +4,12 @@ * @property {Function} resolve * @property {Record} responses * @property {(() => Promise)|null} onSubmit + * @property {QueryStatus|null} app */ import { filePath } from "../consts.mjs"; +import { Logger } from "./Logger.mjs"; +import { QueryStatus } from "../apps/QueryStatus.mjs"; async function sendBasicNotification(userID, answers) { const content = await foundry.applications.handlebars.renderTemplate( @@ -34,7 +37,7 @@ export class QueryManager { delete cloned.onSubmit; delete cloned.resolve; - return cloned; + return foundry.utils.deepFreeze(cloned); }; static async query( @@ -42,7 +45,8 @@ export class QueryManager { { onSubmit = sendBasicNotification, users = null, - config = undefined, + showStatusApp = true, + ...config } = {}, ) { if (!request.id) { @@ -68,13 +72,21 @@ export class QueryManager { this.#queries.set( request.id, { - users: users ?? game.users.filter(u => u.id !== game.user.id), + users: users ?? game.users.filter(u => u.id !== game.user.id).map(u => u.id), resolve, responses: {}, onSubmit, + app: null, }, ); }); + + if (showStatusApp) { + const app = new QueryStatus({ requestID: request.id }); + app.render({ force: true }); + this.#queries.get(request.id).app = app; + }; + return promise; }; @@ -86,7 +98,10 @@ export class QueryManager { // Validate for responses from everyone if (data.users.length === Object.keys(data.responses).length) { + data.app.close(); data.resolve(data.responses); + } else { + data.app?.render({ parts: [ `users` ] }); }; }; @@ -110,4 +125,27 @@ export class QueryManager { payload: { id: requestID }, }); }; + + static async setApplication(requestID, app) { + if (!this.#queries.has(requestID)) { return }; + if (!(app instanceof QueryStatus)) { return }; + const query = this.#queries.get(requestID); + if (query.app) { + Logger.error(`Cannot set an application for a query that has one already`); + return; + }; + query.app = app; + }; + + static async userActivity(userID) { + for (const query of this.#queries.values()) { + if (query.users.includes(userID)) { + query.app.render({ parts: [ `users` ] }); + + // TODO: if the user is connecting, we want to open + // the ask modal on their browser so that they can + // actually fill in the data + }; + }; + }; }; diff --git a/styles/Apps/QueryStatus.css b/styles/Apps/QueryStatus.css new file mode 100644 index 0000000..fbbc60e --- /dev/null +++ b/styles/Apps/QueryStatus.css @@ -0,0 +1,20 @@ +.taf.QueryStatus { + .user-list { + display: flex; + flex-direction: column; + gap: 4px; + list-style-type: none; + margin: 0; + padding: 0; + + li { + display: flex; + flex-direction: row; + align-items: center; + margin: 0; + border: 1px solid yellowgreen; + border-radius: 4px; + padding: 4px 8px; + } + } +} diff --git a/styles/elements/span.css b/styles/elements/span.css index da5c58a..1ce99fe 100644 --- a/styles/elements/span.css +++ b/styles/elements/span.css @@ -18,8 +18,9 @@ .taf > .window-content span { &.loader { - width: 48px; - height: 48px; + --size: 40px; + width: var(--size); + height: var(--size); border-radius: 50%; position: relative; animation: rotate 2s linear infinite; @@ -38,7 +39,7 @@ &::after{ inset: 8px; transform: rotate3d(90, 90, 0, 180deg ); - border-color: #FF3D00; /* This can be the user colour */ + border-color: var(--spinner-inner-colour, #FF3D00); } } } diff --git a/styles/elements/utils.css b/styles/elements/utils.css new file mode 100644 index 0000000..f99356f --- /dev/null +++ b/styles/elements/utils.css @@ -0,0 +1,3 @@ +.taf > .window-content { + .grow { flex-grow: 1; } +} \ No newline at end of file diff --git a/styles/main.css b/styles/main.css index 28a27a4..6994e85 100644 --- a/styles/main.css +++ b/styles/main.css @@ -9,6 +9,7 @@ @import url("./themes/light.css") layer(themes); /* Elements */ +@import url("./elements/utils.css") layer(elements); @import url("./elements/headers.css") layer(elements); @import url("./elements/hr.css") layer(elements); @import url("./elements/input.css") layer(elements); @@ -22,4 +23,5 @@ @import url("./Apps/Ask.css") layer(apps); @import url("./Apps/AttributeManager.css") layer(apps); @import url("./Apps/PlayerSheet.css") layer(apps); +@import url("./Apps/QueryStatus.css") layer(apps); @import url("./Apps/TAFDocumentSheetConfig.css") layer(apps); diff --git a/templates/QueryStatus/controls.hbs b/templates/QueryStatus/controls.hbs new file mode 100644 index 0000000..363c828 --- /dev/null +++ b/templates/QueryStatus/controls.hbs @@ -0,0 +1,8 @@ +
+ + +
diff --git a/templates/QueryStatus/users.hbs b/templates/QueryStatus/users.hbs index ca9049f..640bfdd 100644 --- a/templates/QueryStatus/users.hbs +++ b/templates/QueryStatus/users.hbs @@ -1,7 +1,9 @@ -
    +
      {{#each users as | user |}} -
    • - {{ user.name }} +
    • +
      + {{ user.name }} +
      {{#if user.answers}}
      {{#each user.answers as | answer |}} @@ -13,8 +15,16 @@ {{/each}}
      - {{else}} + {{else if user.active}} + {{else}} + {{/if}}
    • {{/each}} From 58893f46dbde7ef4c603f0ef6fcbdfbcff666236 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 01:01:26 -0700 Subject: [PATCH 023/105] Begin implementing a script to check if a tag exists via forgejo API for my release workflow --- .forgejo/workflows/draft-release.yaml | 63 +++++++++++++++++++++++++++ scripts/tagExists.mjs | 11 +++++ 2 files changed, 74 insertions(+) create mode 100644 .forgejo/workflows/draft-release.yaml create mode 100644 scripts/tagExists.mjs diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml new file mode 100644 index 0000000..68c3150 --- /dev/null +++ b/.forgejo/workflows/draft-release.yaml @@ -0,0 +1,63 @@ +on: [ workflow_dispatch ] +jobs: + create-artifacts: + runs-on: act + steps: + - name: checkout code + uses: actions/checkout@v4 + + - name: extract version from manifest + id: version + run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" + + - name: assert that the tag doesn't exist + run: node scripts/tagExists.mjs + env: + TAG_NAME: ${{steps.version.output.version}} + + - name: build compendia + run: node scripts/buildCompendia.mjs + + - name: compress files + run: zip -r release.zip langs module styles templates README.md assets + + - name: upload artifacts + uses: https://data.forgejo.org/forgejo/upload-artifact@v4 + with: + path: | + system.json + release.zip + retention-days: 7 + if-no-files-found: error + + + forgejo-release: + runs-on: docker + needs: + - create-artifacts + if: var.RELEASE_TO_FORGEJO + steps: + - name: download artifacts + uses: actions/download-artifact@v4 + with: + merge-multiple: true + + - name: update manifest + + - name: create draft release + + + github-release: + runs-on: docker + needs: + - create-artifacts + if: var.RELEASE_TO_GITHUB + steps: + - name: download artifacts + uses: actions/download-artifact@v4 + with: + merge-multiple: true + + - name: update manifest + + - name: create draft release diff --git a/scripts/tagExists.mjs b/scripts/tagExists.mjs new file mode 100644 index 0000000..2a266b5 --- /dev/null +++ b/scripts/tagExists.mjs @@ -0,0 +1,11 @@ +const { + TAG_NAME, + FORGEJO_API_URL, + FORGEJO_REPOSITORY, + FORGEJO_REPOSITORY_OWNER, +} = process.env; + + +console.log(process.env) + +process.exit(1); From 6df0780676f9c5b33834c6bd36716c54b7ce3969 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 01:48:22 -0700 Subject: [PATCH 024/105] Finish implementing the tagExists action helper script --- scripts/tagExists.mjs | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/scripts/tagExists.mjs b/scripts/tagExists.mjs index 2a266b5..f9e1206 100644 --- a/scripts/tagExists.mjs +++ b/scripts/tagExists.mjs @@ -1,11 +1,28 @@ +import axios from "axios"; + const { TAG_NAME, - FORGEJO_API_URL, - FORGEJO_REPOSITORY, - FORGEJO_REPOSITORY_OWNER, + FORGEJO_API_URL: API_URL, + FORGEJO_REPOSITORY: REPO, + FORGEJO_TOKEN: TOKEN, } = process.env; +async function main() { + const requestURL = `${API_URL}/repos/${REPO}/tags/${TAG_NAME}`; -console.log(process.env) + const response = await axios.get( + requestURL, + { + headers: { Authorization: `token ${TOKEN}` }, + validateStatus: () => true, + }, + ); -process.exit(1); + // We actually *want* an error when the tag exists, instead of when + // it doesn't + if (response.status === 200) { + process.exit(1); + }; +}; + +main(); From 01e046f916792efe2257d4a302e83e8061f9d18d Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 01:48:58 -0700 Subject: [PATCH 025/105] Remove unneeded file hiding --- .vscode/settings.json | 1 - 1 file changed, 1 deletion(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index aa3ed17..cc64012 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,6 @@ "git.branchProtection": [], "files.exclude": { "*.lock": true, - ".styles": false, "node_modules": true, "packs": true, "foundry": true From 9057cbd682dbb9e1ceaa04f7fd35eef2a8893bc0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 01:49:22 -0700 Subject: [PATCH 026/105] Add axios as a devDependency for the tagExists script --- package-lock.json | 2662 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 2663 insertions(+), 1 deletion(-) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..55fd03f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2662 @@ +{ + "name": "Text-Actors-Foundry", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@eslint/js": "^9.8.0", + "@foundryvtt/foundryvtt-cli": "^1.0.3", + "@stylistic/eslint-plugin": "^2.6.1", + "axios": "^1.13.2", + "dotenv": "^17.2.2", + "eslint": "^9.8.0", + "globals": "^15.9.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "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, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", + "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@foundryvtt/foundryvtt-cli": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@foundryvtt/foundryvtt-cli/-/foundryvtt-cli-1.1.0.tgz", + "integrity": "sha512-ergKZDUSgQ79168r38ORyN4v/UTliA40rxElaUh5iS27Qw9H8Ep/ll8j3/HfiikO3XUDwYxZLfDJfbcyj2i9TQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.4.1", + "classic-level": "^1.4.1", + "esm": "^3.2.25", + "js-yaml": "^4.1.0", + "mkdirp": "^3.0.1", + "nedb-promises": "^6.2.3", + "yargs": "^17.7.2" + }, + "bin": { + "fvtt": "fvtt.mjs" + }, + "engines": { + "node": ">17.0.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@seald-io/binary-search-tree": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@seald-io/binary-search-tree/-/binary-search-tree-1.0.3.tgz", + "integrity": "sha512-qv3jnwoakeax2razYaMsGI/luWdliBLHTdC6jU55hQt1hcFqzauH/HsBollQ7IR4ySTtYhT+xyHoijpA16C+tA==", + "dev": true + }, + "node_modules/@seald-io/nedb": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@seald-io/nedb/-/nedb-4.1.2.tgz", + "integrity": "sha512-bDr6TqjBVS2rDyYM9CPxAnotj5FuNL9NF8o7h7YyFXM7yruqT4ddr+PkSb2mJvvw991bqdftazkEo38gykvaww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@seald-io/binary-search-tree": "^1.0.3", + "localforage": "^1.10.0", + "util": "^0.12.5" + } + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.13.0.tgz", + "integrity": "sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.13.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.4.tgz", + "integrity": "sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.4", + "@typescript-eslint/types": "^8.46.4", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.4.tgz", + "integrity": "sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz", + "integrity": "sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.4.tgz", + "integrity": "sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz", + "integrity": "sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.4", + "@typescript-eslint/tsconfig-utils": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.4.tgz", + "integrity": "sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.4.tgz", + "integrity": "sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/abstract-level": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", + "integrity": "sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/classic-level": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.4.1.tgz", + "integrity": "sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "^2.2.2", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dotenv": { + "version": "17.2.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", + "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", + "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.1", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "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, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/napi-macros": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nedb-promises": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/nedb-promises/-/nedb-promises-6.2.3.tgz", + "integrity": "sha512-enq0IjNyBz9Qy9W/QPCcLGh/QORGBjXbIeZeWvIjO3OMLyAvlKT3hiJubP2BKEiFniUlR3L01o18ktqgn5jxqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@seald-io/nedb": "^4.0.2" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "dev": true, + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index c2b1830..efe45c0 100644 --- a/package.json +++ b/package.json @@ -2,8 +2,8 @@ "devDependencies": { "@eslint/js": "^9.8.0", "@foundryvtt/foundryvtt-cli": "^1.0.3", - "@league-of-foundry-developers/foundry-vtt-types": "^9.280.0", "@stylistic/eslint-plugin": "^2.6.1", + "axios": "^1.13.2", "dotenv": "^17.2.2", "eslint": "^9.8.0", "globals": "^15.9.0" From 834f169a802e966249026598e9bb66bf08ec648e Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 01:55:07 -0700 Subject: [PATCH 027/105] Tweak the npm scripts --- .forgejo/workflows/draft-release.yaml | 17 ++++++++++------- package.json | 4 ++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 68c3150..00979ff 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -3,25 +3,28 @@ jobs: create-artifacts: runs-on: act steps: - - name: checkout code + - name: Checkout code uses: actions/checkout@v4 - - name: extract version from manifest + - name: Extract version from manifest id: version run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" - - name: assert that the tag doesn't exist + - name: Assert that the tag doesn't exist run: node scripts/tagExists.mjs env: TAG_NAME: ${{steps.version.output.version}} - - name: build compendia - run: node scripts/buildCompendia.mjs + - name: Build compendia + run: "npm run data:build" - - name: compress files + - name: Remove compendia source + run: "rm -rf packs/**/_source" + + - name: Compress files run: zip -r release.zip langs module styles templates README.md assets - - name: upload artifacts + - name: Upload artifacts uses: https://data.forgejo.org/forgejo/upload-artifact@v4 with: path: | diff --git a/package.json b/package.json index efe45c0..c1b700b 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,8 @@ "globals": "^15.9.0" }, "scripts": { - "build": "node scripts/buildCompendia.mjs", - "extract": "node scripts/extractCompendia.mjs", + "data:build": "node scripts/buildCompendia.mjs", + "data:extract": "node scripts/extractCompendia.mjs", "link": "node scripts/linkFoundry.mjs", "lint": "eslint --fix", "lint:nofix": "eslint" From 00692431cd201d0be5e75ec10d273779a1c3175b Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 02:09:35 -0700 Subject: [PATCH 028/105] Begin work on the manifest preparation step for actions --- .forgejo/workflows/draft-release.yaml | 22 ++++++++++----- scripts/prepareManifest.mjs | 39 +++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 6 deletions(-) create mode 100644 scripts/prepareManifest.mjs diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 00979ff..fde88e4 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -40,14 +40,19 @@ jobs: - create-artifacts if: var.RELEASE_TO_FORGEJO steps: - - name: download artifacts + - name: Download artifacts uses: actions/download-artifact@v4 with: merge-multiple: true - - name: update manifest + - name: Update manifest + run: node scripts/updateManifest.mjs + env: + # TODO: determine fully qualified URLs + DOWNLOAD_URL: "${{FORGEJO_SERVER_URL}}/${{FORGEJO_REPOSITORY}}/releases/" + LATEST_URL: "${{FORGEJO_SERVER_URL}}/${{FORGEJO_REPOSITORY}}/releases/" - - name: create draft release + - name: Create draft release github-release: @@ -56,11 +61,16 @@ jobs: - create-artifacts if: var.RELEASE_TO_GITHUB steps: - - name: download artifacts + - name: Download artifacts uses: actions/download-artifact@v4 with: merge-multiple: true - - name: update manifest + - name: Update manifest + run: node scripts/updateManifest.mjs + env: + # TODO: determine fully qualified URLs + DOWNLOAD_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases" + LATEST_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases" - - name: create draft release + - name: Create draft release diff --git a/scripts/prepareManifest.mjs b/scripts/prepareManifest.mjs new file mode 100644 index 0000000..ee20ff3 --- /dev/null +++ b/scripts/prepareManifest.mjs @@ -0,0 +1,39 @@ +/* +The intent of this script is to do all of the modifications of the +manifest file that we need to do in order to release the system. +This can include removing dev-only fields/attributes that end +users will never, and should never, care about nor need. +*/ +import { readFile, writeFile } from "fs/promises"; + +const MANIFEST_PATH = `system.json`; + +const { + DOWNLOAD_URL, + LATEST_URL, +} = process.env; + +let manifest; +try { + manifest = JSON.parse(await readFile(MANIFEST_PATH, `utf-8`)); +} catch { + console.error(`Failed to parse manifest file.`); + process.exit(1); +}; + + +// Filter out dev-only resources +if (manifest.esmodules) { + manifest.esmodules = manifest.esmodules.filter( + filepath => !filepath.startsWith(`dev/`) + ); +}; + +// Remove dev flags +delete manifest.flags?.hotReload; + +if (Object.keys(manifest.flags).length === 0) { + delete manifest.flags; +}; + +await writeFile(MANIFEST_PATH, JSON.stringify(manifest, undefined, `\t`)); From 088b8c6f5db2fb720804483618280f1a3da4a89e Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 10:12:26 -0700 Subject: [PATCH 029/105] Remove Github URLs from the manifest --- system.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system.json b/system.json index 2283284..eb847b5 100644 --- a/system.json +++ b/system.json @@ -3,9 +3,9 @@ "title": "Text-Based Actors", "description": "An intentionally minimalist system that enables you to play rules-light games without getting in your way!", "version": "2.3.0", - "download": "#{DOWNLOAD}#", - "manifest": "https://github.com/Eldritch-Oliver/Text-Actors-Foundry/releases/latest/download/system.json", - "url": "https://github.com/Eldritch-Oliver/Text-Actors-Foundry", + "download": "", + "manifest": "", + "url": "https://git.varify.ca/Foundry/taf", "compatibility": { "minimum": 13, "verified": 13, From 786bd68c35b8758f474f3fc097568da680cafe21 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 10:27:05 -0700 Subject: [PATCH 030/105] Update the URL pointers for the manifest creation --- .forgejo/workflows/draft-release.yaml | 21 +++++++++++++++------ scripts/prepareManifest.mjs | 4 +++- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index fde88e4..760c92a 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -45,14 +45,17 @@ jobs: with: merge-multiple: true + - id: version + run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" + - name: Update manifest run: node scripts/updateManifest.mjs env: - # TODO: determine fully qualified URLs - DOWNLOAD_URL: "${{FORGEJO_SERVER_URL}}/${{FORGEJO_REPOSITORY}}/releases/" - LATEST_URL: "${{FORGEJO_SERVER_URL}}/${{FORGEJO_REPOSITORY}}/releases/" + DOWNLOAD_URL: "${{FORGEJO_SERVER_URL}}/${{FORGEJO_REPOSITORY}}/releases/download/${{steps.version.output.version}}/release.zip" + LATEST_URL: "${{FORGEJO_SERVER_URL}}/${{FORGEJO_REPOSITORY}}releases/download/latest/system.json" - name: Create draft release + run: cat system.json github-release: @@ -66,11 +69,17 @@ jobs: with: merge-multiple: true + - id: version + run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" + - name: Update manifest run: node scripts/updateManifest.mjs env: - # TODO: determine fully qualified URLs - DOWNLOAD_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases" - LATEST_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases" + DOWNLOAD_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/download/${{steps.version.output.version}}/release.zip" + LATEST_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/latest/download/system.json" + + - name: Sync Github mirror + run: echo Syncing mirror - name: Create draft release + run: cat system.json diff --git a/scripts/prepareManifest.mjs b/scripts/prepareManifest.mjs index ee20ff3..392918f 100644 --- a/scripts/prepareManifest.mjs +++ b/scripts/prepareManifest.mjs @@ -21,6 +21,9 @@ try { process.exit(1); }; +// Update download / manifest URLs +manifest.download = DOWNLOAD_URL; +manifest.manifest = LATEST_URL; // Filter out dev-only resources if (manifest.esmodules) { @@ -31,7 +34,6 @@ if (manifest.esmodules) { // Remove dev flags delete manifest.flags?.hotReload; - if (Object.keys(manifest.flags).length === 0) { delete manifest.flags; }; From 7cb5e49d6de066043f26f81922c6aa1fab31c8d7 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 10:28:51 -0700 Subject: [PATCH 031/105] Install node dependencies during build --- .forgejo/workflows/draft-release.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 760c92a..057931b 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -6,6 +6,9 @@ jobs: - name: Checkout code uses: actions/checkout@v4 + - name: Install dependencies + run: npm clean-install + - name: Extract version from manifest id: version run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" From 9723ea8bdc77b2adc131f2b02b6ead8d5d8a1abf Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 10:39:34 -0700 Subject: [PATCH 032/105] Comment out functionality to try and figure out what's breaking --- scripts/tagExists.mjs | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/scripts/tagExists.mjs b/scripts/tagExists.mjs index f9e1206..f223bce 100644 --- a/scripts/tagExists.mjs +++ b/scripts/tagExists.mjs @@ -7,22 +7,24 @@ const { FORGEJO_TOKEN: TOKEN, } = process.env; -async function main() { - const requestURL = `${API_URL}/repos/${REPO}/tags/${TAG_NAME}`; +console.log(process.env); - const response = await axios.get( - requestURL, - { - headers: { Authorization: `token ${TOKEN}` }, - validateStatus: () => true, - }, - ); +// async function main() { +// const requestURL = `${API_URL}/repos/${REPO}/tags/${TAG_NAME}`; - // We actually *want* an error when the tag exists, instead of when - // it doesn't - if (response.status === 200) { - process.exit(1); - }; -}; +// const response = await axios.get( +// requestURL, +// { +// headers: { Authorization: `token ${TOKEN}` }, +// validateStatus: () => true, +// }, +// ); -main(); +// // We actually *want* an error when the tag exists, instead of when +// // it doesn't +// if (response.status === 200) { +// process.exit(1); +// }; +// }; + +// main(); From 57f9c347ff43e54929faa13a3b4df5f1e60520ab Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 10:43:57 -0700 Subject: [PATCH 033/105] Add functionality back in --- scripts/tagExists.mjs | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/scripts/tagExists.mjs b/scripts/tagExists.mjs index f223bce..6b6a6fa 100644 --- a/scripts/tagExists.mjs +++ b/scripts/tagExists.mjs @@ -9,22 +9,23 @@ const { console.log(process.env); -// async function main() { -// const requestURL = `${API_URL}/repos/${REPO}/tags/${TAG_NAME}`; +async function main() { + const requestURL = `${API_URL}/repos/${REPO}/tags/${TAG_NAME}`; -// const response = await axios.get( -// requestURL, -// { -// headers: { Authorization: `token ${TOKEN}` }, -// validateStatus: () => true, -// }, -// ); + const response = await axios.get( + requestURL, + { + headers: { Authorization: `token ${TOKEN}` }, + validateStatus: () => true, + }, + ); -// // We actually *want* an error when the tag exists, instead of when -// // it doesn't -// if (response.status === 200) { -// process.exit(1); -// }; -// }; + // We actually *want* an error when the tag exists, instead of when + // it doesn't + if (response.status === 200) { + console.log(`Tag with name "${TAG_NAME}" already exists`); + process.exit(1); + }; +}; -// main(); +main(); From 2eeeae9eefed1050bacd70fc0924ba652a4cd4bd Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 10:49:22 -0700 Subject: [PATCH 034/105] Try to figure out why the version is getting empty string --- .forgejo/workflows/draft-release.yaml | 41 ++++++++++++++------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 057931b..7ebbe3a 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -9,32 +9,35 @@ jobs: - name: Install dependencies run: npm clean-install + - name: List files + run: ls -al + - name: Extract version from manifest id: version - run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" + run: cat system.json | echo version=`jq -r ".version"` - - name: Assert that the tag doesn't exist - run: node scripts/tagExists.mjs - env: - TAG_NAME: ${{steps.version.output.version}} + # - name: Assert that the tag doesn't exist + # run: node scripts/tagExists.mjs + # env: + # TAG_NAME: ${{steps.version.output.version}} - - name: Build compendia - run: "npm run data:build" + # - name: Build compendia + # run: "npm run data:build" - - name: Remove compendia source - run: "rm -rf packs/**/_source" + # - name: Remove compendia source + # run: "rm -rf packs/**/_source" - - name: Compress files - run: zip -r release.zip langs module styles templates README.md assets + # - name: Compress files + # run: zip -r release.zip langs module styles templates README.md assets - - name: Upload artifacts - uses: https://data.forgejo.org/forgejo/upload-artifact@v4 - with: - path: | - system.json - release.zip - retention-days: 7 - if-no-files-found: error + # - name: Upload artifacts + # uses: https://data.forgejo.org/forgejo/upload-artifact@v4 + # with: + # path: | + # system.json + # release.zip + # retention-days: 7 + # if-no-files-found: error forgejo-release: From 5b636888340ee3accd180be4e2a7d2caf412809f Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 11:01:08 -0700 Subject: [PATCH 035/105] Try using a different output method --- .forgejo/workflows/draft-release.yaml | 8 ++++---- scripts/tagExists.mjs | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 7ebbe3a..57ac243 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -16,10 +16,10 @@ jobs: id: version run: cat system.json | echo version=`jq -r ".version"` - # - name: Assert that the tag doesn't exist - # run: node scripts/tagExists.mjs - # env: - # TAG_NAME: ${{steps.version.output.version}} + - name: Assert that the tag doesn't exist + run: node scripts/tagExists.mjs + env: + TAG_NAME: "v${{steps.version.output.version}}" # - name: Build compendia # run: "npm run data:build" diff --git a/scripts/tagExists.mjs b/scripts/tagExists.mjs index 6b6a6fa..5270dbe 100644 --- a/scripts/tagExists.mjs +++ b/scripts/tagExists.mjs @@ -8,6 +8,7 @@ const { } = process.env; console.log(process.env); +console.log({ TAG_NAME, API_URL, REPO, }); async function main() { const requestURL = `${API_URL}/repos/${REPO}/tags/${TAG_NAME}`; From 0179121c87d0592282aecca40732ff613d85fcd6 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 11:05:42 -0700 Subject: [PATCH 036/105] Try using a variable directly instead of environment variable --- .forgejo/workflows/draft-release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 57ac243..bbcf957 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -14,7 +14,7 @@ jobs: - name: Extract version from manifest id: version - run: cat system.json | echo version=`jq -r ".version"` + run: cat system.json | echo version=`jq -r ".version"` >> "${{env.FORGEJO_OUTPUT}}" - name: Assert that the tag doesn't exist run: node scripts/tagExists.mjs From 6c150b9b0ef0d216c33194a90e06e7837f91a069 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 11:08:28 -0700 Subject: [PATCH 037/105] Pluralize outputs --- .forgejo/workflows/draft-release.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index bbcf957..4d055ee 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -14,12 +14,12 @@ jobs: - name: Extract version from manifest id: version - run: cat system.json | echo version=`jq -r ".version"` >> "${{env.FORGEJO_OUTPUT}}" + run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" - name: Assert that the tag doesn't exist run: node scripts/tagExists.mjs env: - TAG_NAME: "v${{steps.version.output.version}}" + TAG_NAME: "v${{steps.version.outputs.version}}" # - name: Build compendia # run: "npm run data:build" @@ -44,7 +44,7 @@ jobs: runs-on: docker needs: - create-artifacts - if: var.RELEASE_TO_FORGEJO + if: var.RELEASE_TO_FORGEJO == true steps: - name: Download artifacts uses: actions/download-artifact@v4 @@ -68,7 +68,7 @@ jobs: runs-on: docker needs: - create-artifacts - if: var.RELEASE_TO_GITHUB + if: var.RELEASE_TO_GITHUB == true steps: - name: Download artifacts uses: actions/download-artifact@v4 From caf6dfa4a3123f565e7c54fe681d7c8e39db5e1a Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 11:10:09 -0700 Subject: [PATCH 038/105] Remove logs and add error when the tag name is empty --- scripts/tagExists.mjs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/tagExists.mjs b/scripts/tagExists.mjs index 5270dbe..fce9e17 100644 --- a/scripts/tagExists.mjs +++ b/scripts/tagExists.mjs @@ -7,10 +7,14 @@ const { FORGEJO_TOKEN: TOKEN, } = process.env; -console.log(process.env); -console.log({ TAG_NAME, API_URL, REPO, }); async function main() { + + if (!TAG_NAME) { + console.log(`Tag name must not be blank`); + process.exit(1); + }; + const requestURL = `${API_URL}/repos/${REPO}/tags/${TAG_NAME}`; const response = await axios.get( From 9b5b4bb9d1a6154e222e56163096adf2abcd88c0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 11:22:33 -0700 Subject: [PATCH 039/105] Add rest of steps back to action --- .forgejo/workflows/draft-release.yaml | 32 ++++++++++++--------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 4d055ee..4d918af 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -9,9 +9,6 @@ jobs: - name: Install dependencies run: npm clean-install - - name: List files - run: ls -al - - name: Extract version from manifest id: version run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" @@ -21,23 +18,22 @@ jobs: env: TAG_NAME: "v${{steps.version.outputs.version}}" - # - name: Build compendia - # run: "npm run data:build" + # Compendia steps + - name: Build compendia + run: "npm run data:build" + - run: "rm -rf packs/**/_source" - # - name: Remove compendia source - # run: "rm -rf packs/**/_source" + - name: Compress files + run: zip -r release.zip langs module styles templates README.md assets - # - name: Compress files - # run: zip -r release.zip langs module styles templates README.md assets - - # - name: Upload artifacts - # uses: https://data.forgejo.org/forgejo/upload-artifact@v4 - # with: - # path: | - # system.json - # release.zip - # retention-days: 7 - # if-no-files-found: error + - name: Upload artifacts + uses: https://data.forgejo.org/forgejo/upload-artifact@v4 + with: + path: | + system.json + release.zip + retention-days: 7 + if-no-files-found: error forgejo-release: From cf89b53b3b32e08b3e0168fac597a36567da5c0b Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 11:25:19 -0700 Subject: [PATCH 040/105] Version bump --- system.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system.json b/system.json index eb847b5..d5eee96 100644 --- a/system.json +++ b/system.json @@ -2,7 +2,7 @@ "id": "taf", "title": "Text-Based Actors", "description": "An intentionally minimalist system that enables you to play rules-light games without getting in your way!", - "version": "2.3.0", + "version": "2.4.0", "download": "", "manifest": "", "url": "https://git.varify.ca/Foundry/taf", From f1521992a2983595cecd0ec3a9b26319069b4dcf Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 11:53:05 -0700 Subject: [PATCH 041/105] Switch to using the act tag instead of Docker --- .forgejo/workflows/draft-release.yaml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 4d918af..3ade20d 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -21,7 +21,8 @@ jobs: # Compendia steps - name: Build compendia run: "npm run data:build" - - run: "rm -rf packs/**/_source" + - name: Remove compendia source + run: "rm -rf packs/**/_source" - name: Compress files run: zip -r release.zip langs module styles templates README.md assets @@ -37,7 +38,7 @@ jobs: forgejo-release: - runs-on: docker + runs-on: act needs: - create-artifacts if: var.RELEASE_TO_FORGEJO == true @@ -53,7 +54,7 @@ jobs: - name: Update manifest run: node scripts/updateManifest.mjs env: - DOWNLOAD_URL: "${{FORGEJO_SERVER_URL}}/${{FORGEJO_REPOSITORY}}/releases/download/${{steps.version.output.version}}/release.zip" + DOWNLOAD_URL: "${{FORGEJO_SERVER_URL}}/${{FORGEJO_REPOSITORY}}/releases/download/v${{steps.version.output.version}}/release.zip" LATEST_URL: "${{FORGEJO_SERVER_URL}}/${{FORGEJO_REPOSITORY}}releases/download/latest/system.json" - name: Create draft release @@ -61,7 +62,7 @@ jobs: github-release: - runs-on: docker + runs-on: act needs: - create-artifacts if: var.RELEASE_TO_GITHUB == true @@ -77,7 +78,7 @@ jobs: - name: Update manifest run: node scripts/updateManifest.mjs env: - DOWNLOAD_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/download/${{steps.version.output.version}}/release.zip" + DOWNLOAD_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/download/v${{steps.version.output.version}}/release.zip" LATEST_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/latest/download/system.json" - name: Sync Github mirror From 5c030c680d0010eafea9b2cc936323433c002a02 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 11:57:07 -0700 Subject: [PATCH 042/105] Add names and make the variable reference be correct --- .forgejo/workflows/draft-release.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 3ade20d..b2e999b 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -1,6 +1,7 @@ on: [ workflow_dispatch ] jobs: create-artifacts: + name: "Create artifacts" runs-on: act steps: - name: Checkout code @@ -38,10 +39,11 @@ jobs: forgejo-release: + name: "Create Forgejo release" runs-on: act needs: - create-artifacts - if: var.RELEASE_TO_FORGEJO == true + if: vars.RELEASE_TO_FORGEJO == true steps: - name: Download artifacts uses: actions/download-artifact@v4 @@ -63,9 +65,10 @@ jobs: github-release: runs-on: act + name: "Create Github release" needs: - create-artifacts - if: var.RELEASE_TO_GITHUB == true + if: vars.RELEASE_TO_GITHUB == true steps: - name: Download artifacts uses: actions/download-artifact@v4 From 1b986da6d4c66f0a933409a7f1eb3d929b493ee0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 12:00:12 -0700 Subject: [PATCH 043/105] Update the forgejo variable reference to be correct --- .forgejo/workflows/draft-release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index b2e999b..17ea864 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -56,8 +56,8 @@ jobs: - name: Update manifest run: node scripts/updateManifest.mjs env: - DOWNLOAD_URL: "${{FORGEJO_SERVER_URL}}/${{FORGEJO_REPOSITORY}}/releases/download/v${{steps.version.output.version}}/release.zip" - LATEST_URL: "${{FORGEJO_SERVER_URL}}/${{FORGEJO_REPOSITORY}}releases/download/latest/system.json" + DOWNLOAD_URL: "${{forgejo.server_url}}/${{forgejo.repository}}/releases/download/v${{steps.version.output.version}}/release.zip" + LATEST_URL: "${{forgejo.server_url}}/${{forgejo.repository}}releases/download/latest/system.json" - name: Create draft release run: cat system.json From 03b647cac16d89b7a3af8e15b43dadcc8bfddda5 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 12:07:45 -0700 Subject: [PATCH 044/105] Prevent boolean casting that breaks the checks --- .forgejo/workflows/draft-release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 17ea864..fe0a2a7 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -43,7 +43,7 @@ jobs: runs-on: act needs: - create-artifacts - if: vars.RELEASE_TO_FORGEJO == true + if: vars.RELEASE_TO_FORGEJO == "yes" steps: - name: Download artifacts uses: actions/download-artifact@v4 @@ -68,7 +68,7 @@ jobs: name: "Create Github release" needs: - create-artifacts - if: vars.RELEASE_TO_GITHUB == true + if: vars.RELEASE_TO_GITHUB == "yes" steps: - name: Download artifacts uses: actions/download-artifact@v4 From eac6a02c04c4e7ad1f41095aca01b093f9499423 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 12:18:44 -0700 Subject: [PATCH 045/105] Apparently only single quotes work as string delimiters --- .forgejo/workflows/draft-release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index fe0a2a7..47b7f99 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -43,7 +43,7 @@ jobs: runs-on: act needs: - create-artifacts - if: vars.RELEASE_TO_FORGEJO == "yes" + if: vars.RELEASE_TO_FORGEJO == 'yes' steps: - name: Download artifacts uses: actions/download-artifact@v4 @@ -68,7 +68,7 @@ jobs: name: "Create Github release" needs: - create-artifacts - if: vars.RELEASE_TO_GITHUB == "yes" + if: vars.RELEASE_TO_GITHUB == 'yes' steps: - name: Download artifacts uses: actions/download-artifact@v4 From 49784448e8df3127dbd19510bdf6058c7508e013 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 12:24:13 -0700 Subject: [PATCH 046/105] Pluralize outputs --- .forgejo/workflows/draft-release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 47b7f99..162e96c 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -56,7 +56,7 @@ jobs: - name: Update manifest run: node scripts/updateManifest.mjs env: - DOWNLOAD_URL: "${{forgejo.server_url}}/${{forgejo.repository}}/releases/download/v${{steps.version.output.version}}/release.zip" + DOWNLOAD_URL: "${{forgejo.server_url}}/${{forgejo.repository}}/releases/download/v${{steps.version.outputs.version}}/release.zip" LATEST_URL: "${{forgejo.server_url}}/${{forgejo.repository}}releases/download/latest/system.json" - name: Create draft release @@ -81,7 +81,7 @@ jobs: - name: Update manifest run: node scripts/updateManifest.mjs env: - DOWNLOAD_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/download/v${{steps.version.output.version}}/release.zip" + DOWNLOAD_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/download/v${{steps.version.outputs.version}}/release.zip" LATEST_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/latest/download/system.json" - name: Sync Github mirror From 14e53455c6646567790b91b3ff9a68e39f628922 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 12:25:33 -0700 Subject: [PATCH 047/105] Use the correct artifact download action --- .forgejo/workflows/draft-release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 162e96c..e21939a 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -46,7 +46,7 @@ jobs: if: vars.RELEASE_TO_FORGEJO == 'yes' steps: - name: Download artifacts - uses: actions/download-artifact@v4 + uses: https://data.forgejo.org/forgejo/download-artifact@v4 with: merge-multiple: true @@ -71,7 +71,7 @@ jobs: if: vars.RELEASE_TO_GITHUB == 'yes' steps: - name: Download artifacts - uses: actions/download-artifact@v4 + uses: https://data.forgejo.org/forgejo/download-artifact@v4 with: merge-multiple: true From 72a612d8a9460e261e4426792bc469aa12674b43 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 12:28:20 -0700 Subject: [PATCH 048/105] Run the correct script --- .forgejo/workflows/draft-release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index e21939a..3f074c8 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -54,7 +54,7 @@ jobs: run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" - name: Update manifest - run: node scripts/updateManifest.mjs + run: node scripts/prepareManifest.mjs env: DOWNLOAD_URL: "${{forgejo.server_url}}/${{forgejo.repository}}/releases/download/v${{steps.version.outputs.version}}/release.zip" LATEST_URL: "${{forgejo.server_url}}/${{forgejo.repository}}releases/download/latest/system.json" @@ -79,7 +79,7 @@ jobs: run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" - name: Update manifest - run: node scripts/updateManifest.mjs + run: node scripts/prepareManifest.mjs env: DOWNLOAD_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/download/v${{steps.version.outputs.version}}/release.zip" LATEST_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/latest/download/system.json" From 92ad2607cdb158fb5f3c23c8f45ae8b81988f5ae Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 12:33:51 -0700 Subject: [PATCH 049/105] Add the scripts and dependency install to the release jobs --- .forgejo/workflows/draft-release.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 3f074c8..332660c 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -34,6 +34,9 @@ jobs: path: | system.json release.zip + scripts/*.mjs + package-lock.json + package.json retention-days: 7 if-no-files-found: error @@ -50,6 +53,9 @@ jobs: with: merge-multiple: true + - name: Install dependencies + run: npm i + - id: version run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" @@ -75,6 +81,9 @@ jobs: with: merge-multiple: true + - name: Install dependencies + run: npm i + - id: version run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" From bb616dbec2ee2079a1b1d691d6fcf257edef7ee3 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 12:43:28 -0700 Subject: [PATCH 050/105] Correct URL template --- .forgejo/workflows/draft-release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 332660c..b2829ef 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -63,7 +63,7 @@ jobs: run: node scripts/prepareManifest.mjs env: DOWNLOAD_URL: "${{forgejo.server_url}}/${{forgejo.repository}}/releases/download/v${{steps.version.outputs.version}}/release.zip" - LATEST_URL: "${{forgejo.server_url}}/${{forgejo.repository}}releases/download/latest/system.json" + LATEST_URL: "${{forgejo.server_url}}/${{forgejo.repository}}/releases/download/latest/system.json" - name: Create draft release run: cat system.json From 2146d51fde1227d436577b75f92a50d64e1f6a5e Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 12:53:12 -0700 Subject: [PATCH 051/105] Add an artifact for checking the end result --- .forgejo/workflows/draft-release.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index b2829ef..318c973 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -65,9 +65,22 @@ jobs: DOWNLOAD_URL: "${{forgejo.server_url}}/${{forgejo.repository}}/releases/download/v${{steps.version.outputs.version}}/release.zip" LATEST_URL: "${{forgejo.server_url}}/${{forgejo.repository}}/releases/download/latest/system.json" + - name: Add manifest into release archive + run: zip release.zip --update system.json + - name: Create draft release run: cat system.json + - name: Upload artifacts + uses: https://data.forgejo.org/forgejo/upload-artifact@v4 + with: + name: "forgejo-final" + path: | + system.json + release.zip + retention-days: 7 + if-no-files-found: error + github-release: runs-on: act @@ -93,6 +106,9 @@ jobs: DOWNLOAD_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/download/v${{steps.version.outputs.version}}/release.zip" LATEST_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/latest/download/system.json" + - name: Add manifest into release archive + run: zip release.zip --update system.json + - name: Sync Github mirror run: echo Syncing mirror From 7841e04dfc22d0600ec06f5953470fd626d37db1 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 12:54:24 -0700 Subject: [PATCH 052/105] Fix yaml syntax --- .forgejo/workflows/draft-release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 318c973..c5381fd 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -71,7 +71,7 @@ jobs: - name: Create draft release run: cat system.json - - name: Upload artifacts + - name: Upload artifacts uses: https://data.forgejo.org/forgejo/upload-artifact@v4 with: name: "forgejo-final" From 4275909dc823b9bc7299eb92d738fee7f93cedb0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 13:54:39 -0700 Subject: [PATCH 053/105] Try making the release step work --- .forgejo/workflows/draft-release.yaml | 35 +++++++++++++++++++-------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index c5381fd..d71e656 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -68,18 +68,33 @@ jobs: - name: Add manifest into release archive run: zip release.zip --update system.json - - name: Create draft release - run: cat system.json + - name: Move files into release dir + run: mv release.zip release/release.zip; mv system.json release/system.json - - name: Upload artifacts - uses: https://data.forgejo.org/forgejo/upload-artifact@v4 + - name: Create draft release + uses: https://code.forgejo.org/actions/forgejo-release@v2.5.0 with: - name: "forgejo-final" - path: | - system.json - release.zip - retention-days: 7 - if-no-files-found: error + direction: "upload" + tag: "v${{steps.version.outputs.version}}" + hide-archive-link: true + draft: true + release-dir: release + + # env: + # TAG: "v${{steps.version.outputs.version}}" + # AUTH: "token ${{forgejo.token}}" + # API_URL: ${{forgejo.api_url}} + # REPO: ${{forgejo.repository}} + + # - name: Upload artifacts + # uses: https://data.forgejo.org/forgejo/upload-artifact@v4 + # with: + # name: "forgejo-final" + # path: | + # system.json + # release.zip + # retention-days: 7 + # if-no-files-found: error github-release: From a4355c608a2aaebcc58f7a6c2f7e927a3a0f4326 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 13:56:08 -0700 Subject: [PATCH 054/105] Create release directory --- .forgejo/workflows/draft-release.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index d71e656..3623d45 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -69,7 +69,7 @@ jobs: run: zip release.zip --update system.json - name: Move files into release dir - run: mv release.zip release/release.zip; mv system.json release/system.json + run: mkdir release; mv release.zip release/release.zip; mv system.json release/system.json - name: Create draft release uses: https://code.forgejo.org/actions/forgejo-release@v2.5.0 @@ -129,3 +129,8 @@ jobs: - name: Create draft release run: cat system.json + env: + TAG: "v${{steps.version.outputs.version}}" + TOKEN: "Bearer ${{secrets.GH_TOKEN}}" + API_URL: "https://api.github.com" + REPO: "${{vars.GH_USER}}/${{vars.GH_REPO}}" From 07a55e90649f7ab1b23f70f631780c832f959ef6 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 14:04:41 -0700 Subject: [PATCH 055/105] Add a log for visibility --- scripts/tagExists.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/tagExists.mjs b/scripts/tagExists.mjs index fce9e17..2ddcdbd 100644 --- a/scripts/tagExists.mjs +++ b/scripts/tagExists.mjs @@ -31,6 +31,8 @@ async function main() { console.log(`Tag with name "${TAG_NAME}" already exists`); process.exit(1); }; + + console.log(`Tag with name "${TAG_NAME}" not found, proceeding`); }; main(); From 760009c9ba809bd2dc4994589881df6f512301ea Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 14:05:38 -0700 Subject: [PATCH 056/105] Remove name from version extraction --- .forgejo/workflows/draft-release.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 3623d45..ab39d4c 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -10,8 +10,7 @@ jobs: - name: Install dependencies run: npm clean-install - - name: Extract version from manifest - id: version + - id: version run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" - name: Assert that the tag doesn't exist From 031fdb4a405c6cd896d1723f55cefb6f2847a717 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 14:05:49 -0700 Subject: [PATCH 057/105] Add token to see if that fixes the issue --- .forgejo/workflows/draft-release.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index ab39d4c..af48b55 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -74,10 +74,11 @@ jobs: uses: https://code.forgejo.org/actions/forgejo-release@v2.5.0 with: direction: "upload" - tag: "v${{steps.version.outputs.version}}" + tag: "v${{ steps.version.outputs.version }}" hide-archive-link: true draft: true release-dir: release + token: ${{ forgejo.token }} # env: # TAG: "v${{steps.version.outputs.version}}" From 351300651ba63c70fa801654dab35988c2346d82 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 14:47:58 -0700 Subject: [PATCH 058/105] Add script for creating the forgejo release --- .forgejo/workflows/draft-release.yaml | 19 ++-------- scripts/createForgejoRelease.mjs | 51 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 scripts/createForgejoRelease.mjs diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index af48b55..2c407ad 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -67,24 +67,11 @@ jobs: - name: Add manifest into release archive run: zip release.zip --update system.json - - name: Move files into release dir - run: mkdir release; mv release.zip release/release.zip; mv system.json release/system.json - - name: Create draft release uses: https://code.forgejo.org/actions/forgejo-release@v2.5.0 - with: - direction: "upload" - tag: "v${{ steps.version.outputs.version }}" - hide-archive-link: true - draft: true - release-dir: release - token: ${{ forgejo.token }} - - # env: - # TAG: "v${{steps.version.outputs.version}}" - # AUTH: "token ${{forgejo.token}}" - # API_URL: ${{forgejo.api_url}} - # REPO: ${{forgejo.repository}} + run: node scripts/createForgejoRelease.mjs + env: + TAG: "v${{steps.version.outputs.version}}" # - name: Upload artifacts # uses: https://data.forgejo.org/forgejo/upload-artifact@v4 diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs new file mode 100644 index 0000000..7e153c1 --- /dev/null +++ b/scripts/createForgejoRelease.mjs @@ -0,0 +1,51 @@ +import fs from "fs"; +import axios from "axios"; + +const { + TAG, + FORGEJO_API_URL: API, + FORGEJO_REPOSITORY: REPO, + FORGEJO_TOKEN: TOKEN, +} = process.env; + +async function main() { + + // Initial Release Data + const release = await axios.post( + `${API}/repos/${REPO}/releases`, + { + tag_name: TAG, + draft: true, + hide_archive_links: true, + }, + { + headers: { Authorization: `token ${TOKEN}` }, + } + ); + + // Upload the release archive + const archiveFormData = new FormData(); + const archive = await fs.openAsBlob(`release.zip`); + archiveFormData.set(`release`, archive, `release.zip`) + await axios.post( + `${API}/repos/${REPO}/releases/${release.data.id}/assets`, + archiveFormData, + { + headers: { Authorization: `token ${TOKEN}` }, + } + ); + + // Upload the manifest file + const formData = new FormData(); + const manifest = await fs.openAsBlob(`system.json`); + formData.set(`manifest`, manifest, `system.json`) + await axios.post( + `${API}/repos/${REPO}/releases/${release.data.id}/assets`, + formData, + { + headers: { Authorization: `token ${TOKEN}` }, + } + ); +}; + +main(); From 4b121c1f0ff888d3364f339f7874794a420664c2 Mon Sep 17 00:00:00 2001 From: Oliver Date: Sun, 16 Nov 2025 14:49:09 -0700 Subject: [PATCH 059/105] Remove uses when using a script --- .forgejo/workflows/draft-release.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 2c407ad..fb9ad9f 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -68,7 +68,6 @@ jobs: run: zip release.zip --update system.json - name: Create draft release - uses: https://code.forgejo.org/actions/forgejo-release@v2.5.0 run: node scripts/createForgejoRelease.mjs env: TAG: "v${{steps.version.outputs.version}}" From a06934538eb04ab2297b5224f0fffc9b72426b36 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 17 Nov 2025 20:58:39 -0700 Subject: [PATCH 060/105] Try a different import method for openAsBlob --- scripts/createForgejoRelease.mjs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index 7e153c1..f07de75 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -1,4 +1,4 @@ -import fs from "fs"; +import { openAsBlob } from "node:fs"; import axios from "axios"; const { @@ -25,7 +25,7 @@ async function main() { // Upload the release archive const archiveFormData = new FormData(); - const archive = await fs.openAsBlob(`release.zip`); + const archive = await openAsBlob(`release.zip`); archiveFormData.set(`release`, archive, `release.zip`) await axios.post( `${API}/repos/${REPO}/releases/${release.data.id}/assets`, @@ -37,7 +37,7 @@ async function main() { // Upload the manifest file const formData = new FormData(); - const manifest = await fs.openAsBlob(`system.json`); + const manifest = await openAsBlob(`system.json`); formData.set(`manifest`, manifest, `system.json`) await axios.post( `${API}/repos/${REPO}/releases/${release.data.id}/assets`, From aa7c231e58e3a8ce1249e6233a796ec47dec5c7e Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 17 Nov 2025 21:24:06 -0700 Subject: [PATCH 061/105] Use a readStream instead of openAsBlob --- scripts/createForgejoRelease.mjs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index f07de75..e3b58e0 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -1,4 +1,4 @@ -import { openAsBlob } from "node:fs"; +import { createReadStream } from "fs"; import axios from "axios"; const { @@ -25,8 +25,8 @@ async function main() { // Upload the release archive const archiveFormData = new FormData(); - const archive = await openAsBlob(`release.zip`); - archiveFormData.set(`release`, archive, `release.zip`) + const archive = createReadStream(`release.zip`); + archiveFormData.append(`release`, archive, `release.zip`); await axios.post( `${API}/repos/${REPO}/releases/${release.data.id}/assets`, archiveFormData, @@ -37,8 +37,8 @@ async function main() { // Upload the manifest file const formData = new FormData(); - const manifest = await openAsBlob(`system.json`); - formData.set(`manifest`, manifest, `system.json`) + const manifest = createReadStream(`system.json`); + formData.append(`manifest`, manifest, `system.json`); await axios.post( `${API}/repos/${REPO}/releases/${release.data.id}/assets`, formData, From 39d122a8822c312f47202b7a55434c4ff2adbadc Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 17 Nov 2025 21:25:43 -0700 Subject: [PATCH 062/105] Use set on the formData instead of append --- scripts/createForgejoRelease.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index e3b58e0..e6c9da2 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -26,7 +26,7 @@ async function main() { // Upload the release archive const archiveFormData = new FormData(); const archive = createReadStream(`release.zip`); - archiveFormData.append(`release`, archive, `release.zip`); + archiveFormData.set(`release`, archive, `release.zip`); await axios.post( `${API}/repos/${REPO}/releases/${release.data.id}/assets`, archiveFormData, @@ -38,7 +38,7 @@ async function main() { // Upload the manifest file const formData = new FormData(); const manifest = createReadStream(`system.json`); - formData.append(`manifest`, manifest, `system.json`); + formData.set(`manifest`, manifest, `system.json`); await axios.post( `${API}/repos/${REPO}/releases/${release.data.id}/assets`, formData, From ea57941472a873cf055d8fda92b4e2fb7ed01fa1 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 17 Nov 2025 21:30:22 -0700 Subject: [PATCH 063/105] Remove FormData shenanigans --- scripts/createForgejoRelease.mjs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index e6c9da2..5139fba 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -24,26 +24,22 @@ async function main() { ); // Upload the release archive - const archiveFormData = new FormData(); const archive = createReadStream(`release.zip`); - archiveFormData.set(`release`, archive, `release.zip`); await axios.post( `${API}/repos/${REPO}/releases/${release.data.id}/assets`, - archiveFormData, + archive, { headers: { Authorization: `token ${TOKEN}` }, } ); // Upload the manifest file - const formData = new FormData(); const manifest = createReadStream(`system.json`); - formData.set(`manifest`, manifest, `system.json`); await axios.post( `${API}/repos/${REPO}/releases/${release.data.id}/assets`, - formData, + manifest, { - headers: { Authorization: `token ${TOKEN}` }, + headers: { Authorization: `token ${TOKEN}`, }, } ); }; From bb5e27af875dc7f5c870fc5f0160c232cbccc92d Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 17 Nov 2025 21:31:17 -0700 Subject: [PATCH 064/105] Set release name properly --- scripts/createForgejoRelease.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index 5139fba..07ef65b 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -14,6 +14,7 @@ async function main() { const release = await axios.post( `${API}/repos/${REPO}/releases`, { + name: TAG, tag_name: TAG, draft: true, hide_archive_links: true, From a63f0e02d9c19937f7becf8f5327e9d830c8f7bb Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 17 Nov 2025 21:43:57 -0700 Subject: [PATCH 065/105] Move uploading into a helper function and improve error handling --- scripts/createForgejoRelease.mjs | 48 ++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index 07ef65b..6390e0f 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -8,6 +8,19 @@ const { FORGEJO_TOKEN: TOKEN, } = process.env; +async function uploadFile(releaseID, localPath, remoteName = undefined) { + remoteName ??= localPath.split(`/`).at(-1); + const stream = createReadStream(localPath); + return axios.post( + `${API}/repos/${REPO}/releases/${releaseID}/assets`, + stream, + { + headers: { Authorization: `token ${TOKEN}` }, + params: { name: remoteName }, + } + ) +}; + async function main() { // Initial Release Data @@ -24,25 +37,24 @@ async function main() { } ); - // Upload the release archive - const archive = createReadStream(`release.zip`); - await axios.post( - `${API}/repos/${REPO}/releases/${release.data.id}/assets`, - archive, - { - headers: { Authorization: `token ${TOKEN}` }, - } - ); + try { + await uploadFile(release.data.id, `release.zip`); + await uploadFile(release.data.id, `system.json`); + } catch (e) { + console.error(`Failed to upload files, deleting draft release`); + console.error(e); - // Upload the manifest file - const manifest = createReadStream(`system.json`); - await axios.post( - `${API}/repos/${REPO}/releases/${release.data.id}/assets`, - manifest, - { - headers: { Authorization: `token ${TOKEN}`, }, - } - ); + try { + await axios.delete( + `${API}/repos/${REPO}/releases/${release.data.id}`, + { + headers: { Authorization: `token ${TOKEN}` }, + } + ) + } catch { + console.error(`Failed to delete draft release`); + }; + }; }; main(); From 5e0028cdd67c255ed5b5532502b4b138fffdf752 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 17 Nov 2025 21:52:19 -0700 Subject: [PATCH 066/105] Try providing the Content-Type for Axios --- scripts/createForgejoRelease.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index 6390e0f..119b68d 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -15,7 +15,10 @@ async function uploadFile(releaseID, localPath, remoteName = undefined) { `${API}/repos/${REPO}/releases/${releaseID}/assets`, stream, { - headers: { Authorization: `token ${TOKEN}` }, + headers: { + Authorization: `token ${TOKEN}`, + "Content-Type": `multipart/form-data`, + }, params: { name: remoteName }, } ) From 41d3541c4bb70cb36cc68cfe7114a78d5018d862 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 17 Nov 2025 21:59:50 -0700 Subject: [PATCH 067/105] Try providing the serialization as an attachment name --- scripts/createForgejoRelease.mjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index 119b68d..70846da 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -13,7 +13,9 @@ async function uploadFile(releaseID, localPath, remoteName = undefined) { const stream = createReadStream(localPath); return axios.post( `${API}/repos/${REPO}/releases/${releaseID}/assets`, - stream, + { + attachment: stream, + }, { headers: { Authorization: `token ${TOKEN}`, @@ -57,6 +59,8 @@ async function main() { } catch { console.error(`Failed to delete draft release`); }; + + process.exit(1); }; }; From d7db9cb2dfd3762d4735a52a19f7ddf635e50693 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 17 Nov 2025 22:06:25 -0700 Subject: [PATCH 068/105] Add success log --- scripts/createForgejoRelease.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index 70846da..4ae38c7 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -62,6 +62,8 @@ async function main() { process.exit(1); }; + + console.log(`Release created, and files uploaded successfully!`); }; main(); From d018aea4f190f83798018de0f23b538f9742aa03 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 17 Nov 2025 22:08:14 -0700 Subject: [PATCH 069/105] Add some informational logs to the manifest preparation --- scripts/prepareManifest.mjs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/scripts/prepareManifest.mjs b/scripts/prepareManifest.mjs index 392918f..34f4236 100644 --- a/scripts/prepareManifest.mjs +++ b/scripts/prepareManifest.mjs @@ -16,26 +16,30 @@ const { let manifest; try { manifest = JSON.parse(await readFile(MANIFEST_PATH, `utf-8`)); + console.log(`Manifest loaded from disk`); } catch { console.error(`Failed to parse manifest file.`); process.exit(1); }; -// Update download / manifest URLs +console.log(`Updating download/manifest URLs`) manifest.download = DOWNLOAD_URL; manifest.manifest = LATEST_URL; // Filter out dev-only resources if (manifest.esmodules) { + console.log(`Removing dev-only esmodules`); manifest.esmodules = manifest.esmodules.filter( filepath => !filepath.startsWith(`dev/`) ); }; // Remove dev flags +console.log(`Cleaning up flags`); delete manifest.flags?.hotReload; if (Object.keys(manifest.flags).length === 0) { delete manifest.flags; }; await writeFile(MANIFEST_PATH, JSON.stringify(manifest, undefined, `\t`)); +console.log(`Manifest written back to disk`); From 45de56650a5491939b922b42a0bc4e63544d4124 Mon Sep 17 00:00:00 2001 From: Oliver Date: Mon, 17 Nov 2025 22:08:37 -0700 Subject: [PATCH 070/105] Add missing semicolon --- scripts/createForgejoRelease.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index 4ae38c7..ad9624a 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -23,7 +23,7 @@ async function uploadFile(releaseID, localPath, remoteName = undefined) { }, params: { name: remoteName }, } - ) + ); }; async function main() { From 2ddcda676e217e26aa46028dccc17ff1199e2904 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 00:58:50 -0700 Subject: [PATCH 071/105] Begin work on testing the Github release portion of the action --- .forgejo/workflows/draft-release.yaml | 14 +---- scripts/createGithubRelease.mjs | 83 +++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 scripts/createGithubRelease.mjs diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index fb9ad9f..3ab1f19 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -72,16 +72,6 @@ jobs: env: TAG: "v${{steps.version.outputs.version}}" - # - name: Upload artifacts - # uses: https://data.forgejo.org/forgejo/upload-artifact@v4 - # with: - # name: "forgejo-final" - # path: | - # system.json - # release.zip - # retention-days: 7 - # if-no-files-found: error - github-release: runs-on: act @@ -114,9 +104,9 @@ jobs: run: echo Syncing mirror - name: Create draft release - run: cat system.json + run: node scripts/createGithubRelease.mjs env: TAG: "v${{steps.version.outputs.version}}" - TOKEN: "Bearer ${{secrets.GH_TOKEN}}" + TOKEN: ${{secrets.GH_TOKEN}} API_URL: "https://api.github.com" REPO: "${{vars.GH_USER}}/${{vars.GH_REPO}}" diff --git a/scripts/createGithubRelease.mjs b/scripts/createGithubRelease.mjs new file mode 100644 index 0000000..2697665 --- /dev/null +++ b/scripts/createGithubRelease.mjs @@ -0,0 +1,83 @@ +/* +Create draft release +Assert HTTP 200 +Upload release.zip +Upload system.json +*/ +import { createReadStream } from "fs"; +import axios from "axios"; + +const { + TAG, + REPO, + TOKEN, + API_URL: API, +} = process.env; + +async function uploadFile(releaseID, localPath, remoteName = undefined) { + remoteName ??= localPath.split(`/`).at(-1); + const stream = createReadStream(localPath); + return axios.post( + `${API}/repos/${REPO}/releases/${releaseID}/assets`, + { + attachment: stream, + }, + { + headers: { + Authorization: `Bearer ${TOKEN}`, + "Content-Type": `multipart/form-data`, + "X-GitHub-Api-Version": `2022-11-28`, + }, + params: { name: remoteName }, + } + ); +}; + +async function main() { + + // Initial Release Data + const release = await axios.post( + `${API}/repos/${REPO}/releases`, + { + name: TAG, + tag_name: TAG, + draft: true, + generate_release_notes: false, + make_latest: false, + }, + { + headers: { + Authorization: `Bearer ${TOKEN}`, + "X-GitHub-Api-Version": `2022-11-28`, + }, + } + ); + + try { + await uploadFile(release.data.id, `release.zip`); + await uploadFile(release.data.id, `system.json`); + } catch (e) { + console.error(`Failed to upload files, deleting draft release`); + console.error(e); + + try { + await axios.delete( + `${API}/repos/${REPO}/releases/${release.data.id}`, + { + headers: { + Authorization: `Bearer ${TOKEN}`, + "X-GitHub-Api-Version": `2022-11-28`, + }, + } + ) + } catch { + console.error(`Failed to delete draft release`); + }; + + process.exit(1); + }; + + console.log(`Release created, and files uploaded successfully!`); +}; + +main(); From 871c820f94adc2cda961324b10dc7603643cec26 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 01:05:12 -0700 Subject: [PATCH 072/105] Make the response conform to Github's specification --- scripts/createGithubRelease.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/createGithubRelease.mjs b/scripts/createGithubRelease.mjs index 2697665..1900063 100644 --- a/scripts/createGithubRelease.mjs +++ b/scripts/createGithubRelease.mjs @@ -43,7 +43,7 @@ async function main() { tag_name: TAG, draft: true, generate_release_notes: false, - make_latest: false, + make_latest: "false", }, { headers: { From cd3b5998dde8410988da72164f39d05f432f9548 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 01:12:09 -0700 Subject: [PATCH 073/105] Apparently Github has a different URI for asset uploads --- scripts/createGithubRelease.mjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/createGithubRelease.mjs b/scripts/createGithubRelease.mjs index 1900063..0ba3429 100644 --- a/scripts/createGithubRelease.mjs +++ b/scripts/createGithubRelease.mjs @@ -14,11 +14,11 @@ const { API_URL: API, } = process.env; -async function uploadFile(releaseID, localPath, remoteName = undefined) { +async function uploadFile(uploadsURL, localPath, remoteName = undefined) { remoteName ??= localPath.split(`/`).at(-1); const stream = createReadStream(localPath); return axios.post( - `${API}/repos/${REPO}/releases/${releaseID}/assets`, + uploadsURL, { attachment: stream, }, @@ -54,8 +54,8 @@ async function main() { ); try { - await uploadFile(release.data.id, `release.zip`); - await uploadFile(release.data.id, `system.json`); + await uploadFile(release.data.upload_url, `release.zip`); + await uploadFile(release.data.upload_url, `system.json`); } catch (e) { console.error(`Failed to upload files, deleting draft release`); console.error(e); From 6e5422e08bd99f3b8db0c87c25b2461a5c7910ae Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 17:06:11 -0700 Subject: [PATCH 074/105] Try using the stream as the request payload --- scripts/createGithubRelease.mjs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/scripts/createGithubRelease.mjs b/scripts/createGithubRelease.mjs index 0ba3429..7b056ec 100644 --- a/scripts/createGithubRelease.mjs +++ b/scripts/createGithubRelease.mjs @@ -19,9 +19,7 @@ async function uploadFile(uploadsURL, localPath, remoteName = undefined) { const stream = createReadStream(localPath); return axios.post( uploadsURL, - { - attachment: stream, - }, + stream, { headers: { Authorization: `Bearer ${TOKEN}`, From a4ae2aefca18caac0e0bec6e9d8ea689544e285d Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 23:03:01 -0700 Subject: [PATCH 075/105] Remove the Github release shenanigans in favour of uploading to s3 --- .forgejo/workflows/draft-release.yaml | 51 ++++------------- scripts/createForgejoRelease.mjs | 16 ++---- scripts/createGithubRelease.mjs | 81 --------------------------- scripts/uploadToS3.mjs | 66 ++++++++++++++++++++++ 4 files changed, 84 insertions(+), 130 deletions(-) delete mode 100644 scripts/createGithubRelease.mjs create mode 100644 scripts/uploadToS3.mjs diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 3ab1f19..6f5a4d5 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -67,46 +67,19 @@ jobs: - name: Add manifest into release archive run: zip release.zip --update system.json + - name: Upload archive to s3 + run: node scripts/uploadToS3.mjs + env: + TAG: "v${{steps.version.outputs.version}}" + FILE: "release.zip" + + - name: Upload manifest to s3 + run: node scripts/uploadToS3.mjs + env: + TAG: "v${{steps.version.outputs.version}}" + FILE: "system.json" + - name: Create draft release run: node scripts/createForgejoRelease.mjs env: TAG: "v${{steps.version.outputs.version}}" - - - github-release: - runs-on: act - name: "Create Github release" - needs: - - create-artifacts - if: vars.RELEASE_TO_GITHUB == 'yes' - steps: - - name: Download artifacts - uses: https://data.forgejo.org/forgejo/download-artifact@v4 - with: - merge-multiple: true - - - name: Install dependencies - run: npm i - - - id: version - run: cat system.json | echo version=`jq -r ".version"` >> "$FORGEJO_OUTPUT" - - - name: Update manifest - run: node scripts/prepareManifest.mjs - env: - DOWNLOAD_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/download/v${{steps.version.outputs.version}}/release.zip" - LATEST_URL: "https://github.com/${{vars.GH_USER}}/${{vars.GH_REPO}}/releases/latest/download/system.json" - - - name: Add manifest into release archive - run: zip release.zip --update system.json - - - name: Sync Github mirror - run: echo Syncing mirror - - - name: Create draft release - run: node scripts/createGithubRelease.mjs - env: - TAG: "v${{steps.version.outputs.version}}" - TOKEN: ${{secrets.GH_TOKEN}} - API_URL: "https://api.github.com" - REPO: "${{vars.GH_USER}}/${{vars.GH_REPO}}" diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index ad9624a..589cee1 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -1,4 +1,3 @@ -import { createReadStream } from "fs"; import axios from "axios"; const { @@ -6,22 +5,19 @@ const { FORGEJO_API_URL: API, FORGEJO_REPOSITORY: REPO, FORGEJO_TOKEN: TOKEN, + CDN_URL, } = process.env; -async function uploadFile(releaseID, localPath, remoteName = undefined) { - remoteName ??= localPath.split(`/`).at(-1); - const stream = createReadStream(localPath); +async function addReleaseAsset(releaseID, name) { return axios.post( `${API}/repos/${REPO}/releases/${releaseID}/assets`, - { - attachment: stream, - }, + { external_url: `${CDN_URL}/${REPO}/${TAG}/${name}`, }, { headers: { Authorization: `token ${TOKEN}`, "Content-Type": `multipart/form-data`, }, - params: { name: remoteName }, + params: { name }, } ); }; @@ -43,8 +39,8 @@ async function main() { ); try { - await uploadFile(release.data.id, `release.zip`); - await uploadFile(release.data.id, `system.json`); + await addReleaseAsset(release.data.id, `release.zip`); + await addReleaseAsset(release.data.id, `system.json`); } catch (e) { console.error(`Failed to upload files, deleting draft release`); console.error(e); diff --git a/scripts/createGithubRelease.mjs b/scripts/createGithubRelease.mjs deleted file mode 100644 index 7b056ec..0000000 --- a/scripts/createGithubRelease.mjs +++ /dev/null @@ -1,81 +0,0 @@ -/* -Create draft release -Assert HTTP 200 -Upload release.zip -Upload system.json -*/ -import { createReadStream } from "fs"; -import axios from "axios"; - -const { - TAG, - REPO, - TOKEN, - API_URL: API, -} = process.env; - -async function uploadFile(uploadsURL, localPath, remoteName = undefined) { - remoteName ??= localPath.split(`/`).at(-1); - const stream = createReadStream(localPath); - return axios.post( - uploadsURL, - stream, - { - headers: { - Authorization: `Bearer ${TOKEN}`, - "Content-Type": `multipart/form-data`, - "X-GitHub-Api-Version": `2022-11-28`, - }, - params: { name: remoteName }, - } - ); -}; - -async function main() { - - // Initial Release Data - const release = await axios.post( - `${API}/repos/${REPO}/releases`, - { - name: TAG, - tag_name: TAG, - draft: true, - generate_release_notes: false, - make_latest: "false", - }, - { - headers: { - Authorization: `Bearer ${TOKEN}`, - "X-GitHub-Api-Version": `2022-11-28`, - }, - } - ); - - try { - await uploadFile(release.data.upload_url, `release.zip`); - await uploadFile(release.data.upload_url, `system.json`); - } catch (e) { - console.error(`Failed to upload files, deleting draft release`); - console.error(e); - - try { - await axios.delete( - `${API}/repos/${REPO}/releases/${release.data.id}`, - { - headers: { - Authorization: `Bearer ${TOKEN}`, - "X-GitHub-Api-Version": `2022-11-28`, - }, - } - ) - } catch { - console.error(`Failed to delete draft release`); - }; - - process.exit(1); - }; - - console.log(`Release created, and files uploaded successfully!`); -}; - -main(); diff --git a/scripts/uploadToS3.mjs b/scripts/uploadToS3.mjs new file mode 100644 index 0000000..ec125f8 --- /dev/null +++ b/scripts/uploadToS3.mjs @@ -0,0 +1,66 @@ +import { PutObjectCommand, S3Client } from '@aws-sdk/client-s3'; +import { createReadStream } from "fs"; + +const requiredEnvVariables = [ + `TAG`, `FILE`, + `FORGEJO_REPOSITORY`, + `S3_BUCKET`, `S3_REGION`, `S3_KEY`, `S3_SECRET`, `S3_ENDPOINT`, +]; + +async function main() { + + // Assert all of the required env variables are present + const missing = []; + for (const envVar of requiredEnvVariables) { + if (!(envVar in process.env)) { + missing.push(envVar); + }; + }; + if (missing.length > 0) { + console.error(`Missing the following required environment variables: ${missing.join(`, `)}`); + process.exit(1); + }; + + const { + TAG, + S3_ENDPOINT, + S3_REGION, + S3_KEY, + S3_SECRET, + S3_BUCKET, + FILE, + FORGEJO_REPOSITORY: REPO, + } = process.env; + + const s3Client = new S3Client({ + endpoint: S3_ENDPOINT, + forcePathStyle: false, + region: S3_REGION, + credentials: { + accessKeyId: S3_KEY, + secretAccessKey: S3_SECRET + }, + }); + + const name = FILE.split(`/`).at(-1); + + const params = { + Bucket: S3_BUCKET, + Key: `${REPO}/${TAG}/${name}`, + Body: createReadStream(FILE), + ACL: "public-read", + METADATA: { + "x-repo-version": TAG, + }, + }; + + try { + const response = await s3Client.send(new PutObjectCommand(params)); + console.log("Upload successful"); + console.log(response); + } catch (err) { + console.error("Error", err); + }; +}; + +main(); \ No newline at end of file From 7245e89c62df096b45306cf6eb944f80bd1a9587 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 23:06:28 -0700 Subject: [PATCH 076/105] Update package.json for the AWS dependency I forgot to include --- package-lock.json | 1742 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 1743 insertions(+) diff --git a/package-lock.json b/package-lock.json index 55fd03f..27b1468 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,6 +5,7 @@ "packages": { "": { "devDependencies": { + "@aws-sdk/client-s3": "^3.934.0", "@eslint/js": "^9.8.0", "@foundryvtt/foundryvtt-cli": "^1.0.3", "@stylistic/eslint-plugin": "^2.6.1", @@ -14,6 +15,918 @@ "globals": "^15.9.0" } }, + "node_modules/@aws-crypto/crc32": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz", + "integrity": "sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/crc32c": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz", + "integrity": "sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz", + "integrity": "sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", + "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-js": "^5.2.0", + "@aws-crypto/supports-web-crypto": "^5.2.0", + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", + "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/util": "^5.2.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", + "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", + "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.934.0.tgz", + "integrity": "sha512-dtg77FGTgt8WlqgrRriCOie/SUl0x0cx2itPgK6fkf3pRK0t1betQ0EUZM6VYQcj+hqVMzh/XRcr1TDm5n5eVw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.934.0", + "@aws-sdk/credential-provider-node": "3.934.0", + "@aws-sdk/middleware-bucket-endpoint": "3.930.0", + "@aws-sdk/middleware-expect-continue": "3.930.0", + "@aws-sdk/middleware-flexible-checksums": "3.934.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-location-constraint": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.933.0", + "@aws-sdk/middleware-sdk-s3": "3.934.0", + "@aws-sdk/middleware-ssec": "3.930.0", + "@aws-sdk/middleware-user-agent": "3.934.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/signature-v4-multi-region": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.934.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/eventstream-serde-browser": "^4.2.5", + "@smithy/eventstream-serde-config-resolver": "^4.3.5", + "@smithy/eventstream-serde-node": "^4.2.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-blob-browser": "^4.2.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/hash-stream-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/md5-js": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.934.0.tgz", + "integrity": "sha512-gsgJevqhY0j3x014ejhXtHLCA6o83FYm3rJoZG7tqoy3DnWerLv/FHaAnHI/+Q+csadqjoFkWGQTOedPoOunzA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.934.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.933.0", + "@aws-sdk/middleware-user-agent": "3.934.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.934.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.934.0.tgz", + "integrity": "sha512-b6k916ZxSrBwQPzeirncTIQXGnhps0HFOUakFt0ZEzjksePYUiEoU/SQ7VeY1j9JeAdJ24ejqddCiyLt99/3lg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.934.0.tgz", + "integrity": "sha512-bnpIGYm7Jy46dxZa1cxMQ1sF0n2iBIT+TpOPHK51sz1N2dYOicUVWUHMDgU2xIFOVcKaqV+GV4VyicMmvDBcBQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.934.0.tgz", + "integrity": "sha512-WJcfFik7MPIgjE8lmuDcCqddHKRMpifzoBzTZWqUJJWYXIy0rDfNzt6pn3/TMLwVgnCGjnXlw6dChTxLzO60RQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.934.0.tgz", + "integrity": "sha512-3vVKGe1F2S09G9kC0ZcpWh09opyrGOgQETllqWbuxlTVd7zBgrZWloItLIvneSDP+dWvdLFUbkD7WDWNCeGiig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.934.0", + "@aws-sdk/credential-provider-env": "3.934.0", + "@aws-sdk/credential-provider-http": "3.934.0", + "@aws-sdk/credential-provider-process": "3.934.0", + "@aws-sdk/credential-provider-sso": "3.934.0", + "@aws-sdk/credential-provider-web-identity": "3.934.0", + "@aws-sdk/nested-clients": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.934.0.tgz", + "integrity": "sha512-nguy36xi8nbH346dJjCmwWtOgfS4VfL7yHP+EEGmma+yg+J7mxgs8kA1NGQdJ8B46GdjlJPpI1P9pm7Pmz7nOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.934.0", + "@aws-sdk/credential-provider-http": "3.934.0", + "@aws-sdk/credential-provider-ini": "3.934.0", + "@aws-sdk/credential-provider-process": "3.934.0", + "@aws-sdk/credential-provider-sso": "3.934.0", + "@aws-sdk/credential-provider-web-identity": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.934.0.tgz", + "integrity": "sha512-PhvpAgoJ88IOuqlUws9nvHuPex2jK+WS+0s00BQcRTwqPP0jtLT7eql6UfCRduwv2sIy3m1wnWDUubvbpejp/Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.934.0.tgz", + "integrity": "sha512-7wO86w95V9MZSYo2dunBKruKHdAUmgg9ccOSJSYGnPip1PPBK/rgSgQ8mDlYtFAW3/82bdeM/668QcgLT4+ofA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.934.0", + "@aws-sdk/core": "3.934.0", + "@aws-sdk/token-providers": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.934.0.tgz", + "integrity": "sha512-hb+lvFxiAPcAvUorB0hrUd1kDjDRXhZgCi5426I8KUpGzZ+ALh8/ep0KXAiYe2yg9ZkyMUbMaMvYYhMFcbXRFA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.934.0", + "@aws-sdk/nested-clients": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.930.0.tgz", + "integrity": "sha512-cnCLWeKPYgvV4yRYPFH6pWMdUByvu2cy2BAlfsPpvnm4RaVioztyvxmQj5PmVN5fvWs5w/2d6U7le8X9iye2sA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.930.0.tgz", + "integrity": "sha512-5HEQ+JU4DrLNWeY27wKg/jeVa8Suy62ivJHOSUf6e6hZdVIMx0h/kXS1fHEQNNiLu2IzSEP/bFXsKBaW7x7s0g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.934.0.tgz", + "integrity": "sha512-kAV0fhwUhh/CV8hR5iip+du5QSXvIsONERVY/iJPbiBItqsmFaWcwiZE9E+ORJPNyoT/3X17632W33pCweKGDQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@aws-crypto/crc32c": "5.2.0", + "@aws-crypto/util": "5.2.0", + "@aws-sdk/core": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.930.0.tgz", + "integrity": "sha512-x30jmm3TLu7b/b+67nMyoV0NlbnCVT5DI57yDrhXAPCtdgM1KtdLWt45UcHpKOm1JsaIkmYRh2WYu7Anx4MG0g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.930.0.tgz", + "integrity": "sha512-QIGNsNUdRICog+LYqmtJ03PLze6h2KCORXUs5td/hAEjVP5DMmubhtrGg1KhWyctACluUH/E/yrD14p4pRXxwA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.930.0.tgz", + "integrity": "sha512-vh4JBWzMCBW8wREvAwoSqB2geKsZwSHTa0nSt0OMOLp2PdTYIZDi0ZiVMmpfnjcx9XbS6aSluLv9sKx4RrG46A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.933.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.933.0.tgz", + "integrity": "sha512-qgrMlkVKzTCAdNw2A05DC2sPBo0KRQ7wk+lbYSRJnWVzcrceJhnmhoZVV5PFv7JtchK7sHVcfm9lcpiyd+XaCA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws/lambda-invoke-store": "^0.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.934.0.tgz", + "integrity": "sha512-eU2R7pVOhCxnkDzq9mW+xh4WvCA3mdXVUHezIcJNFyKCKKv/c9I4WFcnMnUy+wnCWO2mzN/gwSgQxADkvxfLNQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-arn-parser": "3.893.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.930.0.tgz", + "integrity": "sha512-N2/SvodmaDS6h7CWfuapt3oJyn1T2CBz0CsDIiTDv9cSagXAVFjPdm2g4PFJqrNBeqdDIoYBnnta336HmamWHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.934.0.tgz", + "integrity": "sha512-68giGM2Zm9K6Qas14ws3Qo5wafpn0I8/L64fS9E6Rc6Tu0k+So73hupysw+9ZOzHwQS5FEBUqLOMtbUibAcjNA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.934.0.tgz", + "integrity": "sha512-kRO61EMrDR4UuPlKAkziG6urcYXlhrFW/Ce5PjWFdjkm0ZOge75OFV1vhf/vE4Pmoop9jaAONX4E5BaIYrIQfg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.934.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.933.0", + "@aws-sdk/middleware-user-agent": "3.934.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.934.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.930.0.tgz", + "integrity": "sha512-KL2JZqH6aYeQssu1g1KuWsReupdfOoxD6f1as2VC+rdwYFUu4LfzMsFfXnBvvQWWqQ7rZHWOw1T+o5gJmg7Dzw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.934.0.tgz", + "integrity": "sha512-cLphxVoHapSdouAdLSDEwR2Bktjg5dc11EpSpaLo8jcFpAXhFaDllKBfDfws0EqGY6N2CMqEjqPqxDFzmmQOQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-sdk-s3": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.934.0.tgz", + "integrity": "sha512-M0WEmgXDdUxapSfjplqJoVCBMcn0vQ5Jou0X/XiQwyVDbfvIyNSHUHyMXEIBAew9kVx9sfMMEYz3LXewvQxdCA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.934.0", + "@aws-sdk/nested-clients": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.893.0.tgz", + "integrity": "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.930.0.tgz", + "integrity": "sha512-M2oEKBzzNAYr136RRc6uqw3aWlwCxqTP1Lawps9E1d2abRPvl1p1ztQmmXp1Ak4rv8eByIZ+yQyKQ3zPdRG5dw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-endpoints": "^3.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", + "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.930.0.tgz", + "integrity": "sha512-q6lCRm6UAe+e1LguM5E4EqM9brQlDem4XDcQ87NzEvlTW6GzmNCO0w1jS0XgCFXQHjDxjdlNFX+5sRbHijwklg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.934.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.934.0.tgz", + "integrity": "sha512-vPRR4PaqNmuOQJSzq4EAVwFHUaSpPtgDgCEc7AYbArIy+59fckb6JNddlrjx4w4iWbqO0d+7OC5PtRcIk0AcZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.934.0", + "@aws-sdk/types": "3.930.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.0.tgz", + "integrity": "sha512-D1jAmAZQYMoPiacfgNf7AWhg3DFN3Wq/vQv3WINt9znwjzHp2x+WzdJFxxj7xZL7V1U79As6G8f7PorMYWBKsQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -349,6 +1262,789 @@ "util": "^0.12.5" } }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.2.0.tgz", + "integrity": "sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.2.1.tgz", + "integrity": "sha512-lX9Ay+6LisTfpLid2zZtIhSEjHMZoAR5hHCR4H7tBz/Zkfr5ea8RcQ7Tk4mi0P76p4cN+Btz16Ffno7YHpKXnQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.4.tgz", + "integrity": "sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-4.2.5.tgz", + "integrity": "sha512-Ogt4Zi9hEbIP17oQMd68qYOHUzmH47UkK7q7Gl55iIm9oKt27MUGrC5JfpMroeHjdkOliOA4Qt3NQ1xMq/nrlA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.2.5.tgz", + "integrity": "sha512-HohfmCQZjppVnKX2PnXlf47CW3j92Ki6T/vkAT2DhBR47e89pen3s4fIa7otGTtrVxmj7q+IhH0RnC5kpR8wtw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.3.5.tgz", + "integrity": "sha512-ibjQjM7wEXtECiT6my1xfiMH9IcEczMOS6xiCQXoUIYSj5b1CpBbJ3VYbdwDy8Vcg5JHN7eFpOCGk8nyZAltNQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.2.5.tgz", + "integrity": "sha512-+elOuaYx6F2H6x1/5BQP5ugv12nfJl66GhxON8+dWVUEDJ9jah/A0tayVdkLRP0AeSac0inYkDz5qBFKfVp2Gg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.2.5.tgz", + "integrity": "sha512-G9WSqbST45bmIFaeNuP/EnC19Rhp54CcVdX9PDL1zyEB514WsDVXhlyihKlGXnRycmHNmVv88Bvvt4EYxWef/Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.2.6.tgz", + "integrity": "sha512-8P//tA8DVPk+3XURk2rwcKgYwFvwGwmJH/wJqQiSKwXZtf/LiZK+hbUZmPj/9KzM+OVSwe4o85KTp5x9DUZTjw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/chunked-blob-reader": "^5.2.0", + "@smithy/chunked-blob-reader-native": "^4.2.1", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.2.5.tgz", + "integrity": "sha512-6+do24VnEyvWcGdHXomlpd0m8bfZePpUKBy7m311n+JuRwug8J4dCanJdTymx//8mi0nlkflZBvJe+dEO/O12Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.2.5.tgz", + "integrity": "sha512-Bt6jpSTMWfjCtC0s79gZ/WZ1w90grfmopVOWqkI2ovhjpD5Q2XRXuecIPB9689L2+cCySMbaXDhBPU56FKNDNg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.11.tgz", + "integrity": "sha512-eJXq9VJzEer1W7EQh3HY2PDJdEcEUnv6sKuNt4eVjyeNWcQFS4KmnY+CKkYOIR6tSqarn6bjjCqg1UB+8UJiPQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.4", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.11.tgz", + "integrity": "sha512-EL5OQHvFOKneJVRgzRW4lU7yidSwp/vRJOe542bHgExN3KNThr1rlg0iE4k4SnA+ohC+qlUxoK+smKeAYPzfAQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.7", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "4.9.7", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.7.tgz", + "integrity": "sha512-pskaE4kg0P9xNQWihfqlTMyxyFR3CH6Sr6keHYghgyqqDXzjl2QJg5lAzuVe/LzZiOzcbcVtxKYi1/fZPt/3DA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.4", + "@smithy/middleware-endpoint": "^4.3.11", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.10.tgz", + "integrity": "sha512-3iA3JVO1VLrP21FsZZpMCeF93aqP3uIOMvymAT3qHIJz2YlgDeRvNUspFwCNqd/j3qqILQJGtsVQnJZICh/9YA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.7", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.13.tgz", + "integrity": "sha512-PTc6IpnpSGASuzZAgyUtaVfOFpU0jBD2mcGwrgDuHf7PlFgt5TIPxCYBDbFQs06jxgeV3kd/d/sok1pzV0nJRg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.7", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.5.tgz", + "integrity": "sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/uuid": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", + "integrity": "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@stylistic/eslint-plugin": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.13.0.tgz", @@ -680,6 +2376,13 @@ ], "license": "MIT" }, + "node_modules/bowser": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.1.tgz", + "integrity": "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==", + "dev": true, + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", @@ -1315,6 +3018,25 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastq": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", @@ -2449,6 +4171,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -2488,6 +4223,13 @@ "typescript": ">=4.8.4" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index c1b700b..2532d39 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "devDependencies": { + "@aws-sdk/client-s3": "^3.934.0", "@eslint/js": "^9.8.0", "@foundryvtt/foundryvtt-cli": "^1.0.3", "@stylistic/eslint-plugin": "^2.6.1", From 9e3bc775b49b8340830cf892c3a2af79418e8212 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 23:16:56 -0700 Subject: [PATCH 077/105] Ensure the uploadScript gets the environment variables it requires and clean up asset adding error --- .forgejo/workflows/publish-release.yaml | 14 ++++++++++++++ scripts/createForgejoRelease.mjs | 16 +--------------- 2 files changed, 15 insertions(+), 15 deletions(-) create mode 100644 .forgejo/workflows/publish-release.yaml diff --git a/.forgejo/workflows/publish-release.yaml b/.forgejo/workflows/publish-release.yaml new file mode 100644 index 0000000..8d719c3 --- /dev/null +++ b/.forgejo/workflows/publish-release.yaml @@ -0,0 +1,14 @@ +on: + release: + types: [published] +jobs: + undraft-on-github: + runs-on: docker + steps: + - name: copy release description to github + - name: publish github release + release-to-foundry: + runs-on: docker + steps: + - name: retrieve release URLS + - name: publish to Foundry diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index 589cee1..bb67699 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -42,21 +42,7 @@ async function main() { await addReleaseAsset(release.data.id, `release.zip`); await addReleaseAsset(release.data.id, `system.json`); } catch (e) { - console.error(`Failed to upload files, deleting draft release`); - console.error(e); - - try { - await axios.delete( - `${API}/repos/${REPO}/releases/${release.data.id}`, - { - headers: { Authorization: `token ${TOKEN}` }, - } - ) - } catch { - console.error(`Failed to delete draft release`); - }; - - process.exit(1); + console.error(`Failed to add assets to the release`); }; console.log(`Release created, and files uploaded successfully!`); From d3f9c4c3761bf1fab24bafa89cc5db132d606de0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 23:18:39 -0700 Subject: [PATCH 078/105] Actually commit the correct file this time --- .forgejo/workflows/draft-release.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 6f5a4d5..886cba1 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -72,12 +72,22 @@ jobs: env: TAG: "v${{steps.version.outputs.version}}" FILE: "release.zip" + S3_BUCKET: "${{vars.S3_BUCKET}}" + S3_REGION: "${{vars.S3_REGION}}" + S3_KEY: "${{secrets.S3_KEY}}" + S3_SECRET: "${{secrets.S3_SECRET}}" + S3_ENDPOINT: "${{vars.S3_ENDPOINT}}" - name: Upload manifest to s3 run: node scripts/uploadToS3.mjs env: TAG: "v${{steps.version.outputs.version}}" FILE: "system.json" + S3_BUCKET: "${{vars.S3_BUCKET}}" + S3_REGION: "${{vars.S3_REGION}}" + S3_KEY: "${{secrets.S3_KEY}}" + S3_SECRET: "${{secrets.S3_SECRET}}" + S3_ENDPOINT: "${{vars.S3_ENDPOINT}}" - name: Create draft release run: node scripts/createForgejoRelease.mjs From 53f35562ade7ddcbbd5982473c7453fddb70ccc6 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 23:22:01 -0700 Subject: [PATCH 079/105] Update error handling --- scripts/createForgejoRelease.mjs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index bb67699..73adf80 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -43,6 +43,8 @@ async function main() { await addReleaseAsset(release.data.id, `system.json`); } catch (e) { console.error(`Failed to add assets to the release`); + console.error(e); + process.exit(1); }; console.log(`Release created, and files uploaded successfully!`); From 213996ab0a4b7f7a1b8f53c4093e5d9785f38e3b Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 23:25:41 -0700 Subject: [PATCH 080/105] Correct error with CDN URL creation --- .forgejo/workflows/draft-release.yaml | 2 ++ scripts/createForgejoRelease.mjs | 3 +-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 886cba1..60ea07d 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -72,6 +72,7 @@ jobs: env: TAG: "v${{steps.version.outputs.version}}" FILE: "release.zip" + CDN_URL: "${{vars.CDN_URL}}" S3_BUCKET: "${{vars.S3_BUCKET}}" S3_REGION: "${{vars.S3_REGION}}" S3_KEY: "${{secrets.S3_KEY}}" @@ -83,6 +84,7 @@ jobs: env: TAG: "v${{steps.version.outputs.version}}" FILE: "system.json" + CDN_URL: "${{vars.CDN_URL}}" S3_BUCKET: "${{vars.S3_BUCKET}}" S3_REGION: "${{vars.S3_REGION}}" S3_KEY: "${{secrets.S3_KEY}}" diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index 73adf80..76495a5 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -42,8 +42,7 @@ async function main() { await addReleaseAsset(release.data.id, `release.zip`); await addReleaseAsset(release.data.id, `system.json`); } catch (e) { - console.error(`Failed to add assets to the release`); - console.error(e); + console.error(`Failed to add assets to the release with message:`, e.data.message); process.exit(1); }; From 5c1985c4abfe4ae5bf82fb5c22e3889d77c2bb2b Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 23:28:02 -0700 Subject: [PATCH 081/105] Re-add the error printing --- scripts/createForgejoRelease.mjs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index 76495a5..c960e39 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -42,7 +42,8 @@ async function main() { await addReleaseAsset(release.data.id, `release.zip`); await addReleaseAsset(release.data.id, `system.json`); } catch (e) { - console.error(`Failed to add assets to the release with message:`, e.data.message); + console.error(`Failed to add assets to the release`); + console.error(e) process.exit(1); }; From bf579a34517d994a7ccbdc9edb8eb0e26ba6f8bb Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 23:29:45 -0700 Subject: [PATCH 082/105] Give the CDN URL to the proper step of the action --- .forgejo/workflows/draft-release.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.forgejo/workflows/draft-release.yaml b/.forgejo/workflows/draft-release.yaml index 60ea07d..e667615 100644 --- a/.forgejo/workflows/draft-release.yaml +++ b/.forgejo/workflows/draft-release.yaml @@ -72,7 +72,6 @@ jobs: env: TAG: "v${{steps.version.outputs.version}}" FILE: "release.zip" - CDN_URL: "${{vars.CDN_URL}}" S3_BUCKET: "${{vars.S3_BUCKET}}" S3_REGION: "${{vars.S3_REGION}}" S3_KEY: "${{secrets.S3_KEY}}" @@ -84,7 +83,6 @@ jobs: env: TAG: "v${{steps.version.outputs.version}}" FILE: "system.json" - CDN_URL: "${{vars.CDN_URL}}" S3_BUCKET: "${{vars.S3_BUCKET}}" S3_REGION: "${{vars.S3_REGION}}" S3_KEY: "${{secrets.S3_KEY}}" @@ -95,3 +93,4 @@ jobs: run: node scripts/createForgejoRelease.mjs env: TAG: "v${{steps.version.outputs.version}}" + CDN_URL: "${{vars.CDN_URL}}" From f500152ba7614a1d2e63ba7b92bf35741affb523 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 23:48:46 -0700 Subject: [PATCH 083/105] Remove pnpm lock --- pnpm-lock.yaml | 2119 ------------------------------------------------ 1 file changed, 2119 deletions(-) delete mode 100644 pnpm-lock.yaml diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 78cc67b..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,2119 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -devDependencies: - '@eslint/js': - specifier: ^9.8.0 - version: 9.37.0 - '@foundryvtt/foundryvtt-cli': - specifier: ^1.0.3 - version: 1.1.0 - '@league-of-foundry-developers/foundry-vtt-types': - specifier: ^9.280.0 - version: 9.280.1(@pixi/constants@6.5.10)(@pixi/core@6.5.10)(@pixi/display@6.5.10)(@pixi/graphics@6.5.10)(@pixi/math@6.5.10)(@pixi/utils@6.5.10) - '@playwright/test': - specifier: ^1.56.0 - version: 1.56.0 - '@stylistic/eslint-plugin': - specifier: ^2.6.1 - version: 2.13.0(eslint@9.37.0)(typescript@5.9.3) - '@types/node': - specifier: ^24.7.2 - version: 24.7.2 - dotenv: - specifier: ^17.2.2 - version: 17.2.3 - eslint: - specifier: ^9.8.0 - version: 9.37.0 - globals: - specifier: ^15.9.0 - version: 15.15.0 - -packages: - - /@eslint-community/eslint-utils@4.9.0(eslint@9.37.0): - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 9.37.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.12.1: - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/config-array@0.21.0: - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@eslint/object-schema': 2.1.6 - debug: 4.4.3 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/config-helpers@0.4.0: - resolution: {integrity: sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@eslint/core': 0.16.0 - dev: true - - /@eslint/core@0.16.0: - resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@types/json-schema': 7.0.15 - dev: true - - /@eslint/eslintrc@3.3.1: - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - ajv: 6.12.6 - debug: 4.4.3 - espree: 10.4.0 - globals: 14.0.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@9.37.0: - resolution: {integrity: sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - - /@eslint/object-schema@2.1.6: - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - - /@eslint/plugin-kit@0.4.0: - resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@eslint/core': 0.16.0 - levn: 0.4.1 - dev: true - - /@foundryvtt/foundryvtt-cli@1.1.0: - resolution: {integrity: sha512-ergKZDUSgQ79168r38ORyN4v/UTliA40rxElaUh5iS27Qw9H8Ep/ll8j3/HfiikO3XUDwYxZLfDJfbcyj2i9TQ==} - engines: {node: '>17.0.0'} - hasBin: true - dependencies: - chalk: 5.6.2 - classic-level: 1.4.1 - esm: 3.2.25 - js-yaml: 4.1.0 - mkdirp: 3.0.1 - nedb-promises: 6.2.3 - yargs: 17.7.2 - dev: true - - /@humanfs/core@0.19.1: - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} - dev: true - - /@humanfs/node@0.16.7: - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} - engines: {node: '>=18.18.0'} - dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.4.3 - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/retry@0.4.3: - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - dev: true - - /@league-of-foundry-developers/foundry-vtt-types@9.280.1(@pixi/constants@6.5.10)(@pixi/core@6.5.10)(@pixi/display@6.5.10)(@pixi/graphics@6.5.10)(@pixi/math@6.5.10)(@pixi/utils@6.5.10): - resolution: {integrity: sha512-o7+hUxUgCR0wlIQR+fdYYl/n+k/HYWPcqJhJpzm+p4YjMIivVrLf7XOut2wwFUDpUHvcJn85Nlj9dvf3PEQnHw==} - dependencies: - '@pixi/graphics-smooth': 0.0.22(@pixi/constants@6.5.10)(@pixi/core@6.5.10)(@pixi/display@6.5.10)(@pixi/graphics@6.5.10)(@pixi/math@6.5.10)(@pixi/utils@6.5.10) - '@types/jquery': 3.5.33 - '@types/simple-peer': 9.11.8 - handlebars: 4.7.7 - pixi-particles: 4.3.1(pixi.js@5.3.11) - pixi.js: 5.3.11 - socket.io-client: 4.3.2 - tinymce: 5.10.1 - transitivePeerDependencies: - - '@pixi/constants' - - '@pixi/core' - - '@pixi/display' - - '@pixi/graphics' - - '@pixi/math' - - '@pixi/utils' - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 - dev: true - - /@pixi/accessibility@5.3.11: - resolution: {integrity: sha512-/oSizd8/g6KUCeAlknMLJ9CRxBt+vWs6e2DrOctMoRupEHcmhICCjIyAp5GF6RZy9T9gNHDOU5p7vo7qEyVxgQ==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/app@5.3.11: - resolution: {integrity: sha512-ZWrOjGvVl+lK5OJQT3OqSnSRtU2XgQSe/ULg2uGsSWUqMkJews33JIGOjvk4tIsjm4ekSKiPZRMdYFHzPfgEJg==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - dev: true - - /@pixi/constants@5.3.11: - resolution: {integrity: sha512-KwutCRu8dRYn3956ygPJlvglHjJM99OS2Qhp4QYG8a4BsPcwfpInsHUtGHngtsTZbnx32pxCd3pg9nPiV8EuVA==} - dev: true - - /@pixi/constants@6.5.10: - resolution: {integrity: sha512-PUF2Y9YISRu5eVrVVHhHCWpc/KmxQTg3UH8rIUs8UI9dCK41/wsPd3pEahzf7H47v7x1HCohVZcFO3XQc1bUDw==} - dev: true - - /@pixi/core@5.3.11: - resolution: {integrity: sha512-U71OiC3rNt45/h8kaLGAQL4XsNh/ISoZtxVQNbtKTXlgjEAy1Q01Ht80yl0UJdiVxYQFlanCS/IG4++OkygioA==} - dependencies: - '@pixi/constants': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/runner': 5.3.11 - '@pixi/settings': 5.3.11 - '@pixi/ticker': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/core@6.5.10(@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): - resolution: {integrity: sha512-Gdzp5ENypyglvsh5Gv3teUZnZnmizo4xOsL+QqmWALdFlJXJwLJMVhKVThV/q/095XR6i4Ou54oshn+m4EkuFw==} - peerDependencies: - '@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 - dependencies: - '@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/constants@6.5.10) - '@pixi/ticker': 6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10) - '@pixi/utils': 6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10) - '@types/offscreencanvas': 2019.7.3 - dev: true - - /@pixi/display@5.3.11: - resolution: {integrity: sha512-rxUyB+RMJ7esEa11HdvzsularDGkYlRqpUn1ju9ZsRuB/Qo9JiVolywvWGSWxN/WnDGfrU2GjDpq9id10nwiag==} - dependencies: - '@pixi/math': 5.3.11 - '@pixi/settings': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/display@6.5.10(@pixi/constants@6.5.10)(@pixi/math@6.5.10)(@pixi/settings@6.5.10)(@pixi/utils@6.5.10): - resolution: {integrity: sha512-NxFdDDxlbH5fQkzGHraLGoTMucW9pVgXqQm13TSmkA3NWIi/SItHL4qT2SI8nmclT9Vid1VDEBCJFAbdeuQw1Q==} - peerDependencies: - '@pixi/constants': 6.5.10 - '@pixi/math': 6.5.10 - '@pixi/settings': 6.5.10 - '@pixi/utils': 6.5.10 - dependencies: - '@pixi/constants': 6.5.10 - '@pixi/math': 6.5.10 - '@pixi/settings': 6.5.10(@pixi/constants@6.5.10) - '@pixi/utils': 6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10) - dev: true - - /@pixi/extensions@6.5.10: - resolution: {integrity: sha512-EIUGza+E+sCy3dupuIjvRK/WyVyfSzHb5XsxRaxNrPwvG1iIUIqNqZ3owLYCo4h17fJWrj/yXVufNNtUKQccWQ==} - dev: true - - /@pixi/extract@5.3.11: - resolution: {integrity: sha512-YeBrpIO3E5HUgcdKEldCUqwwDNHm5OBe98YFcdLr5Z0+dQaHnxp9Dm4n75/NojoGb5guYdrV00x+gU2UPHsVdw==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/filter-alpha@5.3.11: - resolution: {integrity: sha512-HC4PbiEqDWSi3A715av7knFqD3knSXRxPJKG9mWat2CU9eCizSw+JxXp/okMU/fL4ewooiqQWVU2l1wXOHhVFw==} - dependencies: - '@pixi/core': 5.3.11 - dev: true - - /@pixi/filter-blur@5.3.11: - resolution: {integrity: sha512-iW5cOMEcDiJidOV95bUfhxdcvwM9JzCoWAd+92gAie8L+ElRSHpu1jxXbKHjo/QczQV1LulOlheyDaJNpaBCDg==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/settings': 5.3.11 - dev: true - - /@pixi/filter-color-matrix@5.3.11: - resolution: {integrity: sha512-u9NT4+N1I3XV9ygwsmF8/jIwCLqNCLeFOdM4f73kbw/UmakZZ6i6xjjJMc5YFUpC25qDr1TFlqgdGGGHAPl4ug==} - dependencies: - '@pixi/core': 5.3.11 - dev: true - - /@pixi/filter-displacement@5.3.11: - resolution: {integrity: sha512-CTIy7C/L9I1X3VNx4nMzQbMFvznsGk2viQh0dSo8r5NLgmaAdxhkGI0KUpNjLBz30278tzFfNuRe59K1y1kHuw==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/math': 5.3.11 - dev: true - - /@pixi/filter-fxaa@5.3.11: - resolution: {integrity: sha512-0ahjui5385e1vRvd7zCc0n5W8ULtNI1uVbDJHP9ueeiF25TKC0GqtZzntNwrQPoU46q8zXdnIGjzMpikbbAasg==} - dependencies: - '@pixi/core': 5.3.11 - dev: true - - /@pixi/filter-noise@5.3.11: - resolution: {integrity: sha512-98WC9Nd5u2F03Ned9T3vnbmO/YF1jLSioZ623z9wjqpd5DosZgRtYTSGxjVcXTSfpviIuiJpkyF+X097pbVprg==} - dependencies: - '@pixi/core': 5.3.11 - dev: true - - /@pixi/graphics-smooth@0.0.22(@pixi/constants@6.5.10)(@pixi/core@6.5.10)(@pixi/display@6.5.10)(@pixi/graphics@6.5.10)(@pixi/math@6.5.10)(@pixi/utils@6.5.10): - resolution: {integrity: sha512-qq2u+BJBIDBuuSTc2Xzm1D/8RiiKBdxnVDiMb7Go5v8achnV5ctC6m+rf8Mq0sWm66mbOqu1aq/9efT4A4sPrA==} - peerDependencies: - '@pixi/constants': ^6.0.4 - '@pixi/core': ^6.0.4 - '@pixi/display': ^6.0.4 - '@pixi/graphics': ^6.0.4 - '@pixi/math': ^6.0.4 - '@pixi/utils': ^6.0.4 - dependencies: - '@pixi/constants': 6.5.10 - '@pixi/core': 6.5.10(@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) - '@pixi/display': 6.5.10(@pixi/constants@6.5.10)(@pixi/math@6.5.10)(@pixi/settings@6.5.10)(@pixi/utils@6.5.10) - '@pixi/graphics': 6.5.10(@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) - '@pixi/math': 6.5.10 - '@pixi/utils': 6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10) - dev: true - - /@pixi/graphics@5.3.11: - resolution: {integrity: sha512-HLu53LV6mRlY0uFSIM2OrCuL7xqXzeJs5d2QfmUJfKJVVZ9sbHDS+6/N/f0tXzvkRPYhSKXvcNPsNn4HmlIE9w==} - dependencies: - '@pixi/constants': 5.3.11 - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/sprite': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/graphics@6.5.10(@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): - resolution: {integrity: sha512-KPHGJ910fi8bRQQ+VcTIgrK+bKIm8yAQaZKPqMtm14HzHPGcES6HkgeNY1sd7m8J4aS9btm5wOSyFu0p5IzTpA==} - peerDependencies: - '@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 - dependencies: - '@pixi/constants': 6.5.10 - '@pixi/core': 6.5.10(@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) - '@pixi/display': 6.5.10(@pixi/constants@6.5.10)(@pixi/math@6.5.10)(@pixi/settings@6.5.10)(@pixi/utils@6.5.10) - '@pixi/math': 6.5.10 - '@pixi/sprite': 6.5.10(@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) - '@pixi/utils': 6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10) - dev: true - - /@pixi/interaction@5.3.11: - resolution: {integrity: sha512-n2K99CYyBcrf8NPxpzmZ5IlJ9TEplsSZfJ/uzMNOEnTObKl4wAhxs51Nb58raH3Ouzwu14YHOpqYrBTEoT1yPA==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/ticker': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/loaders@5.3.11: - resolution: {integrity: sha512-1HAeb/NFXyhNhZWAbVkngsTPBGpjZEPhQflBTrKycRaub7XDSZ8F0fwPltpKKVRWNDT+HBgU/zDNE2fpjzqfYg==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/utils': 5.3.11 - resource-loader: 3.0.1 - dev: true - - /@pixi/math@5.3.11: - resolution: {integrity: sha512-GAupgFWVuOKxh8A322x8IctNgKi0/pLTJAXxmsLxcUw5PIQGgDw894HvzUriI+C0fsa9cEZHUbOCfyBKPQDLzw==} - dev: true - - /@pixi/math@6.5.10: - resolution: {integrity: sha512-fxeu7ykVbMGxGV2S3qRTupHToeo1hdWBm8ihyURn3BMqJZe2SkZEECPd5RyvIuuNUtjRnmhkZRnF3Jsz2S+L0g==} - dev: true - - /@pixi/mesh-extras@5.3.11: - resolution: {integrity: sha512-1GTCMMUW1xv/72x26cxRysblBXW0wU77TNgqtSIMZ1M6JbleObChklWTvwi9MzQO2vQ3S6Hvcsa5m5EiM2hSPQ==} - dependencies: - '@pixi/constants': 5.3.11 - '@pixi/core': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/mesh': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/mesh@5.3.11: - resolution: {integrity: sha512-KWKKksEr0YuUX1uz1FmpIa/Y37b/0pvFUS+87LoyYq0mRtGbKsTY5i3lBPG/taHwN7a2DQAX3JZpw6yhGKoGpA==} - dependencies: - '@pixi/constants': 5.3.11 - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/settings': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/mixin-cache-as-bitmap@5.3.11: - resolution: {integrity: sha512-uQUxatGTTD5zfQ0pWdjibVjT+xEEZJ/xZDZtm/GxC7HSHd4jgoJBcTXWVhbhzwpLPVTnD8+sMnRrGlhoKcpTpQ==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/settings': 5.3.11 - '@pixi/sprite': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/mixin-get-child-by-name@5.3.11: - resolution: {integrity: sha512-fWFVxWtMYcwJttrgDNmZ4CJrx316p8ToNliC2ILmJZW77me7I4GzJ57gSHQU1xFwdHoOYRC4fnlrZoK5qJ9lDw==} - dependencies: - '@pixi/display': 5.3.11 - dev: true - - /@pixi/mixin-get-global-position@5.3.11: - resolution: {integrity: sha512-wrS9i+UUodLM5XL2N0Y+XSKiqLRdJV3ltFUWG6+jPT5yoP0HsKtx3sFAzX526RwIYwRzRusbc/quxHfRA4tvgg==} - dependencies: - '@pixi/display': 5.3.11 - '@pixi/math': 5.3.11 - dev: true - - /@pixi/particles@5.3.11: - resolution: {integrity: sha512-+mkt/inWXtRrxQc07RZ29uNIDWV1oMsrRBVBIvHgpR92Kn8EjIDRgoSXNu0jiZ18gRKKCBhwsS4dCXGsZRQ/sA==} - dependencies: - '@pixi/constants': 5.3.11 - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/polyfill@5.3.11: - resolution: {integrity: sha512-yQOngcnn+2/L7n6L/g45hCnIDLWdnWmmcCY3UKJrOgbNX+JtLru1RR8AGLifkdsa0R5u48x584YQGqkTAChWVA==} - dependencies: - es6-promise-polyfill: 1.2.0 - object-assign: 4.1.1 - dev: true - - /@pixi/prepare@5.3.11: - resolution: {integrity: sha512-TvjGeg7xPKjv5NxbM5NXReno9yxUCw/N0HtDEtEFRVeBLN3u0Q/dZsXxL6gIvkHoS09NFW+7AwsYQLZrVbppjA==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - '@pixi/graphics': 5.3.11 - '@pixi/settings': 5.3.11 - '@pixi/text': 5.3.11 - '@pixi/ticker': 5.3.11 - dev: true - - /@pixi/runner@5.3.11: - resolution: {integrity: sha512-Mtb0rnSG+6KOIbr/48AtrILr8PZQepYwqYixVEXM6UHl+7+Z5NIx9fOByiicdjEKJvHIAYveu8yp2/L1vkF+qw==} - dev: true - - /@pixi/runner@6.5.10: - resolution: {integrity: sha512-4HiHp6diCmigJT/DSbnqQP62OfWKmZB7zPWMdV1AEdr4YT1QxzXAW1wHg7dkoEfyTHqZKl0tm/zcqKq/iH7tMA==} - dev: true - - /@pixi/settings@5.3.11: - resolution: {integrity: sha512-ny/rjSmP+64WqxwmoY17KsFplxpuWbiMQ5SNAgkpi36z6k+utIGT05nIIhyMx3AAGSY+6dRbKmLeKyqCj8q4zw==} - dependencies: - ismobilejs: 1.1.1 - dev: true - - /@pixi/settings@6.5.10(@pixi/constants@6.5.10): - resolution: {integrity: sha512-ypAS5L7pQ2Qb88yQK72bXtc7sD8OrtLWNXdZ/gnw5kwSWCFaOSoqhKqJCXrR5DQtN98+RQefwbEAmMvqobhFyw==} - peerDependencies: - '@pixi/constants': 6.5.10 - dependencies: - '@pixi/constants': 6.5.10 - dev: true - - /@pixi/sprite-animated@5.3.11: - resolution: {integrity: sha512-xU1b6H8nJ1l05h7cBGw2DGo4QdLj7xootstZUx2BrTVX5ZENn5mjAGVD0uRpk8yt7Q6Bj7M+PS7ktzAgBW/hmQ==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/sprite': 5.3.11 - '@pixi/ticker': 5.3.11 - dev: true - - /@pixi/sprite-tiling@5.3.11: - resolution: {integrity: sha512-KUiWsIumjrnp9QKGMe1BqtrV9Hxm91KoaiOlCBk/gw8753iKvuMmH+/Z0RnzeZylJ1sJsdonTWy/IaLi1jnd0g==} - dependencies: - '@pixi/constants': 5.3.11 - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/sprite': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/sprite@5.3.11: - resolution: {integrity: sha512-RM6Sp8kqzsBdX/hDAO25HZywe9VU4uhOronUOQ5Ve0zRe+trdBWQYfi7+5kAcvzqkp25Izc0C+e+4YCqe5OaHQ==} - dependencies: - '@pixi/constants': 5.3.11 - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/settings': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/sprite@6.5.10(@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): - resolution: {integrity: sha512-UiK+8LgM9XQ/SBDKjRgZ8WggdOSlFRXqiWjEZVmNkiyU8HvXeFzWPRhpc8RR1zDwAUhZWKtMhF8X/ba9m+z2lg==} - peerDependencies: - '@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 - dependencies: - '@pixi/constants': 6.5.10 - '@pixi/core': 6.5.10(@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) - '@pixi/display': 6.5.10(@pixi/constants@6.5.10)(@pixi/math@6.5.10)(@pixi/settings@6.5.10)(@pixi/utils@6.5.10) - '@pixi/math': 6.5.10 - '@pixi/settings': 6.5.10(@pixi/constants@6.5.10) - '@pixi/utils': 6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10) - dev: true - - /@pixi/spritesheet@5.3.11: - resolution: {integrity: sha512-Y9Wiwcz/YOuS1v73Ij9KWQakYBzZfldEy3H8T4GPLK+S19/sypntdkNtRZbmR2wWfhJ4axYEB2/Df86aOAU2qA==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/loaders': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/text-bitmap@5.3.11: - resolution: {integrity: sha512-Bjc/G4VHaPXc9HJsvyYOm5cNTHdqmX6AgzBAlCfltuMAlnveUgUPuX8D/MJHRRnoVSDHSmCBtnJgTc0y/nIeCw==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - '@pixi/loaders': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/mesh': 5.3.11 - '@pixi/settings': 5.3.11 - '@pixi/text': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/text@5.3.11: - resolution: {integrity: sha512-PmWvJv0wiKyyz3fahnxM19+m8IbF2vpDKIImqb5472WyxRGzKyVBW90xrADf5202tdKMk4b8hqvpof2XULr5PA==} - dependencies: - '@pixi/core': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/settings': 5.3.11 - '@pixi/sprite': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /@pixi/ticker@5.3.11: - resolution: {integrity: sha512-J1CChbSo1SQib1zL5f+FcFJZ6wN7LnWpztJVpKKYy3ZM/v4HSh48UnrGDKn5SLwSq4K7BxvZduwMQ8m4Paz1gQ==} - dependencies: - '@pixi/settings': 5.3.11 - dev: true - - /@pixi/ticker@6.5.10(@pixi/extensions@6.5.10)(@pixi/settings@6.5.10): - resolution: {integrity: sha512-UqX1XYtzqFSirmTOy8QAK4Ccg4KkIZztrBdRPKwFSOEiKAJoGDCSBmyQBo/9aYQKGObbNnrJ7Hxv3/ucg3/1GA==} - peerDependencies: - '@pixi/extensions': 6.5.10 - '@pixi/settings': 6.5.10 - dependencies: - '@pixi/extensions': 6.5.10 - '@pixi/settings': 6.5.10(@pixi/constants@6.5.10) - dev: true - - /@pixi/utils@5.3.11: - resolution: {integrity: sha512-25ZSCTrfV8da28IzvLnTK0BGWB4dHpq5P9IEgFymJvVLK7sAyT+RPz18ewRbBHgALHsszDpfC+qrHp3i+VZP0Q==} - dependencies: - '@pixi/constants': 5.3.11 - '@pixi/settings': 5.3.11 - earcut: 2.2.4 - eventemitter3: 3.1.2 - url: 0.11.4 - dev: true - - /@pixi/utils@6.5.10(@pixi/constants@6.5.10)(@pixi/settings@6.5.10): - resolution: {integrity: sha512-4f4qDMmAz9IoSAe08G2LAxUcEtG9jSdudfsMQT2MG+OpfToirboE6cNoO0KnLCvLzDVE/mfisiQ9uJbVA9Ssdw==} - peerDependencies: - '@pixi/constants': 6.5.10 - '@pixi/settings': 6.5.10 - dependencies: - '@pixi/constants': 6.5.10 - '@pixi/settings': 6.5.10(@pixi/constants@6.5.10) - '@types/earcut': 2.1.4 - earcut: 2.2.4 - eventemitter3: 3.1.2 - url: 0.11.4 - dev: true - - /@playwright/test@1.56.0: - resolution: {integrity: sha512-Tzh95Twig7hUwwNe381/K3PggZBZblKUe2wv25oIpzWLr6Z0m4KgV1ZVIjnR6GM9ANEqjZD7XsZEa6JL/7YEgg==} - engines: {node: '>=18'} - hasBin: true - dependencies: - playwright: 1.56.0 - dev: true - - /@seald-io/binary-search-tree@1.0.3: - resolution: {integrity: sha512-qv3jnwoakeax2razYaMsGI/luWdliBLHTdC6jU55hQt1hcFqzauH/HsBollQ7IR4ySTtYhT+xyHoijpA16C+tA==} - dev: true - - /@seald-io/nedb@4.1.2: - resolution: {integrity: sha512-bDr6TqjBVS2rDyYM9CPxAnotj5FuNL9NF8o7h7YyFXM7yruqT4ddr+PkSb2mJvvw991bqdftazkEo38gykvaww==} - dependencies: - '@seald-io/binary-search-tree': 1.0.3 - localforage: 1.10.0 - util: 0.12.5 - dev: true - - /@socket.io/component-emitter@3.0.0: - resolution: {integrity: sha512-2pTGuibAXJswAPJjaKisthqS/NOK5ypG4LYT6tEAV0S/mxW0zOIvYvGK0V8w8+SHxAm6vRMSjqSalFXeBAqs+Q==} - dev: true - - /@stylistic/eslint-plugin@2.13.0(eslint@9.37.0)(typescript@5.9.3): - resolution: {integrity: sha512-RnO1SaiCFHn666wNz2QfZEFxvmiNRqhzaMXHXxXXKt+MEP7aajlPxUSMIQpKAaJfverpovEYqjBOXDq6dDcaOQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.40.0' - dependencies: - '@typescript-eslint/utils': 8.46.1(eslint@9.37.0)(typescript@5.9.3) - eslint: 9.37.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - estraverse: 5.3.0 - picomatch: 4.0.3 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@types/earcut@2.1.4: - resolution: {integrity: sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==} - dev: true - - /@types/estree@1.0.8: - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - dev: true - - /@types/jquery@3.5.33: - resolution: {integrity: sha512-SeyVJXlCZpEki5F0ghuYe+L+PprQta6nRZqhONt9F13dWBtR/ftoaIbdRQ7cis7womE+X2LKhsDdDtkkDhJS6g==} - dependencies: - '@types/sizzle': 2.3.10 - dev: true - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true - - /@types/node@24.7.2: - resolution: {integrity: sha512-/NbVmcGTP+lj5oa4yiYxxeBjRivKQ5Ns1eSZeB99ExsEQ6rX5XYU1Zy/gGxY/ilqtD4Etx9mKyrPxZRetiahhA==} - dependencies: - undici-types: 7.14.0 - dev: true - - /@types/offscreencanvas@2019.7.3: - resolution: {integrity: sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==} - dev: true - - /@types/simple-peer@9.11.8: - resolution: {integrity: sha512-rvqefdp2rvIA6wiomMgKWd2UZNPe6LM2EV5AuY3CPQJF+8TbdrL5TjYdMf0VAjGczzlkH4l1NjDkihwbj3Xodw==} - dependencies: - '@types/node': 24.7.2 - dev: true - - /@types/sizzle@2.3.10: - resolution: {integrity: sha512-TC0dmN0K8YcWEAEfiPi5gJP14eJe30TTGjkvek3iM/1NdHHsdCA/Td6GvNndMOo/iSnIsZ4HuuhrYPDAmbxzww==} - dev: true - - /@typescript-eslint/project-service@8.46.1(typescript@5.9.3): - resolution: {integrity: sha512-FOIaFVMHzRskXr5J4Jp8lFVV0gz5ngv3RHmn+E4HYxSJ3DgDzU7fVI1/M7Ijh1zf6S7HIoaIOtln1H5y8V+9Zg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) - '@typescript-eslint/types': 8.46.1 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@8.46.1: - resolution: {integrity: sha512-weL9Gg3/5F0pVQKiF8eOXFZp8emqWzZsOJuWRUNtHT+UNV2xSJegmpCNQHy37aEQIbToTq7RHKhWvOsmbM680A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@typescript-eslint/types': 8.46.1 - '@typescript-eslint/visitor-keys': 8.46.1 - dev: true - - /@typescript-eslint/tsconfig-utils@8.46.1(typescript@5.9.3): - resolution: {integrity: sha512-X88+J/CwFvlJB+mK09VFqx5FE4H5cXD+H/Bdza2aEWkSb8hnWIQorNcscRl4IEo1Cz9VI/+/r/jnGWkbWPx54g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - dependencies: - typescript: 5.9.3 - dev: true - - /@typescript-eslint/types@8.46.1: - resolution: {integrity: sha512-C+soprGBHwWBdkDpbaRC4paGBrkIXxVlNohadL5o0kfhsXqOC6GYH2S/Obmig+I0HTDl8wMaRySwrfrXVP8/pQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - - /@typescript-eslint/typescript-estree@8.46.1(typescript@5.9.3): - resolution: {integrity: sha512-uIifjT4s8cQKFQ8ZBXXyoUODtRoAd7F7+G8MKmtzj17+1UbdzFl52AzRyZRyKqPHhgzvXunnSckVu36flGy8cg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - dependencies: - '@typescript-eslint/project-service': 8.46.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.1(typescript@5.9.3) - '@typescript-eslint/types': 8.46.1 - '@typescript-eslint/visitor-keys': 8.46.1 - debug: 4.4.3 - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@8.46.1(eslint@9.37.0)(typescript@5.9.3): - resolution: {integrity: sha512-vkYUy6LdZS7q1v/Gxb2Zs7zziuXN0wxqsetJdeZdRe/f5dwJFglmuvZBfTUivCtjH725C1jWCDfpadadD95EDQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) - '@typescript-eslint/scope-manager': 8.46.1 - '@typescript-eslint/types': 8.46.1 - '@typescript-eslint/typescript-estree': 8.46.1(typescript@5.9.3) - eslint: 9.37.0 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/visitor-keys@8.46.1: - resolution: {integrity: sha512-ptkmIf2iDkNUjdeu2bQqhFPV1m6qTnFFjg7PPDjxKWaMaP0Z6I9l30Jr3g5QqbZGdw8YdYvLp+XnqnWWZOg/NA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - '@typescript-eslint/types': 8.46.1 - eslint-visitor-keys: 4.2.1 - dev: true - - /abstract-level@1.0.4: - resolution: {integrity: sha512-eUP/6pbXBkMbXFdx4IH2fVgvB7M0JvR7/lIL33zcs0IBcwjdzSSl31TOJsaCzmKSSDF9h8QYSOJux4Nd4YJqFg==} - engines: {node: '>=12'} - dependencies: - buffer: 6.0.3 - catering: 2.1.1 - is-buffer: 2.0.5 - level-supports: 4.0.1 - level-transcoder: 1.0.1 - module-error: 1.0.2 - queue-microtask: 1.2.3 - dev: true - - /acorn-jsx@5.3.2(acorn@8.15.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.15.0 - dev: true - - /acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - dependencies: - possible-typed-array-names: 1.1.0 - dev: true - - /backo2@1.0.2: - resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true - - /brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} - dependencies: - balanced-match: 1.0.2 - dev: true - - /braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.1.1 - dev: true - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - - /call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - dev: true - - /call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - dev: true - - /call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /catering@2.1.1: - resolution: {integrity: sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==} - engines: {node: '>=6'} - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true - - /classic-level@1.4.1: - resolution: {integrity: sha512-qGx/KJl3bvtOHrGau2WklEZuXhS3zme+jf+fsu6Ej7W7IP/C49v7KNlWIsT1jZu0YnfzSIYDGcEWpCa1wKGWXQ==} - engines: {node: '>=12'} - requiresBuild: true - dependencies: - abstract-level: 1.0.4 - catering: 2.1.1 - module-error: 1.0.2 - napi-macros: 2.2.2 - node-gyp-build: 4.8.4 - dev: true - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /debug@4.4.3: - resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.3 - dev: true - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - dev: true - - /dotenv@17.2.3: - resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} - engines: {node: '>=12'} - dev: true - - /dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - dev: true - - /earcut@2.2.4: - resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==} - dev: true - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /engine.io-client@6.0.3: - resolution: {integrity: sha512-IH8ZhDIwiLv0d/wXVzmjfV9Y82hbJIDhCGSVUV8o1kcpDe2I6Y3bZA3ZbJy4Ls7k7IVmcy/qn4k9RKWFhUGf5w==} - dependencies: - '@socket.io/component-emitter': 3.0.0 - debug: 4.3.7 - engine.io-parser: 5.0.7 - has-cors: 1.1.0 - parseqs: 0.0.6 - parseuri: 0.0.6 - ws: 8.2.3 - xmlhttprequest-ssl: 2.0.0 - yeast: 0.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /engine.io-parser@5.0.7: - resolution: {integrity: sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==} - engines: {node: '>=10.0.0'} - dev: true - - /es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - dev: true - - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true - - /es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - dev: true - - /es6-promise-polyfill@1.2.0: - resolution: {integrity: sha512-HHb0vydCpoclpd0ySPkRXMmBw80MRt1wM4RBJBlXkux97K7gleabZdsR0gvE1nNPM9mgOZIBTzjjXiPxf4lIqQ==} - dev: true - - /escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true - - /eslint@9.37.0: - resolution: {integrity: sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.37.0) - '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.21.0 - '@eslint/config-helpers': 0.4.0 - '@eslint/core': 0.16.0 - '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.37.0 - '@eslint/plugin-kit': 0.4.0 - '@humanfs/node': 0.16.7 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - transitivePeerDependencies: - - supports-color - dev: true - - /esm@3.2.25: - resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} - engines: {node: '>=6'} - dev: true - - /espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 4.2.1 - dev: true - - /esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /eventemitter3@3.1.2: - resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - dependencies: - reusify: 1.1.0 - dev: true - - /file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} - dependencies: - flat-cache: 4.0.1 - dev: true - - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: true - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - dependencies: - flatted: 3.3.3 - keyv: 4.5.4 - dev: true - - /flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - dev: true - - /for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - dev: true - - /fsevents@2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /generator-function@2.0.1: - resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} - engines: {node: '>= 0.4'} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - dev: true - - /get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - dev: true - - /globals@15.15.0: - resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} - engines: {node: '>=18'} - dev: true - - /gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - dev: true - - /handlebars@4.7.7: - resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} - engines: {node: '>=0.4.7'} - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.3 - dev: true - - /has-cors@1.1.0: - resolution: {integrity: sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - dependencies: - es-define-property: 1.0.1 - dev: true - - /has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - dev: true - - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - dependencies: - has-symbols: 1.1.0 - dev: true - - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true - - /ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - dev: true - - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: true - - /import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - dev: true - - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: true - - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: true - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-generator-function@1.1.2: - resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - generator-function: 2.0.1 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: true - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: true - - /is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - dev: true - - /is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - dependencies: - which-typed-array: 1.1.19 - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true - - /ismobilejs@1.1.1: - resolution: {integrity: sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==} - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /level-supports@4.0.1: - resolution: {integrity: sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==} - engines: {node: '>=12'} - dev: true - - /level-transcoder@1.0.1: - resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} - engines: {node: '>=12'} - dependencies: - buffer: 6.0.3 - module-error: 1.0.2 - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /lie@3.1.1: - resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} - dependencies: - immediate: 3.0.6 - dev: true - - /localforage@1.10.0: - resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} - dependencies: - lie: 3.1.1 - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - dev: true - - /mini-signals@1.2.0: - resolution: {integrity: sha512-alffqMkGCjjTSwvYMVLx+7QeJ6sTuxbXqBkP21my4iWU5+QpTQAJt3h7htA1OKm9F3BpMM0vnu72QIoiJakrLA==} - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.12 - dev: true - - /minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.2 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true - - /mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - dev: true - - /module-error@1.0.2: - resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} - engines: {node: '>=10'} - dev: true - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: true - - /napi-macros@2.2.2: - resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /nedb-promises@6.2.3: - resolution: {integrity: sha512-enq0IjNyBz9Qy9W/QPCcLGh/QORGBjXbIeZeWvIjO3OMLyAvlKT3hiJubP2BKEiFniUlR3L01o18ktqgn5jxqA==} - dependencies: - '@seald-io/nedb': 4.1.2 - dev: true - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true - - /node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - dev: true - - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - dev: true - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-uri@1.0.16: - resolution: {integrity: sha512-WMX9ygt2zzbtd3UlChi8S2Uj/dZa0N9QaotTkyRD7v06c50dor4qEWrM5ZvHiiaZYpXal4otRS9hynwwX0DVoA==} - engines: {node: '>= 0.10'} - dev: true - - /parseqs@0.0.6: - resolution: {integrity: sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==} - dev: true - - /parseuri@0.0.6: - resolution: {integrity: sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==} - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: true - - /picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} - dev: true - - /pixi-particles@4.3.1(pixi.js@5.3.11): - resolution: {integrity: sha512-XSqDFgYwm/7FRCgP5I2Fc57d98qvb1ql/x4uTjdP4uXDUGgjdO8OW/2A0HVWS1CkOht/1x6dQzsM1oCJAUlaow==} - peerDependencies: - pixi.js: '>=4.0.0' - dependencies: - pixi.js: 5.3.11 - dev: true - - /pixi.js@5.3.11: - resolution: {integrity: sha512-/9td6IHDQqG0Po5lyQ5aKDzrnEVD1SvGourI4Nqp0mvNI0Cbm74tMHLjk1V5foqGPAS9pochENr6Y3ft/2cDiQ==} - dependencies: - '@pixi/accessibility': 5.3.11 - '@pixi/app': 5.3.11 - '@pixi/constants': 5.3.11 - '@pixi/core': 5.3.11 - '@pixi/display': 5.3.11 - '@pixi/extract': 5.3.11 - '@pixi/filter-alpha': 5.3.11 - '@pixi/filter-blur': 5.3.11 - '@pixi/filter-color-matrix': 5.3.11 - '@pixi/filter-displacement': 5.3.11 - '@pixi/filter-fxaa': 5.3.11 - '@pixi/filter-noise': 5.3.11 - '@pixi/graphics': 5.3.11 - '@pixi/interaction': 5.3.11 - '@pixi/loaders': 5.3.11 - '@pixi/math': 5.3.11 - '@pixi/mesh': 5.3.11 - '@pixi/mesh-extras': 5.3.11 - '@pixi/mixin-cache-as-bitmap': 5.3.11 - '@pixi/mixin-get-child-by-name': 5.3.11 - '@pixi/mixin-get-global-position': 5.3.11 - '@pixi/particles': 5.3.11 - '@pixi/polyfill': 5.3.11 - '@pixi/prepare': 5.3.11 - '@pixi/runner': 5.3.11 - '@pixi/settings': 5.3.11 - '@pixi/sprite': 5.3.11 - '@pixi/sprite-animated': 5.3.11 - '@pixi/sprite-tiling': 5.3.11 - '@pixi/spritesheet': 5.3.11 - '@pixi/text': 5.3.11 - '@pixi/text-bitmap': 5.3.11 - '@pixi/ticker': 5.3.11 - '@pixi/utils': 5.3.11 - dev: true - - /playwright-core@1.56.0: - resolution: {integrity: sha512-1SXl7pMfemAMSDn5rkPeZljxOCYAmQnYLBTExuh6E8USHXGSX3dx6lYZN/xPpTz1vimXmPA9CDnILvmJaB8aSQ==} - engines: {node: '>=18'} - hasBin: true - dev: true - - /playwright@1.56.0: - resolution: {integrity: sha512-X5Q1b8lOdWIE4KAoHpW3SE8HvUB+ZZsUoN64ZhjnN8dOb1UpujxBtENGiZFE+9F/yhzJwYa+ca3u43FeLbboHA==} - engines: {node: '>=18'} - hasBin: true - dependencies: - playwright-core: 1.56.0 - optionalDependencies: - fsevents: 2.3.2 - dev: true - - /possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /punycode@1.4.1: - resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} - dev: true - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true - - /qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.1.0 - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resource-loader@3.0.1: - resolution: {integrity: sha512-fBuCRbEHdLCI1eglzQhUv9Rrdcmqkydr1r6uHE2cYHvRBrcLXeSmbE/qI/urFt8rPr/IGxir3BUwM5kUK8XoyA==} - dependencies: - mini-signals: 1.2.0 - parse-uri: 1.0.16 - dev: true - - /reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - dev: true - - /semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} - hasBin: true - dev: true - - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - dev: true - - /side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - dev: true - - /side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 - dev: true - - /side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - dev: true - - /socket.io-client@4.3.2: - resolution: {integrity: sha512-2B9LqSunN60yV8F7S84CCEEcgbYNfrn7ejIInZtLZ7ppWtiX8rGZAjvdCvbnC8bqo/9RlCNOUsORLyskxSFP1g==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.0.0 - backo2: 1.0.2 - debug: 4.3.7 - engine.io-client: 6.0.3 - parseuri: 0.0.6 - socket.io-parser: 4.1.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /socket.io-parser@4.1.2: - resolution: {integrity: sha512-j3kk71QLJuyQ/hh5F/L2t1goqzdTL0gvDzuhTuNSwihfuFUrcSji0qFZmJJPtG6Rmug153eOPsUizeirf1IIog==} - engines: {node: '>=10.0.0'} - dependencies: - '@socket.io/component-emitter': 3.0.0 - debug: 4.3.7 - transitivePeerDependencies: - - supports-color - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /tinymce@5.10.1: - resolution: {integrity: sha512-aIsFTYiuESpoYkCgkoojpVtPwrSvYBxp4mMEGsj20CnUruLCWosywkbYHDII+j7KlQZZn3p+xK89f5gT3QyuGw==} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: true - - /ts-api-utils@2.1.0(typescript@5.9.3): - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - dependencies: - typescript: 5.9.3 - dev: true - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /uglify-js@3.19.3: - resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - - /undici-types@7.14.0: - resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - - /url@0.11.4: - resolution: {integrity: sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==} - engines: {node: '>= 0.4'} - dependencies: - punycode: 1.4.1 - qs: 6.14.0 - dev: true - - /util@0.12.5: - resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - dependencies: - inherits: 2.0.4 - is-arguments: 1.2.0 - is-generator-function: 1.1.2 - is-typed-array: 1.1.15 - which-typed-array: 1.1.19 - dev: true - - /which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - dev: true - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: true - - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true - - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - dev: true - - /ws@8.2.3: - resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true - - /xmlhttprequest-ssl@2.0.0: - resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} - engines: {node: '>=0.4.0'} - dev: true - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - dev: true - - /yeast@0.1.2: - resolution: {integrity: sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==} - dev: true - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true From fd10ba402db515e6c1f3b8cb7c93a86af46b5f76 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 18 Nov 2025 23:54:23 -0700 Subject: [PATCH 084/105] Remove github step since we aren't releasing to Github at all --- .forgejo/workflows/publish-release.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.forgejo/workflows/publish-release.yaml b/.forgejo/workflows/publish-release.yaml index 8d719c3..63fa76f 100644 --- a/.forgejo/workflows/publish-release.yaml +++ b/.forgejo/workflows/publish-release.yaml @@ -2,11 +2,6 @@ on: release: types: [published] jobs: - undraft-on-github: - runs-on: docker - steps: - - name: copy release description to github - - name: publish github release release-to-foundry: runs-on: docker steps: From c6598ac5fa04125bb711ff8ea60554a752092f7e Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 19 Nov 2025 19:19:38 -0700 Subject: [PATCH 085/105] Add the unlisted releases to the README for manual installation --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index 8d4cb08..4fca88e 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,17 @@ This is an intentionally bare-bones system that features a text-only character sheet, allowing the playing of games that may not otherwise have a Foundry system implementation. + +## Unlisted Releases +Some of the versions of Text-Based Actors are not available in the [Releases list](https://git.varify.ca/Foundry/taf/releases), +these versions are installable manually by using the appropriate manifest link +below: + +| Version | Manifest URL +| ------- | ------------ +| v2.2.1 | https://cdn.varify.ca/Foundry/taf/v2.2.1/system.json +| v2.2.0 | https://cdn.varify.ca/Foundry/taf/v2.2.0/system.json +| v2.1.0 | https://cdn.varify.ca/Foundry/taf/v2.1.0/system.json +| v2.0.0 | https://cdn.varify.ca/Foundry/taf/v2.0.0/system.json +| v1.1.0 | https://cdn.varify.ca/Foundry/taf/v1.1.0/system.json +| v1.0.0 | https://cdn.varify.ca/Foundry/taf/v1.0.0/system.json From 1bf6cbbd454f5122d7dad632cb14b281ed7d98e9 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 19 Nov 2025 19:36:42 -0700 Subject: [PATCH 086/105] Remove github workflow entirely --- .github/workflows/draft-release.yaml | 55 ---------------------------- 1 file changed, 55 deletions(-) delete mode 100644 .github/workflows/draft-release.yaml diff --git a/.github/workflows/draft-release.yaml b/.github/workflows/draft-release.yaml deleted file mode 100644 index ad2b271..0000000 --- a/.github/workflows/draft-release.yaml +++ /dev/null @@ -1,55 +0,0 @@ -name: Create Draft Release -on: [workflow_dispatch] -jobs: - draft: - runs-on: ubuntu-latest - steps: - # Checkout the repository - - uses: actions/checkout@v4 - - # Install node and NPM - - uses: actions/setup-node@v4 - with: - node-version: "20" - - # Install required packages - - run: npm install - - - name: Reading the system.json for the version - id: "version" - run: cat system.json | echo version=`jq -r ".version"` >> "$GITHUB_OUTPUT" - - # Check that tag doesn't exist - - uses: mukunku/tag-exists-action@v1.5.0 - id: check-tag - with: - tag: "v${{ steps.version.outputs.version }}" - - - name: "Ensure that the tag doesn't exist" - if: ${{ steps.check-tag.outputs.exists == 'true' }} - run: exit 1 - - # Compile the stuff that needs to be compiled - - run: npm run build - - run: node scripts/buildCompendia.mjs - - - name: Update the manifest with the relevant properties - id: manifest-update - uses: microsoft/variable-substitution@v1 - with: - files: "system.json" - env: - download: "https://github.com/${{ github.repository }}/releases/download/v${{ steps.version.outputs.version }}/release.zip" - - - name: Create the zip - run: zip -r release.zip langs module styles templates system.json README.md assets - - - name: Create the draft release - uses: ncipollo/release-action@v1 - with: - tag: "v${{ steps.version.outputs.version }}" - commit: ${{ github.ref }} - draft: true - body: - generateReleaseNotes: true - artifacts: "release.zip,system.json" From bb095a9b4eec2c88ed90868667e6a4ca4a456f94 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 19 Nov 2025 21:02:49 -0700 Subject: [PATCH 087/105] Get user re-querying working when they disconnect and improve the user status --- module/apps/QueryStatus.mjs | 22 +++++-- module/hooks/userConnected.mjs | 5 +- module/utils/QueryManager.mjs | 101 ++++++++++++++++++++++++++++---- styles/Apps/QueryStatus.css | 9 ++- templates/QueryStatus/users.hbs | 47 ++++++++++----- 5 files changed, 148 insertions(+), 36 deletions(-) diff --git a/module/apps/QueryStatus.mjs b/module/apps/QueryStatus.mjs index e5ce09b..cc75d95 100644 --- a/module/apps/QueryStatus.mjs +++ b/module/apps/QueryStatus.mjs @@ -18,6 +18,9 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { window: { resizable: true, }, + actions: { + promptUser: this.promptUser, + }, }; static PARTS = { @@ -53,10 +56,6 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { this._prepareUsers(ctx); break; }; - case `controls`: { - this._prepareControls(ctx); - break; - }; }; return ctx; @@ -74,14 +73,25 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { name: user.name, active: user.active, answers: query.responses[userID] ?? null, + status: query.status[userID], }); }; ctx.users = users; }; - - async _prepareControls(ctx) {}; // #endregion Lifecycle // #region Actions + /** @this {QueryStatus} */ + static async promptUser($e, element) { + const userID = element.closest(`[data-user-id]`)?.dataset.userId; + if (!userID) { return }; + QueryManager.requery(this.requestID, [ userID ]); + }; + + /** @this {QueryStatus} */ + static async cancelRequest() {}; + + /** @this {QueryStatus} */ + static async finishEarly() {}; // #endregion Actions }; diff --git a/module/hooks/userConnected.mjs b/module/hooks/userConnected.mjs index 750417e..ed23837 100644 --- a/module/hooks/userConnected.mjs +++ b/module/hooks/userConnected.mjs @@ -1,5 +1,6 @@ import { QueryManager } from "../utils/QueryManager.mjs"; -Hooks.on(`userConnected`, (user) => { - QueryManager.userActivity(user.id); +Hooks.on(`userConnected`, (user, connected) => { + if (user.isSelf) { return }; + QueryManager.userActivity(user.id, connected); }); diff --git a/module/utils/QueryManager.mjs b/module/utils/QueryManager.mjs index 9adce82..9a4f892 100644 --- a/module/utils/QueryManager.mjs +++ b/module/utils/QueryManager.mjs @@ -1,3 +1,9 @@ +/** + * An object containing information about the current status for all users involved + * with the data request. + * @typedef {Record} UserStatus + */ + /** * @typedef QueryData * @property {string[]} users @@ -5,6 +11,9 @@ * @property {Record} responses * @property {(() => Promise)|null} onSubmit * @property {QueryStatus|null} app + * @property {UserStatus} status + * @property {object} request The data used to form the initial request + * @property {object} config The data used to create the initial config */ import { filePath } from "../consts.mjs"; @@ -29,6 +38,7 @@ export class QueryManager { return this.#queries.has(requestID); }; + /** @returns {Omit} */ static get(requestID) { if (!this.#queries.has(requestID)) { return null }; const query = this.#queries.get(requestID); @@ -36,6 +46,7 @@ export class QueryManager { delete cloned.onSubmit; delete cloned.resolve; + delete cloned.app; return foundry.utils.deepFreeze(cloned); }; @@ -68,15 +79,29 @@ export class QueryManager { return null; }; + users ??= game.users + .filter(u => u.id !== game.user.id) + .map(u => u.id); + const promise = new Promise((resolve) => { + + /** @type {UserStatus} */ + const status = {}; + for (const user of users) { + status[user] = game.users.get(user).active ? `waiting` : `unprompted`; + }; + this.#queries.set( request.id, { - users: users ?? game.users.filter(u => u.id !== game.user.id).map(u => u.id), - resolve, + users, + request, + config, responses: {}, + resolve, onSubmit, app: null, + status, }, ); }); @@ -90,15 +115,62 @@ export class QueryManager { return promise; }; + static async requery(requestID, users) { + const query = this.#queries.get(requestID); + if (!query) { return }; + + game.socket.emit(`system.taf`, { + event: `query.prompt`, + payload: { + id: requestID, + users, + request: query.request, + config: query.config, + }, + }); + + for (const user of users) { + query.status[user] = `waiting`; + }; + query.app?.render({ parts: [ `users` ] }); + }; + static async addResponse(requestID, userID, answers) { const data = this.#queries.get(requestID); data.responses[userID] = answers; + data.status[userID] = `finished`; await data.onSubmit?.(userID, answers); + this.maybeResolve(requestID); + }; - // Validate for responses from everyone - if (data.users.length === Object.keys(data.responses).length) { - data.app.close(); + static async maybeResolve(requestID) { + const data = this.#queries.get(requestID); + + // Determine how many users are considered "finished" + let finishedUserCount = 0; + for (const user of data.users) { + const hasApp = data.app != null; + + switch (data.status[user]) { + case `finished`: { + finishedUserCount++; + break; + }; + case `cancelled`: + case `disconnected`: + case `unprompted`: { + if (!hasApp) { + finishedUserCount++; + }; + break; + }; + }; + }; + + // Ensure that we have a finished response from everyone prompted + if (data.users.length === finishedUserCount) { + data.app?.close(); data.resolve(data.responses); } else { data.app?.render({ parts: [ `users` ] }); @@ -137,14 +209,21 @@ export class QueryManager { query.app = app; }; - static async userActivity(userID) { - for (const query of this.#queries.values()) { + static async userActivity(userID, connected) { + for (const [id, query] of this.#queries.entries()) { if (query.users.includes(userID)) { - query.app.render({ parts: [ `users` ] }); - // TODO: if the user is connecting, we want to open - // the ask modal on their browser so that they can - // actually fill in the data + // Update the user's status to allow for the app to re-prompt them + if (query.status[userID] !== `finished`) { + if (connected) { + query.status[userID] = `unprompted`; + } else { + query.status[userID] = `disconnected`; + }; + this.maybeResolve(id); + }; + + query.app?.render({ parts: [ `users` ] }); }; }; }; diff --git a/styles/Apps/QueryStatus.css b/styles/Apps/QueryStatus.css index fbbc60e..5532505 100644 --- a/styles/Apps/QueryStatus.css +++ b/styles/Apps/QueryStatus.css @@ -9,12 +9,17 @@ li { display: flex; - flex-direction: row; - align-items: center; + flex-direction: column; margin: 0; border: 1px solid yellowgreen; border-radius: 4px; padding: 4px 8px; + + > .user-summary { + display: flex; + flex-direction: row; + align-items: center; + } } } } diff --git a/templates/QueryStatus/users.hbs b/templates/QueryStatus/users.hbs index 640bfdd..4ade68d 100644 --- a/templates/QueryStatus/users.hbs +++ b/templates/QueryStatus/users.hbs @@ -1,30 +1,47 @@
        {{#each users as | user |}} -
      • -
        - {{ user.name }} +
      • +
        +
        + {{ user.name }} +
        + {{#if (eq user.status "cancelled")}} + Cancelled by User + {{else if (eq user.status "waiting")}} + + {{else if (eq user.status "disconnected")}} + + {{else if (eq user.status "unprompted")}} + + {{/if}}
        - {{#if user.answers}} + {{#if (eq user.status "finished")}}
        {{#each user.answers as | answer |}} - {{ @key }} + + {{ @key }} + {{ answer }} {{/each}}
        - {{else if user.active}} - - {{else}} - {{/if}}
      • {{/each}} From df0c69c73123ab934599d907d734393cf39c8380 Mon Sep 17 00:00:00 2001 From: Oliver Date: Wed, 19 Nov 2025 21:18:42 -0700 Subject: [PATCH 088/105] Update the way the QueryManager exports are structured to be more esm-y rather than Java-y --- module/apps/QueryStatus.mjs | 6 +- module/hooks/userConnected.mjs | 4 +- module/sockets/submitRequest.mjs | 6 +- module/utils/QueryManager.mjs | 348 ++++++++++++++++--------------- 4 files changed, 187 insertions(+), 177 deletions(-) diff --git a/module/apps/QueryStatus.mjs b/module/apps/QueryStatus.mjs index cc75d95..3715f60 100644 --- a/module/apps/QueryStatus.mjs +++ b/module/apps/QueryStatus.mjs @@ -1,6 +1,6 @@ import { __ID__, filePath } from "../consts.mjs"; +import { get as getQuery, requery } from "../utils/QueryManager.mjs"; import { Logger } from "../utils/Logger.mjs"; -import { QueryManager } from "../utils/QueryManager.mjs"; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -62,7 +62,7 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { }; async _prepareUsers(ctx) { - const query = QueryManager.get(this.requestID); + const query = getQuery(this.requestID); if (!query) { return }; const users = []; @@ -85,7 +85,7 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { static async promptUser($e, element) { const userID = element.closest(`[data-user-id]`)?.dataset.userId; if (!userID) { return }; - QueryManager.requery(this.requestID, [ userID ]); + requery(this.requestID, [ userID ]); }; /** @this {QueryStatus} */ diff --git a/module/hooks/userConnected.mjs b/module/hooks/userConnected.mjs index ed23837..ed50f34 100644 --- a/module/hooks/userConnected.mjs +++ b/module/hooks/userConnected.mjs @@ -1,6 +1,6 @@ -import { QueryManager } from "../utils/QueryManager.mjs"; +import { userActivity } from "../utils/QueryManager.mjs"; Hooks.on(`userConnected`, (user, connected) => { if (user.isSelf) { return }; - QueryManager.userActivity(user.id, connected); + userActivity(user.id, connected); }); diff --git a/module/sockets/submitRequest.mjs b/module/sockets/submitRequest.mjs index 91dfbc3..1d4ef0c 100644 --- a/module/sockets/submitRequest.mjs +++ b/module/sockets/submitRequest.mjs @@ -1,4 +1,4 @@ -import { QueryManager } from "../utils/QueryManager.mjs"; +import { addResponse, has as hasQuery } from "../utils/QueryManager.mjs"; export function submitRequest(payload, user) { const { @@ -17,6 +17,6 @@ export function submitRequest(payload, user) { return; }; - if (!QueryManager.has(id)) { return }; - QueryManager.addResponse(id, user.id, answers); + if (!hasQuery(id)) { return }; + addResponse(id, user.id, answers); }; diff --git a/module/utils/QueryManager.mjs b/module/utils/QueryManager.mjs index 9a4f892..4d3fb94 100644 --- a/module/utils/QueryManager.mjs +++ b/module/utils/QueryManager.mjs @@ -20,211 +20,221 @@ import { filePath } from "../consts.mjs"; import { Logger } from "./Logger.mjs"; import { QueryStatus } from "../apps/QueryStatus.mjs"; +/** @type {Map} */ +const queries = new Map(); + +/** @type {Map} */ +const promises = new Map(); + async function sendBasicNotification(userID, answers) { const content = await foundry.applications.handlebars.renderTemplate( filePath(`templates/query-response.hbs`), { answers }, ); - QueryManager.notify(userID, content, { includeGM: false }); + await notify(userID, content, { includeGM: false }); }; -export class QueryManager { - /** @type {Map} */ - static #queries = new Map(); - static #promises = new Map(); +export function has(requestID) { + return queries.has(requestID); +}; - static has(requestID) { - return this.#queries.has(requestID); +/** @returns {Omit} */ +export function get(requestID) { + if (!queries.has(requestID)) { return null }; + const query = queries.get(requestID); + const cloned = foundry.utils.deepClone(query); + + delete cloned.onSubmit; + delete cloned.resolve; + delete cloned.app; + + return foundry.utils.deepFreeze(cloned); +}; + +export async function query( + request, + { + onSubmit = sendBasicNotification, + users = null, + showStatusApp = true, + ...config + } = {}, +) { + if (!request.id) { + ui.notifications.error(game.i18n.localize(`taf.notifs.error.missing-id`)); + return; }; - /** @returns {Omit} */ - static get(requestID) { - if (!this.#queries.has(requestID)) { return null }; - const query = this.#queries.get(requestID); - const cloned = foundry.utils.deepClone(query); + game.socket.emit(`system.taf`, { + event: `query.prompt`, + payload: { + id: request.id, + users, + request, + config, + }, + }); - delete cloned.onSubmit; - delete cloned.resolve; - delete cloned.app; - - return foundry.utils.deepFreeze(cloned); + if (promises.has(request.id)) { + return null; }; - static async query( - request, - { - onSubmit = sendBasicNotification, - users = null, - showStatusApp = true, - ...config - } = {}, - ) { - if (!request.id) { - ui.notifications.error(game.i18n.localize(`taf.notifs.error.missing-id`)); - return; + users ??= game.users + .filter(u => u.id !== game.user.id) + .map(u => u.id); + + const promise = new Promise((resolve) => { + + /** @type {UserStatus} */ + const status = {}; + for (const user of users) { + status[user] = game.users.get(user).active ? `waiting` : `unprompted`; }; - game.socket.emit(`system.taf`, { - event: `query.prompt`, - payload: { - id: request.id, + queries.set( + request.id, + { users, request, config, + responses: {}, + resolve, + onSubmit, + app: null, + status, }, - }); + ); + }); - if (this.#promises.has(request.id)) { - return null; - }; - - users ??= game.users - .filter(u => u.id !== game.user.id) - .map(u => u.id); - - const promise = new Promise((resolve) => { - - /** @type {UserStatus} */ - const status = {}; - for (const user of users) { - status[user] = game.users.get(user).active ? `waiting` : `unprompted`; - }; - - this.#queries.set( - request.id, - { - users, - request, - config, - responses: {}, - resolve, - onSubmit, - app: null, - status, - }, - ); - }); - - if (showStatusApp) { - const app = new QueryStatus({ requestID: request.id }); - app.render({ force: true }); - this.#queries.get(request.id).app = app; - }; - - return promise; + if (showStatusApp) { + const app = new QueryStatus({ requestID: request.id }); + app.render({ force: true }); + queries.get(request.id).app = app; }; - static async requery(requestID, users) { - const query = this.#queries.get(requestID); - if (!query) { return }; + return promise; +}; - game.socket.emit(`system.taf`, { - event: `query.prompt`, - payload: { - id: requestID, - users, - request: query.request, - config: query.config, - }, - }); +export async function requery(requestID, users) { + const query = queries.get(requestID); + if (!query) { return }; - for (const user of users) { - query.status[user] = `waiting`; + game.socket.emit(`system.taf`, { + event: `query.prompt`, + payload: { + id: requestID, + users, + request: query.request, + config: query.config, + }, + }); + + for (const user of users) { + query.status[user] = `waiting`; + }; + query.app?.render({ parts: [ `users` ] }); +}; + +export async function addResponse(requestID, userID, answers) { + const data = queries.get(requestID); + data.responses[userID] = answers; + data.status[userID] = `finished`; + + await data.onSubmit?.(userID, answers); + await maybeResolve(requestID); +}; + +async function maybeResolve(requestID) { + const query = queries.get(requestID); + + // Determine how many users are considered "finished" + let finishedUserCount = 0; + for (const user of query.users) { + const hasApp = query.app != null; + + switch (query.status[user]) { + case `finished`: { + finishedUserCount++; + break; + }; + case `cancelled`: + case `disconnected`: + case `unprompted`: { + if (!hasApp) { + finishedUserCount++; + }; + break; + }; }; + }; + + // Ensure that we have a finished response from everyone prompted + if (query.users.length === finishedUserCount) { + query.app?.close(); + query.resolve(query.responses); + } else { query.app?.render({ parts: [ `users` ] }); }; +}; - static async addResponse(requestID, userID, answers) { - const data = this.#queries.get(requestID); - data.responses[userID] = answers; - data.status[userID] = `finished`; +export async function notify(userID, content, { includeGM = false } = {}) { + game.socket.emit(`system.taf`, { + event: `query.notify`, + payload: { + userID, + content, + includeGM, + }, + }); +}; - await data.onSubmit?.(userID, answers); - this.maybeResolve(requestID); +export async function cancel(requestID) { + // prevent cancelling other people's queries + if (!queries.has(requestID)) { return }; + + game.socket.emit(`system.taf`, { + event: `query.cancel`, + payload: { id: requestID }, + }); +}; + +export async function setApplication(requestID, app) { + if (!queries.has(requestID)) { return }; + if (!(app instanceof QueryStatus)) { return }; + const query = queries.get(requestID); + if (query.app) { + Logger.error(`Cannot set an application for a query that has one already`); + return; }; + query.app = app; +}; - static async maybeResolve(requestID) { - const data = this.#queries.get(requestID); +export async function userActivity(userID, connected) { + for (const [id, query] of queries.entries()) { + if (query.users.includes(userID)) { - // Determine how many users are considered "finished" - let finishedUserCount = 0; - for (const user of data.users) { - const hasApp = data.app != null; - - switch (data.status[user]) { - case `finished`: { - finishedUserCount++; - break; - }; - case `cancelled`: - case `disconnected`: - case `unprompted`: { - if (!hasApp) { - finishedUserCount++; - }; - break; + // Update the user's status to allow for the app to re-prompt them + if (query.status[userID] !== `finished`) { + if (connected) { + query.status[userID] = `unprompted`; + } else { + query.status[userID] = `disconnected`; }; + maybeResolve(id); }; - }; - // Ensure that we have a finished response from everyone prompted - if (data.users.length === finishedUserCount) { - data.app?.close(); - data.resolve(data.responses); - } else { - data.app?.render({ parts: [ `users` ] }); - }; - }; - - static async notify(userID, content, { includeGM = false } = {}) { - game.socket.emit(`system.taf`, { - event: `query.notify`, - payload: { - userID, - content, - includeGM, - }, - }); - } - - static async cancel(requestID) { - // prevent cancelling other people's queries - if (!this.#queries.has(requestID)) { return }; - - game.socket.emit(`system.taf`, { - event: `query.cancel`, - payload: { id: requestID }, - }); - }; - - static async setApplication(requestID, app) { - if (!this.#queries.has(requestID)) { return }; - if (!(app instanceof QueryStatus)) { return }; - const query = this.#queries.get(requestID); - if (query.app) { - Logger.error(`Cannot set an application for a query that has one already`); - return; - }; - query.app = app; - }; - - static async userActivity(userID, connected) { - for (const [id, query] of this.#queries.entries()) { - if (query.users.includes(userID)) { - - // Update the user's status to allow for the app to re-prompt them - if (query.status[userID] !== `finished`) { - if (connected) { - query.status[userID] = `unprompted`; - } else { - query.status[userID] = `disconnected`; - }; - this.maybeResolve(id); - }; - - query.app?.render({ parts: [ `users` ] }); - }; + query.app?.render({ parts: [ `users` ] }); }; }; }; + +export const QueryManager = { + has, get, + query, requery, + addResponse, + notify, + cancel, + setApplication, + userActivity, +}; From 860c8b619ac08be323ac0c812ee1108ae3f142c0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 20 Nov 2025 17:11:31 -0700 Subject: [PATCH 089/105] Make requestID readonly on the application --- module/apps/QueryStatus.mjs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/module/apps/QueryStatus.mjs b/module/apps/QueryStatus.mjs index 3715f60..6e62400 100644 --- a/module/apps/QueryStatus.mjs +++ b/module/apps/QueryStatus.mjs @@ -34,6 +34,9 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { // #endregion Options // #region Instance + /** @type {string} */ + #requestID; + constructor({ requestID, ...opts @@ -43,7 +46,11 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { return null; }; super(opts); - this.requestID = requestID; + this.#requestID = requestID; + }; + + get requestID() { + return this.#requestID; }; // #endregion Instance @@ -62,7 +69,7 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { }; async _prepareUsers(ctx) { - const query = getQuery(this.requestID); + const query = getQuery(this.#requestID); if (!query) { return }; const users = []; @@ -85,7 +92,7 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { static async promptUser($e, element) { const userID = element.closest(`[data-user-id]`)?.dataset.userId; if (!userID) { return }; - requery(this.requestID, [ userID ]); + requery(this.#requestID, [ userID ]); }; /** @this {QueryStatus} */ From d60448640f6ba7314d5c0c047ad227675a2f87ec Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 20 Nov 2025 17:12:03 -0700 Subject: [PATCH 090/105] Add methods to handle the finishing and cancellation of requests to the API --- module/utils/QueryManager.mjs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/module/utils/QueryManager.mjs b/module/utils/QueryManager.mjs index 4d3fb94..d6ce677 100644 --- a/module/utils/QueryManager.mjs +++ b/module/utils/QueryManager.mjs @@ -173,6 +173,8 @@ async function maybeResolve(requestID) { if (query.users.length === finishedUserCount) { query.app?.close(); query.resolve(query.responses); + queries.delete(requestID); + promises.delete(requestID); } else { query.app?.render({ parts: [ `users` ] }); }; @@ -189,10 +191,30 @@ export async function notify(userID, content, { includeGM = false } = {}) { }); }; +export async function finish(requestID) { + // prevent finishing other people's queries + if (!queries.has(requestID)) { return }; + + const query = queries.get(requestID); + query.resolve(query.responses); + queries.delete(requestID); + promises.delete(requestID); + + game.socket.emit(`system.taf`, { + event: `query.cancel`, + payload: { id: requestID }, + }); +}; + export async function cancel(requestID) { // prevent cancelling other people's queries if (!queries.has(requestID)) { return }; + const query = queries.get(requestID); + query.resolve(null); + queries.delete(requestID); + promises.delete(requestID); + game.socket.emit(`system.taf`, { event: `query.cancel`, payload: { id: requestID }, @@ -234,7 +256,7 @@ export const QueryManager = { query, requery, addResponse, notify, - cancel, + finish, cancel, setApplication, userActivity, }; From 6a2cc1170d87558ef2dac06e75a5d291e1baa339 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 20 Nov 2025 17:12:55 -0700 Subject: [PATCH 091/105] Add actions for finishing early and cancelling the request entirely --- module/apps/QueryStatus.mjs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/module/apps/QueryStatus.mjs b/module/apps/QueryStatus.mjs index 6e62400..64b61a9 100644 --- a/module/apps/QueryStatus.mjs +++ b/module/apps/QueryStatus.mjs @@ -1,5 +1,5 @@ import { __ID__, filePath } from "../consts.mjs"; -import { get as getQuery, requery } from "../utils/QueryManager.mjs"; +import { cancel, finish, get as getQuery, requery } from "../utils/QueryManager.mjs"; import { Logger } from "../utils/Logger.mjs"; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api; @@ -20,6 +20,8 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { }, actions: { promptUser: this.promptUser, + finishEarly: this.finishEarly, + cancelRequest: this.cancelRequest, }, }; @@ -96,9 +98,13 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { }; /** @this {QueryStatus} */ - static async cancelRequest() {}; + static async cancelRequest() { + cancel(this.#requestID); + }; /** @this {QueryStatus} */ - static async finishEarly() {}; + static async finishEarly() { + finish(this.#requestID); + }; // #endregion Actions }; From c113c326c66eeba6f93eb602e562973e8c1621a0 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 20 Nov 2025 22:14:43 -0700 Subject: [PATCH 092/105] Move the query event handlers into a subfolder and name them in a consistent way --- module/sockets/_index.mjs | 16 ++++++------- module/sockets/cancelRequest.mjs | 1 - module/sockets/createNotif.mjs | 19 --------------- module/sockets/query/notify.mjs | 24 +++++++++++++++++++ .../{dataRequest.mjs => query/prompt.mjs} | 6 +++-- .../{submitRequest.mjs => query/submit.mjs} | 4 ++-- 6 files changed, 38 insertions(+), 32 deletions(-) delete mode 100644 module/sockets/cancelRequest.mjs delete mode 100644 module/sockets/createNotif.mjs create mode 100644 module/sockets/query/notify.mjs rename module/sockets/{dataRequest.mjs => query/prompt.mjs} (83%) rename module/sockets/{submitRequest.mjs => query/submit.mjs} (72%) diff --git a/module/sockets/_index.mjs b/module/sockets/_index.mjs index a133c06..f824c9e 100644 --- a/module/sockets/_index.mjs +++ b/module/sockets/_index.mjs @@ -1,15 +1,15 @@ -import { cancelRequest } from "./cancelRequest.mjs"; -import { createNotif } from "./createNotif.mjs"; -import { dataRequest } from "./dataRequest.mjs"; import { Logger } from "../utils/Logger.mjs"; -import { submitRequest } from "./submitRequest.mjs"; +import { queryCancel } from "./query/cancel.mjs"; +import { queryNotify } from "./query/notify.mjs"; +import { queryPrompt } from "./query/prompt.mjs"; +import { querySubmit } from "./query/submit.mjs"; const events = { // Data Request sockets - "query.cancel": cancelRequest, - "query.notify": createNotif, - "query.prompt": dataRequest, - "query.submit": submitRequest, + "query.cancel": queryCancel, + "query.notify": queryNotify, + "query.prompt": queryPrompt, + "query.submit": querySubmit, }; export function registerSockets() { diff --git a/module/sockets/cancelRequest.mjs b/module/sockets/cancelRequest.mjs deleted file mode 100644 index 865071a..0000000 --- a/module/sockets/cancelRequest.mjs +++ /dev/null @@ -1 +0,0 @@ -export function cancelRequest() {}; diff --git a/module/sockets/createNotif.mjs b/module/sockets/createNotif.mjs deleted file mode 100644 index 8ec4c2f..0000000 --- a/module/sockets/createNotif.mjs +++ /dev/null @@ -1,19 +0,0 @@ -export function createNotif(payload) { - const { userID, content, includeGM } = payload; - - if (userID !== game.user.id) { return }; - - // TODO: prevent this from working if the user hasn't submitted a query response - - let whisper = [game.user.id]; - if (includeGM) { - whisper = game.users.filter(u => u.isGM).map(u => u.id); - }; - - ChatMessage.implementation.create({ - flavor: `Data Query Notification`, - content, - whisper, - style: CONST.CHAT_MESSAGE_STYLES.OOC, - }); -}; diff --git a/module/sockets/query/notify.mjs b/module/sockets/query/notify.mjs new file mode 100644 index 0000000..7974d63 --- /dev/null +++ b/module/sockets/query/notify.mjs @@ -0,0 +1,24 @@ +import { respondedToQueries } from "../../utils/QueryManager.mjs"; + +export function queryNotify(payload) { + const { id, userID, content, includeGM } = payload; + + if (userID !== game.user.id) { return }; + + // Ensure that each user can only get one notification about a query + if (!respondedToQueries.has(id)) { return }; + + let whisper = [game.user.id]; + if (includeGM) { + whisper = game.users.filter(u => u.isGM).map(u => u.id); + }; + + ChatMessage.implementation.create({ + flavor: `Data Query Notification`, + content, + whisper, + style: CONST.CHAT_MESSAGE_STYLES.OOC, + }); + + respondedToQueries.delete(id); +}; diff --git a/module/sockets/dataRequest.mjs b/module/sockets/query/prompt.mjs similarity index 83% rename from module/sockets/dataRequest.mjs rename to module/sockets/query/prompt.mjs index 34cd39f..aef9d72 100644 --- a/module/sockets/dataRequest.mjs +++ b/module/sockets/query/prompt.mjs @@ -1,6 +1,7 @@ -import { DialogManager } from "../utils/DialogManager.mjs"; +import { DialogManager } from "../../utils/DialogManager.mjs"; +import { respondedToQueries } from "../../utils/QueryManager.mjs"; -export async function dataRequest(payload) { +export async function queryPrompt(payload) { const { id, users, @@ -40,6 +41,7 @@ export async function dataRequest(payload) { } else if (result.state === `errored`) { ui.notifications.error(result.error); } else if (result.state === `prompted`) { + respondedToQueries.add(request.id); game.socket.emit(`system.taf`, { event: `query.submit`, payload: { diff --git a/module/sockets/submitRequest.mjs b/module/sockets/query/submit.mjs similarity index 72% rename from module/sockets/submitRequest.mjs rename to module/sockets/query/submit.mjs index 1d4ef0c..a4c9d6d 100644 --- a/module/sockets/submitRequest.mjs +++ b/module/sockets/query/submit.mjs @@ -1,6 +1,6 @@ -import { addResponse, has as hasQuery } from "../utils/QueryManager.mjs"; +import { addResponse, has as hasQuery } from "../../utils/QueryManager.mjs"; -export function submitRequest(payload, user) { +export function querySubmit(payload, user) { const { id, answers, From 804c4b3984b097b7b03fd3a4cfc616bee7397a2a Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 20 Nov 2025 22:42:42 -0700 Subject: [PATCH 093/105] Disable the eslint brace-style rule because sometimes inconsistency is better than consistency --- eslint.config.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index d5f0390..04422dc 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -73,7 +73,7 @@ export default [ "@stylistic/eol-last": `warn`, "@stylistic/operator-linebreak": [`warn`, `before`], "@stylistic/indent": [`warn`, `tab`], - "@stylistic/brace-style": [`warn`, `1tbs`, { "allowSingleLine": true }], + "@stylistic/brace-style": [`off`], "@stylistic/quotes": [`warn`, `backtick`, { "avoidEscape": true }], "@stylistic/comma-dangle": [`warn`, { arrays: `always-multiline`, objects: `always-multiline`, imports: `always-multiline`, exports: `always-multiline`, functions: `always-multiline` }], "@stylistic/comma-style": [`warn`, `last`], From 9ea417ddc1dfc273ec1b481e7554145ce8ba0a00 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 20 Nov 2025 22:42:56 -0700 Subject: [PATCH 094/105] Add region comments --- module/apps/Ask.mjs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/module/apps/Ask.mjs b/module/apps/Ask.mjs index f3d009a..e6d3ce4 100644 --- a/module/apps/Ask.mjs +++ b/module/apps/Ask.mjs @@ -12,6 +12,7 @@ const validInputTypes = [ ]; export class Ask extends HandlebarsApplicationMixin(ApplicationV2) { + // #region Options static DEFAULT_OPTIONS = { tag: `dialog`, classes: [ @@ -47,7 +48,9 @@ export class Ask extends HandlebarsApplicationMixin(ApplicationV2) { template: filePath(`templates/Ask/controls.hbs`), }, }; + // #endregion Options + // #region Instance _inputs = []; alwaysUseAnswerObject = false; @@ -88,6 +91,7 @@ export class Ask extends HandlebarsApplicationMixin(ApplicationV2) { this._userOnConfirm = onConfirm; this._userOnClose = onClose; }; + // #endregion Instance // #region Lifecycle async _onFirstRender() { From c014e17da21e40ac277fd11a0ea0a100d9a95841 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 20 Nov 2025 22:43:14 -0700 Subject: [PATCH 095/105] Implement the request cancellation --- module/sockets/query/cancel.mjs | 18 ++++++++++++ module/utils/QueryManager.mjs | 50 +++++++++++++++++++++++++-------- 2 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 module/sockets/query/cancel.mjs diff --git a/module/sockets/query/cancel.mjs b/module/sockets/query/cancel.mjs new file mode 100644 index 0000000..654b21d --- /dev/null +++ b/module/sockets/query/cancel.mjs @@ -0,0 +1,18 @@ +import { DialogManager } from "../../utils/DialogManager.mjs"; + +export async function queryCancel(payload) { + const { id } = payload; + + if (!id) { + ui.notifications.error(game.i18n.format( + `taf.notifs.error.malformed-socket-payload`, + { + event: `query.cancel`, + details: `A request ID must be provided`, + }), + ); + return; + }; + + await DialogManager.close(id); +}; diff --git a/module/utils/QueryManager.mjs b/module/utils/QueryManager.mjs index d6ce677..09839a0 100644 --- a/module/utils/QueryManager.mjs +++ b/module/utils/QueryManager.mjs @@ -1,7 +1,14 @@ +import { filePath } from "../consts.mjs"; +import { Logger } from "./Logger.mjs"; +import { QueryStatus } from "../apps/QueryStatus.mjs"; + /** - * An object containing information about the current status for all users involved - * with the data request. - * @typedef {Record} UserStatus + * An object containing information about the current status for all + * users involved with the data request. + * @typedef {Record< + * string, + * "finished" | "waiting" | "cancelled" | "disconnected" | "unprompted" + * >} UserStatus */ /** @@ -16,9 +23,13 @@ * @property {object} config The data used to create the initial config */ -import { filePath } from "../consts.mjs"; -import { Logger } from "./Logger.mjs"; -import { QueryStatus } from "../apps/QueryStatus.mjs"; +/** + * This internal API is used in order to prevent the query.notify event + * from being fired off in situations where the user hasn't responded, + * wasn't part of the query, or has already been notified. + * @type {Set} + */ +export const respondedToQueries = new Set(); /** @type {Map} */ const queries = new Map(); @@ -26,13 +37,13 @@ const queries = new Map(); /** @type {Map} */ const promises = new Map(); -async function sendBasicNotification(userID, answers) { +async function sendBasicNotification(requestID, userID, answers) { const content = await foundry.applications.handlebars.renderTemplate( filePath(`templates/query-response.hbs`), { answers }, ); - await notify(userID, content, { includeGM: false }); + await notify(requestID, userID, content, { includeGM: false }); }; export function has(requestID) { @@ -138,10 +149,19 @@ export async function requery(requestID, users) { export async function addResponse(requestID, userID, answers) { const data = queries.get(requestID); - data.responses[userID] = answers; - data.status[userID] = `finished`; - await data.onSubmit?.(userID, answers); + // User closed the popup manually + if (answers == null) { + data.status[userID] = `unprompted`; + } + + // User submitted the answers as expected + else { + data.responses[userID] = answers; + data.status[userID] = `finished`; + await data.onSubmit?.(requestID, userID, answers); + }; + await maybeResolve(requestID); }; @@ -180,10 +200,14 @@ async function maybeResolve(requestID) { }; }; -export async function notify(userID, content, { includeGM = false } = {}) { +export async function notify(requestID, userID, content, { includeGM = false } = {}) { + // Prevent sending notifications for not-your queries + if (!queries.has(requestID)) { return }; + game.socket.emit(`system.taf`, { event: `query.notify`, payload: { + id: requestID, userID, content, includeGM, @@ -196,6 +220,7 @@ export async function finish(requestID) { if (!queries.has(requestID)) { return }; const query = queries.get(requestID); + query.app?.close(); query.resolve(query.responses); queries.delete(requestID); promises.delete(requestID); @@ -211,6 +236,7 @@ export async function cancel(requestID) { if (!queries.has(requestID)) { return }; const query = queries.get(requestID); + query.app?.close(); query.resolve(null); queries.delete(requestID); promises.delete(requestID); From b428eb3bf65d5536dcfd0bd6d19d5209d83b10b6 Mon Sep 17 00:00:00 2001 From: Oliver Date: Thu, 20 Nov 2025 23:37:46 -0700 Subject: [PATCH 096/105] Finish styling the QueryStatus application --- styles/Apps/Ask.css | 4 ---- styles/Apps/QueryStatus.css | 10 +++++++++- styles/elements/div.css | 20 ++++++++++++++++++++ styles/elements/span.css | 2 +- styles/main.css | 2 ++ styles/resets/button.css | 3 +++ styles/themes/dark.css | 7 +++++++ templates/QueryStatus/controls.hbs | 6 +++--- templates/QueryStatus/users.hbs | 6 +++--- 9 files changed, 48 insertions(+), 12 deletions(-) create mode 100644 styles/elements/div.css create mode 100644 styles/resets/button.css diff --git a/styles/Apps/Ask.css b/styles/Apps/Ask.css index f7bb78e..4aca7cc 100644 --- a/styles/Apps/Ask.css +++ b/styles/Apps/Ask.css @@ -23,10 +23,6 @@ display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; - - button { - flex-grow: 1; - } } label { diff --git a/styles/Apps/QueryStatus.css b/styles/Apps/QueryStatus.css index 5532505..4f45ff4 100644 --- a/styles/Apps/QueryStatus.css +++ b/styles/Apps/QueryStatus.css @@ -11,7 +11,7 @@ display: flex; flex-direction: column; margin: 0; - border: 1px solid yellowgreen; + border: 1px solid rebeccapurple; border-radius: 4px; padding: 4px 8px; @@ -19,7 +19,15 @@ display: flex; flex-direction: row; align-items: center; + /* Same height as the icons used for loading/disconnected */ + height: 35px; } } } + + .control-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 1rem; + } } diff --git a/styles/elements/div.css b/styles/elements/div.css new file mode 100644 index 0000000..69ebd5e --- /dev/null +++ b/styles/elements/div.css @@ -0,0 +1,20 @@ +.taf > .window-content div { + &.chip { + display: inline flex; + color: var(--chip-color); + background: var(--chip-background); + border: 1px solid var(--chip-border-color); + border-radius: 4px; + + .key { + padding: 2px 4px; + } + + .value { + padding: 2px 4px; + border-radius: 0 4px 4px 0; + color: var(--chip-value-color); + background: var(--chip-value-background); + } + } +} diff --git a/styles/elements/span.css b/styles/elements/span.css index 1ce99fe..c4fdbcb 100644 --- a/styles/elements/span.css +++ b/styles/elements/span.css @@ -18,7 +18,7 @@ .taf > .window-content span { &.loader { - --size: 40px; + --size: 35px; width: var(--size); height: var(--size); border-radius: 50%; diff --git a/styles/main.css b/styles/main.css index 6994e85..a4c4a2c 100644 --- a/styles/main.css +++ b/styles/main.css @@ -3,6 +3,7 @@ /* Resets */ @import url("./resets/hr.css") layer(resets); @import url("./resets/inputs.css") layer(resets); +@import url("./resets/button.css") layer(resets); /* Themes */ @import url("./themes/dark.css") layer(themes); @@ -10,6 +11,7 @@ /* Elements */ @import url("./elements/utils.css") layer(elements); +@import url("./elements/div.css") layer(elements); @import url("./elements/headers.css") layer(elements); @import url("./elements/hr.css") layer(elements); @import url("./elements/input.css") layer(elements); diff --git a/styles/resets/button.css b/styles/resets/button.css new file mode 100644 index 0000000..d04ae6e --- /dev/null +++ b/styles/resets/button.css @@ -0,0 +1,3 @@ +.taf > .window-content button { + height: initial; +} diff --git a/styles/themes/dark.css b/styles/themes/dark.css index 85103f7..1695d32 100644 --- a/styles/themes/dark.css +++ b/styles/themes/dark.css @@ -1,3 +1,10 @@ .theme-dark { --prosemirror-background: var(--color-cool-5); + + /* Chip Variables */ + --chip-color: #fff7ed; + --chip-background: #2b3642; + --chip-value-color: #fff7ed; + --chip-value-background: #10161d; + --chip-border-color: var(--chip-value-background); } diff --git a/templates/QueryStatus/controls.hbs b/templates/QueryStatus/controls.hbs index 363c828..65985fc 100644 --- a/templates/QueryStatus/controls.hbs +++ b/templates/QueryStatus/controls.hbs @@ -1,8 +1,8 @@ -
        - -
        diff --git a/templates/QueryStatus/users.hbs b/templates/QueryStatus/users.hbs index 4ade68d..bf863ea 100644 --- a/templates/QueryStatus/users.hbs +++ b/templates/QueryStatus/users.hbs @@ -16,7 +16,7 @@ @@ -32,14 +32,14 @@ {{#if (eq user.status "finished")}}
        {{#each user.answers as | answer |}} - +
        {{ @key }} {{ answer }} - +
        {{/each}}
        {{/if}} From 6997c736dc9e9e21d73aeeaf935c4d279b9dd92d Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 21 Nov 2025 19:23:58 -0700 Subject: [PATCH 097/105] Implement the localizer helper API --- module/api.mjs | 2 ++ module/utils/localizer.mjs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 module/utils/localizer.mjs diff --git a/module/api.mjs b/module/api.mjs index dc38c3d..33eab44 100644 --- a/module/api.mjs +++ b/module/api.mjs @@ -7,6 +7,7 @@ import { QueryStatus } from "./apps/QueryStatus.mjs"; // Utils import { attributeSorter } from "./utils/attributeSort.mjs"; import { DialogManager } from "./utils/DialogManager.mjs"; +import { localizer } from "./utils/localizer.mjs"; import { QueryManager } from "./utils/QueryManager.mjs"; import { toID } from "./utils/toID.mjs"; @@ -27,6 +28,7 @@ Object.defineProperty( }, utils: { attributeSorter, + localizer, toID, }, }), diff --git a/module/utils/localizer.mjs b/module/utils/localizer.mjs new file mode 100644 index 0000000..7988039 --- /dev/null +++ b/module/utils/localizer.mjs @@ -0,0 +1,32 @@ +const config = Object.preventExtensions({ + subKeyPattern: /@(?[a-zA-Z.]+)/gm, + maxDepth: 10, +}); + +export function localizer(key, args = {}, depth = 0) { + /** @type {string} */ + let localized = game.i18n.format(key, args); + const subkeys = localized.matchAll(config.subKeyPattern); + + // Short-cut to help prevent infinite recursion + if (depth > config.maxDepth) { + return localized; + }; + + /* + Helps prevent recursion on the same key so that we aren't doing excess work. + */ + const localizedSubkeys = new Map(); + for (const match of subkeys) { + const subkey = match.groups.key; + if (localizedSubkeys.has(subkey)) { continue }; + localizedSubkeys.set(subkey, localizer(subkey, args, depth + 1)); + }; + + return localized.replace( + config.subKeyPattern, + (_fullMatch, subkey) => { + return localizedSubkeys.get(subkey); + }, + ); +}; From cab29d9cd66ec070741f284d9b1a7c92b6dbf1cd Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 21 Nov 2025 19:24:22 -0700 Subject: [PATCH 098/105] Add localization for a bunch of stuff that I initially missed --- langs/en-ca.json | 14 +++++++++++++- module/sockets/query/cancel.mjs | 9 +++++---- module/sockets/query/notify.mjs | 3 ++- module/sockets/query/prompt.mjs | 21 +++++++++++---------- module/sockets/query/submit.mjs | 11 ++++++----- templates/QueryStatus/controls.hbs | 4 ++-- templates/QueryStatus/users.hbs | 2 +- templates/query-response.hbs | 6 +++--- 8 files changed, 43 insertions(+), 27 deletions(-) diff --git a/langs/en-ca.json b/langs/en-ca.json index 24dc2cb..611a08a 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -14,9 +14,18 @@ "sheet-names": { "PlayerSheet": "Player Sheet" }, + "misc": { + "Key": "Key", + "Value": "Value", + "no-data-submitted": "No data submitted", + "data-query-notif-header": "Data Query Notification" + }, "Apps": { "QueryStatus": { - "user-disconnected-tooltip": "This user is not logged in to Foundry" + "user-disconnected-tooltip": "This user is not logged in to Foundry", + "cancel-request": "Cancel Request", + "finish-early": "Finish Request Early", + "send-request": "Send Request" }, "TAFDocumentSheetConfig": { "Sizing": "Sizing", @@ -35,6 +44,9 @@ } } }, + "sockets": { + "user-list-required": "A list fo users must be provided" + }, "notifs": { "error": { "missing-id": "An ID must be provided", diff --git a/module/sockets/query/cancel.mjs b/module/sockets/query/cancel.mjs index 654b21d..f8eeddc 100644 --- a/module/sockets/query/cancel.mjs +++ b/module/sockets/query/cancel.mjs @@ -1,16 +1,17 @@ import { DialogManager } from "../../utils/DialogManager.mjs"; +import { localizer } from "../../utils/localizer.mjs"; export async function queryCancel(payload) { const { id } = payload; if (!id) { - ui.notifications.error(game.i18n.format( + ui.notifications.error(localizer( `taf.notifs.error.malformed-socket-payload`, { event: `query.cancel`, - details: `A request ID must be provided`, - }), - ); + details: `taf.notifs.error.missing-id`, + }, + )); return; }; diff --git a/module/sockets/query/notify.mjs b/module/sockets/query/notify.mjs index 7974d63..624e7b2 100644 --- a/module/sockets/query/notify.mjs +++ b/module/sockets/query/notify.mjs @@ -1,3 +1,4 @@ +import { localizer } from "../../utils/localizer.mjs"; import { respondedToQueries } from "../../utils/QueryManager.mjs"; export function queryNotify(payload) { @@ -14,7 +15,7 @@ export function queryNotify(payload) { }; ChatMessage.implementation.create({ - flavor: `Data Query Notification`, + flavor: localizer(`taf.misc.data-query-notif-header`), content, whisper, style: CONST.CHAT_MESSAGE_STYLES.OOC, diff --git a/module/sockets/query/prompt.mjs b/module/sockets/query/prompt.mjs index aef9d72..8b1700f 100644 --- a/module/sockets/query/prompt.mjs +++ b/module/sockets/query/prompt.mjs @@ -1,4 +1,5 @@ import { DialogManager } from "../../utils/DialogManager.mjs"; +import { localizer } from "../../utils/localizer.mjs"; import { respondedToQueries } from "../../utils/QueryManager.mjs"; export async function queryPrompt(payload) { @@ -10,25 +11,25 @@ export async function queryPrompt(payload) { } = payload; if (!id) { - ui.notifications.error(game.i18n.format( + ui.notifications.error(localizer( `taf.notifs.error.malformed-socket-payload`, { - event: `query.prompt`, - details: `A request ID must be provided`, - }), - ); + event: `query.cancel`, + details: `taf.notifs.error.missing-id`, + }, + )); return; }; // null/undefined is a special case for "all users but me" by default if (users != null && !Array.isArray(users)) { - ui.notifications.error(game.i18n.format( + ui.notifications.error(localizer( `taf.notifs.error.malformed-socket-payload`, { - event: `query.prompt`, - details: `A list of users must be provided`, - }), - ); + event: `query.cancel`, + details: `taf.sockets.user-list-required`, + }, + )); return; }; diff --git a/module/sockets/query/submit.mjs b/module/sockets/query/submit.mjs index a4c9d6d..023ed38 100644 --- a/module/sockets/query/submit.mjs +++ b/module/sockets/query/submit.mjs @@ -1,4 +1,5 @@ import { addResponse, has as hasQuery } from "../../utils/QueryManager.mjs"; +import { localizer } from "../../utils/localizer.mjs"; export function querySubmit(payload, user) { const { @@ -7,13 +8,13 @@ export function querySubmit(payload, user) { } = payload; if (!id) { - ui.notifications.error(game.i18n.format( + ui.notifications.error(localizer( `taf.notifs.error.malformed-socket-payload`, { - event: `query.submit`, - details: `A request ID must be provided`, - }), - ); + event: `query.cancel`, + details: `taf.notifs.error.missing-id`, + }, + )); return; }; diff --git a/templates/QueryStatus/controls.hbs b/templates/QueryStatus/controls.hbs index 65985fc..d7f623f 100644 --- a/templates/QueryStatus/controls.hbs +++ b/templates/QueryStatus/controls.hbs @@ -1,8 +1,8 @@
        diff --git a/templates/QueryStatus/users.hbs b/templates/QueryStatus/users.hbs index bf863ea..abdaf64 100644 --- a/templates/QueryStatus/users.hbs +++ b/templates/QueryStatus/users.hbs @@ -25,7 +25,7 @@ type="button" data-action="promptUser" > - Send Request + {{ localize "taf.Apps.QueryStatus.send-request" }} {{/if}} diff --git a/templates/query-response.hbs b/templates/query-response.hbs index c2e1219..9a62311 100644 --- a/templates/query-response.hbs +++ b/templates/query-response.hbs @@ -1,8 +1,8 @@ {{#if answers}} - - + + {{#each answers as | answer |}} @@ -12,5 +12,5 @@ {{/each}}
        KeyValue{{ localize "taf.misc.Key" }}{{ localize "taf.misc.Value" }}
        {{else}} -No data submitted + {{ localize "taf.misc.no-data-submitted" }} {{/if}} From cb334f41de75a8e5ddfb3f9645a0ac51f8657e2b Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 21 Nov 2025 19:28:33 -0700 Subject: [PATCH 099/105] Add safety check to ensure the response we got was for one of our requests. --- module/utils/QueryManager.mjs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/module/utils/QueryManager.mjs b/module/utils/QueryManager.mjs index 09839a0..225d43f 100644 --- a/module/utils/QueryManager.mjs +++ b/module/utils/QueryManager.mjs @@ -6,8 +6,8 @@ import { QueryStatus } from "../apps/QueryStatus.mjs"; * An object containing information about the current status for all * users involved with the data request. * @typedef {Record< - * string, - * "finished" | "waiting" | "cancelled" | "disconnected" | "unprompted" + * string, + * "finished" | "waiting" | "disconnected" | "unprompted" * >} UserStatus */ @@ -148,18 +148,19 @@ export async function requery(requestID, users) { }; export async function addResponse(requestID, userID, answers) { - const data = queries.get(requestID); + if (!queries.has(requestID)) { return }; + const query = queries.get(requestID); // User closed the popup manually if (answers == null) { - data.status[userID] = `unprompted`; + query.status[userID] = `unprompted`; } // User submitted the answers as expected else { - data.responses[userID] = answers; - data.status[userID] = `finished`; - await data.onSubmit?.(requestID, userID, answers); + query.responses[userID] = answers; + query.status[userID] = `finished`; + await query.onSubmit?.(requestID, userID, answers); }; await maybeResolve(requestID); From 022b6c5b31ccd89c7866df56eb26aafffdd8887e Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 21 Nov 2025 19:30:01 -0700 Subject: [PATCH 100/105] Remove / tweak error messages --- scripts/createForgejoRelease.mjs | 3 +-- scripts/uploadToS3.mjs | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/scripts/createForgejoRelease.mjs b/scripts/createForgejoRelease.mjs index c960e39..ce31668 100644 --- a/scripts/createForgejoRelease.mjs +++ b/scripts/createForgejoRelease.mjs @@ -43,11 +43,10 @@ async function main() { await addReleaseAsset(release.data.id, `system.json`); } catch (e) { console.error(`Failed to add assets to the release`); - console.error(e) process.exit(1); }; - console.log(`Release created, and files uploaded successfully!`); + console.log(`Release created`); }; main(); diff --git a/scripts/uploadToS3.mjs b/scripts/uploadToS3.mjs index ec125f8..50c1444 100644 --- a/scripts/uploadToS3.mjs +++ b/scripts/uploadToS3.mjs @@ -57,9 +57,8 @@ async function main() { try { const response = await s3Client.send(new PutObjectCommand(params)); console.log("Upload successful"); - console.log(response); } catch (err) { - console.error("Error", err); + console.error("Upload to s3 failed"); }; }; From c6f14b3c2170d3d62219534ee04040c4a56b40b4 Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 21 Nov 2025 19:30:31 -0700 Subject: [PATCH 101/105] Remove unused status value --- templates/QueryStatus/users.hbs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/templates/QueryStatus/users.hbs b/templates/QueryStatus/users.hbs index abdaf64..e0c7922 100644 --- a/templates/QueryStatus/users.hbs +++ b/templates/QueryStatus/users.hbs @@ -8,9 +8,7 @@
        {{ user.name }}
        - {{#if (eq user.status "cancelled")}} - Cancelled by User - {{else if (eq user.status "waiting")}} + {{#if (eq user.status "waiting")}} {{else if (eq user.status "disconnected")}} Date: Fri, 21 Nov 2025 19:48:43 -0700 Subject: [PATCH 102/105] Make it so requesting data from offline users shows disconnected initially --- module/utils/QueryManager.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/utils/QueryManager.mjs b/module/utils/QueryManager.mjs index 225d43f..abf1096 100644 --- a/module/utils/QueryManager.mjs +++ b/module/utils/QueryManager.mjs @@ -100,7 +100,7 @@ export async function query( /** @type {UserStatus} */ const status = {}; for (const user of users) { - status[user] = game.users.get(user).active ? `waiting` : `unprompted`; + status[user] = game.users.get(user).active ? `waiting` : `disconnected`; }; queries.set( From 361a2004d82f887c97f788f0eb86557f6d44410b Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 21 Nov 2025 19:49:02 -0700 Subject: [PATCH 103/105] Update loading spinner to use CSS variables depending on theme --- styles/elements/span.css | 4 ++-- styles/themes/dark.css | 3 +++ styles/themes/light.css | 10 ++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/styles/elements/span.css b/styles/elements/span.css index c4fdbcb..fcbfef3 100644 --- a/styles/elements/span.css +++ b/styles/elements/span.css @@ -32,14 +32,14 @@ position: absolute; inset: 0px; border-radius: 50%; - border: 5px solid #FFF; + border: 5px solid var(--spinner-outer-colour, #fff); animation: prixClipFix 4s linear infinite; } &::after{ inset: 8px; transform: rotate3d(90, 90, 0, 180deg ); - border-color: var(--spinner-inner-colour, #FF3D00); + border-color: var(--spinner-inner-colour, #ff3d00); } } } diff --git a/styles/themes/dark.css b/styles/themes/dark.css index 1695d32..53552e0 100644 --- a/styles/themes/dark.css +++ b/styles/themes/dark.css @@ -1,6 +1,9 @@ .theme-dark { --prosemirror-background: var(--color-cool-5); + --spinner-outer-colour: white; + --spinner-inner-colour: #FF3D00; + /* Chip Variables */ --chip-color: #fff7ed; --chip-background: #2b3642; diff --git a/styles/themes/light.css b/styles/themes/light.css index fee3812..47cf1e9 100644 --- a/styles/themes/light.css +++ b/styles/themes/light.css @@ -1,3 +1,13 @@ .theme-light { --prosemirror-background: white; + + --spinner-outer-colour: black; + --spinner-inner-colour: #FF3D00; + + /* Chip Variables */ + --chip-color: #18181b; + --chip-background: #fafafa; + --chip-value-color: #18181b; + --chip-value-background: #d4d4d8aa; + --chip-border-color: var(--chip-value-background); } From e99016e43358bf519b36998039c07d3ea65dd41a Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 21 Nov 2025 19:50:36 -0700 Subject: [PATCH 104/105] Add a title to the QueryStatus app --- langs/en-ca.json | 1 + module/apps/QueryStatus.mjs | 1 + 2 files changed, 2 insertions(+) diff --git a/langs/en-ca.json b/langs/en-ca.json index 611a08a..1136454 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -22,6 +22,7 @@ }, "Apps": { "QueryStatus": { + "title": "Information Request Status", "user-disconnected-tooltip": "This user is not logged in to Foundry", "cancel-request": "Cancel Request", "finish-early": "Finish Request Early", diff --git a/module/apps/QueryStatus.mjs b/module/apps/QueryStatus.mjs index 64b61a9..5139bb2 100644 --- a/module/apps/QueryStatus.mjs +++ b/module/apps/QueryStatus.mjs @@ -16,6 +16,7 @@ export class QueryStatus extends HandlebarsApplicationMixin(ApplicationV2) { height: `auto`, }, window: { + title: `taf.Apps.QueryStatus.title`, resizable: true, }, actions: { From 41034854eb52270feffd7ce0a00339340685947f Mon Sep 17 00:00:00 2001 From: Oliver Date: Fri, 21 Nov 2025 19:56:07 -0700 Subject: [PATCH 105/105] Make the DialogManager more ESM-y --- module/utils/DialogManager.mjs | 212 +++++++++++++++++---------------- 1 file changed, 109 insertions(+), 103 deletions(-) diff --git a/module/utils/DialogManager.mjs b/module/utils/DialogManager.mjs index fdf6e8b..ab330f3 100644 --- a/module/utils/DialogManager.mjs +++ b/module/utils/DialogManager.mjs @@ -1,108 +1,114 @@ import { Ask } from "../apps/Ask.mjs"; -export class DialogManager { - /** @type {Map} */ - static #promises = new Map(); - static #dialogs = new Map(); +/** @type {Map} */ +const promises = new Map(); - static async close(id) { - this.#dialogs.get(id)?.close(); - this.#dialogs.delete(id); - this.#promises.delete(id); - }; +/** @type {Map} */ +const dialogs = new Map(); - /** - * Asks the user to provide a simple piece of information, this is primarily - * intended to be used within macros so that it can have better info gathering - * as needed. This returns an object of input keys/labels to the value the user - * input for that label, if there is only one input, this will return the value - * without an object wrapper, allowing for easier access. - * - * @param {AskConfig} data - * @param {AskOptions} opts - * @returns {AskResult} - */ - static async ask( - data, - { - onlyOneWaiting = true, - alwaysUseAnswerObject = true, - } = {}, - ) { - if (!data.id) { - return { - state: `errored`, - error: `An ID must be provided`, - }; - }; - if (!data.inputs.length) { - return { - state: `errored`, - error: `At least one input must be provided`, - }; - }; - const id = data.id; - - // Don't do multi-thread waiting - if (this.#dialogs.has(id)) { - const app = this.#dialogs.get(id); - app.bringToFront(); - if (onlyOneWaiting) { - return { state: `fronted` }; - } else { - return this.#promises.get(id); - }; - }; - - let autofocusClaimed = false; - for (const i of data.inputs) { - i.id ??= foundry.utils.randomID(16); - i.key ??= i.label; - - switch (i.type) { - case `input`: { - i.inputType ??= `text`; - } - } - - // Only ever allow one input to claim autofocus - i.autofocus &&= !autofocusClaimed; - autofocusClaimed ||= i.autofocus; - - // Set the value's attribute name if it isn't specified explicitly - if (!i.valueAttribute) { - switch (i.inputType) { - case `checkbox`: - i.type = `checkbox`; - delete i.valueAttribute; - delete i.inputType; - break; - default: - i.valueAttribute = `value`; - }; - }; - }; - - const promise = new Promise((resolve) => { - const app = new Ask({ - ...data, - alwaysUseAnswerObject, - onClose: () => { - this.#dialogs.delete(id); - this.#promises.delete(id); - resolve({ state: `prompted` }); - }, - onConfirm: (answers) => resolve({ state: `prompted`, answers }), - }); - app.render({ force: true }); - this.#dialogs.set(id, app); - }); - - this.#promises.set(id, promise); - return promise; - }; - - static get size() { - return this.#dialogs.size; - }; +export function close(id) { + dialogs.get(id)?.close(); + dialogs.delete(id); + promises.delete(id); +}; + +/** + * Asks the user to provide a simple piece of information, this is primarily + * intended to be used within macros so that it can have better info gathering + * as needed. This returns an object of input keys/labels to the value the user + * input for that label, if there is only one input, this will return the value + * without an object wrapper, allowing for easier access. + * + * @param {AskConfig} data + * @param {AskOptions} opts + * @returns {AskResult} + */ +export async function ask( + data, + { + onlyOneWaiting = true, + alwaysUseAnswerObject = true, + } = {}, +) { + if (!data.id) { + return { + state: `errored`, + error: `An ID must be provided`, + }; + }; + if (!data.inputs.length) { + return { + state: `errored`, + error: `At least one input must be provided`, + }; + }; + const id = data.id; + + // Don't do multi-thread waiting + if (dialogs.has(id)) { + const app = dialogs.get(id); + app.bringToFront(); + if (onlyOneWaiting) { + return { state: `fronted` }; + } else { + return promises.get(id); + }; + }; + + let autofocusClaimed = false; + for (const i of data.inputs) { + i.id ??= foundry.utils.randomID(16); + i.key ??= i.label; + + switch (i.type) { + case `input`: { + i.inputType ??= `text`; + } + } + + // Only ever allow one input to claim autofocus + i.autofocus &&= !autofocusClaimed; + autofocusClaimed ||= i.autofocus; + + // Set the value's attribute name if it isn't specified explicitly + if (!i.valueAttribute) { + switch (i.inputType) { + case `checkbox`: + i.type = `checkbox`; + delete i.valueAttribute; + delete i.inputType; + break; + default: + i.valueAttribute = `value`; + }; + }; + }; + + const promise = new Promise((resolve) => { + const app = new Ask({ + ...data, + alwaysUseAnswerObject, + onClose: () => { + dialogs.delete(id); + promises.delete(id); + resolve({ state: `prompted` }); + }, + onConfirm: (answers) => resolve({ state: `prompted`, answers }), + }); + app.render({ force: true }); + dialogs.set(id, app); + }); + + promises.set(id, promise); + return promise; +}; + +export function size() { + return dialogs.size; +}; + +export const DialogManager = { + close, + ask, + size, };