diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index cfa58e6..6dfdd82 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -9,7 +9,6 @@ - @@ -19,7 +18,7 @@ - + diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml index 6abd3cf..49f98c6 100644 --- a/.idea/sqldialects.xml +++ b/.idea/sqldialects.xml @@ -2,6 +2,7 @@ + \ No newline at end of file diff --git a/migrations/0003_split_responses_table_to_allow_for_custom_lists.sql b/migrations/0003_split_responses_table_to_allow_for_custom_lists.sql index 55a1edf..80bb9d1 100644 --- a/migrations/0003_split_responses_table_to_allow_for_custom_lists.sql +++ b/migrations/0003_split_responses_table_to_allow_for_custom_lists.sql @@ -97,7 +97,7 @@ CREATE TRIGGER IF NOT EXISTS authorshipTypeDeleted FROM authors WHERE authorshipTypeId = OLD.id) BEGIN - SELECT RAISE(ABORT, 'authorship type is still used1'); + SELECT RAISE(ABORT, 'authorship type is still used!'); END; INSERT OR IGNORE INTO authors (discordSnowflake, authorshipTypeId) @@ -109,7 +109,6 @@ CREATE TABLE IF NOT EXISTS resultSets id INTEGER PRIMARY KEY, name TEXT, description TEXT, - creatorId INTEGER, discordSnowflake TEXT, global INTEGER NOT NULL DEFAULT FALSE CHECK (global IN (TRUE, FALSE)) ) STRICT; @@ -126,15 +125,13 @@ CREATE TABLE IF NOT EXISTS resultMappings id INTEGER PRIMARY KEY, resultId INTEGER NOT NULL, -- FOREIGN KEY REFERENCES rollableResults (id) ON DELETE CASCADE ON UPDATE CASCADE setId INTEGER NOT NULL, -- FOREIGN KEY REFERENCES resultSets (id) ON DELETE CASCADE ON UPDATE CASCADE - authorId INTEGER, -- FOREIGN KEY REFERENCES authors (id) ON DELETE SET NULL ON UPDATE CASCADE - created INTEGER NOT NULL, - updated INTEGER NOT NULL + authorId INTEGER -- FOREIGN KEY REFERENCES authors (id) ON DELETE SET NULL ON UPDATE CASCADE ) STRICT; CREATE UNIQUE INDEX IF NOT EXISTS idx_resultMapping_setId_resultId_resultOncePerSet ON resultMappings (setId, resultId); -INSERT OR IGNORE INTO resultMappings (resultId, setId, authorId, created, updated) -SELECT rollableResults.id, resultSets.id, authors.id, responses.id, responses.timestamp +INSERT OR IGNORE INTO resultMappings (resultId, setId, authorId) +SELECT rollableResults.id, resultSets.id, authors.id FROM responses LEFT JOIN rollableResults ON rollableResults.tableId = responses.tableId @@ -284,10 +281,8 @@ BEGIN END; CREATE VIEW IF NOT EXISTS responses AS -SELECT resultMappings.created AS id, - rollableResults.tableId AS tableId, +SELECT rollableResults.tableId AS tableId, rollableResults.text AS text, - resultMappings.updated AS timestamp, authors.discordSnowflake AS userSnowflake, (CASE WHEN resultSets.discordSnowflake = authors.discordSnowflake THEN NULL @@ -312,10 +307,10 @@ CREATE TABLE intentionallyCrash INSERT INTO intentionallyCrash (differences) SELECT 'uh oh' FROM (SELECT * - FROM (SELECT * FROM responsesOriginal EXCEPT SELECT * FROM responses) + FROM (SELECT tableId, text, userSnowflake, serverSnowflake, access FROM responsesOriginal EXCEPT SELECT tableId, text, userSnowflake, serverSnowflake, access FROM responses) UNION ALL SELECT * - FROM (SELECT * FROM responses EXCEPT SELECT * FROM responsesOriginal)); + FROM (SELECT tableId, text, userSnowflake, serverSnowflake, access FROM responses EXCEPT SELECT tableId, text, userSnowflake, serverSnowflake, access FROM responsesOriginal)); DROP TABLE intentionallyCrash; DROP TABLE responsesOriginal; @@ -340,7 +335,7 @@ BEGIN INSERT OR IGNORE INTO authors (discordSnowflake, authorshipTypeId) VALUES (NEW.userSnowflake, (SELECT authorshipTypes.id FROM authorshipTypes WHERE authorshipTypes.name = 'Discord contributor')); - INSERT OR ABORT INTO resultMappings (resultId, setId, authorId, created, updated) + INSERT OR ABORT INTO resultMappings (resultId, setId, authorId) VALUES ((SELECT id FROM rollableResults WHERE tableId = NEW.tableId AND text = NEW.text), (SELECT id FROM resultSets @@ -350,9 +345,7 @@ BEGIN WHEN NEW.access = 2 THEN NEW.userSnowflake ELSE RAISE(ABORT, 'access must be in 0, 1, 2') END), - (SELECT id FROM authors WHERE discordSnowflake = NEW.userSnowflake), - NEW.id, - NEW.timestamp); + (SELECT id FROM authors WHERE discordSnowflake = NEW.userSnowflake)); END; CREATE TRIGGER IF NOT EXISTS responsesUpdated @@ -388,9 +381,7 @@ BEGIN WHEN NEW.access = 2 THEN 0 ELSE RAISE(ABORT, 'access must be in 0, 1, 2') END), - authorId = (SELECT id FROM authors WHERE discordSnowflake = NEW.userSnowflake), - created = NEW.id, - updated = NEW.timestamp + authorId = (SELECT id FROM authors WHERE discordSnowflake = NEW.userSnowflake) WHERE resultId = (SELECT id FROM rollableResults WHERE tableId = OLD.tableId AND text = OLD.text) AND setId = (SELECT id FROM resultSets diff --git a/migrations/0006_add_audit_log_table.sql b/migrations/0006_add_audit_log_table.sql new file mode 100644 index 0000000..690c71e --- /dev/null +++ b/migrations/0006_add_audit_log_table.sql @@ -0,0 +1,37 @@ +-- Migration number: 0006 2024-07-01T08:24:03.736Z +CREATE TABLE IF NOT EXISTS userAuditLog ( + changeId INTEGER PRIMARY KEY, + userId INTEGER NOT NULL, + newName TEXT NULL, + newUrl TEXT NULL, + timestamp INTEGER NOT NULL +) STRICT; + +CREATE INDEX IF NOT EXISTS userUpdateTimestamp ON userAuditLog (userId, timestamp DESC); + +CREATE TABLE IF NOT EXISTS setAuditLog ( + changeId INTEGER PRIMARY KEY, + userId INTEGER NOT NULL, + setId INTEGER NOT NULL, + newName TEXT NULL, + newDescription TEXT NULL, + updateType INTEGER NOT NULL, + timestamp INTEGER NOT NULL +) STRICT; + +CREATE INDEX IF NOT EXISTS setUpdateTimestamp ON setAuditLog (setId, timestamp DESC); +CREATE INDEX IF NOT EXISTS setUpdateTimestampByUser ON setAuditLog (userId, timestamp DESC); + +CREATE TABLE IF NOT EXISTS resultAuditLog ( + changeId INTEGER PRIMARY KEY, + mappingId INTEGER NOT NULL, + userId INTEGER NOT NULL, + setId INTEGER NOT NULL, + newResultId INTEGER NULL, + updateType INTEGER NOT NULL, + timestamp INTEGER NOT NULL +) STRICT; + +CREATE INDEX IF NOT EXISTS resultUpdateTimestampByMapping ON resultAuditLog (mappingId, timestamp DESC); +CREATE INDEX IF NOT EXISTS resultUpdateTimestampBySet ON resultAuditLog (setId, timestamp DESC); +CREATE INDEX IF NOT EXISTS resultUpdateTimestampByUser ON resultAuditLog (userId, timestamp DESC); diff --git a/package-lock.json b/package-lock.json index f379db0..308923d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,9 @@ "collapse-white-space": "^2.1.0", "discord-snowflake": "^2.0.0", "escape-html": "^1.0.3", - "itty-router": "^4.0.26", + "itty-router": "^5.0.17", + "jsoncrush": "^1.1.8", + "locale-includes": "^1.0.6", "markdown-escape": "^2.0.0", "preact": "^10.19.6", "preact-iso": "^2.4.0", @@ -23,80 +25,80 @@ "@babel/core": "^7.23.7", "@babel/plugin-transform-runtime": "^7.23.7", "@babel/preset-env": "^7.23.8", + "@babel/preset-react": "^7.24.7", "@babel/preset-typescript": "^7.23.3", "@babel/runtime": "^7.23.8", "@cloudflare/workers-types": "^4.20231218.0", - "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", "@types/clean-css": "^4.2.11", "@types/escape-html": "^1.0.4", - "@types/less": "^3.0.6", "@types/markdown-escape": "^1.1.3", "@types/slug": "^5.0.7", "change-case": "^5.4.2", "clean-css": "^5.3.3", "fast-deep-equal": "^3.1.3", - "less": "^4.2.0", - "rollup": "^4.9.5", + "rollup": "^4.18.0", "rollup-plugin-ts": "^3.4.5", - "tsx": "^4.7.0", - "typescript": "^5.0.4", + "rollup-plugin-typescript2": "^0.36.0", + "ts-loader": "^9.5.1", + "tsx": "^4.16.0", + "typescript": "^5.5.2", "wrangler": "^3.0.0" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", - "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", + "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.7", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helpers": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -111,72 +113,54 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.21", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.21.tgz", - "integrity": "sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -185,29 +169,20 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", - "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "semver": "^6.3.1" }, "engines": { @@ -217,22 +192,13 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", "regexpu-core": "^5.3.1", "semver": "^6.3.1" }, @@ -243,19 +209,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", - "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -269,74 +226,79 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -346,35 +308,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -384,14 +346,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -401,114 +363,117 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", - "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", + "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.7", - "@babel/types": "^7.23.6" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -517,13 +482,29 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", + "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", - "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -533,14 +514,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", - "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -550,13 +531,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", - "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", + "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -641,12 +622,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", - "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -656,12 +637,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", - "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -695,12 +676,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -812,12 +793,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", - "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", + "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -843,12 +824,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", - "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -858,14 +839,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", - "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -876,14 +857,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", - "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -893,12 +874,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", - "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -908,12 +889,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", - "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", + "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -923,13 +904,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", - "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -939,13 +920,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", - "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -956,18 +937,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", - "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", + "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", "globals": "^11.1.0" }, "engines": { @@ -978,13 +959,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", - "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.15" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -994,12 +975,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", - "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", + "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1009,13 +990,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", - "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1025,12 +1006,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", - "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1040,12 +1021,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", - "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1056,13 +1037,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", - "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1072,12 +1053,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", - "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1088,13 +1069,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", - "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1104,14 +1085,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", - "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1121,12 +1102,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", - "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1137,12 +1118,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", - "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1152,12 +1133,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", - "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1168,12 +1149,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", - "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1183,13 +1164,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", - "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1199,14 +1180,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", - "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1216,15 +1197,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", - "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1234,13 +1215,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", - "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1250,13 +1231,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1266,12 +1247,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", - "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1281,12 +1262,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", - "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1297,12 +1278,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", - "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1313,16 +1294,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", - "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.3", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.23.3" + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1332,13 +1312,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", - "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1348,12 +1328,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", - "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1364,13 +1344,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", - "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1381,12 +1361,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1396,13 +1376,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", - "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1412,14 +1392,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", - "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1430,12 +1410,77 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", - "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz", + "integrity": "sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", + "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1445,12 +1490,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", - "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-plugin-utils": "^7.24.7", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1461,12 +1506,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", - "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1476,16 +1521,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", - "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz", + "integrity": "sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, "engines": { @@ -1495,22 +1540,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", - "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1520,13 +1556,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", - "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1536,12 +1572,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", - "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1551,12 +1587,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", - "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1566,12 +1602,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", - "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1581,15 +1617,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", - "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", + "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.23.3" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1599,12 +1635,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", - "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1614,13 +1650,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", - "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1630,13 +1666,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", - "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1646,13 +1682,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", - "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1662,26 +1698,27 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", - "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", + "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.23.3", - "@babel/plugin-syntax-import-attributes": "^7.23.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1693,58 +1730,58 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.7", - "@babel/plugin-transform-async-to-generator": "^7.23.3", - "@babel/plugin-transform-block-scoped-functions": "^7.23.3", - "@babel/plugin-transform-block-scoping": "^7.23.4", - "@babel/plugin-transform-class-properties": "^7.23.3", - "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.8", - "@babel/plugin-transform-computed-properties": "^7.23.3", - "@babel/plugin-transform-destructuring": "^7.23.3", - "@babel/plugin-transform-dotall-regex": "^7.23.3", - "@babel/plugin-transform-duplicate-keys": "^7.23.3", - "@babel/plugin-transform-dynamic-import": "^7.23.4", - "@babel/plugin-transform-exponentiation-operator": "^7.23.3", - "@babel/plugin-transform-export-namespace-from": "^7.23.4", - "@babel/plugin-transform-for-of": "^7.23.6", - "@babel/plugin-transform-function-name": "^7.23.3", - "@babel/plugin-transform-json-strings": "^7.23.4", - "@babel/plugin-transform-literals": "^7.23.3", - "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", - "@babel/plugin-transform-member-expression-literals": "^7.23.3", - "@babel/plugin-transform-modules-amd": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-modules-systemjs": "^7.23.3", - "@babel/plugin-transform-modules-umd": "^7.23.3", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.23.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", - "@babel/plugin-transform-numeric-separator": "^7.23.4", - "@babel/plugin-transform-object-rest-spread": "^7.23.4", - "@babel/plugin-transform-object-super": "^7.23.3", - "@babel/plugin-transform-optional-catch-binding": "^7.23.4", - "@babel/plugin-transform-optional-chaining": "^7.23.4", - "@babel/plugin-transform-parameters": "^7.23.3", - "@babel/plugin-transform-private-methods": "^7.23.3", - "@babel/plugin-transform-private-property-in-object": "^7.23.4", - "@babel/plugin-transform-property-literals": "^7.23.3", - "@babel/plugin-transform-regenerator": "^7.23.3", - "@babel/plugin-transform-reserved-words": "^7.23.3", - "@babel/plugin-transform-shorthand-properties": "^7.23.3", - "@babel/plugin-transform-spread": "^7.23.3", - "@babel/plugin-transform-sticky-regex": "^7.23.3", - "@babel/plugin-transform-template-literals": "^7.23.3", - "@babel/plugin-transform-typeof-symbol": "^7.23.3", - "@babel/plugin-transform-unicode-escapes": "^7.23.3", - "@babel/plugin-transform-unicode-property-regex": "^7.23.3", - "@babel/plugin-transform-unicode-regex": "^7.23.3", - "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.7", - "babel-plugin-polyfill-corejs3": "^0.8.7", - "babel-plugin-polyfill-regenerator": "^0.5.4", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -1755,15 +1792,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/preset-modules": { "version": "0.1.6-no-external-plugins", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", @@ -1778,17 +1806,37 @@ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/@babel/preset-react": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", + "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.24.7", + "@babel/plugin-transform-react-jsx-development": "^7.24.7", + "@babel/plugin-transform-react-pure-annotations": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/preset-typescript": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz", - "integrity": "sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/plugin-transform-modules-commonjs": "^7.23.3", - "@babel/plugin-transform-typescript": "^7.23.3" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1804,9 +1852,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.23.8", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", - "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dev": true, "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1816,33 +1864,33 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", - "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1851,13 +1899,13 @@ } }, "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1865,18 +1913,21 @@ } }, "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.2.0.tgz", - "integrity": "sha512-MVbXLbTcAotOPUj0pAMhVtJ+3/kFkwJqc5qNOleOZTv6QkZZABDMS21dSrSlVswEHwrpWC03e4fWytjqKvuE2A==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz", + "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", "dev": true, "dependencies": { "mime": "^3.0.0" + }, + "engines": { + "node": ">=16.13" } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20231218.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20231218.0.tgz", - "integrity": "sha512-547gOmTIVmRdDy7HNAGJUPELa+fSDm2Y0OCxqAtQOz0GLTDu1vX61xYmsb2rn91+v3xW6eMttEIpbYokKjtfJA==", + "version": "1.20240620.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20240620.1.tgz", + "integrity": "sha512-YWeS2aE8jAzDefuus/3GmZcFGu3Ef94uCAoxsQuaEXNsiGM9NeAhPpKC1BJAlcv168U/Q1J+6hckcGtipf6ZcQ==", "cpu": [ "x64" ], @@ -1890,9 +1941,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20231218.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20231218.0.tgz", - "integrity": "sha512-b39qrU1bKolCfmKFDAnX4vXcqzISkEUVE/V8sMBsFzxrIpNAbcUHBZAQPYmS/OHIGB94KjOVokvDi7J6UNurPw==", + "version": "1.20240620.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20240620.1.tgz", + "integrity": "sha512-3rdND+EHpmCrwYX6hvxIBSBJ0f40tRNxond1Vfw7GiR1MJVi3gragiBx75UDFHCxfRw3J0GZ1qVlkRce2/Xbsg==", "cpu": [ "arm64" ], @@ -1906,9 +1957,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20231218.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20231218.0.tgz", - "integrity": "sha512-dMUF1wA+0mybm6hHNOCgY/WMNMwomPPs4I7vvYCgwHSkch0Q2Wb7TnxQZSt8d1PK/myibaBwadrlIxpjxmpz3w==", + "version": "1.20240620.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20240620.1.tgz", + "integrity": "sha512-tURcTrXGeSbYqeM5ISVcofY20StKbVIcdxjJvNYNZ+qmSV9Fvn+zr7rRE+q64pEloVZfhsEPAlUCnFso5VV4XQ==", "cpu": [ "x64" ], @@ -1922,9 +1973,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20231218.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20231218.0.tgz", - "integrity": "sha512-2s5uc8IHt0QmWyKxAr1Fy+4b8Xy0b/oUtlPnm5MrKi2gDRlZzR7JvxENPJCpCnYENydS8lzvkMiAFECPBccmyQ==", + "version": "1.20240620.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20240620.1.tgz", + "integrity": "sha512-TThvkwNxaZFKhHZnNjOGqIYCOk05DDWgO+wYMuXg15ymN/KZPnCicRAkuyqiM+R1Fgc4kwe/pehjP8pbmcf6sg==", "cpu": [ "arm64" ], @@ -1938,9 +1989,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20231218.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20231218.0.tgz", - "integrity": "sha512-oN5hz6TXUDB5YKUN5N3QWAv6cYz9JjTZ9g16HVyoegVFEL6/zXU3tV19MBX2IvlE11ab/mRogEv9KXVIrHfKmA==", + "version": "1.20240620.1", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20240620.1.tgz", + "integrity": "sha512-Y/BA9Yj0r7Al1HK3nDHcfISgFllw6NR3XMMPChev57vrVT9C9D4erBL3sUBfofHU+2U9L+ShLsl6obBpe3vvUw==", "cpu": [ "x64" ], @@ -1954,9 +2005,9 @@ } }, "node_modules/@cloudflare/workers-types": { - "version": "4.20231218.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20231218.0.tgz", - "integrity": "sha512-Vs1FKjfUjXYGbCsXzkl+ITp0Iyb6QiW6+vTERTNThC+v96T0IvPVAioH4tT20rXwoxAfxh380mAaxYtTrJUNVg==", + "version": "4.20240620.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20240620.0.tgz", + "integrity": "sha512-CQD8YS6evRob7LChvIX3gE3zYo0KVgaLDOu1SwNP1BVIS2Sa0b+FC8S1e1hhrNN8/E4chYlVN+FDAgA4KRDUEQ==", "dev": true }, "node_modules/@cspotcode/source-map-support": { @@ -1971,6 +2022,16 @@ "node": ">=12" } }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@esbuild-plugins/node-globals-polyfill": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-globals-polyfill/-/node-globals-polyfill-0.2.3.tgz", @@ -1993,10 +2054,22 @@ "esbuild": "*" } }, + "node_modules/@esbuild-plugins/node-modules-polyfill/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/@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ "ppc64" ], @@ -2010,9 +2083,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", "cpu": [ "arm" ], @@ -2026,9 +2099,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", "cpu": [ "arm64" ], @@ -2042,9 +2115,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], @@ -2058,9 +2131,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", "cpu": [ "arm64" ], @@ -2074,9 +2147,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", "cpu": [ "x64" ], @@ -2090,9 +2163,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", "cpu": [ "arm64" ], @@ -2106,9 +2179,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", "cpu": [ "x64" ], @@ -2122,9 +2195,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", "cpu": [ "arm" ], @@ -2138,9 +2211,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ "arm64" ], @@ -2154,9 +2227,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", "cpu": [ "ia32" ], @@ -2170,9 +2243,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", "cpu": [ "loong64" ], @@ -2186,9 +2259,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", "cpu": [ "mips64el" ], @@ -2202,9 +2275,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", "cpu": [ "ppc64" ], @@ -2218,9 +2291,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", "cpu": [ "riscv64" ], @@ -2234,9 +2307,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", "cpu": [ "s390x" ], @@ -2250,9 +2323,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", "cpu": [ "x64" ], @@ -2266,9 +2339,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", "cpu": [ "x64" ], @@ -2282,9 +2355,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", "cpu": [ "x64" ], @@ -2298,9 +2371,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", "cpu": [ "x64" ], @@ -2314,9 +2387,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", "cpu": [ "arm64" ], @@ -2330,9 +2403,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", "cpu": [ "ia32" ], @@ -2346,9 +2419,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", "cpu": [ "x64" ], @@ -2362,53 +2435,70 @@ } }, "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "engines": { "node": ">=14" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -2418,62 +2508,46 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@mdn/browser-compat-data": { - "version": "5.5.7", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.7.tgz", - "integrity": "sha512-DoHTZ/TjtNfUu9eiqJd+x3IcCQrhS+yOYU436TKUnlE36jZwNbK535D1CmTsSYdi/UcdCWNm5KRQZ9g1tlZCPw==", + "version": "5.5.35", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.35.tgz", + "integrity": "sha512-APtxt3S+a64EcXpG7E3a0bLx+CPqEcgN45FY/GEmbBBgX51AGIPkkYFy0JQDuOR0MFCozjo50q5Im74jflrkiQ==", "dev": true }, - "node_modules/@rollup/plugin-babel": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", - "integrity": "sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==", + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@rollup/pluginutils": "^5.0.1" - }, + "optional": true, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - }, - "rollup": { - "optional": true - } + "node": ">=14" } }, "node_modules/@rollup/plugin-commonjs": { - "version": "25.0.7", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", - "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz", + "integrity": "sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", - "glob": "^8.0.3", + "glob": "^10.4.1", "is-reference": "1.2.1", "magic-string": "^0.30.3" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0 || 14 >= 14.17" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" @@ -2484,24 +2558,6 @@ } } }, - "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.2.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", @@ -2571,16 +2627,10 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.9.5.tgz", - "integrity": "sha512-idWaG8xeSRCfRq9KpRysDHJ/rEHBEXcHuJ82XY0yYFIWnLMjZv9vF/7DOq8djQ2n3Lk6+3qfSH8AqlmHlmi1MA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", "cpu": [ "arm" ], @@ -2591,9 +2641,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.9.5.tgz", - "integrity": "sha512-f14d7uhAMtsCGjAYwZGv6TwuS3IFaM4ZnGMUn3aCBgkcHAYErhV1Ad97WzBvS2o0aaDv4mVz+syiN0ElMyfBPg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", "cpu": [ "arm64" ], @@ -2604,9 +2654,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.9.5.tgz", - "integrity": "sha512-ndoXeLx455FffL68OIUrVr89Xu1WLzAG4n65R8roDlCoYiQcGGg6MALvs2Ap9zs7AHg8mpHtMpwC8jBBjZrT/w==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", "cpu": [ "arm64" ], @@ -2617,9 +2667,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.9.5.tgz", - "integrity": "sha512-UmElV1OY2m/1KEEqTlIjieKfVwRg0Zwg4PLgNf0s3glAHXBN99KLpw5A5lrSYCa1Kp63czTpVll2MAqbZYIHoA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", "cpu": [ "x64" ], @@ -2630,9 +2680,22 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.9.5.tgz", - "integrity": "sha512-Q0LcU61v92tQB6ae+udZvOyZ0wfpGojtAKrrpAaIqmJ7+psq4cMIhT/9lfV6UQIpeItnq/2QDROhNLo00lOD1g==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", "cpu": [ "arm" ], @@ -2643,9 +2706,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.9.5.tgz", - "integrity": "sha512-dkRscpM+RrR2Ee3eOQmRWFjmV/payHEOrjyq1VZegRUa5OrZJ2MAxBNs05bZuY0YCtpqETDy1Ix4i/hRqX98cA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", "cpu": [ "arm64" ], @@ -2656,9 +2719,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.9.5.tgz", - "integrity": "sha512-QaKFVOzzST2xzY4MAmiDmURagWLFh+zZtttuEnuNn19AiZ0T3fhPyjPPGwLNdiDT82ZE91hnfJsUiDwF9DClIQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", "cpu": [ "arm64" ], @@ -2668,10 +2731,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.9.5.tgz", - "integrity": "sha512-HeGqmRJuyVg6/X6MpE2ur7GbymBPS8Np0S/vQFHDmocfORT+Zt76qu+69NUoxXzGqVP1pzaY6QIi0FJWLC3OPA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", "cpu": [ "riscv64" ], @@ -2681,10 +2757,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", - "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", "cpu": [ "x64" ], @@ -2695,9 +2784,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.5.tgz", - "integrity": "sha512-ezyFUOwldYpj7AbkwyW9AJ203peub81CaAIVvckdkyH8EvhEIoKzaMFJj0G4qYJ5sw3BpqhFrsCc30t54HV8vg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", "cpu": [ "x64" ], @@ -2708,9 +2797,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.9.5.tgz", - "integrity": "sha512-aHSsMnUw+0UETB0Hlv7B/ZHOGY5bQdwMKJSzGfDfvyhnpmVxLMGnQPGNE9wgqkLUs3+gbG1Qx02S2LLfJ5GaRQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", "cpu": [ "arm64" ], @@ -2721,9 +2810,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.9.5.tgz", - "integrity": "sha512-AiqiLkb9KSf7Lj/o1U3SEP9Zn+5NuVKgFdRIZkvd4N0+bYrTOovVd0+LmYCPQGbocT4kvFyK+LXCDiXPBF3fyA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", "cpu": [ "ia32" ], @@ -2734,9 +2823,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.9.5.tgz", - "integrity": "sha512-1q+mykKE3Vot1kaFJIDoUFv5TuW+QQVaf2FmTT9krg86pQrGStOSJJ0Zil7CFagyxDuouTepzt5Y5TVzyajOdQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", "cpu": [ "x64" ], @@ -2756,32 +2845,46 @@ "source-map": "^0.6.0" } }, - "node_modules/@types/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@types/escape-html": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/escape-html/-/escape-html-1.0.4.tgz", "integrity": "sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==", "dev": true }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, - "node_modules/@types/less": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/less/-/less-3.0.6.tgz", - "integrity": "sha512-PecSzorDGdabF57OBeQO/xFbAkYWo88g4Xvnsx7LRwqLC17I7OoKtA3bQB9uXkY6UkMWCOsA8HSVpaoitscdXw==", - "dev": true + "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, + "peer": true }, "node_modules/@types/markdown-escape": { "version": "1.1.3", @@ -2790,9 +2893,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz", - "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==", + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2820,15 +2923,15 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/slug": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/slug/-/slug-5.0.7.tgz", - "integrity": "sha512-u5T21+PqfRpHszRWSv5gJYDIkm6lmYUXLjZVYvQyWNO9aC0zs+a11qqtbxbsNRiNLTmw0Xi+5NWK/Qz+JjaB9w==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@types/slug/-/slug-5.0.8.tgz", + "integrity": "sha512-mblTWR1OST257k1gZ3QvqG+ERSr8Ea6dyM1FH6Jtm4jeXi0/r0/95VNctofuiywPxCVQuE8AuFoqmvJ4iVUlXQ==", "dev": true }, "node_modules/@types/ua-parser-js": { @@ -2837,6 +2940,167 @@ "integrity": "sha512-P/oDfpofrdtF5xw433SPALpdSchtJmY7nsJItf8h3KXqOslkbySh8zq4dSWXH2oTjRvJ5PczVEoCZPow6GicLg==", "dev": true }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, "node_modules/@wessberg/stringutil": { "version": "1.0.19", "resolved": "https://registry.npmjs.org/@wessberg/stringutil/-/stringutil-1.0.19.tgz", @@ -2846,10 +3110,24 @@ "node": ">=8.0.0" } }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2858,15 +3136,55 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-walk": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.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, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -2876,6 +3194,18 @@ "node": ">=6" } }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -2911,64 +3241,39 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", - "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.5.0", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", - "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4", - "core-js-compat": "^3.33.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", + "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", - "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.5.0" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -2981,12 +3286,15 @@ "dev": true }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "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/blake3-wasm": { @@ -3005,21 +3313,21 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "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.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "dev": true, "funding": [ { @@ -3036,10 +3344,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" + "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" @@ -3076,26 +3384,11 @@ "url": "https://github.com/wessberg/browserslist-generator?sponsor=1" } }, - "node_modules/browserslist-generator/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/browserslist-generator/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -3103,12 +3396,6 @@ "node": ">=10" } }, - "node_modules/browserslist-generator/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3128,9 +3415,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001578", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001578.tgz", - "integrity": "sha512-J/jkFgsQ3NEl4w2lCoM9ZPxrD+FoBNJ7uJUpGVjIg/j0OwJosWM36EPDv+Yyi0V4twBk9pPmlFS+PLykgEvUmg==", + "version": "1.0.30001639", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz", + "integrity": "sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==", "dev": true, "funding": [ { @@ -3171,32 +3458,17 @@ "node": ">=4" } }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/change-case": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.2.tgz", - "integrity": "sha512-WB3UiTDpT+vrTilAWaJS4gaIH/jc1He4H9f6erQvraUYas90uWT0JOYFkG1imdNv710XJ6gJvqynrgOHc4ihDA==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", "dev": true }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3209,10 +3481,23 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -3225,15 +3510,6 @@ "node": ">= 10.0" } }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/collapse-white-space": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", @@ -3285,6 +3561,15 @@ "typescript": ">=3.x || >= 4.x || >= 5.x" } }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3300,29 +3585,31 @@ "node": ">= 0.6" } }, - "node_modules/copy-anything": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", - "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "node_modules/core-js-compat": { + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "dependencies": { - "is-what": "^3.14.1" + "browserslist": "^4.23.0" }, "funding": { - "url": "https://github.com/sponsors/mesqueeb" + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.0.tgz", - "integrity": "sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==", + "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": { - "browserslist": "^4.22.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" + "engines": { + "node": ">= 8" } }, "node_modules/crosspath": { @@ -3349,10 +3636,20 @@ "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", "dev": true }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -3375,6 +3672,12 @@ "node": ">=0.10.0" } }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "dev": true + }, "node_modules/discord-snowflake": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/discord-snowflake/-/discord-snowflake-2.0.0.tgz", @@ -3383,29 +3686,48 @@ "node": ">=18" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/electron-to-chromium": { - "version": "1.4.637", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.637.tgz", - "integrity": "sha512-G7j3UCOukFtxVO1vWrPQUoDk3kL70mtvjc/DC/k2o7lE0wAdq+Vwp1ipagOow+BH0uVztFysLWbkM/RTIrbK3w==", + "version": "1.4.815", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.815.tgz", + "integrity": "sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, - "node_modules/errno": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", - "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "node_modules/enhanced-resolve": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dev": true, - "optional": true, "dependencies": { - "prr": "~1.0.1" + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" }, - "bin": { - "errno": "cli.js" + "engines": { + "node": ">=10.13.0" } }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "peer": true + }, "node_modules/esbuild": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, "bin": { @@ -3415,34 +3737,35 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "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" @@ -3454,21 +3777,65 @@ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "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==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": ">=10" + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" } }, "node_modules/estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, "node_modules/esutils": { @@ -3485,6 +3852,16 @@ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/exit-hook": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", @@ -3503,10 +3880,17 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "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, + "peer": true + }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "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" @@ -3515,11 +3899,65 @@ "node": ">=8" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } }, "node_modules/fsevents": { "version": "2.3.3", @@ -3563,19 +4001,10 @@ "source-map": "^0.6.1" } }, - "node_modules/get-source/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/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -3585,19 +4014,23 @@ } }, "node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3634,8 +4067,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "optional": true + "dev": true }, "node_modules/has-flag": { "version": "3.0.0", @@ -3647,9 +4079,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "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" @@ -3667,48 +4099,6 @@ "node": ">=10.0.0" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/image-size": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", - "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", - "dev": true, - "optional": true, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3737,12 +4127,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3757,6 +4150,15 @@ "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-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3793,12 +4195,6 @@ "@types/estree": "*" } }, - "node_modules/is-what": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", - "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", - "dev": true - }, "node_modules/isbot": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/isbot/-/isbot-3.8.0.tgz", @@ -3808,10 +4204,75 @@ "node": ">=12" } }, + "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/itty-router": { - "version": "4.0.26", - "resolved": "https://registry.npmjs.org/itty-router/-/itty-router-4.0.26.tgz", - "integrity": "sha512-GBcmhxQRvIQ7fuzXPlvfeQcN6O7VGhctzdG9WHIcEcaRYH4FvDpMxuSWRIAxQrIM+nxtfxK0/bR78ATvb4LC5Q==" + "version": "5.0.17", + "resolved": "https://registry.npmjs.org/itty-router/-/itty-router-5.0.17.tgz", + "integrity": "sha512-ZHnPI0OOyTTLuNp2FdciejYaK4Wl3ZV3O0yEm8njOGggh/k/ek3BL7X2I5YsCOfc5vLhIJgj3Z4pUtLs6k9Ucg==" + }, + "node_modules/jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/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, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } }, "node_modules/js-tokens": { "version": "4.0.0", @@ -3831,6 +4292,20 @@ "node": ">=4" } }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": 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, + "peer": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -3843,53 +4318,48 @@ "node": ">=6" } }, - "node_modules/less": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz", - "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "node_modules/jsoncrush": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/jsoncrush/-/jsoncrush-1.1.8.tgz", + "integrity": "sha512-lvIMGzMUA0fjuqwNcxlTNRq2bibPZ9auqT/LyGdlR5hvydJtA/BasSgkx4qclqTKVeTidrJvsS/oVjlTCPQ4Nw==" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "dependencies": { - "copy-anything": "^2.0.1", - "parse-node-version": "^1.0.1", - "tslib": "^2.3.0" - }, - "bin": { - "lessc": "bin/lessc" - }, - "engines": { - "node": ">=6" + "universalify": "^2.0.0" }, "optionalDependencies": { - "errno": "^0.1.1", - "graceful-fs": "^4.1.2", - "image-size": "~0.5.0", - "make-dir": "^2.1.0", - "mime": "^1.4.1", - "needle": "^3.1.0", - "source-map": "~0.6.0" + "graceful-fs": "^4.1.6" } }, - "node_modules/less/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, - "optional": true, - "bin": { - "mime": "cli.js" - }, + "peer": true, "engines": { - "node": ">=4" + "node": ">=6.11.5" } }, - "node_modules/less/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==", + "node_modules/locale-includes": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/locale-includes/-/locale-includes-1.0.6.tgz", + "integrity": "sha512-k6icyYfzbmV12fAnKh5A3qJo0X0RuPA4yIrEeJ2EwLdbNLilXUH6/u+fhe0JhBUb0KQvP29O9rhEPFSZK6bEiQ==" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "optional": true, + "dependencies": { + "p-locate": "^4.1.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/lodash.debounce": { @@ -3913,26 +4383,27 @@ } }, "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", "dev": true, "dependencies": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.15" } }, "node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "optional": true, "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/markdown-escape": { @@ -3940,6 +4411,26 @@ "resolved": "https://registry.npmjs.org/markdown-escape/-/markdown-escape-2.0.0.tgz", "integrity": "sha512-Trz4v0+XWlwy68LJIyw3bLbsJiC8XAbRCKF9DbEtZjyndKOGVx6n+wNB0VfoRmY2LKboQLeniap3xrb6LGSJ8A==" }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "peer": true + }, + "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/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -3952,24 +4443,47 @@ "node": ">=10.0.0" } }, - "node_modules/miniflare": { - "version": "3.20231218.1", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20231218.1.tgz", - "integrity": "sha512-rl/wADgaRLpbl7EMobwbAt6BgVqkOoWsVQJAliIIUCRzC0s0xg7ZVeoV+DuQD4ffN4RySXsPnP97hp7ksc7ylA==", + "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, - "dependencies": { - "@cspotcode/source-map-support": "0.8.1", - "acorn": "^8.8.0", - "acorn-walk": "^8.2.0", + "peer": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "peer": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/miniflare": { + "version": "3.20240620.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-3.20240620.0.tgz", + "integrity": "sha512-NBMzqUE2mMlh/hIdt6U5MP+aFhEjKDq3l8CAajXAQa1WkndJdciWvzB2mfLETwoVFhMl/lphaVzyEN2AgwJpbQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "0.8.1", + "acorn": "^8.8.0", + "acorn-walk": "^8.2.0", "capnp-ts": "^0.7.0", "exit-hook": "^2.2.1", "glob-to-regexp": "^0.4.1", "stoppable": "^1.1.0", - "undici": "^5.22.1", - "workerd": "1.20231218.0", - "ws": "^8.11.0", + "undici": "^5.28.4", + "workerd": "1.20240620.1", + "ws": "^8.14.2", "youch": "^3.2.2", - "zod": "^3.20.6" + "zod": "^3.22.3" }, "bin": { "miniflare": "bootstrap.js" @@ -3979,15 +4493,27 @@ } }, "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "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": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/ms": { @@ -4023,22 +4549,18 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/needle": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", - "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", + "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, - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.3", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } + "peer": true + }, + "node_modules/node-fetch-native": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", + "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", + "dev": true }, "node_modules/node-forge": { "version": "1.3.1", @@ -4073,22 +4595,64 @@ "node": ">= 10.12.0" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "wrappy": "1" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "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": ">= 0.10" + "node": ">=8" } }, "node_modules/path-parse": { @@ -4097,16 +4661,47 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.2.tgz", + "integrity": "sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==", + "dev": true + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -4121,67 +4716,59 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "optional": true, + "dependencies": { + "find-up": "^4.0.0" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/preact": { - "version": "10.19.6", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.19.6.tgz", - "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==", + "version": "10.22.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.0.tgz", + "integrity": "sha512-RRurnSjJPj4rp5K6XoP45Ui33ncb7e4H7WiOHVpjbkvqvA3U+N8Z6Qbo0AE6leGYBV66n8EhEaFixvIu3SkxFw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/preact" } }, "node_modules/preact-iso": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/preact-iso/-/preact-iso-2.4.0.tgz", - "integrity": "sha512-m/xT9oTvNRZ4K/C05Ha91HdT8OPZCjf6Rs4y9arTALYYb1O1qfmygaJHXzkXFVkpDItHnpXMcisiwLn7CsZoLg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/preact-iso/-/preact-iso-2.6.3.tgz", + "integrity": "sha512-2JqNi+Elyt7rf0kULtMn/QskbZE10cDMrhmoanGKWJX3gOCTIfLt/ta5xWu+kQUsyInPkTQIVp3fS5Im0V+X8A==", "peerDependencies": { "preact": ">=10", - "preact-render-to-string": ">=5" - }, - "peerDependenciesMeta": { - "preact-render-to-string": { - "optional": true - } + "preact-render-to-string": ">=6.4.0" } }, "node_modules/preact-render-to-string": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.4.0.tgz", - "integrity": "sha512-pzDwezZaLbK371OiJjXDsZJwVOALzFX5M1wEh2Kr0pEApq5AV6bRH/DFbA/zNA7Lck/duyREPQLLvzu2G6hEQQ==", - "dependencies": { - "pretty-format": "^3.8.0" - }, + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-6.5.5.tgz", + "integrity": "sha512-KiMFTKNTmT/ccE79BURR/r6XRc2I2TCTZ0MpeWqHW2XnllbeghXvwGsdAfF/MzMilUcTfODtSmMxgoRFL9TM5g==", "peerDependencies": { "preact": ">=10" } }, - "node_modules/pretty-format": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-3.8.0.tgz", - "integrity": "sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==" - }, "node_modules/printable-characters": { "version": "1.0.42", "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", "dev": true }, - "node_modules/prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "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, - "optional": true + "peer": true, + "engines": { + "node": ">=6" + } }, "node_modules/randombytes": { "version": "2.1.0", @@ -4311,9 +4898,9 @@ } }, "node_modules/rollup": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.5.tgz", - "integrity": "sha512-E4vQW0H/mbNMw2yLSqJyjtkHY9dslf/p0zuT1xehNRqUTBOFMqEjguDvqhXr7N7r/4ttb2jr4T41d3dncmIgbQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -4326,19 +4913,22 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.9.5", - "@rollup/rollup-android-arm64": "4.9.5", - "@rollup/rollup-darwin-arm64": "4.9.5", - "@rollup/rollup-darwin-x64": "4.9.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.9.5", - "@rollup/rollup-linux-arm64-gnu": "4.9.5", - "@rollup/rollup-linux-arm64-musl": "4.9.5", - "@rollup/rollup-linux-riscv64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-gnu": "4.9.5", - "@rollup/rollup-linux-x64-musl": "4.9.5", - "@rollup/rollup-win32-arm64-msvc": "4.9.5", - "@rollup/rollup-win32-ia32-msvc": "4.9.5", - "@rollup/rollup-win32-x64-msvc": "4.9.5", + "@rollup/rollup-android-arm-eabi": "4.18.0", + "@rollup/rollup-android-arm64": "4.18.0", + "@rollup/rollup-darwin-arm64": "4.18.0", + "@rollup/rollup-darwin-x64": "4.18.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", + "@rollup/rollup-linux-arm-musleabihf": "4.18.0", + "@rollup/rollup-linux-arm64-gnu": "4.18.0", + "@rollup/rollup-linux-arm64-musl": "4.18.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", + "@rollup/rollup-linux-riscv64-gnu": "4.18.0", + "@rollup/rollup-linux-s390x-gnu": "4.18.0", + "@rollup/rollup-linux-x64-gnu": "4.18.0", + "@rollup/rollup-linux-x64-musl": "4.18.0", + "@rollup/rollup-win32-arm64-msvc": "4.18.0", + "@rollup/rollup-win32-ia32-msvc": "4.18.0", + "@rollup/rollup-win32-x64-msvc": "4.18.0", "fsevents": "~2.3.2" } }, @@ -4354,6 +4944,21 @@ "rollup-pluginutils": "^2.8.1" } }, + "node_modules/rollup-plugin-inject/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/rollup-plugin-inject/node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/rollup-plugin-node-polyfills": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", @@ -4425,16 +5030,46 @@ } } }, - "node_modules/rollup-plugin-ts/node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "node_modules/rollup-plugin-typescript2": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.36.0.tgz", + "integrity": "sha512-NB2CSQDxSe9+Oe2ahZbf+B4bh7pHwjV5L+RSYpCu7Q5ROuN94F9b6ioWwKfz3ueL3KTtmX4o2MUH2cgHDIEUsw==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" + "@rollup/pluginutils": "^4.1.2", + "find-cache-dir": "^3.3.2", + "fs-extra": "^10.0.0", + "semver": "^7.5.4", + "tslib": "^2.6.2" + }, + "peerDependencies": { + "rollup": ">=1.26.3", + "typescript": ">=2.4.0" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" }, "engines": { - "node": ">=12" + "node": ">= 8.0.0" + } + }, + "node_modules/rollup-plugin-typescript2/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/rollup-pluginutils": { @@ -4446,6 +5081,12 @@ "estree-walker": "^0.6.1" } }, + "node_modules/rollup-pluginutils/node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4466,19 +5107,24 @@ } ] }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "optional": true - }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, - "optional": true + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } }, "node_modules/selfsigned": { "version": "2.4.1", @@ -4494,13 +5140,12 @@ } }, "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "optional": true, "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" } }, "node_modules/serialize-javascript": { @@ -4512,15 +5157,48 @@ "randombytes": "^2.1.0" } }, + "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/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/slash-create": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/slash-create/-/slash-create-6.0.2.tgz", - "integrity": "sha512-V2gqs7Ov3C8hjS2aODwzGUM/4WqpRiNXSPh69Bk3soyL7Kvkc/75HfwOgz9fTNNU+H/u5EMtvjR4hJgey0HKHA==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/slash-create/-/slash-create-6.1.4.tgz", + "integrity": "sha512-UxTIsGPDu0HfWLZsOPUQSe4kr8/C80bsFM0C9HuYzZsaFLxRxSV6hhhv5m+Oc+QqOCcOB7D9IZxtE9LM/9cawQ==", "dependencies": { "eventemitter3": "^5.0.1", "lodash.isequal": "^4.5.0", "tweetnacl": "^1.0.3", - "undici": "^5.28.2" + "undici": "^5.28.4" }, "engines": { "node": ">=16" @@ -4550,11 +5228,20 @@ } }, "node_modules/smob": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.1.tgz", - "integrity": "sha512-9LK+E7Hv5R9u4g4C3p+jjLstaLe11MDsL21UpYaCNmapvMkYhqCV4A/f/3gyH8QjMyh6l68q9xC85vihY9ahMQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", + "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==", "dev": true }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -4565,15 +5252,6 @@ "source-map": "^0.6.0" } }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", @@ -4601,6 +5279,102 @@ "npm": ">=6" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width-cjs/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-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "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-ansi-cjs/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/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -4625,10 +5399,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -4643,7 +5426,42 @@ "node": ">=10" } }, - "node_modules/to-fast-properties": { + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", @@ -4683,35 +5501,463 @@ "typescript": "^3.x || ^4.x || ^5.x" } }, + "node_modules/ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/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/ts-loader/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ts-loader/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/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true }, "node_modules/tsx": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", - "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.16.0.tgz", + "integrity": "sha512-MPgN+CuY+4iKxGoJNPv+1pyo5YWZAQ5XfsyobUG+zoKG7IkvCPLZDEyoIb8yLS2FcWci1nlxAqmvPlFWD5AFiQ==", "dev": true, "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" + "esbuild": "~0.21.5", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/typescript": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz", + "integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/ufo": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "dev": true + }, + "node_modules/undici": { + "version": "5.28.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", + "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", + "dependencies": { + "@fastify/busboy": "^2.0.0" + }, + "engines": { + "node": ">=14.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/unenv": { + "name": "unenv-nightly", + "version": "1.10.0-1717606461.a117952", + "resolved": "https://registry.npmjs.org/unenv-nightly/-/unenv-nightly-1.10.0-1717606461.a117952.tgz", + "integrity": "sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==", + "dev": true, + "dependencies": { + "consola": "^3.2.3", + "defu": "^6.1.4", + "mime": "^3.0.0", + "node-fetch-native": "^1.6.4", + "pathe": "^1.1.2", + "ufo": "^1.5.3" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.92.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz", + "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workerd": { + "version": "1.20240620.1", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20240620.1.tgz", + "integrity": "sha512-Qoq+RrFNk4pvEO+kpJVn8uJ5TRE9YJx5jX5pC5LjdKlw1XeD8EdXt5k0TbByvWunZ4qgYIcF9lnVxhcDFo203g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "workerd": "bin/workerd" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20240620.1", + "@cloudflare/workerd-darwin-arm64": "1.20240620.1", + "@cloudflare/workerd-linux-64": "1.20240620.1", + "@cloudflare/workerd-linux-arm64": "1.20240620.1", + "@cloudflare/workerd-windows-64": "1.20240620.1" + } + }, + "node_modules/wrangler": { + "version": "3.62.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.62.0.tgz", + "integrity": "sha512-TM1Bd8+GzxFw/JzwsC3i/Oss4LTWvIEWXXo1vZhx+7PHcsxdbnQGBBwPurHNJDSu2Pw22+2pCZiUGKexmgJksw==", + "dev": true, + "dependencies": { + "@cloudflare/kv-asset-handler": "0.3.4", + "@esbuild-plugins/node-globals-polyfill": "^0.2.3", + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", + "blake3-wasm": "^2.1.5", + "chokidar": "^3.5.3", + "date-fns": "^3.6.0", + "esbuild": "0.17.19", + "miniflare": "3.20240620.0", + "nanoid": "^3.3.3", + "path-to-regexp": "^6.2.0", + "resolve": "^1.22.8", + "resolve.exports": "^2.0.2", + "selfsigned": "^2.0.1", + "source-map": "^0.6.1", + "unenv": "npm:unenv-nightly@1.10.0-1717606461.a117952", + "xxhash-wasm": "^1.0.1" }, "bin": { - "tsx": "dist/cli.mjs" + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.17.0" }, "optionalDependencies": { - "fsevents": "~2.3.3" + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20240620.0" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } } }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "node_modules/wrangler/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", "cpu": [ "arm" ], @@ -4724,10 +5970,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "node_modules/wrangler/node_modules/@esbuild/android-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", "cpu": [ "arm64" ], @@ -4740,10 +5986,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "node_modules/wrangler/node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", "cpu": [ "x64" ], @@ -4756,10 +6002,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", "cpu": [ "arm64" ], @@ -4772,10 +6018,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", "cpu": [ "x64" ], @@ -4788,10 +6034,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", "cpu": [ "arm64" ], @@ -4804,10 +6050,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", "cpu": [ "x64" ], @@ -4820,10 +6066,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "node_modules/wrangler/node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", "cpu": [ "arm" ], @@ -4836,10 +6082,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", "cpu": [ "arm64" ], @@ -4852,10 +6098,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", "cpu": [ "ia32" ], @@ -4868,10 +6114,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", "cpu": [ "loong64" ], @@ -4884,10 +6130,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", "cpu": [ "mips64el" ], @@ -4900,10 +6146,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", "cpu": [ "ppc64" ], @@ -4916,10 +6162,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", "cpu": [ "riscv64" ], @@ -4932,10 +6178,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", "cpu": [ "s390x" ], @@ -4948,10 +6194,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "node_modules/wrangler/node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", "cpu": [ "x64" ], @@ -4964,10 +6210,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", "cpu": [ "x64" ], @@ -4980,10 +6226,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", "cpu": [ "x64" ], @@ -4996,10 +6242,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", "cpu": [ "x64" ], @@ -5012,10 +6258,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", "cpu": [ "arm64" ], @@ -5028,10 +6274,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", "cpu": [ "ia32" ], @@ -5044,10 +6290,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "node_modules/wrangler/node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", "cpu": [ "x64" ], @@ -5060,10 +6306,10 @@ "node": ">=12" } }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "node_modules/wrangler/node_modules/esbuild": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "hasInstallScript": true, "bin": { @@ -5073,230 +6319,155 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" } }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=14.17" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/ua-parser-js": { - "version": "1.0.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz", - "integrity": "sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ==", + "node_modules/wrap-ansi-cjs": { + "name": "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, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/ua-parser-js" - }, - { - "type": "paypal", - "url": "https://paypal.me/faisalman" - }, - { - "type": "github", - "url": "https://github.com/sponsors/faisalman" - } - ], - "engines": { - "node": "*" - } - }, - "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", "dependencies": { - "@fastify/busboy": "^2.0.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=14.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "node_modules/wrap-ansi-cjs/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": ">=4" + "node": ">=8" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "node_modules/wrap-ansi-cjs/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": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "node_modules/wrap-ansi-cjs/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": ">=4" + "node": ">=7.0.0" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } + "node_modules/wrap-ansi-cjs/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/workerd": { - "version": "1.20231218.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20231218.0.tgz", - "integrity": "sha512-AGIsDvqCrcwhoA9kb1hxOhVAe53/xJeaGZxL4FbYI9FvO17DZwrnqGq+6eqItJ6Cfw1ZLmf3BM+QdMWaL2bFWQ==", + "node_modules/wrap-ansi-cjs/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, - "hasInstallScript": true, - "bin": { - "workerd": "bin/workerd" + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=16" - }, - "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20231218.0", - "@cloudflare/workerd-darwin-arm64": "1.20231218.0", - "@cloudflare/workerd-linux-64": "1.20231218.0", - "@cloudflare/workerd-linux-arm64": "1.20231218.0", - "@cloudflare/workerd-windows-64": "1.20231218.0" + "node": ">=8" } }, - "node_modules/wrangler": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-3.22.3.tgz", - "integrity": "sha512-EhGEQLoMcQm71v6XrtnKfMG2B8BTM7RxhoS9iWIkc1hc3l9cOWyoN0cJnoBqcGTgtQk5V7+cRECTfwh08IEjBQ==", + "node_modules/wrap-ansi-cjs/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": { - "@cloudflare/kv-asset-handler": "^0.2.0", - "@cspotcode/source-map-support": "0.8.1", - "@esbuild-plugins/node-globals-polyfill": "^0.2.3", - "@esbuild-plugins/node-modules-polyfill": "^0.2.2", - "blake3-wasm": "^2.1.5", - "chokidar": "^3.5.3", - "esbuild": "0.17.19", - "miniflare": "3.20231218.1", - "nanoid": "^3.3.3", - "path-to-regexp": "^6.2.0", - "resolve.exports": "^2.0.2", - "selfsigned": "^2.0.1", - "source-map": "0.6.1", - "xxhash-wasm": "^1.0.1" - }, - "bin": { - "wrangler": "bin/wrangler.js", - "wrangler2": "bin/wrangler.js" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=16.17.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=8" } }, - "node_modules/wrangler/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==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, "node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" @@ -5338,9 +6509,9 @@ } }, "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", "dev": true, "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/package.json b/package.json index 2b3ea98..50ab15a 100644 --- a/package.json +++ b/package.json @@ -9,37 +9,40 @@ "start": "wrangler dev", "generate": "tsx src/build/bundle-client.ts" }, + "type": "module", "devDependencies": { "@babel/core": "^7.23.7", "@babel/plugin-transform-runtime": "^7.23.7", "@babel/preset-env": "^7.23.8", + "@babel/preset-react": "^7.24.7", "@babel/preset-typescript": "^7.23.3", "@babel/runtime": "^7.23.8", "@cloudflare/workers-types": "^4.20231218.0", - "@rollup/plugin-babel": "^6.0.4", - "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-commonjs": "^26.0.1", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", "@types/clean-css": "^4.2.11", "@types/escape-html": "^1.0.4", - "@types/less": "^3.0.6", "@types/markdown-escape": "^1.1.3", "@types/slug": "^5.0.7", "change-case": "^5.4.2", "clean-css": "^5.3.3", "fast-deep-equal": "^3.1.3", - "less": "^4.2.0", - "rollup": "^4.9.5", + "rollup": "^4.18.0", "rollup-plugin-ts": "^3.4.5", - "tsx": "^4.7.0", - "typescript": "^5.0.4", + "rollup-plugin-typescript2": "^0.36.0", + "ts-loader": "^9.5.1", + "tsx": "^4.16.0", + "typescript": "^5.5.2", "wrangler": "^3.0.0" }, "dependencies": { "collapse-white-space": "^2.1.0", "discord-snowflake": "^2.0.0", "escape-html": "^1.0.3", - "itty-router": "^4.0.26", + "itty-router": "^5.0.17", + "jsoncrush": "^1.1.8", + "locale-includes": "^1.0.6", "markdown-escape": "^2.0.0", "preact": "^10.19.6", "preact-iso": "^2.4.0", diff --git a/slot-gray.jpg b/slot-gray.jpg new file mode 100644 index 0000000..a4bca37 Binary files /dev/null and b/slot-gray.jpg differ diff --git a/slot.jpg b/slot.jpg new file mode 100644 index 0000000..4e7635b Binary files /dev/null and b/slot.jpg differ diff --git a/src/build/bundle-client-with-source-map.ts b/src/build/bundle-client-with-source-map.ts index 7cdfad1..e44082e 100644 --- a/src/build/bundle-client-with-source-map.ts +++ b/src/build/bundle-client-with-source-map.ts @@ -1,15 +1,20 @@ -import { DEFAULT_IN_PATH, DEFAULT_OUT_PATH, getBundle, writeBundle } from './bundler'; +import { getBundle, writeBundle } from './bundler.js'; -async function main(inPath: string = DEFAULT_IN_PATH, outPath: string = DEFAULT_OUT_PATH) { +async function main(inPath: string, outPath: string) { const bundle = await getBundle(inPath) await writeBundle(bundle, outPath, true) } -main(...process.argv.slice(2)).then(() => { +const args = process.argv.slice(2) +if (args.length !== 2) { + console.error('need exactly two arguments: inPath and outPath') + throw Error("invalid arguments") +} +main(args[0], args[1]).then(() => { console.info('generated client helpers'); }).catch((err) => { console.error('could not generate client helpers'); - console.error(err && 'stack' in err ? err.stack : err); + console.error(err) throw err; }).catch(() => { process.exit(1); diff --git a/src/build/bundler.ts b/src/build/bundler.ts index aa25d99..f8ec108 100644 --- a/src/build/bundler.ts +++ b/src/build/bundler.ts @@ -9,22 +9,20 @@ import { type VariableDeclaration, type VariableStatement } from 'typescript'; -import typescriptModule from 'typescript'; -import { readFile, writeFile, readdir } from 'node:fs/promises'; -import { basename, dirname, join, normalize } from 'node:path'; +import { writeFile, readdir } from 'node:fs/promises'; +import { basename, join } from 'node:path'; import {createHash} from 'node:crypto'; import {camelCase} from 'change-case'; -import { render as renderLess } from 'less'; -import CleanCSS from 'clean-css'; +import { default as CleanCSS } from 'clean-css'; import type { HashedBundled, SourceMappedHashedBundled, SourceMappedBundled, Bundled, MaybeSourceMappedHashedBundled, SourceMap -} from '../common/bundle'; +} from '../common/bundle.js'; import { rollup, type RollupCache } from 'rollup'; -import typescript from 'rollup-plugin-ts'; +import typescript from 'rollup-plugin-typescript2'; import terser from '@rollup/plugin-terser'; import nodeResolve from '@rollup/plugin-node-resolve'; import commonJs from '@rollup/plugin-commonjs'; @@ -74,17 +72,7 @@ function exportObjectLiteral(identifier: string, pairs: Iterable<[string, MaybeS } async function processLess(atPath: string): Promise { - const fileBase = basename(atPath.substring(0, atPath.length - LESS_SUFFIX.length)); - const { css: lessCss, map: lessMap } = await renderLess(await readFile(atPath, { encoding: 'utf-8' }), { - paths: [dirname(atPath)], - math: 'strict', - strictUnits: true, - filename: fileBase + '.less', - strictImports: true, - sourceMap: { - outputSourceFiles: true, - } - }); + const fileBase = basename(atPath.substring(0, atPath.length - CSS_SUFFIX.length)); const { styles, sourceMap } = await new CleanCSS({ sourceMap: true, sourceMapInlineSources: true, @@ -94,15 +82,10 @@ async function processLess(atPath: string): Promise { inline: ['all'], rebase: false, compatibility: '*', - fetch(uri): never { - throw Error(`external files are unexpected after less compilation, but found ${uri}`) + fetch(url: string) { + throw Error(`external files are unexpected, but found ${url}`) }, - }).minify({ - [fileBase + '.css']: { - styles: lessCss, - sourceMap: lessMap - } - }) + }).minify([atPath]) return { bundled: styles, sourceMap: {...JSON.parse(sourceMap!.toString()), file: fileBase + ".css"} as SourceMap }; } @@ -111,16 +94,12 @@ async function processTypescript(atPath: string, inDir: string, cache?: RollupCa cache: cache ?? true, input: atPath, plugins: [ - nodeResolve({ - }), - commonJs({ - }), + nodeResolve({}), + commonJs({}), typescript({ - transpiler: "babel", - typescript: typescriptModule, - tsconfig: join(inDir, 'tsconfig.json') + tsconfig: join(inDir, '..', 'tsconfig.json'), }), - terser({}) + terser({}), ] }) const {output: [chunk]} = await build.generate({ @@ -139,7 +118,7 @@ async function processTypescript(atPath: string, inDir: string, cache?: RollupCa } } -const LESS_SUFFIX = '-entrypoint.less'; +const CSS_SUFFIX = '-entrypoint.css'; const TS_SUFFIX = '-entrypoint.ts'; function hashBundled(value: T & {readonly hash?: never}): T & HashedBundled { @@ -159,8 +138,8 @@ export async function getBundle(inDir: string): Promise<{ css: Map, js: Map}, outFile: string, includeSourceMap: true): Promise export async function writeBundle({ css, js }: {css: Map, js: Map}, outFile: string, includeSourceMap: false): Promise export async function writeBundle({ css, js }: {css: Map, js: Map}, outFile: string, includeSourceMap: boolean): Promise @@ -196,7 +172,7 @@ export async function writeBundle({ css, js }: {css: Map { +const args = process.argv.slice(2) +if (args.length !== 2) { + console.error('need exactly two arguments: inPath and outPath') + throw Error("invalid arguments") +} +main(args[0], args[1]).then(() => { console.info('generated client helpers and confirmed sourcemaps are present'); }).catch((err) => { console.error('could not generate client helpers or confirm sourcemaps are present'); diff --git a/src/build/tsconfig.json b/src/build/tsconfig.json index a517fe7..e81ba3e 100644 --- a/src/build/tsconfig.json +++ b/src/build/tsconfig.json @@ -1,16 +1,19 @@ { "compilerOptions": { - "module": "commonjs", + "module": "ESNext", "esModuleInterop": true, - "allowSyntheticDefaultImports": true, "target": "ESNext", + "strict": true, "noEmit": true, "noImplicitAny": true, - "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "allowJs": true, + "moduleResolution": "Bundler", "sourceMap": true, - "baseUrl": "./" + "baseUrl": "./", + "importsNotUsedAsValues": "remove", }, "include": [ - "*" + "./*" ] } diff --git a/src/client/combined-generator-responses-entrypoint-old.ts b/src/client/combined-generator-responses-entrypoint-old.ts deleted file mode 100644 index bab94dd..0000000 --- a/src/client/combined-generator-responses-entrypoint-old.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {responseLists, db} from './responses-entrypoint-old' -import {prepareGenerator} from './generator-entrypoint-old' - -Promise.all([prepareGenerator(db), responseLists]).then(([gen, res]) => { - res.addSelectionListener((ev) => { - gen.setActiveResult(ev.detail, true) - }) - gen.addRerollListener((ev) => { - for (const result of ev.detail.changedResults) { - res.setActiveElementForTable(result) - } - }) - console.info("connected generator and response list") -}).catch((e) => { - console.error(e) -}) - -function updateHash(): void { - if (location.hash === "" || location.hash === "#" || !location.hash) { - location.replace("#generator") - } -} - -window.addEventListener("hashchange", updateHash) -updateHash() diff --git a/src/client/combined-generator-responses-entrypoint.css b/src/client/combined-generator-responses-entrypoint.css new file mode 100644 index 0000000..61cf3f1 --- /dev/null +++ b/src/client/combined-generator-responses-entrypoint.css @@ -0,0 +1,9 @@ +@import "../common/client/MainGeneratorAndResponses.css"; + +#generator:not(:target) { + display: none; +} + +#generator:target ~ #responses { + display: none; +} diff --git a/src/client/combined-generator-responses-entrypoint.less b/src/client/combined-generator-responses-entrypoint.less deleted file mode 100644 index 1328793..0000000 --- a/src/client/combined-generator-responses-entrypoint.less +++ /dev/null @@ -1,12 +0,0 @@ -@import "../common/client/GeneratorPage"; -@import "../common/client/ResponsesPage"; -@import "../common/client/Page"; -@import "../common/client/PageFooter"; - -#generator:not(:target) { - display: none; -} - -#generator:target ~ #responses { - display: none; -} diff --git a/src/client/combined-generator-responses-entrypoint.ts b/src/client/combined-generator-responses-entrypoint.ts new file mode 100644 index 0000000..ce8ec74 --- /dev/null +++ b/src/client/combined-generator-responses-entrypoint.ts @@ -0,0 +1,15 @@ +import { DOMLoaded } from './onload.js'; +import { createElement, hydrate } from 'preact'; +import { + MainGeneratorAndResponses, + type MainGeneratorAndResponsesProps, reconstituteMainGeneratorAndResponses +} from '../common/client/MainGeneratorAndResponses.js'; + +DOMLoaded.then(() => { + const props: MainGeneratorAndResponsesProps = { + ...reconstituteMainGeneratorAndResponses(document.querySelector("div#mainGeneratorAndResponses")!), + } + hydrate(createElement(MainGeneratorAndResponses, props), document.body) +}).catch((ex) => { + console.error(ex) +}) diff --git a/src/client/generator-entrypoint-old.ts b/src/client/generator-entrypoint-old.ts deleted file mode 100644 index db26757..0000000 --- a/src/client/generator-entrypoint-old.ts +++ /dev/null @@ -1,294 +0,0 @@ -import { - ExportFormat, - exportScenario, - type GeneratedState, - generatedStateToString, - getResultFrom, - RolledValues, - rollOn, - RollSelections, - type RollTable, - RollTableDatabase, - type RollTableDetailsAndResults, - type RollTableResult, - type RollTableResultFull -} from '../common/rolltable'; -import { buildGenerated, htmlTableIdentifier } from '../common/template'; -import { DOMLoaded } from './onload'; -import { scrapeGeneratedScenario } from './scraper'; -import { showPopup } from './Popup'; -import { pulseElement } from './pulse'; -import { DOMTemplateBuilder } from './template'; -import escapeHTML from 'escape-html'; - -export interface RerollEventDetail { - rerolledAll: boolean - changedResults: Iterable> - fullResults: ReadonlyMap - selections: ReadonlySet -} - -export class Generator { - readonly generator: HTMLElement; - readonly scenario: HTMLUListElement; - readonly copyButtons: HTMLElement; - readonly rollButtons: HTMLElement; - readonly db: RollTableDatabase | undefined; - private readonly rolled = new RolledValues(); - private readonly selected = new RollSelections(); - - get state(): GeneratedState { - return { - final: false, - rolled: this.rolled, - selected: this.selected, - } - } - - getTableWithHtmlId(id: string, prefix?: string): RollTable | undefined { - return Array.from(this.rolled.keys()).find(t => id === ((prefix ?? '') + htmlTableIdentifier(t))); - } - - selectAll(): this { - for (const check of this.scenario.querySelectorAll('input[type=checkbox]:not(:checked)') as Iterable) { - check.checked = true; - check.dispatchEvent<"change">(new Event("change", {cancelable: true, bubbles: true, composed: false})) - const table = this.getTableWithHtmlId(check.id, 'selected-'); - if (table) { - this.selected.add(table); - } - } - return this - } - - selectNone(): this { - this.selected.clear(); - for (const check of this.scenario.querySelectorAll('input[type=checkbox]:checked') as Iterable) { - check.checked = false; - check.dispatchEvent<"change">(new Event("change", {cancelable: true, bubbles: true, composed: false})) - } - return this - } - - reroll(all: boolean): this { - if (!this.db) { - return this - } - const changes: RollTableResultFull[] = [] - for (const row of this.scenario.querySelectorAll(`.generatedElement`)) { - const check = row.querySelector(`input.generatedSelect:checked`) - const text = row.querySelector(`.resultText`) - if ((all || check) && text) { - let result = this.db.mappings.get(parseInt(text.dataset["mappingid"] ?? '-1')) - if (!result || result.table.resultsById.size === 1) { - continue - } - const origResult = result - const table = result.table - while (result === origResult) { - result = rollOn(table) - } - this.setActiveResult(result, all) - changes.push(result) - pulseElement(text) - } - } - this.generator.dispatchEvent(new CustomEvent("reroll", { - composed: false, - bubbles: true, - cancelable: false, - detail: { - rerolledAll: all, - changedResults: changes, - fullResults: this.rolled, - selections: this.selected, - } - })) - return this - } - - loadValuesFromDOM(): this { - this.rolled.clear() - this.selected.clear() - const scenario = scrapeGeneratedScenario(this.scenario) - if (!scenario) { - throw Error("Failed to load generated values from DOM") - } - for (const [scrapedTable, scrapedResult] of scenario.rolled) { - const table = this.db?.getTableMatching(scrapedTable) ?? scrapedTable - const result = getResultFrom(table, scrapedResult) - if (scenario.selected.has(scrapedTable)) { - this.selected.add(table) - } - this.rolled.add(result) - } - return this - } - - private getGeneratedElementForTable(table: RollTable): HTMLElement|null { - return this.scenario.querySelector(`#generated-${escapeHTML(htmlTableIdentifier(table))}`) - } - - private replaceResultInElement(result: RollTableResult, generatedElement: HTMLElement) { - // sister function is buildGeneratedElement - const generatedDiv = generatedElement.querySelector(`.generated`) - if (!generatedDiv) { - throw Error(`couldn't find .generated in replaceResultInElement`) - } - generatedDiv.replaceWith(buildGenerated({result, includesResponses: !!this.db, builder: DOMTemplateBuilder})) - const button = generatedElement.querySelector(`.resultText`)! - pulseElement(button) - this.rolled.add(result) - } - - private changeSelection(generatedElement: HTMLElement, selected: boolean) { - const check = generatedElement.querySelector(`.generatedSelect`) - if (!check) { - return - } - if (check.checked !== selected) { - check.checked = selected - check.dispatchEvent<"change">(new Event("change", {cancelable: true, bubbles: true, composed: false})) - } - } - - async copy(format: ExportFormat): Promise { - const exported = exportScenario(Array.from(this.rolled.values()), format) - return navigator.clipboard.writeText(exported) - } - - attachHandlers(): this { - this.generator.addEventListener('click', (e) => this.clickHandler(e)); - this.generator.addEventListener('change', (e) => this.changeHandler(e)); - this.generator.querySelector(`#reroll`)!.disabled = (this.selected.size === 0) - return this; - } - - private clickHandler(e: Event): void { - if (e.target instanceof HTMLButtonElement || e.target instanceof HTMLAnchorElement) { - switch (e.target.id) { - case "selectNone": - this.selectNone() - break - case "selectAll": - this.selectAll() - break - case "copyMD": - this.copy(ExportFormat.Markdown) - .then(() => showPopup(this.copyButtons, `Copied Markdown to clipboard!`, 'success')) - .catch((e) => { - console.error("Failed while copying Markdown:", e) - showPopup(this.copyButtons, `Failed to copy Markdown to clipboard`, 'error') - }) - break - case "copyBB": - this.copy(ExportFormat.BBCode) - .then(() => showPopup(this.copyButtons, `Copied BBCode to clipboard!`, 'success')) - .catch((e) => { - console.error("Failed while copying BBCode:", e) - showPopup(this.copyButtons, `Failed to copy BBCode to clipboard`, 'error') - }) - break - case "copyEmojiText": - this.copy(ExportFormat.TextEmoji) - .then(() => showPopup(this.copyButtons, `Copied text (with emojis) to clipboard!`, 'success')) - .catch((e) => { - console.error("Failed while copying text (with emojis):", e) - showPopup(this.copyButtons, `Failed to copy text (with emojis) to clipboard`, 'error') - }) - break - case "copyText": - this.copy(ExportFormat.TextOnly) - .then(() => showPopup(this.copyButtons, `Copied text to clipboard!`, 'success')) - .catch((e) => { - console.error("Failed while copying text:", e) - showPopup(this.copyButtons, `Failed to copy text to clipboard`, 'error') - }) - break - case "reroll": - this.reroll(false) - break - case "rerollAll": - this.reroll(true) - break - default: - return - } - e.preventDefault() - } - } - - private changeHandler(e: Event): void { - if (e.target instanceof HTMLInputElement && e.target.type === 'checkbox' && e.target.id.startsWith('selected-')) { - const check = e.target - const table = this.getTableWithHtmlId(check.id, 'selected-'); - if (table) { - if (check.checked) { - this.selected.add(table); - } else { - this.selected.delete(table); - } - this.generator.querySelector(`#reroll`)!.disabled = (this.selected.size === 0) - pulseElement(check) - } - } - } - - constructor(generator: HTMLElement, generatorForm: HTMLUListElement, copyButtons: HTMLElement, rollButtons: HTMLElement, db?: RollTableDatabase) { - this.generator = generator; - this.scenario = generatorForm; - this.copyButtons = copyButtons; - this.rollButtons = rollButtons; - this.db = db; - } - - setActiveResult(result: RollTableResultFull, clearSelection?: boolean) { - const tableElement = this.getGeneratedElementForTable(result.table) - if (!tableElement) { - return - } - this.replaceResultInElement(result, tableElement) - if (clearSelection) { - this.changeSelection(tableElement, false) - } - } - - addRerollListener(listener: (ev: CustomEvent) => void, options?: boolean|EventListenerOptions): void { - this.generator.addEventListener('reroll', listener, options) - } -} - -function initGenerator(db?: RollTableDatabase): Generator { - const generatorFound = document.getElementById('generator'); - if (!generatorFound) { - throw Error('generator was not found'); - } - const generatedScenarioFound = document.getElementById('generatedScenario'); - if (!generatedScenarioFound || !(generatedScenarioFound instanceof HTMLUListElement)) { - throw Error('generated scenario was not found'); - } - const copyButtons = document.getElementById("copyButtons") - if (!copyButtons) { - throw Error('copy buttons were not found') - } - const rollButtons = document.getElementById("rollButtons") - if (!rollButtons) { - throw Error('roll buttons were not found') - } - return new Generator(generatorFound, generatedScenarioFound, copyButtons, rollButtons, db).loadValuesFromDOM().attachHandlers(); -} - -let pendingGenerator: Promise|undefined = undefined - -export async function prepareGenerator(db?: Promise): Promise { - if (pendingGenerator) { - throw Error(`prepareGenerator should only be called once`) - } - pendingGenerator = DOMLoaded.then(() => db) - .then((promisedDb) => initGenerator(promisedDb)) - return pendingGenerator -} - -DOMLoaded.then(() => pendingGenerator ?? prepareGenerator()) - .then(g => console.info(`loaded generator:\n${generatedStateToString(g.state)}`)) - .catch(e => console.error('failed to load generator', e)) diff --git a/src/client/generator-entrypoint.css b/src/client/generator-entrypoint.css new file mode 100644 index 0000000..27260d2 --- /dev/null +++ b/src/client/generator-entrypoint.css @@ -0,0 +1,2 @@ +@import "../common/client/MainGeneratorOnly.css"; +/* empty file, just for redirecting the build process to point into the common files */ diff --git a/src/client/generator-entrypoint.less b/src/client/generator-entrypoint.less deleted file mode 100644 index 85e1220..0000000 --- a/src/client/generator-entrypoint.less +++ /dev/null @@ -1,3 +0,0 @@ -@import "../common/client/GeneratorPage"; -@import "../common/client/Page"; -@import "../common/client/PageFooter"; diff --git a/src/client/generator-entrypoint.ts b/src/client/generator-entrypoint.ts new file mode 100644 index 0000000..291bded --- /dev/null +++ b/src/client/generator-entrypoint.ts @@ -0,0 +1,16 @@ +import { DOMLoaded } from './onload.js'; +import { + type MainGeneratorProps, + MainGeneratorOnly, + reconstituteMainGeneratorOnly +} from '../common/client/MainGeneratorOnly.js'; +import { createElement, hydrate } from 'preact'; + +DOMLoaded.then(() => { + const props: MainGeneratorProps = { + ...reconstituteMainGeneratorOnly(document.querySelector("div#mainGeneratorOnly")!), + } + hydrate(createElement(MainGeneratorOnly, props), document.body) +}).catch((ex) => { + console.error(ex) +}) diff --git a/src/client/noscript-entrypoint.less b/src/client/noscript-entrypoint.css similarity index 100% rename from src/client/noscript-entrypoint.less rename to src/client/noscript-entrypoint.css diff --git a/src/client/responses-entrypoint-old.ts b/src/client/responses-entrypoint-old.ts deleted file mode 100644 index 4a164ba..0000000 --- a/src/client/responses-entrypoint-old.ts +++ /dev/null @@ -1,82 +0,0 @@ -import type { RollTableDatabase, RollTableDetailsAndResults, RollTableResultFull } from '../common/rolltable'; -import { DOMLoaded } from './onload'; -import { scrapeResponseLists } from './scraper'; -import { htmlTableIdentifier } from '../common/template'; -import escapeHTML from 'escape-html'; - -class ResponseLists { - readonly db: RollTableDatabase - readonly listsElement: HTMLElement - constructor(db: RollTableDatabase, listsElement: HTMLElement) { - this.db = db - this.listsElement = listsElement - } - - addSelectionListener(listener: (e: CustomEvent>) => void, options?: boolean|EventListenerOptions): void { - this.listsElement.addEventListener("resultselected", listener, options) - } - - configureHandlers(): this { - this.listsElement.addEventListener("click", (e) => { - if (e.target instanceof HTMLElement && e.target.classList.contains("makeResponseActive")) { - const response = e.target.closest(`.response`) - if (!response) { - console.log("no response") - return - } - const mappingId = response.id && response.id.startsWith("response-") ? parseInt(response.id.substring("response-".length), 10) : NaN - if (isNaN(mappingId)) { - console.log("no mapping ID") - return - } - const result = this.db.mappings.get(mappingId) - if (!result) { - console.log("no result") - return - } - const ev = new CustomEvent>("resultselected", { - bubbles: true, - cancelable: true, - detail: result - }) - if (e.target.dispatchEvent(ev)) { - this.setActiveElementForTable(result) - const button = response.querySelector(`.resultText`) as HTMLElement - if (button) { - button.focus() - } - } - } - }) - return this - } - - setActiveElementForTable(result: RollTableResultFull) { - const oldActive = this.listsElement.querySelector(`#responses-${escapeHTML(htmlTableIdentifier(result.table))} .response.active`) - const newActive = this.listsElement.querySelector(`#response-${escapeHTML(`${result.mappingId}`)}`) - if (!newActive || oldActive === newActive) { - return - } - newActive.classList.add("active") - if (!oldActive) { - return - } - oldActive.classList.remove("active") - } -} - -function initResponseList(): ResponseLists { - const listsElement = document.querySelector(`#responseLists`) - if (!listsElement) { - throw Error(`can't find #responseLists`) - } - const lists = scrapeResponseLists(listsElement) - if (!lists) { - throw Error(`can't parse #responseLists`) - } - const {db} = lists - return new ResponseLists(db, listsElement).configureHandlers() -} - -export const responseLists: Promise = DOMLoaded.then(() => initResponseList()) -export const db: Promise = responseLists.then(r => r.db) diff --git a/src/client/responses-entrypoint.css b/src/client/responses-entrypoint.css new file mode 100644 index 0000000..a9b2083 --- /dev/null +++ b/src/client/responses-entrypoint.css @@ -0,0 +1 @@ +@import "../common/client/MainResponsesOnly.css"; diff --git a/src/client/responses-entrypoint.less b/src/client/responses-entrypoint.less deleted file mode 100644 index c1e3221..0000000 --- a/src/client/responses-entrypoint.less +++ /dev/null @@ -1,3 +0,0 @@ -@import "../common/client/ResponsesPage"; -@import "../common/client/Page"; -@import "../common/client/PageFooter"; diff --git a/src/client/responses-entrypoint.ts b/src/client/responses-entrypoint.ts new file mode 100644 index 0000000..35eda11 --- /dev/null +++ b/src/client/responses-entrypoint.ts @@ -0,0 +1,8 @@ +import { DOMLoaded } from './onload.js'; +import { MainResponsesOnly, reconstituteMainResponsesOnly } from '../common/client/MainResponsesOnly.js'; +import { createElement, hydrate } from 'preact'; + +DOMLoaded.then(() => { + const props = reconstituteMainResponsesOnly(document.querySelector("div#mainResponsesOnly")!) + hydrate(createElement(MainResponsesOnly, props), document.body) +}) diff --git a/src/common/client/Attribution.less b/src/common/client/Attribution.css similarity index 93% rename from src/common/client/Attribution.less rename to src/common/client/Attribution.css index 7a0b850..25d2c30 100644 --- a/src/common/client/Attribution.less +++ b/src/common/client/Attribution.css @@ -1,5 +1,5 @@ -@import "AttributionAuthor"; -@import "AttributionSet"; +@import "AttributionAuthor.css"; +@import "AttributionSet.css"; .attributed { position: relative; @@ -41,6 +41,9 @@ .attribution .attributionBubble * { user-select: none; } +.attribution .attributionBubble > * { + margin: 0.1rem; +} .attribution .button { margin-top: 0.5rem; diff --git a/src/common/client/Attribution.tsx b/src/common/client/Attribution.tsx index 872a2cf..9e06f7e 100644 --- a/src/common/client/Attribution.tsx +++ b/src/common/client/Attribution.tsx @@ -1,16 +1,16 @@ import type { RollTableAuthor, -} from '../rolltable'; +} from '../rolltable.js'; import { AttributionAuthor, reconstituteAttributionAuthorIfExists -} from './AttributionAuthor'; +} from './AttributionAuthor.js'; import { Fragment } from 'preact'; import { AttributionSet, type AttributionSetProps, reconstituteAttributionSetIfExists -} from './AttributionSet'; +} from './AttributionSet.js'; import type { PropsWithChildren } from 'preact/compat'; export interface AttributionPropsFull { diff --git a/src/common/client/AttributionAuthor.less b/src/common/client/AttributionAuthor.css similarity index 100% rename from src/common/client/AttributionAuthor.less rename to src/common/client/AttributionAuthor.css diff --git a/src/common/client/AttributionAuthor.tsx b/src/common/client/AttributionAuthor.tsx index 2b2845c..a07a456 100644 --- a/src/common/client/AttributionAuthor.tsx +++ b/src/common/client/AttributionAuthor.tsx @@ -1,4 +1,4 @@ -import type { RollTableAuthor } from '../rolltable'; +import type { RollTableAuthor } from '../rolltable.js'; export function reconstituteAttributionAuthorIfExists(element: HTMLParagraphElement | null, partial?: Partial|null): RollTableAuthor|null { if (!element || partial === null) { diff --git a/src/common/client/AttributionSet.less b/src/common/client/AttributionSet.css similarity index 100% rename from src/common/client/AttributionSet.less rename to src/common/client/AttributionSet.css diff --git a/src/common/client/AttributionSet.tsx b/src/common/client/AttributionSet.tsx index cdebd4a..6dc8220 100644 --- a/src/common/client/AttributionSet.tsx +++ b/src/common/client/AttributionSet.tsx @@ -1,4 +1,4 @@ -import type { RollTableResultSet } from '../rolltable'; +import type { RollTableResultSet } from '../rolltable.js'; import { Fragment } from 'preact'; export type AttributionSetProps = Pick diff --git a/src/common/client/Button.less b/src/common/client/Button.css similarity index 53% rename from src/common/client/Button.less rename to src/common/client/Button.css index 021ed1a..0aaad14 100644 --- a/src/common/client/Button.less +++ b/src/common/client/Button.css @@ -1,4 +1,5 @@ .button { + flex: 1 0 auto; border: none; padding: 0.5rem; font-size: 1rem; @@ -13,23 +14,23 @@ box-shadow: 0 0 black; transform: none; transition: background-color 0.1s ease, transform 0.1s ease, box-shadow 0.1s ease; +} - &:disabled { - background-color: slategray; - color: #333; - cursor: inherit; - } +.button:disabled { + background-color: slategray; + color: #333; + cursor: inherit; +} - &:not(:disabled):hover, &:not(:disabled):focus { - background-color: darkgray; - box-shadow: -0.2rem 0.2rem black; - transform: translate(0.2rem, -0.2rem); - } +.button:not(:disabled):hover, .button:not(:disabled):focus { + background-color: darkgray; + box-shadow: -0.2rem 0.2rem black; + transform: translate(0.2rem, -0.2rem); +} - &:not(:disabled):active { - box-shadow: 0 0 black; - transform: none; - } +.button:not(:disabled):active { + box-shadow: 0 0 black; + transform: none; } .buttons { @@ -37,8 +38,9 @@ flex-wrap: wrap; align-items: center; justify-content: stretch; - & > * { - flex: 1 0 auto; - margin: 0.2rem 0 0 0.3rem - } +} + +.buttons > * { + flex: 1 0 auto; + margin: 0.2rem 0 0 0.3rem } diff --git a/src/common/client/GeneratedElement.less b/src/common/client/GeneratedElement.css similarity index 85% rename from src/common/client/GeneratedElement.less rename to src/common/client/GeneratedElement.css index 708974a..e172c51 100644 --- a/src/common/client/GeneratedElement.less +++ b/src/common/client/GeneratedElement.css @@ -1,5 +1,6 @@ -@import "TableHeader"; -@import "GeneratedResult"; +@import "TableHeader.css"; +@import "GeneratedResult.css"; +@import "pulseElement.css"; .generatedElement { list-style: none; @@ -52,12 +53,12 @@ text-align: center; line-height: 2rem; border-radius: 1rem; +} - &::after { - content: '🔒' - } +.generatedSelect::after { + content: '🔒' +} - &:checked::after { - content: '🎲'; - } +.generatedSelect:checked::after { + content: '🎲'; } diff --git a/src/common/client/GeneratedElement.tsx b/src/common/client/GeneratedElement.tsx index b6155d4..597ce25 100644 --- a/src/common/client/GeneratedElement.tsx +++ b/src/common/client/GeneratedElement.tsx @@ -5,15 +5,18 @@ import { tableIdentifier, type TableProps, TableTitle -} from './TableHeader'; +} from './TableHeader.js'; import { GeneratedResult, type GeneratedResultProps, type GeneratedResultPropsFull, type PartialGeneratedResultProps, type PartialGeneratedResultPropsFull, reconstituteGeneratedResult -} from './GeneratedResult'; +} from './GeneratedResult.js'; import { useCallback, useEffect, useRef, useState } from 'preact/hooks'; -import { pulseElement } from './pulseElement'; +import { pulseElement } from './pulseElement.js'; +import JSONCrush from 'jsoncrush'; + +const {crush, uncrush} = JSONCrush export type GeneratedElementPropsBase = { table: TableProps @@ -41,7 +44,7 @@ export function reconstituteGeneratedElement(element: HTMLLIElement, partial?: P const result = reconstituteGeneratedResult(element.querySelector(".generatedResult")!, partial) const selected = typeof partial?.selected !== 'undefined' ? partial.selected - : (element.querySelector('.generatedSelect')?.checked) ?? null + : (element.querySelector('.generatedSelect')?.defaultChecked) ?? null const table = reconstituteTable(element.querySelector(".tableHeader")!, partial?.table) if (result.set) { return { @@ -62,6 +65,28 @@ export interface GeneratedElementEvents { onSelectionChange?: (tableId: number, selected: boolean) => void } +export function serializeLimitedText(table: TableProps, text: string): string { + if (table.id) { + return crush(JSON.stringify({id: table.id, text})) + } else { + return crush(JSON.stringify({emoji: table.emoji, title: table.title, ordinal: table.ordinal, text})) + } +} + +export function deserializeLimitedText(serialized: string): {id: number, text: string}|{id: null, ordinal: number, emoji: string, title: string, text: string} { + const json = JSON.parse(uncrush(serialized)) + if (typeof json !== 'object' || json === null || !('text' in json) || typeof json.text !== 'string') { + throw Error("invalid json data") + } + if ('id' in json && typeof json.id === 'number') { + return json + } + if ('ordinal' in json && typeof json.ordinal === 'number' && 'emoji' in json && typeof json.emoji === 'number' && 'title' in json && typeof json.title === 'string') { + return {...json, id: null} + } + throw Error("invalid json data") +} + export function GeneratedElement({ onSelectionChange, ...props }: GeneratedElementProps & GeneratedElementEvents) { const ref = useRef(null); const selected = props.selected @@ -83,6 +108,7 @@ export function GeneratedElement({ onSelectionChange, ...props }: GeneratedEleme }, [ref, selected, lastSelected, setLastSelected]) return + - + ref={ref} /> : null} diff --git a/src/common/client/GeneratedResult.less b/src/common/client/GeneratedResult.css similarity index 53% rename from src/common/client/GeneratedResult.less rename to src/common/client/GeneratedResult.css index f64a640..4cc8064 100644 --- a/src/common/client/GeneratedResult.less +++ b/src/common/client/GeneratedResult.css @@ -1,5 +1,6 @@ -@import "Attribution"; -@import "ResultText"; +@import "Attribution.css"; +@import "pulseElement.css"; +@import "ResultText.css"; .generatedResult { margin: 0; diff --git a/src/common/client/GeneratedResult.tsx b/src/common/client/GeneratedResult.tsx index c27618f..4e715a0 100644 --- a/src/common/client/GeneratedResult.tsx +++ b/src/common/client/GeneratedResult.tsx @@ -3,17 +3,17 @@ import { type AttributionPropsEmpty, type AttributionPropsFull, type PartialAttributionProps, type PartialAttributionPropsEmpty, reconstituteAttribution, -} from './Attribution'; +} from './Attribution.js'; import { reconstituteResultText, ResultText, type ResultTextPropsFull, type ResultTextPropsLimited -} from './ResultText'; -import { LinkButton } from './Button'; -import { responseIdPrefix } from './ResponseElement'; -import { IncludesResponses } from './ResponsesPage'; +} from './ResultText.js'; +import { LinkButton } from './Button.js'; +import { responseIdPrefix } from './ResponseElement.js'; import { useContext } from 'preact/hooks'; +import { IncludesResponses } from './contexts.js'; export type GeneratedResultPropsFull = AttributionPropsFull & ResultTextPropsFull @@ -33,15 +33,15 @@ export function reconstituteGeneratedResult(div: HTMLDivElement, partial?: Parti reconstituteResultText(div.querySelector(".resultText")!, partial) const attribution = reconstituteAttribution(div.querySelector(".attribution")!, partial) - if (result.updated && attribution.set) { + if (attribution.set) { return { ...attribution, ...result, - } + } as GeneratedResultPropsFull } else { return { ...result as ResultTextPropsLimited, - } + } as GeneratedResultPropsLimited } } @@ -51,7 +51,7 @@ export function GeneratedResult(props: GeneratedResultProps) { {includesResponses && props.set - ? Jump to Result in List + ? Jump to Result in List : null} diff --git a/src/common/client/GeneratorPage.less b/src/common/client/GeneratorPage.css similarity index 72% rename from src/common/client/GeneratorPage.less rename to src/common/client/GeneratorPage.css index c8f7a24..4162078 100644 --- a/src/common/client/GeneratorPage.less +++ b/src/common/client/GeneratorPage.css @@ -1,13 +1,9 @@ -@import "Page"; -@import "Button"; -@import "usePopup"; +@import "Page.css"; +@import "Button.css"; +@import "GeneratedElement.css"; +@import "usePopup.css"; #generator { - position: absolute; - top: 0; - min-height: 100dvh; - left: 0; - right: 0; margin: 0; padding: 2rem; display: flex; @@ -24,14 +20,15 @@ #generatedScenario { padding: 0; + list-style: none; } #generator .buttons { margin-left: -0.3rem; } - #copyButtons::before { content: "Copy as:"; + padding-right: 0.2rem; margin: 0.2rem 0 0 0.3rem } diff --git a/src/common/client/GeneratorPage.tsx b/src/common/client/GeneratorPage.tsx index c477698..c0b7034 100644 --- a/src/common/client/GeneratorPage.tsx +++ b/src/common/client/GeneratorPage.tsx @@ -1,18 +1,16 @@ - -import { FormButton, LinkButton } from './Button'; +import { FormButton, LinkButton } from './Button.js'; import { createContext, Fragment } from 'preact'; -import { usePopup } from './usePopup'; -import { useCallback, useContext } from 'preact/hooks'; -import { ExportFormat, exportFormatToString } from '../rolltable'; +import { usePopup } from './usePopup.js'; +import { useCallback, useContext, useEffect, useMemo, useState } from 'preact/hooks'; +import { ExportFormat, exportFormatToString } from '../rolltable.js'; import { GeneratedElement, type GeneratedElementProps, reconstituteGeneratedElement, -} from './GeneratedElement'; -import { IncludesResponses } from './ResponsesPage'; -import { tableIdentifier } from './TableHeader'; - -export const IncludesGenerator = createContext(false) +} from './GeneratedElement.js'; +import { tableIdentifier } from './TableHeader.js'; +import { type FormInfo, type FormReturnType, useSubmitCallback } from './useSubmitCallback.js'; +import { IncludesResponses } from './contexts.js'; export interface GeneratorProps { generatorTargetUrl: string @@ -26,11 +24,6 @@ export enum GeneratorSelect { None = "none", } -export enum GeneratorReroll { - All = "all", - Selected = "selected", -} - export function reconstituteGenerator(element: HTMLDivElement, partial?: Partial): GeneratorProps { const addToDiscordUrl = partial?.addToDiscordUrl ?? element.querySelector("#addToDiscord")?.href ?? null const editable = partial?.editable ?? !!element.querySelector("#rollButtons") @@ -43,129 +36,174 @@ export function reconstituteGenerator(element: HTMLDivElement, partial?: Partial addToDiscordUrl, editable, generatorTargetUrl, - elements: elements, + elements, } } +export enum GeneratorFormAction { + Reroll = 'reroll selected', + RerollAll = 'reroll all', + OpenInGenerator = 'open in generator', + SaveScenario = 'get scenario link', + GoToResponses = 'go to responses', + GoToOffline = 'go to offline version', +} + +export interface GeneratorFormInfo extends FormInfo { + action: GeneratorFormAction, +} + +export interface GeneratorSubmitResult extends FormReturnType { + status?: Promise +} + export interface GeneratorEvents { onCopy?: (format: ExportFormat) => Promise - onReroll?: (which: GeneratorReroll) => Promise onSelect?: (which: GeneratorSelect) => void onSelectionChange?: (tableId: number, selected: boolean) => void + onSubmit?: (action: GeneratorFormInfo) => GeneratorSubmitResult } enum GeneratorSelectionState { All = "All", Partial = "Some", - None = "None" + None = "None", + Unselectable = "Unselectable", } -export function GeneratorPage({ editable, generatorTargetUrl, addToDiscordUrl, onSelectionChange, onSelect, onReroll, onCopy, elements }: GeneratorProps & GeneratorEvents) { +export function GeneratorPage({ editable, generatorTargetUrl, addToDiscordUrl, onSelectionChange, onSelect, onSubmit, onCopy, elements }: GeneratorProps & GeneratorEvents) { const includesResponses = useContext(IncludesResponses); - const [copyPopupHost, showCopyPopup] = usePopup() - const [rerollPopupHost, showRerollPopup] = usePopup() + const [popupHost, showPopup] = usePopup() + const [firstRender, setFirstRender] = useState(true) const copyWrapper = useCallback((format: ExportFormat) => { if (!onCopy) { console.error("No copy handler") - return showCopyPopup(`Failed to copy ${exportFormatToString(format)} to clipboard`, 'error') + return showPopup(`Failed to copy ${exportFormatToString(format)} to clipboard`, 'error') } onCopy(format).then(() => { - return showCopyPopup(`Copied ${exportFormatToString(format)} to clipboard`) + return showPopup(`Copied ${exportFormatToString(format)} to clipboard`) }).catch((ex: unknown) => { console.error(ex) - return showCopyPopup(`Failed to copy ${exportFormatToString(format)} to clipboard`, 'error') + return showPopup(`Failed to copy ${exportFormatToString(format)} to clipboard`, 'error') }).catch((ex: unknown) => { console.error(ex) }) - }, [showCopyPopup, onCopy]) + }, [showPopup, onCopy]) const md = useCallback(() => copyWrapper(ExportFormat.Markdown), [copyWrapper]) const bb = useCallback(() => copyWrapper(ExportFormat.BBCode), [copyWrapper]) const emoji = useCallback(() => copyWrapper(ExportFormat.TextEmoji), [copyWrapper]) const text = useCallback(() => copyWrapper(ExportFormat.TextOnly), [copyWrapper]) - const selected = elements.reduce((current, next) => { - if (next.selected === null) { - return current - } - switch (current) { - case GeneratorSelectionState.Partial: - return GeneratorSelectionState.Partial - case GeneratorSelectionState.None: - return next.selected ? GeneratorSelectionState.Partial : GeneratorSelectionState.None - case GeneratorSelectionState.All: - return next.selected ? GeneratorSelectionState.All : GeneratorSelectionState.Partial - case null: - return next.selected ? GeneratorSelectionState.All : GeneratorSelectionState.None + const selected = useMemo(() => { + if (firstRender) { + return null; } - }, null) + return elements.reduce((current, next) => { + if (next.selected === null) { + return current + } + switch (current) { + case GeneratorSelectionState.Partial: + return GeneratorSelectionState.Partial + case GeneratorSelectionState.None: + return next.selected ? GeneratorSelectionState.Partial : GeneratorSelectionState.None + case GeneratorSelectionState.All: + return next.selected ? GeneratorSelectionState.All : GeneratorSelectionState.Partial + case GeneratorSelectionState.Unselectable: + return next.selected ? GeneratorSelectionState.All : GeneratorSelectionState.None + } + }, GeneratorSelectionState.Unselectable); + }, [elements]) const selectAll = useCallback((ev: Event) => { if (!onSelect || (ev.currentTarget instanceof HTMLButtonElement && ev.currentTarget.disabled)) { return } onSelect(GeneratorSelect.All) - }, [onSelect, showRerollPopup]) + }, [onSelect]) const selectNone = useCallback((ev: Event) => { if (!onSelect || (ev.currentTarget instanceof HTMLButtonElement && ev.currentTarget.disabled)) { return } onSelect(GeneratorSelect.None) - }, [onSelect, showRerollPopup]) - const rerollSelected = useCallback((ev: Event) => { - if (!onReroll || (ev.currentTarget instanceof HTMLButtonElement && ev.currentTarget.disabled)) { - return - } - onReroll(GeneratorReroll.Selected).then(() => {}).catch((ex: unknown) => { - console.error(ex) - return showRerollPopup(`Failed to reroll`, 'error') - }).catch((ex: unknown) => { - console.error(ex) - }) - }, [onReroll, showRerollPopup]) - const rerollAll = useCallback((ev: Event) => { - if (!onReroll || (ev.currentTarget instanceof HTMLButtonElement && ev.currentTarget.disabled)) { - return - } - onReroll(GeneratorReroll.All).then(() => {}).catch((ex: unknown) => { - console.error(ex) - return showRerollPopup(`Failed to reroll all`, 'error') - }).catch((ex: unknown) => { - console.error(ex) - }) - }, [onReroll, showRerollPopup]) + }, [onSelect]) + + const submitHandler = useCallback((d: FormInfo) => { + if (!onSubmit) { + return {allowSubmit: true} + } + const action = d.data.get("action") + switch (action) { + case GeneratorFormAction.Reroll: + case GeneratorFormAction.RerollAll: + case GeneratorFormAction.GoToOffline: + case GeneratorFormAction.GoToResponses: + case GeneratorFormAction.OpenInGenerator: + case GeneratorFormAction.SaveScenario: + const {allowSubmit, status} = onSubmit({ + ...d, + action + }) + if (status) { + status.then((text) => { + if (text) { + return showPopup(text, "success") + } + }).catch((ex) => { + if (ex instanceof Error) { + return showPopup(`Failed to ${action}: ${ex.message}`, 'error') + } else if (ex) { + return showPopup(`Failed to ${action}: ${ex}`, 'error') + } else { + return showPopup(`Failed to ${action}`, 'error') + } + }) + } + return {allowSubmit} + default: + return {allowSubmit: true} + } + }, [onSubmit, showPopup]) + + useEffect(() => { + setFirstRender(false) + }, []) + const submitCallback = useSubmitCallback(submitHandler) return - + Your generated scenario - {elements.map(i => )} + {elements.map(i => + )} - - + + Markdown BBCode Text + Emoji Text Only - {editable ? - - Reroll {selected === GeneratorSelectionState.All ? 'All' : 'Selected'} + {editable ? + + Reroll Selected - Select All - Select None + Select All + Select None : null} {editable ? - New Scenario - Get Scenario Link + New Scenario + Get Scenario Link : - Open in Generator + Open in Generator } - { addToDiscordUrl || includesResponses ? - - {addToDiscordUrl && Add to Discord} - {includesResponses ? View Possible Responses : null} - : null} + + {addToDiscordUrl && Add to Discord} + {includesResponses ? { editable ? "View/Select" : "View Possible" } Responses : null} + {!includesResponses ? Switch to Responses : null} + {!includesResponses ? Switch to Offline Version : null} + diff --git a/src/common/client/Main.less b/src/common/client/Main.css similarity index 100% rename from src/common/client/Main.less rename to src/common/client/Main.css diff --git a/src/common/client/MainGeneratorAndResponses.css b/src/common/client/MainGeneratorAndResponses.css new file mode 100644 index 0000000..4de98f1 --- /dev/null +++ b/src/common/client/MainGeneratorAndResponses.css @@ -0,0 +1,13 @@ +@import "Main.css"; +@import "GeneratorPage.css"; +@import "ResponsesPage.css"; +@import "PageFooter.css"; + +#mainGeneratorAndResponses { + display: flex; + flex-flow: column; + justify-content: center; + align-content: center; + min-height: 100dvh; + min-width: 100dvw; +} diff --git a/src/common/client/MainGeneratorAndResponses.tsx b/src/common/client/MainGeneratorAndResponses.tsx new file mode 100644 index 0000000..6b65dd0 --- /dev/null +++ b/src/common/client/MainGeneratorAndResponses.tsx @@ -0,0 +1,364 @@ +import { + GeneratorFormAction, + type GeneratorFormInfo, + GeneratorPage, + GeneratorSelect, + type GeneratorSubmitResult, + reconstituteGenerator +} from './GeneratorPage.js'; +import { PageFooter, reconstituteFooterProps } from './PageFooter.js'; +import { deserializeLimitedText, type GeneratedElementProps, serializeLimitedText } from './GeneratedElement.js'; +import { useCallback, useMemo, useState } from 'preact/hooks'; +import { + ExportFormat, + exportScenario, + RolledValues, + rollOnAll, + RollSelections, + type RollTable, + RollTableDatabase, + type RollTableDetailsAndResults, + type RollTableResult +} from '../rolltable.js'; +import { useHistoryState } from './useHistory.js'; +import { reconstituteResponses, ResponsesPage, ResponsesTarget } from './ResponsesPage.js'; +import type { ResponseTypeProps } from './ResponseType.js'; +import { copyText } from './useClipboard.js'; +import { IncludesGenerator, IncludesResponses } from './contexts.js'; +import { type ResponsesFormInfo, type ResponsesFormResult, ResponsesSubmitType } from './responsesForm.js'; + +export interface MainGeneratorAndResponsesProps { + targetUrl: string + addToDiscordUrl: string|null + creditsUrl: string + + initialEditable: boolean + database: RollTableDatabase + initialResults: ReadonlyMap + initialSelected: ReadonlySet|null +} + +export function parseDatabaseFrom({responseTypes, generatorElements, editable}: { + responseTypes: ResponseTypeProps[], + generatorElements: GeneratedElementProps[], + editable: boolean, +}): { + database: RollTableDatabase, + values: ReadonlyMap, + selections: ReadonlySet|null +} { + const database = new RollTableDatabase() + for (const responseType of responseTypes) { + const table = database.addTable({ + full: 'details', + id: responseType.table.id, + identifier: responseType.table.identifier, + emoji: responseType.table.emoji, + title: responseType.table.title, + ordinal: responseType.table.ordinal, + header: `${responseType.table.emoji} ${responseType.table.title}`, + name: responseType.table.name, + }) + for (const response of responseType.contents) { + database.addResult({ + full: true, + text: response.result.text, + textId: response.result.textId, + mappingId: response.result.mappingId, + author: response.attribution.author, + set: (response.attribution.set && { + name: response.attribution.set.name, + id: response.attribution.set.id, + description: null, + global: response.attribution.set.global, + }), + table: table, + }) + } + } + const values = new RolledValues() + const selections = editable ? new RollSelections() : null + for (const element of generatorElements) { + const table: RollTable = (typeof element.table.id === 'number' ? database.tables.get(element.table.id) : null) ?? { + full: false, + header: `${element.table.emoji} ${element.table.title}`, + emoji: element.table.emoji, + title: element.table.title, + ordinal: element.table.ordinal, + } + const result: RollTableResult = (typeof element.textId === 'number' && table.full === "results" + ? table.resultsById.get(element.textId) + : null) ?? { + full: false, + table, + text: element.text, + textId: element.textId, + } + values.add(result) + if (selections && element.selected && table.full === "results") { + selections.add(table) + } + } + return { + database, + values, + selections, + } +} + +export function reconstituteMainGeneratorAndResponses( + element: HTMLDivElement, partial?: Partial): MainGeneratorAndResponsesProps { + const {creditsUrl} = reconstituteFooterProps(element.querySelector("footer")!, partial) + const {generatorTargetUrl, addToDiscordUrl, editable, elements: generatorElements} = + reconstituteGenerator(element.querySelector("#generator")!) + const {types: responseTypes} = + reconstituteResponses(element.querySelector("#responses")!) + + const {database, values, selections} = parseDatabaseFrom({responseTypes, generatorElements, editable}) + + return { + targetUrl: generatorTargetUrl, + addToDiscordUrl, + creditsUrl, + + database, + initialEditable: editable, + initialResults: values, + initialSelected: selections, + } +} + +export function MainGeneratorAndResponses({ + initialEditable, targetUrl, addToDiscordUrl, database, + creditsUrl, initialResults, initialSelected, + }: MainGeneratorAndResponsesProps) { + const [results, setResults] = + useState>(initialResults) + const [selected, setSelected] = + useState|null>(initialSelected) + const [editable, setEditable] = useState(initialEditable) + const [currentUrl, setCurrentUrl] = useState(null) + const responsesBase: Omit[] = useMemo(() => + [...database.tables.values()].map((table) => ({ + table: { + name: table.name, + emoji: table.emoji, + ordinal: table.ordinal, + id: table.id, + title: table.title, + identifier: table.identifier, + }, + contents: [...table.resultsById.values()].map(result => ({ + attribution: { + set: result.set, + author: result.author + }, + result: { + text: result.text, + textId: result.textId, + mappingId: result.mappingId, + } + })) + })), [database]) + const responsesWithSelections: ResponseTypeProps[] = useMemo(() => + responsesBase.map(table => ({ + ...table, + selectedTextId: results.get(database.tables.get(table.table.id)!)?.textId ?? null + })), [responsesBase, database, results]) + const generatedElements: GeneratedElementProps[] = useMemo(() => + [...results.values()].map(result => + result.full + ? { + text: result.text, + textId: result.textId, + mappingId: result.mappingId, + set: result.set, + author: result.author, + selected: editable && result.table.full === "results" ? selected?.has(result.table) ?? null : null, + table: result.table, + } : { + text: result.text, + selected: null, + table: result.table, + set: null, + author: null, + textId: result.textId, + mappingId: null, + }), [results, selected]) + const historyKey = useMemo(() => + [...results.values()].map(result => result.textId ?? serializeLimitedText(result.table, result.text)) + , [results]) + const historyState = useMemo(() => { + return {selected: selected && [...selected].map(t => t.id), values: historyKey} + }, [historyKey, selected]) + const onHistoryState = useCallback((state: unknown, url: URL) => { + // TODO: validate that this is in fact one of the states that this version of the page created, + // or at least is parseable by it + const {values, selected} = state as {selected: number[]|null, values: (string|number)[]} + const results = new RolledValues() + for (const value of values) { + if (typeof value === 'string') { + const serialized = deserializeLimitedText(value) + const table: RollTable|undefined = serialized.id === null + ? { + full: false, + title: serialized.title, + ordinal: serialized.ordinal, + emoji: serialized.emoji, + header: `${serialized.emoji} ${serialized.title}`, + } : database.tables.get(serialized.id) + if (!table) { + console.error(`invalid table id in history ${serialized.id}`) + continue + } + results.add({ + full: false, + table, + text: serialized.text, + textId: null, + }) + } else { + const result = database.results.get(value) + if (!result) { + console.error(`invalid text id in history ${value}`) + continue + } + results.add(result) + } + } + setResults(results) + if (selected) { + const selections = new RollSelections() + for (const selection of selected) { + const table = database.tables.get(selection) + if (!table) { + console.error(`invalid table id in history ${selection}`) + continue + } + selections.add(table) + } + setSelected(selections) + } + setCurrentUrl(url) + }, [setResults, setSelected, setCurrentUrl, database]) + useHistoryState({ + state: historyState, + key: historyKey, + url: currentUrl, + onState: onHistoryState, + }) + const onCopy = useCallback(async (format: ExportFormat) => { + return copyText(exportScenario(Array.from(results.values()), format)) + }, [results]) + const onSelectionChange = useCallback((tableId: number, state: boolean) => { + const table = database.tables.get(tableId) + if (!table) { + return + } + const newSelection = new RollSelections(selected) + if (state) { + newSelection.add(table) + } else { + newSelection.delete(table) + } + setSelected(newSelection) + }, [database, selected, setSelected]) + const onSelect = useCallback((select: GeneratorSelect) => { + switch (select) { + case GeneratorSelect.All: + setSelected(new RollSelections(database.tables.values())); + break; + case GeneratorSelect.None: + setSelected(new RollSelections()); + break; + } + }, [database, setSelected]) + const onGeneratorSubmitted = useCallback((formData: GeneratorFormInfo): GeneratorSubmitResult => { + switch (formData.action) { + case GeneratorFormAction.GoToOffline: + return { + allowSubmit: false, + status: Promise.reject(Error("Already in the offline version!")) + } + case GeneratorFormAction.GoToResponses: + return { + allowSubmit: false, + status: Promise.reject(Error("Already in a version with responses!")) + } + case GeneratorFormAction.OpenInGenerator: + // TODO: make the call to the server to get the URL + setEditable(true) + setSelected(new RollSelections()) + return { + allowSubmit: false, + } + case GeneratorFormAction.SaveScenario: + // TODO: make the call to the server to get the URL, and copy it to the clipboard + setEditable(false) + setSelected(null) + return { + allowSubmit: false, + status: copyText && copyText(window.location.href).then(() => Promise.resolve(`URL copied to clipboard!`)) + } + case GeneratorFormAction.Reroll: + case GeneratorFormAction.RerollAll: + if (formData.action === GeneratorFormAction.RerollAll) { + setResults(rollOnAll(database.tables.values())) + setSelected(new RollSelections()) + } else if (selected !== null && selected.size > 0) { + setResults(new RolledValues([...results, ...rollOnAll(selected)])) + } + return { + allowSubmit: false + }; + default: + return { + allowSubmit: true, + } + } + }, [database, results, selected, setResults, setSelected, setEditable]) + const onResponsesSubmitted = useCallback((data: ResponsesFormInfo): ResponsesFormResult => { + switch (data.action) { + case ResponsesSubmitType.ReturnToGenerator: + return { + allowSubmit: false, + status: Promise.reject(Error("Already in a version with a generator!")) + } + case ResponsesSubmitType.ChangeSelected: + const result = database.results.get(data.newSelectedTextId) + if (!result) { + return { + allowSubmit: false, + status: Promise.reject(Error(`no such text ID ${data.newSelectedTextId}`)) + } + } + setResults(new RolledValues([...results.values(), result])) + return { + allowSubmit: false, + } + default: + return { + allowSubmit: true + } + } + }, [database, results, setResults]) + + return ( + + + + + + + + + ) +} diff --git a/src/common/client/MainGeneratorOnly.css b/src/common/client/MainGeneratorOnly.css new file mode 100644 index 0000000..925e4a3 --- /dev/null +++ b/src/common/client/MainGeneratorOnly.css @@ -0,0 +1,3 @@ +@import "Main.css"; +@import "GeneratorPage.css"; +@import "PageFooter.css"; diff --git a/src/common/client/MainGeneratorOnly.less b/src/common/client/MainGeneratorOnly.less deleted file mode 100644 index e9b290b..0000000 --- a/src/common/client/MainGeneratorOnly.less +++ /dev/null @@ -1,3 +0,0 @@ -@import "./Main"; -@import "./GeneratorPage"; -@import "./PageFooter"; diff --git a/src/common/client/MainGeneratorOnly.tsx b/src/common/client/MainGeneratorOnly.tsx index 639e6d7..0c24d03 100644 --- a/src/common/client/MainGeneratorOnly.tsx +++ b/src/common/client/MainGeneratorOnly.tsx @@ -1,64 +1,128 @@ -import { GeneratorPage, GeneratorSelect, IncludesGenerator } from './GeneratorPage'; -import { PageFooter } from './PageFooter'; -import type { GeneratedElementProps } from './GeneratedElement'; -import { useCallback, useMemo, useState } from 'preact/hooks'; -import { ExportFormat, exportScenario, RollSelections, type RollTable, type RollTableResult } from '../rolltable'; +import { + GeneratorFormAction, + type GeneratorFormInfo, + GeneratorPage, + GeneratorSelect, + type GeneratorSubmitResult, + reconstituteGenerator +} from './GeneratorPage.js'; +import { PageFooter, reconstituteFooterProps } from './PageFooter.js'; +import type { GeneratedElementProps } from './GeneratedElement.js'; +import { useCallback, useMemo, useRef, useState } from 'preact/hooks'; +import { + ExportFormat, + exportScenario, + isRollTableResultArray, + RolledValues, + RollSelections, + type RollTable, + type RollTableDetailsNoResults, + type RollTableLimited, + type RollTableResult +} from '../rolltable.js'; +import { copyText } from './useClipboard.js'; +import { useHistoryState } from './useHistory.js'; +import { IncludesGenerator } from './contexts.js'; -export interface GeneratorMainProps { - editable: boolean +export function elementsToValuesAndSelections(elements: GeneratedElementProps[]): + {values: ReadonlyMap, selections: ReadonlySet|null} { + const values = new RolledValues() + const selections = new RollSelections() + let anyNonNullSelection = false + for (const x of elements) { + const table: RollTableLimited|RollTableDetailsNoResults = typeof x.table.id === 'number' ? { + full: 'details', + header: `${x.table.emoji} ${x.table.title}`, + id: x.table.id, + identifier: x.table.identifier, + name: x.table.name, + title: x.table.title, + ordinal: x.table.ordinal, + emoji: x.table.emoji + } : { + full: false, + header: `${x.table.emoji} ${x.table.title}`, + title: x.table.title, + emoji: x.table.emoji, + ordinal: x.table.ordinal + } + + const result: RollTableResult = x.set ? { + full: true, + table, + set: { + name: x.set.name, + id: x.set.id, + global: x.set.global, + description: null, + }, + author: x.author && { + name: x.author.name, + id: x.author.id, + url: x.author.url, + relation: x.author.relation + }, + mappingId: x.mappingId, + textId: x.textId, + text: x.text, + } : { + full: false, + table, + textId: x.textId, + text: x.text, + } + values.add(result) + if (x.selected !== null) { + anyNonNullSelection = true + if (x.selected) { + selections.add(table) + } + } + } + return {values: values, selections: anyNonNullSelection ? selections : null} +} + +export interface MainGeneratorProps { generatorTargetUrl: string - addToDiscordUrl: string + addToDiscordUrl: string|null creditsUrl: string + initialEditable: boolean initialResults: ReadonlyMap - initialSelected?: ReadonlySet + initialSelected: ReadonlySet|null } -export interface GeneratorMainEvents { - copyText?: (text: string) => Promise -} +export function reconstituteMainGeneratorOnly( + element: HTMLDivElement, partial?: Partial): MainGeneratorProps { + const {creditsUrl} = reconstituteFooterProps(element.querySelector("footer")!, partial) + const {generatorTargetUrl, addToDiscordUrl, editable, elements} = + reconstituteGenerator(element.querySelector("#generator")!) + + const {values, selections} = elementsToValuesAndSelections(elements) -// TODO: add a "reconstitute" function for MainGeneratorOnly -// TODO: add the other two top-level pages (MainResponsesOnly, MainGeneratorResponses) with "reconstitute" functions -// TODO: add the entry points that reconstitute and hydrate each of the respective top-level pages + return { + generatorTargetUrl, + addToDiscordUrl, + creditsUrl, -function MainGeneratorOnly({ - editable, generatorTargetUrl, addToDiscordUrl, - creditsUrl, initialResults, initialSelected, copyText}: GeneratorMainProps & GeneratorMainEvents) { - const [results, ] = + initialEditable: editable, + initialResults: values, + initialSelected: selections, + } +} + +export function MainGeneratorOnly({ + initialEditable, generatorTargetUrl, addToDiscordUrl, + creditsUrl, initialResults, initialSelected, + }: MainGeneratorProps) { + const [results, setResults] = useState>(initialResults) const [selected, setSelected] = - useState|null>(initialSelected ?? null) - const onCopy = useCallback(async (format: ExportFormat) => { - if (!copyText) { - return Promise.reject(Error("Copy functionality is not implemented")) - } - return copyText(exportScenario(Array.from(results.values()), format)) - }, [copyText, results]) - const onSelectionChange = useCallback((tableId: number, state: boolean) => { - const table = Array.from(initialResults.keys()).find(table => table.full && table.id === tableId) - if (!table) { - return - } - const newSelection = new RollSelections(selected) - if (state) { - newSelection.add(table) - } else { - newSelection.delete(table) - } - setSelected(newSelection) - }, [initialResults, selected, setSelected]) - const onSelect = useCallback((select: GeneratorSelect) => { - switch (select) { - case GeneratorSelect.All: - setSelected(new RollSelections(initialResults.keys())); - break; - case GeneratorSelect.None: - setSelected(new RollSelections()); - break; - } - }, [initialResults, setSelected]) + useState|null>(initialSelected) + const [editable, setEditable] = useState(initialEditable) + const [currentUrl, setCurrentUrl] = useState(null) + const abortController = useRef(null) const elements = useMemo(() => { const output: GeneratedElementProps[] = [] for (const result of results.values()) { @@ -76,18 +140,168 @@ function MainGeneratorOnly({ } return output }, [results, selected]) - return - - - + const onHistoryState = useCallback((state: unknown, url: URL) => { + // TODO: validate that this is in fact one of the states that this version of the page created, + // or at least is parseable by it + const {values, selections} = elementsToValuesAndSelections(state as GeneratedElementProps[]) + setResults(values) + setSelected(selections) + setCurrentUrl(url) + }, [selected, setResults, setSelected, setCurrentUrl]) + useHistoryState({ + state: elements, + key: results, + url: currentUrl, + onState: onHistoryState, + }) + const onCopy = useCallback(async (format: ExportFormat) => { + return copyText(exportScenario(Array.from(results.values()), format)) + }, [results]) + const onSelectionChange = useCallback((tableId: number, state: boolean) => { + const table = Array.from(initialResults.keys()).find(table => table.full && table.id === tableId) + if (!table) { + return + } + const newSelection = new RollSelections(selected) + if (state) { + newSelection.add(table) + } else { + newSelection.delete(table) + } + setSelected(newSelection) + }, [initialResults, selected, setSelected]) + const onSelect = useCallback((select: GeneratorSelect) => { + switch (select) { + case GeneratorSelect.All: + setSelected(new RollSelections(initialResults.keys())); + break; + case GeneratorSelect.None: + setSelected(new RollSelections()); + break; + } + }, [initialResults, setSelected]) + const onSubmit = useCallback( + ({url: href, data, enctype, method, target, action}: GeneratorFormInfo): GeneratorSubmitResult => { + const oldCtrl = abortController.current + if (oldCtrl) { + oldCtrl.abort() + abortController.current = null + } + switch (action) { + case GeneratorFormAction.Reroll: + case GeneratorFormAction.RerollAll: + case GeneratorFormAction.SaveScenario: + case GeneratorFormAction.OpenInGenerator: + // continue + break + case GeneratorFormAction.GoToResponses: + case GeneratorFormAction.GoToOffline: + default: + return { + allowSubmit: true + } + } + if (target) { + return { + allowSubmit: true + } + } + if (method.toUpperCase() !== "POST") { + return { + allowSubmit: true + } + } + let body: FormData|URLSearchParams + switch (enctype) { + case "application/x-www-form-urlencoded": + body = new URLSearchParams() + data.forEach((value, key) => { + if (typeof value !== 'string') { + return + } + body.append(key, value) + }) + break + case "multipart/form-data": + body = data + break + default: + return { + allowSubmit: true + } + } + const url = new URL(href) + const newCtrl = new AbortController() + abortController.current = newCtrl + const fetched = fetch(new Request(url, { + body: data, + method: "POST", + headers: [["Content-Type", enctype], ["Accept", "application/json"]], + redirect: 'follow', + window: null, + signal: newCtrl.signal, + })).then(async (response) => { + if (!response.ok) { + throw Error( + (response.body ? await response.text() : "") + || response.status > 0 + ? `${response.status} ${response.statusText}` + : "Network error") + } + const finalUrl = new URL(response.url) + switch (action) { + case GeneratorFormAction.OpenInGenerator: + setEditable(true) + setCurrentUrl(finalUrl) + break + case GeneratorFormAction.SaveScenario: + setEditable(false) + setCurrentUrl(finalUrl) + return copyText(finalUrl.toString()).then(() => Promise.resolve(`URL copied to clipboard!`)) + case GeneratorFormAction.Reroll: + case GeneratorFormAction.RerollAll: + const jsonText = await response.text() + const json = JSON.parse(jsonText) + if (!isRollTableResultArray(json)) { + throw Error("invalid JSON data") + } + const newResults = new RolledValues(action === GeneratorFormAction.RerollAll ? [] : results) + const newSelected = new RollSelections() + const tableLookup = [...results.keys()] + for (const result of json) { + const table = result.table + const oldTable = tableLookup.find((t) => (table.full && t.full && t.id === table.id) || (!table.full && !t.full && t.ordinal === table.ordinal)) + if (oldTable) { + newResults.delete(oldTable) + } + newResults.add(result) + newSelected.add(table) + } + setCurrentUrl(finalUrl) + setResults(newResults) + setSelected(newSelected) + break + } + }) + return { + allowSubmit: false, + status: fetched, + } + }, [setResults, setCurrentUrl, setSelected, results, abortController]) + + return ( + + + + + + ) } diff --git a/src/common/client/MainResponsesOnly.css b/src/common/client/MainResponsesOnly.css new file mode 100644 index 0000000..4dcb1f7 --- /dev/null +++ b/src/common/client/MainResponsesOnly.css @@ -0,0 +1,3 @@ +@import "Main.css"; +@import "ResponsesPage.css"; +@import "PageFooter.css"; diff --git a/src/common/client/MainResponsesOnly.tsx b/src/common/client/MainResponsesOnly.tsx new file mode 100644 index 0000000..dbd11a4 --- /dev/null +++ b/src/common/client/MainResponsesOnly.tsx @@ -0,0 +1,86 @@ +import { PageFooter, reconstituteFooterProps } from './PageFooter.js'; +import { + reconstituteResponses, + ResponsesPage, ResponsesTarget +} from './ResponsesPage.js'; +import type { ResponseTypeProps } from './ResponseType.js'; +import { useCallback, useMemo, useState } from 'preact/hooks'; +import { useHistoryState } from './useHistory.js'; +import { IncludesResponses } from './contexts.js'; +import { type ResponsesFormInfo, type ResponsesFormResult, ResponsesSubmitType } from './responsesForm.js'; + +export interface MainResponsesProps { + creditsUrl: string + targetUrl: string + target: ResponsesTarget + oldState?: string + startingTypes: ResponseTypeProps[] +} + +export function reconstituteMainResponsesOnly( + element: HTMLDivElement, partial?: Partial): MainResponsesProps { + + const {creditsUrl} = reconstituteFooterProps(element.querySelector("footer")!, partial) + const {types, targetUrl, target, oldState} = + reconstituteResponses(element.querySelector("#responses")!) + + return { + creditsUrl, + targetUrl, + target, + oldState, + startingTypes: types, + } +} + +export function MainResponsesOnly({ + creditsUrl, startingTypes, targetUrl, target, oldState}: MainResponsesProps) { + const [types, setTypes] = useState(startingTypes) + const selectedIDs = useMemo((): number[] => { + return types.map(type => { + return type.selectedTextId + }).filter((v): v is number => typeof v === 'number') + }, [types]) + useHistoryState({ + state: selectedIDs, + onState(state: unknown) { + // TODO: validate that this is in fact one of the states that this version of the page created + const ids = new Set(state as number[]) + setTypes(types.map(type => { + return { + ...type, + selectedTextId: type.contents.map(({result}) => result.textId).find(id => ids.has(id)) ?? null + } + })) + } + }) + const onSubmit = useCallback((d: ResponsesFormInfo): ResponsesFormResult => { + switch (d.action) { + case ResponsesSubmitType.ChangeSelected: + setTypes(types.map((props) => { + if (!props.contents.some((match) => match.result.textId === d.newSelectedTextId)) { + return props + } + return { + ...props, + selectedTextId: d.newSelectedTextId, + } + })) + return { + allowSubmit: false + } + case ResponsesSubmitType.ReturnToGenerator: + default: + return { + allowSubmit: true + } + } + }, [types, setTypes]) + return ( + + + + + + ) +} diff --git a/src/common/client/Page.less b/src/common/client/Page.css similarity index 100% rename from src/common/client/Page.less rename to src/common/client/Page.css diff --git a/src/common/client/PageFooter.less b/src/common/client/PageFooter.css similarity index 100% rename from src/common/client/PageFooter.less rename to src/common/client/PageFooter.css diff --git a/src/common/client/PageFooter.tsx b/src/common/client/PageFooter.tsx index e8fb2bc..a55042c 100644 --- a/src/common/client/PageFooter.tsx +++ b/src/common/client/PageFooter.tsx @@ -1,7 +1,6 @@ import { Fragment } from 'preact'; -import { IncludesResponses } from './ResponsesPage'; -import { IncludesGenerator } from './GeneratorPage'; import { useContext } from 'preact/hooks'; +import { IncludesGenerator, IncludesResponses } from './contexts.js'; export interface PageFooterProps { creditsUrl: string diff --git a/src/common/client/ResponseElement.css b/src/common/client/ResponseElement.css new file mode 100644 index 0000000..2aede7a --- /dev/null +++ b/src/common/client/ResponseElement.css @@ -0,0 +1,36 @@ +@import "ResultText.css"; +@import "Attribution.css"; + +.response { + margin-top: 0.3rem; + display: flex; + align-items: stretch; + flex-flow: row nowrap; + scroll-margin-top: 12rem; + list-style: none; +} + +.response.active { + position: relative; + min-height: 1.5rem; +} +.response.active::before { + width: 1rem; + margin: 0.2rem 0.2rem 0.2rem 0.5rem; + content: ""; + flex: 0 0 auto; + background-image: + linear-gradient(to bottom left, transparent 50%, currentColor 0), + linear-gradient(to bottom right, currentColor 50%, transparent 0); + background-size: 100% 50%; + background-repeat: no-repeat; + background-position: top, bottom; +} + +.response.active .resultText { + font-weight: bold; +} + +.response.active .attribution .button { + display: none; +} diff --git a/src/common/client/ResponseElement.less b/src/common/client/ResponseElement.less deleted file mode 100644 index 8622569..0000000 --- a/src/common/client/ResponseElement.less +++ /dev/null @@ -1,36 +0,0 @@ -@import "ResultText"; -@import "Attribution"; - -.response { - margin-top: 0.3rem; - display: flex; - align-items: stretch; - flex-flow: row nowrap; - scroll-margin-top: 12rem; - list-style: none; -} - -.response.active { - position: relative; - min-height: 1.5rem; - - &::before { - width: 1rem; - margin: 0.2rem 0.2rem 0.2rem 0.5rem; - content: ""; - flex: 0 0 auto; - background-image: - linear-gradient(to bottom left, transparent 50%, currentColor 0), - linear-gradient(to bottom right, currentColor 50%, transparent 0); - background-size: 100% 50%; - background-repeat: no-repeat; - background-position: top, bottom; - } - - & .resultText { - font-weight: bold; - } - & .attribution .button { - display: none; - } -} diff --git a/src/common/client/ResponseElement.tsx b/src/common/client/ResponseElement.tsx index 1886b32..702f309 100644 --- a/src/common/client/ResponseElement.tsx +++ b/src/common/client/ResponseElement.tsx @@ -1,16 +1,15 @@ -import { reconstituteResultText, ResultText, type ResultTextPropsFull } from './ResultText'; +import { reconstituteResultText, ResultText, type ResultTextPropsFull } from './ResultText.js'; import { Attribution, type AttributionPropsFull, type PartialAttributionPropsFull, reconstituteAttribution -} from './Attribution'; -import { FormButton } from './Button'; -import { IncludesGenerator } from './GeneratorPage'; -import { useCallback, useContext, useEffect, useState } from 'preact/hooks'; -import { type Context, createContext, createRef } from 'preact'; -import { pulseElement } from './pulseElement'; - -export const CurrentSelectedResponse: Context = createContext(null) +} from './Attribution.js'; +import { FormButton } from './Button.js'; +import { useContext, useEffect, useState } from 'preact/hooks'; +import { createRef } from 'preact'; +import { pulseElement } from './pulseElement.js'; +import { IncludesGenerator, EditableResponses } from './contexts.js'; +import { ResponsesSubmitType } from './responsesForm.js'; export interface ResponseElementProps { attribution: AttributionPropsFull @@ -18,10 +17,6 @@ export interface ResponseElementProps { selected: boolean } -export interface ResponseElementEvents { - onSelected?: (mappingId: number) => void -} - export interface PartialResponseElementProps { attribution?: PartialAttributionPropsFull result?: Partial @@ -40,14 +35,9 @@ export function reconstituteResponseElement(element: HTMLLIElement, partial?: Pa export const responseIdPrefix="response-" -export function ResponseElement({attribution, result, selected, onSelected}: ResponseElementProps & ResponseElementEvents) { - const includesGenerator = useContext(IncludesGenerator); +export function ResponseElement({attribution, result, selected}: ResponseElementProps) { + const editable = useContext(EditableResponses) const [lastSelected, setLastSelected] = useState(selected) - const onSelect = useCallback(() => { - if (onSelected) { - onSelected(result.mappingId) - } - }, [attribution, result, onSelected]) const ref = createRef() useEffect(() => { if (lastSelected !== selected) { @@ -57,12 +47,14 @@ export function ResponseElement({attribution, result, selected, onSelected}: Res } } }, [selected, lastSelected, setLastSelected, ref]); - return + return + {(editable && selected) ? : null} - {includesGenerator - ? Set in Generated Scenario - : null} + {!selected && editable + ? Set in Generated Scenario + : null} } diff --git a/src/common/client/ResponseType.less b/src/common/client/ResponseType.css similarity index 71% rename from src/common/client/ResponseType.less rename to src/common/client/ResponseType.css index 572c08b..1217e3a 100644 --- a/src/common/client/ResponseType.less +++ b/src/common/client/ResponseType.css @@ -1,6 +1,6 @@ -@import "ResponseElement"; -@import "Page"; -@import "TableHeader"; +@import "ResponseElement.css"; +@import "Page.css"; +@import "TableHeader.css"; .responseType { list-style: none; @@ -30,3 +30,8 @@ .responseTypeList { padding: 0; } + +.responseType .tableEmoji { + padding-right: 0.5rem; + user-select: text; +} diff --git a/src/common/client/ResponseType.tsx b/src/common/client/ResponseType.tsx index 40b23ba..50c12b1 100644 --- a/src/common/client/ResponseType.tsx +++ b/src/common/client/ResponseType.tsx @@ -5,36 +5,35 @@ import { TableHeaderDataset, tableIdentifier, TableTitle -} from './TableHeader'; +} from './TableHeader.js'; import { reconstituteResponseElement, ResponseElement, type ResponseElementProps, responseIdPrefix -} from './ResponseElement'; -import { useCallback } from 'preact/hooks'; +} from './ResponseElement.js'; export interface ResponseTypeProps { table: TableFullProps, - selectedMappingId: number | null, + selectedTextId: number | null, contents: Omit[], } export interface PartialResponseTypeProps { table?: Partial; - selectedMappingId?: number | null; + selectedTextId?: number | null; contents?: Omit[]; } export function reconstituteResponseType(element: HTMLLIElement, partial?: PartialResponseTypeProps): ResponseTypeProps { const table = reconstituteTable(element.querySelector('.tableHeader')!, partial?.table) as TableFullProps; - let selected: number | null | undefined = partial?.selectedMappingId ?? null, + let selected: number | null | undefined = partial?.selectedTextId ?? null, contents: Omit[] | undefined = partial?.contents; if (!contents) { contents = []; for (const child of Array.from(element.querySelector('.responseTypeList')!.children) as HTMLLIElement[]) { const childContents = reconstituteResponseElement(child); if (typeof selected === 'undefined' && childContents.selected) { - selected = childContents.result.mappingId; + selected = childContents.result.textId; } contents.push(childContents); } @@ -47,32 +46,22 @@ export function reconstituteResponseType(element: HTMLLIElement, partial?: Parti } return { table, - selectedMappingId: selected, + selectedTextId: selected, contents }; } -export interface ResponseTypeEvents { - onSelectResponse?: (tableId: number, mappingId: number) => void -} - export const responseListIdPrefix = 'responses-'; -export function ResponseType({ table, selectedMappingId, contents, onSelectResponse }: ResponseTypeProps & ResponseTypeEvents) { - const onSelectChild = useCallback((mappingId: number) => { - if (onSelectResponse) { - onSelectResponse(table.id, mappingId) - } - }, [onSelectResponse]); +export function ResponseType({ table, selectedTextId, contents }: ResponseTypeProps) { return {' '} {contents.map(result => - )} ; diff --git a/src/common/client/ResponsesPage.less b/src/common/client/ResponsesPage.css similarity index 77% rename from src/common/client/ResponsesPage.less rename to src/common/client/ResponsesPage.css index d593a8b..466e68e 100644 --- a/src/common/client/ResponsesPage.less +++ b/src/common/client/ResponsesPage.css @@ -1,5 +1,5 @@ -@import "Page"; -@import "ResponseType"; +@import "Page.css"; +@import "ResponseType.css"; #responsesHeader { position: sticky; @@ -29,12 +29,14 @@ overflow-x: visible; } -#returnToGenerator { +#returnToGenerator, #goToGenerator { flex-basis: 50%; } -.responseNavEmoji { - margin-right: 0.2rem; +#responsesHeader .tableEmoji { + display: inline-block; + font-size: 100%; + transform: scale(140%); } #responsesHead { diff --git a/src/common/client/ResponsesPage.tsx b/src/common/client/ResponsesPage.tsx index 96477a1..5c0dcc6 100644 --- a/src/common/client/ResponsesPage.tsx +++ b/src/common/client/ResponsesPage.tsx @@ -1,42 +1,106 @@ -import { createContext } from 'preact'; -import { responseListIdPrefix, ResponseType, type ResponseTypeProps } from './ResponseType'; -import { IncludesGenerator } from './GeneratorPage'; -import { LinkButton } from './Button'; -import { TableEmoji, tableIdentifier, TableName } from './TableHeader'; +import { reconstituteResponseType, responseListIdPrefix, ResponseType, type ResponseTypeProps } from './ResponseType.js'; +import { FormButton, LinkButton } from './Button.js'; +import { TableEmoji, tableIdentifier, TableName } from './TableHeader.js'; import { useContext } from 'preact/hooks'; - -export const IncludesResponses = createContext(false) +import { type FormInfo, useSubmitCallback } from './useSubmitCallback.js'; +import { usePopup } from './usePopup.js'; +import { useCallback } from 'preact/hooks'; +import { EditableResponses, IncludesGenerator } from './contexts.js'; +import { type ResponsesFormInfo, type ResponsesFormResult, ResponsesSubmitType } from './responsesForm.js'; export interface ResponsesProps { + targetUrl: string + target: ResponsesTarget + oldState?: string types: ResponseTypeProps[] } -export interface ResponsesEvents { - onSelectResponse: (tableId: number, mappingId: number) => void +export enum ResponsesTarget { + Scenario = "Scenario", + Generator = "Generator", + API = "API", +} + +export function reconstituteResponses(element: HTMLFormElement): ResponsesProps { + return { + targetUrl: element.action, + target: element.dataset.target as ResponsesTarget, + oldState: element.querySelector('input#oldState')?.value, + types: Array.from(element.querySelectorAll("#responseLists li.responseType")) + .map(el => reconstituteResponseType(el)) + } } -// TODO: add a "reconstitute" function for ResponsesPage +export interface ResponsesEvents { + onSubmit?(i: ResponsesFormInfo): ResponsesFormResult +} -export function ResponsesPage({ types, onSelectResponse }: ResponsesProps & ResponsesEvents) { +export function ResponsesPage({ targetUrl, target, oldState, types, onSubmit }: ResponsesProps & ResponsesEvents) { const includesGenerator = useContext(IncludesGenerator); - return - + const [headerPopupRef, showHeaderPopup] = usePopup() + + const submitHandler = useCallback((d: FormInfo) => { + if (!onSubmit) { + return {allowSubmit: true} + } + const action = d.button?.name + let info: ResponsesFormInfo + switch (action) { + case ResponsesSubmitType.ChangeSelected: + info = { ...d, action: ResponsesSubmitType.ChangeSelected, newSelectedTextId: parseInt(d.button!.value) } + break + case ResponsesSubmitType.ReturnToGenerator: + info = { ...d, action: ResponsesSubmitType.ReturnToGenerator } + break + default: + return {allowSubmit: true} + } + const {allowSubmit, status} = onSubmit(info) + + if (status) { + status.then((text) => { + if (text) { + return showHeaderPopup(text, "success") + } + }).catch((ex) => { + if (ex instanceof Error) { + return showHeaderPopup(`Failed to ${action}: ${ex.message}`, 'error') + } else if (ex) { + return showHeaderPopup(`Failed to ${action}: ${ex}`, 'error') + } else { + return showHeaderPopup(`Failed to ${action}`, 'error') + } + }) + } + return {allowSubmit} + }, [onSubmit, showHeaderPopup]) + + const submitCallback = useSubmitCallback(submitHandler) + + return + {(oldState && target === ResponsesTarget.API) ? : null} + Possible Responses {types.map(type => - {' '} + )} {includesGenerator - ? Return to Generator - : null} + ? Return to {target === ResponsesTarget.API ? "Generator" : "Scenario"} + : target === ResponsesTarget.API + ? Return to Generator + : target === ResponsesTarget.Scenario + ? Return to Scenario + : Go to Generator} - - {types.map(type => - )} - - + + + {types.map(type => + )} + + + } diff --git a/src/common/client/ResultText.less b/src/common/client/ResultText.css similarity index 60% rename from src/common/client/ResultText.less rename to src/common/client/ResultText.css index 5eb4a74..5e73152 100644 --- a/src/common/client/ResultText.less +++ b/src/common/client/ResultText.css @@ -1,3 +1,5 @@ +@import "pulseElement.css"; + .resultText { flex: 1 1 auto; appearance: none; @@ -18,20 +20,20 @@ user-select: text; transition: background-color 0.2s ease; border-radius: 0.3rem; +} - &:hover:not(:active) { - background-color: #BFBFBF60; - } +.resultText:hover:not(:active) { + background-color: #BFBFBF60; +} - &:focus:not(:active) { - background-color: #9F9FFF90; - } +.resultText:focus:not(:active) { + background-color: #9F9FFF90; +} - &:focus:hover:not(:active) { - background-color: #8F8FDF90; - } +.resultText:focus:hover:not(:active) { + background-color: #8F8FDF90; +} - &:active { - background-color: #3F3FFFA0; - } +.resultText:active { + background-color: #3F3FFFA0; } diff --git a/src/common/client/ResultText.tsx b/src/common/client/ResultText.tsx index 33da920..b250a30 100644 --- a/src/common/client/ResultText.tsx +++ b/src/common/client/ResultText.tsx @@ -1,5 +1,6 @@ -import { useEffect, useRef, useState } from 'preact/hooks'; -import { pulseElement } from './pulseElement'; +import { useCallback, useEffect, useRef, useState } from 'preact/hooks'; +import { pulseElement } from './pulseElement.js'; +import { createRef } from 'preact'; export interface ResultTextPropsBase { text: string @@ -8,33 +9,33 @@ export interface ResultTextPropsBase { export interface ResultTextPropsFull extends ResultTextPropsBase { mappingId: number textId: number - updated: Date } export interface ResultTextPropsLimited extends ResultTextPropsBase { mappingId?: null - textId?: null - updated?: null + textId: number|null } export type ResultTextProps = ResultTextPropsFull|ResultTextPropsLimited export function reconstituteResultText(button: HTMLButtonElement, partial: Partial = {}): ResultTextProps { const text = button.innerText - if (typeof partial.mappingId ?? button.dataset["mappingId"] === "undefined") { - return {text} + const textId = typeof (partial.textId ?? button.dataset["textId"]) === "undefined" + ? null + : (partial.textId ?? parseInt(button.dataset["textId"]!)) + if (textId === null || typeof (partial.mappingId ?? button.dataset["mappingId"]) === "undefined") { + return {text, textId} } else { return { text, mappingId: partial.mappingId ?? parseInt(button.dataset["mappingId"]!), - textId: partial.textId ?? parseInt(button.dataset["textId"]!), - updated: partial.updated ?? new Date(parseInt(button.dataset["updated"]!)) + textId: textId, } } } -export function ResultText({text, mappingId, textId, updated}: ResultTextProps) { - const ref = useRef(null) +export function ResultText({text, mappingId, textId}: ResultTextProps) { + const ref = createRef() const [lastText, setLastText] = useState(text) useEffect(() => { if (text !== lastText) { @@ -44,8 +45,16 @@ export function ResultText({text, mappingId, textId, updated}: ResultTextProps) } } }, [ref, text, lastText, setLastText]); - return { + if (ref.current) { + ref.current.focus() + } + }, [ref]) + return {text} } diff --git a/src/common/client/TableHeader.less b/src/common/client/TableHeader.css similarity index 100% rename from src/common/client/TableHeader.less rename to src/common/client/TableHeader.css diff --git a/src/common/client/contexts.ts b/src/common/client/contexts.ts new file mode 100644 index 0000000..f74a7bb --- /dev/null +++ b/src/common/client/contexts.ts @@ -0,0 +1,5 @@ +import { createContext } from 'preact'; + +export const IncludesGenerator = createContext(false) +export const IncludesResponses = createContext(false) +export const EditableResponses = createContext(false) diff --git a/src/common/client/pulseElement.less b/src/common/client/pulseElement.css similarity index 100% rename from src/common/client/pulseElement.less rename to src/common/client/pulseElement.css diff --git a/src/common/client/pulseElement.ts b/src/common/client/pulseElement.ts index 5ddbcfb..9ba41d6 100644 --- a/src/common/client/pulseElement.ts +++ b/src/common/client/pulseElement.ts @@ -7,6 +7,9 @@ function onPulseEnd(e: AnimationEvent): void { } export function pulseElement(element: HTMLElement) { + if (!element.offsetParent) { + return + } element.removeEventListener("animationend", onPulseEnd) element.removeEventListener("animationcancel", onPulseEnd) if (element.classList.contains("pulse")) { diff --git a/src/common/client/responsesForm.ts b/src/common/client/responsesForm.ts new file mode 100644 index 0000000..e0f85a8 --- /dev/null +++ b/src/common/client/responsesForm.ts @@ -0,0 +1,19 @@ +import type { FormInfo, FormReturnType } from './useSubmitCallback.js'; + +export enum ResponsesSubmitType { + ChangeSelected = "change selected", + ReturnToGenerator = "return to generator", +} +export interface ResponsesReturnEvent extends FormInfo { + action: ResponsesSubmitType.ReturnToGenerator +} +export interface ResponsesSelectEvent extends FormInfo { + action: ResponsesSubmitType.ChangeSelected + newSelectedTextId: number +} + +export type ResponsesFormInfo = ResponsesReturnEvent|ResponsesSelectEvent + +export interface ResponsesFormResult extends FormReturnType { + status?: Promise +} diff --git a/src/common/client/useClipboard.ts b/src/common/client/useClipboard.ts new file mode 100644 index 0000000..2fea172 --- /dev/null +++ b/src/common/client/useClipboard.ts @@ -0,0 +1,8 @@ +const clipboard = typeof window !== 'undefined' && window.navigator && window.navigator.clipboard + +export async function copyText(text: string): Promise { + if (!clipboard) { + throw Error("Clipboard functionality not supported here") + } + return clipboard.writeText(text) +} diff --git a/src/common/client/useHistory.ts b/src/common/client/useHistory.ts new file mode 100644 index 0000000..325b4ed --- /dev/null +++ b/src/common/client/useHistory.ts @@ -0,0 +1,73 @@ +import { useCallback, useEffect, useRef } from 'preact/hooks'; + +export interface HistoryProps { + state: {}|null, + key?: {}|null + url?: URL|null + onState(state: unknown, url: URL): void +} + +const history = typeof window !== 'undefined' && window.history + +export function getSameOriginURL(target: URL|null|undefined, base: URL): URL { + if (!target) { + return base + } + const isFile = base.protocol === "file" + if (isFile) { + return new URL(target?.hash, base) + } + const sameOrigin = !!target && base.origin === target.origin + if (sameOrigin) { + return target + } else { + return new URL(target?.search ?? "?" + target?.hash ?? "", base) + } +} + +export function useHistoryState({state: userState, key: givenKey = userState, url: givenUrl, onState}: HistoryProps): void { + const key = useRef(givenKey), + url = useRef(null), + firstRender = useRef(true), + popRender = useRef(false); + useEffect(() => { + if (history) { + const currentUrl = new URL(window.location.href) + const effectiveUrl = getSameOriginURL(givenUrl, currentUrl) + if (firstRender.current) { + firstRender.current = false + if (history.state !== null) { + popRender.current = true + onState(history.state, currentUrl) + } else { + history.replaceState(userState, "", effectiveUrl) + } + } else if (popRender) { + popRender.current = false + key.current = givenKey + url.current = effectiveUrl + history.replaceState(userState, "", effectiveUrl) + } else { + if (givenKey !== key.current || effectiveUrl !== url.current) { + key.current = givenKey + url.current = effectiveUrl + history.pushState(userState, "", effectiveUrl) + } else { + history.replaceState(userState, "", effectiveUrl) + } + } + } + }, [url, key, userState, givenKey, firstRender, popRender, givenUrl]) + const onPopState = useCallback(() => { + if (history) { + popRender.current = true + onState(history.state, new URL(window.location.href)) + } + }, [popRender, onState]) + useEffect(() => { + if (history) { + window.addEventListener("popstate", onPopState) + return () => window.removeEventListener("popstate", onPopState) + } + }, [onPopState]) +} diff --git a/src/common/client/usePopup.less b/src/common/client/usePopup.css similarity index 100% rename from src/common/client/usePopup.less rename to src/common/client/usePopup.css diff --git a/src/common/client/useSubmitCallback.ts b/src/common/client/useSubmitCallback.ts new file mode 100644 index 0000000..2ddefad --- /dev/null +++ b/src/common/client/useSubmitCallback.ts @@ -0,0 +1,44 @@ +import { useCallback } from 'preact/hooks'; + +export interface FormInfo { + data: FormData + method: string + url: string + enctype: string + target: string + button: HTMLButtonElement|HTMLInputElement|null +} + +export interface FormReturnType { + allowSubmit?: boolean +} + +export function useSubmitCallback(onSubmit?: (data: FormInfo) => FormReturnType|undefined): (e: SubmitEvent) => void { + return useCallback((e: SubmitEvent) => { + if (!onSubmit) { + return + } + const button = + e.submitter instanceof HTMLButtonElement || e.submitter instanceof HTMLInputElement ? e.submitter : null + const form = e.target instanceof HTMLFormElement ? e.target : null + if (!form) { + return + } + const data = new FormData(form, e.submitter) + const method = button?.formMethod ?? form.method + const url = button?.formAction ?? form.action + const enctype = button?.formEnctype ?? form.enctype + const target = button?.formTarget ?? form.target + const {allowSubmit} = onSubmit({ + data, + method, + url, + enctype, + target, + button, + }) ?? {allowSubmit: true} + if (!allowSubmit) { + e.preventDefault() + } + }, [onSubmit]) +} diff --git a/src/common/client/util.ts b/src/common/client/util.ts deleted file mode 100644 index 8b13789..0000000 --- a/src/common/client/util.ts +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/common/rolltable.ts b/src/common/rolltable.ts index 75b5e50..cada727 100644 --- a/src/common/rolltable.ts +++ b/src/common/rolltable.ts @@ -1,26 +1,92 @@ import markdownEscape from 'markdown-escape'; -import { bbcodeEscape } from './bbcode'; +import { bbcodeEscape } from './bbcode.js'; -export interface RollTableLimited { - readonly full: false, +export interface RollTableBase { + readonly full: false|'details'|'results'|'input' readonly emoji: string, readonly title: string, readonly header: string, readonly ordinal: number, } -export interface RollTableDetailsBase { +export interface RollTableLimited extends RollTableBase { + readonly full: false, +} + +export interface RollTableDetailsBase extends RollTableBase { + readonly full: 'details'|'results'|'input' readonly id: number, readonly identifier: string, - readonly emoji: string, readonly name: string, - readonly title: string, - readonly header: string, - readonly ordinal: number, } +export interface RollTableDetailsNoResults extends RollTableDetailsBase { + readonly full: 'details' +} + +export interface RollTableDetailsAndResultsTruncated extends RollTableDetailsBase { + readonly full: 'results' +} + +export interface RollTableDetailsAndResults extends RollTableDetailsAndResultsTruncated { + readonly resultsById: ReadonlyMap> + readonly resultsByText: ReadonlyMap> +} + +interface RollTableDetailsAndResultsInternal extends RollTableDetailsAndResultsTruncated { + readonly resultsById: Map> + readonly resultsByText: Map> +} + +function isRollTableDetailsResultMap(map: ReadonlyMap, table: RollTableDetailsAndResults, keytype: 'number'): map is ReadonlyMap> +function isRollTableDetailsResultMap(map: ReadonlyMap, table: RollTableDetailsAndResults, keytype: 'string'): map is ReadonlyMap> +function isRollTableDetailsResultMap(map: ReadonlyMap, table: RollTableDetailsAndResults, keytype: 'number'|'string'): map is ReadonlyMap> { + for (const [key, value] of map.entries()) { + if (typeof key !== keytype) { + return false + } + if (!isRollTableResult(value, {expectTable: table}) || value.table !== table) { + return false + } + } + return true +} + +function hasRollTableResultMaps(table: RollTableDetailsBase & {readonly full: 'results'}): table is RollTableDetailsAndResults { + return ("resultsById" in table && table.resultsById instanceof Map && isRollTableDetailsResultMap(table.resultsById, table as RollTableDetailsAndResults, 'number') + && "resultsByText" in table && table.resultsByText instanceof Map && isRollTableDetailsResultMap(table.resultsByText, table as RollTableDetailsAndResults, 'string')) +} + +export type RollTableDetails = RollTableDetailsNoResults|RollTableDetailsAndResults +export type RollTableDetailsTruncated = RollTableDetailsNoResults|RollTableDetailsAndResultsTruncated + +function isRollTableDetails(table: RollTableBase & {readonly full: 'details'|'results'}, options: {skipResultsCheck: true}): table is RollTableDetailsTruncated +function isRollTableDetails(table: RollTableBase & {readonly full: 'details'|'results'}, options?: {skipResultsCheck?: false}): table is RollTableDetails +function isRollTableDetails(table: RollTableBase & {readonly full: 'details'|'results'}, options?: {skipResultsCheck?: boolean}): table is RollTableDetails|RollTableDetailsTruncated +function isRollTableDetails(table: RollTableBase & {readonly full: 'details'|'results'}, {skipResultsCheck}: {skipResultsCheck?: boolean} = {}): table is RollTableDetails|RollTableDetailsTruncated { + return ("id" in table && typeof table.id === "number" + && "identifier" in table && typeof table.identifier === "string" + && "name" in table && typeof table.name === "string" + && (table.full === 'details' || skipResultsCheck || hasRollTableResultMaps(table as RollTableDetailsBase & {readonly full: 'results'}))) +} + + export type RollTable = RollTableLimited | RollTableDetails -export type RollTableOrInput = RollTable | RollTableDetailsInputResults +export type RollTableTruncated = RollTableLimited | RollTableDetailsTruncated + +export function isRollTable(table: unknown, options: {skipResultsCheck: true}): table is RollTableTruncated +export function isRollTable(table: unknown, options?: {skipResultsCheck?: false}): table is RollTable +export function isRollTable(table: unknown, options?: {skipResultsCheck?: boolean}): table is RollTableTruncated +export function isRollTable(table: unknown, options: {skipResultsCheck?: boolean} = {}): table is RollTableTruncated { + return (typeof table === "object" && table !== null + && "emoji" in table && typeof table.emoji === 'string' + && "title" in table && typeof table.title === 'string' + && "header" in table && typeof table.header === 'string' + && "ordinal" in table && typeof table.ordinal === 'number' + && "full" in table && (table.full === false + || ((table.full === 'details' || table.full === 'results') + && isRollTableDetails(table as RollTableBase & {readonly full: 'details'|'results'}, options)))) +} export function rollTableToString(v: RollTable) { if (v.full) { @@ -38,6 +104,18 @@ export function rollTableToStringShort(v: RollTable) { } } +export interface RollTableDetailsInputResults extends RollTableDetailsBase { + readonly full: 'input' + readonly resultsById: Iterable|readonly [number, RollTableResultOrLookup]>; +} + +export type RollTableDetailsOrInput = RollTableDetails | RollTableDetailsInputResults +export type RollTableOrInput = RollTableTruncated | RollTableDetailsInputResults + +function isRollTableDetailsInputPair(v: unknown): v is readonly [number, RollTableResultOrLookup] { + return Array.isArray(v) && v.length === 2 && typeof v[0] === 'number' && isRollTableResult(v[1]) +} + export const MAX_RESULT_LENGTH = 150; export const MAX_IDENTIFIER_LENGTH = 20; export const MAX_NAME_LENGTH = 50; @@ -50,6 +128,18 @@ export interface RollTableAuthor { readonly relation: string; } +export function authorToString(v: RollTableAuthor): string { + return `${v.relation} ${v.name} (${v.id})` +} + +export function isRollTableAuthor(author: unknown): author is RollTableAuthor { + return (typeof author === "object" && author !== null + && 'id' in author && typeof author.id === 'number' + && 'name' in author && typeof author.name === 'string' + && 'url' in author && (author.url === null || typeof author.url === 'string') + && 'relation' in author && typeof author.relation === 'string'); +} + export interface RollTableResultSet { readonly id: number; readonly name: string | null; @@ -57,9 +147,23 @@ export interface RollTableResultSet { readonly global: boolean; } +export function setToString(v: RollTableResultSet): string { + return `${v.global ? 'global' : 'local'} ${v.name ?? 'set'}` +} + +export function isRollTableResultSet(set: unknown): set is RollTableResultSet { + return (typeof set === 'object' && set !== null + && 'id' in set && typeof set.id === 'number' + && 'name' in set && (set.name === null || typeof set.name === 'string') + && 'description' in set && (set.description === null || typeof set.description === 'string') + && 'global' in set && typeof set.global === 'boolean') +} + export interface RollTableResultLimited { readonly full: false, readonly text: string, + readonly textId: number|null + readonly tableId?: never readonly table: T, } @@ -72,27 +176,38 @@ export interface RollTableResultFull = RollTableResultLimited | RollTableResultFull -export type RollTableResultOrLookup = RollTableResultFull|RollTableResultLookup - -export function setToString(v: RollTableResultSet): string { - return `${v.global ? 'global' : 'local'} ${v.name ?? 'set'}` -} -export function authorToString(v: RollTableAuthor): string { - return `${v.relation} ${v.name} (${v.id})` +export function isRollTableResult(result: unknown, options: {expectTable: TableT, tableCheckOptions?: {skipResultsCheck?: boolean}}): result is RollTableResult +export function isRollTableResult(result: unknown, options: {expectTable?: never, tableCheckOptions: {skipResultsCheck: true}}): result is RollTableResult +export function isRollTableResult(result: unknown, options?: {expectTable?: never, tableCheckOptions: {skipResultsCheck: false}}): result is RollTableResult +export function isRollTableResult(result: unknown, options?: {expectTable?: RollTableTruncated, tableCheckOptions?: {skipResultsCheck?: boolean}}): result is RollTableResult +export function isRollTableResult(result: unknown, {expectTable, tableCheckOptions}: {expectTable?: RollTableTruncated, tableCheckOptions?: {skipResultsCheck?: boolean}} = {}): result is RollTableResult { + return (typeof result === "object" && result !== null + && 'table' in result && (expectTable ? result.table === expectTable : isRollTable(result.table, tableCheckOptions)) + && !('tableId' in result && typeof result.tableId !== 'undefined') + && 'textId' in result && (result.textId === null || typeof result.textId === 'number') + && 'text' in result && typeof result.text === 'string' + && 'full' in result && ( + result.full === false + || (result.full === true + && typeof result.textId === 'number' + && 'mappingId' in result && typeof result.mappingId === 'number' + && 'set' in result && isRollTableResultSet(result.set) + && 'author' in result && (result.author === null || isRollTableAuthor(result.author)) + ))); +} + +export function isRollTableResultArray(array: unknown, resultOptions: {expectTable: TableT, tableCheckOptions?: {skipResultsCheck?: boolean}}): array is RollTableResult[] +export function isRollTableResultArray(array: unknown, resultOptions: {expectTable?: never, tableCheckOptions: {skipResultsCheck: true}}): array is RollTableResult[] +export function isRollTableResultArray(array: unknown, resultOptions?: {expectTable?: never, tableCheckOptions?: {skipResultsCheck?: false}}): array is RollTableResult[] +export function isRollTableResultArray(array: unknown, resultOptions?: {expectTable?: RollTable, tableCheckOptions?: {skipResultsCheck?: boolean}}): array is RollTableResult[] +export function isRollTableResultArray(array: unknown, resultOptions: {expectTable?: RollTable, tableCheckOptions?: {skipResultsCheck?: boolean}} = {}): array is RollTableResult[] { + return Array.isArray(array) && array.every(item => isRollTableResult(item, resultOptions)) } -export function rollResultToString(v: RollTableResult) { - if (v.full) { - return `${v.text} (${v.mappingId}: ${v.textId}/${rollTableToStringShort(v.table)}/${setToString(v.set)}/${v.author ? authorToString(v.author) : 'no author'})` - } else { - return `${v.text} (???: ${rollTableToStringShort(v.table)})` - } -} export interface RollTableResultLookup { readonly textId: number, readonly mappingId: number, @@ -101,39 +216,19 @@ export interface RollTableResultLookup { readonly text: string, readonly setId: number, readonly authorId: number | null, - readonly updated: Date, } -export interface RollTableDetailsInputResults extends RollTableDetailsBase { - readonly full: 'input' - readonly resultsById: Iterable|readonly [number, RollTableResultOrLookup]>; -} - -function isResultArray(v: unknown): v is readonly [unknown, RollTableResultOrLookup] { - return Array.isArray(v) && isRollTableResult(v[1]) -} - -export type RollTableDetailsOrInput = RollTableDetails | RollTableDetailsInputResults - -export interface RollTableDetailsNoResults extends RollTableDetailsBase { - readonly full: 'details' -} - -export interface RollTableDetailsAndResults extends RollTableDetailsBase { - readonly full: 'results' - readonly resultsById: ReadonlyMap> - readonly resultsByText: ReadonlyMap> -} +export type RollTableResultOrLookup = RollTableResultFull|RollTableResultLookup -interface RollTableDetailsAndResultsInternal extends RollTableDetailsBase { - readonly full: 'results' - readonly resultsById: Map> - readonly resultsByText: Map> +export function rollResultToString(v: RollTableResult) { + if (v.full) { + return `${v.text} (${v.mappingId}: ${v.textId}/${rollTableToStringShort(v.table)}/${setToString(v.set)}/${v.author ? authorToString(v.author) : 'no author'})` + } else { + return `${v.text} (???: ${rollTableToStringShort(v.table)})` + } } -export type RollTableDetails = RollTableDetailsNoResults|RollTableDetailsAndResults - -function compareRollTables(a: RollTableOrInput, b: RollTableOrInput): number { +export function compareRollTables(a: RollTableOrInput, b: RollTableOrInput): number { return (a.ordinal - b.ordinal) || ("id" in a !== "id" in b ? "id" in a ? -1 : 1 : 0) || ("id" in a && "id" in b ? a.id - b.id : 0) || @@ -150,9 +245,9 @@ function compareRollTableResults(a: RollTableResult|null|undefined, b: RollTable if (a && a.full) { if (b && b.full) { if (a.set.global === b.set.global) { - return a.updated.getDate() < b.updated.getDate() ? preferA : preferB + return equalPreference } else { - return !a.set.global ? preferA : preferB + return !b.set.global ? preferB : preferA } } else { return preferA @@ -166,16 +261,12 @@ function compareRollTableResults(a: RollTableResult|null|undefined, b: RollTable } } -function isRollTableResult(result: unknown): result is RollTableResult { - return (typeof result === "object" && result !== null && 'table' in result - && !('tableId' in result && typeof result.tableId !== 'undefined') && 'full' in result); -} - export function getResultFrom(table: RollTable, originalResult: RollTableResult): RollTableResult { const dbResult = table.full === "results" ? table.resultsByText.get(originalResult.text) : null return dbResult ?? { full: false, table, + textId: originalResult.textId, text: originalResult.text } } @@ -327,10 +418,10 @@ export class RollTableDatabase implements Iterable { } addResult(result: RollTableResultOrLookup|readonly [number, RollTableResultOrLookup]): RollTableResultFull { - if (isResultArray(result)) { + if (isRollTableDetailsInputPair(result)) { const [, innerResult] = result as [number, RollTableResultOrLookup]; return this.addResult(innerResult); - } else if (isRollTableResult(result)) { + } else if ("table" in result && result.table) { if (!this.tables.has(result.table.id)) { this.addTableInternal({... result.table, full: 'details'}) } @@ -346,8 +437,7 @@ export class RollTableDatabase implements Iterable { setId: result.set.id, textId: result.textId, text: result.text, - mappingId: result.mappingId, - updated: result.updated + mappingId: result.mappingId }) } else { const internalTable = this.tablesById.get(result.tableId); @@ -370,8 +460,7 @@ export class RollTableDatabase implements Iterable { text: result.text, table: internalTable, author: internalAuthor, - set: internalSet, - updated: result.updated + set: internalSet }; if (compareRollTableResults(oldText, out) > 0) { internalTable.resultsByText.set(out.text, out); @@ -496,6 +585,13 @@ export function generatedContentsToString(contents: GeneratedContents): string { } export class RolledValues = RollTableResult> extends Map { + constructor() + constructor(values: Iterable|null) + constructor(keyValues: Iterable<[T, U]>|null) + constructor(values?: Iterable|Iterable<[T, U]>|null) { + super(values && [...values].map(v => Array.isArray(v) ? v : [v.table, v])); + } + [Symbol.iterator](): IterableIterator<[T, U]> { return this.entries(); } diff --git a/src/common/template.ts b/src/common/template.ts deleted file mode 100644 index e69de29..0000000 diff --git a/src/common/tsconfig.json b/src/common/tsconfig.json deleted file mode 100644 index a804e3e..0000000 --- a/src/common/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "target": "es2015", - "module": "ES2015", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "moduleResolution": "NodeNext", - "strict": true, - "skipLibCheck": true, - "lib": ["DOM"], - "jsx": "react-jsx", - "jsxImportSource": "preact", - "paths": { - "react": ["./node_modules/preact/compat/"], - "react-dom": ["./node_modules/preact/compat/"] - } - } -} diff --git a/src/server/db/database.ts b/src/server/db/database.ts index 220740b..6fb7b49 100644 --- a/src/server/db/database.ts +++ b/src/server/db/database.ts @@ -5,20 +5,18 @@ import { type GeneratedState, type InProgressGeneratedContents, type InProgressGeneratedState, - RolledValues, rollOn, rollResultToString, + RolledValues, rollOn, RollSelections, type RollTable, type RollTableAuthor, RollTableDatabase, type RollTableDetailsNoResults, type RollTableResultFull, -} from '../../common/rolltable'; -import { type PreparedQueries, type QueryOutput, TypedDBWrapper } from './querytypes'; -import { DatabaseQueries } from './queries'; +} from '../../common/rolltable.js'; +import { type PreparedQueries, type QueryOutput, TypedDBWrapper } from './querytypes.js'; +import { DatabaseQueries } from './queries.js'; -function processOperationResult(result: QueryOutput<(typeof DatabaseQueries)['getResultMappingsForDiscordSet']>[number] | undefined): (RollTableResultFull & { - status: 'updated' | 'existing' -}) | undefined { +function processOperationResult(result: QueryOutput<(typeof DatabaseQueries)['getResultMappingsForDiscordSet']>[number] | undefined): (RollTableResultFull | undefined) { if (!result) { return result; } @@ -49,18 +47,17 @@ function processOperationResult(result: QueryOutput<(typeof DatabaseQueries)['ge description: result.setDescription, global: !!(result.setGlobal) }, - updated: new Date(result.updated), - status: result.status }; } +// TODO: add some caching for read-response-database style actions export class Database { private readonly db: TypedDBWrapper; private readonly queries: PreparedQueries; constructor(db: D1Database) { this.db = new TypedDBWrapper(db); - this.queries = this.db.prepareAll(DatabaseQueries); + this.queries = this.db.prepareOrRetrieveAll(DatabaseQueries); } async autocompleteTable(tableSoFar: string) { @@ -91,7 +88,6 @@ export class Database { setSnowflake: setId }), this.queries.getResultMappingsForDiscordSet({ - timestamp, tableIdentifier: table, text, setSnowflake: setId, @@ -102,30 +98,32 @@ export class Database { if (!result) { throw Error('failed adding the new response'); } - return { - ...result, - status: result.status === 'updated' ? 'added' : 'existed' - }; + return result; } - async editResponseFromDiscord(timestamp: number, table: number | string, oldText: string, newText: string, userId: string, username: string, setId: string): Promise<{ + async editResponseFromDiscord(table: number | string, oldText: string, newText: string, userId: string, username: string, setId: string): Promise<{ status: 'nonexistent' } | { status: 'noneditable', old: RollTableResultFull } | { - status: 'conflict' | 'updated', + status: 'edited'|'conflicting', old: RollTableResultFull, new: RollTableResultFull, }> { - const [oldResults, , , , newResults] = await this.db.batch( + const [oldResultsBefore, newResultsBefore, , , , oldResultsAfter, newResultsAfter] = await this.db.batch( this.queries.getResultMappingsForDiscordSet({ - timestamp, tableIdentifier: table, text: oldText, setSnowflake: setId, includeGlobal: true }), + this.queries.getResultMappingsForDiscordSet({ + tableIdentifier: table, + text: newText, + setSnowflake: setId, + includeGlobal: true + }), this.queries.addResultForEditMapping({ tableIdentifier: table, oldText, @@ -141,7 +139,6 @@ export class Database { setSnowflake: setId }), this.queries.editMappingForDiscord({ - timestamp, tableIdentifier: table, oldText, newText, @@ -149,26 +146,31 @@ export class Database { setSnowflake: setId }), this.queries.getResultMappingsForDiscordSet({ - timestamp, + tableIdentifier: table, + text: oldText, + setSnowflake: setId, + includeGlobal: false + }), + this.queries.getResultMappingsForDiscordSet({ tableIdentifier: table, text: newText, setSnowflake: setId, includeGlobal: false }) ); - const oldResult = processOperationResult(oldResults[0]); + const oldResult = processOperationResult(oldResultsBefore[0]); if (!oldResult) { return { status: 'nonexistent' }; } if (oldResult.set?.global) { return { status: 'noneditable', old: oldResult }; } - const newResult = processOperationResult(newResults[0]); + const newResult = processOperationResult(newResultsAfter[0]); if (!newResult) { throw Error('failed to update response'); } return { - status: newResult.status === 'updated' ? 'updated' : 'conflict', + status: 'edited', old: oldResult, new: newResult }; @@ -182,7 +184,6 @@ export class Database { }> { const [oldResults, deleted] = await this.db.batch( this.queries.getResultMappingsForDiscordSet({ - timestamp: null, tableIdentifier: table, text, setSnowflake: setId, @@ -218,7 +219,6 @@ export class Database { status: 'existent', } & RollTableResultFull)> { const results = await this.db.run(this.queries.getResultMappingsForDiscordSet({ - timestamp: null, tableIdentifier: table, text, setSnowflake: setId, @@ -294,7 +294,7 @@ export class Database { tables: tables.map(v => ({ ...v, full: 'details' })), authors, sets, - results: mappings.map(v => ({ ...v, updated: new Date(v.updated) })) + results: mappings.map(v => ({ ...v })) }); if (!oldResults && !reroll) { return db; @@ -332,6 +332,7 @@ export class Database { const result = lookupResult ?? { full: false, text: text, + textId: null, table } rolled.add(result); diff --git a/src/server/db/queries.ts b/src/server/db/queries.ts index fa4fe6f..2f3e261 100644 --- a/src/server/db/queries.ts +++ b/src/server/db/queries.ts @@ -1,7 +1,7 @@ -import { type QueryDefinitions, validatedDefinitions } from './querytypes'; +import { type QueryDefinitions, validatedDefinitions } from './querytypes.js'; import { boolean, - discordSnowflake, + discordSnowflake, integer, jsonArray, nullable, string, @@ -10,8 +10,8 @@ import { tableIdentifierSubstring, timestamp, URL -} from './validators'; -import { extract, guaranteedSingleton, jsonParser, nothing, rows, singleton, writeCount } from './transformers'; +} from './validators.js'; +import { extract, guaranteedSingleton, jsonParser, nothing, rows, singleton, writeCount } from './transformers.js'; export const DatabaseQueries = validatedDefinitions({ autocompleteTable: { @@ -116,7 +116,7 @@ export const DatabaseQueries = validatedDefinitions({ output: nothing() }, addDiscordSetForAddMapping: { - query: `INSERT OR IGNORE INTO resultSets (name, description, discordSnowflake, creatorId, global) + query: `INSERT OR IGNORE INTO resultSets (name, description, discordSnowflake, global) VALUES (NULL, NULL, ?1, (SELECT authors.id FROM authors WHERE authors.discordSnowflake = ?2), FALSE)`, parameters: { 'setSnowflake': { @@ -153,12 +153,10 @@ export const DatabaseQueries = validatedDefinitions({ INSERT OR IGNORE - INTO resultMappings (resultId, setId, authorId, created, updated) + INTO resultMappings (resultId, setId, authorId) VALUES ((SELECT rollableResult.id FROM rollableResult), (SELECT resultSet.id FROM resultSet), - (SELECT author.id FROM author), - ?1, - ?1);`, + (SELECT author.id FROM author));`, parameters: { 'timestamp': { validator: timestamp, @@ -186,12 +184,12 @@ export const DatabaseQueries = validatedDefinitions({ getResultMappingsForDiscordSet: { query: `WITH rollableTable (id) AS (SELECT rollableTableIdentifiers.tableId FROM rollableTableIdentifiers - WHERE rollableTableIdentifiers.identifier = ?2 - OR rollableTableIdentifiers.tableId = ?2 + WHERE rollableTableIdentifiers.identifier = ?1 + OR rollableTableIdentifiers.tableId = ?1 LIMIT 1), visibleSets (id) AS (SELECT resultSets.id FROM resultSets - WHERE ((?5 AND resultSets.global) OR resultSets.discordSnowflake = ?4)) + WHERE ((?4 AND resultSets.global) OR resultSets.discordSnowflake = ?3)) SELECT resultMappings.id AS mappingId, rollableResults.id AS resultId, rollableResults.text AS resultText, @@ -209,9 +207,7 @@ export const DatabaseQueries = validatedDefinitions({ rollableTables.title AS tableTitle, rollableTables.emoji AS tableEmoji, rollableTables.header AS tableHeader, - rollableTables.ordinal AS tableOrdinal, - resultMappings.updated AS updated, - (CASE WHEN resultMappings.updated = ?1 THEN 'updated' ELSE 'existing' END) AS status + rollableTables.ordinal AS tableOrdinal FROM resultMappings INNER JOIN rollableResults ON rollableResults.id = resultMappings.resultId LEFT JOIN authors ON authors.id = resultMappings.authorId @@ -219,29 +215,25 @@ export const DatabaseQueries = validatedDefinitions({ INNER JOIN resultSets ON resultSets.id = resultMappings.setId INNER JOIN rollableTables ON rollableTables.id = rollableResults.tableId WHERE rollableResults.tableId = (SELECT id FROM rollableTable) - AND rollableResults.text = ?3 + AND rollableResults.text = ?2 AND resultMappings.setId IN visibleSets - ORDER BY (NOT setGlobal) DESC, (authorId IS NOT NULL) DESC, updated, mappingId;`, + ORDER BY (NOT setGlobal) DESC, (authorId IS NOT NULL) DESC, mappingId;`, parameters: { - 'timestamp': { - validator: nullable(timestamp), - index: 1 - }, 'tableIdentifier': { validator: tableIdentifierOrId, - index: 2 + index: 1 }, 'text': { validator: string, - index: 3 + index: 2 }, 'setSnowflake': { validator: discordSnowflake, - index: 4 + index: 3 }, 'includeGlobal': { validator: boolean, - index: 5 + index: 4 } }, output: rows<{ @@ -262,9 +254,7 @@ export const DatabaseQueries = validatedDefinitions({ tableTitle: string, tableEmoji: string, tableHeader: string, - tableOrdinal: number, - updated: number, - status: 'updated' | 'existing' + tableOrdinal: number }>() }, addResultForEditMapping: { @@ -380,56 +370,51 @@ export const DatabaseQueries = validatedDefinitions({ editMappingForDiscord: { query: `WITH rollableTable (id) AS (SELECT rollableTableIdentifiers.tableId FROM rollableTableIdentifiers - WHERE rollableTableIdentifiers.identifier = ?2 - OR rollableTableIdentifiers.tableId = ?2 + WHERE rollableTableIdentifiers.identifier = ?1 + OR rollableTableIdentifiers.tableId = ?1 LIMIT 1), oldResult (id) AS (SELECT rollableResults.id FROM rollableResults WHERE rollableResults.tableId = (SELECT rollableTable.id FROM rollableTable) - AND rollableResults.text = ?3 + AND rollableResults.text = ?2 LIMIT 1), newResult(id) AS (SELECT rollableResults.id FROM rollableResults WHERE rollableResults.tableId = (SELECT rollableTable.id FROM rollableTable) - AND rollableResults.text = ?4 + AND rollableResults.text = ?3 LIMIT 1), - author(id) AS (SELECT authors.id FROM authors WHERE authors.discordSnowflake = ?5 LIMIT 1), + author(id) AS (SELECT authors.id FROM authors WHERE authors.discordSnowflake = ?4 LIMIT 1), targetSet(id) AS (SELECT resultSets.id FROM resultSets - WHERE resultSets.discordSnowflake = ?6 + WHERE resultSets.discordSnowflake = ?5 AND NOT resultSets.global LIMIT 1) UPDATE OR IGNORE resultMappings SET resultId = (SELECT id FROM newResult), - authorId = (SELECT id FROM author), - updated = ?1 - WHERE ?3 != ?4 + authorId = (SELECT id FROM author) + WHERE ?2 != ?3 AND resultMappings.resultId = (SELECT id FROM oldResult) AND resultMappings.setId = (SELECT id FROM targetSet);`, parameters: { - 'timestamp': { - validator: timestamp, - index: 1 - }, 'tableIdentifier': { validator: tableIdentifierOrId, - index: 2 + index: 1 }, 'oldText': { validator: string, - index: 3 + index: 2 }, 'newText': { validator: string, - index: 4 + index: 3 }, 'userSnowflake': { validator: discordSnowflake, - index: 5 + index: 4 }, 'setSnowflake': { validator: discordSnowflake, - index: 6 + index: 5 } }, output: nothing() @@ -551,14 +536,13 @@ export const DatabaseQueries = validatedDefinitions({ resultSets.global FROM resultSets WHERE (resultSets.global OR resultSets.discordSnowflake = ?1)), - visibleResults (mappingId, setId, textId, tableId, text, authorId, updated) + visibleResults (mappingId, setId, textId, tableId, text, authorId) AS (SELECT resultMappings.id AS mappingId, resultMappings.setId AS setId, resultMappings.resultId AS textId, rollableResults.tableId AS tableId, rollableResults.text AS text, - resultMappings.authorId AS authorId, - resultMappings.updated AS updated + resultMappings.authorId AS authorId FROM resultMappings INNER JOIN visibleSets ON resultMappings.setId = visibleSets.id INNER JOIN rollableResults ON rollableResults.id = resultMappings.resultId), @@ -587,8 +571,7 @@ export const DatabaseQueries = validatedDefinitions({ 'text', visibleResults.text, 'tableId', visibleResults.tableId, 'setId', visibleResults.setId, - 'authorId', visibleResults.authorId, - 'updated', visibleResults.updated)) + 'authorId', visibleResults.authorId)) FROM visibleResults) AS mappings;`, parameters: { 'setSnowflake': { @@ -605,10 +588,107 @@ export const DatabaseQueries = validatedDefinitions({ text: string, tableId: number, setId: number, - authorId: number, - updated: number + authorId: number }[], }>(['sets', 'authors', 'mappings'])) - } + }, + addAuditRecordForDiscordAuthor: { + query: `INSERT INTO userAuditLog (userId, newName, newUrl, timestamp) + VALUES ((SELECT id FROM authors WHERE authors.discordSnowflake = ?1), + ?2, + ?3, + ?4);`, + parameters: { + 'discordSnowflake': { + validator: discordSnowflake, + index: 1, + }, + 'newName': { + validator: nullable(string), + index: 2, + }, + 'newUrl': { + validator: nullable(string), + index: 3, + }, + 'timestamp': { + validator: timestamp, + index: 4, + }, + }, + output: nothing, + }, + addAuditRecordForDiscordSet: { + query: `INSERT INTO setAuditLog (userId, setId, newName, newDescription, timestamp, updateType) + VALUES ((SELECT id FROM authors WHERE authors.discordSnowflake = ?1), + (SELECT id FROM resultSets WHERE resultSets.discordSnowflake = ?1), + ?3, + ?4, + ?5, + ?6);`, + parameters: { + 'userSnowflake': { + validator: discordSnowflake, + index: 1, + }, + 'setSnowflake': { + validator: discordSnowflake, + index: 2, + }, + 'newName': { + validator: nullable(string), + index: 3, + }, + 'newDescription': { + validator: nullable(string), + index: 4, + }, + 'timestamp': { + validator: timestamp, + index: 5, + }, + 'updateType': { + validator: integer, + index: 6, + }, + }, + output: nothing, + }, + addAuditRecordForDiscordResult: { + query: `INSERT INTO resultAuditLog (mappingId, userId, setId, newResultId, timestamp, updateType) + VALUES ((SELECT id FROM authors WHERE authors.discordSnowflake = ?1), + (SELECT id FROM resultSets WHERE resultSets.discordSnowflake = ?1), + ?3, + ?4, + ?5, + ?6);`, + parameters: { + 'userSnowflake': { + validator: discordSnowflake, + index: 1, + }, + 'setSnowflake': { + validator: discordSnowflake, + index: 2, + }, + 'newName': { + validator: nullable(string), + index: 3, + }, + 'newDescription': { + validator: nullable(string), + index: 4, + }, + 'timestamp': { + validator: timestamp, + index: 5, + }, + 'updateType': { + validator: integer, + index: 6, + }, + }, + output: nothing, + }, } as const satisfies QueryDefinitions); diff --git a/src/server/db/querytypes.ts b/src/server/db/querytypes.ts index 3da3efc..a0e3d44 100644 --- a/src/server/db/querytypes.ts +++ b/src/server/db/querytypes.ts @@ -83,18 +83,6 @@ export function prepareQuery>(database: D1Databas } as PreparedQuery; } -export function prepareAllQueries(database: D1Database, q: T): PreparedQueries { - const result: Partial> = {}; - for (const key of Object.keys(q) as (keyof T & string)[]) { - try { - result[key] = prepareQuery(database, q[key]) - } catch (e) { - throw Error(`when preparing ${key}: ${e}`) - } - } - return result as PreparedQueries; -} - export async function runQuery(db: D1Database, query: BoundQuery): Promise { const startAt = performance.now() const [results] = await db.batch([query.statement]); @@ -113,17 +101,28 @@ export async function batchQueries(db: D1Database, que export class TypedDBWrapper { private readonly db: D1Database; + private readonly preparedQueries: Map, PreparedQuery>> = new Map() constructor(db: D1Database) { this.db = db; } - prepare>(query: T): PreparedQuery { - return prepareQuery(this.db, query); + prepareOrRetrieve>(query: T): PreparedQuery { + const alreadyPrepared = this.preparedQueries.get(query) + if (alreadyPrepared) { + return alreadyPrepared + } + const newlyPrepared = prepareQuery(this.db, query); + this.preparedQueries.set(query, newlyPrepared) + return newlyPrepared; } - prepareAll(queries: T): PreparedQueries { - return prepareAllQueries(this.db, queries); + prepareOrRetrieveAll(queries: T): PreparedQueries { + const result: Partial> = {} + for (const key of Object.keys(queries) as Iterable) { + result[key] = this.prepareOrRetrieve(queries[key]) + } + return result as PreparedQueries } async run(query: BoundQuery): Promise { @@ -134,5 +133,3 @@ export class TypedDBWrapper { return batchQueries(this.db, queries); } } - -// TODO: Use the new run and batch functions to fix the Database class's methods diff --git a/src/server/db/router.ts b/src/server/db/router.ts new file mode 100644 index 0000000..93bc6c6 --- /dev/null +++ b/src/server/db/router.ts @@ -0,0 +1,219 @@ +import { AutoRouter, type IRequestStrict } from 'itty-router'; +import { type TypedDBWrapper, validatedDefinition } from './querytypes.js'; +import { guaranteedSingleton, jsonParser, rows, singleton } from './transformers.js'; +import { boolean, discordSnowflake, discordSnowflakeOrId, tableIdentifierSubstring } from './validators.js'; + +const DatabasePathBase = "/_internal/database/" + +async function checkCache(request: Request & {databaseCache: Cache}): Promise { + if (request.method.toUpperCase() !== "GET") { + return + } + const cache = request.databaseCache + const response = await cache.match(request) + if (response) { + Object.assign(request, {cached: response}) + } else { + Object.assign(request, {cached: null}) + } +} + +async function storeCache(response: Response, request: Request & {databaseCache: Cache}): Promise { + if (request.method.toUpperCase() !== "GET") { + return + } + await request.databaseCache.put(request, response) +} + +const router = AutoRouter({ + before: [checkCache], + base: DatabasePathBase, + finally: [storeCache], +}) + +export function callDatabase(url: URL, {typedDB, ctx, databaseCache}: {typedDB: TypedDBWrapper, ctx: ExecutionContext, databaseCache: Cache}): Promise { + return router.fetch(Object.assign(new Request(url), {typedDB, ctx, databaseCache})) +} + +const TableRefStats = validatedDefinition({ + query: `SELECT + (SELECT COUNT(*) FROM rollableTableIdentifiers) AS identifiers, + (SELECT COUNT(*) FROM rollableTableHeaders) AS headers, + (SELECT COUNT(*) FROM rollableTableBadges) AS badges`, + parameters: {}, + output: guaranteedSingleton<{identifiers: number, headers: number, badges: number}>(), +} as const) + +export const TableStatsHeaderName = "Rollable-Table-Ref-Stats" + +function tableStatsToHeader(stats: {identifiers: number, headers: number, badges: number}): string { + return `${stats.identifiers},${stats.headers},${stats.badges}` +} + +export const GetAllTables = validatedDefinition({ + query: `SELECT rollableTables.id AS id, + rollableTables.identifier AS identifier, + rollableTables.name AS name, + rollableTables.emoji AS emoji, + rollableTables.title AS title, + rollableTables.ordinal AS ordinal + FROM rollableTables;`, + parameters: {}, + output: rows<{ id: number, identifier: string, name: string, emoji: string, title: string, ordinal: number }>(), + path: "/tables", +} as const) + +router.get(GetAllTables.path, async (req: { + typedDB: TypedDBWrapper, + cached: Response|null, +}): Promise => { + const {cached, typedDB} = req + const statsQuery = typedDB.prepareOrRetrieve(TableRefStats)({}) + if (cached) { + const currentStats = tableStatsToHeader(await typedDB.run(statsQuery)) + if (currentStats === cached.headers.get(TableStatsHeaderName)) { + return cached + } + } + const tableQuery = typedDB.prepareOrRetrieve(GetAllTables)({}) + const [tableStats, tables] = await typedDB.batch(statsQuery, tableQuery) + return new Response(JSON.stringify(tables), { + headers: [[TableStatsHeaderName, tableStatsToHeader(tableStats)], ["Content-Type", "application/json"]] + }) +}) + +export const AutocompleteTable = validatedDefinition({ + query: `WITH matchingIds (id) AS (SELECT DISTINCT rollableTableIdentifiers.tableId AS id + FROM rollableTableIdentifiers + WHERE rollableTableIdentifiers.identifier LIKE substr(?1, 1) ESCAPE '\\' + UNION + SELECT DISTINCT rollableTableIdentifiers.tableId AS id + FROM rollableTableIdentifiers + WHERE rollableTableIdentifiers.identifier LIKE ?1 ESCAPE '\\' + UNION + SELECT DISTINCT rollableTableBadges.id AS id + FROM rollableTableBadges + WHERE rollableTableBadges.badge LIKE ?1 ESCAPE '\\' + UNION + SELECT DISTINCT rollableTableHeaders.tableId AS id + FROM rollableTableHeaders + WHERE rollableTableHeaders.header LIKE ?1 ESCAPE '\\') + SELECT rollableTables.id AS id, + rollableTables.identifier AS identifier, + rollableTables.name AS name, + rollableTables.emoji AS emoji + FROM matchingIds + INNER JOIN rollableTables ON matchingIds.id = rollableTables.id + LIMIT 25;`, + parameters: { + 'tableIdentifierSubstring': { validator: tableIdentifierSubstring, index: 1 } + }, + output: rows<{ id: number, identifier: string, name: string, emoji: string }>(), + pathPrefix: '/autocomplete/tables/' +}) +router.get(`${AutocompleteTable.pathPrefix}:partialTableIdent`, async (req: { + partialTableIdent: string, + typedDB: TypedDBWrapper, + cached: Response|null, +}) => { + const {cached, typedDB, partialTableIdent} = req + const statsQuery = typedDB.prepareOrRetrieve(TableRefStats)({}) + if (cached) { + const currentStats = tableStatsToHeader(await typedDB.run(statsQuery)) + if (currentStats === cached.headers.get(TableStatsHeaderName)) { + return cached + } + } + const tableQuery = typedDB.prepareOrRetrieve(AutocompleteTable)({tableIdentifierSubstring: partialTableIdent}) + const [tableStats, tables] = await typedDB.batch(statsQuery, tableQuery) + return new Response(JSON.stringify(tables), { + headers: [[TableStatsHeaderName, tableStatsToHeader(tableStats)]] + }) +}) + +export const LoadSetDetails = validatedDefinition({ + query: `SELECT + json_object( + 'id', resultSets.id, + 'name', resultSets.name, + 'description', resultSets.description, + 'discordSnowflake', resultSets.discordSnowflake, + 'global', CASE WHEN resultSets.global = FALSE THEN json('false') ELSE json('true') END, + 'parentSets', (SELECT json_group_array(parentSets.id) + FROM resultSets AS parentSets + WHERE ?2 = FALSE + AND parentSets.global = TRUE)), + 'lastModified', (SELECT max(setAuditLog.timestamp) + FROM setAuditLog + WHERE setAuditLog.setId = resultSets.id) + FROM resultSets + WHERE (discordSnowflake = ?1 OR resultSets.id = ?1) + AND global = ?2`, + parameters: { + discordSnowflake: { + validator: discordSnowflakeOrId, + index: 1, + }, + global: { + validator: boolean, + index: 2, + }, + }, + output: rows(jsonParser<{ + id: number, + name: string|null, + description: string|null, + discordSnowflake: string|null, + global: boolean, + parentSets: number[], + lastModified: number, + }>(['id', 'name', 'description', 'discordSnowflake', 'global', 'parentSets', 'lastModified'])), +}) + +export const LoadSetResults = validatedDefinition({ + query: `SELECT + json_object( + 'mappingId', resultMappings.id, + 'textId', rollableResults.id, + 'tableId', rollableResults.tableId, + 'text', rollableResults.text, + 'setId', resultMappings.setId, + 'authorId', resultMappings.authorId, + ) + FROM resultMappings + INNER JOIN rollableResults ON rollableResults.id = resultMappings.resultId + WHERE resultMappings.setId = ?1`, + parameters: {}, + output: singleton +}) + +export const AutocompleteText = { + setPathInfix: "/set/", + textPathInfix: "/text/", +} as const +router.get(`${AutocompleteTable.pathPrefix}:partialTableIdent${AutocompleteText.setPathInfix}:setId${AutocompleteText.textPathInfix}:partialText`, async (req: { + partialTableIdent: string, + setId: string, + partialText: string, + typedDB: TypedDBWrapper, + cached: Response|null, +}) => { + const {cached, typedDB, partialTableIdent} = req + const statsQuery = typedDB.prepareOrRetrieve(TableRefStats)({}) + if (cached) { + const currentStats = tableStatsToHeader(await typedDB.run(statsQuery)) + if (currentStats === cached.headers.get(TableStatsHeaderName)) { + return cached + } + } + const tableQuery = typedDB.prepareOrRetrieve(AutocompleteTable)({tableIdentifierSubstring: partialTableIdent}) + const [tableStats, tables] = await typedDB.batch(statsQuery, tableQuery) + return new Response(JSON.stringify(tables), { + headers: [[TableStatsHeaderName, tableStatsToHeader(tableStats)]] + }) +}) diff --git a/src/server/db/validators.ts b/src/server/db/validators.ts index 55df722..de51fe0 100644 --- a/src/server/db/validators.ts +++ b/src/server/db/validators.ts @@ -34,6 +34,14 @@ export function discordSnowflake(data: string|Snowflake|undefined): Snowflake { return text } +export function discordSnowflakeOrId(data: string|Snowflake|number|undefined): Snowflake|number { + if (typeof data === 'number') { + return integer(data) + } else { + return discordSnowflake(data) + } +} + export function substring(data: string|undefined): string { const text = string(data, false) if (text.length === 0) { diff --git a/src/server/discord/commands.ts b/src/server/discord/commands.ts index fa7f1a4..bdf1ffb 100644 --- a/src/server/discord/commands.ts +++ b/src/server/discord/commands.ts @@ -5,32 +5,34 @@ import { CommandContext, CommandOptionType, ComponentContext, + InteractionContextType, SlashCommand, type SlashCreator } from 'slash-create/web'; -import { type Database } from '../db/database'; +import { type Database } from '../db/database.js'; import { type Snowflake } from 'discord-snowflake'; import { DELETE_ID, - DONE_ID, FAILURE_COLOR, - generateAuthorForResult, generateEmbedForResult, + DONE_ID, + FAILURE_COLOR, + generateEmbedForResult, generateErrorMessageFor, - generateFieldForResult, - generateFooterForResult, generateMessageFor, getEmbedFrom, - loadEmbed, recordError, + loadEmbed, + recordError, REROLL_ID, - SELECT_ID, SUCCESS_COLOR, WARNING_COLOR -} from './embed'; + SELECT_ID, + SUCCESS_COLOR, + WARNING_COLOR +} from './embed.js'; import { - generatedContentsToString, generatedStateToString, MAX_IDENTIFIER_LENGTH, MAX_NAME_LENGTH, MAX_RESULT_LENGTH, MAX_URL_LENGTH, type RollTableAuthor -} from '../../common/rolltable'; +} from '../../common/rolltable.js'; import markdownEscape from 'markdown-escape'; const tableOption: Omit = { @@ -169,7 +171,7 @@ export class ResponseCommand extends SlashCommand { description: 'Modifies the responses available in the generator.', nsfw: false, guildIDs: forGuilds, - dmPermission: true, + contexts: [InteractionContextType.BOT_DM, InteractionContextType.GUILD, InteractionContextType.PRIVATE_CHANNEL], options: [ { type: CommandOptionType.SUB_COMMAND, @@ -461,13 +463,13 @@ export class ResponseCommand extends SlashCommand { ephemeral: true }); break; - case 'conflict': + case 'conflicting': await ctx.send({ embeds: [generateEmbedForResult('The old response (still existing)', WARNING_COLOR, result.old), generateEmbedForResult('A conflicting response', FAILURE_COLOR, result.new)], ephemeral: true }); break; - case 'updated': + case 'edited': await ctx.send({ embeds: [generateEmbedForResult('The old response (now gone)', SUCCESS_COLOR, result.old), generateEmbedForResult('Your updated response', SUCCESS_COLOR, result.new)] }); diff --git a/src/server/discord/embed.ts b/src/server/discord/embed.ts index e6ad179..54cac17 100644 --- a/src/server/discord/embed.ts +++ b/src/server/discord/embed.ts @@ -1,10 +1,10 @@ -import type { GeneratedContents, RollTableResult } from '../../common/rolltable'; +import type { GeneratedContents, RollTableResult } from '../../common/rolltable.js'; import { type FinalGeneratedContents, type GeneratedState, type InProgressGeneratedContents, type RollTableResultFull -} from '../../common/rolltable'; +} from '../../common/rolltable.js'; import { ButtonStyle, type ComponentActionRow, @@ -59,7 +59,6 @@ export function generateEmbedForResult(title: string, color: number, value: Roll color, author: generateAuthorForResult(value), fields: [generateFieldForResult(value)], - timestamp: value.updated, footer: generateFooterForResult(value), } } diff --git a/src/server/discord/router.ts b/src/server/discord/router.ts index febe918..918fa08 100644 --- a/src/server/discord/router.ts +++ b/src/server/discord/router.ts @@ -1,9 +1,9 @@ -import { Database } from '../db/database'; +import { Database } from '../db/database.js'; import { CloudflareWorkerServer, SlashCreator } from 'slash-create/web'; import { isSnowflake, type Snowflake } from 'discord-snowflake'; -import { AuthorCommand, GenerateCommand, ResponseCommand } from './commands'; +import { AuthorCommand, GenerateCommand, ResponseCommand } from './commands.js'; import { type IRequestStrict, Router } from 'itty-router'; -import { getQueryArray } from '../request/query'; +import { getQueryArray } from '../request/query.js'; function getAuthorization(username: string, password: string): string { return btoa(username + ':' + password); diff --git a/src/server/entrypoint.ts b/src/server/entrypoint.ts index 3b81960..251da91 100644 --- a/src/server/entrypoint.ts +++ b/src/server/entrypoint.ts @@ -1,7 +1,7 @@ -import { Database } from './db/database'; -import { discordRouter } from './discord/router'; -import { createCors, Router, IRequestStrict } from 'itty-router'; -import { webRouter } from './web/router'; +import { Database } from './db/database.js'; +import { discordRouter } from './discord/router.js'; +import { IRequestStrict, AutoRouter, cors } from 'itty-router'; +import { webRouter } from './web/router.js'; export interface Env { readonly BASE_URL: string; @@ -13,20 +13,23 @@ export interface Env { readonly DB: D1Database; } -const { preflight, corsify } = createCors(); +const { preflight, corsify } = cors(); const discord = discordRouter('/discord') const web = webRouter('/') -const router = Router() - .all('*', preflight) - .all('/discord/*', discord.handle.bind(discord)) - .all('/*', web.handle.bind(web)) - .all('*', (_req, _env, _db, _ctx) => null); +const router = AutoRouter({ + before: [preflight], + finally: [corsify], +}) + .all('/discord/*', discord.handle.bind(discord)) + .all('/*', web.handle.bind(web)) + .all('*', (_req, _env, _db, _ctx) => null); // noinspection JSUnusedGlobalSymbols export default { async fetch(req: Request, env: Env, ctx: ExecutionContext): Promise { const startTime = performance.now() + const cache = await caches.open("forDatabase") return router.handle(req, env, new Database(env.DB), ctx).then((result) => { if (result instanceof Response) { return result; @@ -39,9 +42,9 @@ export default { } else { return new Response('Not Found', { status: 404, statusText: 'Not Found' }); } - }).catch((reason) => { + }).catch((reason: unknown) => { return new Response(`Failed: ${reason}`, { status: 500, statusText: 'Internal Server Error' }); - }).then((response) => { + }).then((response: Response) => { return corsify(response); }).finally(() => { const endTime = performance.now() diff --git a/src/server/tsconfig.json b/src/server/tsconfig.json index 7b40b91..c730a38 100644 --- a/src/server/tsconfig.json +++ b/src/server/tsconfig.json @@ -76,7 +76,7 @@ /* Type Checking */ "strict": true /* Enable all strict type-checking options. */, // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ - // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ diff --git a/src/server/web/bundles/sourcemaps.ts b/src/server/web/bundles/sourcemaps.ts index 8c17e88..959ed4e 100644 --- a/src/server/web/bundles/sourcemaps.ts +++ b/src/server/web/bundles/sourcemaps.ts @@ -1,4 +1,4 @@ -import type { SourceMap } from '../../../common/bundle'; +import type { SourceMap } from '../../../common/bundle.js'; export enum SourceMapExtension { CSS = 'css', diff --git a/src/server/web/router.ts b/src/server/web/router.ts index 50e44b0..6c4a8bc 100644 --- a/src/server/web/router.ts +++ b/src/server/web/router.ts @@ -1,11 +1,17 @@ -import { type IRequestStrict, Router } from 'itty-router'; -import type { Database } from '../db/database'; -import { CSS, JS } from './bundles/client.generated'; -import type { HashedBundled } from '../../common/bundle'; -import { getSourceMapFileName, SourceMapExtension, SourceMaps } from './bundles/sourcemaps'; +import { type IRequestStrict, AutoRouter } from 'itty-router'; +import type { Database } from '../db/database.js'; +import { CSS, JS } from './bundles/client.generated.js'; +import type { HashedBundled } from '../../common/bundle.js'; +import { getSourceMapFileName, SourceMapExtension, SourceMaps } from './bundles/sourcemaps.js'; import { collapseWhiteSpace } from 'collapse-white-space'; -import { getQuerySingleton, takeLast } from '../request/query'; -import { StringTemplateBuilder } from './template'; +import { getQuerySingleton, takeLast } from '../request/query.js'; +import { render } from 'preact-render-to-string' +import { createElement } from 'preact'; +import { + MainGeneratorAndResponses, + type MainGeneratorAndResponsesProps +} from '../../common/client/MainGeneratorAndResponses.js'; +import type { RollTableDetailsAndResults } from '../../common/rolltable.js'; interface WebEnv { readonly BASE_URL: string, @@ -47,33 +53,26 @@ export function webRouter(base: string) { // TODO: use SSR with the Main components here // TODO: handle POSTs by rerolling and redisplaying appropriately - redirect to a GET with text IDs listed // TODO: support json output here - const generator = buildGeneratorPage({ + const props: MainGeneratorAndResponsesProps = { + initialResults: results.rolled, + initialSelected: results.selected as Set, + database: results.db, + targetUrl: req.url, + addToDiscordUrl: env.DISCORD_APP_ID ? `https://discord.com/api/oauth2/authorize?client_id=${env.DISCORD_APP_ID}&permissions=0&scope=applications.commands` : null, + initialEditable: true, creditsUrl: env.CREDITS_URL, - clientId: env.DISCORD_APP_ID, - generatorTargetUrl: env.BASE_URL, - results: results.rolled, - editable: !results.final, - selected: results.selected, - includesResponses: true, - builder: StringTemplateBuilder, - }) - const responses = buildResponsesPage({ - tables: Array.from(results.db.tables.values()), - results: results.rolled, - creditsUrl: env.CREDITS_URL, - includesGenerator: true, - builder: StringTemplateBuilder, - }) + } const wrapped = wrapPage({ title: 'Vore Scenario Generator', script: getSourceMappedJS('combinedGeneratorResponses'), styles: getSourceMappedCSS('combinedGeneratorResponses'), noscriptStyles: getSourceMappedCSS('noscript'), - bodyContent: [generator, responses].join('') + bodyContent: render(createElement(MainGeneratorAndResponses, props)) }) return collapseWhiteSpace(wrapped, { style: 'html' }); } - const router = Router({ base }) + + const router = AutoRouter({ base }) .get('/responses', async (req, _env, _db, _ctx) => { // TODO: make this actually just the responses const url = new URL(req.url); diff --git a/src/client/tsconfig.json b/src/tsconfig.json similarity index 95% rename from src/client/tsconfig.json rename to src/tsconfig.json index 2c45b00..5d9a999 100644 --- a/src/client/tsconfig.json +++ b/src/tsconfig.json @@ -11,8 +11,8 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "ES2015", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - "lib": ["dom", "dom.iterable", "ES2015"] + "target": "ESNext", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": ["dom", "dom.iterable", "ESNext"] /* Specify a set of bundled library declaration files that describe the target runtime environment. */, // "jsx": "react" /* Specify what JSX code is generated. */, // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ @@ -26,12 +26,12 @@ /* Modules */ // "module": "es2022" /* Specify what module code is generated. */, - // "rootDir": "./", /* Specify the root folder within your source files. */ + "rootDir": "../", /* Specify the root folder within your source files. */ "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - "typeRoots": ["./types"], /* Specify multiple folders that act like `./node_modules/@types`. */ + // "typeRoots": ["./types"], /* Specify multiple folders that act like `./node_modules/@types`. */ // "types": ["@cloudflare/workers-types/2023-07-01"] /* Specify type package names to be included without being referenced in a source file. */, // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ // "resolveJsonModule": true /* Enable importing .json files */, @@ -101,8 +101,9 @@ "jsx": "react-jsx", "jsxImportSource": "preact", "paths": { - "react": ["./node_modules/preact/compat/"], - "react-dom": ["./node_modules/preact/compat/"] + "react": ["../../node_modules/preact/compat/"], + "react-dom": ["../../node_modules/preact/compat/"] } - } + }, + "exclude": ["server/**"] } diff --git a/wrangler.toml b/wrangler.toml index 6c52361..4bc59c1 100644 --- a/wrangler.toml +++ b/wrangler.toml @@ -8,7 +8,7 @@ keep_vars = true workers_dev = true [build] -command = "tsx src/build/bundle-client-with-source-map.ts" +command = "tsx src/build/bundle-client-with-source-map.ts src/client src/server/web/bundles/client.generated.ts" cwd = "." watch_dir = ["src/client", "src/common", "src/build"]
Jump to Result in List
Set in Generated Scenario